DemoSceneで使う4klangの情報があまり見つからなかったので勉強しつつメモとして執筆中です.
動画やチュートリアルを見て、上手く理解できなかったものを自分なりに考えた解釈をメモしている感じなので、チュートリアルは末尾の参考にさせていただいたものを見ていただけると。また執筆者は音楽ど素人なので所々音楽用語の使い方が間違っていますが、ご了承ください。
環境構築
-
4klangとVSYASMをクローンしておきます。VSYASMは4klang.asmから4klang.objを作成するのに使用します。
- 4klangは最新版だとうまくレコードできないバグがあるようなので3.0.1がいいかもです
- VSYASMのinstall_script.batを管理者として実行します
- renoiseをインストールします
- 4klangとrenoiseで曲を作り、必要なファイルを生成します。
- この時16bit Outputにチェックを入れておかないと音割れしてしまうことがあるようです
実装
恐らく以下の手順で問題なく音が鳴らせるはずです → サンプルコード
- こちらを参考に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の使い方
楽器を増やす方法
- 4klangでInstrumentを切り替える
- renoiseでsamplerを開き、No plugin loadedの右の逆三角形を押してVST alias/4klangより現在開かれている4klangのプラグインを選択する
- するとrenoiseのsamplerが4klangのプラグインの表示になるのでChannelの数値を4klangの楽器の数値と合わせる
4klangの基本動作
- 4klangはスタックにシグナルをプッシュして、それを加工・実行するといった設計
- シグナルは先頭にプッシュされる(なのでどんどん先頭が更新される)
- ユニットにはシグナルをプッシュするユニットとスタックの先頭のシグナルを編集(加工)するユニットがある
- Instrumentは各々の楽器に対して、Gloabalは全楽器に共通のエフェクトをかける場所
4klangの画面構成
Instrument/Gloabal
① Instrumentを構成する一つ一つの要素のことをユニットという
② ユニットの追加と削除
③ ユニットの位置を上下に移動させる
④ スタックシグナルカウンター。そのユニットの時点でスタックに入っているシグナルの合計数
各ユニットの説明
ユニット名 | 説明 |
---|---|
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
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
スタックの先頭のシグナルを編集(加工)するユニット。ディストーションをかける。ディストーションとはインプットの波の形を元に小さな波を重ねて、元の波を歪ませるエフェクトのこと(たぶん)
パラメーター名 | 日本語訳 | 意味 |
---|---|---|
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
サンプルコード