Electro-smitDaisy seed로 라이브러리 클래스 개조
다행히도 데이지 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
해야 할 일은 freq
를 bpm
로 고쳐 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는 모두 초보자입니다. 이상한 글을 썼다면, 욕먹을 수 있다면 정말 감사합니다.
Reference
이 문제에 관하여(Electro-smitDaisy seed로 라이브러리 클래스 개조), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/yutannihilation/articles/ae14f0c2456736텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)