Compare commits

...

66 Commits

Author SHA1 Message Date
de3da1f6a1 [obsidian] vault backup: 2025-08-01 13:05:00[
Some checks failed
Build / build (push) Failing after 14m32s
2025-08-01 13:05:00 +09:00
3d7c9c9048 [obsidian] vault backup: 2025-07-31 19:25:07[
Some checks failed
Build / build (push) Failing after 14m32s
2025-07-31 19:25:07 +09:00
b32ef1d348 [obsidian] vault backup: 2025-07-31 18:24:57[
Some checks failed
Build / build (push) Failing after 14m44s
2025-07-31 18:24:57 +09:00
bb453aba6b [obsidian] vault backup: 2025-07-31 14:24:30[
All checks were successful
Build / build (push) Successful in 6m45s
2025-07-31 14:24:30 +09:00
bab3afd790 [obsidian] vault backup: 2025-07-31 12:24:15[
All checks were successful
Build / build (push) Successful in 9m35s
2025-07-31 12:24:15 +09:00
17df20a502 [obsidian] vault backup: 2025-07-26 10:59:10
Some checks failed
Build / build (push) Failing after 10m35s
2025-07-26 10:59:10 +09:00
51fa440e02 [obsidian] vault backup: 2025-07-25 21:06:47[
All checks were successful
Build / build (push) Successful in 11m19s
2025-07-25 21:06:47 +09:00
245acb784e [obsidian] vault backup: 2025-07-24 22:59:15[
All checks were successful
Build / build (push) Successful in 11m40s
2025-07-24 22:59:16 +09:00
baa447e054 [obsidian] vault backup: 2025-07-24 18:23:12[
All checks were successful
Build / build (push) Successful in 10m8s
2025-07-24 18:23:12 +09:00
b595629042 [obsidian] vault backup: 2025-07-22 23:44:33[
All checks were successful
Build / build (push) Successful in 8m41s
2025-07-22 23:44:33 +09:00
08a1cc5b30 [obsidian] vault backup: 2025-07-22 22:44:10[
Some checks failed
Build / build (push) Failing after 10m25s
2025-07-22 22:44:10 +09:00
81fbd200a8 [obsidian] vault backup: 2025-07-22 18:09:04[
Some checks failed
Build / build (push) Failing after 10m43s
2025-07-22 18:09:04 +09:00
6ef107b199 [obsidian] vault backup: 2025-07-22 17:09:00[
All checks were successful
Build / build (push) Successful in 9m15s
2025-07-22 17:09:00 +09:00
b3646b2c71 [obsidian] vault backup: 2025-07-21 21:43:09[
All checks were successful
Build / build (push) Successful in 9m45s
2025-07-21 21:43:09 +09:00
0eba0d32f6 Merge remote-tracking branch 'home/v4' into v4
All checks were successful
Build / build (push) Successful in 8m3s
2025-07-20 20:41:07 +09:00
e4d9573ffb [obsidian] vault backup: 2025-07-20 12:34:46[
Some checks failed
Build / build (push) Failing after 14m46s
2025-07-20 12:34:46 +09:00
101d6203a3 [obsidian] vault backup: 2025-07-20 11:34:26[
Some checks failed
Build / build (push) Failing after 10m7s
2025-07-20 11:34:27 +09:00
a5e33b30b3 [obsidian] vault backup: 2025-07-20 10:34:06[
All checks were successful
Build / build (push) Successful in 17m35s
2025-07-20 10:34:06 +09:00
43da672850 [obsidian] vault backup: 2025-07-20 02:31:41[
Some checks failed
Build / build (push) Failing after 12m24s
2025-07-20 02:31:42 +09:00
3d4c6fcf5c [obsidian] vault backup: 2025-07-18 18:14:10[ 2025-07-18 18:14:10 +09:00
c81997e527 [obsidian] vault backup: 2025-07-15 18:11:12[
All checks were successful
Build / build (push) Successful in 7m19s
2025-07-15 18:11:12 +09:00
cbe09d0852 [obsidian] vault backup: 2025-07-15 17:14:39[
All checks were successful
Build / build (push) Successful in 9m10s
2025-07-15 17:14:39 +09:00
160db1948f [obsidian] vault backup: 2025-07-15 17:11:03[
Some checks are pending
Build / build (push) Has started running
2025-07-15 17:11:03 +09:00
011edf7bed [obsidian] vault backup: 2025-07-11 20:10:23[
All checks were successful
Build / build (push) Successful in 8m35s
2025-07-11 20:10:24 +09:00
aa71637fe6 [obsidian] vault backup: 2025-07-11 13:08:46[
All checks were successful
Build / build (push) Successful in 7m55s
2025-07-11 13:08:46 +09:00
3dbbb6da30 [obsidian] vault backup: 2025-07-11 00:45:49[
All checks were successful
Build / build (push) Successful in 7m55s
2025-07-11 00:45:50 +09:00
bcfb639da7 [obsidian] vault backup: 2025-07-09 19:27:38[
All checks were successful
Build / build (push) Successful in 11m2s
2025-07-09 19:27:38 +09:00
23b72c51ab [obsidian] vault backup: 2025-07-08 17:15:15[
All checks were successful
Build / build (push) Successful in 8m27s
2025-07-08 17:15:15 +09:00
f0d85878da [obsidian] vault backup: 2025-07-08 16:12:02[ 2025-07-08 16:12:02 +09:00
9ceccfeec5 [obsidian] vault backup: 2025-07-05 15:48:36[
All checks were successful
Build / build (push) Successful in 8m7s
2025-07-05 15:48:36 +09:00
9ceda0f1a1 Merge remote-tracking branch 'home/v4' into v4
All checks were successful
Build / build (push) Successful in 9m9s
2025-07-04 13:17:31 +09:00
a47cd93b67 [obsidian] vault backup: 2025-07-04 06:05:53[ 2025-07-04 06:05:53 +09:00
94b001fab7 [obsidian] vault backup: 2025-07-04 01:13:05[
All checks were successful
Build / build (push) Successful in 12m2s
2025-07-04 01:13:05 +09:00
af28f3cb21 [obsidian] vault backup: 2025-07-03 18:35:34[
Some checks failed
Build / build (push) Failing after 10m9s
2025-07-03 18:35:34 +09:00
dc6b7f7d0f [obsidian] vault backup: 2025-07-02 12:16:53[
All checks were successful
Build / build (push) Successful in 9m20s
2025-07-02 12:16:53 +09:00
c789053832 [obsidian] vault backup: 2025-07-02 12:15:08[
Some checks are pending
Build / build (push) Has started running
2025-07-02 12:15:08 +09:00
01d5fbac96 [obsidian] vault backup: 2025-07-01 23:06:05[
All checks were successful
Build / build (push) Successful in 11m37s
2025-07-01 23:06:05 +09:00
5ccf09c98f [obsidian] vault backup: 2025-07-01 18:42:02[
All checks were successful
Build / build (push) Successful in 8m13s
2025-07-01 18:42:02 +09:00
7b29b36a0c [obsidian] vault backup: 2025-07-01 18:37:08[
Some checks are pending
Build / build (push) Has started running
2025-07-01 18:37:08 +09:00
19b344edd5 [obsidian] vault backup: 2025-07-01 17:34:36[ 2025-07-01 17:34:36 +09:00
0b18779385 [obsidian] vault backup: 2025-07-01 16:37:01[ 2025-07-01 16:37:01 +09:00
5c32c7c1aa [obsidian] vault backup: 2025-07-01 16:32:05[ 2025-07-01 16:32:06 +09:00
10aa3c4c08 [obsidian] vault backup: 2025-07-01 14:27:04[ 2025-07-01 14:27:04 +09:00
8c8e15cfb3 [obsidian] vault backup: 2025-07-01 13:25:45[
All checks were successful
Build / build (push) Successful in 7m50s
2025-07-01 13:25:45 +09:00
b6491cbb66 [obsidian] vault backup: 2025-06-30 20:27:34[
All checks were successful
Build / build (push) Successful in 7m57s
2025-06-30 20:27:34 +09:00
011620dee0 [obsidian] vault backup: 2025-06-30 11:51:36[
All checks were successful
Build / build (push) Successful in 7m22s
2025-06-30 11:51:36 +09:00
8003f8ed58 [obsidian] vault backup: 2025-06-30 11:47:51[
Some checks failed
Build / build (push) Has been cancelled
2025-06-30 11:47:51 +09:00
0f0c8163f7 [obsidian] vault backup: 2025-06-27 18:20:32
Some checks failed
Build / build (push) Failing after 10m8s
2025-06-27 18:20:32 +09:00
949c8d9b5a [obsidian] vault backup: 2025-06-27 17:54:31[
All checks were successful
Build / build (push) Successful in 6m52s
2025-06-27 17:54:31 +09:00
941162aa26 [obsidian] vault backup: 2025-06-27 16:57:34[
All checks were successful
Build / build (push) Successful in 7m32s
2025-06-27 16:57:34 +09:00
18e5a7654e [obsidian] vault backup: 2025-06-27 16:54:26[
Some checks failed
Build / build (push) Has been cancelled
2025-06-27 16:54:26 +09:00
3b41d338a7 [obsidian] vault backup: 2025-06-27 14:53:54[
Some checks failed
Build / build (push) Failing after 11m51s
2025-06-27 14:53:54 +09:00
c5e6905d9e [obsidian] vault backup: 2025-06-26 18:06:30
All checks were successful
Build / build (push) Successful in 8m58s
2025-06-26 18:06:30 +09:00
ee958e9540 [obsidian] vault backup: 2025-06-26 12:36:43[
Some checks failed
Build / build (push) Failing after 19m4s
2025-06-26 12:36:43 +09:00
5ee3b46bf0 [obsidian] vault backup: 2025-06-26 11:39:31[
All checks were successful
Build / build (push) Successful in 9m31s
2025-06-26 11:39:31 +09:00
a4982a4674 [obsidian] vault backup: 2025-06-26 11:36:39[
Some checks are pending
Build / build (push) Waiting to run
2025-06-26 11:36:39 +09:00
1c439d880b [obsidian] vault backup: 2025-06-26 02:17:45[
All checks were successful
Build / build (push) Successful in 6m57s
2025-06-26 02:17:45 +09:00
ce893d2245 [obsidian] vault backup: 2025-06-26 01:16:44[
All checks were successful
Build / build (push) Successful in 9m51s
2025-06-26 01:16:44 +09:00
ec9b4baace [obsidian] vault backup: 2025-06-26 00:16:44[
All checks were successful
Build / build (push) Successful in 6m51s
2025-06-26 00:16:44 +09:00
a80b88341f [obsidian] vault backup: 2025-06-25 22:16:44[
All checks were successful
Build / build (push) Successful in 9m2s
2025-06-25 22:16:44 +09:00
a179dce94f [obsidian] vault backup: 2025-06-25 19:32:36[
All checks were successful
Build / build (push) Successful in 9m23s
2025-06-25 19:32:37 +09:00
845401f5ef [obsidian] vault backup: 2025-06-25 18:32:26[
Some checks failed
Build / build (push) Failing after 13m13s
2025-06-25 18:32:26 +09:00
3a0cf9eba5 [obsidian] vault backup: 2025-06-25 15:07:07[ 2025-06-25 15:07:08 +09:00
bf631bc74a [obsidian] vault backup: 2025-06-25 13:52:10[ 2025-06-25 13:52:10 +09:00
c28f8ea8fc [obsidian] vault backup: 2025-06-25 12:04:40[ 2025-06-25 12:04:40 +09:00
9e271d5edb [obsidian] vault backup: 2025-06-24 16:54:18[ 2025-06-24 16:54:18 +09:00
38 changed files with 1085 additions and 7 deletions

View File

@@ -3,8 +3,14 @@ date: 2025-06-12 09:29
---
#computermusic #programming-language
[[Nyquist]]を作った[[Roger Dannenberg]]が開発している音楽プログラミング向けの中間表現。
[GitHub - rbdannenberg/arco](https://github.com/rbdannenberg/arco)
[[SuperCollider]]のようにクライアント-サーバーモデルで動作し、scsynthに相当する部分がArco。sclangに相当する部分として、[[Serpent]]というPythonっぽいフロントエンド言語も用意されている。
内部通信はOSCではなくO2というまた別のUDPの上に乗った汎用プロトコル。
## メモ
オーディオレートの処理でも、サンプルごとの処理のパターンと、ブロックレベルの処理の2種類がある。

View File

@@ -0,0 +1,23 @@
#programming
主にゲームエンジンなどで採用されるプログラミングのパラダイム。
最近のUnityでも内部的に採用されている。
[[Rust]]だと[[Bevy]]が有名。
[[オブジェクト指向]]と比べると、データのメモリ分布が、オブジェクトごとに並ぶのではなく個別のメンバー変数ごとに並ぶことになり、CPUのメモリキャッシュに乗りやすいなどの利点がある。
[\[Rust\] ECSアーキテクチャ \[bevy\_ecs\] | DevelopersIO](https://dev.classmethod.jp/articles/ecs-rust-bevy/)
[Intro to ECS - Unofficial Bevy Cheat Book](https://bevy-cheatbook.github.io/programming/ecs-intro.html)
## データのモデリング方法としてなにがうれしいのか
オブジェクト指向と比べた時の利点が基本的にさっきのような、パフォーマンス面での利点が強調されることが多い。ただ、何かパフォーマンスのためにせっかくプログラミング言語が用意してくれたデータのモデリング技法を犠牲にしているような気がしてならず、あんまり旨味がよくわからなかった。
ただ、Bevyの設計をいろいろ読んでいると、モデリングとしての核心は、「集合の中から特定の要素を持つもの部分集合を指定して挙動を個別に操作する依存性がない操作同士はどういう順番で実行してもいい」ということかなと思った。

7
content/Gluon.md Normal file
View File

@@ -0,0 +1,7 @@
#programming-language
[[Rust]]で書かれた、[[Lua]]のような埋め込みを想定しつつ静的型付けの言語。
モジュールの読み込みの文法とか複雑な型情報をRustと相互でやり取りする時のやりかたとか、参考になる
[Gluon](https://gluon-lang.org/)

9
content/Hackett.md Normal file
View File

@@ -0,0 +1,9 @@
#programming-language
[[Racket]]上で実装された、静的型付けなうえで、型安全なマクロシステムを搭載したプログラミング言語
[1 The Hackett Guide](https://lexi-lambda.github.io/hackett/guide.html)
["Hackett: a metaprogrammable Haskell" by Alexis King - YouTube](https://www.youtube.com/watch?v=5QQdI3P7MdY)

View File

@@ -0,0 +1,4 @@
---
date: 2025-06-26 17:45
---
#stub #person

View File

@@ -0,0 +1,6 @@
---
date: 2025-07-01 12:52
---
#survey #instrument
[Magnetic Resonator Piano](https://instrumentslab.org/research/mrp.html)

View File

@@ -0,0 +1,4 @@
---
date: 2025-06-27 16:26
---
#stub

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/)
シャント抵抗で読み取ってるかと思いきや時間重畳なのかな

8
content/Nyquist.md Normal file
View File

@@ -0,0 +1,8 @@
---
date: 2025-06-26 17:51
---
#programming-language #computermusic
[[Roger Dannenberg]]が90年代に開発した言語。
ユースケースとしては[[Audacity]]の中にエフェクトをかける機能として搭載されている

View File

@@ -4,3 +4,9 @@ date: 2024-10-04 13:31
#person
[[Not Art&Tech - On the role of Media Theory at Universities of Applied Art, Technology and Art and Technology.]]
---
[Turing Complete User](https://contemporary-home-computing.org/turing-complete-user/)
[[橋本麦]]さんによる試訳 [『チューリング完全ユーザー』試訳 - baku](https://scrapbox.io/glisp/%E3%80%8E%E3%83%81%E3%83%A5%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E5%AE%8C%E5%85%A8%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%80%8F%E8%A9%A6%E8%A8%B3)

View File

@@ -0,0 +1,13 @@
#compiler-design
[Red-Green Trees: an Overview. Six months ago I dug into Roslyns… | by Bayastan | Jun, 2025 | Medium](https://medium.com/@krendelia2021/red-green-trees-an-overview-17bae2d84e8c)
[[抽象構文木]]というか[[具象構文木]]の実装方法の一つ。
構文の途中で差し込まれたコメントなどのトリビアなどを保持して、完全なソースコードに戻せるけど実行効率などをよくしたままにできるやり方。
部分的に構文木を書き換えたりするとソースコードのロケーション情報がずれたりするので、文字幅とオフセットを別々に持たせるというやり方をしている
ながいけどこれがわかりやすい
[Ruby Parser開発日誌 (19) - 最高の構文木の設計 2024年版 - かねこにっき](https://yui-knk.hatenablog.com/entry/2024/08/23/113543)

9
content/Rune.md Normal file
View File

@@ -0,0 +1,9 @@
#programming-language
[The Rune Programming Language](https://rune-rs.github.io/)
[[Rust]]で書かれた埋め込みプログラミング言語。
Rustの文法ほぼそのままに動的型付けの言語をつくるとこうなる、みたいな感じ
[[Moonbit]]とか[[Rhai]]も近い感じRhaiは直接影響を受けたとのこと

View File

@@ -3,7 +3,7 @@ date: "2024-02-06T02:00:06+0900"
---
#programming-language #software #tools #sound
James McCartneyが開発、その後OSS化された音楽プログラミング言語。
[[James McCartney]]が開発、その後OSS化された音楽プログラミング言語。
[index | SuperCollider](https://supercollider.github.io/)

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

View File

@@ -21,6 +21,7 @@ https://github.com/mimium-org/mimium-rs
### 理論
- [[mimiumの部分的DSP更新とFaustのondemand]]
- [[mimiumでのIOパラメーター]]
### 中間表現について
@@ -29,7 +30,12 @@ https://github.com/mimium-org/mimium-rs
- [[mimiumのMIRコンパイル過程を真面目に考える]]
- [[lambda-mmm(実用版)]]
- [[mimiumグローバル環境評価について]]
- [[多段階計算を命令型VMインストラクションで表現したい]]
## マクロ
- [[mimiumと多段階計算]]
### ランタイム周りについて
@@ -38,7 +44,23 @@ https://github.com/mimium-org/mimium-rs
- [[mimiumのファイルIO]]
- [[mimiumのプラグインシステム]]
- [[WASIでmimiumをビルドデバッグしてみる]]
- [[mimiumの配列のGC]]
- [[mimiumの配列実装]]
- [[mimiumのREPLをVMで実装]]
## 応用先について
ふと思ったけど、[[SuperCollider]]や[[PureData]]と比べると、これらの言語は組み込みに使おうと思うとLinuxが動く環境を想定することになる[[Heavy]]はそれを全く別の処理系作ることで対応してたけど)。シーケンサとかスケジューラーがあるような、[[Faust]]だと難しいタイプのプログラムを[[Arduino]]とかに持っていくには向いているのではないか([[Extempore]]だって仕組み的に言えばそうかもしれないけど)
- できれば教育用途とかに持ち込めるのが一番いい
- ブートストラップできるといい
- いろいろな人がmimiumで拡張やライブラリを書けるようになってからが本当の本番
- 言語自体の拡張機能をその言語上でたくさん作れるとよい
- しかし、極端に自由度が高いとそれはそれで参入障壁が高い
[[mimiumでのシーケンサ]]
[[mimiumでのライブコーディングエンジン]]
---
@@ -48,7 +70,8 @@ https://github.com/mimium-org/mimium-rs
[mimium-rs/Roadmap.md at dev · mimium-org/mimium-rs · GitHub](https://github.com/mimium-org/mimium-rs/blob/dev/Roadmap.md)
- 多段階計算:大変そう。コンパイラドライバをユーザーコードから叩けるようにするのが先か。
- [レコード型](https://github.com/mimium-org/mimium-rs/issues/99):要件定義はほぼできたし、他の機能への依存も特になし。デフォルト引数の実装を無視すればとりあえず進められそう
- [[mimiumのレコード型|レコード型]]:要件定義はほぼできたし、他の機能への依存も特になし。デフォルト引数の実装を無視すればとりあえず進められそう
- [[mimiumでのバリアント]]:やっぱり必要、だが分割コンパイルを先にやらないとダメかも
- モジュールシステム名前空間のCライブラリレベルでのマングリングとか考える必要ありそう。
- 配列型の実装GC問題片付けばなんとか固定長と可変長の切り替えをどうするかを考えたい。
- OSCの実装

View File

@@ -0,0 +1,128 @@
---
date: 2025-07-01 18:43
---
#mimium
マルチスレッド前提の場合、Shared State全般がRwLockとかで包まれることになってしまう
しかし、大概の場合グローバルな状態共有はAtomicな単一パラメーターで済む
あくまで、普通のグローバル変数宣言はスレッドローカルな扱いにして、メインスレッドと協調しないといけない場合は"shared"みたいなキーワードをつけるようにするとか(構文増やしたくないけど)
だし、これだと結局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({..})`と実行してしまうと、これがグローバルなコンテキストで作られない可能性がある・・のか?いや、でも基本的に書き換えられる心配はないからいいのかな
デフォルト引数構造体のインスタンスは必ずグローバル評価で行う、だとパラメトリックな生成はできないし問題起きそう
```rust
//自動キャストとジェネリクスの組み合わせさえうまくいけばこのくらいのことはできそう
let p = param({..});
fn dsp(){
p |>
|gate = 0,freq = 1000,gain = 1.0|{
...//do something
}
}
```
ということは、とりあえず雑にParamを実装して

View File

@@ -0,0 +1,42 @@
#memo #mimium
[[SuperCollider]]のPatternに相当するものを作ってみたい。
Pattern自体は基本的にはシンプルな遅延リスト。だが値の種類を、ピッチと長さとかグループ化できてジェネリックなので、静的型付け言語だとジェネリクスがいる`next`メソッドを持つ型クラスとかインターフェース的なものが欲しくなる)
重要ポイント
- あるパターンを先に構築して、それにあとから適当なシンセを当てはめることもできる
- 数値リテラルが定数(不変)パターンに自動キャストされていることで、パターンのリストの要素にさらに別のパターンを埋め込むことができる
`Pbind`は実際には遅延リストを実行してイベント(キーバリューの辞書ペア集合)のリストを得ている
[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)
`.play`を実行すると、`EventStreamPlayer`クラスがいろいろ頑張ってくれるらしい
`instrument`の指定なしにPbindすると、デフォのシンセが鳴る
```smalltalk
SynthDef(\default, { arg out=0, freq=440, amp=0.1, pan=0, gate=1;
var z;
z = LPF.ar(
Mix.new(VarSaw.ar(freq + [0, Rand(-0.4,0.0), Rand(0.0,0.4)], 0, 0.3)),
XLine.kr(Rand(4000,5000), Rand(2500,3200), 1)
) * Linen.kr(gate, 0.01, 0.7, 0.3, 2);
OffsetOut.ar(out, Pan2.ar(z, pan, amp));
}, [\ir]);
```
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の自動変換とかは[[単位変換のための型システム]]で解決すべき問題かも

View File

@@ -0,0 +1,38 @@
---
date: 2025-07-03 18:34
---
#memo
幽霊型含む、カスタムのコンストラクターを書こうとすると名前空間の問題が出てくる
二重インクルードの問題とかもあるので、先に分割コンパイルの仕組みを整える方がいい?
型の環境の中に変数解決が必要になってくる
内部的には幽霊、Opaque、バリアントで分かれててもいいかもな
```rust
enum Variant{
Phantom(Symbol),
Opaque(Symbol,TypeNodeId),
Union(Box<Self>,Box<Self>)
}
enum Type{
...
Variant(Variant)
}
```
Foldでネストするくらいなら`Vec<Box<Self>>`に収められるかな?
パーサーとASTとしてはmatch節も加えないと意味ない
で、型推論に加えなきゃいけないコードは、
- 型コンストラクタを関数として使えるように型→値環境に追加し、App式の評価で使えるように
- match式の型推論
matchのコード生成がジャンプテーブルとか出てくるとめんどくさいんだよなあ

View File

@@ -0,0 +1,24 @@
---
date: 2025-06-27 16:54
---
#mimium #livecoding
一般化するとこういうモデルにならんだろうか
![[img/general-livecoding-model.png]]
Tracksの部分の抜き差しだけできるのが[[ChucK]]のShredシステム。
とりあえずはこれをRust実装してもいいけど、最終的にはこのモデル自体をmimium上で実装することもできそう
不要なトラックの削除と空きスロット再利用を実現するためには、普通の配列とは別に単方向リストかSlotmap的なものを作る必要がありそう
Reducerは基本的には全てのチャンネルの加算だけでいいので滅多にいじる必要ないけど、いじりたいケースが出てくるかも
ChucKではエフェクトのテールが更新時にぶちぎれる問題があったので、それを防ぐためのPostFX Chain
各トラックごとのエフェクトのライブ切り替えとかも実現しようと思えばできるかな
...これ、結局[[SuperCollider]]のJITLibと同じことかもな
[jitlib\_basic\_concepts\_01 \| SuperCollider 3.14.0-dev Help](https://doc.sccode.org/Tutorials/JITLib/jitlib_basic_concepts_01.html)

View File

@@ -0,0 +1,71 @@
#memo #mimium
- [[多段階計算を命令型VMインストラクションで表現したい]]
- 一時期考えていたが、あんまり筋が良くないのでやめた
[Implement multi-stage computation intepreter by tomoyanonymous · Pull Request #136 · mimium-org/mimium-rs · GitHub](https://github.com/mimium-org/mimium-rs/pull/136)
シンプルに構文木レベルでのインタプリタを別途作ることで実現できそう。
## 課題
- 組み込みの関数の型情報がマクロ用レベル0とVM用レベル1で分かれているので、両方にあることを別々に宣言しなければならない
- 逆に、ベクターのappend・removeや文字列操作など、メモリを確保する操作はレベル0でのみ利用できる組み込み関数として制限すると、便利かもしれない
- 逆に、`self``delay`はレベル1でのみ利用できる関数とする
- レベル01両方で利用できるpersistentなモジュールは、上記2種類のいずれも使わず、かつescapeとBracketも利用しないものであればよい、ということになる
- もともとディレイの最大サイズはリテラルで指定しなければいけないという問題があったが、これを`make_delay(size:float)-> <(float,float)->float>`レベル0で最大時間を指定すると、入力と遅延時間をとる関数のコードを返すという関数にできるかも
- ただ、これやるとディレイが絡む関数はすべてレベル0定義になるのかな
- なんかそれよりは、[[数値プリミティブ型に常に範囲をつける]]とかのほうが筋がいいかも
```rust
fn fbdelay(max_time){
`|input,time,fb| {
(input + self*fb, time) |> make_delay!(max_time)
}
}
```
- こういうfbdelayを2個以上つかうときのコードはどうなるのかな
- というか、fbdelayで生成されたコードをMIRに持ってくときにどうなるのか
- Value型を単なるCodeじゃなくてDelayとして特別な値にリダクションすればいいのかな
[[otopoiesis]]でパラメーターを生成するのにも使える?
```rust
fn synth(freq,gate){
osc(freq)*gate
}
fn synth_module(freq:()->float,gate:()->float){
`||{ synth(freq(),gate()) }
}
```
これのモジュールを評価すると、freq,gateがUIに現れるという感じでできるのかなそして、ここでUIの範囲制限をするためにも数値型が範囲を持っていた方がいいということになりそう
うーん、サンクを手動で使わず表現できるような何かが欲しいなあ
```rust
fn wrap_module(param:Param, synth:(Param)->float ){
`{ | | synth(param |> invoke) }
}
```
Param型はinvokeでuiからの値を取れる、サンクをアンラップするようなメソッドを持つ型クラスに属している、という感じで、ジェネリクスが実装出来たらいけそうね
## マクロを提供するプラグイン
プラグインも、各関数が返す型と同時にどのレベルでその関数が使えるかをコンパイラに渡す必要がある
### ファイル読み込みはどうなる?
[[mimiumのファイルIO]]の話。マクロの展開より先に型の評価が行われるので、例えばファイルを読み込んでからチャンネル数が分かる、みたいな場合型情報を読み込む段階でファイルを読みこまなければならない、がその評価のためにはマクロを実行して文字列の値を受け取らなければならない、、、ということで、結局[[依存型]]がないと多段階計算でも対応できない。
結局、読み込んで返す値として次元数の値を持つ配列を返すしかないのかも

View File

@@ -0,0 +1,63 @@
---
date: 2025-06-27 17:10
---
#mimium #memo
今の所の問題点として
- マシンが一つの結合されたコンパイル済みバイトコードしか受け付けていない
- これを配列として複数保持する必要あり
- 外部関数の参照インデックスのテーブルはVM上に載っているが、内部関数は一つのプログラム上の絶対位置しか参照できない
- プログラム上で定義した内部関数を、他のプログラムでも参照できるようにする、シンボルテーブルがいる
- またグローバル環境の評価も同様に、シンボル-(GlobalPos,型)変換のテーブルをコンパイラが持っていないとだめ
- マシンをオーディオドライバ立ち上げとともにオーディオスレッドにMoveしてしまっているので、メインスレッドで新たにコンパイルしたプログラムを何かの方法でオーディオスレッドに送ってやらないといけない
- しかもできればロックフリーで
- [GitHub - hawkw/sharded-slab: a lock-free concurrent slab (experimental)](https://github.com/hawkw/sharded-slab) これかな
- それか普通にDashMapか
- シンボルテーブルもDashMapで作ってればなんとかなるのかな
- VMの中にControllerみたいなDashMap系をArcで包んだものを用意しておいて、メインのマシンはオーディオスレッドに送ってしまい、Arcでコントローラーだけをメインスレッドに残しておく
- ExecContextはRepl起動から終了まで次の情報を持ち続ける
- グローバル変数のシンボルテーブル(型情報含む)
- 内部関数のシンボルテーブル(型情報含む)
- 外部関数のシンボルテーブル(型情報含む)
ExecContextは、起動時VMのインスタンスを作る。この時VMConrollerのArc参照がVM内に渡される。
ExecContextは、ソースコードを受け取るたびにコンパイラのインスタンスを作ってはプログラムを出力し、終了する。
出力されたプログラムはVMControllerのPrograms(DashMap)に非同期でインサートされ、シンボルテーブルも更新される
Replで送られた新しいプログラム一行だけのプログラムをどのスレッドで、いつ実行するかが問題
DSPの頭でReplで溜まった処理(無名関数のキュー)を順番に消化する?あるいは、
```rust
dsp = |l,r| ->(float,float){ ( new_process )}
```
こんな感じでREPLに送ると、実際には
```rust
fn repl_001(){
| | {
dsp = |l,r| ->(float,float){ ( new_process )}
}@now
}
```
みたいなのを実行したことになるとか
これだとスケジューラープラグイン実装されてることが前提にはなるし、スケジューラーにタスクを登録するのをController越しに行える必要がある
というか、メインスレッドに相当するものを別途作る方がやっぱり良さそう
結局、今VMに乗ってるだいたいのものはShared Stateとして共有されて、スタック、ベースポインタ、StateStorageだけが独立する形になりそう
---
シングルスレッドの場合、REPLで実行されたものは必ずオーディオドライバのブロック頭で消化
[[mimiumでのIOパラメーター]]

View File

@@ -0,0 +1,223 @@
---
date: 2025-07-02 11:40
---
#memo
[Proposal: Record Syntax · Issue #99 · mimium-org/mimium-rs · GitHub](https://github.com/mimium-org/mimium-rs/issues/99)
古い v0.4.0 では実験的なレコードstruct型があったが、新たなレコード型の構文を実装する。
新構文のデザインは、名前ごとにデータをグルーピングすることで、プログラマの意図をより直接的にコードに反映できるようにするとともに、デフォルト値を設定することで記述量を減らすことを目指す。
また、タプル型で考案されているパラメータパックとデフォルト値付きレコード型を組み合わせることで、「UGen as 関数」という概念を型安全性を保ちながら直接表現でき、かつデフォルト引数付き関数にありがちな引数の数に関する混乱を回避できそう。
## 基本構文
構文のベースは [Elm](https://elm-lang.org/docs/records) である。小竹は Rust 風にはしない。
匿名レコード型を正の文脈で使う。
```rust
let myadsr_param = { attack = 100.0, decay = 200.0, sustain:float = 0.6, // let 式同様に型注釈は省略可能だ release = 2000.0, // 末尾のカンマも許可されるべきだ } let singlerecord = { value = 100, // フィールドが1つだけのレコードは、ブロックや代入構文と区別するために末尾カンマが必須だ }
```
後で実装予定だが、型エイリアス/新規型宣言の中でもデフォルト値を設定できる。宣言内のデフォルト値はリテラルである必要がある。
```rust
type alias ADSR = { attack:float = 100.0,
decay:float = 200.0,
sustain:float = 0.6,
release:float = 2000.0, }
```
各要素へはドット演算子でアクセスするか、let パターンで展開できる。
```rust
let myattack = myadsr_param.attack let { attack .. } = myadsr_param // 変数名はレコード型宣言に依存する
```
アンダースコアを使った部分適用の構文糖衣を使えば、こんなコードでもたぶん動作する。
```rust
let myattack = myadsr_param |> _.attack // 型は正しく推論される
```
Elm 由来の「update」構文も加える。ただし区切りにはパイプではなく左アローを使う。
```rust
let newadsr = { myadsr_param <- attack = 4000.0, decay = 2000.0 } // attack フィールドのみ上書きして新しいレコードを生成
```
これは以下のような構文糖衣として実装できる。
```rust
let newadsr = { attack = 4000.0,
decay = myadsr_param.decay,
sustain = myadsr_param.sustain,
release = myadsr_param.release, }
```
この展開は型推論後にのみ行える。実装は mirgen 側で行えばいいはず。
## 関数宣言での引数デフォルト値
```rust
fn adsr(attack = 100, decay = 200, sustain:float = 0.7, release = 1000.0) -> float {
// 実装…
}
// もちろんこれは動作する
adsr(200,400,0.5,200)
// 以下は許可しない。次のパラメータパックの説明参照
adsr()
adsr(attack = 200)
adsr(200)
```
## レコード型を使った自動パラメータパック
引数が 2 つを超える関数呼び出しでは、
1. 宣言と同じ数の引数
2. 型の統一ルールに合致する単一のレコード引数
のいずれも許可される。というか、多パラメーター関数は実質的に単一レコード引数関数のエイリアスになる。
```rust
// もちろんOK
adsr(myadsr_param)
// デフォルト引数ですべて評価する
adsr({ .. })
// オールデフォルトの場合はこれも許して良さそう
adsr(..)
```
デフォルトパラメーターに対する部分更新構文も許したい。デフォルト値付きと未設定引数を混在させた関数の場合とか。
```rust
fn myugen(freq, phase = 0.0, amp = 1.0) { // freq は必須
//実装…
}
myugen({ freq = 200.0 .. }) // これは許可されるはず
myugen({ phase = 0.05 .. }) // freq がないのでエラー
```
右辺値で使う `{ key = val .. }` 構文は、`let` パターン展開と同様に `IncompleteRecord` AST ノードを生成し、その型は `IncompleteRecord` となる。この `IncompleteRecord` 式は、部分適用のアンダースコア同様、引数としてのみ使える想定。
型システムレベルでは、`Record` 型は各フィールドにデフォルト値があるかどうかの情報だけを持ち、値自体は持たない。
型推論では以下のように `Record``IncompleteRecord` が統一unifyされる。
```rust
// 疑似コード
Record{ [(key:"freq", type:float, default_v:false),
(key:"phase", type:float, default_v:true),
(key:"amp", type:float, default_v:true)]
}
IncompleteRecord{ [(key:"freq", type:float)] }
=== unify ===>
Record{ [(key:"freq", type:float, default_v:true),
(key:"phase", type:float, default_v:true),
(key:"amp", type:float, default_v:true)] }
```
型推論の最後まで `IncompleteRecord` が残っているとコンパイルエラーとする?。
そして、単一の `IncompleteRecord` 引数が与えられた場合ケース2、mirgen 前の構文糖衣アンラップフェーズで、以下のように更新構文を用いた AST 展開を行う。
```rust
let default_v = { freq = 0.0, phase = 0.0, amp = 1.0 }
// "myugen" の型情報をもとに生成。freq は上書きされるので何でもよい。
myugen({ default_v <- freq = 200.0 })
```
デフォルト値生成のロジックは、Rust の `Default` トレイトのような制限付き型クラス(インターフェース)を模したものになると思われる。
---
## 部分型と[[型クラス]]
[[構造的部分型]]を採用するつもり。
つまり、
```rust
fn mysynth(freq,amp,gate){
...
}
```
みたいな関数に対して
```rust
let param = {
freq:1000,
amp:1.0,
gate: 1.0,
phase: 0.0, //余計なパラメーター
}
param |> mysynth //でも、部分型になるのでOK
```
ということができる。
そして、レコード型のメンバーに関数型を許せば、結局これは型クラスを作ってるのに等しいことになるはず
例えばデフォルト値が次の型クラスの実装となっているとすると
```
type ADSR = {
attack:float,
decay: float,
sustain: float,
release: float
}
trait Default{
fn default()->Self
}
impl Default for ADSR{
fn default()->Self{
{
attack:100,
decay: 100,
sustain: 0.7,
release: 100
}
}
}
```
```
type alias Default<T>{
default: ()->T
}
let adsr:ADSR = {..}//これが
let adsr = Default<ADSR>::default() //こうなる
```
隠れ引数として実装されれば、定数畳み込みはできそう
```
fn default(typeid, parama,paramb)->T{
match typeid{
...
}
}
```

View File

@@ -2,6 +2,20 @@
date: 2024-09-22 21:15
---
## 基本方針
- ヒープに確保する。
- MIRでリテラル、setarrayelement、getarrayelementみたいな専用命令を作る。
- [[LLVM]]みたいにgetelementptrの実装は難しい
- なぜなら、VMでのMOV命令がスタックの位置を直接指す実装だから
- ので、VMにも同じように専用命令を生やす
- get/setarrayelementの命令フォーマット
- destination,heap上のarray番号,indexの値を指すレジスタ番号
- ArrayのワードサイズはVMで確保されたヒープ上に書き込まれていて、インデックス\*ワードサイズの計算はランタイムに行うということでいいかなあ
## GCについて
Reference Countにする場合、Dropをどう実装するか
drop_array()、drop_closure()をプリミティブ命令として用意する?

View File

@@ -123,6 +123,26 @@ fn reverse(origin:Region)->Region{
- 再生前prepareToPlay)
- 信号再生時process
## 多段階計算と組み合わせる
[[mimiumと多段階計算]]で、それなりに多段階計算の実装が間に合ってきた。
FadeinOutのようなリージョン→リージョンの関数はステージ0の計算と考えることができる。
また、Generator系も、基本的には周波数や音量といったUIパラメーターは、ステージ0での評価時にUIを生成して値を受け取るチャンネルを作り、ステージ1再生中にそのUIからの値を受け取るという方式で捉えられる
```rust
fn audiofx(param1=100,param2=200){
`|input|{... }
}
fn gen_component(){
Param{..} |> sinosc
}
```
`Param`はジェネリックな
---
以下は昔に考えていたこと

36
content/sapf.md Normal file
View File

@@ -0,0 +1,36 @@
---
date: 2025-06-26 17:44
---
#programming-language
sapf:Sound as Pure Form
[GitHub - lfnoise/sapf: Sound As Pure Form - a Forth-like language for audio synthesis using lazy lists and APL-like auto-mapping.](https://github.com/lfnoise/sapf)
[[SuperCollider]]を作った[[James McCartney]]が新しく作っている言語。
[[Forth]]や[[APL]]から影響を受けた[[逆ポーランド記法]]が特徴的な言語。[[uiua]]とも近いかも。
```sclang
15 .0 sinosc 200 * 300 + .0 sinosc .1 * play
```
記法をシンプル人によるにしたけど内容としてはUGenのメタ操作にかなり向いており、SCに近いと思う。言語としては動的型付けで、配列に関数を自動展開する機能とかがSCのパターン操作とかと同じ感じでよくできてる存外VMの実装もシンプルそう。
---
オリジナルはmacOSオンリーだが、クロスプラットフォーム向けにフォークしてる人がいる
[sapf - pulusound](https://pulusound.fi/blog/sapf/)
[GitHub - ahihi/sapf: Sound As Pure Form, cross-platform edition](https://github.com/ahihi/sapf)
[first look at sapf (Sound As Pure Form) - YouTube](https://www.youtube.com/watch?v=jN5Ij3Cazh8)
---
この動画短くて簡潔でよかた
[sapf: New Music Language Inspired by Supercollider, APL, and Forth (Sound as Pure Form) - YouTube](https://www.youtube.com/watch?v=FY2WYXOdXoM)

View File

@@ -0,0 +1,8 @@
---
date: 2025-07-05 15:45
---
#research
会議が煮詰まってくると、机にお菓子を投げ込んでくれるデバイス
https://ipsj.ixsq.nii.ac.jp/records/183464

View File

@@ -0,0 +1,10 @@
#compiler-design
- ある程度コンパイラのコードベースが大きくなってくると、認知負荷がでかくなってくる
- かといって、コードをコンパクトに保とうとすると、一箇所の変更がしづらくなっていく
- かといって、頑張ってインターフェースを切って分離性を高めていくと、全体の把握はしづらくなる
- そりゃ全体を把握しなくいても継続的に開発できるようにするのが目的なのでそうなんだけど
- 例えば、シンタックスツリーに[[Red Green Syntax Tree]]をあとから使おうとすると、さすがに書き換えが大変
- だが、Language Serverを作ろうと思ったらいつかは必要
- これをインクリメンタルに開発するのは無理だよなあ
-

View File

@@ -0,0 +1,41 @@
---
date: 2025-07-22 17:00
---
#programming-language
一般的なコードフォーマッターの実装について。
[How to write a code formatter](https://yorickpeterse.com/articles/how-to-write-a-code-formatter/)
1行当たり最大文字数がこのくらい、としたときに、どういう戦略で折り返すかは結構難しい問題。
文字列→トークン→ASTという順番で変換されるので、この逆順が良いのかとも思ったが、
AST→フォーマッタ用の専用の木構造みたいな中間表現を一度挟んだほうが賢いのかもしれない
[[Rust]]の[pretty](https://docs.rs/pretty/latest/pretty/)クレートがコンビネーターとして定義してあるやつ
[[Tree-sitter]]を使った汎用フォーマッター[Topiary](https://topiary.tweag.io/)とかいうのもある
---
Exprの途中に差し込まれたトリビア主にコメントをどうやって抽出するか
ExprNodeIdに対するSecondary MapがSpanに対して作れているのだから、Trailng Triviaとしてコメントを保持するのは一応できるか
パーサコンビネータでどうにか処理できるもんか?
```rust
fn parse_expr_top<Output>()->impl Parser<Token,Output,Error>{
not(comment()).padded_by(comment().repeated())
}
```
[Parser in chumsky - Rust](https://docs.rs/chumsky/latest/chumsky/trait.Parser.html#method.map_with)
`map_with`使えばいけるかしら
Stateにトリビアを書き込んでおけばいいのか

View File

@@ -50,3 +50,21 @@ E-Bowのよくある回路って間違ってませんかって動画。この
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とかのパワーであれだけ鳴らせるのがやっぱり不思議というか

View File

@@ -11,7 +11,33 @@ date: 2025-06-14 19:46
弦のうち一箇所に錘がついていて、振動のハーモニクスの位置が弦の回転位置で変えられる
トレモロ的な仕組みで、弦全体のテンションも7半音ぐらいまで制御できる
移動フレット的なものをどう作るか
普通のモーターフェーダーだと長さが足りない6~7フレットで200mmのストロークがあれば良さそう
普通のサーボだと移動速度が足りるか微妙な気がする
普通のブラシDCモーターのPID制御回転位置は別途ギアつけて200mmストローク1回転分に変換して、可変抵抗でとるなど
もしくはブラシレスを行う
[[Smartknob]]を参考にすると良さそう
[Smartknob制作の話kawashimaken](https://note.com/kawashimaken/n/n7f1fb098c9f2)
ドライバはTMC6300というの使ってて、Arduino-FOCというのをドライバにできるらしいPWM線が6本もいるけど
[Home \| Arduino-FOC](https://docs.simplefoc.com/)
Dan bauというベトナムとか中国のモコードがこれっぽいな
[DAN BAU SELF LEARNING-Tu hoc DAN BAU(DVD+Book)獨弦琴 - YouTube](https://www.youtube.com/watch?v=mqWm2_gOq18)
確かに、気合でフレットが移動するよりも弦のテンションを変える方が楽かもな、、、長さが固定の分倍音制御を特定のフレットの位置でやればいいから

View File

@@ -0,0 +1,14 @@
---
date: 2025-07-09 19:14
---
#programming-language
言語のライブラリなどをリモートリポジトリから取得、管理する仕組み。
バージョンの依存性解決なども機能のうちに含む。
[[Suwa Takashi]]さんの記事がパッケージマネージャとは何かをよく解説してくれている
[パッケージマネージャを自作するときに考えること - gfnweb](https://gfngfn.github.io/ja/posts/2023-02-15-on-creating-package-managers/)

15
content/型クラス.md Normal file
View File

@@ -0,0 +1,15 @@
#programming-language
[[Rust]]におけるTraitとかに近いもの
あるメソッド群を持つジェネリックな型の分類
パラメトリックなジェネリクスに対して、対象が広すぎるものを、アドホック多相的に制限する
["Hackett: a metaprogrammable Haskell" by Alexis King - YouTube](https://youtu.be/5QQdI3P7MdY)
この動画の説明わかりやすかった12:10
式をもとに型を生成するのが[[型推論]]、型情報をもとに式を生成するのがジェネリクスというループ
[[Hackett]]

View File

@@ -32,9 +32,18 @@ http://www.cs.tsukuba.ac.jp/~kam/lecture/gairon2-2012/gairon2.pdf
λ○□:両方を統合
[[SATySFi]]:組版言語だが、マクロのシステムとして多段階計算が導入されている。
[多段階計算の型システムの基礎 - gfnweb](https://gfngfn.github.io/ja/posts/2022-05-12-slides-type-system-matsuri-2020/)([[Suwa Takashi]])
[SATySFi の多段階計算入門](https://sankantsu.hatenablog.com/entry/2022/08/19/215024)
## 用語
**Cross-Stage Persistence**基本的にステージ0/1でのコードはそれぞれステージ0/1の中でしか使えない。何らかの方法で両方のステージで跨いで使える仕組みを作れると便利
**Run**プリミティブ:
## [[依存型]]との組み合わせ
[A Dependently Typed Multi-Stage Calculus](https://arxiv.org/abs/1908.02035)

View File

@@ -18,9 +18,9 @@ VMは最初、マクロ評価時に自分の現在の評価ステージを0と
VMは、命令記録モードと実行モードの2種類で、現在の評価ステージが0のときに実行モードになる
mainプログラムの先頭はマクロ展開のため必ずincl_levelからスタート命令記録モードから開始
mainプログラムの先頭はマクロ展開のため必ずincr_levelからスタート命令記録モードから開始
命令記録モードでは、decl_levelがでてくるまでバッファに実行した命令をコピーし続ける
命令記録モードでは、decr_levelがでてくるまでバッファに実行した命令をコピーし続ける
decl_levelでレベル0になったら...うーん
```ocaml
@@ -62,3 +62,7 @@ endescape
ret 1
```
VMの構造にメタプログラミングを埋め込むよりも、MIR生成段階でなにかしらのサンクを呼び出すということにして一時的に空にしておく、みたいなやり方のほうが素直かもな

View File

@@ -0,0 +1,122 @@
---
date: 2025-07-24 17:54
---
#memo #mathematics
例えば、[[双方向プログラミング]]的なもので、数値をスライダーで調整できるようになっていた場合、実際のところは5/7とかわかりやすい有理数だったりとか、整数に近い値を表したいのにめちゃくちゃ長い小数点の数値が残ったりする。
これを、適当なグリッドにスナップするUIの一つとして、許容できる誤差範囲と整数の複雑さを指定して分数に変換するのが良いのではないか。
ChatGPTに聞いた。[[連分数展開]]というのを使うと良いらしい。[[Rust]]のコードを書いてもらった。
```rust
/// 任意の実数 x を近似する収束分数・半収束分数を求める
/// x: 近似したい実数
/// eps: 絶対誤差許容値
/// max_den: 分母の上限
/// max_num: 分子の上限
fn rational_approx(
x: f64,
eps: f64,
max_den: u64,
max_num: u64,
) -> Vec<(u64, u64)> {
// 連分数展開の a_k リストを構築
let mut a: Vec<u64> = Vec::new();
let mut r = x;
for _ in 0..64 {
let ak = r.floor() as u64;
a.push(ak);
let frac = r - (ak as f64);
if frac.abs() < f64::EPSILON {
break;
}
r = 1.0 / frac;
}
let mut candidates: Vec<(u64, u64)> = Vec::with_capacity(a.len());
let (mut p_nm2, mut q_nm2) = (0u128, 1u128);
let (mut p_nm1, mut q_nm1) = (1u128, 0u128);
for &ak in &a {
// 収束分数
let p = ak as u128 * p_nm1 + p_nm2;
let q = ak as u128 * q_nm1 + q_nm2;
if q > max_den as u128 { break; }
let num = p as u64;
let den = q as u64;
if num <= max_num {
let approx = (num as f64) / (den as f64);
if (x - approx).abs() <= eps {
candidates.push((num, den));
}
}
// 半収束分数
for d in 1..=(ak / 2) {
let ap = ak - d;
let p2 = ap as u128 * p_nm1 + p_nm2;
let q2 = ap as u128 * q_nm1 + q_nm2;
if q2 <= max_den as u128 && p2 <= max_num as u128 {
let num2 = p2 as u64;
let den2 = q2 as u64;
let approx2 = (num2 as f64) / (den2 as f64);
if (x - approx2).abs() <= eps {
candidates.push((num2, den2));
}
}
}
p_nm2 = p_nm1;
q_nm2 = q_nm1;
p_nm1 = p;
q_nm1 = q;
}
candidates.sort_by(|&(p1, q1), &(p2, q2)| {
let e1 = (x - (p1 as f64)/(q1 as f64)).abs();
let e2 = (x - (p2 as f64)/(q2 as f64)).abs();
e1.partial_cmp(&e2).unwrap()
});
candidates.dedup();
candidates
}
/// x を percent% 精度で近似するラッパー
/// x: 近似したい実数
/// percent: 相対誤差許容値(%
/// max_num: 分母、分子の上限
fn rational_approx_pct(
x: f64,
percent: f64,
max_num: u64,
) -> Vec<(u64, u64)> {
let eps = (percent / 100.0) * x.abs();
rational_approx(x, eps, max_num, max_num)
}
fn main() {
let x = 2.7182818284;
let percent = 1.0; // 1%
let max_num = 500;
let results = rational_approx_pct(x, percent, max_num);
println!("近似候補percent={}%:", percent);
for (p, q) in results {
let approx = p as f64 / q as f64;
let err = (x - approx).abs();
println!("{}/{} = {:.8}, 誤差 {} ({:.4}%差)",
p, q, approx, err, err / x.abs() * 100.0);
}
}
```
```
近似候補percent=1%:
193/71 = 2.71830986, 誤差 0.00002803075492963103 (0.0010%差)
106/39 = 2.71794872, 誤差 0.00033311045128181505 (0.0123%差)
87/32 = 2.71875000, 誤差 0.00046817160000012237 (0.0172%差)
68/25 = 2.72000000, 誤差 0.0017181716000003178 (0.0632%差)
49/18 = 2.72222222, 誤差 0.003940393822222443 (0.1450%差)
19/7 = 2.71428571, 誤差 0.003996114114285465 (0.1470%差)
```
悪くなさそうここから5個ぐらいまでを提示するとして、

10
content/新工芸.md Normal file
View File

@@ -0,0 +1,10 @@
---
date: 2025-06-25 19:22
---
#notion
[PHILOSOPHY \| SHINKOGEISHA](https://www.shinkogeisha.com/philosophy)
> 日々の生活の中にモノは大量に存在し、ありふれているにも関わらず、僕らはその作り方を知らない。量産技術の発展の末に高度に​分業化が進んだ結果、僕らは自分で使う道具さえ、満足に自分で作ることができなくなってしまった。システムに依存するが余り、進んで歯車としての個々の役割に徹するようになり、知識を狭め、肩書きやブランド、組織の名前に価値を置く一方で、自らの手で完結できる仕事、手で生み出せる喜び、自らに備わった感性に無頓着な態度を社会に蔓延させてしまった。

View File

@@ -19,6 +19,7 @@ date: "2024-01-05T17:15:38+0900"
- [[Overtone]]
- [[TidalCycles]]
- [[FoxDot]]
- [[sapf]]
- [[Csound]]
- [[Extempore]]
- [[ChucK]]
@@ -28,6 +29,7 @@ date: "2024-01-05T17:15:38+0900"
- [[Gwion]]
- [[Glicol]]
- [[Omni]]
- [[Arco]](Serpent)
---