前提・実現したいこと
アラーム機能を実装したいのですが
左ボタンをON状態でアラームON
左ボタンOFF状態でアラームOFF
にしたいのですが、ボタンと連動して音が正しく鳴らない(ON/OFFが実行されない)状態
不慣れな物で分かりにくい説明になってるかもしれませんがご教示頂けると幸いです
既に試した事・確認した事
function draw()内でalarm();を呼び出した場合は動作する(ON/OFFに関わらずアラーム自体が鳴るかを確認)
112行目にalarm();を呼び出した場合特定のフレーム数でのみON/OFFが実行される
112行目にalarmを呼び出した場合、アラームオシレーターはosc.amp(0.05, 0.05);だけが反映される(本来「ピピピ」と細切れな音になるはずが「ピー」という連続音になってしまう)
###該当のソースコード
/* */ let osc; // 生成するオシレータを入れる let b1 = {sw: false, state: false}; // 左のボタンの状態(連想配列) let b2 = {sw_2: false, state_2: false}; // 右のボタンの状態(連想配列) function setup() { createCanvas(600, 600); frameRate(60); osc = new p5.Oscillator(); // 発信機機能を生成 osc.setType('square'); // 矩形波を設定(他の音:triangle,saw,sin) osc.freq(1000); // 周波数 1kHz osc.amp(0); // アンプの音量 音量0 osc.start(); // 発信機スタート } //アナログ時計 function draw() { background(50); push(); translate(width / 2, height / 2); let h = (hour() + minute() / 60) / 12 * TWO_PI; let m = (minute() + second() / 60) / 60 * TWO_PI; let s = second() / 60 * TWO_PI; //外枠 noFill(); stroke(255); strokeWeight(5); circle(0, 0, 445); //文字盤 push(); for (let i = 0; i < 12; i++) { rotate(TWO_PI / 12); noStroke(); fill(255); circle(0, -185, 32); } pop(); //時針 strokeWeight(5); draw_hands(100, h); //分針 strokeWeight(3); draw_hands(125, m); //秒針 strokeWeight(1); draw_hands(150, s); //デジタル時計 digital_Time(0,0); pop(); //左ボタン let msg; let sw = button(80, 80, 50, b1) // 指定した場所に指定した大きさのボタンを生成 if (sw) msg = "ON"; else msg = "OFF"; textSize(24); fill(225); text(msg, 60, 45); //右ボタン let msg_2; let sw_2 = button_2(520, 80, 50, b2); if (sw_2) msg_2 = "ON"; else msg_2 = "OFF"; textSize(24); fill(225); text(msg_2, 500, 45); //アラーム alarm(); } function draw_hands(len, angle) { let x = len * sin(angle); let y = len * -cos(angle); stroke(255); line(0, 0, x, y); } //デジタル時計 function digital_Time(x,y) { noStroke(); fill(225); textSize(28); textAlign(CENTER); //translateにより座標(0,0)がcanvasの中心にある text(hour() + ':' + minute() + ':' + second(),0,-50); } // 左ボタンを生成する関数 function button(x, y, size, obj) { // objは状態を記憶する連想配列 sw, state push(); if (mouseIsPressed && dist(x, y, mouseX, mouseY) < size / 2) { if (!obj.state) { // いままでボタンが押されていなかったならば obj.state = true; // ボタンを押されている状態obj.stateをtrueに変更する obj.sw = !obj.sw; // スイッチobj.swを切り換える **//ここにアラーム関数入れる** } }else{ obj.state = false; // ボタンが押されてないので、obj.stateをリセットする } if (obj.sw) fill("red"); // obj.swの内容がtrueならば赤 (ON, true) else fill("blue");// obj.swの内容がfalseならば青(OFF, false) strokeWeight(2.5); ellipse(x, y, size, size); pop(); return obj.sw; // ボタンの状態を返す } // 右ボタンを生成する関数 function button_2(x, y, size, obj) { // objは状態を記憶する連想配列 sw, state push(); if (mouseIsPressed && dist(x, y, mouseX, mouseY) < size / 2) { if (!obj.state) { // いままでボタンが押されていなかったならば obj.state = true; // ボタンを押されている状態obj.stateをtrueに変更する obj.sw_2 = !obj.sw_2; // スイッチobj.swを切り換える } }else{ obj.state = false; // ボタンが押されてないので、obj.stateをリセットする } if (obj.sw_2) fill("red"); // obj.swの内容がtrueならば赤 (ON, true) else fill("blue");// obj.swの内容がfalseならば青(OFF, false) strokeWeight(2.5); ellipse(x, y, size, size); pop(); return obj.sw_2; // ボタンの状態を返す } // アラーム function alarm(){ if (frameCount % 10 == 0) osc.amp(0.05, 0.05); // 0.05秒かけて音量を1.0にする else if (frameCount % 10 == 5) osc.amp(0, 0.05); // 0.05秒かけて音量を0にする }
回答1件
あなたの回答
tips
プレビュー