Electro-smitDaisy seed로 라이브러리 클래스 개조

11017 단어 전자 작업daisytech
데이지는 기본적으로 제공하는 반이 알차서 놀기만 해도 즐겁지만 아래 기사에 적힌 것처럼 만질 때'밖에서 파라미터를 다시 접촉했으면 좋겠다'고 느낀다.
https://zenn.dev/yutannihilation/articles/366f6cc52cf9dc
다행히도 데이지 SP의 코드는 MIT 허가증에 공개되어 있기 때문에 복사하여 마음대로 조작할 수 있습니다. (개조된 코드를 공개할 때attribution을 첨부하십시오.)

프로젝트를 하다


우선 새로운 프로젝트를 하다.최근DaisyExamples 웨어하우스에서helper.py라는스크립트를준비했으니이걸사용하자.이 스크립트는 데이지 익스프레스 창고에서 새로운 프로젝트를 만들기 위해 다른 곳에서 제작하려면 얼마나 많은 작업이 필요한지 뒤에 서술한다.
python3 ./helper.py create path/to/<プロジェクト名> --board seed
스크립트를 실행한 후 다음 구조로 빈 프로젝트를 완성했습니다.
❯ tree -a .
.
├── .vscode
│   ├── .cortex-debug.peripherals.state.json
│   ├── .cortex-debug.registers.state.json
│   ├── STM32H750x.svd
│   ├── c_cpp_properties.json
│   ├── launch.json
│   └── tasks.json
├── Makefile
├── README.md
├── <プロジェクト名>.cpp
├── <プロジェクト名>.sln
└── vs
    ├── <プロジェクト名>-Debug.vgdbsettings
    ├── <プロジェクト名>-Release.vgdbsettings
    ├── <プロジェクト名>.vcxproj
    ├── <プロジェクト名>.vcxproj.filters
    ├── stm32.props
    └── stm32.xml
바로make구축해보기오류가 발생했습니다.
❯ make
Makefile:13: ../../libdaisy/core/Makefile: No such file or directory
make: *** No rule to make target '../../libdaisy/core/Makefile'.  Stop.
이것은 방금 쓴 바와 같이 기본적으로DaisyExamples에서 실행하는 것을 전제로 하기 때문이다.구체적으로 말하면 이 부분을 고쳐야 한다Makefile.
# Library Locations
LIBDAISY_DIR = ../../libdaisy
DAISYSP_DIR = ../../DaisySP
기존 Daisy Examples 또는 git submodule 에 libDaisy 및 Daisy SP 를 추가하여 경로를 지정합니다.후자라면 다음과 같다lib/libDaisy,lib/DaisySP지정Makefile.
mkdir lib
git submodule add [email protected]:electro-smith/libDaisy.git lib/libDaisy
git submodule add [email protected]:electro-smith/DaisySP.git lib/DaisySP

# ライブラリをビルド
(cd lib/libDaisy/ && make)
(cd lib/DaisySP/ && make)

라이브러리에서 필요한 파일을 복사하여 편집하기


예를 들어 우리는 시계로 사용할 수 있는 실용 프로그램Metro을 개조하는 상황을 고려한다.Metro 주파수로 속도를 지정하고 BPM으로 지정하십시오.
원 코드는 각각 아래에 있다.
  • metro.cpp : https://github.com/electro-smith/DaisySP/blob/master/Source/Utility/metro.cpp
  • metro.h : https://github.com/electro-smith/DaisySP/blob/master/Source/Utility/metro.h
  • 이거 복사해서 편집해.
    cp lib/DaisySP/Source/Utility/metro.cpp metro.cpp
    cp lib/DaisySP/Source/Utility/metro.h metro.h
    
    해야 할 일은 freqbpm로 고쳐 60으로 나누어 metro.cpp에만 붙이는 것이다.변수가 1개dsp.h로 정의되어 있기 때문에 그 중 하나만 복제할 수 있지만 dsp.h와 함께 복제할 수도 있다.
    --- lib/DaisySP/Source/Utility/metro.cpp        2021-05-05 20:17:37.750956917 +0900
    +++ metro.cpp   2021-05-05 20:49:21.337804387 +0900
    @@ -1,15 +1,17 @@
     #include <math.h>
     #include "metro.h"
    -#include "dsp.h"
    +// dsp.h から必要な定義だけ持ってくる
    +#define PI_F 3.1415927410125732421875f
    +#define TWOPI_F (2.0f * PI_F)
    
    -using namespace daisysp;
    +using namespace my_metro;
    
    -void Metro::Init(float freq, float sample_rate)
    +void Metro::Init(float bpm, float sample_rate)
     {
    -    freq_        = freq;
    +    bpm_         = bpm;
         phs_         = 0.0f;
         sample_rate_ = sample_rate;
    -    phs_inc_     = (TWOPI_F * freq_) / sample_rate_;
    +    phs_inc_     = (TWOPI_F * bpm_ / 60.0f) / sample_rate_;
     }
    
     uint8_t Metro::Process()
    @@ -23,8 +25,8 @@ uint8_t Metro::Process()
         return 0;
     }
    
    -void Metro::SetFreq(float freq)
    +void Metro::SetBpm(float bpm)
     {
    -    freq_    = freq;
    -    phs_inc_ = (TWOPI_F * freq_) / sample_rate_;
    +    bpm_     = bpm;
    +    phs_inc_ = (TWOPI_F * bpm_ / 60.0f) / sample_rate_;
     }
    

    Makefile에 추가


    이것은 세부 사항입니다. .cpp 파일을 이 줄에 추가해야 합니다. Makefile
    # Sources
    CPP_SOURCES = <プロジェクト名>.cpp metro.cpp
    
    그렇다면 아래의 자신의 작품Metro을 호출할 수 있을 것이다.
    #include "daisy_seed.h"
    #include "daisysp.h"
    #include "metro.h"
    
    // ...
    
    my_metro::Metro clock;
    
    void AudioCallback(float **in, float **out, size_t size)
    {
      // (余談1)
      for (size_t i = 0; i < size; i++) {
        if (clock.Process()) {
          // 何らかの処理
        }
    
        // ...
      }
    }
    
    int main(void)
    {
      // ...
    
      // BPM120
      clock.Init(120.0f, hw.AudioSampleRate());
      
      while (1)
      {
        // (余談2)
      }
    }
    
    구축 후 Daisy에 전송됩니다.
    make && program-dfu
    
    참고로 Metro.Process()AudioCallback()의 for회로에서 이동해야 한다.나는 위의 코드로 (잡담1)와 (잡담2)의 위치에서 LED를 깜박이고 싶었지만 정상적으로 작동하지 못했다.내부 처리는 샘플 속도만 호출하는 수량이 for 순환 중입니다. 다른 곳에서 사용하면 자신의 초수DaisySeed.system.GetNow() 같은 것이 필요할 것 같습니다.

    최후


    C++, 삽입식, DSP는 모두 초보자입니다. 이상한 글을 썼다면, 욕먹을 수 있다면 정말 감사합니다.

    좋은 웹페이지 즐겨찾기