arduino:出力基礎:音を鳴らす

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
arduino:出力基礎:音を鳴らす [2019/06/17 20:43] – [tone関数を使う] babaarduino:出力基礎:音を鳴らす [2019/06/17 23:36] (現在) – [音階で音を鳴らしてみる] baba
行 42: 行 42:
 </WRAP> </WRAP>
  
-<code .c countdonw.pde>+<code .c countdown.pde>
 void setup() void setup()
 { {
   pinMode(6, OUTPUT);   pinMode(6, OUTPUT);
 } }
-void loop(){+void loop() {
   tone(6, 2217, 70);   tone(6, 2217, 70);
   delay(1000);   delay(1000);
   tone(6, 1991, 70);   tone(6, 1991, 70);
-  delay(1000);  +  delay(1000);
 } }
 </code> </code>
  
-<code .c bell.pde>+<code .c ring.pde> 
 +// Reference: http://arms22.blog91.fc2.com/blog-entry-276.html 
 +void setup() 
 +
 +  pinMode(6, OUTPUT); 
 +}
 void loop(void) void loop(void)
 { {
-  notePlayer.play(690,25);+  tone(6,690,25);
   delay(50);   delay(50);
  
-  notePlayer.play(690,30);+  tone(6,690,30);
   delay(168);   delay(168);
  
-  notePlayer.play(690,23);+  tone(6,690,23);
   delay(48);   delay(48);
  
-  notePlayer.play(690,30);+  tone(6,690,30);
   delay(360);   delay(360);
  
  
-  notePlayer.play(970,25);+  tone(6,970,25);
   delay(50);   delay(50);
  
-  notePlayer.play(970,30);+  tone(6,970,30);
   delay(50);   delay(50);
  
-  notePlayer.play(970,30);+  tone(6,970,30);
   delay(50);   delay(50);
  
-  notePlayer.play(970,30);+  tone(6,970,30);
   delay(50);   delay(50);
  
  
-  notePlayer.play(487,30);+  tone(6,487,30);
   delay(55);   delay(55);
  
-  notePlayer.play(487,30);+  tone(6,487,30);
   delay(55);   delay(55);
  
-  notePlayer.play(487,30);+  tone(6,487,30);
   delay(55);   delay(55);
  
-  notePlayer.play(487,30);+  tone(6,487,30);
   delay(55);   delay(55);
  
-  notePlayer.play(487,30);+  tone(6,487,30);
   delay(55);   delay(55);
  
-  notePlayer.play(487,30);+  tone(6,487,30);
   delay(55);   delay(55);
  
-  notePlayer.play(487,30);+  tone(6,487,30);
   delay(55);   delay(55);
  
-  notePlayer.play(487,30);+  tone(6,487,30);
   delay(55);   delay(55);
  
行 112: 行 117:
 </code> </code>
 ===== 音階で音を鳴らしてみる ===== ===== 音階で音を鳴らしてみる =====
-ON/OFFの感覚を狭くすることで、高い音が、広くすることで低い音がなることが確認できました。ではこれをもう少しわかりやすく、音程にて再現できるようにしてみましょう。+ON/OFFの感覚を狭くすることで、高い音が、広くすることで低い音がなることが確認できました。また、任意の周波数であればtone()関数を利用して簡単に音を鳴らすことができるのも確認できました。ではこれをもう少しわかりやすく、所謂ドレミファソラシド...といった音程にて再現できるようにしてみましょう。
  
 +まず最初の周波数と音高の関係ですが、ピアノの真ん中辺りの「ド」の音を鳴らし、一オクターブ上の「ド」を鳴らした場合を考えます。
 +最初に鳴らしたドの周波数を $f_1$とした場合、一オクターブ上のドは $f_2 = 2f_1$として表されます。つまり一オクターブ上の音は下の音の倍の周波数になっているわけです。このような関係をより数学的に表現したものが、十二平均律になります。オクターブ間に12の音程を均等に配置するものです。
  
 +ベースやギターの開放弦を利用した調律では440Hzを利用しますが、この音を基準(ピアノのラ)として、次の式で表すことで、440Hzのオクターブ上(12音上)は $ 440 \times 2^{\frac{12}{12}} = 880 $となります。
  
 +\[
 +f = 440 \times 2^{(n/12)}
 +\]
 +
 +ただし基準となる440Hzのラはノート番号では69番としているので、nが69のときに440Hzになるように式を下記のようにしておきます。
 +\[
 +f = 440 \times 2^{\frac{n-69}{12}}
 +\]
 +
 +ではここまでの準備を利用して、有名なNokia Tuneを鳴らしてみましょう。下記サイトを参考にします。
 +  * https://musescore.com/user/29944637/scores/5266155
 +
 +<code .c nokiatune.pde>
 +float getFreq(int n)
 +{
 + return 440.0*pow(2, (n-69)/12.0);
 +}
 +void setup()
 +{
 +  pinMode(6, OUTPUT);
 +}
 +int interval = 250;
 +void loop() {
 +  tone(6, getFreq(76), interval/2);
 +  delay(interval/2);
 +  tone(6, getFreq(74), interval/2);
 +  delay(interval/2);
 +  tone(6, getFreq(66), interval);
 +  delay(interval);
 +  tone(6, getFreq(68), interval);
 +  delay(interval);
 +  tone(6,getFreq(73), interval/2);
 +  delay(interval/2);
 +  tone(6, getFreq(71), interval/2);
 +  delay(interval/2);
 +  tone(6, getFreq(62), interval);
 +  delay(interval);
 +  tone(6, getFreq(64), interval);
 +  delay(interval);
 +  tone(6, getFreq(71), interval/2);
 +  delay(interval/2);
 +  tone(6, getFreq(69), interval/2);
 +  delay(interval/2);
 +  tone(6, getFreq(61), interval);
 +  delay(interval);
 +  tone(6, getFreq(64), interval);
 +  delay(interval);
 +  tone(6, getFreq(69), interval*2);
 +  delay(interval*4);
 +  delay(interval*4);
 +}
 +</code>
 +===== 余談 =====
 +鳴らしたいノート番号を指定することでその周波数を計算することができますが、その逆である「鳴らしたい周波数が決まっている場合、それはピアノの鍵盤でいうところのどの位置になるのか?」を計算するには、方程式をnについてとけば良いです。
  
 +上記式を両辺に自然対数とることで簡単にnについて解くことができます。みなさんも実際に計算して確かめてみましょう。
 +\[
 + n = \frac{12 \times log_e(\frac{f}{440})}{log_e(2)} + 69
 +\]
  
  • /home/users/2/lolipop.jp-4404d470cd64c603/web/ws/data/attic/arduino/出力基礎/音を鳴らす.1560771780.txt.gz
  • 最終更新: 2019/06/17 20:43
  • by baba