2016年5月2日月曜日

メモ: Arduinoでモジュレーション波形生成(Decayのみ)

スケッチ

#include <MsTimer2.h>

#define MOD_RATE  10  // ms

int16_t beatLen = 50;
int16_t decayLen = 20;
int16_t level = 4095;

int16_t decay_delta;
int16_t mod_value;

int16_t tick;

void outADSR()
{
  tick++;
  
  if (tick > beatLen) {
    tick = 0;    
    //モジュレーション波形を初期化する
    mod_value = level;
    decay_delta = level / decayLen;
  }
  
  Serial.println(mod_value);
  
  mod_value -= decay_delta;
  if (mod_value < 0) {
      mod_value = 0;
  }
}

void setup() {
  Serial.begin(9600);
  
  MsTimer2::set(MOD_RATE, outADSR);
  MsTimer2::start();
}

void loop() {
  //Serial.println("a");
}

BPM = 120 → 60s / 120 = 0.5s = 500ms

なので1Beatは500ms

MOD_RATEを10ms、beatLenを50にしているので

10ms * 50 = 500ms

decayLenは減衰の着地(?)地点で0~beatLenを指定。

タイマー割り込みにMsTime2を使用。