Teensy Audio Board でサンプラー自作
Hacksterへ色々と投稿してポイントがたまったので sparkfunのギフト券$20に交換しました。
ギフト券でTeensy上に実装して使えるAudio Boardを購入しました♪
価格は$14.95+送料$3.45(一番安いコース)の合計$18.40でした。4/21に発注して5/23にコロラド州から届きました。
目次
Teensy Audio Boardについて
チュートリアル動画
https://www.pjrc.com/teensy/td_libs_Audio.html
このAudio Boardでいろいろなことができます♪
回路図
https://www.pjrc.com/store/teensy3_audio.html
Teensy設定
TeensyをArduino IDEで使用するための方法は以下を参照ください。
サンプラー自作
ここではTeensy3.2とAudio Boardを用いてサンプラーを作成しました。
構成
Audio BoardをTeensy3.2の上に実装。
部品
- Teensy 3.2
- Teensy Audio Board
- 音量、フィルタ調整用可変抵抗
- サンプル再生ボタン
- 今回は使用していませんがAudio Boardにコンデンサマイクも実装しています。音声を入力することもできます。
音声サンプル
このAudio Boardは音源をSDカードと内蔵メモリに記憶することができます。
ここでは6つの短い音源をメモリから、2つのwavファイルをSDカードから再生させます。
SDカード
マイクロSDカードへ保存するwavファイルの形式は以下のようにします。
16 bits、44.1 kHz
保存後SDカードをAudio Boardに挿すだけです。
内蔵メモリ
メモリへ音源を記録させる場合はwavファイルをArduino用にバイナリ形式に変換させる必要があります。
以下でwav2sketchというソフトをダウンロードします。
Windows用
Mac用
ダウンロードしたwav2sketchのあるフォルダに変換したいwavファイルを置きます。形式は16 bits、44.1 kHzのモノラルである必要があります。
ターミナルで以下を実行します。
1 2 |
> cd wav2sketchのあるフォルダ > ./wav2sketch |
フォルダに音源の.hファイルと.cppファイルが生成されます。
Arduinoプログラム
生成したメモリ内蔵用の音源の.hファイルと.cppファイルをArduinoプログラムと同じフォルダに入れます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
#include <Audio.h> #include <Wire.h> #include <SPI.h> #include <SD.h> #include <SerialFlash.h> #include <Bounce.h> //Audio System Design Tool //https://www.pjrc.com/teensy/gui/index.html // GUItool: begin automatically generated code AudioPlaySdWav playSdWav2; //xy=205,343 AudioPlaySdWav playSdWav1; //xy=208,295 AudioPlayMemory playMem3; //xy=211,519 AudioPlayMemory playMem1; //xy=212,418 AudioPlayMemory playMem2; //xy=213,470 AudioPlayMemory playMem4; //xy=215,567 AudioPlayMemory playMem5; //xy=215,618 AudioPlayMemory playMem6; //xy=220,667 AudioMixer4 mixer1; //xy=374,329 AudioMixer4 mixer2; //xy=432,475 AudioMixer4 mixer3; //xy=530,567 AudioFilterStateVariable filter1; //xy=662,573 AudioMixer4 mixer_Mid; //xy=808,593 AudioMixer4 mixer_Low; //xy=809,521 AudioMixer4 mixer_High; //xy=811,672 AudioMixer4 mixer8; //xy=955,584 AudioOutputI2S i2s1; //xy=1088,583 AudioConnection patchCord1(playSdWav2, 0, mixer1, 2); AudioConnection patchCord2(playSdWav2, 1, mixer1, 3); AudioConnection patchCord3(playSdWav1, 0, mixer1, 0); AudioConnection patchCord4(playSdWav1, 1, mixer1, 1); AudioConnection patchCord5(playMem3, 0, mixer2, 3); AudioConnection patchCord6(playMem1, 0, mixer2, 1); AudioConnection patchCord7(playMem2, 0, mixer2, 2); AudioConnection patchCord8(playMem4, 0, mixer3, 1); AudioConnection patchCord9(playMem5, 0, mixer3, 2); AudioConnection patchCord10(playMem6, 0, mixer3, 3); AudioConnection patchCord11(mixer1, 0, mixer2, 0); AudioConnection patchCord12(mixer2, 0, mixer3, 0); AudioConnection patchCord13(mixer3, 0, filter1, 0); AudioConnection patchCord14(filter1, 0, mixer_Low, 0); AudioConnection patchCord15(filter1, 1, mixer_Mid, 0); AudioConnection patchCord16(filter1, 2, mixer_High, 0); AudioConnection patchCord17(mixer_Mid, 0, mixer8, 1); AudioConnection patchCord18(mixer_Low, 0, mixer8, 0); AudioConnection patchCord19(mixer_High, 0, mixer8, 2); AudioConnection patchCord20(mixer8, 0, i2s1, 0); AudioConnection patchCord21(mixer8, 0, i2s1, 1); AudioControlSGTL5000 sgtl5000_1; //xy=542,377 // GUItool: end automatically generated code // WAV files converted to code by wav2sketch // メモリ内蔵音源 #include "AudioSampleSlip1.h" #include "AudioSampleSlip2.h" #include "AudioSampleSlip3.h" #include "AudioSampleSlip4.h" #include "AudioSampleSlip5.h" #include "AudioSampleSlip6.h" // Create an object to control the audio shield. // AudioControlSGTL5000 audioShield; // Bounce objects to read six pushbuttons (pins 0-5) // Bounce button0 = Bounce(0, 5); Bounce button1 = Bounce(1, 5); // 5 ms debounce time Bounce button2 = Bounce(2, 5); Bounce button3 = Bounce(3, 5); Bounce button4 = Bounce(4, 5); Bounce button5 = Bounce(5, 5); Bounce button6 = Bounce(8, 5); Bounce button7 = Bounce(21, 5); // Use these with the Teensy Audio Shield #define SDCARD_CS_PIN 10 #define SDCARD_MOSI_PIN 7 #define SDCARD_SCK_PIN 14 int state1 = 0; int state2 = 0; void setup() { Serial.begin(9600); // Configure the pushbutton pins for pullups. // Each button should connect from the pin to GND. pinMode(0, INPUT_PULLUP); pinMode(1, INPUT_PULLUP); pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); pinMode(4, INPUT_PULLUP); pinMode(5, INPUT_PULLUP); pinMode(8, INPUT_PULLUP); pinMode(21, INPUT_PULLUP); // Audio connections require memory to work. For more // detailed information, see the MemoryAndCpuUsage example AudioMemory(10); // turn on the output audioShield.enable(); //wavファイル再生用mixer音量調整 mixer1.gain(0, 0.4); mixer1.gain(1, 0.4); mixer1.gain(2, 0.4); mixer1.gain(3, 0.4); SPI.setMOSI(SDCARD_MOSI_PIN); SPI.setSCK(SDCARD_SCK_PIN); if (!(SD.begin(SDCARD_CS_PIN))) { while (1) { Serial.println("Unable to access the SD card"); delay(500); } } } void loop() { //音量調整 int knob = analogRead(A1); float vol = (float)knob / 1030.0; audioShield.volume(vol); //フィルタ音量調整 int knobL = analogRead(A6); float volL = (float)knobL / 1030.0; mixer_Low.gain(0, volL); mixer_Low.gain(1, volL); int knobM = analogRead(A2); float volM = (float)knobM / 1030.0; mixer_Mid.gain(0, volM); mixer_Mid.gain(1, volM); int knobH = analogRead(A3); float volH = (float)knobH / 1030.0; mixer_High.gain(0, volH); mixer_High.gain(1, volH); // Update all the button objects button0.update(); button1.update(); button2.update(); button3.update(); button4.update(); button5.update(); button6.update(); button7.update(); //メモリ内蔵音源再生 if (button0.fallingEdge()) playMem1.play(AudioSampleSlip1); if (button1.fallingEdge()) playMem1.play(AudioSampleSlip2); if (button2.fallingEdge()) playMem1.play(AudioSampleSlip3); if (button3.fallingEdge()) playMem1.play(AudioSampleSlip4); if (button4.fallingEdge()) playMem1.play(AudioSampleSlip5); if (button5.fallingEdge()) playMem1.play(AudioSampleSlip6); //SDカード音源 再生・停止 if (button6.fallingEdge() && state1 == 0){ playSdWav1.play("slip9.wav"); state1 = 1; }else if (button6.fallingEdge() && state1 == 1){ playSdWav1.stop(); state1 = 0; } if (button7.fallingEdge() && state2 == 0){ playSdWav2.play("slip10.wav"); state2 = 1; }else if (button7.fallingEdge() && state2 == 1){ playSdWav2.stop(); state2 = 0; } |
// GUItool: begin automatically generated code 〜
// GUItool: end automatically generated code (11〜51行)の間で音源やミキサやフィルタの構成を指定しているのですが、Audio System Design Tool というNode-Redに似たグラフィカルなソフトで音源やミキサを配置配線して”Export”することでコードが生成されます。これをコピペするだけです(^o^)
playSdWavはwav音源、playMemがメモリ内蔵音源です。それぞれ音源をミキサでつないでfilterを通してLow、Mid、Highの3つの帯域をそれぞれミキサに通してi2s1でヘッドフォン出力しています。
この便利ソフトでサンプラーはもちろんシンセやDJミキサも作れそうです♪
動作
応答も早いしバッチリ!(*´ω`*)
もう一個ボード買ってDJしたいな。。。。