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

11,987 views

Published on

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

Published in: Education
1 Comment
21 Likes
Statistics
Notes
No Downloads
Views
Total views
11,987
On SlideShare
0
From Embeds
0
Number of Embeds
851
Actions
Shares
0
Downloads
39
Comments
1
Likes
21
Embeds 0
No embeds

No notes for slide

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のエクスターナルオブジェクトとして実装 することも可能

×