MATLAB で音楽を作る

1. 音楽の基本

1. 番号付き楽譜を知る

番号付き記譜で最も重要な情報は、番号付き記譜の左上隅にあるメロディーとビートです。

画像内の 1=G は、基準周波数としての G トーンに基づいています。つまり、1 は G トーンに対応します。その他の一般的なものには、1=C などが含まれます。

4/4 は 1 つのセクションに 1/4 拍が 4 つあり、短い縦線で 1 つのセクションが区切られていますが、同様に 3/4 列、1/2 拍などもあります。

 対応する数字は、1 をベース周波数とするさまざまなオーディオ周波数です。

0 ビートはプレースホルダーを意味し、音はありません

左上隅に#が付いている数字はハーフトーンです

数字の上下の点は 1 オクターブの増加または減少を表し、2 オクターブの減少に対応する 2 つの点もあります。

4/4 ビートのスペクトルでは、セクションは 4 つの 1/4 ビートで構成され、各 1/4 ビートは 1 秒で、1 つの数字が 1/4 ビートに対応し、数字の下の下線は、この音が 1 秒を占めることを示します。 /8 ビート、2 は 1/16 ビートを意味します。など...セクション内の行の合計は、常にこのスペクトルに対応するビート数と等しくなります。上の例は 4/4 ビート、つまり 4 秒です。 。

数字の右側の点は、1・は3/8拍、数字の後の-は1/4拍伸びることを意味するように、音が1/2拍伸びることを意味します。

数字の間の上部の接続記号は、移行がスムーズで首尾一貫していることを意味します。これは通常、歌うときに考慮する必要があります。

2. 基本的な同調周波数

12 平均律の計算に従って、次の異なる曲の対応する周波数が得られます。

 この周波数で振動して音を出すことを意味しており、発生する音はその音に対応した音になります。

オクターブはオクターブ関係に対応することに注意してください。これは、12 の平均レート計算の法則によるものでもあります。

これに従って、各数値に対応する周波数を決定できます。

Gキーによる対応周波数

g0 はプレースホルダーを意味し、g1_ は下降音を意味し、g2_5 は #2 を意味します

g0=0;2
g1_=195.998;
g2_=220.000;
g3_=246.942;
g4_=261.626;
g5_=293.665;
g6_=329.628;
g7_=349.228;
g1=391.995;
g2=440;
g2_5=415.305;
g3=493.883;
g4=523.251;
g4_5=554.365;
g5=587.330;
g5_5=622.254;
g6=659.255;
g7=698.456;
g33=987.767;

2. matlab を使用してサウンドを生成する

1. 音楽周波数、サンプリング周波数、ビート

220hzなどの周波数の正弦波を一定期間使用します。

この波の周波数がトーンの周波数、各サンプリングポイントの周波数がサンプリング周波数、持続時間がビートの時間になります。

サンプリング周波数は通常、歪みがないように発音周波数よりもはるかに高くなります。

 したがって、周波数 220、持続時間 1 秒、サンプリング周波数 8000 の行列を作成できます。

fs=8000;
f=220;
x=linspace(0,1,fs);
y=sin(2*pi*f*x);
plot(x,y);
sound(y,fs);

周波数 220hz、持続時間 1s、サンプリング周波数 8000 の波が生成されていることがわかります。

周波数とビート(​​長さ)を変え続けるだけで、簡単な音楽を再生できます。

2. 音楽を演奏する

f1=[g0 g0 g0 g5_];
t1=[1 1 1 1];
f2=[g3 g2_5 g3 g6];
t2=[1.5 0.25 0.75 1.5];
f3=[g5 g3 g6_];
t3=[0.75 2.25 1];
f45=[g1 g2 g3 g5 g4_5 g5 g5_5 g5];
t45=[2 0.75 1.75 0.5 0.5 0.5 1.5 0.5];
f67=[g6 g33 g0];
t67=[1.5 4.5 2];
f0=[f1 f2 f3 f45 f67];
t0=[t1 t2 t3 t45 t67];
for i=1:size(f0,2)
    x=linspace(0,t0(i),8000*t0(i));
    y=sin(2*pi*f0(i)*x);
    sound(y,8000);
    pause(t0(i));
end

 ピッチとビートの情報を保存するには 2 つの 1 次元行列を使用しますが、これには 1 対 1 の対応が必要です。そうしないと、再生マトリックスが一致しません。

サウンド機能が再生され、一時停止機能は一定時間遅延します。

3. 音楽にエンベロープを追加する

 この曲では、トランジション中に常にノイズが発生しており、音楽の品質に影響を与えているように聞こえますが、これは位相の不連続が原因であると考えられます。解決策は、サウンドにエンベロープを追加することです。

エンベロープ信号の解説(メッセージ10件) エンベロープ関数を使ってMATLABのサウンド関数のサウンド関数を最適化する [matlab Tuning_2]_Waibubabiのブログ-CSDN blog_Pianoエンベロープ関数

最後のx/exp(-kx/rhythm)型エンベロープ関数の表現形式が間違っているか不完全です。

ここを変更します

 

 上式は完全な包絡線関数であり、t はタクトタイムを表します。

修正されたエンベロープ関数は、ビート持続時間と k 値の違いによって引き起こされる音量の違いの問題を解決します。

 その形は

 

 従来のエクスポネンシャルエンベロープと比較して、最初に上昇するプロセスがあり、次の音が出される前に前の音のエネルギーが確実に消えるため、発声時のわずかなノイズを効果的に除去できます。音符が交互に表示されます。

ここでの k の値は、ドロップの速度を決定し、さまざまなスコアに応じて調整できます。一般に、k の値が大きいほど、音がクリアになります。 

4. 完全なコード

clc;clear all
fs=8000;
k=10;
k0=5;
g0=0;
g1_=195.998;
g2_=220.000;
g3_=246.942;
g4_=261.626;
g5_=293.665;
g6_=329.628;
g7_=349.228;
g1=391.995;
g2=440;
g2_5=415.305;
g3=493.883;
g4=523.251;
g4_5=554.365;
g5=587.330;
g5_5=622.254;
g6=659.255;
g7=698.456;
g33=987.767;
%前奏
f1=[g0 g0 g0 g5_];
t1=[1 1 1 1];
f2=[g3 g2_5 g3 g6];
t2=[1.5 0.25 0.75 1.5];
f3=[g5 g3 g6_];
t3=[0.75 2.25 1];
f45=[g1 g2 g3 g5 g4_5 g5 g5_5 g5];
t45=[2 0.75 1.75 0.5 0.5 0.5 1.5 0.5];
f67=[g6 g33 g0];
t67=[1.5 4.5 2];

f0=[f1 f2 f3 f45 f67];
t0=[t1 t2 t3 t45 t67];
d=0.2;
for n=1:size(f0,2)
    x=linspace(0,t0(n),t0(n)*fs);
    if n==1
        m0=d*exp(1)*k0*x.*exp((-k0/t0(n))*x).*sin(2*pi*f0(n)*x);
        %m=k*x.*exp(-k*x).*sin(2*pi*f0(n)*x);
        %m0=exp(-k0*x).*sin(2*pi*f0(n)*x); 
    else 
        if n==size(f0,2)-1
            m0=[m0 d*exp(1)*2/t0(n)*x.*exp((-4/t0(n))*x).*sin(2*pi*f0(n)*x)]; 
        else
            m0=[m0 d*exp(1)*k0/t0(n)*x.*exp((-k0/t0(n))*x).*sin(2*pi*f0(n)*x)];
            %m=[m k*x.*exp(-k*x).*sin(2*pi*f0(n)*x)];
            %m0=[m0 exp(-k0*x).*sin(2*pi*f0(n)*x)];
        end
    end
end
sound(m0,fs*2)
plot(linspace(0,sum(t0),sum(t0)*fs),m0)
pause(sum(t0)/2-2)
%主调
f7=[g0 g0 g0 g5_ g6_ g1];
t7=[1 1 0.5 0.5 0.5 0.5];
f8=[g5 g3 g0 g5 g2 g1];
t8=[0.5 1.5 0.5 0.5 0.5 0.5];
f9=[g3 g2 g0 g5 g2 g1];
t9=[0.5 1.5 0.5 0.5 0.5 0.5];
f10=[g2 g2 g0 g3 g1 g6_];
t10=[0.5 1.5 0.5 0.5 0.5 0.5];
f11=[g2 g1 g0 g5_ g6_ g1];
t11=[0.5 1.5 0.5 0.5 0.5 0.5];
f12=[g5 g3 g0 g5 g2 g1];
t12=[0.5 1.5 0.5 0.5 0.5 0.5];
f13=[g3 g2 g0 g5 g2 g1];
t13=[0.5 1.5 0.5 0.5 0.5 0.5];
f14=[g3 g2 g0 g3 g6_ g1];
t14=[0.5 1.5 0.5 0.5 0.5 0.5];
f15=[g1 g1 g0 g0 g3 g4];
t15=[0.5 1.5 1 0.5 0.25 0.25];
f16=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t16=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f17=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t17=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f18=[g5 g3 g2 g1 g5_ g1 g1];
t18=[0.5 0.5 0.5 0.5 0.5 0.5 1];
f19=[g3 g3 g2 g3 g2 g1 g3 g4];
t19=[0.5 0.25 0.25 0.5 0.5 1.5 0.25 0.25];
f20=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t20=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f21=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t21=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f22=[g5 g3 g2 g1 g5_ g1 g1];
t22=[0.5 0.5 0.5 0.5 0.5 0.5 1];
f23=[g3 g3 g2 g3 g2 g1];
t23=[0.5 0.25 0.25 0.5 0.5 2];
f24=[g3 g3 g2 g3 g2 g3 g3 g2 g3 g2];
t24=[0.5 0.25 0.25 0.5 0.5 0.5 0.25 0.25 0.5 0.5];
f25=[g3 g3 g2 g3 g2 g1];
t25=[0.5 0.25 0.25 0.5 0.5 2];
f26=[g3 g3 g2 g3 g2 g3 g3 g2 g3 g2];
t26=[0.5 0.25 0.25 0.5 0.5 0.5 0.25 0.25 0.5 0.5];
f27=[g3 g3 g2 g3 g2 g1 g0 g3 g4];
t27=[0.5 0.25 0.25 0.5 0.5 1 0.5 0.25 0.25];
f28=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t28=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f29=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t29=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f30=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t30=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f31=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t31=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f32=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t32=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f33=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t33=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f34=[g5 g5 g3 g5 g5 g5 g3 g5 g6 g5 g5];
t34=[0.5 0.25 0.25 0.5 0.5 0.25 0.25 0.25 0.25 0.5 0.5];
f35=[g3 g5 g3 g2 g1 g5_ g1 g1 g1 g2];
t35=[0.125 0.375 0.5 0.5 0.5 0.5 0.5 0.5 0.25 0.25];
f36=[g3 g3 g2 g3 g3 g2 g3 g3 g2 g3 g4 g3 g2];
t36=[0.5 0.25 0.25 0.5 0.25 0.25 0.5 0.25 0.25 0.25 0.25 0.25 0.25];
f37=[g1 g1 g2 g1 g7_ g6_ g0 g2 g3];
t37=[0.5 0.25 0.25 0.5 0.5 1 0.5 0.25 0.25];
f38=[g4 g4 g3 g4 g4 g3 g4 g4 g3 g4 g5 g4 g3];
t38=[0.5 0.25 0.25 0.5 0.25 0.25 0.5 0.25 0.25 0.25 0.25 0.25 0.25];
f39=[g2 g2 g1 g7_ g1 g2 g5_ g1 g2];
t39=[0.5 0.25 0.25 0.5 0.5 0.5 0.5 0.5 0.5];
f40=[g3 g3 g2 g3 g3 g2 g3 g3 g2 g3 g4 g3 g2];
t40=[0.5 0.25 0.25 0.5 0.25 0.25 0.5 0.25 0.25 0.25 0.25 0.25 0.25];
f41=[g1 g1 g2 g1 g7_ g6_ g0 g2 g3];
t41=[0.5 0.25 0.25 0.5 0.5 1 0.5 0.25 0.25];
f42=[g4 g4 g3 g4 g4 g3 g4 g4 g3 g4 g5 g4 g3];
t42=[0.5 0.25 0.25 0.5 0.25 0.25 0.5 0.25 0.25 0.25 0.25 0.25 0.25];
f43=[g5 g3 g2 g1 g5_ g1 g1];
t43=[0.5 0.5 0.5 0.5 0.5 0.5 1];

f=[f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19 f20 f21 f22 f23 f24 f25 f26 f27 f28 f29 f30 f31 f32 f33 f34 f35 f36 f37 f38 f39 f40 f41 f42 f43];
t=[t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20 t21 t22 t23 t24 t25 t26 t27 t28 t29 t30 t31 t32 t33 t34 t35 t36 t37 t38 t39 t40 t41 t42 t43];

for n=1:size(f,2)
    x=linspace(0,t(n),t(n)*fs);
    if n==1
        m=exp(1)*k/t(n)*x.*exp((-k/t(n))*x).*sin(2*pi*f(n)*x);
        %m=k*x.*exp(-k*x).*sin(2*pi*f(n)*x);
        %m=exp(-k*x).*sin(2*pi*f(n)*x);
    else
        m=[m exp(1)*k/t(n)*x.*exp((-k/t(n))*x).*sin(2*pi*f(n)*x)];
        %m=[m k*x.*exp(-k*x).*sin(2*pi*f(n)*x)];
        %m=[m exp(-k*x).*sin(2*pi*f(n)*x)];
    end
end
sound(m,fs*2)

 

おすすめ

転載: blog.csdn.net/npu_noj/article/details/128515299