- /
-
Dark Theme
on 16 Oct 2024
- 10
- 147
- 1
- 0
- 1833
Cite your audio source here (if applicable):
Code (for audio synthezis and video) created with help of ChatGPT 4o mini.
drawframe(96);
Write your drawframe function below
function drawframe(f)
% Parametry pro přilbu
head_radius = 2; % Poloměr horní části přilby
head_height = 3; % Výška horní části přilby
neck_width = 1.5; % Šířka krku
neck_height = 0.1; % Výška krku
% Křivka pro horní část přilby
theta = linspace(0, pi, 88); % Úhel pro křivku
x = head_radius * cos(theta); % X souřadnice horní části
y = head_height + head_radius * sin(theta); % Y souřadnice horní části
% Vykreslení okrajů přilby
x = [x -head_radius, -head_radius-0.5, -neck_width, -neck_width+0.5, ...
neck_width-0.5, neck_width, head_radius+0.5, head_radius];
y = [y head_height, neck_height, neck_height, 0, ...
0, neck_height, neck_height, head_height];
p = plot(x(1), y(1), 'k', 'LineWidth', 3); % Okraje přilby
% Nastavení os
axis equal;
axis off;
p.XData = x(1:f);
p.YData = y(1:f);
if f==1
% Parametry pro jednotlivé tóny a jejich délky
notes = {'G4', 'G4', 'G4', 'Eb4', 'Bb4', 'G4', 'Eb4', 'Bb4', 'G4'};
durations = [0.7, 0.7, 0.7, 0.4, 0.4, 0.7, 0.4, 0.4, 0.7]; % Délky tónů
pauses = [0.6, 0.6, 0.6, 0.3, 0.3, 0.6, 0.3, 0.3, 0.6]; % Pauzy mezi tóny
Fs = 44100;
signal = zeros(1,floor(Fs*sum(durations)));
c = 1; % Pomyslný kurzor, kde se nacházím v celé délce písně
% Syntetizuj a přehraj každý tón s pauzou
for i = 1:length(notes)
tone = playBrassTone(notes{i}, durations(i), Fs);
signal(c:c+length(tone)-1) = signal(c:c+length(tone)-1)+tone;
c = floor(c+pauses(i)/durations(i)*length(tone));
end
audiowrite('audio.wav', signal, Fs)
end
function signal = playBrassTone(noteName, duration,Fs)
% Syntéza žesťového tónu na základě názvu tónu a doby trvání
% Frekvenční tabulka pro základní tóny
noteFrequencies = struct('G4', 392.00, 'Eb4', 311.13,'Bb4', 466.16);
% Získání frekvence pro daný tón
f = noteFrequencies.(noteName); % Odpovídající frekvence
% Časová osa pro délku tónu
t = 0:1/Fs:duration;
% Generování základního tónu (sinusová vlna) a jeho harmonických složek
signal = sin(2 * pi * f * t) ... % Základní frekvence
+ 0.6 * sin(2 * pi * 2 * f * t) ... % 2. harmonická (násobek 2)
+ 0.4 * sin(2 * pi * 3 * f * t) ... % 3. harmonická (násobek 3)
+ 0.3 * sin(2 * pi * 4 * f * t) ... % 4. harmonická (násobek 4)
+ 0.2 * sin(2 * pi * 5 * f * t); % 5. harmonická (násobek 5)
% Obálka ADSR pro daný tón
attackTime = 0.05; % Krátký attack
decayTime = 0.1; % Krátký decay
sustainLevel = 0.7; % Sustain
releaseTime = 0.2; % Release
% Obálka ADSR (modifikovaná podle délky tónu)
attack = linspace(0, 1, floor(attackTime * Fs));
decay = linspace(1, sustainLevel, floor(decayTime * Fs));
sustain = sustainLevel * ones(1, floor((duration - attackTime - decayTime - releaseTime) * Fs));
release = linspace(sustainLevel, 0, floor(releaseTime * Fs));
envelope = [attack, decay, sustain, release];
envelope = [envelope, zeros(1, max(0, length(t) - length(envelope)))]; % Zajištění správné délky
% Použití obálky na signál
signal = signal .* envelope;
% Filtrace (zjemnění zvuku pomocí nízkofrekvenčního filtru)
[b, a] = butter(4, 0.2, 'low'); % Nízkofrekvenční filtr
signal = filter(b, a, signal);
% Normalizace signálu, aby nedošlo k přebuzení
signal = signal / max(abs(signal));
end
end
Movie
Audio
This submission does not have audio.