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

24
Raspberry PiPdでオリジナルのシンセを作る 美山千香士 ドイツ/ケルン音楽舞踏大学講師 ケルンメディア大学フェロー スイス/チューリッヒ芸術大学非常勤講師 チューリッヒICST研究員

description

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

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

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

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

美山千香士ドイツ/ケルン音楽舞踏大学講師

ケルンメディア大学フェロースイス/チューリッヒ芸術大学非常勤講師

チューリッヒICST研究員

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

Github

本日お見せするパッチ プログラムはGitHubに公開しています。

https://github.com/chikashimiyama/pdj2

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

Demo !

RaspberryPi+Pd+MIDIキーボード+赤外線センサー によるミニシンセ

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

Raspberry Piとは

• Raspberry Pi Foundationによる超小型コンピュータ

• Arm ベースのCPU (Linuxが動かせる)

• 512MB のRAM

• 1x Audio out

• HDMI/Compositeによる映像出力

• USB x2

• GPIOピン

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

Raspberry PiでPd-extendedを動かすには

• Satelite CCRMAをインストールする

• Satelite CCRMAはスタンフォード大学の開発しているRaspberry Pi用のLinuxディストリビューション

• Pd-extended、Arduino、Faust、ChucK、Jack等のクリエーティブ・コーディング用のソフトウェアが予めインストールされている

https://ccrma.stanford.edu/~eberdahl/satellite/

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

Xフォワーディング

• RaspberryPi本体にマウス、キーボード、ディスプレイを繋がなくとも、他のコンピュータからRaspberryPiをEthernet経由で操作し、Pdのプログラミングをする事が可能

Ethernet

Pdプログラミング音

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

MIDIも繋げるの?

• 多くのUSB-MIDI機器はRaspPiが自動的に認識する

USB

Pdパッチと組み合わせれば 自作のミニシンセが簡単に出来る!

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

音質をもっと良くしたい

• USBオーディオ・インターフェースを使う

Creative Media Sound Blaster Play

・但しオーディオインターフェースを使うと、サンプル・レートが決め打ち(44.1k)になる ・USBバスパワーには限界がある

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

MIDIだけでなくセンサーとも組み合わせて 音をコントロールしたい

• 方法1:Arduinoと組み合わせる

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

MIDIだけでなくセンサーとも組み合わせて 音をコントロールしたい

• 方法1:Arduinoと組み合わせる

• 問題点

• シリアル通信に時間がかかる

• システムが大きくなる

• 6コ以上センサーが繋げない、10ビット以上の解像度が得られない

• Arduinoに電力供給 しなければならない

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

MIDIだけでなくセンサーとも組み合わせて 音をコントロールしたい

• 方法2:Raspberry PiのGPIO (General Propose Input Output)を使う

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

GPIOで何ができるの?

• Arduinoで出来る事が大体できます

例えば….

LED点灯 サーボ制御 LCD表示

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

Gertboard

• RaspberryPiのGPIOをフルに利用してハードウェアを開発したい人のための拡張ボード

https://www.sparkfun.com/products/11773

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

GPIOで出来ない事

• RaspPiにADC (アナログ・デジタルコンバーター)はないため電圧を読み取る事ができない

外部ADCと接続する必要がある

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

手に入りやすいADC

MCP3208

300円(秋葉原・秋月電子通商)

• ADC0831

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

GPIOをプログラムするには

• GPIOに関する網羅的な情報

• http://elinux.org/RPi_Low-level_peripherals

• C、Python、Ruby、Perl、Javaなど様々な言語でGPIOを操作するプログラムを書くことが可能

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

SPIとは

• Serial Peripheral Interfaceの略

• IC間の通信によく使われる規格。I2Cに比べて高速

RaspPi ADC

CLK

MOSI DI

MISO DO

CS

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

SPIとは

• 複数のチップを繋ぐ事も可能なので、チャンネル数を好きなだけ増やすことも可能

RaspPi

ADC

ADC

SCL, DO, DIバスは共有可能

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

Wiring Pi

• ArduinoライクなRaspberryPi用Cライブラリ

作者のGordon Drogon氏

https://projects.drogon.net/raspberry-pi/wiringpi/

ライブラリの提供する機能 - UART - LCD - PWM - SPI - I2C

ダウンロードとインストール

バイナリは含まれないが、 コンパイルはスクリプトがあるので簡単にできる

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

外部ADCとSPI接続する例

ADCはTIのADC0831を使用

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

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ライクな プログラムが可能

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

#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にオブジェクトを登録する関数

オブジェクトの保持するデータ

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

エクスターナル・オブジェクトの プログラミング方法の詳細

• IOhannes Zmölgnigによるチュートリアル

• http://pdstatic.iem.at/externals-HOWTO/

• 美山千香士「Pure Dataチュートリアル&リファレンス」 第20章

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

まとめ• Pdは小型低価格コンピュータRaspberryPi上で動く

• Satellite CCRMAを使うと簡単にPdをRaspPiの上で動かせる

• MIDIキーボードやArduinoとRaspberryPiの組み合わせもOK

• RaspBerryPiにはGPIOがあり、電子工作との相性も良い

• 外部ADCとGPIOをSPIで通信させて、Arduinoナシで独自楽器を作ることも可能

• GPIOの操作にはWiringPiというライブラリがオススメ

• WiringPiを組み込んだCプログラムをPdのエクスターナルオブジェクトとして実装することも可能