Electro-smith Daisy seed로 반전 만들기

데이지 뭐예요?


오디오를 전문적으로 처리하는 아두노와 유사하다.앞서 노트에 소개한 글이 있으니 관심 있으신 분들도 참고해주세요.
https://note.com/yutannihilation/n/nd837ab844c2b

Daisy seed 및 기타 보드의 차이점


데이지 시리즈는 이번에 사용한 시드 외에도 팟/패치/피탈 등이 있다.
https://www.electro-smith.com/daisy
Seed와 다른 점은 자신이 만든 파일과 버튼 등의 입력과 출력을 준비해야 한다는 것이다.Pod/Patch/Petal에 이미 그림과 단추가 있는데 이 일대는 도서관에 추상화되어 간단하게 방문할 수 있다.샘플 코드는 이것을 전제로 하는 것이 많아서 Seed에서 같은 일을 하려고 할 때 좀 까다롭다.

Parameter


예를 들어, Daisy에는 클래스Parameter가 있습니다.ADC에서 입력한 최대치, 최소치, 곡선 모양(선형, 지수, 로그 등)을 지정하여 수치에 매핑할 수 있는 편리한 유틸리티다.샘플 코드를 보고
lpParam.Init(patch.controls[3], 20, 20000, Parameter::LOGARITHMIC);
( https://github.com/electro-smith/DaisyExamples/blob/c763348d79a83afa53d0176cd4a616dc8d098ad5/patch/verb/ex_verb.cpp#L63 )
이렇게 지정한 것patch.controls[3]은 ADC를 나타내는 것 같다.Patch의 경우 이렇게 하면 됩니다. Seed의 경우 이'ADC를 표시하는 것'을 처리하기 위해 코드를 얼마나 써야 합니까?
구체적으로 말하면ParameterInit()는 이런 서명입니다.
void daisy::Parameter::Init(
  AnalogControl input,
  float         min,
  float         max,
  Curve         curve
)
( https://electro-smith.github.io/libDaisy/classdaisy_1_1_parameter.html#a0dc0293e425569511a73c311bfa54f48 )
그럼, AnalogControl 어떻게 할까요, 바로 이렇습니다Init().
void daisy::AnalogControl::Init(
  uint16_t * adcptr,
  float      sr,
  bool       flip = false,
  bool       invert = false,
  float      slew_seconds = 0.002f 
)
( https://electro-smith.github.io/libDaisy/classdaisy_1_1_analog_control.html#a516499f0788d7405024eff550386a59e )
adcptr의 설명을 읽었습니다.
is a pointer to the raw adc read value – This can be acquired with dsy_adc_get_rawptr() , or dsy_adc_get_mux_rawptr()그러나 실제로dsy_adc_get_rawptr()는 미공개 함수이기 때문에 사용할 수 없습니다...
도대체 어떻게혼란스러웠지만 패치를 싸고 있는 프로그램 라이브러리 안을 들여다보니 이렇게 됐어요.seed.adc.GetPtr() 이 함수는 사용할 수 있을 것 같습니다.
controls[i].Init(seed.adc.GetPtr(i), AudioCallbackRate(), true);
( https://github.com/electro-smith/libDaisy/blob/831f3820808f7718c55d6c844489d17bc20c2086/src/daisy_patch.cpp#L225 )
이걸 쓰면 이런 느낌의 코드예요.15~18바늘에 바늘땀을 연결할 생각이다.
#define PIN_REVERB_CONTROL1   15
#define PIN_REVERB_CONTROL2   16
#define PIN_REVERB_CONTROL3   17
#define PIN_REVERB_CONTROL4   18

static DaisySeed seed;

// ADCの設定。配列の長さは必要なツマミの数と同じ。
AdcChannelConfig adcConfig[4];

// ツマミを接続するピンをそれぞれ指定する
adcConfig[0].InitSingle(seed.GetPin(PIN_REVERB_CONTROL1));
adcConfig[1].InitSingle(seed.GetPin(PIN_REVERB_CONTROL2));
adcConfig[2].InitSingle(seed.GetPin(PIN_REVERB_CONTROL3));
adcConfig[3].InitSingle(seed.GetPin(PIN_REVERB_CONTROL4));

// ADCを初期化(4は使うADCの数)
seed.adc.Init(adcConfig, 4);

AnalogControl verb_control1, verb_control2, verb_control3, verb_control4;
Parameter verb_feedback, verb_lp_freq, verb_mix, verb_send;

// 各ADCをParameterに割り当てる
verb_control1.Init(seed.adc.GetPtr(0), sample_rate);
verb_feedback.Init(verb_control1, 0.f, 0.99f, Parameter::LINEAR);

verb_control2.Init(seed.adc.GetPtr(1), sample_rate);
verb_lp_freq.Init(verb_control2, 0.f, 20000.0f, Parameter::EXPONENTIAL);

verb_control3.Init(seed.adc.GetPtr(2), sample_rate);
verb_mix.Init(verb_control3, 0.f, 1.0f, Parameter::LINEAR);

verb_control4.Init(seed.adc.GetPtr(3), sample_rate);
verb_send.Init(verb_control4, 0.f, 1.0f, Parameter::LINEAR);

seed.adc.Start();
이렇게 Parameter로 싸면 ADC의 값을 반방향 매개 변수로 사용할 때 자신이 비추지 않아도 <Parameter>.Process()를 통해 비추는 값을 얻을 수 있다.

RevebSc


역방향은 ReverbSc이라는 등급이 있다.피드백량과 피드백 저통 필터 마감 주파수는 두 가지 파라미터가 있다.회감과 건습 등은 스스로 실시해야 한다.(pre-delay의 처리 방법을 잘 몰라요. 내부에 몇 개의 파라미터가 있는 것 같아서 이 부분을 바꾸는 게 좋을 것 같아요.참고https://github.com/electro-smith/DaisyExamples/blob/master/patch/verb/ex_verb.cpp#L63,바로 이런 느낌의 코드입니다.
ReverbSc verb;

static void AudioCallback(float *in, float *out, size_t size) {
  float sig, sig_tmp, dry_rate, send_rate, wet1, wet2;

  for (size_t i = 0; i < size; i += 2) {
    sig = in[i];

    // dry/wet、sendの量を決める
    dry_rate = verb_mix.Process();
    send_rate = verb_send.Process();

    // sigはdryとして使うので、リバーブに送る分は別の変数sig_tmpに入れておく
    sig_tmp = sig * send_rate;

    // パラメータを設定
    verb.SetFeedback(verb_feedback.Process());
    verb.SetLpFreq(verb_lp_freq.Process());
    
    // リバーブをかける
    verb.Process(sig_tmp, sig_tmp, &wet1, &wet2);

    // dry/wetを合わせる
    out[i] = sig * dry_rate + wet1;
    out[i + 1] = sig * dry_rate + wet2;
  }
}

감상


데이지시드는 3천엔 정도면 살 수 있기 때문에 데이지 시리즈 중 가장 손쉬운 선택이지만, 상대적으로 문서의 어디를 봐야 할지 몰라 걸려 넘어지기 쉽다.나는 주의한 곳을 좀 기억하고 싶다.

좋은 웹페이지 즐겨찾기