Compare commits

..

5 Commits

4 changed files with 137 additions and 1 deletions

22
content/Moog Guitar.md Normal file
View File

@@ -0,0 +1,22 @@
---
date: 2025-07-01 16:24
---
#instrument
[[Paul Vo]]が開発した特殊な[[サスティナー]]を内蔵したエレキギター. ドライバーコイルとピックアップコイルが兼用されているのが特徴。サスティナーの逆で強制ミュートみたいなこともできるというのが面白い。
[Licensing: \| Paul Vo](https://web.archive.org/web/20240902205915/https://voinventions.com/licensing/)
特許
(2019年で切れた)
[US6216059B1 - Unitary transducer control system - Google Patents](https://patents.google.com/patent/US6216059B1)
2025年に切れる予定
[US7667131B2 - Player technique control system for a stringed instrument and method of playing the instrument - Google Patents](https://patents.google.com/patent/US7667131B2/)
シャント抵抗で読み取ってるかと思いきや時間重畳なのかな

View File

@@ -68,4 +68,108 @@ fn repl_001(){
だし、これだと結局OSC送るサーバークライアント構成と実質的に変わらないかも
```rust
let hoge = 100;
```
みたいなのの代わりに、別のキーワードを持たせる
```rust
global hoge = 100
```
プリミティブな型であれば、Atomicな書き換えでOK。hogeへの書き込みをオーディオコンテキストの中でやると毎サンプル実行される保証がない、みたいな仕様
タプルとか合成型だと、マルチスレッドで書き換えたときに片方のパラメーターが更新されてない時に読み取られる可能性が厳密にはある
グローバルに宣言された配列型とか、合成型をどうやって扱う?
単に、グローバルな値への書き込みがいつ行われるか保証はされませんよ、という仕様にするならそれでも十分か
もしくは、
```rust
let hoge = param(100)
```
みたいなラップの仕方を考える。hogeは`Param<Number>`型をもち、Number型に自動キャストできる。
パラメトリックフィルタ複製で、個々の周波数を外側からコントロールしたいとするとどうなるか
```rust
fn replicate(n,gen){
let g = gen(n, n*100)
if (n>0.0){
let c = replicate(n - 1.0,gen)
| | g() + c()
}else{
| | g()
}
}
fn mygen(freq){
osc(freq)
}
fn gen(n,init_f){
let channel = param("freq_%n",init_f);
| | mygen(channel)
}
let myfilter = replicate(5,gen)
fn dsp(){
myfilter()
}
```
まあこうなるか 自動グループ化みたいなのできるか?実行してる関数の深さ的に`global::replicate::gen::(args)`で自動ネーミング自体は不可能ではなさそうだが/自動グループをやりたければ、`Param<T>`の中身をレコード型にすればいいのか
paramがジェネリックな関数`T->Param<T>`であることが重要になってくる。範囲の制限とかはRanged型みたいなのをmimium側で定義すればよくなる・・・はずまあIO周りは結局命令型になるのかなあ
```rust
let channel = param("freq_%n",init_f);
set_param("freq_%n",1000.0)
channel = 1000;//
```
最後の行のように、普通にAssign書き込むのもできるようにしておきたい。これできるようにするには、Assignをオーバーロードできるような型システムが必要なのかな`param(コンストラクタ)``get_param_name``get_param``set_param`の4種類があれば十分か
[[mimiumのレコード型]]のデフォルト実装、関数のデフォルト引数の組み合わせに対して自動でパラメーターが作られるようにしたい
```rust
fn gen_synthesizer(){
let s = |gate = 0,freq=1000,gain = 1.0|{
...
}
s({..})
}
let mysynth = gen_synthesizer();
fn dsp(){
mysynth()
}
```
これを実行すると、隠れレコード構造体定義とグローバルなデフォルト引数が作られる
```rust
...
type defaultarg = {
"gate":number = 0,
"freq":number = 1000,
"gain":number = 1.0
}
let default_arg_for_mysynth = param("mysynth",defaultarg::default());
fn dsp(){
mysynth()
}
```
dsp内で`mysynth({..})`と実行してしまうと、これがグローバルなコンテキストで作られない可能性がある・・のか?いや、でも基本的に書き換えられる心配はないからいいのかな
デフォルト引数構造体のインスタンスはグローバル評価で行われて、
ということは、とりあえず雑にParamを実装して

View File

@@ -54,6 +54,16 @@ EBowは回路的に出力をにフィードバックしてるからコンパ
これって、インプットコイルとアウトプットコイルを兼用することってできないのかな
→できそう。Back-EMFの検出というらしい [スピーカーの逆起電力「バック」ってどう扱うのEXCURIO](https://note.com/excurio_8877/n/na7366990c885) [[Moog Guitar]]で実現されている。
原理的にはこのくらいの回路でも良さそうだな
[AB-021: Measuring RPM from Back EMF - Precision Microdrives](https://www.precisionmicrodrives.com/ab-021)
---
[[Andrew McPherson]]の[[Magnetic Resonator Piano]]だと1個あたり4オームの電磁石を20Wぐらいのパワーで鳴らしてるらしいトランスコンダクタンスアンプを自分で実装してるっぽかったけど謎
ギターの弦なら10Wぐらいでもなんとかなるのかなというか、やっぱりE-Bowが[[LM386]]で0.7Wとかのパワーであれだけ鳴らせるのがやっぱり不思議というか