4klang 完全に理解した

DemoSceneで使う4klangの情報があまり見つからなかったので勉強しつつメモとして執筆中です.
動画やチュートリアルを見て、上手く理解できなかったものを自分なりに考えた解釈をメモしている感じなので、チュートリアルは末尾の**参考にさせていただいたもの**を見ていただけると。また執筆者は音楽ど素人なので所々音楽用語の使い方が間違っていますが、ご了承ください。
## 環境構築
* [4klang](https://github.com/hzdgopher/4klang)と[VSYASM](https://github.com/ShiftMediaProject/VSYASM)をクローンしておきます。VSYASMは4klang.asmから4klang.objを作成するのに使用します。
    * 4klangは最新版だとうまくレコードできないバグがあるようなので3.0.1がいいかもです
* VSYASMのinstall_script.batを管理者として実行します
* renoiseをインストールします
* 4klangとrenoiseで曲を作り、必要なファイルを生成します。
    * この時16bit Outputにチェックを入れておかないと音割れしてしまうことがあるようです
## 実装
恐らく以下の手順で問題なく音が鳴らせるはずです → [サンプルコード](https://github.com/HaruoOgawa/4klang-Learning)
* [こちら](https://blog.demofox.org/diy-synthesizer/)を参考にwavファイルを動的生成する
* 波形データの部分を_4klang_renderで生成したデータに置き換える
* wavファイルをアウトプットするのではなく、そのままバイナリをAudio APIに渡す
## ビルド
* Solution Platformをx86にします
* 4klangが生成したファイルと4klang\4klang_source\4klang.asmをプロジェクトに配置します
* Projectを右クリック → Build Dependencies → Build Customazationに入り、下の方にあるyasmを選択する
* 4klang.asmのプロパティを開いてItem TypeをYasm Modular AssemblerにしてApplyを押します
    * 同じウィンドウのYasm Modular Assembler/Assembly Optionsを開いて4klang.objが書き出される場所を確認し、それをAdditional Liblary Derectoriesに追加しておきます
    * 4klang.objとwinmm.libも Additional Dependenciesに追加しておきます
## renoiseの使い方
### 楽器を増やす方法
1. 4klangでInstrumentを切り替える
![Screenshot 2023-05-03 190930.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/461609/83ce0cf2-fc92-30aa-ecfd-17db580964a6.png)
2. renoiseでsamplerを開き、No plugin loadedの右の逆三角形を押してVST alias/4klangより現在開かれている4klangのプラグインを選択する
![Screenshot 2023-05-03 191307.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/461609/2567b281-0c66-e3b0-8878-5fe81472c297.png)
3. するとrenoiseのsamplerが4klangのプラグインの表示になるのでChannelの数値を4klangの楽器の数値と合わせる![Screenshot 2023-05-03 191611.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/461609/c2b21eb1-0e83-9da3-e792-5939c75a67aa.png)
## 4klangの基本動作
* 4klangはスタックにシグナルをプッシュして、それを加工・実行するといった設計
* シグナルは先頭にプッシュされる(なのでどんどん先頭が更新される)
* ユニットには**シグナルをプッシュするユニット**と**スタックの先頭のシグナルを編集(加工)するユニット**がある
* Instrumentは各々の楽器に対して、Gloabalは全楽器に共通のエフェクトをかける場所
## 4klangの画面構成
### Instrument/Gloabal
① Instrumentを構成する一つ一つの要素のことをユニットという
② ユニットの追加と削除
③ ユニットの位置を上下に移動させる
④ スタックシグナルカウンター。そのユニットの時点でスタックに入っているシグナルの合計数
![Screenshot 2023-05-05 094433.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/461609/aa7fb8ad-30f8-2d1b-201f-897d196ff170.png)
## 各ユニットの説明
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/461609/97f048f3-488a-4ceb-ad01-e98c598e4472.png)
| ユニット名 | 説明 |
|:-----|:------|
|Envelope|**スタックにシグナルをプッシュするユニット。** エンベロープ(減衰)を生成する|
|Oscillator|**スタックにシグナルをプッシュするユニット。** SINE, TRI/SAW, PULSE, Noiseなどの基本の波を生成する|
|Load|**スタックにシグナルをプッシュするユニット。**-64から64の任意の値をシグナルとして渡す|
|Filter|**スタックの先頭のシグナルを編集(加工)するユニット**。フィルターをかける|
|Distortion|**スタックの先頭のシグナルを編集(加工)するユニット**。ディストーションをかける|
|DelayLine|**スタックの先頭のシグナルを編集(加工)するユニット**。ディレイ系のエフェクトをかける|
|Arthmetic|**スタックの先頭のシグナルを編集(加工)するユニット**。算術演算を行う|
|Store|**スタックの先頭のシグナルを編集(加工)するユニット**。先頭のシグナルをインプットとして受け取り、それを任意のユニットの任意のプロパティに作用させる。(任意)使用後、Store自身のシグナルはArthmeticでポップさせておく。|
|Panning|左右の音のチャンネルを生成する(ステレオサウンドの生成?)|
|Output|完成した楽器をGloabalにアウトプットしスタックをリセットする|
|Acccumulate|Gloabalでのみ使用可。outputされた音のシグナルを増やす(???)|
## 各ユニットの詳しい説明(勉強しながら使ったときに随時更新します)
### Envelope
**スタックにシグナルをプッシュするユニット。** エンベロープ(減衰)を生成する。音量(振幅)を減数させる
| パラメーター名 | 日本語訳 | 意味 |
|:-----|:------|:------|
|Attack||キーを押して開始された信号が最大振幅に達するまでの時間。|
|Decay||最大振幅からサステインの振幅に戻るまでの時間|
|Sustain||最大振幅の後に減衰する地点|
|Release||キーを離して振幅が0に達するまでの時間|
|Gain||最大振幅(音量)|

参照: https://www.soundonsound.com/glossary/adsr-attack-decay-sustain-release
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/461609/f33952fd-f03a-c231-2332-9a5a1a8ad4d9.png)

### Oscillator
**スタックにシグナルをプッシュするユニット。** SINE, TRI/SAW, PULSE, Noiseなどの基本の波を生成する
| パラメーター名 | 日本語訳 | 意味 |
|:-----|:------|:------|
|Transpose|移調|周波数をずらすこと||||||
|Detune||周波数を微妙にずらした音を重ねる効果のこと?|
|Phase|位相|波の一周期中(円)の位置をずらす|
|Color||???|
|Shape||-64に近いほど三角波に、0に近いほどSin波、64に近いほどノコギリ波になる|
|Gain||音量| 
### Filter
**スタックの先頭のシグナルを編集(加工)するユニット**。フィルターをかけて音を整形する
| パラメーター名 | 日本語訳 | 意味 |
|:-----|:------|:------|
|Low|ローパスフィルター|ある周波数よりも下の周波数を通すフィルター|
|High|ハイパスフィルター|ある周波数よりも上の周波数を通すフィルター|
|Band|バンドパスフィルター|ある周波数の周辺の周波数のみ通すフィルター|
|Notch|ノッチフィルター|ある周波数の周辺はカットしてそれよりも外側のみ通すフィルター|
|Peak||?????|
|All||全部のフィルターをかける？？？？？？|
|Frequency||フィルタリングの基準となる周波数|
|Resonance|共鳴・反響|基準となる周波数を揺らす効果？|

https://synth-voice.sakura.ne.jp/synth-voice/html5/synth-basic02.html
https://cmtext.indiana.edu/synthesis/chapter4_filters.php
### Distortion
**スタックの先頭のシグナルを編集(加工)するユニット**。ディストーションをかける。ディストーションとはインプットの波の形を元に小さな波を重ねて、元の波を歪ませるエフェクトのこと(たぶん)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/461609/662c6e1d-9a35-ca74-bb0b-6443419942b3.png)

| パラメーター名 | 日本語訳 | 意味 |
|:-----|:------|:------|
|Drive||重ねる小さな波の形。-63に近いほど三角波,、0に近いほどSin波、63に近いほどノコギリ波|
|S&H||重ねる小さな波の細かさ。値が大きいほど細かく元の波に近づく|
### DelayLine
**スタックの先頭のシグナルを編集(加工)するユニット**。ディレイ系のエフェクトをかける
| パラメーター名 | 日本語訳 | 意味 |
|:-----|:------|:------|
||||
||||
||||
||||
||||
### Arthmetic
| パラメーター名 | 日本語訳 | 意味 |
|:-----|:------|:------|
|Load Note||???|
|PUSH||スタックにシグナルをプッシュする|
|POP||先頭のシグナルをポップする。ポップは配列で使う取り除くと同じ意味|
|XCH||2つのシグナルの順番を交換する|
|+||2つのシグナルを加算する|
|+/POP||2つのシグナルを加算して元のシグナルはポップする|
|*||2つのシグナルを乗算する|
|*/POP||2つのシグナルを乗算して元のシグナルはポップする|
|2+/POP||0番目と2番目、1番目と3番目のシグナルを加算して元のシグナルはポップする。シグナルは加算して分の2つプッシュする|
### Store
**スタックの先頭のシグナルを編集(加工)するユニット**。先頭のシグナルをインプットとして受け取り、それを任意のユニットの任意のプロパティに作用させる。(任意)使用後、Store自身のシグナルはArthmeticでポップさせておく。
| パラメーター名 | 日本語訳 | 意味 |
|:-----|:------|:------|
|Stack||どのスタックをインプットに受け取るか|
|Unit||どのユニットに作用させるか|
|Slot||選択したユニットのどのパラメーターに作用させるか|
|Amount||作用させる量。0だと何も作用しない|
## 楽器の考察
### キック(バスドラム)
周波数を低くしながらすぐに減衰するようなSin波。元の周波数は低い方がそれっぽく聞こえる
### スネアドラム
## 参考にさせていただいたもの
* https://nanka.hateblo.jp/entry/2018/07/08/033553
* https://blog.demofox.org/diy-synthesizer/
* https://www.youtube.com/watch?v=xLhT06lwaig&list=PLbDcgWe0Tu5inM3TRY0GsKitBUp8B25vC&index=5
* https://www.soundonsound.com/glossary/adsr-attack-decay-sustain-release
* https://www.sinesquares.net/musicgear/synths-and-distortion#:~:text=So%2C%20what%20is%20distortion%3F,same%20effect%20using%20different%20values.
* https://synth-voice.sakura.ne.jp/synth-voice/html5/synth-basic02.html
## サンプルコード
https://github.com/HaruoOgawa/4klang-Learning