質問するログイン新規登録

回答編集履歴

2

minimバージョン

2019/12/21 09:56

投稿

TN8001
TN8001

スコア10180

answer CHANGED
@@ -10,49 +10,49 @@
10
10
  HashMap<String, Boolean> pressedKeys = new HashMap<String, Boolean>();
11
11
 
12
12
  void setup() {
13
- size(600, 400);
13
+ size(600, 400);
14
-
15
- MidiBus.list();
14
+ MidiBus.list();
16
- myBus = new MidiBus(this, -1, 1); // 注2
15
+ myBus = new MidiBus(this, -1, 1); // 注2
17
- myBus.sendMessage(192, 3); // 注3
16
+ myBus.sendMessage(192, 3); // 注3
18
17
  }
19
18
 
20
19
  void draw() {
21
20
  }
22
21
 
23
22
  void keyPressed() {
24
- String pitchName = getPitchName();
23
+ String pitchName = getPitchName();
24
+ if (pitchName == null) return;
25
+ if (pressedKeys.getOrDefault(pitchName, false)) return;
25
26
 
26
- if (pitchName != "" && !pressedKeys.getOrDefault(pitchName, false)) {
27
- myBus.sendNoteOn(0, (int) Frequency.ofPitch(pitchName).asMidiNote(), 127);
27
+ myBus.sendNoteOn(0, (int) Frequency.ofPitch(pitchName).asMidiNote(), 127);
28
- }
29
-
30
- pressedKeys.put(pitchName, true);
28
+ pressedKeys.put(pitchName, true);
31
29
  }
32
30
 
33
31
  void keyReleased() {
34
- String pitchName = getPitchName();
32
+ String pitchName = getPitchName();
33
+ if (pitchName == null) return;
35
34
 
36
- myBus.sendNoteOff(0, (int) Frequency.ofPitch(pitchName).asMidiNote(), 127);
35
+ myBus.sendNoteOff(0, (int) Frequency.ofPitch(pitchName).asMidiNote(), 127);
37
- pressedKeys.put(pitchName, false);
36
+ pressedKeys.put(pitchName, false);
38
37
  }
39
38
 
40
39
  String getPitchName() {
41
- switch (key) {
40
+ switch (key) {
42
- case 'z': return "C4";
41
+ case 'z': return "C4";
43
- case 's': return "C#4";
42
+ case 's': return "C#4";
44
- case 'x': return "D4";
43
+ case 'x': return "D4";
45
- case 'd': return "D#4";
44
+ case 'd': return "D#4";
46
- case 'c': return "E4";
45
+ case 'c': return "E4";
47
- case 'v': return "F4";
46
+ case 'v': return "F4";
48
- case 'g': return "F#4";
47
+ case 'g': return "F#4";
49
- case 'b': return "G4";
48
+ case 'b': return "G4";
50
- case 'h': return "G#4";
49
+ case 'h': return "G#4";
51
- case 'n': return "A4";
50
+ case 'n': return "A4";
52
- case 'j': return "A#4";
51
+ case 'j': return "A#4";
53
- case 'm': return "B4";
52
+ case 'm': return "B4";
54
- }
53
+ }
54
+
55
- return "";
55
+ return null;
56
56
  }
57
57
  ```
58
58
 
@@ -76,4 +76,92 @@
76
76
 
77
77
  注3
78
78
  `sendMessage(192, 3)`の`3`は音色です(`192`は気にしないでいいです)
79
- [楽器](https://ja.wikipedia.org/wiki/General_MIDI#Melodic_sounds)の`No.`の数字からいろいろ試してみてください。
79
+ [楽器](https://ja.wikipedia.org/wiki/General_MIDI#Melodic_sounds)の`No.`の数字からいろいろ試してみてください。
80
+
81
+ ---
82
+
83
+ 追記
84
+
85
+ やっぱり気になったのでminimバージョンも。無駄にややこしくしてる気もする^^;
86
+
87
+ ```Processing
88
+ import ddf.minim.spi.*;
89
+ import ddf.minim.signals.*;
90
+ import ddf.minim.*;
91
+ import ddf.minim.analysis.*;
92
+ import ddf.minim.ugens.*;
93
+ import ddf.minim.effects.*;
94
+
95
+ Minim minim;
96
+ AudioOutput out;
97
+ HashMap<String, Keyboard> pressedKeys = new HashMap<String, Keyboard>();
98
+
99
+ void setup() {
100
+ size(600, 400);
101
+ minim = new Minim(this);
102
+ out = minim.getLineOut();
103
+ }
104
+
105
+ void draw() {
106
+ }
107
+
108
+ void keyPressed() {
109
+ String pitchName = getPitchName();
110
+ if (pitchName == null) return;
111
+
112
+ Keyboard k = pressedKeys.get(pitchName);
113
+ if (k == null) {
114
+ k = new Keyboard(pitchName);
115
+ pressedKeys.put(pitchName, k);
116
+ }
117
+
118
+ k.noteOn();
119
+ }
120
+
121
+ void keyReleased() {
122
+ String pitchName = getPitchName();
123
+ if (pitchName == null) return;
124
+
125
+ pressedKeys.get(pitchName).noteOff();
126
+ }
127
+
128
+ String getPitchName() {
129
+ switch (key) {
130
+ case 'z': return "C4";
131
+ case 's': return "C#4";
132
+ case 'x': return "D4";
133
+ case 'd': return "D#4";
134
+ case 'c': return "E4";
135
+ case 'v': return "F4";
136
+ case 'g': return "F#4";
137
+ case 'b': return "G4";
138
+ case 'h': return "G#4";
139
+ case 'n': return "A4";
140
+ case 'j': return "A#4";
141
+ case 'm': return "B4";
142
+ }
143
+
144
+ return null;
145
+ }
146
+
147
+ class Keyboard {
148
+ Oscil osc;
149
+ boolean pressed;
150
+
151
+ Keyboard(String pitchName) {
152
+ osc = new Oscil(Frequency.ofPitch(pitchName), 1.0, Waves.SAW);
153
+ }
154
+
155
+ void noteOn() {
156
+ if (pressed) return;
157
+
158
+ osc.patch(out);
159
+ pressed = true;
160
+ }
161
+
162
+ void noteOff() {
163
+ osc.unpatch(out);
164
+ pressed = false;
165
+ }
166
+ }
167
+ ```

1

誤認

2019/12/21 09:56

投稿

TN8001
TN8001

スコア10180

answer CHANGED
@@ -1,4 +1,4 @@
1
- `out.playNote`は鳴らす長さを入れて音を出すみたいなので、任意の長さで鳴らすのはちょっと難しそうですねぇ(何か方法はあるかもしれませんが)
1
+ ~~`out.playNote`は鳴らす長さを入れて音を出すみたいなので、任意の長さで鳴らすのはちょっと難しそうですねぇ(何か方法はあるかもしれませんが)~~
2
2
 
3
3
  代わりにMidiで鳴らすのはどうでしょう?最近のPCであれば標準で対応しているはずです。
4
4