Processingで波形再生して波形を表示したいなと思い、
いろいろ調べたらMinimのSamplerでいけたので備忘録
実行すると
#processing の #minim ライブラリのSamplerで再生している pic.twitter.com/DSB8MtQHUX
— tatmos (@tatmos) March 27, 2021
ソースコード
以下のコードで
ドラムの波形はwavなどで用意する。
ここでは上位のフォルダ階層のMaterialsフォルダに用意しています。
64個の配列に数字が入っていてそれをもとに再生します。
Drawでシーケンスしているので少しタイミングが揺れます・・・
simple_sampler.java
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(512, 200);
frameRate(60);
minim = new Minim(this);
out = minim.getLineOut();
setup_Drum();
}
Sampler kick;
Sampler PHH;
Gain gain;
void setup_Drum()
{
gain = new Gain(-12.0f);
PHH = new Sampler("../Materials/128_044_NOISE_PHH.wav", 1, new Minim(this));
PHH.patch( out );
kick = new Sampler("../Materials/128_035_NOISE_BD2.wav", 1, new Minim(this));
kick.patch(gain).patch( out );
}
int[] DrumChart = {0,-1,-1,-1, 0,-1,-1,-1, 1,-1,-1,-1, 0,-1,-1,-1, 0,-1,-1,-1, 0,-1,-1,-1, 1,-1,1,-1, 0,-1,-1,-1, 0,-1,-1,-1, 0,-1,-1,-1, 1,-1,-1,-1, 0,-1,-1,-1, 0,-1,-1,-1, 0,-1,-1,-1, 1,-1,-1,-1, 0,-1,0,0, };
void PlayDrum(int currentNoteIndex)
{
switch(DrumChart[currentNoteIndex%DrumChart.length])
{
case -1:break;
case 0:kick.trigger();break;
case 1:PHH.trigger();break;
}
}
int counter = 0;
float lastTime = 0;
void draw(){
int currentTime = millis();
if(currentTime > lastTime)
{
PlayDrum((counter++)%DrumChart.length);
lastTime = currentTime + 60;
}
DrawWave();
}
void DrawWave()
{
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);
}
}
音量を下げて最終出力へ
.java
gain = new Gain(-12.0f);
kick = new Sampler("../Materials/128_035_NOISE_BD2.wav", 1, new Minim(this));
kick.patch(gain).patch( out );
という感じで、ここではoutへ出力するのだけどその間にgainを通して音量-12dB下げています。
オーディオのルーティングが簡単に書けるのでいろいろ実験しやすそうです。
BitCrushエフェクト
例えばkickの音をBitCrushさせたいなと思った以下のような感じで間に挟むだけでエフェクトがかかります。簡単。
.java
void setup_Drum()
{
gain = new Gain(0.0f);
BitCrush bitCrush;
bitCrush = new BitCrush(2, out.sampleRate());
PHH = new Sampler("../Materials/128_044_NOISE_PHH.wav", 1, new Minim(this));
PHH.patch( out );
kick = new Sampler("../Materials/128_035_NOISE_BD2.wav", 1, new Minim(this));
kick.patch(bitCrush).patch(gain).patch( out );
}