狠狠撸

狠狠撸Share a Scribd company logo
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のプログラミングをする事が可能

Pdプログラミング

音
Ethernet
MIDIも繋げるの?
?

多くのUSB-MIDI機器はRaspPiが自動的に認識する
Pdパッチと組み合わせれば
自作のミニシンセが簡単に出来る!
USB
音質をもっと良くしたい
?

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

?

ADC0831

MCP3208
300円(秋葉原?秋月電子通商)
GPIOをプログラムするには
?

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

?

http://elinux.org/RPi_Low-level_peripherals

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

Serial Peripheral Interfaceの略

?

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

MOSI

DI

MISO

DO

ADC
SPIとは
?

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

RaspPi
ADC
SCL, DO, DIバスは共有可能
Wiring Pi
?

ArduinoライクなRaspberryPi用Cライブラリ
ライブラリの提供する機能
- UART
- LCD
- PWM
- SPI
- I2C
作者のGordon Drogon氏

ダウンロードとインストール
https://projects.drogon.net/raspberry-pi/wiringpi/
バイナリは含まれないが、
コンパイルはスクリプトがあるので簡単にできる
外部ADCとSPI接続する例

ADCはTIのADC0831を使用
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ライクな
プログラムが可能
#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にオブジェクトを登録する関数
エクスターナル?オブジェクトの
プログラミング方法の詳細
?

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

More Related Content

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