やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

音名、変化記号、音高から周波数を算出して11オクターブ分の12音を鳴らした

半分くらい低すぎて聞こえない。そういうものなのか、コードの間違いか、老化か。

成果物

GitHubPython.Audio.ToneFrequency.201708111015

今回

ポイントはC,D+などの音名と+,-の変化記号に加え、-19までの整数値をpitchとしてオクターブを指定できるようにした。これらを元に周波数を算出する。

たとえばtone=C+, pitch=3とするとC#3の周波数138.591315を返す。

表現形式

現状、じつはtone=C++++, pitch=3のように書けてしまう。E3の音になる。

複数の変化記号は今の所実装しておきたい。以下の理由で。

  • 音楽記号にも半音2つ分上下する記号もある
  • 19,24,31,53平均律など将来の拡張で複数の変化記号を頻繁に使うことがあるかもしれない

じつはtoneとpitchをひとつの文字列にして表現できない。例えば両方つなげてC--1としたとき、以下のどちらであるか判断できない。

  • tone=C-, pitch=-1
  • tone=C--, pitch=1

なので、Python関数の第一引数、第二引数という2つの変数で扱う必要がある。

+,-でなく#,bにすれば解決するかもしれないが、bは大文字にするとBになる。Bは音名に該当する。紛らわしいし、間違って一括小文字置換などの処理をしてしまうと別の意味になってしまう。不要なリスクは避けたい。

ほかの表現形式

まだまだ表現形式がたくさんある。

  • 音名
  • 楽譜記号(音符等)
  • ディグリーネーム(,,,,,,)
  • MML(c+3,c#3,c-4)
  • MIDI(C#3)

音楽理論の前に、名付けの時点で多様すぎ。混乱の元。

11オクターブの12音

オクターブ player
-1
0
1
2
3
4
5
6
7
8
9

MIDIではC-1をノート番号0と数えるらしい。G9が最大値127となる。今回はそれ以上のB9まで鳴らした。

問題

B9以上の音を鳴らそうとするとエラーになる。

参考

所感

音が低い気がするのだが、合っているのか?周波数は合っていると思うが……。