Sonifikacja obrazu galaktyki
Ten przykład ma pokazać jak dane z obrazu mogą być przekształcane na dźwięk. Istnieje wiele wyspecjalizowanych w tym narządzi (np. program Metasynth). W tym wypadku chodzi o replikację metody, którą specjaliści od public relations w NASA wykorzystali, aby uczynić fale radiowe „słyszalnymi” (zob. Sounds of Saturn: Hear Radio Emissions of the Planet and Its Moon Enceladus).
W tej realizacji osie pozioma i pionowa potraktowane zostały standardowo jako źródła informacji odpowiednio o czasie i częstotliwości. Poszczególny piksel na obrazie to pojedynczy ton w dźwięku. Jego pozycja na osi poziomej wskazuje na czas pojawienia się, a miejsce w pionie na częstotliwość. Jasność punktu na obrazie interpretowana jest jako głośność (amplituda) tonu.
Jako obraz źródłowy potraktowano zdjęcie galaktyki (właściwie – mgławicy planetarnej) NGC6543a, zwanej „Kocim okiem”. Została odkryta 15 lutego 1786 roku przez Williama Herschela, rówieśnika Josepha Haydna. Herschel, był także całkiem sprawnym kompozytorem. Mawiano, że jest najlepszym kompozytorem wśród astronomów i odwrotnie. Tutaj nagranie jego Symfonii 8 (youtube, dostęp: październik 2024)
Źródłowy obraz:

Obraz po przygotowaniu do sonifikacji:
Poniżej kod w języku matlab
. Przez dobór różnych parametrów uzyskać można różne rodzaje dźwięków:
% parametry użytkownika
fn = 'ngc6543a.jpg'; % plik źródłowy obrazu
px2sec = .01; % przeliczenie piksela na sekundy
fs = 22050; % częstotliwość próbkowanie
rowStart = 150; % wiersz początkowy obrazu
rowStop = 550; % wiersz końcowy
fMultiply = 12; % mnożnik
fOffsetHz = -1750; % przesunięcie w Hz
% procedure
A = imread(fn);
Agray = mean (A, 3);
Agray(Agray<mean(Agray(:))) = 0;
Agray = flipud(Agray);
[ySize xSize] = size(Agray);
frameSamples = ceil(fs * px2sec);
X = zeros (1, frameSamples * xSize);
samplesLength = length(X);
for rowNumber = rowStart:rowStop;
f = fMultiply * rowNumber + fOffsetHz;
disp([num2str(f), 'Hz']);
a = zeros(1, frameSamples);
for k = 2:xSize;
a = [a, linspace(Agray(rowNumber, k-1), Agray(rowNumber, k), frameSamples)];
end
x = sin( 2 * pi * f * (0:samplesLength-1) / fs + randi(round(fs/f)) ) .* (a.^3);
X = X + x;
end
X(end-fs+1:end) = 0;
X = rescale(X,-1,1);
audiowrite([fn, '-', num2str(randi([1, 1000])), '.wav'], X, fs);
W tym wypadku parametry procedury dobierane były tak, aby uzyskać dźwięki kojarzące się z dźwiękami przestrzeni kosmicznej (konwencjonalne skojarzenia, na podstawie wielu filmów science fiction).
Przykładowe wyniki:
Spektrogram jednej z wygenerowanych próbek dźwięku:
Autorstwo kodu i próbek dźwiękowych: Marcin Strzelecki