[obsidian] vault backup: 2024-10-30 17:07:08[
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				Build / build (push) Has been cancelled
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	Build / build (push) Has been cancelled
				
			This commit is contained in:
		@@ -3,6 +3,79 @@ date: 2024-10-30 15:42
 | 
				
			|||||||
---
 | 
					---
 | 
				
			||||||
#mimium
 | 
					#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の順序保証とか考える
 | 
				
			||||||
 | 
					
 | 
				
			||||||
正格評価だとIOモナドとかはそもそも考える必要がない
 | 
					正格評価だとIOモナドとかはそもそも考える必要がない
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user