作ろうと思ったきっかけ
- ProtoOutoStudio 3回目授業でobnizに触れる
- ブザーが面白かった
兄弟配管工ゲームでは、ブロックを叩くとコインが出てきますよね。その時の効果音を再現してみようと思いました。
”あの”効果音の音階を調べてみた
が、楽譜が読めないぞ....。オクターブもよく分からん....。
よし、トライ&エラーか???(音痴です)
まずはベースとなる”ド”を鳴らす
”ド”の音が何Hzか調べました。今回はこちらのサイトを参考に周波数を設定していきます。
【鳴らしてみた様子】
obnizにブザーをつけてみた。まずはドの音を実装!#obnizpic.twitter.com/4pDRjS9z9N
— まえぷー@出窓菜園 BWG (@kmaepu) April 5, 2020
音を鳴らすだけなら、obnizのJavascriptパーツライブラリから試すと爆速で確認できます。
obniz IDを入力し、Test Runをクリックすると、指定した音が鳴ります。デフォルトは1000Hzになっているので、鳴らしたい音に合わせるといいかなと思います。
今回はobnizのボタンを押すと、指定の音が鳴るようなプログラムをNode.jsで動かしています。ソースコードはこちら。
constObniz=require('obniz');varobniz=newObniz("OBNIZ-ID");// OBNIZ-IDに自分のIDを入れますobniz.onconnect=asyncfunction(){// スピーカーを呼び出すvarspeaker=obniz.wired("Speaker",{signal:0,gnd:1});// ディスプレイ処理obniz.display.clear();// 一旦クリアするobniz.display.print("Hello obniz!");// Hello obniz!という文字を出す// スイッチの反応を常時監視obniz.switch.onchange=function(state){if(state==="push"){// 押されたときconsole.log("pushed");// ディスプレイ処理obniz.display.clear();// 一旦クリアするobniz.display.print("pushed");// pushed という文字を出す// 音を鳴らすspeaker.play(523.25);// ドの音}elseif(state==="none"){// none で押してないときobniz.display.clear();// 一旦クリアする// スピーカーで音を鳴らさない stopspeaker.stop();}}}
上述のプログラムを使う際は、obniz.jsが必要となります。次のコードでインストールしておきましょう。
npm i obniz
あの効果音に使われている音を鳴らす
あの効果音は”シ”と”ミ”の2音で構成されているようです。といっても”ミ”は1つ上のオクターブになっているようです。
では、音階表を参考にしてみると....。
”シ”は987.76Hz、”ミ”は1318.51Hzでつくります。
音を鳴らしてみるとこのようになりました。
ちょっと発展。#obnizpic.twitter.com/SDfbhotxgO
— まえぷー@出窓菜園 BWG (@kmaepu) April 5, 2020
よさそうですね!あとは自動化してタイミング調整だな....
組み合わせる
音を順番に出力するのは簡単ですが、タイミングがわからない!!!!!!!!
楽譜を見ると次のようになっています。
こちらのサイトを参考にしてみると、200bpsのテンポであると読み解きました。200bpsとは、1分間に200拍の速度です。つまり、
1分間(60秒) ÷ 200 = 0.3秒
となります。楽譜をみると、どうやら”シ”と”ミ”の間は何も記号がないので1拍だとして、”ミ”の後は2拍ありそうなので0.6秒として作りました。
結果....。
あの効果音に少し近づいたか?
— まえぷー@出窓菜園 BWG (@kmaepu) April 5, 2020
オクターブを1つ上げれば良さそう(^^)#obniz#protooutpic.twitter.com/TiLEEtjqCd
思っていたより音が低そうなので、1オクターブあげてみましょう。
1オクターブあげてみた。
— まえぷー@出窓菜園 BWG (@kmaepu) April 5, 2020
こっちの方が良さそう。でも、なにか物足りなさが…。#obniz#protooutpic.twitter.com/3abNA7yBQH
こちらの方が近そうですね!でも何か足りない気がしてくる....
何度も同じ音を聞いていると分からなくなってしまうなぁ。でもこれで良しとしますか。
余談
圧電スピーカーで効果音作るの楽しそう....沼に片足いれはじめてしまうぅ!
最終的なソースコード
constObniz=require('obniz');varobniz=newObniz("Obniz_ID");// Obniz_IDに自分のIDを入れますobniz.onconnect=asyncfunction(){// スピーカーを呼び出すvarspeaker=obniz.wired("Speaker",{signal:0,gnd:1});// ディスプレイ処理obniz.display.clear();// 一旦クリアするobniz.display.print("Hello obniz!");// Hello obniz!という文字を出す// スイッチの反応を常時監視obniz.switch.onchange=asyncfunction(state){if(state==="push"){// 押されたときconsole.log("pushed");// ディスプレイ処理obniz.display.clear();// 一旦クリアするobniz.display.print("pushed");// pushed という文字を出す// 音を鳴らすspeaker.play(1975.53);// シawaitobniz.wait(300);// Waitspeaker.play(2637.02);// ミawaitobniz.wait(600);// Waitspeaker.stop();}elseif(state==="none"){// none で押してないときobniz.display.clear();// 一旦クリアする// スピーカーで音を鳴らさない stopspeaker.stop();}elseif(state==="left"){speaker.play(1318.51);// ミ}}}