import ddf.minim.spi.*; import ddf.minim.signals.*; import ddf.minim.*; import ddf.minim.analysis.*; import ddf.minim.ugens.*; import ddf.minim.effects.*; Minim minim; AudioOutput out; SineWave sine; int [] gakufu ={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} ; int [] fuX={60, 120, 180, 240, 300, 360, 420, 480, 60, 120, 180, 240, 300, 360, 420, 480}; int [] fuY={70, 70, 70, 70, 70, 70, 70, 70, 230, 230, 230, 230, 230, 230, 230, 230}; int r; int target = -1; // 音を入れる配列の番号 void setup() { size(540, 300); minim = new Minim(this); out = minim.getLineOut(Minim.STEREO); sine = new SineWave(0, 1, out.sampleRate()); out.addSignal(sine); r = 30; } void draw() { background(#E8F2CB); //外周線 strokeWeight(10); stroke(#75D659); noFill(); rect(0, 0, width, height); //譜面の線 strokeWeight(2); stroke(#E8CF75); for (int i = 1; i<4; i++) { line(30, 30+20*i, width-30, 30+20*i); } for (int i = 1; i<4; i++) { line(30, 190+20*i, width-30, 190+20*i); } // 入力エリア noStroke(); fill(0,255,10,20); for (int i = 0; i < 16; i++) { ellipse(fuX[i], fuY[i], r * 2, r * 2 + 30); } } void mouseClicked() { // 音符の領域の接触を判定 for (int i = 0; i < 16; i++) { if (dist(mouseX, mouseY, fuX[i], fuY[i]) < r) { target = i; } } } void showGakufu() { for (int i = 0; i < 16; i++) { print(gakufu[i]+","); } println(); } //ドレミファソラシド void keyPressed() { // 音の記録以外の処理の場合は、ここより上で処理する if (target == -1) return ; if (key == 'q') {//ド out.unmute(); sine.setFreq(262); ellipse((width-60)/8, 110, 30, 30); gakufu[target] = 1; // 選んだ楽譜の場所に音のコードを入れる showGakufu(); } else if (key == 'w') {//レ out.unmute(); sine.setFreq(294); gakufu[target] = 2; showGakufu(); } else if (key == 'e') {//ミ out.unmute(); sine.setFreq(330); gakufu[target] = 3; showGakufu(); } else if (key == 'r') {//ファ out.unmute(); sine.setFreq(349); gakufu[target] = 4; showGakufu(); } else if (key == 't') {//ソ out.unmute(); sine.setFreq(392); gakufu[target] = 5; showGakufu(); } else if (key == 'y') {//ラ out.unmute(); sine.setFreq(440); gakufu[target] = 6; showGakufu(); } else if (key == 'u') {//シ out.unmute(); sine.setFreq(494); gakufu[target] = 7; showGakufu(); } else if (key == 'i') {//オク上ド out.unmute(); sine.setFreq(524); gakufu[target] = 8; showGakufu(); } else if (key == 'o') {//オク上レ out.unmute(); sine.setFreq(588); gakufu[target] = 9; showGakufu(); } else if (key == 'p') {//休符 out.unmute(); sine.setFreq(0); gakufu[target] = 0; } else if (keyCode == SHIFT ) { out.mute(); } } //停止 void stop() { out.close(); minim.stop(); super.stop(); } ```### 前提 processingでどうぶつの森の「島メロ」のようなものを作りたいです。 ここから先どうすればいいのかわからないので、質問させていだたきました。 円の位置などはこちらで調整しますので、大体で大丈夫です。 わかりずらい点があれば返信にて対応させていただきます。 ご助力よろしくお願いいたします。 以下、現時点で完成しているプログラムの説明です。 上列に8個、下列に8個の計16個の音符があります。 それぞれの音符をgakufu[]とし、//入力エリア で描画された円をクリックすると、その範囲が選択されます。 例)一番左上の円をクリックすると、gakufu ={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} の一番左の0が選択される。 その範囲でq~pまでのいずれかのキーを押すと、そのキーに振り当てられた音階が設定されます。 例)一番左上の円が選択されている状態で"w"を押すと"レ"が設定され、gakufu ={2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} となる。 この動作を16個すべての音符に行うことで、メロディーを作成します。 それぞれの音符にどの音階が設定されているかは、printlnで確認できるようになっています。 ### 実現したいこと ・3本線に円(島メロのカエルの役割)を、表示させる。そのまま音階を変えた場合は円の位置が更新される。休符では何も表示させない。 例)"q"を押したら"ド"(3本線の一番下)の位置に表示させる。続けて"u"を押したら"シ"の位置に表示させ、"ド"の位置の円は消える。"p"を押したら、円は消える。 ・すべての音が設定し終わった後、SPACEキーを押すことで16個の音符が 上列一番左から一番右、そして下列一番左から一番右へ という順番に一定間隔で音を出すようにする。なお、この動作に関するコードは"// 音の記録以外の処理の場合は、ここより上で処理する"より上で行う。 ### 補足情報(FW/ツールのバージョンなど) ツールminim2.2.2を使用
回答1件
あなたの回答
tips
プレビュー