TTFについて調べていた
2週間ほどTTFというフォントのデータ形式を使っていろいろやっていたので近いうちにまとめたい
ファンクションキーが効かなくなっていた
この前新しく買ったノートパソコンはWindows10でvisual stuidoやvscodeを使用しているときにF5でビルド開始できなくなっていて
なんでだろう?と思っていたのですが、特に調べもせずにメニューをポチポチクリックして実行していました
今日もポチポチ押していたのですがさすがに限界なので調べてみると一瞬で治る問題でした
「Fn+Esc」でトグルするらしい
Renoiseと4klangで作成した楽曲をexeで再生する
デモシーン制作では音楽も重要なので今週は音楽関連を学んでいました
検討した方法としては
- 映像同様シェーダーで生成する
- shadertoyでは音楽を生成するシェーダーが書けたりしますよね
- 4klang等の軽量ソフトシンセを使用する
- 4kデモシーンではこちらが一般的?なようです(要出展)
今回は、実行時の容量や音楽の作りやすさも考慮して4klangを使用することにしました。
ということで、4klangのサンプル楽曲を実際にexeで再生するところまでの備忘録を残します。
準備
必要なものを入手します
Renoiseをインストールする
4klangは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
を指定します
設定後、Renoiseを再起動するとプラグインが反映されます
マルチコア設定を解除する
当方の環境ではマルチコアで動作させると、音声再生時に挙動がおかしかったのでシングルコアにしておきましょう
メニューの Options>Multi Core/CPU Support
を 1CPU
にします
4klangを使用してサンプル楽曲をレコードする
赤丸の箇所をクリックして4klangを選択して読み込みます
読み込みが完了したら↓のようになるので、 File>Open Song
から 4klang_VSTi
に入っている example.xrns
を読み込みましょう
読み込みが完了すると4klangのウィンドウが現れるので、 Load Patch Data
を押下して同じフォルダの example.4kp
を読み込む
その後 Record
を押下した後、Renoiseに戻って音楽を再生する
任意の場所で再生を終了させて4klangウィンドウの PANIC!
を押下した後に Stop
でレコードを止める
objファイルの保存ダイアログが表示されるので好きな場所に保存して次に作成する空のプロジェクトと同じディレクトリに入れる
exeに組み込んで再生する
visual studioで適当な空のコンソールアプリプロジェクトを作る
プロジェクト設定の リンカー>入力>追加の依存ファイル
に winmm.lib
と 4klang.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; }
以上で再生できる
かなり参考にさせていただいたページ
「error LNK2001: 外部シンボル "_fltused" は未解決です」を解決する
小さいexeを作っているときに _fltused
が未解決だからどーのというエラーが出てしまってビルドできなくなってしまいました。。
ググると↓のページを見つけて
コスミー報告書[社外秘] - CSTLを使ってDLLを小さくするっていう話
EXTERN_C int _fltused = 0x9875;
を適当な位置に挿入すると動くようになった
windowsのchromeでglslのコンパイルが遅すぎるのでANGLEを切る
最近shadertoyでシェーダーを書いてるんですが
かなり肥大化してきて、コンパイルに20秒ぐらいかかる & たまにブラウザがクラッシュするという問題が発生していました
windowsのchromeはOpenGL ESがANGLE経由で動いているのでglslコードがhlslコードに変換されたのちにコンパイルされているから遅いんだろうなぁという何となくな予想はしていたんですが、特に解決策も調べずに諦めていました
今日会社でなんとなく呟いてみると同僚の方にGPUのドライバが対応していればchromeの起動オプションでANGLEを切れると教えてもらったので試してみました
そのオプションは --use-angle=gl
です
設定した状態で起動してシェーダーをコンパイルしてみると爆速になっていました!うれしい
ただ少し気になることがあって、ANGLEを切った後と切る前でシェーダーの挙動が異なっていました。ANGLEの状態が想定していた挙動でした。
原因は僕が clamp
の第一引数と第三引数が入れ替わった状態で実装していだからだったんですが、なんで今までちゃんと動いてたんだろう...
ちなみにANGLE経由の方がシェーダーの実行速度は早かったです
crinklerとvisual studio 2017で400byteのexeを作る
最近4kbデモを作りたくてグラフィック面でいろいろ勉強していたんですが、今週は小さい実行ファイルを生成する手法を学びました
開発環境
- visual studio 2017 comunity
- crinkler20a
空のプロジェクトを作成する
最近めっきりvisual studioを触る機会がなかったので知らなかったのですが、win32アプリケーションプロジェクトの作成の仕方が変わっていてびっくりしました
プロジェクト新規作成から【Visial C++>Windowsデスクトップ>Windows デスクトップ ウィザード】でプロジェクト名を設定してOK
次のダイアログで
- Windowsアプリケーションを選択
- 空のプロジェクトをチェック
- セキュリティ開発ライフサイクルのチェックを外してOK
crinklerを入手する
以下のURLよりcrinklerを入手します
解凍して得た crinkler.exe
を link.exe
にリネームして、上記で作成した空プロジェクトのソリューションディレクトリに移動します
こちらはデモシーナー界隈でよく使用されているらしいリンカーで、既存のリンカーと差し替えるだけでファイルサイズを圧縮してくれる優れものだそうです
プロジェクトの設定をする
以下の設定をRelease構成で行います
- 【全般>プログラム全体の最適化】を
プログラム全体の最適化なし
に変更 - 【VC++ディレクトリ>実行可能ファイルディレクトリ】の先頭に
$(SolutionDir)
を追加- 先頭に追加しないと
link.exe
を検索する優先度が既存の物に負けてしまってcrinklerが利用されないので気を付けてください(2時間ぐらい潰されました)
- 先頭に追加しないと
- 【リンカー>入力>すべての既定のライブラリを無視】を
はい
に変更 - 【リンカー>マニフェストファイル>マニフェストの生成】を
いいえ
に変更 - 【リンカー>コマンドライン>追加のオプション】に
/CRINKLER
を追加
main.cppを作成してビルド!
main.cppを作成して以下のコードを入力したらリリースビルドしましょう
int WinMainCRTStartup() { return 0; }
424byteの実行ファイルが作成できました! ちなみにcrinklerなしでビルドすると1,536byteなので1/4弱削減できているみたいです。すごいですね
ここからは映像を表示したり、音楽を再生したりする機能を追加してくことになります
いろいろ見ていると機能追加でだいたい1.5kbぐらいになるみたいですね、使える容量は2.5kbしかないのか...