2015年7月30日木曜日

Windows:vstgui:プリセット地獄

しばらくVST開発から遠ざかっていて、でも自作のVSTを使いたいので使っていたら、
どうも思った感じの挙動になっていない。

CUBASEでセーブすると、パラメータがごちゃごちゃと動き、エディットしたパラメータ
が全部リセットされて、プリセットに戻ってしまう。何だこれ!!

プリセットはFM音源部分だけに影響するようにしているので、FM音源部分だけが
プリセットに戻る。

こ、これは使えない・・

毎回プリセットに音色データを入れてビルドしないと使えないやんけ!

色々とデバッグして調べてみると、今の実力では標準のプリセットを使うとその現象
から逃れられないというのがわかってきた。

世の中の他のVSTはちゃんと動いているので、何か決定的な勘違いか知らない仕様
があると思われるけど、どうやって調べてもそこがわからなかった。ハマった。

■調べたコト
・getParameterとsetProgramの関係
→CUBASEでは、セーブする時に、
1.現在のプリセット番号を退避
2.エディットしたパラメータを取得して退避
としてくれるはず。

そうすると、ロード時に、
1.退避したプリセットを反映
2.エディットしたパタメータを反映
でいい感じになるのでは?

でも、現在の挙動としては、FM音源部分のみパラメータがごちゃっと動く。
つまり、退避だけしてくれればいいハズなのに、なぜか反映もしている。

・セーブ時にパラメータがごちゃごちゃと動く理由もわからない。
→試しに、setProgramでプリセットパラメータを反映しないようにしたらゴチャっと
動かなくなった。
→また、getParameterを通らなくしても同じようにゴチャっと動かなくなる。

ということは、CUBASEのセーブ時に知らない何かが起きているのではないか。

■回避方法
・標準のプリセットを使わないで、独自のプリセット管理システムを作る
→セーブ時には現在のパラメータのみがセーブされるので問題ない
→ただし、独自のプリセットシステムは敷居が高い!!

■独自方式の問題点
・ボタンを用意して、ポチポチ押したら次の音色、というのはすぐに作れそう。
・音色名を押すとドンと音色リストが開いて、音色名を押すとその音に変わる
というsynth1みたいなやり方がスタンダードだけど、これはものすごく大変!!
→未だに文字や画像を出すのがよくわからないから。

まずはボタンで次の音色ってヤツかな・・。

2015年7月28日火曜日

うなぎ




お祝いで居酒屋で宴会。


魚介の美味しい店だったので、


うなぎを頼んでみる。


やっぱりこのご時世、


ちょっと高かったけど、


めちゃうま!!


最高!!

2015年7月25日土曜日

またチャーハン




おやつ感覚とか


そういう言い訳を言いながら、


またチャーハン。


だっておいしいんだもの。

2015年7月18日土曜日

存在感




ハンバーグとソウセイジと鶏肉のセット。


いつものよくばり感が出てしまいました。


でも写真に撮ると、


このソウセイジの存在感よ!


素晴らしい!

2015年7月16日木曜日

Windows:フルパスからファイル名と拡張子を取り出す

良くそういった場面に出くわすけど、これといってバシっと来なかった。

今日はいい感じのに出会えたのでメモ!

#include <stdlib.h>

char szDrive[8], szPath[64], szFName[32], szExt[8];

_splitpath_s(argv[1], szDrive, sizeof(szDrive), szPath, sizeof(szPath), szFName, sizeof(szFName), szExt, sizeof(szExt));

コンソールアプリの入力部分のパスを綺麗に切ってくれる。

szDriveにはドライブ
szPathにはパス
azFNameにはファイル名
azExtには拡張子

が入るって寸法です。便利。

2015年7月12日日曜日

はやるよね




最近は牛丼がブーム。


しかも吉野家。


何度も行きたい感じ。

2015年7月9日木曜日

フィルターって一体何!?

こうやってシンセを設計してみて、今までシンセについて何もわかっていなかった事がわかった。

手本となるシンセのパラメータを細かく分析してみて、このパラメータってこういうことしてるの!?
と改めて発見する。

今までほんとになーんにもわかってなかった!!

■フィルターって何!?
アナログ的シンセに必ずあるフィルター。
自分で実装してみて、初めてわかったことがあった。
フィルターにADSRナド、エンベロープジェネレータがあるけど、
それはなーんとなく使ってて、何が起きてるのかよくわかってなかった。

カットオフはある周波数から上か下、又は周りをそぎ落としてるんだよな・・
レゾナンスはそのあたりを強調してるんだよな・・
ADSRはそれが時間とともに効いてくるんだよな・・←ココ間違い

くらいかしら。そんな曖昧な感じしか持ってないままフィルター実装したら、
何だか音が違う。思った感じにならない。

そう、ADSRは時間と共に効いてくるんではなくて、
「時間と共にカットオフの周波数が変化している」
が正解でした。(他の実装もあると思うが)

だから思ってた音にならんかったんや!
結構ADSRをFM音源部分と揃えることに時間をかけたけど、何も意味なかった!!

これから作り直し。

■コーラスって何!?
神様の作ったサンプルを元に実装してみたけど、全く思った感じの音にならない。
瞬間的にそれっぽい時はあるけど、パラメータを動かすとすぐに変な音に。

そこで、各パラメータを掘り下げていくと、パラメータによって、「おいしい」数値
というのが存在するっぽい事がわかってきた。

今まで、プリセットをカチカチと変えて微調整の人生だったので、これまたすごい
衝撃。そうだったのか~的な。

そして、今でも全然わかってない。
音の世界は深い・・。

2015年7月1日水曜日

Windows:VSTにpng使いたい!

GUI作り、壁にぶつかってはちょっとだけ進み、を繰り返しております。

そろそろレイアウトもいい感じになってきたので、透過PNGが使いたい所。
神様の作ったサンプルは全部BMPなので、ファイルサイズも無駄にでかいし、
いい機会だし取り組みました。

神様もさらりと書いております。pngが使いたかったら、zlibをビルドして、
libpngをビルドして、USE_LIBPNGを入れてこうするといけるよ!みたいな。

さらりと書くよねー。さらりと書いてあるから簡単にいくかなと思ったら全然
うまくいかなかった。ハマった。

神様の言うとおりにしてたらダメだったので、自分でやったことをメモる!

■ソースはwebから落としてきてビルドしたらダメ

zlibやlibpngの専用サイトから落としてきてビルドしたらダメだった。じゃあ
どうするかっていうと、VSTSDKの中の、vstguiの隣にあるzlibフォルダと
libpngフォルダの中にあるソースを使うのです。(正確にはvstgui.sfの中ね)

これらを使ってスタティックライブラリとしてビルドする。ビルドはいつも
ウォーニングでまくるけどあっけなく通る。zlib.libとlibpng.libができあがる。

zlib.hとzconf.h、png.hとpngconf.hをコピーして自分のトコにもってきて、
ビルドする。エラーでまくり。良く読むとlibの追加の方法が良くわかって
なかった。

■ライブラリの扱いは適当ではダメ

・libのパスを通す
(構成プロパティ→VC++ディレクトリ→ライブラリティレクトリ)
・libそのものを明示的に追加する
(構成プロパティ→リンカー→追加の依存ライブラリ)

これが必要なのね!ここハマった。みんなわかってるから簡単に書いて
るんだもの。そして、ビルドしたらまたエラー。なんだかライブラリ内の
関数がカブってるみたいな。そこで、

・無視するライブラリを追加
(構成プロパティ→リンカー→特定の規定のライブラリの無視)

ここにMSVCRT.lib(Release)とMSVCRTD.lib(debug)を入れたらビルド通る。

※これ以外にもマルチスレッド指定とかやったけど関係あるのかしら・・

このやり方が合ってるのかどうかわかんないけど、とにかくビルドが通って
無事PNGを使う事ができた。背景画像が800kbから6kbになって感激!