2019年2月6日水曜日

MIDI-CV Converter MIDI_CV_CONVとNucleo_DCOで音階の周波数を測定

MIDI_CV_CONVにパソコン上のDominoから特定の音階をMIDIで送出し、MIDI_CV_CONVでCV値に変換後、Nucleo_DCOに入力してWaveSpectraで出力周波数を測定しました。

Nucleo_DCOは3OSCですが、OSC1のみSine波に設定して測定しました。OSC2、OSC3はLevel POTを最小にしてMIXされないようにしました。

Nucleo_DCOはADCを無効化できるようにしていますが、これは有効化して測定しました。(参考「DASS01のCV入力」)

ブロック図

Nucleo_DCOのRange


DominoからA2(NoteNuber:45)を出力し、Nucleo_DCOのRangeを切り替えてオクターブごとのA音をWaveSpectraで測定しました。

Nucleo_DCOでRangeの設定は以下の通りプログラミングしています。frequencyBaseは出力できる最低周波数です。

const double frequencyBase[FREQUENCY_RANGE_MAX] = {
//  A-1    A0    A1    A2     A3     A4     A5     A6      A7      A8
13.75, 27.5, 55.0, 110.0, 220.0, 440.0, 880.0, 1760.0, 3520.0, 7040.0
}

DominoでA2を出力

Nucleo_DCO Range:A-1

Nucleo_DCO Range:A0

Nucleo_DCO Range:A1

Nucleo_DCO Range:A2

Nucleo_DCO Range:A3

Nucleo_DCO Range:A4

Nucleo_DCO Range:A5

Nucleo_DCO Range:A6

Nucleo_DCO Range:A7

Nucleo_DCO Range:A8

Range 周波数(Hz) 測定値(Hz) 差(Hz) 誤差(%)
A-1 27.5 26.4 -1.1 -4.00%
A0 55 55.7 0.7 1.27%
A1 110 111.3 1.3 1.18%
A2 220 219.7 -0.3 -0.14%
A3 440 442.4 2.4 0.55%
A4 880 881.8 1.8 0.20%
A5 1760 1769.5 9.5 0.54%
A6 3520 3536.1 16.1 0.46%
A7 7040 7072.3 32.3 0.46%
A8 14080 14150.4 70.4 0.50%

測定値

誤差

MIDIノートナンバー


Nucleo_DCOのRangeをA3(220Hz~)に固定して、Dominoから送出するMIDIノートナンバーを1オクターブ分測定しました。

note # 周波数(Hz) 測定値(Hz) 差(Hz) 誤差(%)
A2 45 440 442.4 2.4 0.55%
A#2 46 466.1637615 468.8 2.636238482 0.57%
B2 47 493.8833013 495.1 1.216698744 0.25%
C3 48 523.2511306 524.4 1.148869399 0.22%
C#3 49 554.365262 556.6 2.234738046 0.40%
D3 50 587.3295358 591.8 4.470464165 0.76%
D#3 51 622.2539674 624 1.746032556 0.28%
E3 52 659.2551138 662.1 2.844886174 0.43%
F3 53 698.4564629 700.2 1.743537134 0.25%
F#3 54 739.9888454 744.1 4.111154577 0.56%
G3 55 783.990872 788.1 4.109128037 0.52%
G#3 56 830.6093952 832 1.39060484 0.17%
A3 57 880 884.8 4.8 0.55%

測定値

誤差

メモ:


純粋に楽器として見るとチューニングが怪しい感じです。詳しくはわかりませんが、A音が440Hzか442Hzかで問題になる業界もあるようです。

MIDI_CV_CONVで出力電圧の調整に使っているトリムのR5を多回転タイプのものにすればMIDI_CV_CONVの出力電圧の精度は上げられそうですが。

今回のテストでは、MIDIノートナンバーをMIDI_CV_CONVの12bitDACでCV(アナログ信号)に変換して、Nucleo_DCOでは12bitADCでCVをプログラムで扱えるように再びデジタル化しています。

DAC/ADCの精度や信号路のノイズなどを考えると、全体として調律の精度を上げるのは難しそうです。

きっちり精度を出すなら、MIDI信号をデジタル信号のままNucleo_DCOに渡せば良くなると思います。

Nucleo_DCOで直接MIDIのRXを処理するとか、MIDI→SPIのDigital to Digital Converterとか。

0 件のコメント:

コメントを投稿