🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Processing

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

Q&A

解決済

2回答

1848閲覧

processingで鍵盤を作成したいです。

bump_of_pool

総合スコア7

Processing

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

0グッド

0クリップ

投稿2019/12/21 03:18

processingでキーボードを鍵盤にするプログラムを見つけました。下のプログラムは、キーを押すと1秒間だけ鳴るプログラムです。これをキーを押し続ければ鳴り続け、離すと止まるプログラムにしたいのですが、どうすれば良いのかわかりません。

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;

void setup(){
size(600, 400);
minim = new Minim(this);
out = minim.getLineOut();
}

void draw(){

}

void keyPressed(){
String pitchName = "";
switch(key){
case 'z':
pitchName += "C"; break;
case 's':
pitchName += "C#"; break;
case 'x':
pitchName += "D"; break;
case 'd':
pitchName += "D#"; break;
case 'c':
pitchName += "E"; break;
case 'v':
pitchName += "F"; break;
case 'g':
pitchName += "F#"; break;
case 'b':
pitchName += "G"; break;
case 'h':
pitchName += "G#"; break;
case 'n':
pitchName += "A"; break;
case 'j':
pitchName += "A#"; break;
case 'm':
pitchName += "B"; break;
}
if(pitchName != ""){
out.playNote(0.0, 1.0, new Keyboard(Frequency.ofPitch(pitchName + "4").asHz()));
}
}

class Keyboard implements Instrument {

Oscil osc;

Keyboard(float pitch){
osc = new Oscil(pitch, 1.0, Waves.SAW);
}

void noteOn(float duration){
osc.patch(out);
}

void noteOff(){
osc.unpatch(out);
}

}

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

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

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

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

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

guest

回答2

0

out.playNoteは鳴らす長さを入れて音を出すみたいなので、任意の長さで鳴らすのはちょっと難しそうですねぇ(何か方法はあるかもしれませんが)

代わりにMidiで鳴らすのはどうでしょう?最近のPCであれば標準で対応しているはずです。

Processing

1import themidibus.*; // 注1 2import ddf.minim.ugens.Frequency; 3 4MidiBus myBus; 5HashMap<String, Boolean> pressedKeys = new HashMap<String, Boolean>(); 6 7void setup() { 8 size(600, 400); 9 MidiBus.list(); 10 myBus = new MidiBus(this, -1, 1); // 注2 11 myBus.sendMessage(192, 3); // 注3 12} 13 14void draw() { 15} 16 17void keyPressed() { 18 String pitchName = getPitchName(); 19 if (pitchName == null) return; 20 if (pressedKeys.getOrDefault(pitchName, false)) return; 21 22 myBus.sendNoteOn(0, (int) Frequency.ofPitch(pitchName).asMidiNote(), 127); 23 pressedKeys.put(pitchName, true); 24} 25 26void keyReleased() { 27 String pitchName = getPitchName(); 28 if (pitchName == null) return; 29 30 myBus.sendNoteOff(0, (int) Frequency.ofPitch(pitchName).asMidiNote(), 127); 31 pressedKeys.put(pitchName, false); 32} 33 34String getPitchName() { 35 switch (key) { 36 case 'z': return "C4"; 37 case 's': return "C#4"; 38 case 'x': return "D4"; 39 case 'd': return "D#4"; 40 case 'c': return "E4"; 41 case 'v': return "F4"; 42 case 'g': return "F#4"; 43 case 'b': return "G4"; 44 case 'h': return "G#4"; 45 case 'n': return "A4"; 46 case 'j': return "A#4"; 47 case 'm': return "B4"; 48 } 49 50 return null; 51}

注1
The MidiBusを「ライブラリを追加」からインストールしてください。

注2
プログラムを実行したときに、

Available MIDI Devices: ----------Input---------- [0] "Real Time Sequencer" ----------Output---------- [0] "Gervill" [1] "Microsoft MIDI Mapper" [2] "Microsoft GS Wavetable Synth" [3] "Real Time Sequencer"

のよう表示が出ます。
音が出なかったときはnew MidiBus(this, -1, 1)1を、Outputにある数字の中から変えて試してください。

注3
sendMessage(192, 3)3は音色です(192は気にしないでいいです)
楽器No.の数字からいろいろ試してみてください。


追記

やっぱり気になったのでminimバージョンも。無駄にややこしくしてる気もする^^;

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; 10HashMap<String, Keyboard> pressedKeys = new HashMap<String, Keyboard>(); 11 12void setup() { 13 size(600, 400); 14 minim = new Minim(this); 15 out = minim.getLineOut(); 16} 17 18void draw() { 19} 20 21void keyPressed() { 22 String pitchName = getPitchName(); 23 if (pitchName == null) return; 24 25 Keyboard k = pressedKeys.get(pitchName); 26 if (k == null) { 27 k = new Keyboard(pitchName); 28 pressedKeys.put(pitchName, k); 29 } 30 31 k.noteOn(); 32} 33 34void keyReleased() { 35 String pitchName = getPitchName(); 36 if (pitchName == null) return; 37 38 pressedKeys.get(pitchName).noteOff(); 39} 40 41String getPitchName() { 42 switch (key) { 43 case 'z': return "C4"; 44 case 's': return "C#4"; 45 case 'x': return "D4"; 46 case 'd': return "D#4"; 47 case 'c': return "E4"; 48 case 'v': return "F4"; 49 case 'g': return "F#4"; 50 case 'b': return "G4"; 51 case 'h': return "G#4"; 52 case 'n': return "A4"; 53 case 'j': return "A#4"; 54 case 'm': return "B4"; 55 } 56 57 return null; 58} 59 60class Keyboard { 61 Oscil osc; 62 boolean pressed; 63 64 Keyboard(String pitchName) { 65 osc = new Oscil(Frequency.ofPitch(pitchName), 1.0, Waves.SAW); 66 } 67 68 void noteOn() { 69 if (pressed) return; 70 71 osc.patch(out); 72 pressed = true; 73 } 74 75 void noteOff() { 76 osc.unpatch(out); 77 pressed = false; 78 } 79}

投稿2019/12/21 06:29

編集2019/12/21 09:56
TN8001

総合スコア9855

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

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

thkana

2019/12/21 07:22

> 任意の長さで鳴らすのはちょっと難しそう 私もminimは機能豊富過ぎてついていけていませんが。 midiでNoteOnとかOffとかあるわけで、そこから類推して質問のプログラムのKeyboard.noteOnとかnoteOffというメソッドを(playNoteを経由せず)呼んでやればそのように動作したりします。
TN8001

2019/12/21 07:33

あぁなるほどInstrumentはそう使うわけですか。流してましたw Midiのほうが音を変えやすそうなので、このままにしときます。 補足ありがとうございます。
guest

0

ベストアンサー

keyReleased()関数でキーボードが離されたことを検知できるみたいですから、keyPressed()では音を出すだけにして、keyReleased()で離されたら音を止める、ようにすればよいのでは。

投稿2019/12/21 05:49

thkana

総合スコア7703

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問