MinimのSampler

Processingで波形再生して波形を表示したいなと思い、
いろいろ調べたらMinimのSamplerでいけたので備忘録

#実行すると


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/aea4a9b1-c22a-e665-9ab1-e113ddcbd020.png)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/processing?src=hash&amp;ref_src=twsrc%5Etfw">#processing</a> の <a href="https://twitter.com/hashtag/minim?src=hash&amp;ref_src=twsrc%5Etfw">#minim</a> ライブラリのSamplerで再生している <a href="https://t.co/DSB8MtQHUX">pic.twitter.com/DSB8MtQHUX</a></p>&mdash; tatmos (@tatmos) <a href="https://twitter.com/tatmos/status/1375730839967854592?ref_src=twsrc%5Etfw">March 27, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#ソースコード

以下のコードで
ドラムの波形は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);
  }
}

```

#音量を下げて最終出力へ

Minimの[Sampler](http://code.compartmental.net/minim/sampler_class_sampler.html)は
[UGens](http://code.compartmental.net/minim/index_ugens.html)の分類で

``` .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 );
}
```