Minimのボコーダーを使う
キーボード入力でボコーダーのキャリアを変更可能
ただ,デフォルト以外は同じ音に聞こえる.もっとキャリアを作りこまなければならないのかも.
/** * Vocoder * * @author aa_debdeb * @date 2015/12/11 */ import ddf.minim.*; import ddf.minim.analysis.*; import ddf.minim.effects.*; import ddf.minim.signals.*; import ddf.minim.spi.*; import ddf.minim.ugens.*; Minim minim; AudioOutput out; LiveInput in; Vocoder vocoder; UGen triangleV, squareV, sawV, noiseV; Noise noise; int carier; void setup(){ size(512, 200); minim = new Minim(this); out = minim.getLineOut(); Oscil triangle = new Oscil(440, 1.0, Waves.TRIANGLE); Oscil square = new Oscil(440, 1.0, Waves.SQUARE); Oscil saw = new Oscil(440, 1.0, Waves.SAW); Noise noise = new Noise(1.0, Noise.Tint.WHITE); carier = 1; AudioStream inputStream = minim.getInputStream( out.getFormat().getChannels(), out.bufferSize(), out.sampleRate(), out.getFormat().getSampleSizeInBits()); in = new LiveInput(inputStream); vocoder = new Vocoder(1024, 8); in.patch(vocoder.modulator); in.patch(out); triangleV = triangle.patch(vocoder); squareV = square.patch(vocoder); sawV = saw.patch(vocoder); noiseV = noise.patch(vocoder); } void draw(){ background(0); stroke(255); strokeWeight(1); for(int i = 0; i < out.bufferSize() - 1; i++){ line(i, 50 + out.left.get(i) * 50, i + 1, 50 + out.left.get(i + 1) * 50); line(i, 150 + out.right.get(i) * 50, i + 1, 150 + out.right.get(i + 1) * 50); } fill(255, 0, 0); switch(carier){ case 1: text("default", 10, 20); break; case 2: text("triangle", 10, 20); break; case 3: text("square", 10, 20); break; case 4: text("saw", 10, 20); break; case 5: text("noise", 10, 20); break; } } void keyPressed(){ switch(key){ case '1': unpatch(carier); in.patch(out); carier = 1; break; case '2': unpatch(carier); triangleV.patch(out); carier = 2; break; case '3': unpatch(carier); squareV.patch(out); carier = 3; break; case '4': unpatch(carier); sawV.patch(out); carier = 4; break; case '5': unpatch(carier); noiseV.patch(out); carier = 5; break; } } void unpatch(int preCarier){ switch(preCarier){ case 1: in.unpatch(out); break; case 2: triangleV.unpatch(out); break; case 3: squareV.unpatch(out); break; case 4: sawV.unpatch(out); break; case 5: noiseV.unpatch(out); break; } }