Sonic Piメモ

SonicPiメモ
(作成中) 2017.1.12現在 Hiroshi Tachibana CC BY-NC-SA
容易なプログラムによってリアルタイムに音を、いろいろな間隔で繰り返し出したり止めたりすること
ができ、音程や音色を自由に指定でき、多くの効果を追加できる。
Raspberry Pi, Mac, Winで動作. オープンソースでありライセンスは MIT
使用バージョン Sonic-Pi-for-Mac-v2.11.1
Ruby言語(まつもとゆきひろ氏)(独自GPL互換)とSuperCollider(GPL)で作られている。
英University of Cambridge, Computer LaboratoryのSam Aaron氏作
概要 http://sonic-pi.net/
ステージ上でプログラミングしながら演奏するライブコーディング向け言語。プログラミング入門用にも最適。
多数の音源とエフェクトを持っており、細かなパラメータ調整もできる高機能シンセサイザーでもある。
プログラムを入力してRunボタンにより実行すると音が出ます。
プログラムを修正して(しなくても)Runボタンを押すと、重ねて実行されます。
プログラムは、画面下のBuffer 0 〜 9 に入力でき、Bufferを切り替えて重ねてRunすることもできます。
Stopボタンでは、全てが停止します。
ファイルの保存は、Buffer毎に別々で、ファイル名も記憶されておらず上書き保存が容易にできず便利ではありません。
ファイルの拡張子は、Rubyと同様の .rbですが、中身はテキストファイルです。
全Bufferの現在の状態は、自動保存され、次回起動時に残っています。~/.sonic-pi/store/defaultの中に保存されています。
Recボタンを押した瞬間から次に押すまでを、WAVファイルに録音することができます。
画面表示をダークモードにできる。さらに、[パフォーマンス]から半透明にもできる。
から、チュートリアル、例、各機能について最も詳しく知ることができる。
Boot Errorで起動できなくなった場合は、ターミナルから ps aux|grep Sonic 等で起動していないのに動いている関連Jobを調べ、kill
すると良い。(macOS) またオーディオ入力に、出力と異なるサンプリングレートのUSBカメラ(マイク付)等が設定されていると、Boot
Errorとなることがあり、システム環境設定から入力を内臓マイクに変更すれば解決します。(macOS)(SuperColliderによる制限)
プログラム 注意点 文法は、Rubyと同様.�変数の型はない.�(Rubyの入門サイトが参考になる)
行末に ; 等は入れない。コロンやカンマの位置、スペースの有る無し、カッコを間違えるエラーに要注意.
改行によって、次の命令となるので、サンプルプログラムをPDF等からコピペした時に行が繋がっていると、エラーで実行で
きなくなります。(sleep が行末にくっついてしまう等) 長い行を改行して表示することは可(改行位置は選ぶ)
コメント 行中で、# 以下はコメントとなる。
複数行コメントは、 comment do 〜 end で可. 文章用ではなく、コードのみをコメント可能. // や /* */ は不可 uncomment do 〜 end とunを付け/外しすることで、コメントを解除/設定できる.
a=1 としてsleep a/2 とすると、a/2は0となってしまう. a=1.0として割り算を行う少なくとも片方を実数とする必要がある.
i=i+1 と i+=1 は可、i=inc i とも書ける. i++ は不可。
1/3.0は、0.3333333333333333
nを12で割った剰余は、n % 12
条件文 i=0 if i>10
#1文の場合 ifを後ろに書く
if i>=12
elsif i>=24
# スペースを入れたelse if は不可. elseの末尾のeを取ってつなげる
else
end
puts 1==2 ? "A" : "B"
# 1が2でないので"B"を返す.
条件 ? がtrueのとき : falseのとき
プリント文 puts (または print)によって、変数値や文字等をログに出力できる。
カンマ , で並べ複数出力可.
変数iの値の出力例
puts "音程#{i}です."
半音((黒鍵)) ド## レ## ファ## ソ## ラ## ::CCss44 ::DDss44 ::FFss44 ::GGss44 ::AAss44 または 途中停止 stop
レ♭ ミ♭ ソ♭ ラ♭ シ♭ ::DDff44 ::EEff44 ::GGff44 ::AAff44 ::BBff44 6611 6633 6666 6688 7700 ( thread内のstopでは、そのthreadのみが停止する. )
音を出す 音程は、MIDI規格のノートナンバーの数値で中央の"ド"は60 または :C4 と表記する。
(C4の前のコロンは必須)
C4の♯♭ は :Cf4(:Cb4),:Cs4 と表記する。大小文字はどちらも可。:Cのみでも使用で
き、:C4と見なされる.
play 60 これだけでRunして音を聞くことができる.
Playは不可.
ド レ ミ ファ ソ ラ シ ド ::CC44 ::DD44 ::EE44 ::FF44 ::GG44 ::AA44 ::BB44 ::CC55 play :C4 同上(コロンが必須)
6600 6622 6644 6655 6677 6699 7711 7722 休符は、 :R または :r (sleepを休符として使うことも可)
((4488 5500 5522 5533 5555 5577 5599 6600)) play 60+12 は、play :C5と同じ。 play :C4+12 も可
((7722 7744 7766 7777 7799 8811 8833 8844)) 4
1
3
2
1.5
1
0.75
0.5
0.25
0.125 拍 範囲は、低音側 0(8.18 Hz)または:Cf0(15.43Hz)〜高音側サンプリング周波数44.1kHzの半分となる21.096Hzの:E10(136)まで.
複数回runを繰り返すと、実行したタイミングで音を重ねることができる。
音の長さは、playの後の sleep 拍 で与える。 一拍は、sleep 1
特別に秒で与えたい場合には rt(1)
速度の指定は、BPM(beat per minute)値で与える.一拍の長さはこの値によって変わる.� 5秒を使う音を出すには、
use_bpm 60 (デフォルト)
注:use_bpm=60とすると、use_bpmという変数に値を代入することになり、エラーメッセージも出ない
play 60
中央のド
sleep 5
# 5拍
通常の音源によってはdecayが速く、音が消えてしまうので、
play 60, decay:5
sleep 5
などとするとわかりやすくなる。逆に速いフレーズではdecayやreleaseの値を小さくする等の工夫が必要。
音符ごとの強さは、amp: (play等の後ろに , で続ける。amp後ろにはコロンが必須で、その後に強さを表す数字を記す。デフォルトは、1)
amp:100, amp:1000等、極端に音量を大きくしても、自動的にコンプレッサーがかかる。sample音でも同様。
アタックAttack、減衰Decay、減衰後の保持Sustain、余韻Releaseは、時間と強さのADSRの各パラメータで設定できる。
多くのsynth音源では、デフォルト値がattack:0, release:1となっているので、この2つを変更すると音色が変わるこ
とが多い。音を伸ばすには、sustain:4等とすることが多い。
左右のパンは pan: -1(左端) pan:0(中央)、pan:1(右端)
play 60, amp:2, attack: 0.1, attack_level: 1, decay: 0.2, sustain_level: 0.4,
sustain: 1, release: 0.5, pan: -1 等 (このように途中改行が可能だが , は先頭にできない.)
メインボリューム((音量))を変える set_volume! 0から5
デフォルトは1、現在の音量は、current_volume
リスト 一次元配列 [:C4, 61, 62] 要素に数字と文字の混在が可.
a= [60, 61, :D4]
変数に代入できる.
play a
全部が同時に鳴る
play a.tick
TICK
先頭から鳴らし、対象要素を一つ進める。先頭の0に戻すには tick_reset
play a.tick(:名前)
名前付きtick。複数のtickがある場合、一度にtickの個数だけ要素が進んでしまうの
で、それを防ぐために名前を付けて独自のtickとできる.� 値の設定は tick_set 5
LOOK
play a.look
tick後に要素を進めずに、再度参照だけをしたい場合には、lookを用いる.�
要素の指定 [60, 61, 62][1]
は、61 を返す. 要素数を超えるとnilとなる.
a.rotate.first
aの先頭要素を最後に回転させて、先頭を取り出す、 a.rotate!ではa自体が変化する.
多次元配列((リスト)) a =[0,1,[[2,3],4],5] の場合、a[2][0][1]というように要素を参照すると値は3となる
長さを得るには、[60, 61, 62].length
(3が返る)
連結する [1,1].concat [2,2] は、[1,1,2,2] となる。
各要素を繰り返す stretch([1,2],3) は、(ring 1, 1, 1, 2, 2, 2) となる.
要素毎に連結する puts [1,1,1].zip([2,2]) は、 [[1, 2], [1, 2], [1, nil]]
連続して音符を鳴らす play_pattern_timed [93, 91, 88], 0.1 # 時間を [0.5,1,0.5]も可.
(配列のコピーは、b=aで可)
# [0.5,1]の場合、要素が順に繰り返される.
リング 一次元配列(ring 60, 61, :D4) 文字のringは要素ではない。 リストと比べ、先頭と末尾がつながっているのが特徴.
b=(ring 60, 61, :D4)
変数に代入できる.
(ramp 1,2,3)では、tickを続けるとずっと3が返される.
play b
全部が同時に鳴る
play b.tick
先頭から鳴らし、対象要素を一つ進める。最後まで行くと先頭に戻るので、数を気にしなくて良い
play b[1]
2番目の要素を鳴らす。(ring 60, 61, 62)[1]も同様 -1は末尾となる
tick を単独で実行すると、全てのringやリストの対象要素が同時に一つ進む。 参照だけを行うには .look を使う
[60,61,62].ring は、(ring 60,61,62)と同じ.
[60,61,62].ring.tick という表記も可
scale、chord で返される値も ring である。
a.reverse
逆順のringとする
a.shuffle
シャッフルする
a.mirror
順に進み、逆に戻る
その他 .take() .drop() など多数あり
チューニング、MMIIDDIIノート番号と周波数 use_tuning :equal
use_tuning :just
use_cent_tuning 1
puts midi_to_hz(69)
平均律((デフォルト))
純�正律
ノート60が60.01の音程となる
Aの周波数を表示 (:A4)も可
2
平均律 と 純�正律 の波形(Audacity で表示) play chord(:C4,:M)
puts hz_to_midi(441)
69.0393 周波数をMIDIノート番号に
ループ内だけを変更するには、with_tuning
転調 use_transpose 1
半音上げる
use_octave 1
1オクターブ上げる
ループ内だけを転調するには、with_transpose
現在の速度は、current_bpm これを相対的に変えるには
use_bpm current_bpm * 1.2
現在の速度を得て、それを1.2倍等にする。
use_bpm_mul 1.2
未確認
乱数 音程、強さ、他のパラメータをランダムにできる。 use_random_seed 0 乱数の系列:デフォルトでは0に設定されている
use_random_seed Time.new.usec
乱数の系列をCPUの時計のミリ秒を元に与える
rand(10)
0以上10未満の実数乱数
単独の rand は rand(1)と同じ.
rand_i(10)
0以上10未満の整数乱数
rrand(60, 72)
範囲を指定した実数乱数 ranged rand
rrand_i(60, 72) 範囲を指定した整数乱数
rand_back
乱数を系列の中で一つ前に戻す
if one_in(2)
1/2の確率で..
play 57 if one_in(3) 1/3の確率で鳴らす(if文を後ろに書き、1行とすることができる)
他にサイコロ的なdice(6) 等があり。
リストやリングからランダムに一つを選ぶ
choose([60, 64, 65, 67, 72]) または [60, 64, 65, 67, 72].choose
文字列をや要素をランダムに並べ替える "CDEFG".shuffle または shuffle("CDEFGAB") [:C,:D,:E].shuffle または shuffle([:C,:D,:E])
ループの方法
ループの基本構造は、
何かを do
end
無限ループ loop do
音
# loop{play 60;sleep 0.5} などでも可
end
回数を指定したループ # rubyの while文も動作可 12.times do
end
または
# iを0〜11まで. doを入れるとインデントがずれる. 注:命令一覧にfor文の記載はなし
# 配列a[i]を使いたい場合に、for i in 0..a.length-1 と書ける(a.count-1も可)
end
# 同 "..."を使うと、for i in 0...a.length と書ける(a.lengthは含まれない)
ステップを与えるには、 for i in (60..72).step(1/10.0) カッコで囲う
for i in 0..11
音
.. は <=
...は <
または
60.upto(72) do |i|
play i; sleep 0.5;
end
# 下げる場合は、 72.downto(60) do |i|
# ステップを与えるには、60.step(72,0.5) do |i|
# ()がなくても動作可
スレッド 音を重ねるには、threadを使いプログラムの同時((並列))実行を行う。
複数のスレッドはRun時に同時スタートする。
in_thread do
loop do
# スレッドの内側に無限ループを使うことが多いが、live_loop だけの方が多くの場合は適当か!
end
end
再度Runすると、Runしたタイミングで、元の音のタイミングとは関係なく、重ねて実行される。
名前付きスレッドを使うと、再度実行された場合に同じ名前のスレッドは(書き換えたとしても)実行されない。
in_thread(name: :名前) do (の前にスペースがあるとエラー. 2つのコロンにも注意. 間違って音を重ねてしまうことがなくなる
end
ライブループ 音を重ね置き換えたい場合には、スレッドを使わずに名前付きlive_loopを使う。
live_loop :名前 do
end
cueとsyncでタイミングを合わせる
Runするごとに同じ名前のlive_loopの音を置き換えることができる。
ループ内のplayをコメント化して再Runすればそのループの音を消すこともできる.
ループ内にsleepがなく、sampleだけだと、1回で停止する.
cueなしでsyncのみでも使用できる.
3
スレッド同士での特別な同期を行うには、ループの中にcueとsyncを置く。
live_loop :loop1 do
play :C6, attack: 0.05, release: 0
sleep 0.5
cue :cue1
# タイミングを送る側 (名前が:cue1の名前付きcue)
sleep 0.5
# 時間間隔は、ここで与える
end
loop do
# この外側にthreadのループを置いても問題ない。(変わらない)
sync :cue1
# タイミングを受ける側. 名前付きsync
#(または cueなしで、ループ名に対してsyncさせるなら sync :loop1 という使い方もある.)
sample :drum_heavy_kick
# サンプルの長さが0.27であり、0.5より短いので、syncでタイミングが合うため sleep はなくても構わない.
end
その他の例
in_thread(name: :th1) do
# 左右にランダムにpan
loop do
cue :cue_1
sleep 0.5
cue :cue_2
sleep 0.5
end
end
live_loop :live1 do
sync :cue_1
play :C4, pan: rrand_i(0,1)*2-1,pan_slide: 0.5
end
live_loop :live2 do
sync :cue_2
play :C3, pan: rrand_i(0,1)*2-1,pan_slide: 0.5
end
指定した時間後に実行を開始するループ at
at 2 do
# 開始から2拍待った後に実行する
end
at [1,3,1.1] do
# 開始から1拍待った後、1.1拍後、3拍後、ループを計3回実行する.
end
at [1, 2, 3],[{:amp=>0.5}, {:amp=> 2,:attack=>0.7}] do |p|
sample :drum_cymbal_open, p
# 1拍目は弱く、2拍目は立ち上がりをゆっくりで強く、3拍目は弱く
end
関数の定義 define :my_func do
end
関数の使用例 my_func
関数に引数(ひきすう)がある場合は、|| || で囲う.. define :my_signal do |n,t,d|
play n, decay: d, release:0
sleep t
end
引数のある関数の使用例
my_signal :C5, 0.5, 0.1
# 括弧を使った
my_signal( :C5, 0.5, 0.1 ) も可
コード音((和音))を出す
コード名の種類は、
+5を直接使うときは'+5'とする. M以降は、:M または 'M' とする.. +5
1
11
11+
13
5
6
6*9
7
7+5
M7
a
add11
add13
add2
add4
add9
augmented
dim
dim7
7+5-9
7-10
7-5
7-9
7sus2
7sus4
9
9+5
9sus4
M
play chord(:C4, :M)
play chord(:A3, :minor) diminished
diminished7
dom7
i
i7
m
m+5
m11
m11+
m13
m6
m6*9
m7
m7+5
m7+5-9
m7+9
m7-5
m7-9
m9
m9+5
madd11
madd13
madd2
madd4
madd9
maj11
maj9
major
major7
minor
minor7
sus2
sus4
コード名を指定してを鳴らす。メジャーコード(ドミソ) play (chord :C4, :M)も可
マイナーコード Am の例 ((ラドミ)) '+5' と ' で囲う必要
4
play chord(:C3, :M, num_octaves: 2)
2オクターブ分のコードを鳴らす(ドミソドミソ)
play (chord_invert(chord :C3,:M),2)
2回,転回したコードを鳴らす。外側の()は必須. (ドミソをソドミに)
play chord(:C4, :M)+[:C5]
ドミソドを鳴らす.
play_chord [60,64,67]
音を併記して同時に鳴らす. [の前にスペースが必須.� play [60,64,67] でも同じ.
アルペジオでコードを弾く
Em7
play_pattern chord(:E3, :m7)
アルペジオのバラバラに弾く時間間隔を与えるには、
play_pattern_timed chord(:E3, :m7), 0.25
# 0.25拍間隔で鳴らす
コードを転回して鳴らす chord_invert ((逆側は、-- で可能)) i=-1
3.times do
play_pattern_timed(chord_invert( chord :C4,:M ),i),0.2
sleep 0.5
i+=1
end
# G3 C4 E4
# C4 E4 G4
# E4 G4 C5
全コードの名称をchord_namesから得て、全コードを聞いてみるプログラム例.
chord_names.length.times do
play_pattern_timed chord(:C4, chord_names.tick),0.1
sleep 0.5
end
print chord_names.length
スケール((音階))の種類 :aeolian
:ahirbhairav
:augmented
:augmented2
:bartok
バルトーク
:bhairav
:chinese 中国
:chromatic
:diatonic
:diminished
:diminished2
:dorian
:egyptian
エジプト
:enigmatic
:gong
:harmonic_major
:harmonic_minor
:hex_aeolian
:hex_dorian
:hex_major6
:hex_major7
:hex_phrygian
:hex_sus
:hindu
ヒンズー
:hirajoshi
平調子
:hungarian_minor
:indian
:ionian
:iwato 岩戸調子
:jiao
:kumoi 雲井調子
:leading_whole
:locrian
:locrian_major
:lydian
:lydian_minor
play_pattern_timed(scale :C, :hirajoshi),0.2
:major
:major_pentatonic
:marva
:melodic_major
:melodic_minor
:melodic_minor_asc
:melodic_minor_desc
:messiaen1
メシアン
:messiaen2
:messiaen3
:messiaen4
:messiaen5
:messiaen6
:messiaen7
:minor
:minor_pentatonic
:mixolydian
:neapolitan_major
:neapolitan_minor
:octatonic
:pelog
:phrygian
:prometheus
:purvi
:ritusen 中国琴
:romanian_minor
:scriabin スクリャーピン
:shang
:spanish
:super_locrian
:todi
:whole
:whole_tone
:yu
:zhi
# 平調子を聞く.
loop do # ドレミファソラシドの2オクターブを繰り返す。
play (scale :C, :major , num_octaves: 2).tick
# (ring スケールの音符)と同じ機能となる
sleep 0.5
# .reverse.tick や .shuffle.tick も可
end
# .take(3) 先頭から3音取り出す
# (scale:C4,:major)[1..2] は (ring 62,64) 2つ目〜3つ目の要素. [1..-6]も同じ
全てのスケールの名称をscale_namesから得て聞いてみるプログラム.
i=0
scale_names.length.times do
puts i, scale_names[i], (scale :C4, scale_names[i]).length
j=0
(scale :C4, scale_names[i]).length.times do
play (scale :C4, scale_names[i])[j], release: 0.1
sleep 0.1
j=j+1
end
sleep 0.5
i=i+1
end
print scale_names.length
音源の指定 use_synth :beep (デフォルト音,:sineと同じ)
シンセ音源一覧(MIDIと同じように使える.�約39種.�内部にあるsynthdefファイル数はもっと多い)
:beep
:blade
:bnoise
:chipbass
:chiplead
:chipnoise
:cnoise
:dark_ambience
:dpulse
:dsaw
:dtri
:dull_bell
:fm
:gnoise
:growl
:hollow
:hoover
:mod_beep
:mod_dsaw
:mod_fm
:mod_pulse
:mod_saw
:mod_sine
:mod_tri
:noise
:piano
:pluck
:pnoise
全てのシンセの名称をsynth_namesから得て1音だけ聞いてみるプログラム例.
synth_names.length.times do
5
:pretty_bell
:prophet
:pulse
:saw
:sine
:square
:subpulse
:supersaw
:tb303
:tri
:zawa
print current_synth
use_synth synth_names.tick
play :C4
sleep 0.5
end
print synth_names.length
# 一音だけ臨時に使いたい場合は、 synth :fm, note: 60 を play 60の代わりにできる
エフェクトの使用
リバーブ
with_fx :reverb do
# room:1.0,dump:0,mix:0.5とすると強く響く (mix:1.0響きだけ)
音
end
エコーの例
with_fx :echo, phase: 0.5, decay: 4 do
# 0.5拍毎に音を重ね、4拍で消えるエコー
音
end
ローパスフィルタ((lpf)は、play 文等の後ろに ,cutoff: 音程の数値 としても多様される。数値でなく :C4 等でもよい.
エフェクトの種類 :bitcrusher
:gverb リバーブの一種
ハイパスフィルタ
:bpf
バンドパス
:hpf
:compressor コンプレッサ :ixi_techno
:distortion ディストーション :krush
:echo
:level
エコー
ローパスフィルタ
:flanger
:lpf
フランジャー
モノラル
:mono
:nbpf
:nhpf
:nlpf
:normaliser
:nrbpf
:nrhpf
:nrlpf
:octaver
:pan
左右のパン
:panslicer
:pitch_shift 音程
:rbpf
:reverb リバーブ
:rhpf
:ring_mod
:rlpf
:slicer 強弱
残響
:tanh
:vowel
:whammy
:wobble
全てのエフェクトの名称をfx_namesから得て聞いてみるプログラム例.�
i=0
print fx_names
fx_names.length.times do
print fx_names[i]
i=i+1
with_fx fx_names.tick do
play_pattern_timed chord(:C4,:M),0.25
sleep 1.5
end
end
print fx_names.length # =35
サンプリング音源を鳴らす。音はflac形式で内臓されている。 約130種
:ambi_choir
:ambi_dark_woosh
:ambi_drone
:ambi_glass_hum
:ambi_glass_rub
:ambi_haunted_hum
:ambi_lunar_land
:ambi_piano
:ambi_soft_buzz
:ambi_swoosh
:bass_dnb_f
ベース :bass_drop_c
:bass_hard_c
:bass_hit_c
:bass_thick_c
:bass_trance_c
:bass_voxy_c
:bass_voxy_hit_c
:bass_woodsy_c
:bd_808
:bd_ada
:bd_boom
:bd_fat
:bd_gas
:bd_haus
:bd_klub
:bd_pure
:elec_blip
:elec_blip2
:bd_tek
:elec_blup
:bd_zome
:elec_bong
:bd_zum
:elec_chime
:drum_bass_hard
:elec_cymbal
バスドラ :drum_bass_soft
:elec_filt_snare
:drum_cowbell
:elec_flip
ハイハット :drum_cymbal_closed
:elec_fuzz_tom
:drum_cymbal_hard
シンバル :elec_hi_snare
:drum_cymbal_open
:elec_hollow_kick
:drum_cymbal_pedal
:elec_lo_snare
:drum_cymbal_soft
:elec_mid_snare
:drum_heavy_kick
:elec_ping
:drum_roll
:elec_plip
:drum_snare_hard
スネア :elec_pop
:drum_snare_soft
:elec_snare
:drum_splash_hard
:elec_soft_kick
:drum_splash_soft
:elec_tick
:drum_tom_hi_hard
タム :elec_triangle
:drum_tom_hi_soft
:elec_twang
:drum_tom_lo_hard
:elec_twip
:drum_tom_lo_soft
:elec_wood
:drum_tom_mid_hard
:guit_e_fifths
ギター :drum_tom_mid_soft
:guit_e_slide
:elec_beep
:guit_em9
:elec_bell
:bd_sone :guit_harmonics
:loop_amen
ループ用 :loop_amen_full
:loop_breakbeat
:loop_compus
:loop_garzul
:loop_industrial
:loop_mika
:loop_safari
:loop_tabla
:misc_burp
:misc_cineboom
:misc_crow
:perc_bell
:perc_snap
:perc_snap2
:perc_swash
:perc_till
:sn_dolf
:sn_dub
:sn_zome
タブラ :tabla_dhec
:tabla_ghe1
:tabla_ghe2
:tabla_ghe3
:tabla_ghe4
:tabla_ghe5
:tabla_ghe6
:tabla_ghe7
:tabla_ghe8
:tabla_ke1
:tabla_ke2
:tabla_ke3
:tabla_na
:tabla_na_o
:tabla_na_s
:tabla_re
:tabla_tas1
:tabla_tas2
:tabla_tas3
:tabla_te1
:tabla_te2
:tabla_te_m
:tabla_te_ne
:tabla_tun1
:tabla_tun2
:tabla_tun3
:vinyl_backspin
:vinyl_hiss
:vinyl_rewind
:vinyl_scratch
sample :loop_amen
# 1969年のThe Winstonsの曲「Amen Brother」による
rate: 2 等でサンプリング速度を変えることによって音程を変えることができる。1がデフォルト、-1で逆再生も可.
6
synth音源と比較して、音程を変化させたメロディーの演奏にはあまり適さない。
sample :guit_harmonics, beat_stretch: 2
# 指定した長さにする. 音程も変わる.
sample :guit_harmonics, rate: 2
# 1オクターブ音程を上げる,長さも半分になる rpitch: 12でも1オクターブ上
sample :guit_harmonics, pitch: 12
# 長さを変えずに1オクターブ音程を上げる
sample :ambi_choir, pitch_stretch: 6 # 音程を変えずに長さを変える. 最長で元の長さの4倍まで
sample :ambi_choir, pitch: 0.01 , pitch_dis: 0.5 # ランダムにピッチを揺らす. pitch:0 の場合揺れないこともある
puts sample_duration(:ambi_choir)
# サンプルの長さ(拍数) を表示
サンプリング音をファイルから読み込む。startとfinishで開始,終了を指定できる(0〜1で指定)rate:2では2倍の音程となる。
sample "/Users/XXXX/my_sound.wav", start:0.5, finish:0.6, rate:2, pan: 0.5
逆再生もできる.�下記はいずれも全体を逆再生となる.(スクラッチ音等として利用できる.)
sample "/Users/XXXX/my_sound.wav", start:0, finish:1, rate:-1
sample "/Users/XXXX/my_sound.wav", start:1, finish:0, rate: 1
全てのサンプル音源を順に名称と長さを表示して聞いてみるプログラムの例.
use_debug false
asn=all_sample_names
asn.length.times do
↑ puts tick+1, asn.look, (sample_duration asn.look) 音
sample asn.look # 音を聞かなくて良い場合はこの2行を
量 sleep (sample_duration asn.look) # コメントにする
end
ADSRパラメータの設定
attack_level:
decay_level:
sustain_level:
attack:
(synth、sample音源共)
decay:
sustain:
release:
立ち上がり 減衰 保持 余韻 通常は音量一定 シンセサイザーで一般的に使われている音の強度の時間変化の設定
時間 →
play 60, attack: 0.1, attack_level: 1, decay: 0.2, sustain_level: 0.4, sustain: 1, release: 0.5
ポルタメント (controlとslide) 音程等を連続的に変化させる. 例:2拍づつ,内,変化時間0.5拍でC5〜C6まで変化させる
s = play scale(:C5,:major).tick, sustain: 16, note_slide: 0.5 # 変化に要する時間
sleep 2
7.times do
control s, note: scale(:C5,:major).tick
sleep 2
end
エフェクタのslide 連続変化
with_fx :wobble, phase: 1, phase_slide: 10 do |e|
# 10拍かけてずらす
use_synth :dsaw
play 50, release: 10
control e, phase: 0.015
# エフェクタwobbleの振幅の時間を1拍から0.015拍に10拍かけてずらす.
end
エフェクタ名の:slicerは前に:が付き、オプションのmix:には後ろに:がつく。
mix:0は、効果0となる。mix:1が効果が最大
with_fx :slicer, mix: 0.5, phase: 0.5 do
# mix: 0.5は、オリジナルとエフェクトが半々となる.�
play 60, sustain: 3
# phase: 0.5は、0.5拍で揺れの振幅が1回.�
sleep 3
end
現在までの拍数を示す変数 beat
例 play 60 if beat>=4 && beat<=6
等間隔の ring を生成する line
puts line(1,2,steps: 4)
は、(ring
puts line(1,2,steps: 5, inclusive: true)
は、(ring
puts line(1,2,steps: 4).reflect
は、(ring
同じ繰り返しのringを作成する knit, オクターブ音を返すocts
knit 60,3
は、(ring
knit :C4,2,:F4,3
は、(ring
octs :C3,3
は、(ring
play octs :C3,3 は演奏可
#
while〜end 文 例:4 回 60 を鳴らして、その後 72 が鳴る
while beat<4
7
# 6〜8拍のみで鳴らす
1.0, 1.25, 1.5, 1.75)
1.0, 1.25, 1.5, 1.75, 2.0)
1.0, 1.25, 1.5, 1.75, 1.5, 1.25, 1.0)
60, 60, 60)
:C4, :C4, :F4, :F4, :F4)
48, 60, 72)
play 60
sleep 1
end
play 72
#
if〜end 文 例:C4 C4 C5 C5 A4 A4 C5 C5 C5...
loop do
if beat<2
play 60
elsif beat>=4 && beat<6
# else if は、つなげてelseの末尾のeを取り、elsif とする
play 67
else
play 72
end
sleep 1
end
# case〜when
case i
when 0
play 60
when 1,3
play 62
else
play 72
end
文
# 数値、文字等
# "," で併記も可
# for 文 でリストの要素を一つづつ取り出して使うことができる.
str = [:C4, :E4, :G4]
for s in str
play s
sleep 1
end
# break で無限ループを抜けることができる.
i=60
loop do
play i
sleep 0.2
break if i==65
i=i+1
end
use_debug false とすると、ログの出力が減り puts文の出力が残るのでデバッグに活用できる. 画面出力が律速の場合も
数学関数等 Math::sqrt(x) , Math::log10(x) , Math::sin(x) , Math::atan2(y/x) , Math::PI など.
累乗は **, ^は排他的論理和XOR, 絶対値は -1.abs, 整数化は.to_i, 実数化は.to_f 文字化.to_s 配列化.to_a
日付時間を取得 現在の時間 2016-09-14 19:36:28 +0900 等
時間の各数値は、Time.new.year , Time.new.month , Time.new.dat , Time.new.hour , Time.new.min , Time.new.sec
Time.new
range(60,70,2) は、60以上70未満を2づつのringを作成(ring 60,62,64,66,68)。inclusive:trueを加えると70以下と
なる
音符をMIDI番号に変換
:C4.to_i は、60 を返す.
note(:C4) は、60を返す.
(midi_notes :C4,:C5) は、(ring 60, 72) を返す.
配列を文字列に変換 .to_s
array=["a", 1]
puts array.to_s , array.to_s.length
["a", 1] 8
文字列関数は多数あり 参考 http://ref.xaio.jp/ruby/classes/string
s="12345"
8
puts
puts
puts
puts
puts
s.length
# returns 5
s.index("3")
# returns 2
s.slice(1, 3) # 0から数え、1番目から3文字分 returns 234
s.slice(2..4) #
2〜4 returns 345
s.slice(2...4) #
2〜4未満 returns 34
文字列の長さ
文字の位置
部分文字列
ローカル変数とグローバル変数
in_thread や live_loop 内で初めて定義した変数はローカル変数となる。
ループの外で定義した変数はグローバル変数となる。
プログラムは、上から下に実行されてゆくので、全体で使いたい変数は、プログラムの最初に定義するとよい.�
注意
以下の.shuffle行がどちらの行にあるかによって音階の内容は異なってきます。
use_random_seed 0
notes=(chord :C3, :major, num_octaves: 3).shuffle
# ランダムなCの音階がグローバル変数として1回定義される
8.times do
# 上記は9音単位で同じ音が出てこない.
ここにあった場合
# ランダムなCの音階がその都度新たに定義される。
play notes.tick
# 上記は全ての音が1/9の確率で出現する.
sleep 0.25
end
後者は、下記と同様の操作となります。(実際に鳴る、乱数として選ばれる音は異なる) 全ての音が1/9の確率で出現する.
8.times do
notes=(chord :C3, :major, num_octaves: 3).choose
play notes
sleep 0.25
end
整数と実数の混在した計算式での注意
puts
puts
puts
puts
puts
1/2
1/2.0
1.0/2
1./2
1/2.
#
#
#
#
#
4,5行目の挙動は、他言語と異なる
= 0
= 0.5
= 0.5
= 0
このような行があると、プログラム自体がエラーで実行できなくなる。(Rubyに由来)
複数の命令をまとめて管理し実行 = -> { } ,
[ ].map(&:call)
c = -> { play :C, sustain: 1 ; sleep 1 }
# cを{ }でまとめた複数の命令とする.
e = -> { play :E, sustain: 1 ; sleep 1 }
g = -> { play :G, release: 2 ; sleep 1 }
[c,e,g,c].map( &:call )
# []の中を順に実行する.
[c,e,g,c].map{ |x| x.call }
# 同上
キーボードショートカット RUN cmd(alt)+R, STOP cmd+S, 行頭へctrl+A, 行末へctrl+E
デバッグ情報の表示 puts status
縦棒グラフの表示 spark (range 1, 10) または puts spark_graph (range 1, 10)で ▁▂▃▃▄▅▆▆▇
ファイルから値を読み込む
a =File.read("/Users/???/test.txt").to_f
a =File.read("/Users/???/test.txt").to_s
# test.txtから値を読み込みfloat型としてaに代入
#
文字型
実行時の遅れ(latency)を減らすため、Runから実行までの時間を与える
set_sched_ahead_time! 0.1
テキストファイル経由でSonic Piを制御する例(→後述)
[Help]の[命令]]の[spread] 世界の民族音楽のリズム、ユークリッドリズム、ポリリズムの作成など
Creates a new ring of boolean values which space a given number of accents as evenly as possible throughout a bar. This is an implementation of the
process described in ‘The Euclidean Algorithm Generates Traditional Musical Rhythms’ (Toussaint 2005).
[spread]の例
live_loop :euclid_beat do
sample :elec_bong, amp: 1.5 if (spread 3, 8).tick
# Spread 3 bongs over 8
# (spread 3, 8) によって (ring true , false, false, true , false, false, true , false)が生成され、tick によ
って取り出される要素が順番に変わる.�true のタイミングで sample 音源の elec_bong が鳴らされ、false の場合は鳴らない.�
9
sample :perc_snap, amp: 0.8 if (spread 7, 11).look
# Spread 7 snaps over 11
# 前のtickによって同時にこの行のringの要素も進むので、ここではlookのみでtrue/falseを判定し、音を出す.
sample :bd_haus, amp: 2 if (spread 1, 4).look
# Spread
sleep 0.125
end
3つのリズムは、trueを1,falseを0とすると、
1 0 0 1 0 0 1 0|1 0 0 1 0 0 1 0|1 0 0 1 0 0 1 0|1 0 0 1 0 0 1
1 0 1 0 1 1 0 1 1 0 1|1 0 1 0 1 1 0 1 1 0 1|1 0 1 0 1 1 0 1 1
1 0 0 0|1 0 0 0|1 0 0 0|1 0 0 0|1 0 0 0|1 0 0 0|1 0 0 0|1 0 0
1 bd over 4
0|
0 1|
0|
spreadの示す値の例
spread(1,8)
spread(2,8)
spread(3,8)
spread(4,8)
spread(5,8)
spread(6,8)
spread(7,8)
spread(8,8)
(ring
(ring
(ring
(ring
(ring
(ring
(ring
(ring
true
true
true
true
true
true
true
true
,
,
,
,
,
,
,
,
false,
false,
false,
false,
false,
false,
false,
true ,
false,
false,
false,
true ,
true ,
true ,
true ,
true ,
false,
false,
true ,
false,
false,
true ,
true ,
true ,
false,
true ,
false,
true ,
true ,
true ,
true ,
true ,
false,
false,
false,
false,
true ,
false,
true ,
true ,
false,
false,
true ,
true ,
false,
true ,
true ,
true ,
false)
false)
false)
false)
true )
true )
true )
true )
spread(3,8)
spread(3,8, rotate: 1)
spread(3,8, rotate: 2)
spread(3,8, rotate: 3)
(ring
(ring
(ring
(ring
true
true
true
true
,
,
,
,
false,
false,
false,
false,
false,
false,
true ,
false,
true ,
true ,
false,
true ,
false,
false,
false,
false,
false,
true ,
true ,
false,
true ,
false,
false,
true ,
false)
false)
false)
false)
spread(3,8)
spread(3,8).rotate(1)
spread(3,8).rotate(2)
spread(3,8).rotate(3)
(ring
(ring
(ring
(ring
true ,
false,
false,
true ,
false,
false,
true ,
false,
false,
true ,
false,
false,
true ,
false,
false,
true ,
false,
false,
true ,
false,
false,
true ,
false,
true ,
true ,
false,
true ,
false,
false)
true )
false)
false)
# 要素を回転
詳細は、'The Euclidean Algorithm Generates Traditional Musical Rhythms' (Toussaint 2005).
http://cgm.cs.mcgill.ca/~godfried/publications/banff.pdf
(spread 2, 5)
# A thirteenth century Persian rhythm called Khafif-e-ramal.
(ring true, false, false, true, false)
(spread 3, 4)
# The archetypal pattern of the Cumbria from Columbia, as well as a Calypso rhythm from
Trinidad
(ring true, false, true, true)
(spread 3, 5)
# When started on the second onset, is another thirteenth century Persian rhythm by the
name of Khafif-e-ramal, as well as a Romanian folk-dance rhythm.
(ring true, false, true, false, true)
(spread 3, 7)
# A ruchenitza rhythm used in a Bulgarian folk-dance.
(ring true, false, false, true, false, true, false)
(spread 3, 8)
# The Cuban tresillo pattern
(ring true, false, false, true, false, false, true, false)
(spread 4, 7)
# Another Ruchenitza Bulgarian folk-dance rhythm
(ring true, false, true, false, true, false, true)
(spread 4, 9)
# The Aksak rhythm of Turkey.
(ring true, false, false, true, false, true, false, true, false)
(spread 4, 11)
# The metric pattern used by Frank Zappa in his piece Outside Now
(ring true, false, false, true, false, false, true, false, false, true, false)
(spread 5, 6)
# Yields the York-Samai pattern, a popular Arab rhythm, when started on the second onset.
(ring true, false, true, true, true, true)
(spread 5, 7)
# The Nawakhat pattern, another popular Arab rhythm.
(ring true, false, true, true, false, true, true)
(spread 5, 8)
# The Cuban cinquillo pattern.
(ring true, false, true, false, true, true, false, true)
(spread 5, 9)
# A popular Arab rhythm called Agsag-Samai.
(ring true, false, true, false, true, false, true, false, true)
(spread 5, 11)
# The metric pattern used by Moussorgsky in Pictures at an Exhibition
(ring true, false, false, true, false, true, false, true, false, true, false)
(spread 5, 12)
# The Venda clapping pattern of a South African children's song.
(ring true, false, false, true, false, true, false, false, true, false, true, false)
(spread 5, 16)
# The Bossa-Nova rhythm necklace of Brazil.
(ring true, false, false, false, true, false, false, true, false, false, true, false, false, true, false,
false)
(spread 7, 8)
# A typical rhythm played on the Bendir (frame drum)
(ring true, false, true, true, true, true, true, true)
(spread 7, 12)
# A common West African bell pattern.
(ring true, false, true, false, true, false, true, true, false, true, false, true)
(spread 7, 16)
# A Samba rhythm necklace from Brazil.
(ring true, false, false, true, false, true, false, true, false, false, true, false, true, false, true,
false)
(spread 9, 16)
# A rhythm necklace used in the Central African Republic.
10
(ring true, false, true, false, true, false, true, false, true, true, false, true, false, true, false,
true)
(spread 11, 24)
# A rhythm necklace of the Aka Pygmies of Central Africa.
(ring true, false, false, true, false, true, false, true, false, true, false, true, false, false, true,
false, true, false, true, false, true, false, true, false)
(spread 13, 24)
# Another rhythm necklace of the Aka Pygmies of the upper Sangha.
(ring true, false, true, false, true, false, true, false, true, false, true, false, true, true, false,
true, false, true, false, true, false, true, false, true)
WikipediaのEuclidean rhythmには、オープンソース・ミュージック・ハードウェア・プロジェクトのMIDIPal, Grids
などへのリンクもあり. https://en.wikipedia.org/wiki/Euclidean_rhythm
LireOfficeのPresentationのサウンド((ライセンスはGGPPLL))をサンプリング音源として利用する
s=["apert.wav","apert2.wav","applause.wav","beam.wav","beam2.wav","cow.wav","curve.wav","drama.wav","ex
plos.wav","falling.wav","glasses.wav","gong.wav","horse.wav","kling.wav","kongas.wav","laser.wav","left
.wav","nature1.wav","nature2.wav","ok.wav","pluck.wav","roll.wav","romans.wav","soft.wav","space.wav","
space2.wav","space3.wav","sparcle.wav","strom.wav","theetone.wav","top.wav","train.wav","untie.wav","up
s.wav","wallewal.wav"]
# (MacOSXの場合) (LibreOfficeのバージョンによってもパスは異なる)
path="/Applications/LibreOffice.app/Contents/share/gallery/sounds/"
i=0
s.length.times do
sample path+s[i]
sleep sample_duration path+s[i]
# サンプルごとの長さ
sleep 0.1
i=i+1
end
同上 ファイル名を指定しなくても可能な方法(パスのみを与えてファイル名は自動取得できる..) 参考 https://github.com/samaaron/sonic-pi/blob/master/etc/doc/tutorial/03.7-Sample-Packs.md
path="/Applications/LibreOffice.app/Contents/share/gallery/sounds/"
i=0
loop do
sample path,i
sleep sample_duration path,i
# サンプルごとの長さ
i=i+1
end
簡易ボーカロイド他 Haskap Jam Pi http://haskap-jp.cms-marimo.com/haskap-jam-pack/
同上で開発された、Sonic Pi用のボーカロイド等が公開されている.
Jam Session ジャムセッション OSCで通信し、ネットを介したジャムセッションができる
Vocaloid ボーカロイド Log Fowarding ログフォワーディング Processing、PureData、vvvv、openFrameworks へデータを送り、映像等と連携できる。
簡易ボカロの利用(Haskap Jam Pi Vocaloid)(声のWAV音源をsampleで読み込み、rateで音程を変えている.) Sonic Piを起動後、下記のように(1回だけ) haskap-jam-voice.rbを読み込めば、voiceコマンドが使用できるようになる.
load "パス/haskap-jam-pack/client/haskap-jam-voice.rb"
使用できる音声は、ソフトのvoiceフォルダ内のWAVファイル 約150音
v=["a","aa","ba","be","bi","bo","bres","bres2","bres3","bres4","bu","bya","byo","byu","cha","che","chi","cho","chu","d
a","de","di","do","du","dyu","e","ee","fa","fe","fi","fo","fu","fyu","ga","ge","gi","go","gu","gya","gyo","gyu","ha","
he","hi","ho","hu","hu2","huu","hya","hyu","i","ie","ee","ji","jya","jye","jyo","jyu","ka","ke","ki","ko","ku","kya","
kyo","kyu","ma","me","mi","mo","mu","mya","myo","myu","n","na","ne","nga","nge","ngi","ngo","ni","nn","nnn","no","nu",
"nya","nyo","nyu","o","oo","pa","pe","pi","po","pu","pya","pyo","pyu","ra","re","ri","ro","ru","rya","ryo","ryu","sa",
"se","sha","she","shi","sho","shu","si","so","su","ta","te","thi","tho","thu","ti","to","tu","u","ua","ue","ugu","ui",
"uo","uu", "va","ve","vi","vo","vu","wa","wo","ya","yo","yu","za","ze","zo","zu","zua","zue","zui","zuo"]
全部しゃべらせるプログラム例は、上記のv=と、
v.length.times do
voice v.tick, :C4, relese: 0.7
sleep 0.5
end
使用例
load "パス/haskap-jam-pack-0.2.0/client/haskap-jam-voice.rb"
# 毎回のSonicPi起動後1回だけ必要
voice "do" , 60
# 一音のみを発生
sleep 1
voice "do", [:C4, :E4, :G4]
# 一度に和音を発声
sleep 1
voice "mi", chord(:c4, :M)
# 一度に和音を発声
sleep 1
voice_pattern "do", chord(:C3, :M)
#アルペジオで和音を発声
voice_pattern_timed "so", chord(:C4, :M ), 0.25
# アルペジオで和音を発声(時間指定)
voice_pattern_timed "do", scale(:C3, :major), 0.25, release: 0.25
# スケールを発声
11
voice_pattern_timed "ra", scale(:C3, :minor), [0.125, 0.25, 0.5]
# 指定した長さで和音を発声
Haskap Jam Piで"あいうえお"と音程を半音ずつ上げてずっと歌わせる例
a=(ring "a","i","u","e","o")
T=60
loop do
a.length.times do
voice a.tick,T
sleep 0.2
T=T+1
end
end
さくら(日本古謡)を歌わせる..(歌声としては?) load "パス/haskap-jam-pack-0.2.0/client/haskap-jam-voice.rb"
a=[]
b=[]
d=[]
a[0]=[:A3,:A3,:B3,
:A3,:A3,:B3,
:A3,:B3,:C4,:B3,
:A3,:B3,:A3,:F3,
:E3,:C3,:E3,:F3,
:E3,:E3,:C3,:B2,
:A3,:B3,:C4,:B3,
:A3,:B3,:A3,:F3,
:E3,:C3,:E3,:F3, :E3,:E3,:C3,:B2,
:A3,:A3,:B3, :A3,:A3,:B3, :E3,:F3,:B3,:A3,:F3,:E3]
#a[0]=[:A4,:A4,:B4,
:A4,:A4,:B4,
:A4,:B4,:C5,:B4,
:A4,:B4,:A4,:F4,
:E4,:C4,:E4,:F4,
:E4,:E4,:C4,:B3,
:A4,:B4,:C5,:B4,
:A4,:B4,:A4,:F4,
:E4,:C4,:E4,:F4, :E4,:E4,:C4,:B3,
:A4,:A4,:B4, :A4,:A4,:B4, :E4,:F4,:B4,:A4,:F4,:E4]
b[0]=[1.0,1.0,2.0,
1.0,1.0,2.0,
1.0,1.0,1.0,1.0,
1.0,0.5,0.5,2.0,
1.0,1.0,1.0,1.0,
1.0,0.5,0.5,2.0, 1.0,1.0,1.0,1.0,
1.0,0.5,0.5,2.0,
1.0,1.0,1.0,1.0, 1.0,0.5,0.5,2.0,
1.0,1.0,2.0, 1.0,1.0,2.0, 1.0,1.0,0.5,0.5,1.0,4.0]
d[0]=["sa","ku","ra","sa","ku","ra","ya","yo","i","no","so","ra","a","wa","mi","wa","ta","su
","ka","gi","i","ri","ka","su","mi","ka","ku","mo","o","ka","ni","o","i","zo","i","zu","u","
ru","i","za","ya","i","za","ya","mi","ni","yu","u","ka","n"]
use_bpm 120
in_thread do
i=0
a.length.times do
j=0
a[i].length.times do
voice d[i][j], a[i][j], attack:b[i][j]*0.1, release: b[i][j]*0.9
sleep b[i][j]
j+=1
end
i+=1
end
end
参考サイト 本家のサンプルプログラムと音 http://sonic-pi.net/#examples
CODE MUSIC WITH Sonic Pi(開発者による実践的な書籍. PDFでは無料配布)
https://www.raspberrypi.org/magpi/issues/essentials-sonic-pi-v1/
The MagPi Magazine(Raspberry Piの雑誌, SE1,32と36以降に各号2頁のSonic Piの入門記事があり. PDFでは無料配布
https://www.raspberrypi.org/magpi/issues/
Sonic Pi Live & Coding http://www.sonicpiliveandcoding.com/
mehackit, Creative programming workshop with Sonic Pi 詳しい解説、サンプルプログラムと実行音あり
http://sonic-pi.mehackit.org/
フィンランド http://www.mehackit.org/
Sonic Pi × SIAF LAB.(札幌国際芸術祭ラボ)
http://www.sapporo-internationalartfestival.jp/siaflab/sonic-jam-pi/
Sonic Piチュートリアル(翻訳版PDF)がある
多摩美の教材 サウンド・パフォーマンス 2015年度等 田所淳 http://yoppa.org/tausound15/6469.html
音楽をプログラミングしよう 全8回 https://nalu-labo.amebaownd.com/posts/categories/73052
同 第2回インストールの説明(Windows) https://nalu-labo.amebaownd.com/posts/626567?categoryIds=73052
Google GroupのSonic Piフォーラム https://groups.google.com/forum/#!forum/sonic-pi
12
曲のサンプルコードが10曲程度あり https://github.com/rbnpi/SonicPi-Tutorials
熊蜂は飛ぶ http://raspi.tv/2013/sonic-pi-flight-of-the-bumblebee
グラスハーモニカによるMozart's Adagio in C Rubyのテクニックが多く使われている
Creating a glass harmonica emulator with Sonic Pi
https://rbnrpi.wordpress.com/project-list/creating-a-glass-harmonica-emulator-with-sonic-pi/
モーツアルト 音楽のサイコロ遊び Mozart Dice generated Waltz
https://rbnrpi.wordpress.com/project-list/mozart-dice-generated-waltz-revisited-with-sonic-pi/
https://gist.github.com/rbnpi/abbb0a7880f355c12d0e
開発者によるライブコーディングの実演
Sam Aaron and Ben Smith Sonic Pi Jam https://www.youtube.com/watch?v=yD4HPX8TdA8
その他参考 英語版Wikipediaの
「Sonic Pi」
https://en.wikipedia.org/wiki/Sonic_Pi
「Live Coding」
https://en.wikipedia.org/wiki/Live_coding
RubyKaigi2016の講演ビデオJulian Cheal氏(10分頃から)
http://rubykaigi.org/2016/presentations/juliancheal.html
Sonic PiとKidsRubyの比較論文.�著者の所属は、Sonic Piの開発者Sam Aaronと同じ
"Educational Programming Languages: The Motivation to Learn with Sonic Pi",
Arabella Jane Sinclair, Computer Laboratory, Cambridge Univ.
http://users.sussex.ac.uk/~bend/ppig2014/25ppig2014_submission_23.pdf
"ChucK: A Strongly Timed Computer Music Language", Ge Wang et al. CCRMA, Stanford Univ.
http://www.mitpressjournals.org/doi/abs/10.1162/COMJ_a_00324#.V1qG-mZaLmg
Related Workとして CSound, Common Lisp Music, Max/MSP, Pure Data, SuperCollider, Nyquist, Music N, Music V, HMSL, Chronic,
Synthesis Tool Kit, CMix, RTCMix, Sonic Pi, Overtone, Gibber, Tidal, Impromptu, Extempore, LLVM, Esterel, Lustre, SIGNAL
などが紹介されている。
Mac版の場合、Sonic Pi.appのパッケージの内容を表示→etc→samplesにflac形式のサンプリング音源ファイルが置い
てある。
例については、同→etc→examplesに.rbファイルとして置いてある。
同→etc→synthdefsには、Sonic Piの元となっているSuperColliderのsynthdefファイル等が置いてある。GraphVizの.dotファイ
ルやPDF化したグラフもある。
etc/snippets/fxでは、fxの種類がわかる。
同/etc/doc/cheatsheets/synths.md
同/etc/doc/cheatsheets/fx.md
同/etc/doc/cheatsheets/samples.md
は、テキストファイルであり、それぞれの種類や機能がわかる。
10個のBufferの内容は、下記のテキストファイルに保存されています。
$HOME/.sonic-pi/store/default/workspace_zero.spi 〜 workspace_nine.spi
ハバネラ :rは休符
live_loop :habanera do
play (ring :d, :r, :r, :a, :f5, :r, :a, :r).tick
sleep 0.25
end
君が代 配列の要素指定を用いたプログラム例. 配列 aが音程、bが長さ
use_bpm 120
a=[:D4,:C4,:D4,:E4,:G4,:E4,:D4, :E4,:G4,:A4,:G4,:A4,:D5,:B4,:A4,:G4,:E4,:G4,:A4, :D5,:C5,:D5
, :E4,:G4,:A4,:G4,:E4,:G4,:D4, :A4,:C5,:D5, :C5,:D5,:A4,:G4,:A4,:G4,:E4,:D4]
b=[ 1, 1, 1, 1, 1, 1, 2,
1, 1, 1,0.5,0.5, 1, 1, 1, 1, 1, 1, 2,
1, 1, 2,
1,
1, 1, 1,1.5,0.5, 2,
1, 1, 2,
1, 1, 1, 1, 1,0.5,0.5, 2]
i=0
a.length.times do
play a[i], release: 2
sleep b[i]
i=i+1
13
end
同 forループを用いた場合のプログラム例.
for i in 0...a.length
play a[i], release: 2
sleep b[i]
end
上記の b=[
]までの行は省略してあります.
同 ユーザー定義関数を用いた場合のプログラム例. 上記の b=[ ]までの行は省略してあります.
define :play_notes do |c,d|
# 関数の定義
e=c.zip(d)
# eは、[[:D4, 1], [:C4, 1],....という配列となる
e.each do |f,g|
play f
sleep g
end
end
play_notes a,b
# 音程aと長さbを与えて関数を実行する.
# 再生専用の関数として、再利用できる.
配列の活用例 MusicXML等から変換した長い曲データの演奏などに 2次元配列に音程と長さとBPMを格納して演奏する。配列aとbは同じサイズの必要あり.
a=[]
b=[]
a[0]=[:C4,:D4,:E4,:F4]
a[1]=[:G5,:A5,:B5]
b[0]=[1,1,1,1]
b[1]=[1,1,1]
c=[200,100] # aの行ごとに与えるBPM値 (途中で速度が変わる曲の場合)
i=0
a.length.times do
use_bpm c[i]
j=0
a[i].length.times do
play a[i][j]
sleep b[i][j]
j+=1
end
i+=1
end
同 forループを使った場合のプログラムは、 ( c= の行までは省略してあります. )
for i in 0..a.length-1
use_bpm c[i]
for j in 0..a[i].length-1
play a[i][j]
sleep b[i][j]
end
end
#=========================================================
# Sweet Child O' Mine intro. - Guns N' Roses をいろいろな音で聞いてみる.
s=(ring :beep,:blade,:chipbass,:chiplead,:dpulse,:dsaw,:dtri,:dull_bell,:fm,:growl,:hollow,:hoover,:mod
_beep,:mod_dsaw,:mod_fm,:mod_pulse,:mod_saw,:mod_sine,:mod_tri,:piano,:pluck,:pretty_bell,:prophet,:pul
se,:saw,:sine,:square,:subpulse,:supersaw,:tb303,:tri,:zawa)
#s=(ring :bnoise,:chipnoise,:cnoise,:dark_ambience,:gnoise,:noise,:pnoise) # ノイズ系は除く.
a=[:D4,:D5,:A4,:G4,:G5,:A4,:Fs5,:A4]
b=[:E4,:D5,:A4,:G4,:G5,:A4,:Fs5,:A4]
c=[:G4,:D5,:A4,:G4,:G5,:A4,:Fs5,:A4]
f=[a,a,b,b,c,c,a,a]
# ,a,a,b,b,c,c,a,a]
loop do
i=0
use_synth s.tick
14
f.length.times do
j=0
f[i].length.times do
play f[i][j]
sleep 0.2
j=j+1
end
i=i+1
end
end
#=========================================================
# Let It Be コードのみ
C=[:G3,:C4,:E4,:G4,:C5,:E5] # chord()を使わず、使いたい音を与えている。
G=[:G3,:B4,:D4,:G4,:B5,:G5]
Am=[:E3,:A3,:E4,:A4,:C4,:E5]
F=[:F3,:C4,:F4,:A4,:C5,:F5]
Dm7=[:F3,:A4,:D4,:A4,:C5,:F5]
Em=[:E3,:B3,:E4,:G4,:B4,:E5]
Bb=[:F3,:Bf3,:F4,:Bf4,:D4,:F5]
Dm=[:F3,:A4,:D4,:A4,:D5,:F5]
use_bpm 100
t=1
s=t/2.0
# 整数で割ると商も整数となってしまうので実数で割る
u=t*2
Riff1=[C,C,G,G,Am,Am,F,F,C,C,G,G,F,C,Dm7,C]
Time1=[t,t,t,t,t ,t ,t,t,t,t,t,t,t,s,s ,u]
2.times do
i=0
Riff1.length.times do
play Riff1[i]
sleep Time1[i]
i=i+1
end
end
Riff2=[Am,Am,G,G,F,F,C,C, C,C,G,G,F,C,Dm,C]
Time2=[t ,t ,t,t,t,t,t,t, t,t,t,t,t,s,s ,u]
i=0
Riff2.length.times do
play Riff2[i]
sleep Time2[i]
i=i+1
end
Riff3=[F,Em,Dm,C,Bb,F,G,F,C]
Time3=[t,s ,s ,t,s ,s,t,t,u]
2.times do
i=0
Riff3.length.times do
play Riff3[i]
sleep Time3[i]
i=i+1
end
end
#=========================================================
# Let It Beの一部分の例(ギター、ベース、ドラム) 名前付きtickを使用
# 名前付きtickは、T1とT4を単なるtickに、他をlookにしても可
use_bpm 100
# Drums
live_loop :drums do
2.times do
sample :drum_cymbal_closed
sample :drum_bass_hard
sleep 0.5
sample :drum_cymbal_closed
sleep 0.5
sample :drum_cymbal_closed
sample :drum_snare_hard
sleep 0.5
sample :drum_cymbal_closed
sleep 0.5
15
end
end
sleep 8
# Side Guitar
Chords1=(ring :C3,:C3,:G3,:G3,:A3,:A3,:F3,:F3,:C3,:C3,:G3,:G3,:F3,:C3,:D3,:C3)
Chords2=(ring :M,:M,:M,:M,:minor,:minor,:M,:M,:M,:M,:M,:M,:M,:M,:minor7,:M)
ChordsT=(ring 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 4)
live_loop :sideGitar do
use_synth :pluck
play chord( Chords1.tick(:T1), Chords2.tick(:T2),num_octaves: 3 ), release: 2, amp: 5
sleep ChordsT.tick(:T3)
end
# Bass
live_loop :bass do
use_synth :fm
note1=Chords1.tick(:T4)
note2=ChordsT.tick(:T5)
note2.times do
play note1,amp: 0.4
sleep 1
end
end
16
(Audacity で表示)
(Audacity で表示)
平均律と純�正律 use_tuning :equal
# 平均律とする(デフォルト)
play chord(:C4,:M)
# ドミソを鳴らす
use_tuning :just
# 純�正律とする
play chord(:C4,:M)
# ドミソを鳴らす
Rec.で録音してAudacityで波形を表示してみると、平均律では周波数の比率が悪
く、うなりが生じているのがわかる。
同上 Lissajousで観察, 純正律はリサージュ図形は動かないが、平均律では変化
し続ける
[Pref]→[ビジュアル]→[スコープを表示]と[Lissajous]をチェックする。 use_tuning :just
play :C4,sustain:4,pan:-1
play :E4,sustain:4,pan:0
play :G4,sustain:4,pan:1
sleep 4
use_tuning :equal
play :C4,sustain:4,pan:-1
play :E4,sustain:4,pan:0
play :G4,sustain:4,pan:1
sleep 4
ローパスフィルタで矩形波から倍音成分((含まれるのは奇数次のみ))を除いて正弦波に #SonicPi Low-pass Filter
use_synth :square
# SonicPiの矩形波は、長方形でなく、綺麗な矩形波ではない
play 60
# 中央のドを矩形波で鳴らす。
sleep 2
with_fx :lpf do
play 60, cutoff: 60 # 高周波成分(奇数次倍音)をローパスフィルターで除くと、ほぼ正弦波になる。
sleep 2
end
録音してAudacityで観察。
2つの音の周波数の微妙なずれから""うなり""を発生させる。 2つの音が1Hzずれていると、1秒間に1回のうなりを生じる。
play 69,sustain:11
# チューニングに用いるA=440の音を出す。
use_cent_tuning 3.93
# Aの音が1Hz上がるようにチューニングをずらす
play 69,sustain:11
# 同じAの音を鳴らすと1秒間に1回のうなりが聞こえる。
puts midi_to_hz(69)
# チューニングをずらしたAの音の周波数を表示しても441となっていない。バグ?
17
(Audacity で表示)
(Audacity で表示)
(Audacity で表示)
1
2
3
4
5
6
7
8
モスキートトーンを出すには.. --若者だけに聞こえる音-- #17kHz Mosquito sound
a=hz_to_midi(17000)
# 17kHzをMIDIノート番号(約132.3)に変換する.
play a,amp:2,sustain:2
puts a
Rec.して、Audacityで開き、波形を眺め、周波数解析をすると、17kHzが出ているのがわかる。
超低音のノートナンバー0は、どのように再生されているか? play 0,sustain:5,release:3
puts midi_to_hz(0)
周波数は、8.175798915643707 Hz 可聴範囲外で、多くのスピーカーの再生範囲外
五度差の音を混ぜる。detune:パラメータの存在するssyynntthh音源の場合のみ use_synth :dsaw
5.times do
play [:C,:D,:E,:F,:G].tick ,detune: 7
sleep 1
end
# 7半音が五度
# 7を0.2等の小さな値にすると、厚みのある音となる
ロックドラムの例 https://en.wikipedia.org/wiki/Drum_beat use_bpm 100
in_thread do # この行を削除して次の行を live_loop としてもいい
loop do
2.times do
sample :drum_cymbal_closed
sample :drum_bass_hard
sleep 0.5
sample :drum_cymbal_closed
sleep 0.5
sample :drum_cymbal_closed
sample :drum_snare_hard
sleep 0.5
sample :drum_cymbal_closed
sleep 0.5
end
end
end
18
# 音量が変わるドラムロール in_thread do
loop do
sample :drum_roll ,sustain:3,release:0.5 ,decay:1,decay_level:1,sustain_level:5
sleep 4
end
end
#ランダムメロディー 強弱付き in_thread do
use_synth :mod_sine
loop do
#play rrand(60,72), amp: rrand(0.5,3)
#play rrand_i(60,72), amp: rand(3)
play choose([:C4,:D4,:E4,:G4,:A4,:C5]), amp: (ring 2,1,1.5,1).tick
sleep 1
end
end
#時々鳴るパルス in_thread do
use_synth :mod_pulse
loop do
play choose([:C4,:D4,:E4,:G4,:A4,:C5]), amp: (ring 2,1,2,1).tick if one_in(4)
sleep 1
end
end
スクラッチ風 live_loop :scratch1 do
sample :loop_amen,beat_stretch:2,rate: -1
sleep 2
end
# rate:-1 は逆再生
:fm synthのパラメータdepth, divisor設定例 ((音源によって存在するパラメータが異なる))
use_synth :fm
i=0
10.times do
play 60, depth:i , divisor:i
sleep 1
i=1 if i==0
i=i*2
end
# かえるのうた(輪唱) #入力例1
最も単純な入力例(メロディー1回のみ)
use_bpm 120
play :C4
sleep 1
play :D4
sleep 1
play :E4
sleep 1
play :F4
sleep 1
play :E4
sleep 1
play :D4
sleep 1
play :C4
sleep 2
# 全体の速度
1分間に 120 拍(1 拍が 0.5 秒)
play :E4
sleep 1
play :F4
sleep 1
play :G4
19
sleep 1
play :A4
sleep 1
play :G4
sleep 1
play :F4
sleep 1
play :E4
sleep 2
play :C4
sleep 2
play :C4
sleep 2
play :C4
sleep 2
play :C4
sleep 2
play :C4
sleep 0.5
play :C4
sleep 0.5
play :D4
sleep 0.5
play :D4
sleep 0.5
play :E4
sleep 0.5
play :E4
sleep 0.5
play :F4
sleep 0.5
play :F4
sleep 0.5
play :E4
sleep 1
play :D4
sleep 1
play :C4
sleep 2
#入力例2 音程と時間を一緒に指定する play_pattern_timed を使って簡略化した例
use_bpm 120
play_pattern_timed
play_pattern_timed
play_pattern_timed
play_pattern_timed
[:C4,:D4,:E4,:F4,:E4,:D4,:C4],[1,1,1,1,1,1,2]
[:E4,:F4,:G4,:A4,:G4,:F4,:E4],[1,1,1,1,1,1,2]
[:C4,:C4,:C4,:C4],[2,2,2,2]
[:C4,:C4,:D4,:D4,:E4,:E4,:F4,:F4,:E4,:D4,:C4],[0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,1,1,2]
#入力例3 配列に音程と時間を格納しておき、一つの play 文で鳴らすようにした例
use_bpm 120
a=[]
b=[]
a[0]=[:C4,:D4,:E4,:F4,:E4,:D4,:C4]
b[0]=[1,1,1,1,1,1,2]
a[1]=[:E4,:F4,:G4,:A4,:G4,:F4,:E4]
b[1]=[1,1,1,1,1,1,2]
a[2]=[:C4,:C4,:C4,:C4]
b[2]=[2,2,2,2]
a[3]=[:C4,:C4,:D4,:D4,:E4,:E4,:F4,:F4,:E4,:D4,:C4]
b[3]=[0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,1,1,2]
for i in 0...a.length
for j in 0...a[i].length
play a[i][j] , attack: 0.1 , release: b[i][j]
sleep b[i][j]
# 音の鳴らし方の変更が1箇所でできるのが利点
20
end
end
輪唱化にする には、下記の3点が必要です。
1) 同じ旋律を繰り返すループの作成
2) 複数のメロディーを同時並行で実行させる
3) 各メロディーのスタートに時間差を与える(8拍づつ遅らせる)
#入力例4
ループと同時並行の実行に、live_loop を使った例
live_loop :kaeru1 do
# このループ内にメロディーの音符を全部入れる(入力例1,2,3いずれでも可)
play_pattern_timed [:C4,:D4,:E4,:F4,:E4,:D4,:C4],[1,1,1,1,1,1,2]
play_pattern_timed [:E4,:F4,:G4,:A4,:G4,:F4,:E4],[1,1,1,1,1,1,2]
play_pattern_timed [:C4,:C4,:C4,:C4],[2,2,2,2]
play_pattern_timed [:C4,:C4,:D4,:D4,:E4,:E4,:F4,:F4,:E4,:D4,:C4],[0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,1,1,2]
end
sleep 8
#2番目のメロディーの開始まで 8 拍置く.
use_synth :fm
# 2 番目のメロディーの楽器の指定
live_loop :kaeru2 do
play_pattern_timed [:C4,:D4,:E4,:F4,:E4,:D4,:C4],[1,1,1,1,1,1,2]
play_pattern_timed [:E4,:F4,:G4,:A4,:G4,:F4,:E4],[1,1,1,1,1,1,2]
play_pattern_timed [:C4,:C4,:C4,:C4],[2,2,2,2]
play_pattern_timed [:C4,:C4,:D4,:D4,:E4,:E4,:F4,:F4,:E4,:D4,:C4],[0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,1,1,2]
end
または、
#入力例5
in_thread と loop を使った例
in_thread do
loop do
ここに音を入れる
end
end
sleep 8
use_synth :fm
in_thread do
loop do
ここに音を入れる
end
end
#入力例6 関数を使った例. シンセ音源も指定
use_bpm 120
define :kaeru1 do |gakki|
use_synth gakki
ここに入力例1等の音符を入れる. 曲を長くしたい場合は n.times do で囲う
end
in_thread do
kaeru1 :fm
# 音源を:fm としてメロディーを呼びだす
end
sleep 8
# 8拍置く
in_thread do
kaeru1 :tri
# 音源を:tri としてメロディーを呼びだす
end
#入力例7 シンセ楽器名(1行目)と、繰り返し回数(2行目)で与えるようにして汎用性を少し増したプログラム(ドラム付き)
s=[:fm, :prophet, :zawa, :prophet]
loops= 1
use_bpm 120
# 音色となるシンセ音源名を与える
書き換え化
# メロディーを繰り返す回数を与える 書き換え化
# 速度を与える
書き換え化
a=[]
b=[]
a[0]=[:C4,:D4,:E4,:F4,:E4,:D4,:C4]
b[0]=[1,1,1,1,1,1,2]
# カエルの歌の音程データを与える配列
# 音符の長さデータを与える配列(長さの拍数の合計は 32 拍)
# 計8拍
21
a[1]=[:E4,:F4,:G4,:A4,:G4,:F4,:E4]
b[1]=[1,1,1,1,1,1,2]
# 計8拍
a[2]=[:C4,:C4,:C4,:C4]
b[2]=[2,2,2,2]
# 計8拍
a[3]=[:C4,:C4,:D4,:D4,:E4,:E4,:F4,:F4,:E4,:D4,:C4]
b[3]=[0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,1,1,2]
# 計8拍
parts=s.length
# 楽器の数
in_thread do
(loops*8 + (parts-1)*2).times do
sample :drum_cymbal_closed
sample :drum_bass_hard
sleep 1
sample :drum_cymbal_closed
sleep 1
sample :drum_cymbal_closed
sample :drum_snare_hard
sleep 1
sample :drum_cymbal_closed
sleep 1
end
end
# ドラムパターン(4拍の繰り返し)
# 繰り返回数 loops (全長 32 / 4 拍) + メロディーのズレにより生じる長さ
define :kaeru do |k|
loops.times do
for i in 0...a.length
for j in 0...a[i].length
play a[i][j] ,pan: (k % 3)-1
sleep b[i][j]
end
end
end
end
# メロディーを演奏する関数の定義
#メインプログラム
for k in 0...parts
sleep 8 if k!=0
use_synth s[k]
in_thread do
kaeru k
end
end
# 楽器番号 k 毎に音の方向を左右中央に振る(3 で割った余り-1 は、-1,0,1 となる)
# 楽器数だけ繰り返す
# 最初以外は、8拍づつ遅らせて関数 kaeru の演奏を始める
# 音色となるシンセを与える
# メロディーを演奏する関数 kaeru に楽器番号 k を与えて呼び出す
22
==============================
63種のコードを羅列して全部聞いてみるプログラムは、
cNames=['+5', '1', '11', '11+', '13', '5', '6', '6*9', '7', '7+5', '7+5-9', '7-10', '7-5', '7-9', '7sus2',
'7sus4', '9', '9+5', '9sus4', 'M', 'M7', 'a', 'add11', 'add13', 'add2', 'add4', 'add9', 'augmented', 'dim',
'dim7', 'diminished', 'diminished7', 'dom7', 'i', 'i7', 'm', 'm+5', 'm11', 'm11+', 'm13', 'm6', 'm6*9', 'm7',
'm7+5', 'm7+5-9', 'm7+9', 'm7-5', 'm7-9', 'm9', 'm9+5', 'madd11', 'madd13', 'madd2', 'madd4', 'madd9', 'maj11',
'maj9', 'major', 'major7', 'minor', 'minor7', 'sus2', 'sus4']
cNames.length.times do
play_pattern_timed chord(:C4, cNames.tick),0.1
sleep 0.5
end
71種のスケール全てを羅列して聞いてみる、
scaleN=[:aeolian, :ahirbhairav, :augmented, :augmented2, :bartok, :bhairav, :chinese, :chromatic, :diatonic, :diminish
ed, :diminished2, :dorian, :egyptian, :enigmatic, :gong, :harmonic_major, :harmonic_minor, :hex_aeolian, :hex_dorian,
:hex_major6, :hex_major7, :hex_phrygian, :hex_sus, :hindu, :hirajoshi, :hungarian_minor, :indian, :ionian, :iwato, :ji
ao, :kumoi, :leading_whole, :locrian, :locrian_major, :lydian, :lydian_minor, :major, :major_pentatonic, :marva, :melo
dic_major, :melodic_minor, :melodic_minor_asc, :melodic_minor_desc, :messiaen1, :messiaen2, :messiaen3, :messiaen4, :m
essiaen5, :messiaen6, :messiaen7, :minor, :minor_pentatonic, :mixolydian, :neapolitan_major, :neapolitan_minor, :octat
onic, :pelog, :phrygian, :prometheus, :purvi, :ritusen, :romanian_minor, :scriabin, :shang, :spanish, :super_locrian,
:todi, :whole, :whole_tone, :yu, :zhi]
i=0
scaleN.length.times do
puts i, scaleN[i], (scale :C4, scaleN[i]).length
j=0
(scale :C4, scaleN[i]).length.times do
play (scale :C4, scaleN[i])[j], release: 0.1
sleep 0.1
j=j+1
end
sleep 0.5
i=i+1
end
39種の音源をC4の音程で全部連続して聞いて見るには、列挙すると
39.times do
use_synth
(ring :beep,:blade,:bnoise,:chipbass,:chiplead,:chipnoise,:cnoise ,:dark_ambience ,:dpulse,:dsaw,:dtri ,:dull_bell,
:fm,:gnoise,:growl,:hollow,:hoover,:mod_beep,:mod_dsaw, :mod_fm,:mod_pulse,:mod_saw,:mod_sine,:mod_tri,:noise ,:pia
no,:pluck,:pnoise,:pretty_bell,:prophet,:pulse,:saw,:sine ,:square ,:subpulse,:supersaw,:tb303,:tri ,:zawa ).tick
play :C4
sleep 0.5
end
エフェクトを羅列して全部試してみる.
fxs=[:bitcrusher, :bpf, :compressor, :distortion, :echo, :flanger, :gverb, :hpf, :ixi_techno, :krush, :level, :lpf, :m
ono, :nbpf, :nhpf, :nlpf, :normaliser, :nrbpf, :nrhpf, :nrlpf, :octaver, :pan, :panslicer, :pitch_shift, :rbpf, :rever
b, :rhpf, :ring_mod, :rlpf, :slicer, :tanh, :vowel, :whammy, :wobble]
define :fxTest do |nFx|
with_fx nFx do
play :C4
sleep 2
play_pattern_timed chord(:C4,:M),0.25
sleep 2
end
end
i=0
fxs.length.times do
puts i,fxs[i]
fxTest fxs[i]
i=i+1
end
サンプル音源の*.flacの130種を羅列して全部聞いてみる.
s1=[:ambi_choir, :ambi_dark_woosh, :ambi_drone, :ambi_glass_hum, :ambi_glass_rub, :ambi_haunted_hum, :ambi_lunar_land,
:ambi_piano, :ambi_soft_buzz, :ambi_swoosh, :bass_dnb_f, :bass_drop_c, :bass_hard_c, :bass_hit_c, :bass_thick_c, :bas
s_trance_c, :bass_voxy_c, :bass_voxy_hit_c, :bass_woodsy_c, :bd_808, :bd_ada, :bd_boom, :bd_fat, :bd_gas, :bd_haus, :b
d_klub, :bd_pure, :bd_sone, :bd_tek, :bd_zome, :bd_zum, :drum_bass_hard, :drum_bass_soft, :drum_cowbell, :drum_cymbal_
closed, :drum_cymbal_hard, :drum_cymbal_open, :drum_cymbal_pedal, :drum_cymbal_soft, :drum_heavy_kick, :drum_roll, :dr
um_snare_hard, :drum_snare_soft, :drum_splash_hard, :drum_splash_soft, :drum_tom_hi_hard, :drum_tom_hi_soft, :drum_tom
_lo_hard, :drum_tom_lo_soft, :drum_tom_mid_hard, :drum_tom_mid_soft, :elec_beep, :elec_bell, :elec_blip, :elec_blip2,
:elec_blup, :elec_bong, :elec_chime, :elec_cymbal, :elec_filt_snare, :elec_flip, :elec_fuzz_tom, :elec_hi_snare, :elec
_hollow_kick, :elec_lo_snare, :elec_mid_snare, :elec_ping, :elec_plip, :elec_pop, :elec_snare, :elec_soft_kick, :elec_
23
tick, :elec_triangle, :elec_twang, :elec_twip, :elec_wood, :guit_e_fifths, :guit_e_slide, :guit_em9, :guit_harmonics,
:loop_amen, :loop_amen_full, :loop_breakbeat, :loop_compus, :loop_garzul, :loop_industrial, :loop_mika, :loop_safari,
:loop_tabla, :misc_burp, :misc_cineboom, :misc_crow, :perc_bell, :perc_snap, :perc_snap2, :perc_swash, :perc_till, :sn
_dolf, :sn_dub, :sn_zome, :tabla_dhec, :tabla_ghe1, :tabla_ghe2, :tabla_ghe3, :tabla_ghe4, :tabla_ghe5, :tabla_ghe6, :
tabla_ghe7, :tabla_ghe8, :tabla_ke1, :tabla_ke2, :tabla_ke3, :tabla_na, :tabla_na_o, :tabla_na_s, :tabla_re, :tabla_ta
s1, :tabla_tas2, :tabla_tas3, :tabla_te1, :tabla_te2, :tabla_te_m, :tabla_te_ne, :tabla_tun1, :tabla_tun2, :tabla_tun3
, :vinyl_backspin, :vinyl_hiss, :vinyl_rewind, :vinyl_scratch]
i=0
s1.length.times do
# (=130)
8.times do
sample s1[i], amp:1
sleep 0.25
end
i=i+1
end
24
Sonic Pi
Examples(Official) の解説
Haunted Bells
loop do
# 無限ループ開始
sample :perc_bell, rate: (rrand 0.125, 1.5) # サンプル音源の:per_bell を 0.125〜1.5 のランダムな速度で再生
sleep rrand(0, 2)
# 間隔をランダムに 0〜2 拍あける.
end
# 無限ループここまで
Pentatonic Bleeps
with_fx :reverb, mix: 0.2 do
# 全体にエフェクトのリバーブを 0.2 だけかける.
loop do
# 無限ループ開始
play scale(:Eb2, :major_pentatonic, num_octaves: 3).choose, release: 0.1, amp: rand
# E♭のメジャー・ペンタトニックスケールのオクターブ 2 から 3 オクターブ分の音から 1 音をランダムに選び、余韻
0.1 拍、強さ 1 未満で、デフォルトの:beep 音(サイン波)を鳴らす。
sleep 0.1
# 0.1 拍の間をあける.
end
# 無限ループここまで
end
# エフェクトここまで
Tron Bikes
loop do
# 無限ループ開始
with_synth :dsaw do
# :dsaw 鋸型波形を使う
with_fx(:slicer, phase: [0.25,0.125].choose) do
# スライサを使い、間隔を 0.25 拍または 0.125 拍とする.
with_fx(:reverb, room: 0.5, mix: 0.3) do
# リバーブを使い、部屋サイズを 0.5、混合度合いを 0.3 とする.
start_note = chord([:b1, :b2, :e1, :e2, :b3, :e3].choose, :minor).choose # 開始音を、マイナーコード6種から選
んだ一つのコード、からさらに選んだ1音とする.
final_note = chord([:b1, :b2, :e1, :e2, :b3, :e3].choose, :minor).choose # 終了音 同上
p = play start_note, release: 8, note_slide: 4, cutoff: 30, cutoff_slide: 4, detune: rrand(0, 0.2), pan: rrand(-1, 0),
pan_slide: rrand(4, 8)
# 開始音を余韻 8 拍、前の音からの音程の移動に 4 拍、ローパスフィルタのカットオフ高さを 30(ノート番号)、前
の音のカットオフ値からの移動に 4 拍、音程 0.2 未満ずらした音を混ぜる、パンは左〜中央、パンの移動に 4〜8 拍かける.
control p, note: final_note, cutoff: rrand(80, 120), pan: rrand(0, 1)
# 終了音に対して設定に従い連続的に移動する。カットオフ値は 80〜120、パンは、中央から右
end
end
end
sleep 8
# 8拍の間を置く
end
# 無限ループ終わり
Wob Rhythm
with_fx :reverb do
in_thread do
loop do
r = [0.5, 1.0/3, 3.0/5].choose
8.times do
sample :ambi_choir, rate: r, pan: rrand(-1, 1)
ンダムにして再生する。
sleep 0.5
end
end
end
#
#
#
#
#
#
リバーブをかける
他と並行動作させる.
無限ループ開始
音程となる再生速度を3種からランダムに選ぶ
8回繰り返す
サンプリング音源の:ambi_choir を速度 r で、左右のパンはラ
# 0.5 拍の間を置く
25
end
#メインプログラム
with_fx :wobble, phase: 2 do |w|
# wobble の間隔を 2 拍とし、2拍目のドラム音にモジュレーションをかける.�
# |w|は使われていないが sleep の後に cotrol w, phase: rrand(0.5, 4)等により変化を増やせる.
with_fx :echo, mix: 0.6 do
# エコーを混合度合 0.6 で適用し、ドラムが減衰しながら3回鳴っているようする.
loop do
# 無限ループ開始
sample :drum_heavy_kick
# サンプル音源の drum_heavy_kick を鳴らす.
sample :bass_hit_c, rate: 0.8, amp: 0.4 # 同時に bass_hit_c を、再生速度 0.8、強さ 0.4 で鳴らす.
sleep 1
# 1拍置く
end
# 無限ループはここまで
end
# エコーはここまで
end
# wobble はここまで
Ocean Waves
with_fx :reverb, mix: 0.5 do
# リバーブを混同度合い 0.5 で適用する
loop do
# 無限ループ開始
s = synth [:bnoise, :cnoise, :gnoise].choose, amp: rrand(0.5, 1.5), attack: rrand(0, 4), sustain: rrand(0, 2), release:
rrand(1, 3), cutoff_slide: rrand(0, 3), cutoff: rrand(60, 80), pan: rrand(-1, 1), pan_slide: 1, amp: rrand(0.5, 1)
# 3種のノイズ音源から一つ選び、強さを 0.5〜1.5、音の立ち上がり時間を 0〜4 拍、音の持続時間を 0〜2 拍、余韻
時間を 1〜3 拍、ローパスフィルタのカットオフ音程の変化時間を 0〜3 拍、カットオフ音程を 60〜80、パンを-1〜1、パン
の変化に要する時間を 1 拍、強さを 0.5〜1 とする。
control s, pan: rrand(-1, 1), cutoff: rrand(60, 115)
# 上記設定から音源をパン-1〜1、カットオフ音程 60〜115 に変
化させる.
sleep rrand(2, 3)
# 2〜3 拍置く.
end
end
IDM Breakbeat
define :play_bb do |n|
# 関数 play_bb を定義する.�n の値が与えられて呼び出される.
sample :drum_heavy_kick
# サンプリング音源の drum_heavy_kick を再生する.
sample :ambi_drone, rate: [0.25, 0.5, 0.125, 1].choose, amp: 0.25 if rand < 0.125
# rand が 0.125 以下の場合(1/8 の確率で)この行を実行する.
# ambi_drone を再生速度4種のいずれかで、強さ 0.25 で再生する.
sample :ambi_lunar_land, rate: [0.5, 0.125, 1, -1, -0.5].choose, amp: 0.25 if rand < 0.125
# 同上 ambi_lunar_land を 1/8 の確率で再生する.
sample :loop_amen, attack: 0, release: 0.05, start: 1 - (1.0 / n), rate: [1,1,1,1,1,1,-1].choose
# loop_amen を立ち上がり時間 0、余韻時間 0.05 拍、音源の開始位置 1 - (1.0 / n)、再生速度は、7 種から選ばれる.1/7
の確率で、-1 となり、逆再生(スクラッチ音)となる.
sleep sample_duration(:loop_amen) / n
# サンプル音源 loop_amen の長さの半分の時間置く.
end
loop {play_bb([1,2,4,8,16].choose)}
# 無限ループの中で、定義された関数を n の値を 5 種の中から選んで実行す
る.
# 無限ループは、loop{ } とも書ける.�
# 関数の引数は、( )で囲っても良い.�
Acid Walk
in_thread do
use_synth :fm
sleep 2
loop do
28.times do
sample :drum_bass_hard, amp: 0.8
#
#
#
#
#
#
並列実行する.
fm 音源を使う
2 拍置く
無限ループ開始
28 回繰り返す
サンプリング音源の drum_bass_hard を強さ 0.8 で再生する.
26
sleep 0.25
play :e2, release: 0.2
sample :elec_cymbal, rate: 12, amp: 0.6
で再生する.
sleep 0.25
end
sleep 4
end
end
# 0.25 拍置く.
# 2 オクターブ目の E の音を減衰 0.2 拍で鳴らす.
# サンプリング音源の elec_cymbal を再生速度 12 倍、強さ 0.6
# 0.25 拍置く.
# ここまでを 28 回繰り返す
# 4 拍置く.
# メインプログラム
use_synth :tb303
# 音源を th303 にする
with_fx :reverb do |rev|
# リバーブを設定する.�
loop do
# 無限ループ開始
control rev, mix: rrand(0, 0.3)
# リバーブの mix 値を 0〜0.3 とする
with_fx :slicer, phase: 0.125 do
# 1/8 拍間隔で音をスライスする
sample :ambi_lunar_land, sustain: 0, release: 8, amp: 2
end
control rev, mix: rrand(0, 0.6)
# リバーブの mix 値を 0〜0.6 に変更する.
r = rrand(0.05, 0.3)
# 余韻長さとする r を 0.05〜0.3 とする.
64.times do
# 64 回繰り返す
play chord(:e3, :minor).choose, release: r, cutoff: rrand(50, 90), amp: 0.5
# E のオクターブ 3 のマイナーコードから1音を任意に選び、余韻長さ r、ローパスフィルタのカットオフ音程 50〜
90、強さ 0.5 で鳴らす
sleep 0.125
end
control rev, mix: rrand(0, 0.6)
# リバーブの mix 値を 0〜0.6 に変更する.
r = rrand(0.1, 0.2)
with_synth :prophet do
32.times do
sleep 0.125
play chord(:a3, :m7).choose, release: r, cutoff: rrand(40, 130), amp: 0.7
end
end
control rev, mix: rrand(0, 0.6)
# リバーブの mix 値を 0〜0.6 に変更する.
r = rrand(0.05, 0.3)
32.times do
play chord(:e3, :minor).choose, release: r, cutoff: rrand(110, 130), amp: 0.4
sleep 0.125
end
control rev, mix: rrand(0, 0.6)
# リバーブの mix 値を 0〜0.6 に変更する.
with_fx :echo, phase: 0.25, decay: 8 do # エコーを位相 0.25、減衰を 8 拍とする.�
16.times do
# 16 回繰り返す
play chord([:e2, :e3, :e4].choose, :m7).choose, release: 0.05, cutoff: rrand(50, 129), amp: 0.5
sleep 0.125
end
# 16 回のループはここまで
end
# 無限ループはここまで
end
# リバーブはここまで
end
# tb303 音源はここまで
27
ド レ ミ ファ ソ ラ シ ド ::CC44 ::DD44 ::EE44 ::FF44 ::GG44 ::AA44 ::BB44 ::CC55 6600 6622 6644 6655 6677 6699 7711 7722 Sonic Pi でプッシュフォンのダイアル音を鳴らす
# DTMF sound (Dual-Tone Multi-Frequency)
dial="0123456789ABCD*#" # 鳴らしたいプッシュボタンを文字列で与える
hi=[1209,1336,1477,1633]
lo=[697,770,852,941]
pushButton=[["1","2","3","A"],
["4","5","6","B"],
["7","8","9","C"],
["*","0","#","D"]]
# 高音側の周波数
# 低音側の周波数
# プッシュボタンの並び
define :dtmfPlay do |d|
# d に鳴らしたいボタンの文字が入り、音を鳴らす関数
for i in 0...4 # lo
for j in 0...4 # hi
if(d == pushButton[i][j]) # 鳴らしたいボタンに一致する並びを調べる
play hz_to_midi(lo[i]),attack: 0.05 ,release: 0.3 # 低音側の音を鳴らす、アタックは弱め、余韻は短め
play hz_to_midi(hi[j]),attack: 0.05 ,release: 0.3 # 高音側の音を鳴らす(2音は同時に鳴る)
end
end
end
end
for i in 0...dial.length
puts dial[i]
dtmfPlay dial[i]
sleep 0.5
end
# dial の配列から1文字取り出して、音を鳴らす関数を呼ぶ
# 間隔を与える
Wikipedia の DTMF より引用
28
Sonic Pi で鳴る2つの音を x,y 座標、音量を直径として
円が描かれる。色はランダム。
Sonic Pi と Processing の連携
SonicPi と Processing のどちらかで、テキストファイルに値を書き込み、もう一方で同そのファイルから値を読み込みます。
教室等でのユーザーの権限やソフトウェアのインストールに関して制限された環境でも動作させることができます。
Sonic Pi → Processing のケース
Sonic Pi で同時に鳴るランダムな2つの音の音程と音量を x,y,r として3つのファイル(場所は Processing プログラムのフォルダ中)
に書き出す。
Processing で、ファイルから値を読み込んで、x、y を中心とし、r を半径とした円をランダムな色で描く。
リアルタイムではあるが、書き出す側と読み込む側の同期はしていない。
Sonic Pi 側
use_debug false
use_random_seed 0
loop do
x=rrand(48,96)
y=rrand(48,96)
r=rrand(0.1,5)
File.write("Processing プログラムへのパス/SonicPi_to_Processing/SPtest1.txt",x)
File.write("Processing プログラムへのパス/SonicPi_to_Processing/SPtest2.txt",y)
File.write("Processing プログラムへのパス/SonicPi_to_Processing/SPtest3.txt",r)
play [x,y],amp:r
sleep 0.25
end
Pricessing 側
// Sonic Pi の2つの音とその強さの値を Processing の data ディレクトリにファイル出力し、読み込んでグラフィック表示する。
// Sonic Pi 側の書き込み中に Processing 側で読み込むと値がないファイルとなってエラーするため、読み込んだ配列の長さが0かど
うかを調べている。
void setup() {
size(600, 600);
background(0);
strokeWeight(5);
colorMode(HSB);
frameRate(5);
}
void draw() {
float x=0,y=0,r=0;
fill(0,2);
rect(-5,-5,width+10,height+10);
String[] s1 = loadStrings("SPtest1.txt");
String[] s2 = loadStrings("SPtest2.txt");
String[] s3 = loadStrings("SPtest3.txt");
if(s1.length>0) x=(float(s1[0])-48+1)*width/48.;
if(s2.length>0) y=(float(s2[0])-48+1)*height/48.;
if(s3.length>0) r=(float(s3[0]))*20.0;
fill(random(255),255,255);
stroke(random(255),255,255);
ellipse(x, y, r, r);
// println(x+" "+y+" "+r);
}
29
Processing のプログラムで、マウスクリックをする。
クリック時間で円の直径と音量が変わる。
Sonic Pi と Processing の連携
Processing → Sonic Pi のケース
Processing 側で、マウスで画面をクリックした場所に円を描く。円の座標�を2つの音程とし、円の半径はクリックしていた時間から生成
し、それを音量とする。これら3つの値を3つのファイルに書き出す。
Sonic Pi 側で3つのファイルを読み込み、2つの音を少しずらして鳴らし、読み込んだ音量で鳴らす。鳴らす間隔は 1/4 拍に固定。
リアルタイムではあるが、2つのプログラムは、同期していない。
Processing 側
// Processing_to_SonicPi
PrintWriter fx,fy,fr;
float x,y,r;
float xmin=48,xmax=96;
float msec;
void setup(){
size(600,600);
background(255);
stroke(255,0,0);
strokeWeight(1);
msec=millis();
}
void draw(){
fill(255,255,255,5);
rect(-5,-5,width+10,height+10);
}
void mousePressed(){
msec=millis();
}
void mouseReleased(){
noFill();
x=mouseX*(xmax-xmin)/width+xmin;
y=mouseY*(xmax-xmin)/height+xmin;
r=map(millis()-msec , 0 , 1000, 0 , 5);
if(r>5) r=5;
strokeWeight(r*2);
ellipse(mouseX,mouseY,r*30,r*30);
println(x+"
"+y+"
"+r);
fx=createWriter("SPtest1.txt");
fy=createWriter("SPtest2.txt");
fr=createWriter("SPtest3.txt");
fx.println(x);
fy.println(y);
fr.println(r);
fx.flush();
fy.flush();
fr.flush();
fx.close();
fy.close();
fr.close();
}
Sonic Pi 側
# Processing_to_SonicPi
use_synth :dsaw
loop do
x=File.open("Processing プログラムへのパス/Processing_to_SonicPi/SPtest1.txt").read.split(" ")
y=File.open("Processing プログラムへのパス/Processing_to_SonicPi/SPtest2.txt").read.split(" ")
r=File.open("Processing プログラムへのパス/Processing_to_SonicPi/SPtest3.txt").read.split(" ")
play x[0].to_f, amp: r[0].to_f
sleep 0.05
play y[0].to_f, amp: r[0].to_f
sleep 0.2
end
# 行末コードによるエラーが、.read.split(" ") によって解消したので、そのまま使用。
30
Sonic Pi のテルミンを Processing で演奏
(上記のテキストファイルを介した連携と同じ原理)
Processing 側でマウスを左右に動かすと Sonic Pi テルミンの音程が変わり、上下に動かすと音量が変わります。 Sonic Pi 側
# Processing_to_SonicPi_Theremin
s= play :C4, sustain: 99999, note_slide: 0.1, amp: 1, amp_slide: 0.1, amp_slide_shape: 1
sleep 0.1
loop do
x=File.open("パス/Documents/Processing/Processing_to_SonicPi_Theremin/SPtest1.txt").read.split(" ")
y=File.open("パス/Documents/Processing/Processing_to_SonicPi_Theremin/SPtest2.txt").read.split(" ")
control s, note: x[0].to_f, amp: y[0].to_f
sleep 0.1
end
# 行末の.read.split(" ")は、データをスペースで分離して配列に格納する機能ですが、これを付けることで行末コードのエラーが回避
できたため利用しました。
Processing 側
// Processing_to_SonicPi_Theremin
PrintWriter fx,fy;
float x,y;
float xmin=48,xmax=94;
void setup(){
size(600,600);
background(255);
stroke(255,0,0);
strokeWeight(5);
}
void draw(){
fill(255,255,255,5);
rect(-5,-5,width+10,height+10);
noFill();
x=map(mouseX, 0,width,xmin,xmax);
y=map(mouseY, 0,height,0.1,5);
ellipse(mouseX,mouseY,5,5);
println(x+" "+y);
fx=createWriter("SPtest1.txt");
fy=createWriter("SPtest2.txt");
fx.println(x);
fy.println(y);
fx.flush();
fy.flush();
fx.close();
fy.close();
}
Twitter で公開
# Sonic Pi のみのランダムテルミン
s= play :C4, sustain: 99999, note_slide: 0.1, amp: 1, amp_slide: 0.1, amp_slide_shape: 1
sleep 0.5
loop do
x=rrand(60,72)
y=rrand(0.2,2)
control s, note: x, amp: y
sleep rrand(0.2,2)
end
31
Sonic Pi で竹内関数
竹内関数は Lisp で考案されましたが、多くのプログラミング言語で書かれています。音楽用には Sonic Pi での記述が最も容易だと思わ
れます。
自分自身を呼び出す、再帰的に呼び出される関数が使用されています。
use_bpm 130
define :tarai do |x,y,z|
# 関数の定義
a=[:D4,:E4,:F4,:G4,:A4,:B4,:C5,:D5,:E5,:F5,:G5,:A5,:B5]
2.times do
puts x,y,z
play_pattern_timed [a[x+1],a[x+1]+12,a[y+1],a[y+1]+12,a[z+1],a[z+1]+12,a[y+1],a[y+1]+12],0.25
end
n=n+1
if(x<=y)
return y
else
return tarai( tarai(x-1,y,z), tarai(y-1,z,x), tarai(z-1,x,y))
end
end
tarai 10,5,0
# 関数の実行
参考
Wikipedia 竹内関数 https://ja.wikipedia.org/wiki/竹内関数
Tarai Function Music
http://aikelab.net/tarai/
竹内関数で音楽生成 aike クリプトン・フューチャー・メディア 藍圭介さん http://d.hatena.ne.jp/aike/20111112
ハッカーの遺言状──竹内郁雄の徒然苔 第 18 回:問題児も悪くない https://cybozushiki.cybozu.co.jp/articles/m000434.html
# 関数の定義は、より Ruby 的に書くこともできました
use_bpm 130
def tarai(x,y,z)
# 関数の定義
a=[:D4,:E4,:F4,:G4,:A4,:B4,:C5,:D5,:E5,:F5,:G5,:A5,:B5]
2.times do
puts x,y,z
play_pattern_timed [a[x+1],a[x+1]+12,a[y+1],a[y+1]+12,a[z+1],a[z+1]+12,a[y+1],a[y+1]+12],0.25
end
n=n+1
if(x<=y)
return y
else
return tarai( tarai(x-1,y,z), tarai(y-1,z,x), tarai(z-1,x,y))
end
end
tarai(10,5,0)
# 関数の実行
32
# ランダム般若心経
#
#
#
#
#
#
random HannyaSinggyo (Heart Sutra)
般若心経をランダムな位置から、指定した拍数 cycleTime だけ読み上げ、これを繰り返します。
拍の最初と中間に、鳴り物を入れてあります。
音源は、mp3 ファイルを wav に変換して使用。(MP3 は Sonic Pi で読み込み不可です)
たまたま使用させてもらった音源は、
http://www.sakado-jigenji.jp/dl/hannyashingyou_b.mp3
use_random_seed 1
filepath="パス to /hannyashingyou_b.wav" # 音声ファイルの指定
totalTime=sample_duration filepath
# 全体の長さを知る
cycleTime=2.0
# 一度に読み上げる単位となる拍数
limitTime=1-cycleTime/totalTime
sleep 1
# 全長を超えた開始時間を与えないための限界時間
live_loop :speech1 do
startTime=rand
# 0〜1のランダムな開始位置を与える
startTime=limitTime if startTime > limitTime # 終了位置が全長を超えた場合には限界時間とする
puts startTime, startTime+cycleTime/totalTime
puts startTime*totalTime, startTime*totalTime+cycleTime
sample filepath ,start: startTime , finish: startTime+cycleTime/totalTime
# 以下の2行は、基音 C に対して E(+4),G(+4)にあたる音程に変化させた声であり、合唱風?になる。
# sample filepath ,start: startTime , finish: startTime+cycleTime/totalTime, pitch: 4
# sample filepath ,start: startTime , finish: startTime+cycleTime/totalTime, pitch: 7
sleep cycleTime
end
live_loop :drum1 do
play 60,release: 0.2
sleep cycleTime/2.0
play 72,release: 0.2
sleep cycleTime/2.0
end
音がブツ切れになる場合には、attack:0.1 や release:0.1 等で、音の先頭や末尾をソフトにすることもできる。
sample 文は、このくらい増やしても面白い
sample filepath ,start: startTime , finish: startTime+cycleTime/totalTime, pitch: -5,amp:3
sample filepath ,start: startTime , finish: startTime+cycleTime/totalTime
sample filepath ,start: startTime , finish: startTime+cycleTime/totalTime, pitch: 4
sample filepath ,start: startTime , finish: startTime+cycleTime/totalTime, pitch: 7,amp:0.5
sample filepath ,start: startTime , finish: startTime+cycleTime/totalTime, pitch: 12,amp:0.3
# 円周率 1000000 桁音楽
(百万)
πの 1000000 桁が1行に書き込まれているテキストファイル pi1000000.txt は、下記から入手できます。
https://www.angio.net/pi/digits.html
これを適当な場所に置いて、1文字づつ読み込んで音にします。
pi=File.open("ファイル pi1000000.txt へのパス").read
for i in 0...pi.length
play pi.slice(i, 1).to_i*2+60
sleep 0.125
end
変数 pi に文字としていっぺんに読み込まれるので、1文字ずつ取り出して整数に変換して使用します。
下記のように、2桁ずつ取り出すなどの工夫も容易にできます。
for i in (0...pi.length).step(2)
play pi.slice(i, 2).to_i+40
sleep 0.125
end
1 千百万桁のファイル Pi_10000000.txt (10MB) は、
http://little-scale.blogspot.jp/2011/06/pi-to-10000000-decimal-places-in-text.html
から入手でき、同様に使用できます。
33
低い音 MIDI ノート番号と音名と周波数
!
周波数 = 440× 2!"
(平均律、A4=440)
!"#"番号 ! !"
中央
のド
高い音 低すぎて聞
こえない音
時報や
音叉の
ラ
34
若者にしか
聞こえない音
35