obnizとブザーで兄弟配管工ゲームのコイン音を出してみた
作ろうと思ったきっかけ
- ProtoOutoStudio 3回目授業でobnizに触れる
- ブザーが面白かった
兄弟配管工ゲームでは、ブロックを叩くとコインが出てきますよね。その時の効果音を再現してみようと思いました。
”あの”効果音の音階を調べてみた
が、楽譜が読めないぞ....。オクターブもよく分からん....。
よし、トライ&エラーか???(音痴です)
まずはベースとなる”ド”を鳴らす
”ド”の音が何Hzか調べました。今回はこちらのサイトを参考に周波数を設定していきます。
【鳴らしてみた様子】
obnizにブザーをつけてみた。まずはドの音を実装!#obniz pic.twitter.com/4pDRjS9z9N
— まえぷー@出窓菜園 BWG (@kmaepu) April 5, 2020
音を鳴らすだけなら、obnizのJavascriptパーツライブラリから試すと爆速で確認できます。
obniz IDを入力し、Test Runをクリックすると、指定した音が鳴ります。デフォルトは1000Hzになっているので、鳴らしたい音に合わせるといいかなと思います。
今回はobnizのボタンを押すと、指定の音が鳴るようなプログラムをNode.jsで動かしています。ソースコードはこちら。
const Obniz = require('obniz');
var obniz = new Obniz("OBNIZ-ID"); // OBNIZ-IDに自分のIDを入れます
obniz.onconnect = async function () {
// スピーカーを呼び出す
var speaker = 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); // ドの音
} else if (state === "none") {
// none で押してないとき
obniz.display.clear(); // 一旦クリアする
// スピーカーで音を鳴らさない stop
speaker.stop();
}
}
}
上述のプログラムを使う際は、obniz.jsが必要となります。次のコードでインストールしておきましょう。
npm i obniz
あの効果音に使われている音を鳴らす
あの効果音は”シ”と”ミ”の2音で構成されているようです。といっても”ミ”は1つ上のオクターブになっているようです。
では、音階表を参考にしてみると....。
”シ”は987.76Hz、”ミ”は1318.51Hzでつくります。
音を鳴らしてみるとこのようになりました。
ちょっと発展。#obniz pic.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 #protoout pic.twitter.com/TiLEEtjqCd
思っていたより音が低そうなので、1オクターブあげてみましょう。
1オクターブあげてみた。
— まえぷー@出窓菜園 BWG (@kmaepu) April 5, 2020
こっちの方が良さそう。でも、なにか物足りなさが…。#obniz #protoout pic.twitter.com/3abNA7yBQH
こちらの方が近そうですね!でも何か足りない気がしてくる....
何度も同じ音を聞いていると分からなくなってしまうなぁ。でもこれで良しとしますか。
余談
圧電スピーカーで効果音作るの楽しそう....沼に片足いれはじめてしまうぅ!
最終的なソースコード
const Obniz = require('obniz');
var obniz = new Obniz("Obniz_ID"); // Obniz_IDに自分のIDを入れます
obniz.onconnect = async function () {
// スピーカーを呼び出す
var speaker = obniz.wired("Speaker", {signal:0, gnd:1});
// ディスプレイ処理
obniz.display.clear(); // 一旦クリアする
obniz.display.print("Hello obniz!"); // Hello obniz!という文字を出す
// スイッチの反応を常時監視
obniz.switch.onchange = async function(state) {
if (state === "push") {
// 押されたとき
console.log("pushed");
// ディスプレイ処理
obniz.display.clear(); // 一旦クリアする
obniz.display.print("pushed"); // pushed という文字を出す
// 音を鳴らす
speaker.play(1975.53); // シ
await obniz.wait(300); // Wait
speaker.play(2637.02); // ミ
await obniz.wait(600); // Wait
speaker.stop();
} else if (state === "none") {
// none で押してないとき
obniz.display.clear(); // 一旦クリアする
// スピーカーで音を鳴らさない stop
speaker.stop();
} else if (state === "left") {
speaker.play(1318.51); // ミ
}
}
}
const Obniz = require('obniz');
var obniz = new Obniz("Obniz_ID"); // Obniz_IDに自分のIDを入れます
obniz.onconnect = async function () {
// スピーカーを呼び出す
var speaker = obniz.wired("Speaker", {signal:0, gnd:1});
// ディスプレイ処理
obniz.display.clear(); // 一旦クリアする
obniz.display.print("Hello obniz!"); // Hello obniz!という文字を出す
// スイッチの反応を常時監視
obniz.switch.onchange = async function(state) {
if (state === "push") {
// 押されたとき
console.log("pushed");
// ディスプレイ処理
obniz.display.clear(); // 一旦クリアする
obniz.display.print("pushed"); // pushed という文字を出す
// 音を鳴らす
speaker.play(1975.53); // シ
await obniz.wait(300); // Wait
speaker.play(2637.02); // ミ
await obniz.wait(600); // Wait
speaker.stop();
} else if (state === "none") {
// none で押してないとき
obniz.display.clear(); // 一旦クリアする
// スピーカーで音を鳴らさない stop
speaker.stop();
} else if (state === "left") {
speaker.play(1318.51); // ミ
}
}
}
Author And Source
この問題について(obnizとブザーで兄弟配管工ゲームのコイン音を出してみた), 我々は、より多くの情報をここで見つけました https://qiita.com/kmaepu/items/1efc686b4425b54dd1a3著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .