MATLAB Shorts Mini Hackというコンテストに参加しています.
その一作品として,簡単な音楽を作成してみました.mp4
この記事では,ドレミファソラシドが流れる音の作り方を紹介します.
プログラムと解説
プログラムは,以下の通りです.言語はMATLABです.
createAudio.m
function createAudio()
Fs = 44100; % サンプリング周波数 (44.1 kHz)
duration = 0.49; % 各音の持続時間 (秒)
t = 0 : 1/Fs : duration; % 時間ベクトル
frequencies = [
261.626 % C4 ド
293.665 % D4 レ
329.628 % E4 ミ
349.228 % F4 ファ
391.995 % G4 ソ
440.000 % A4 ラ
493.883 % B4 シ
523.251 % C4 ド
];
d = Fs * 0.01; % フェードおよび休止の持続時間 (秒)
fade = linspace(1, 0, d);
sounds = [];
for fr = frequencies'
sound = 0.5 * sin(2 * pi * fr * t); % 音量0.5
sound(1:d) = sound(1:d) .* flip(fade); % フェードイン
sound(end-d+1:end) = sound(end-d+1:end) .* fade; % フェードアウト
sounds = [sounds, sound, zeros(1, d)]; % 音の結合
end
audiowrite('audio.wav', repmat(sounds, 1, 3), Fs);
end
サンプリング周波数は,一般的な設定である44.1kHzです.
各音を0.49秒流し,休止時間を0.01秒挟んだ後に次の音が鳴る設定です.
ドレミファソラシドを3週する,$0.5\times8\times3=12$秒の音を生成しています.
必要な音は,周波数で記述する必要があります.そして,sin波で音を表現します.
音の始まり/終わりの0.01秒は,徐々に音が大きくなる/小さくなるようにします.
音を徐々に変化させるフェードが無いと,「ブツ」というノイズ音が出てしまいます.
以下の音声を聞き比べると,フェードの必要性が良くわかります.
最後に,audiowrite
関数を利用し,オーディオファイルを出力します.
終わりに
30行程度で簡単に音を作成できるのは,少し意外でした.
コンテスト期間中に,もう少し複雑な音にも挑戦してみたいと思います.
今回,記事中で簡単に音を再生できるようにするため,YouTubeを利用しました.
Qiitaに動画ファイル,音声ファイルを埋め込みできたら良いなと思いました.