Kilka dni temu zakończyłem prace nad moim najnowszym utworem, tym razem symfonicznym, w stylu a’la muzyki filmowej. Napisałem go w skali G mollowej harmonicznej. Zakochałem się ostatnio w brzmieniu skal mollowych harmonicznych 😉 Nie przedłużając: posłuchajcie!
Niektórzy wiedzą, niektórzy nie 😉 Czasem sobie coś tam komponuję trochę. A to coś rockowego/gitarowego, a to coś symfonicznego, a to elektronicznego.
Kilka dni temu opublikowałem mój najnowszy utwór: Test Object No. 52. To gitarowy utwór w stylu rockowo-metalowym, napisany w A moll.
Miłego słuchania! 🙂
VideoEditor 1.0.0.20 to prosty program, będący narzędziem znacznie ułatwiającym pracę ze wspaniałym ffmpeg.
Na ten moment, program umożliwia konwertowanie plików video oraz ich łatwe przycinanie.
Po uruchomieniu programu, należy wejść w ustawienia i zdefiniować ścieżkę do samego ffmpeg.exe. Skąd go wziąć? Można oczywiście go sobie zbudować, ale polecam skorzystać ze strony CODEX FFMPEG, gdzie są dostępne zawsze aktualne binaria.
Następnie polecam przejrzeć zakładkę z presetami kodeków video. Kilka zawarłem jako domyślne. Jeśli umiesz obsługiwać ffmpeg, możesz zdefiniować swoje własne nowe ustawienia.
Po skonfigurowaniu programu, po prostu otwórz plik video, zaznacz punkty przycięcia filmu, jeśli chcesz, wybierz preset konwersji i naciśnij “Convert”. Podajesz nazwę nowego pliku i czekasz na zakończenie konwersji.
Program będę dalej rozwijał i dodawał nowe funkcjonalności. W planach również obsługa różnych języków i instalator.
Dla chętnych, dostępne są źródła na GitHubie.
Program można pobrać tutaj. Miłej zabawy! 🙂
I’m working on a small project (which will be revealed once it reaches some useful stage), and one of the things I need to work on, is to enabling sound visualization.
Visualizing the sound usually incorporates two factors: the amplitudes (which creates the ‘wave’) and a frequencies spectrogram. In this part we will try to do those analysis, however not ready for realtime visualizing yet, this will be made on the next stage – first we need to understand, what’s going on, before we start optimizing it.
We’re using here Python 3.8, together with some additional libraries – see imports section below.
For now we will use simple scipy.io.wavfile library for reading the sound files. For real usage we need to use a better library, as this one is pretty much limited.
import matplotlib.pyplot as plt
from matplotlib import colors as clrs
plt.rcParams['agg.path.chunksize'] = 10000
from scipy.io import wavfile as wav
from scipy.fftpack import fft, fftfreq
import numpy as np
from skimage.util import img_as_int
from skimage.transform import resize
from skimage import io, color, exposure
Reading a file¶
In our analysis we take the mono signal, so we have to convert it, if needed. After loading, we will check the basic parameters of the loaded file, like its length and sample rating.
samplerate, audio = wav.read('test_signal_03.wav')
if audio.ndim > 1:
audio = np.mean(audio, axis=1) # we want mono!
num_samples = audio.shape[0]
audio_length = num_samples / samplerate
max_value = np.max(audio)
print(f'Audio length: {audio_length:.2f} seconds')
print(f'Audio samples: {num_samples}')
print(f'Max value:{max_value}')
fig, axes = plt.subplots()
axes.plot(np.arange(num_samples) / samplerate, audio)
axes.set_xlabel('Time [s]')
axes.set_ylabel('Amplitude');
plt.show()
plt.close(fig)
Audio length: 146.00 seconds Audio samples: 6438600 Max value:24741.0
Selecting a fragment¶
For visualization, the whole file won’t give us anything useful. Both the amplitudes and especially the spectrogram, need to reflect some small portion of thw whole. What portion?
Visualization is a video. Video is made of frames. For each frame we need the new portion of data. Fortunately, video framerate is way lower than sound samplerate. We can select a portion of samples that reflect a selected period of time between two frames – current and the next one.
As input parameters, we take the current time in seconds and the target video framerate.
fps = 30
total_frames = int(audio_length * fps)
current_position = 100 # in seconds
current_frame = int(current_position*fps)
number_of_frames = 1 # number of frames to analyse
print(f'Current frame: {current_frame}/{total_frames}')
sample_start = int(current_frame / fps * samplerate)
sample_end = int((current_frame + number_of_frames) / fps * samplerate)
N = sample_end - sample_start
T = 1.0 / samplerate
Current frame: 3000/4380
Performing an analysis¶
We’re ready to perform the analysis. First one, amplitudes, is pretty straightforward, we just read the data from the file.
audio_part = audio[sample_start:sample_end]
For the spectrogram, we perform a 1-D discrete Fourier transform and put the results over the frequencies axis. FFT produces both negative and positive values. If input values are real numbers (as ours are) negative results are exactly same as positive ones (but negative, of course) – hence we can draw only the positive ones.
freqs = fftfreq(N, T)
spectrum = abs(fft(audio_part))[:int(freqs.size/2)]
Now we can plot the figures and see both.
fig=plt.figure(figsize=(10, 3))
axes=[]
axes.append(fig.add_subplot(1, 2, (1, 1)))
axes.append(fig.add_subplot(1, 2, (2, 2)))
axes[0].plot(np.arange(N) / samplerate, audio_part)
axes[0].set_xlabel('Time [s]')
axes[1].plot(freqs[:int(freqs.size/2)], spectrum)
axes[1].set_xlabel('Frequency [Hz]')
fig.tight_layout()
plt.show()
plt.close(fig)
Color mapping¶
Before we prepare our textures for further use, we will prepare a special color map. We want the values to be represented in the red channel, from pure black to pure saturated red.
reds = plt.get_cmap('Reds', 256)
black_reds = reds(np.linspace(0, 1, 256))
for i in range(256):
black_reds[i:i+1, :] = np.array([i/256, 0, 0, 1])
map_black_reds = clrs.ListedColormap(black_reds)
The final texture¶
We’re making a 512×512 texture, where top 256 lines are frequencies spectrogram, while bottom 256 lines are amplitudes.
audio_part_img = exposure.rescale_intensity(audio_part, out_range=(-1.0, 1.0))
audio_part_img = np.expand_dims(audio_part_img, axis=0)
audio_part_img = resize(audio_part_img, (256, 512), anti_aliasing=True)
spectrum_img = exposure.rescale_intensity(spectrum, out_range=(0, 100))
spectrum_img = np.expand_dims(spectrum_img, axis=0)
spectrum_img = resize(spectrum_img, (256, 512), anti_aliasing=True)
fig=plt.figure(figsize=(5.12, 5.12), dpi=100)
fig.subplots_adjust(hspace=0)
fig.tight_layout()
axes=[]
axes.append(fig.add_subplot(2, 1, 1))
axes[0].set_axis_off()
axes[0].margins(0)
axes.append(fig.add_subplot(2, 1, 2))
axes[1].set_axis_off()
axes[1].margins(0)
axes[0].imshow(spectrum_img, cmap=map_black_reds)
axes[1].imshow(audio_part_img, cmap=map_black_reds)
plt.savefig("test_sound.png", dpi=fig.dpi)
plt.show()
plt.close(fig)
Our resulting texture is exactly what we need for sound visualization. The problem is, producing it takes too much time and cannot be used for realtime usage. This problem we’ll solve next time.
Niedawno zorientowałem się dopiero 😉 że mój skrypt do pobierania obrazów z Instagrama już nie działa z powodu zmian w systemie Instagram. Zaktualizowałem więc skrypt i można go pobrać i zainstalować w TamperMonkey. Uwaga, skrypt działa na stronie postu, nie na stronie kolekcji. Aby przejść do strony postu z podglądu zdjęcia, należy wybrać opcję “Go to post”.
W efekcie, pod zdjęciem powinien pojawić się link do obrazu.
No i znów zmiana serwera… jakby były jakieś problemy, dajcie znać.
Update: Największe problemy już za mną, większość strony powinna już działać
Czasem zachodzi potrzeba pobrania zdjęcia z Instagrama w pełnej dostępnej rozdzielczości. Wbrew pozorom jest to dość proste.
W zasadzie, jedyne, co należy wykonać, to odnaleźć wpis meta nazywający się “og:image”:
<meta property="og:image" content="https://serwer/zdjecie.jpg" />
Zawartość właściwości “content” to link do zdjęcia w pełnej rozdzielczości.
Jeśli jednak chcesz pobrać większą ilość zdjęć, bądź robisz to dość często, przyda się mała automatyzacja. Napisałem do tego celu mały skrypt, który działa pod kontrolą TamperMonkey. Wszystko, co ten skrypt robi, to na dole strony (pomiędzy zdjęciem a stopką) wstawia link do zdjęcia.
Po zainstalowaniu TamperMonkey, jeśli go jeszcze nie masz, wystarczy zainstalować ten skrypt. Uwaga, skrypt działa na stronie postu, nie na stronach kolekcji. Aby przejść do strony postu z podglądu zdjęcia, należy wybrać opcję “Go to post“.
Na przełomie listopada i grudnia w końcu skusiłem się na bezpłatny miesiąc testów Netfliksa. Powiem tylko tyle, że efektem testów jest przedłużenie 😉
W ramach owych testów postanowiłem sprawdzić, co Netflix wyczarował do spółki z Marvelem. Skusiły mnie takie nazwiska trzymających pieczę nad produkcjami, jak Stan Lee i Joe Quesada. Zacząłem trochę krzywo, bo od Punishera.
Historia zaczyna się, gdy Punisher ukrywa się pod nowym nazwiskiem, już po wykończeniu ludzi odpowiedzialnych za wymordowanie jego rodziny. Jak to zwykle bywa, zostaje zmuszony do powrotu na ulicę. Po obejrzeniu serialu (póki co, jest jeden sezon) poczytałem trochę opinii w necie – zawsze to robię dopiero po obejrzeniu filmu. Sporo ludzi marudzi, że Punisher mało brutalny jest i że w Daredevilu (o czym niżej) jest znacznie lepszy. Hmm… wg mnie w Daredevilu jest dokładnie taki sam, identyczny charakter. Jeśli ktoś twierdzi inaczej, to krzywo oglądał oba seriale i raczej oglądał tylko obrazki 😉 W każdym razie, mnie kupili tą historią.
Idąc tym tropem, obejrzałem oba (na razie) sezony Daredevila. Ujmę to tak: jeśli ktoś zna tę postać tylko z filmu z Benem Affleckiem, to szybko zapomnijcie o swoich odczuciach z tym związanych. Serial to zupełnie inna bajka. Szczerze mówiąc, dawno nie widziałem tak dobrego serialu, a już na pewno nie marvelowego. Zgrabna fabuła, wartka akcja, postaci naprawdę świetne. No i rzecz bardzo rzadko spotykana – czarny charakter jest nareszcie fantastycznie narysowany. Wilson Fisk (przyszły Kingpin) jest wyrazisty jak mało co. Najlepiej by go określił Shrek 😉 że jest jak cebula.
Po Daredevilu przyszedł czas na The Defenders. Okazało się, że spośród 4 indywidualnych seriali, ten należy obejrzeć właśnie po Daredevilu, gdyż jest on bezpośrednią kontynuacją jego fabuły. Ponownie zmierzymy się z organizacją The Hand i Czarnym Słońcem. Opisać ten mini-serial nie jest łatwo. Bohaterowie: Daredevil jak to Daredevil, świetny. Reszty do tej pory nie znałem (filmowo, rzecz jasna). Jessica Jones wypadła rewelacyjnie, jej postać wykreowana naprawdę świetnie. Luke Cage idealnie… nijaki. W zasadzie nic o tym człowieku się nie da powiedzieć. A Iron Fist… klapa kompletna. Nie wiem, może taki był zamysł producentów, żeby zrobić z niego rozkojarzonego dzieciaka ze świecącą pięścią. W każdym razie, wiem teraz, że tych dwóch indywidualnych seriali raczej nie będę próbował oglądać. Natomiast ozdobą były dialogi Jessiki z Daredevilem. Ta dwójka wymiatała 🙂 Co do samej akcji: skonstruowana jest poprawnie, a dzięki skróceniu formatu do 8 tylko odcinków, nie ma dłużyzn. Jedyne, co mogę zarzucić mu, to łzawe zakończenie, którego jakoś chyba nie mogli sobie odmówić, oraz oczywistą, spodziewaną i sztampową ostatnią scenę. Poza tym, serial jest ok.
Po obejrzeniu Defenders, postanowiłem sprawdzić Jessikę Jones, która tam wypadła naprawdę bardzo ciekawie. Serial zupełnie różny od typowych produkcji marvelowskich – bo i bohaterka jakże inna (choć oryginalnie bardzo mocno wpleciona w życiorys Spidermana). Nie jest to typowe superbohaterskie kino, raczej kryminalny thriller. Ogląda jednak się to naprawdę dobrze, zwłaszcza pierwszą połowę. Druga połówka chyba nieco zbyt mocno skupiona na relacjach Jessiki z Kilgravem, ale tak została skreślona fabuła, więc nie ma co narzekać. Serial zdecydowanie dla dorosłych – seks i przemoc kapią z ekranu solidnymi strugami. Ogólnie szczerze polecam obejrzenie.
Na koniec… muszę przyznać, że pozytywnie mnie te seriale zaskoczyły. Znając różne produkcje Marvela, te naprawdę się wybijają ponad przeciętność. Co prawda, najprawdopodobniej (choć nie widziałem) Iron Fist i Luke Cage bedą beznadziejne, ale te wymienione powyżej jak najbardziej na plus. Brawo Netflix 🙂
Na koniec 2… Boję się otworzyć lodówkę. Boję się, że wyskoczy z niej… Claire 😉 w każdym serialu (chyba tylko w Punisheru jej nie było?) ta postać się pojawia. W sumie, być może to był zabieg pozwalający na spięcie fabuły w The Defenders, choć i tak sposób ich spotania się był lekko… hm, niezręczny 😉 no, ale sam bym chyba też tego lepiej nie zrobił, więc się tylko czepiam.
Na koniec 3 😉 czołówka z The Defenders, napisana przez Johna Paesano, wymiata. Jest też na Spotify’u, jakby co.
As S.T.A.L.K.E.R.: Lost Alpha – Director’s Cut is getting more and more of its final look, I’ve decided to publish some screenshots.
I will be adding more images here, but I won’t add any new post anytime soon, so just check this one back from time to time.
Please note: as the game is still under development, the quality of images can vary between each other. However, all of them are quite fresh – but the final game can look a bit different.
Jest wiele selektorów kolorów online. Większość zwraca wyniki w wartościach RGB z zakresu <0..255>, w zapisie szesnastkowym, oraz HSL. Jednak brakuje w nich wszystkich jeszcze jednej formy podawania wyników: w formie wartości RGB w zakresie <0..1>, używanym w niektórych programach, zwłaszcza 3D. Osobiście często używam POV-Raya i za każdym razem muszę używać kalkulatora, aby przeliczyć wszystkie trzy wartości na odpowiedni zakres.
Początkowo miałem zamiar napisać malutki programik do tego celu, ale stwierdziłem, że wersja on-line będzie wygodniejsza w użyciu. Nie jest to żadne rocket science 😉 ale swoje zadanie spełnia. Może w przyszłości jakoś go rozbuduję i usprawnię, ale… nie obiecuję 😉
Jeszcze jedna uwaga… poniższe nie działa z IE… 🙁
Może się komuś przyda – mi na pewno 🙂