そこで次に試してみたのが、手持ちのアナログシンセサイザとの組み合わせ。鍵盤を弾くと音階によって電圧が変化するCV信号と、鍵盤を弾いているか離しているかの状態を表すGATE信号のそれぞれを出力できるので、これを使ってみようと思ったのだ。
手持ちのアナログシンセサイザと接続MicroBruteというこのアナログシンセサイザで、ちゃんと電圧がでるのかを念のためテスターで調べると、ドを弾くと1.99Vとほぼ2Vが、その1オクターブ下のドを弾くと1.00Vとなり、しっかり動いているようだ。Oct/Vという規格になっているので半音上がることに1/12Vずつ上がり、1オクターブで1V上がるという仕組みになっているので、これをP1に突っ込んでみた。
テスターでチェックしてもしっかり動作しているのが分かったmicro:bit側を調べてみるとこれは0~3Vを測定できるようになっているので、本来3V以上を入れるのはよろしくない。とはいえ、5V程度入れても電流が流れるわけではないので、壊れる心配はないだろうと決行した。
5V入力してみたでは肝心の入力値がどうなるのか、電圧がそのまま計測されるわけではないだろうからと、アナログ値を読み取って、LEDに表示させる単純なプログラムを作って試したところ、すぐに結果が得られた。低いドを弾くと325、1オクターブ上で642、さらに1オクターブ上で959となり、1オクターブで317数字が上がる。さらにその上のレを弾くと1023となり上限に達してしまう。要は0~3Vを10bitでセンシングしているようだ。
アナログ値を読み取って、LEDに表示させるプログラムで結果が出たとりあえず、難しいことは考えず、読み取った数字をそのまま周波数として音を出してみると、なんかそれっぽい演奏ができる。ただ、このままだと音が出っぱなしになるため、P2にGATE信号を入れて、その値が500より大きければ音を出し、500以下なら音を止めるというプログラムを組んでみた。実際には音を止めるという命令が見当たらなかったので、周波数0Hzを設定して演奏してみた。
P2にGATE信号を入力音を止める命令の代わりには周波数0Hzを設定micro:bitとアナログシンセをつないで演奏。音程は……聞いてみると、かなり音痴ではあるけれど、それっぽい演奏ができているのが分かるだろう。読み取った値を周波数として設定して、それっぽく演奏できたのはある意味偶然ではある。しかし、下の1オクターブはともかく、上の1オクターブは、もうハチャメチャ。まあ、鍵盤を押せば音が鳴り、離せば音が止まるということも実現できたし、今回はこんなところにしておこうと一旦終えたのだが、やっぱり中途半端で悔しい気がしてならない。
音が出たことには満足したのだが……そこで、もうちょっとプログラムして、ちゃんと演奏できる楽器にしようと、すぐに再チャレンジした。GATE信号による鍵盤のオン/オフ制御はこのままでよい。が、音程がデタラメなので、ここをしっかりしなくてはならない。
ここで考えたのは、P1で読み取った数値から、正しい音程の周波数を導き出す計算だ。低いドの信号を受けると325で、このときの周波数が262Hz。半音上がることに317÷12=26か27ずつ値が上がっていく計算で、本来センシング結果に小数はない。けれど、MakeCodeなら小数の計算もできるのかと思って、P1に入力された値から325を引き算した上で、26.4で割ってみると、ちゃんと計算ができた。これを四捨五入した結果が、低いドから何半音上がっているかを意味する数値となる。これをaという変数に代入してみた。
ちなみに、周波数は1オクターブで2倍に上がるから半音ごとに、約1.0594倍に周波数が上がる計算となる。つまり、階乗計算を使い、1.0594のa乗を、ドの周波数である262に掛ければ目的の周波数が得られることになる。文章で書いていると複雑だが、数式にすれば比較的単純。ただ、MakeCodeに階乗という関数が見当たらなかったので、ループ命令を利用し、1.0594をa回繰り返して掛け算を行なうプログラムにした。
プログラムを変更して適用では、これで先ほどのMicroBruteを弾くとどうなるのか……。
修正後のプログラムを適用した時の演奏今度は完璧。このプログラムでは約2オクターブしか演奏はできないけれど、ちゃんとした楽器にすることができた。しかも、こんな短いプログラムでできてしまうなんて、ちょっと感激する。久しぶりにプログラムなんて作ってみたけれど、やっぱり楽しい。今度何のプログラムを作ってみようか、今いろいろ考えているところだ。
カテゴリー
関連記事
ホット記事