Renoiseと4klangで作成した楽曲をexeで再生する

デモシーン制作では音楽も重要なので今週は音楽関連を学んでいました

検討した方法としては

  • 映像同様シェーダーで生成する
    • shadertoyでは音楽を生成するシェーダーが書けたりしますよね
  • 4klang等の軽量ソフトシンセを使用する
    • 4kデモシーンではこちらが一般的?なようです(要出展)

今回は、実行時の容量や音楽の作りやすさも考慮して4klangを使用することにしました。

ということで、4klangのサンプル楽曲を実際にexeで再生するところまでの備忘録を残します。

準備

必要なものを入手します

Renoiseをインストールする

4klangはRenoiseというトラッカー方式と呼ばれる入力方法の作曲ソフトで使用されることを推奨しているようなのでインストールします

Home | Renoise

私は3.1を使用しました

4klang 3.0を入手する

4klangのバージョン3.0を入手して適当な場所に解凍しておきます

執筆時点では3.1.1まで出ているようですが、3.0より後のバージョンではobj形式の出力に対応していないらしく、exeに組み込むのに人手間かかってしまいます

4klang - Alcatraz Software Synthesizer

音楽生成用のobjファイルを生成する

Renoiseと4klangを使用してexeにリンクするobjファイルを作成します

Renoiseのプラグイン設定をする

Renoiseを起動後、メニューの Edit>Prefarence>Plug/Misc の一番上部にVSTプラグインディレクトリを指定する箇所があるので4klangを解凍した先の 4klang_VSTi を指定します

f:id:kaneta1011:20180708024645p:plain

設定後、Renoiseを再起動するとプラグインが反映されます

マルチコア設定を解除する

当方の環境ではマルチコアで動作させると、音声再生時に挙動がおかしかったのでシングルコアにしておきましょう

メニューの Options>Multi Core/CPU Support1CPU にします

f:id:kaneta1011:20180708024950p:plain

4klangを使用してサンプル楽曲をレコードする

赤丸の箇所をクリックして4klangを選択して読み込みます

f:id:kaneta1011:20180708025318p:plain

読み込みが完了したら↓のようになるので、 File>Open Song から 4klang_VSTi に入っている example.xrns を読み込みましょう

f:id:kaneta1011:20180708025502p:plain

読み込みが完了すると4klangのウィンドウが現れるので、 Load Patch Data を押下して同じフォルダの example.4kp を読み込む

f:id:kaneta1011:20180708025727p:plain

その後 Record を押下した後、Renoiseに戻って音楽を再生する

f:id:kaneta1011:20180708025939p:plain f:id:kaneta1011:20180708030011p:plain

任意の場所で再生を終了させて4klangウィンドウの PANIC! を押下した後に Stop でレコードを止める

f:id:kaneta1011:20180708030314p:plain

objファイルの保存ダイアログが表示されるので好きな場所に保存して次に作成する空のプロジェクトと同じディレクトリに入れる

exeに組み込んで再生する

visual studioで適当な空のコンソールアプリプロジェクトを作る

プロジェクト設定の リンカー>入力>追加の依存ファイルwinmm.lib4klang.obj を追加して↓のコードをソースファイルに書いてビルドする

#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>

#include "4klang.h"

#define  SND_CH     (2      )

SAMPLE_TYPE snd_buf[MAX_SAMPLES * SND_CH * 50];

HWAVEOUT    hWaveOut = NULL;
WAVEHDR     whdr = {
    (LPSTR)snd_buf,
    sizeof(snd_buf),
    0, 0, WHDR_DONE, 0, NULL, 0
};

WAVEFORMATEX wfx = {
    0x0003,
    SND_CH,  SAMPLE_RATE, (SAMPLE_RATE * sizeof(SAMPLE_TYPE) * SND_CH),
    sizeof(SAMPLE_TYPE) * SND_CH,
    sizeof(SAMPLE_TYPE) * 8,
    0,
};

int main() {
    _4klang_render(snd_buf);

    waveOutOpen(&hWaveOut, WAVE_MAPPER, &wfx, 0, 0, CALLBACK_NULL);
    waveOutPrepareHeader(hWaveOut, &whdr, sizeof(WAVEHDR));
    waveOutWrite(hWaveOut, &whdr, sizeof(WAVEHDR));

    getchar();

    return 0;
}

以上で再生できる

かなり参考にさせていただいたページ

4klangのVSTとか