差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
arduino:出力基礎:音を鳴らす [2019/06/17 22:36] – [音階で音を鳴らしてみる] baba | arduino:出力基礎:音を鳴らす [2019/06/17 23:36] (現在) – [音階で音を鳴らしてみる] baba | ||
---|---|---|---|
行 128: | 行 128: | ||
\] | \] | ||
- | この場合は鳴らしたいノート番号を指定することでその周波数を計算することができますが、その逆である「鳴らしたい周波数が決まっている場合、それはピアノの鍵盤でいうところのどの位置になるのか?」を計算するには、この方程式をnについてとけば良いです。ただし基準となる440Hzのラはノート番号では69番としているので、nが69のときに440Hzになるように式を下記のようにしておきます。 | + | ただし基準となる440Hzのラはノート番号では69番としているので、nが69のときに440Hzになるように式を下記のようにしておきます。 |
\[ | \[ | ||
- | f = 440 \times 2^{(n-69)/12} | + | f = 440 \times 2^{\frac{n-69}{12}} |
\] | \] | ||
+ | ではここまでの準備を利用して、有名なNokia Tuneを鳴らしてみましょう。下記サイトを参考にします。 | ||
+ | * https:// | ||
+ | <code .c nokiatune.pde> | ||
+ | float getFreq(int n) | ||
+ | { | ||
+ | | ||
+ | } | ||
+ | void setup() | ||
+ | { | ||
+ | pinMode(6, OUTPUT); | ||
+ | } | ||
+ | int interval = 250; | ||
+ | void loop() { | ||
+ | tone(6, getFreq(76), | ||
+ | delay(interval/ | ||
+ | tone(6, getFreq(74), | ||
+ | delay(interval/ | ||
+ | tone(6, getFreq(66), | ||
+ | delay(interval); | ||
+ | tone(6, getFreq(68), | ||
+ | delay(interval); | ||
+ | tone(6, | ||
+ | delay(interval/ | ||
+ | tone(6, getFreq(71), | ||
+ | delay(interval/ | ||
+ | tone(6, getFreq(62), | ||
+ | delay(interval); | ||
+ | tone(6, getFreq(64), | ||
+ | delay(interval); | ||
+ | tone(6, getFreq(71), | ||
+ | delay(interval/ | ||
+ | tone(6, getFreq(69), | ||
+ | delay(interval/ | ||
+ | tone(6, getFreq(61), | ||
+ | delay(interval); | ||
+ | tone(6, getFreq(64), | ||
+ | delay(interval); | ||
+ | tone(6, getFreq(69), | ||
+ | delay(interval*4); | ||
+ | delay(interval*4); | ||
+ | } | ||
+ | </ | ||
+ | ===== 余談 ===== | ||
+ | 鳴らしたいノート番号を指定することでその周波数を計算することができますが、その逆である「鳴らしたい周波数が決まっている場合、それはピアノの鍵盤でいうところのどの位置になるのか?」を計算するには、方程式をnについてとけば良いです。 | ||
+ | 上記式を両辺に自然対数とることで簡単にnについて解くことができます。みなさんも実際に計算して確かめてみましょう。 | ||
+ | \[ | ||
+ | n = \frac{12 \times log_e(\frac{f}{440})}{log_e(2)} + 69 | ||
+ | \] | ||