Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Raspberry PiとPdでオリジナルのシンセを作る

Raspberry PiとPdを組み合わせて、小さな自作楽器を作る方法を説明します。

  • Be the first to comment

Raspberry PiとPdでオリジナルのシンセを作る

  1. 1. Raspberry PiとPdでオリジナルのシンセを作る 美山千香士 ドイツ/ケルン音楽舞踏大学講師 ケルンメディア大学フェロー スイス/チューリッヒ芸術大学非常勤講師 チューリッヒICST研究員
  2. 2. Github 本日お見せするパッチ プログラムはGitHubに公開しています。 https://github.com/chikashimiyama/pdj2
  3. 3. Demo ! RaspberryPi+Pd+MIDIキーボード+赤外線センサー によるミニシンセ
  4. 4. Raspberry Piとは • Raspberry Pi Foundationによる超小型コンピュータ • Arm ベースのCPU (Linuxが動かせる) • 512MB のRAM • 1x Audio out • HDMI/Compositeによる映像出力 • USB x2 • GPIOピン
  5. 5. Raspberry PiでPd-extendedを動かすには • Satelite CCRMAをインストールする • Satelite CCRMAはスタンフォード大学の開発してい るRaspberry Pi用のLinuxディストリビューション • Pd-extended、Arduino、Faust、ChucK、Jack等のク リエーティブ・コーディング用のソフトウェアが予 めインストールされている https://ccrma.stanford.edu/~eberdahl/satellite/
  6. 6. Xフォワーディング • RaspberryPi本体にマウス、キーボード、ディスプレイを繋 がなくとも、他のコンピュータからRaspberryPiをEthernet 経由で操作し、Pdのプログラミングをする事が可能 Pdプログラミング 音 Ethernet
  7. 7. MIDIも繋げるの? • 多くのUSB-MIDI機器はRaspPiが自動的に認識する Pdパッチと組み合わせれば 自作のミニシンセが簡単に出来る! USB
  8. 8. 音質をもっと良くしたい • USBオーディオ・インターフェースを使う Creative Media Sound Blaster Play ・但しオーディオインターフェースを使うと、サンプル・レートが決め打ち(44.1k)になる ・USBバスパワーには限界がある
  9. 9. MIDIだけでなくセンサーとも組み合わせて 音をコントロールしたい • 方法1:Arduinoと組み合わせる
  10. 10. MIDIだけでなくセンサーとも組み合わせて 音をコントロールしたい • 方法1:Arduinoと組み合わせる • 問題点 • シリアル通信に時間がかかる • システムが大きくなる • 6コ以上センサーが繋げない、10ビット以上の解像度が 得られない • Arduinoに電力供給 しなければならない
  11. 11. MIDIだけでなくセンサーとも組み合わせて 音をコントロールしたい • 方法2:Raspberry PiのGPIO (General Propose Input Output)を使う
  12. 12. GPIOで何ができるの? • Arduinoで出来る事が大体できます 例えば…. LED点灯 サーボ制御 LCD表示
  13. 13. Gertboard • RaspberryPiのGPIOをフルに利用してハードウェアを開 発したい人のための拡張ボード https://www.sparkfun.com/products/11773
  14. 14. GPIOで出来ない事 • RaspPiにADC (アナログ・デジタルコンバーター)はない ため電圧を読み取る事ができない 外部ADCと接続する必要がある
  15. 15. 手に入りやすいADC • ADC0831 MCP3208 300円(秋葉原・秋月電子通商)
  16. 16. GPIOをプログラムするには • GPIOに関する網羅的な情報 • • http://elinux.org/RPi_Low-level_peripherals C、Python、Ruby、Perl、Javaなど様々な言語でGPIO を操作するプログラムを書くことが可能
  17. 17. SPIとは • Serial Peripheral Interfaceの略 • IC間の通信によく使われる規格。I2Cに比べて高速 CS CLK RaspPi MOSI DI MISO DO ADC
  18. 18. SPIとは • 複数のチップを繋ぐ事も可能なので、チャンネル数を 好きなだけ増やすことも可能 ADC RaspPi ADC SCL, DO, DIバスは共有可能
  19. 19. Wiring Pi • ArduinoライクなRaspberryPi用Cライブラリ ライブラリの提供する機能 - UART - LCD - PWM - SPI - I2C 作者のGordon Drogon氏 ダウンロードとインストール https://projects.drogon.net/raspberry-pi/wiringpi/ バイナリは含まれないが、 コンパイルはスクリプトがあるので簡単にできる
  20. 20. 外部ADCとSPI接続する例 ADCはTIのADC0831を使用
  21. 21. ADCの値をWiringPiを利用して取得する #include #include #include #include ! <wiringPi.h> <wiringPiSPI.h> <stdio.h> <unistd.h> adc0831.c int main(void){ int spiCh = 1; unsigned char data[2]; int spi = wiringPiSPISetup(spiCh, 500000); ! ! ! } wiringPiSetup(); pinMode(12, OUTPUT); digitalWrite(12, HIGH); for(;;){ int res; unsigned char value; digitalWrite(12, LOW); res = wiringPiSPIDataRW(spiCh, data, 2); digitalWrite(12, HIGH); value = (data[0] << 2) + (data[1] >> 6); printf("data:%dn", value); usleep(10000); } return 0; Arduinoライクな プログラムが可能
  22. 22. #include "m_pd.h" #include "wiringPi.h" #include "wiringPiSPI.h" #define CS 12 ! static ! t_class *getspi_class; typedef struct _getspi { t_object x_obj; t_outlet *x_outlet; unsigned char data[2]; } t_getspi; オブジェクトの保持するデータ ! ! void getspi_bang(t_getspi *x){ int res; unsigned char value; digitalWrite(CS, LOW); res = wiringPiSPIDataRW(1, &x->data[0], 2); digitalWrite(CS, HIGH); value = (x->data[0] << 2) + (x->data[1] >> 6); outlet_float(x->x_outlet, (float)value); } bangが送られてきた時に 実行される関数 ! void *getspi_new(void){ int spi = wiringPiSPISetup(1, 500000); wiringPiSetup(); pinMode(CS, OUTPUT); digitalWrite(CS, HIGH); if(spi == -1){ post("cannot initialize SPIn"); } } オブジェクトが作られた時に 実行される関数 t_getspi *x = (t_getspi *)pd_new(getspi_class); x->x_outlet = outlet_new(&x->x_obj, gensym("float")); return (void *)x; ! void getspi_setup(void){ getspi_class = class_new(gensym("getspi"), (t_newmethod)getspi_new, 0, sizeof(t_getspi), CLASS_DEFAULT, 0); class_addbang(getspi_class, getspi_bang); } Pdにオブジェクトを登録する関数
  23. 23. エクスターナル・オブジェクトの プログラミング方法の詳細 • IOhannes Zmölgnigによるチュートリアル • • http://pdstatic.iem.at/externals-HOWTO/ 美山千香士「Pure Dataチュートリアル&リファレンス」  第20章
  24. 24. まとめ • Pdは小型低価格コンピュータRaspberryPi上で動く • Satellite CCRMAを使うと簡単にPdをRaspPiの上で動かせる • MIDIキーボードやArduinoとRaspberryPiの組み合わせもOK • RaspBerryPiにはGPIOがあり、電子工作との相性も良い • 外部ADCとGPIOをSPIで通信させて、Arduinoナシで独自楽器を作ることも可能 • GPIOの操作にはWiringPiというライブラリがオススメ • WiringPiを組み込んだCプログラムをPdのエクスターナルオブジェクトとして実装 することも可能

×