質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

544閲覧

processingで作りたいものがあります

t0yu

総合スコア2

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

1グッド

0クリップ

投稿2022/07/25 08:00

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を使用
TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2022/07/25 09:21

現状ではどうなっていて、それをどうしたいという話でしょうか
TN8001

2022/07/25 10:26

```### 前提 のところを ``` ### 前提 と改行を入れてください。 すべてコードブロックになってしまって、非常に読みにくいです。
t0yu

2022/07/25 10:30

「実現したいこと」にある2つの項目をできるようにしたいという話です。 現状、どこから手を付ければよいかわからないので、助けてほしいというのがこの質問の意図です。
guest

回答1

0

ベストアンサー

・3本線に円(島メロのカエルの役割)を、表示させる。そのまま音階を変えた場合は円の位置が更新される。休符では何も表示させない。

楕円が描けているのですから同じようにできると思うのですが、どこがわからないですかね?

Processing

1 for (int i = 0; i < 16; i++) { 2 if (gakufu[i] == 0) continue; 3 int a = 50 - gakufu[i] * 10; // 描画オフセット 4 ellipse(fuX[i], fuY[i] + a, 30, 30); // 音符 5 }

のようなイメージです。

・すべての音が設定し終わった後、SPACEキーを押すことで16個の音符が 上列一番左から一番右、そして下列一番左から一番右へ という順番に一定間隔で音を出すようにする。

再生中ならtargetを自動でずらしつつ、音を鳴らしていくような感じですかね。
うまく説明できないので、コードを見てください^^;


Processing

1import ddf.minim.spi.*; 2import ddf.minim.signals.*; 3import ddf.minim.*; 4import ddf.minim.analysis.*; 5import ddf.minim.ugens.*; 6import ddf.minim.effects.*; 7 8Minim minim; 9AudioOutput out; 10SineWave sine; 11 12//int[] gakufu = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; 13int[] gakufu = { 1, 2, 3, 4, 3, 2, 1, 0, 3, 4, 5, 6, 5, 4, 3, 0, }; 14int[] fuX = { 60, 120, 180, 240, 300, 360, 420, 480, 60, 120, 180, 240, 300, 360, 420, 480, }; 15int[] fuY = { 70, 70, 70, 70, 70, 70, 70, 70, 230, 230, 230, 230, 230, 230, 230, 230, }; 16int r = 30; 17int target = -1; 18 19int[] notes = { 0, 262, 294, 330, 349, 392, 440, 494, 524, 588, }; 20boolean playing; 21 22void setup() { 23 size(540, 300); 24 25 minim = new Minim(this); 26 out = minim.getLineOut(Minim.STEREO); 27 sine = new SineWave(0, 1, out.sampleRate()); 28 out.addSignal(sine); 29} 30 31void draw() { 32 background(#E8F2CB); 33 34 strokeWeight(10); 35 stroke(#75D659); 36 noFill(); 37 rect(0, 0, width, height); 38 39 strokeWeight(2); 40 stroke(#E8CF75); 41 for (int i = 1; i < 4; i++) { 42 line(30, 30 + 20 * i, width - 30, 30 + 20 * i); 43 line(30, 190 + 20 * i, width - 30, 190 + 20 * i); 44 } 45 46 noStroke(); 47 fill(0, 255, 10, 20); 48 for (int i = 0; i < 16; i++) { 49 ellipse(fuX[i], fuY[i], r * 2, r * 2 + 30); 50 } 51 52 53 fill(0, 255, 10); 54 for (int i = 0; i < 16; i++) { 55 if (gakufu[i] == 0) continue; 56 57 int a = 50 - gakufu[i] * 10; // 描画オフセット 58 if (i == target) { 59 if (playing) note(gakufu[i]); // 再生モードなら音を出す 60 ellipse(fuX[i], fuY[i] + a, 30, 40); // 選択中音符 61 } else { 62 ellipse(fuX[i], fuY[i] + a, 30, 30); // 通常音符 63 } 64 } 65 66 if (playing && frameCount % 30 == 0) { // frameCountでテンポ調整 60fpsなので120bpm相当 67 target = ++target % 16; // target使いまわしw 68 } 69} 70 71void mouseClicked() { 72 for (int i = 0; i < 16; i++) { 73 if (dist(mouseX, mouseY, fuX[i], fuY[i]) < r) { 74 target = i; 75 } 76 } 77} 78 79void keyPressed() { 80 if (key == ' ') { // モード切替 81 playing = !playing; 82 out.mute(); 83 frameCount = 0; // タイミングをframeCountでやっているのでリセット 84 if (playing) target = 0; // 1拍目 85 else target = -1; // 未選択 86 } 87 88 if (target == -1) return; 89 90 if (key == 'q') { // ド 91 setNote(1); 92 } else if (key == 'w') { // レ 93 setNote(2); 94 } else if (key == 'e') { // ミ 95 setNote(3); 96 } else if (key == 'r') { // ファ 97 setNote(4); 98 } else if (key == 't') { // ソ 99 setNote(5); 100 } else if (key == 'y') { // ラ 101 setNote(6); 102 } else if (key == 'u') { // シ 103 setNote(7); 104 } else if (key == 'i') { // オク上ド 105 setNote(8); 106 } else if (key == 'o') { // オク上レ 107 setNote(9); 108 } else if (key == 'p') { // 休符 109 setNote(0); 110 } else if (keyCode == SHIFT) { 111 out.mute(); 112 } 113} 114 115void note(int i) { 116 out.unmute(); 117 sine.setFreq(notes[i]); 118} 119 120void setNote(int i) { 121 gakufu[target] = i; 122 showGakufu(); 123 note(i); 124} 125 126void showGakufu() { 127 println(join(nf(gakufu, 0), ",")); 128} 129 130void stop() { 131 out.close(); 132 minim.stop(); 133 super.stop(); 134}

join() / Reference / Processing.org

投稿2022/07/25 10:26

TN8001

総合スコア9244

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t0yu

2022/07/25 13:13

自分が求めていたことが完璧にできていて、とても助かりました。参考にさせて頂きます。 また、次回以降は読みやすい質問にするよう努めさせていただきます。 ありがとうございました。
TN8001

2022/07/25 13:38 編集

> また、次回以降は読みやすい質問にするよう努めさせていただきます。 質問(回答・コメントも)は、いつでも何度でも編集できます。 非常に簡単ですので、この質問からやってください。 私の回答のように文章の部分とコードの部分が、はっきり分かれた状態になるはずです。 その際は一番上の「変更点についての簡単な説明」を入力しないと、更新ボタンが押せないことに注意してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問