52 lines
2.3 KiB
Markdown
52 lines
2.3 KiB
Markdown
|
||
#memo #mimium
|
||
|
||
## SuperCollider
|
||
|
||
[[SuperCollider]]のPatternに相当するものを作ってみたい。
|
||
|
||
[Pattern Guide 03: What Is Pbind | SuperCollider 3.14.0-dev Help](https://doc.sccode.org/Tutorials/A-Practical-Guide/PG_03_What_Is_Pbind.html)
|
||
|
||
Pattern自体は基本的にはシンプルな遅延リスト。だが値の種類を、ピッチと長さとかグループ化できてジェネリックなので、静的型付け言語だとジェネリクスがいる(`next`メソッドを持つ型クラスとかインターフェース的なものが欲しくなる)
|
||
|
||
```smalltalk
|
||
p = Pbind(\degree, Pwhite(0, 7, inf), \dur, 0.25, \legato, 1).play;
|
||
p.stop;
|
||
```
|
||
|
||
重要ポイント
|
||
|
||
- あるパターンを先に構築して、それにあとから適当なシンセを当てはめることもできる
|
||
- 数値リテラルが定数(不変)パターンに自動キャストされていることで、パターンのリストの要素にさらに別のパターンを埋め込むことができる
|
||
|
||
`Pbind`は実際には遅延リストを実行してイベント(キーバリューの辞書ペア集合)のリストを得ている
|
||
|
||
mimiumでやろうとすると、パターン型が再帰型になるので、自動で型推論とかは無理になるな
|
||
|
||
[[FoxDot]]だと空白が意味を持つ
|
||
|
||
一定間隔の値の変化を扱うのはmimiumでもMetroつかえばできる、長さを可変にするときの抽象化ってどうします?
|
||
|
||
Duration+Restで相対的に表現する?普通のシーケンサーならDuration一定と考えるのが普通
|
||
|
||
|
||
|
||
---
|
||
|
||
|
||
|
||
`.play`を実行すると、`EventStreamPlayer`クラスがいろいろ頑張ってくれるらしい
|
||
|
||
`instrument`の指定なしにPbindすると、デフォのシンセが鳴る
|
||
durとかdegreeみたいなのをいい感じに解釈するのはEventStreamPlayerの役割ってことか?
|
||
|
||
[supercollider/SCClassLibrary/Common/Streams/Stream.sc at d4b6f8d5e6c9e419c86b3c44d899b63b4610893b · supercollider/supercollider · GitHub](https://github.com/supercollider/supercollider/blob/d4b6f8d5e6c9e419c86b3c44d899b63b4610893b/SCClassLibrary/Common/Streams/Stream.sc#L491)
|
||
|
||
ここでもなさそうだな、謎・・・。
|
||
|
||
まあでも,degreeとfreqの自動変換とかは[[単位変換のための型システム]]で解決すべき問題かも
|
||
|
||
|
||
|
||
|