ファンクションキーが効かなくなっていた

この前新しく買ったノートパソコンはWindows10でvisual stuidoやvscodeを使用しているときにF5でビルド開始できなくなっていて

なんでだろう?と思っていたのですが、特に調べもせずにメニューをポチポチクリックして実行していました

今日もポチポチ押していたのですがさすがに限界なので調べてみると一瞬で治る問題でした

「Fn+Esc」でトグルするらしい

andmc.hatenablog.com

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とか

「error LNK2001: 外部シンボル "_fltused" は未解決です」を解決する

小さいexeを作っているときに _fltused が未解決だからどーのというエラーが出てしまってビルドできなくなってしまいました。。

ググると↓のページを見つけて

コスミー報告書[社外秘] - CSTLを使ってDLLを小さくするっていう話

EXTERN_C int _fltused = 0x9875; を適当な位置に挿入すると動くようになった

windowsのchromeでglslのコンパイルが遅すぎるのでANGLEを切る

最近shadertoyでシェーダーを書いてるんですが

かなり肥大化してきて、コンパイルに20秒ぐらいかかる & たまにブラウザがクラッシュするという問題が発生していました

windowschromeOpenGL ESがANGLE経由で動いているのでglslコードがhlslコードに変換されたのちにコンパイルされているから遅いんだろうなぁという何となくな予想はしていたんですが、特に解決策も調べずに諦めていました

今日会社でなんとなく呟いてみると同僚の方にGPUのドライバが対応していればchromeの起動オプションでANGLEを切れると教えてもらったので試してみました

そのオプションは --use-angle=gl です

設定した状態で起動してシェーダーをコンパイルしてみると爆速になっていました!うれしい

f:id:kaneta1011:20180705231931p:plain

ただ少し気になることがあって、ANGLEを切った後と切る前でシェーダーの挙動が異なっていました。ANGLEの状態が想定していた挙動でした。

原因は僕が clamp の第一引数と第三引数が入れ替わった状態で実装していだからだったんですが、なんで今までちゃんと動いてたんだろう...

ちなみにANGLE経由の方がシェーダーの実行速度は早かったです

crinklerとvisual studio 2017で400byteのexeを作る

最近4kbデモを作りたくてグラフィック面でいろいろ勉強していたんですが、今週は小さい実行ファイルを生成する手法を学びました

開発環境

空のプロジェクトを作成する

最近めっきりvisual studioを触る機会がなかったので知らなかったのですが、win32アプリケーションプロジェクトの作成の仕方が変わっていてびっくりしました

プロジェクト新規作成から【Visial C++>Windowsデスクトップ>Windows デスクトップ ウィザード】でプロジェクト名を設定してOK f:id:kaneta1011:20180701030008p:plain

次のダイアログで

  • Windowsアプリケーションを選択
  • 空のプロジェクトをチェック
  • セキュリティ開発ライフサイクルのチェックを外してOK f:id:kaneta1011:20180701030107p:plain

crinklerを入手する

以下のURLよりcrinklerを入手します

解凍して得た crinkler.exelink.exe にリネームして、上記で作成した空プロジェクトのソリューションディレクトリに移動します

こちらはデモシーナー界隈でよく使用されているらしいリンカーで、既存のリンカーと差し替えるだけでファイルサイズを圧縮してくれる優れものだそうです

http://www.crinkler.net/

プロジェクトの設定をする

以下の設定をRelease構成で行います

  • 【全般>プログラム全体の最適化】を プログラム全体の最適化なし に変更
  • VC++ディレクトリ>実行可能ファイルディレクトリ】の先頭$(SolutionDir) を追加
    • 先頭に追加しないと link.exe を検索する優先度が既存の物に負けてしまってcrinklerが利用されないので気を付けてください(2時間ぐらい潰されました)
  • 【リンカー>入力>すべての既定のライブラリを無視】を はい に変更
  • 【リンカー>マニフェストファイル>マニフェストの生成】を いいえ に変更
  • 【リンカー>コマンドライン>追加のオプション】に /CRINKLER を追加

main.cppを作成してビルド!

main.cppを作成して以下のコードを入力したらリリースビルドしましょう

int WinMainCRTStartup()
{
    return 0;
}

424byteの実行ファイルが作成できました! ちなみにcrinklerなしでビルドすると1,536byteなので1/4弱削減できているみたいです。すごいですね f:id:kaneta1011:20180701033429p:plain

ここからは映像を表示したり、音楽を再生したりする機能を追加してくことになります

いろいろ見ていると機能追加でだいたい1.5kbぐらいになるみたいですね、使える容量は2.5kbしかないのか...