[obsidian] vault backup: 2024-07-08 21:54:39[
All checks were successful
Build / build (push) Successful in 5m34s
All checks were successful
Build / build (push) Successful in 5m34s
This commit is contained in:
parent
110831e915
commit
b3ff6d8eca
@ -110,17 +110,6 @@ fn dsp (input){
|
|||||||
delayはどうしておくかというと、最初の8バイトは現在のリングバッファの位置、残りをメモリという扱いにすれば良い。ただメモリのサイズを決定すんのがなあ〜
|
delayはどうしておくかというと、最初の8バイトは現在のリングバッファの位置、残りをメモリという扱いにすれば良い。ただメモリのサイズを決定すんのがなあ〜
|
||||||
|
|
||||||
|
|
||||||
中間表現では関数呼び出し、即値の読み込みはラベル使ってやるので十分かあ
|
|
||||||
そうなるとローカルの名前リネームは必要
|
|
||||||
|
|
||||||
VM自体のstate_sizeの保存には結局コールツリーを辿る必要が出てくる?
|
|
||||||
pushfeedoffsetでバイトオフセットの値をトレースするためには結局applyの式を辿る必要はある
|
|
||||||
コールツリーのトラバースをし始めるとワンパスコンパイラとしての旨みがなくなる
|
|
||||||
|
|
||||||
feedはlambdaに閉じ込められてletrecにbindされてるのがちょっと面倒
|
|
||||||
|
|
||||||
まあでも結局ユーザー層に隠蔽するにはここで静的解析するしかないのか
|
|
||||||
あれ、でもこの静的解析って結局多段階でいうところのstage 0 の評価に相当するやつなのでは
|
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
fn fbdelay(input:float,fb:float,dtime:float)->float{
|
fn fbdelay(input:float,fb:float,dtime:float)->float{
|
||||||
@ -135,4 +124,83 @@ fn dsp (input:float)->float{
|
|||||||
return twodelay(input,400)+twodelay(input,800)
|
return twodelay(input,400)+twodelay(input,800)
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### だめかも
|
||||||
|
|
||||||
|
関数型を受け取って関数を返す`filterbank`的な例がこれだとダメなことに気がついた。少なくともリニアでフラットな内部状態ストレージでは実現無理。
|
||||||
|
|
||||||
|
```rust
|
||||||
|
fn onepole(x,g){
|
||||||
|
x*(1.0-g) + self*g
|
||||||
|
}
|
||||||
|
fn filterbank(n,filter){
|
||||||
|
let next = filterbank(n-1,filter);
|
||||||
|
if (n>0){
|
||||||
|
|x,freq| filter(x,freq+n*100) +next(x,freq)
|
||||||
|
}else{
|
||||||
|
|x,freq| filter(x,freq+n)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
let myfilter = filterbank(3,onepole)
|
||||||
|
```
|
||||||
|
|
||||||
|
みたいな感じだとすると
|
||||||
|
```
|
||||||
|
fn onepole(x,g){
|
||||||
|
movc 2 "1"
|
||||||
|
mov 3 1
|
||||||
|
sub 2 2 3
|
||||||
|
mul 2 0 2
|
||||||
|
mov 3 1
|
||||||
|
getstate 4 0
|
||||||
|
mul 3 3 4
|
||||||
|
add 3 2 3
|
||||||
|
|
||||||
|
}
|
||||||
|
fn lambda_true(x,freq){ // x:0 freq:1
|
||||||
|
getupvalue 2 0 //get n
|
||||||
|
movc 3 "100"
|
||||||
|
mul 2 2 3
|
||||||
|
add 1 1 2
|
||||||
|
getupvalue 2 1 //get filter
|
||||||
|
mov 4 0
|
||||||
|
mov 3 1
|
||||||
|
callcls 2 2 1
|
||||||
|
getupvalue 3 2 //get next
|
||||||
|
mov 4 0
|
||||||
|
mov 5 1
|
||||||
|
callcls 3 2 1
|
||||||
|
movc 3 "1"
|
||||||
|
add 3 3 4
|
||||||
|
ret 3 1
|
||||||
|
}
|
||||||
|
fn lambda_false(x,freq){// x:0 freq:1
|
||||||
|
getupvalue 2 0 //get n
|
||||||
|
add 2 2 1
|
||||||
|
getupvalue 3 1 //get filter
|
||||||
|
mov 4 0
|
||||||
|
mov 5 2
|
||||||
|
callcls 3 2 1
|
||||||
|
ret 3 1
|
||||||
|
}
|
||||||
|
fn filterbank (n,filter){ //n:0 filter: 1
|
||||||
|
movc 2 "-1"
|
||||||
|
sub 2 0 2
|
||||||
|
mov 3 "filterbank"
|
||||||
|
mov 4 1
|
||||||
|
mov 5 2
|
||||||
|
call "filterbank" 2 1 //now stack 2 is a closure "next"
|
||||||
|
mov 3 0
|
||||||
|
movc 4 "0"
|
||||||
|
eq 3 3 4
|
||||||
|
jmpifneg 3 :_else:
|
||||||
|
closure 3 "lambda_true"
|
||||||
|
jmp :return:
|
||||||
|
:else:
|
||||||
|
closure 3 "lambda_false"
|
||||||
|
:return:
|
||||||
|
ret 3 1
|
||||||
|
}
|
||||||
|
```
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 809b7bc1171c14667e40a226697cda9decd8677f
|
Subproject commit 8342ed7e3554540a6412c4182134d0e8b96b1be1
|
Loading…
Reference in New Issue
Block a user