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