Compare commits
5 Commits
793b522b3f
...
74fd2c3836
Author | SHA1 | Date | |
---|---|---|---|
74fd2c3836 | |||
b409e874d8 | |||
8a03c67fe3 | |||
d44b9a151b | |||
3808c2bf68 |
3
content/.obsidian/community-plugins.json
vendored
3
content/.obsidian/community-plugins.json
vendored
@ -5,5 +5,6 @@
|
|||||||
"obsidian-local-rest-api",
|
"obsidian-local-rest-api",
|
||||||
"obsidian-excalidraw-plugin",
|
"obsidian-excalidraw-plugin",
|
||||||
"obsidian-git",
|
"obsidian-git",
|
||||||
"obsidian-auto-link-title"
|
"obsidian-auto-link-title",
|
||||||
|
"2hop-links-plus"
|
||||||
]
|
]
|
2
content/.obsidian/core-plugins.json
vendored
2
content/.obsidian/core-plugins.json
vendored
@ -19,7 +19,7 @@
|
|||||||
"zk-prefixer": false,
|
"zk-prefixer": false,
|
||||||
"random-note": false,
|
"random-note": false,
|
||||||
"outline": true,
|
"outline": true,
|
||||||
"word-count": true,
|
"word-count": false,
|
||||||
"slides": false,
|
"slides": false,
|
||||||
"audio-recorder": false,
|
"audio-recorder": false,
|
||||||
"workspaces": false,
|
"workspaces": false,
|
||||||
|
2
content/.obsidian/graph.json
vendored
2
content/.obsidian/graph.json
vendored
@ -17,6 +17,6 @@
|
|||||||
"repelStrength": 11.1808268229167,
|
"repelStrength": 11.1808268229167,
|
||||||
"linkStrength": 0.893798828125,
|
"linkStrength": 0.893798828125,
|
||||||
"linkDistance": 48,
|
"linkDistance": 48,
|
||||||
"scale": 0.15383699374609286,
|
"scale": 0.7181374393724258,
|
||||||
"close": true
|
"close": true
|
||||||
}
|
}
|
10
content/Computation Expression.md
Normal file
10
content/Computation Expression.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
date: 2024-10-30 14:39
|
||||||
|
---
|
||||||
|
#programming
|
||||||
|
|
||||||
|
[[FSharp|F#]]で使えるDSLを構築する方法。
|
||||||
|
|
||||||
|
[[Haskell]]のdo式をユーザーでカスタマイズできる・・・みたいな感じだと思う。
|
||||||
|
|
||||||
|
[Computation expressions: Introduction | F# for fun and profit](https://fsharpforfunandprofit.com/posts/computation-expressions-intro/)
|
8
content/FSharp.md
Normal file
8
content/FSharp.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
date: 2024-10-30 14:35
|
||||||
|
---
|
||||||
|
#programming-language
|
||||||
|
|
||||||
|
C#のランタイムである.Net上で動く関数型言語。
|
||||||
|
|
||||||
|
[[Computation Expression]]とか独自のDSLを構築する方法で有名
|
@ -4,7 +4,7 @@ date: 2024-10-29 14:06
|
|||||||
|
|
||||||
#person #stub
|
#person #stub
|
||||||
|
|
||||||
プログラミングの思想の哲学などの研究者。[[F#]]が好きらしい。
|
プログラミングの思想の哲学などの研究者。[[FSharp|F#]]が好きらしい。
|
||||||
|
|
||||||
[Tomas Petricek - New ways of thinking about programming](https://tomasp.net/)
|
[Tomas Petricek - New ways of thinking about programming](https://tomasp.net/)
|
||||||
|
|
||||||
|
100
content/mimiumでMIDIインプットを実装.md
Normal file
100
content/mimiumでMIDIインプットを実装.md
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
---
|
||||||
|
date: 2024-10-30 15:42
|
||||||
|
---
|
||||||
|
#mimium
|
||||||
|
|
||||||
|
## 要件
|
||||||
|
|
||||||
|
どこまでMIDIインプットをmimiumの世界の外側として捉えるか
|
||||||
|
|
||||||
|
|
||||||
|
### 先行例
|
||||||
|
|
||||||
|
[[SuperCollider]]や[[ChucK]]はコールバックを登録するようなイメージ
|
||||||
|
|
||||||
|
[Using MIDI | SuperCollider 3.12.2 Help](https://doc.sccode.org/Guides/UsingMIDI.html
|
||||||
|
|
||||||
|
```smalltalk
|
||||||
|
s.boot;
|
||||||
|
|
||||||
|
(
|
||||||
|
var notes, on, off;
|
||||||
|
|
||||||
|
MIDIClient.init;
|
||||||
|
MIDIIn.connectAll;
|
||||||
|
|
||||||
|
notes = Array.newClear(128); // array has one slot per possible MIDI note
|
||||||
|
|
||||||
|
on = MIDIFunc.noteOn({ |veloc, num, chan, src|
|
||||||
|
notes[num] = Synth(\default, [\freq, num.midicps,
|
||||||
|
\amp, veloc * 0.00315]);
|
||||||
|
});
|
||||||
|
|
||||||
|
off = MIDIFunc.noteOff({ |veloc, num, chan, src|
|
||||||
|
notes[num].release;
|
||||||
|
});
|
||||||
|
|
||||||
|
q = { on.free; off.free; };
|
||||||
|
)
|
||||||
|
|
||||||
|
// when done:
|
||||||
|
q.value;
|
||||||
|
```
|
||||||
|
|
||||||
|
まあこれはDSPアウトプットの合成が.playで暗黙的に行える(加算で合成されるという想定)だからできることかな、、、
|
||||||
|
|
||||||
|
ChuckもボイスごとにShredを生やす方向で対応してるからちょっと微妙だ
|
||||||
|
|
||||||
|
[Chuck - Input & Output](https://chuck.stanford.edu/doc/reference/io.html#MidiIn)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
現実的には、[[Faust]]のように、ボイスアロケーターは外側で実装してしまい、非同期に更新されうるAtomicな値のセルをノートやccのデータとして受け取れるようにすれば当面は十分
|
||||||
|
|
||||||
|
が、最終的にはMIDIエフェクト(MIDI信号自体のディレイやクォンタイズ、スロットリングとか)を[[FUnctional Reactive Programming|FRP]]っぽく書けると嬉しい
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Noteのバインドの記法
|
||||||
|
|
||||||
|
```rust
|
||||||
|
let channel:()->float = bind_midi_note_mono(channel)
|
||||||
|
|
||||||
|
channel() //値の取り出し
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
```rust
|
||||||
|
//rust
|
||||||
|
fn bind_midi_note_mono(vm:&mut Machine)->ReturnCode{
|
||||||
|
let ch = vm.get_stack(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
IOの順序保証とか考える
|
||||||
|
|
||||||
|
正格評価だとIOモナドとかはそもそも考える必要がない
|
||||||
|
|
||||||
|
[Algebraic Effects入門](https://v2.aintek.xyz/posts/introduction-to-algebraic-effects)
|
||||||
|
|
||||||
|
> `type 'a io = unit -> 'a`
|
||||||
|
> 純粋な値は以下のようなIOモナドにリフトできる。
|
||||||
|
> `let return x = fun () -> x`
|
||||||
|
> 計算はバインド演算子によってつなげることができる。
|
||||||
|
> `let (>>=) c1 c2 = fun () -> c2 (c1 ())`
|
||||||
|
|
||||||
|
mimiumだとバインド演算子ってこうか(ジェネリクスが必要だけども)
|
||||||
|
|
||||||
|
```rust
|
||||||
|
fn bind(f1,f2){
|
||||||
|
| | f1() |> f2
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1 +1 @@
|
|||||||
Subproject commit c82a68bb21e4543f695d6e963194a44e246ddf0a
|
Subproject commit 290bc582d6210c7181eca8ed60ae467293b9de19
|
Loading…
Reference in New Issue
Block a user