2015年6月30日火曜日

Windows:vstgui:解決はいつもいきなり

独自の画像表示の方法がわからないので、テキストエディットでパラメータを表示
することにしていた。しかし、パラメータを変えてもテキストの中身を変える方法が
わからない。

また、プリセットを読み込んでも、スライダーやノブは変わるのに、テキストの表示
は変わらない。これは困った。

VSTinstからGUIの関数が呼べないのがネックになっていた。GUIを作るときに、

editor = new VstGui(this);

みたいにするんだけど、このeditorという入り口から自分の作った関数が呼べない。
これは騙し騙しやってるC++の継承とか仮想関数とかよくわかんないトコが原因
ぽくて、非常に困っていた。これまたハマった。

いろいろとググってみると、別の角度からいける感じがする。100msecごとに
呼ばれる「idle()」を使えばいいんじゃねーかと。

この関数、アイドリングの時に呼ばれるみたいなんだけど、これで常に最新の
パラメータを表示しておけば、結局パラメータを変更しても追随するし、いけそう。

コードをさらりと書いて実行。すぐに解決。

いやー、ものすごい長い時間ハマってたけど、解決する時は一瞬だなぁ・・。

懸念は、100msecごとにテキストをうじゃうじゃと書くのはパフォーマンス的にどうか
という部分くらいかな。でもこの方法以外になさそうだし、これで行こう。

2015年6月27日土曜日

なんだろこれ




これも写真を見てうーんとうなる。


なんだろこれ。


あ、GPS情報見る前に思い出した!


これIKEAに行った時に食べたお昼だ!


IKEAは外国に来た感がすごくする、


ナイスな場所でした。

2015年6月26日金曜日

Windows:VSTinstのGUIは情報少なすぎ

世の中にはVSTinstを作ろうなんてヒトは少数なんですかね・・。
とにかく情報が少ない!!少なすぎる!!

神様の作ってくれたサンプル以上の事をしようと思うと、英語のサイトを見る必要があり、
でも英語のサイトを見てもそんなに情報が落ちてない。

GUIなんかもう手探りもいいとこよ!!

CSlider,CKnob,COnOffButtonあたりはサンプルからなんとなく使えたけど、テキストを
出したりするトコとかは見よう見まねでやったらできた的な強引なプログラム!!

実行してみたら実際に出てきたのはいいけど、本当にこのやり方でいいのかしら。

■現在ハマってるところ
・スライダーとかじゃくて、画像を出そうと思うと、てんでやり方がわかんない!!
独自フォントを使って文字出したいのだけど、どうやってやるんだろ・・?

テキストエディットが一応あるので、いけるようになるまではこれで。

・Cknobのハンドルに画像を使用すると、角度が付かない。画像そのものが
その状態のままくるくると動く。世の中のノブって回したら回転するんだけど、
それってみんな独自でやってるのかしら?独自でやるにしても、画像を勝手に
出せないしましてや回転なんかどうやんのか全くわかんない!!

でも、ハンドル画像部分にNULLを入れたら細い白いハンドルが出てきた。
やりたい事と若干違うが(2ピクセルのラインにしたい)、しばらくはこれで。

■なんとなく形にはなった
思った感じではないが、独自のスライダーやノブが動いて音色をエディットできるトコ
まではいけるようになった。これで一度CUBASEとかに読み込ませてみようかしら。

■これからの課題
・見た目をもう少し頑張るか、音の中身をもっとがんばるか、その辺迷いドコロ。
→音の中身を頑張らないと見た目頑張ったってしょうがないのだけどね。

まだまだ手探りだ!!

2015年6月24日水曜日

唐揚げ




たまーに食べたくなる唐揚げ。


コンビニ弁当だったり、


自分で作ったり。


たまーじゃないか。

2015年6月20日土曜日

Windows:すぐに解決

寝ようかと思って最後にちょっと・・とググったら、神様のサイトにしっかりとSDK3.6での
変更点が書いてあった。

引数を一つ消したらビルドが通った・・。

超簡単だった・・。ゲショーン・・。

Windows:VSTinstにGUIをつけたい・・

せっかくなので、VSTinstにGUIをつけて、他のホストアプリで音色作ったりとか
したくなってきたのでした。

いつもの神様の所からソースを拝借してビルドしてみるも、ビルドがうまいこと
いかない!!

GUIのクラスをnewする所で、

「抽象クラスをインスタンス化できません」

って出てくる。これ一体なんだべ・・。
その下には

「純粋仮想 関数 "CControlListener::valueChanged" をオーバーライドするものがありません」

って出てる。

うーむ、そもそも、VSTってスタインバーグの誰かが作ったクラスを継承して
チョイチョイと個別の部分を変えるとできあがるという作りになっているので、
その元となる所との相性の部分なのかい?よくわからん!!

大体、C出身でC++は見よう見まねで何とかなっている感じの作り方なので、
C++の継承とかよくわからんままやってきたツケがきているとも言える。

オーバーライドとか、抽象クラスとかをググるも、なんのこっちゃわからん・・

掲示板とか見ても、「valueChanged関数を必ず用意する必要あるよ!」とは
書いてあるが、しっかり用意してるし・・。

わーハマった・・。ホストについてる標準のGUIで何とか入力はできるけど、
せっかくだから自前のGUI作りたいじゃんね。

日本人の作ったサンプルは大体みた気がするので、次は結局外国の人の
サンプルを探しにいくか・・。前もこれで何とかなった事があった。でも今日は
もう頭が回らないのでネルーーーーーっ!!

頼みすぎ



王将で思わずはしゃいじゃって、


日本ラーメンにもやし炒めに餃子を頼む。


頼みすぎ!!


また若水以来のお腹いっぱいになっちゃった!!


そしてこの餃子、


油にまみれていて、どうも、だいぶ前に焼いたのを


温めなおし?て持ってきたみたい。


なんだよこれ!と思って文句言おうと思ったけど、


食べたら普通においしい。


くそう・・。

2015年6月18日木曜日

Windows:DSP道奥深し・・

FM音源が鳴ったので、次はリズムがイマイチなのと、エフェクターかしら、ということで
まずはリズムを直す。

■リズムはあっけない感じ

神様のコードがウィンドウズのWaveマッパを直接叩くヤツだったので、コードがややこしいし、
コールバックでネタを取りに来るので外部要因でリズムが遅れたりする。これが原因だった。

そこで、Dxlibの隠し命令を使ってDxsoundに直接VSTからもらったネタを書き込む事にする。

10msecコールバックを利用して、441サンプルづつ書き込んだらとりあえず鳴った。

ADPCMが鳴らなかった代わりに作ってた自前のPCMを鳴らすヤツもそこに混ぜ込む。

これで綺麗にVSTとPCMがキッチリ鳴るようになった!
なんだかあっけない!!

■エフェクターに手を出す

そしてVSTinst内蔵エフェクターを用意することに。これもまた別の神様がソースコードを
どんとサービスで置いてくれてたので、ありがたく利用させてもらう。

フィルター関連は何とか鳴るようになった。3バンドEQとして使う事に。

そしてコーラスとディレイ。

ディレイも同じ神様が別のソースを用意してくれてたので、それを借りる。
ちょいちょいと修正は必要だがなんとなく鳴った。よかった。

コーラスは更に別の神様が置いてくれてたソースを利用するも、全く鳴らない!
これが結構ハマった・・。ディレイと同じ神様のソースを利用させてもらうも、
思った感じのコーラスでは無い感じの音。うーむ、これは後で気になったら
アップデートするか。

そしてリミッターを作る。

リミッターは誰もコードを置いてくれないので、しょうがないので自分で作る事に。
これがなかなかうまくいかない・・。スレッショルドを超えた音をスレッショルドに
置き換えるだけだと、バリバリとディストーションがかかる。そらそうやわな。
ディストーションと同じ考え方だもんな。

しょうがないのでコンプ的にあるレベルを超えたらゆっくりと音が小さくなって、
スレッショルドでしっかりと音を小さくするというネタを考えつくも、うまくいく時と
いかない時などが発生してイマイチのデキ。

余りここに時間を取れないと判断して、次に進む事に。

■インタフェースは必要だけどめんどくさくて地味

MMLからエフェクターを呼ぶ部分をコツコツと作る。とにかくこれは地味でめんどくさくて
何も楽しくないけど、必要なので一個づつ作る。

今後のVSTinstとしてGUIなど入った時用に、パラメータを全部floatの0.0f~1.0fの間で
作る。これは今はめんどくさいだけだけど、後で効いてくるはず。

特にハマる事なくいけるかなーと思ったら、dbと音量の変換でハマる。

volume = pow(10, db / 20);

これだけの事に数時間かかった・・。

そして次は周波数とパラメータの変換にハマる。世の中のEQを見ると、最低20hzぐらい、
最高20khzぐらいのパラメータな感じ。それを0.0f~1.0fに置き換えるのが難しい!!

これも山ほど時間かかって、以下のコードにたどり着く。

freq = pow(10, ((value * 56) + 30) / 20);

専用のコンソールプログラムを作ってコツコツと値を作ってみました。テーブル的には

// 0 31hz
// 10 60hz
// 20 114hz
// 30 218hz
// 40 416hz
// 50 794hz
// 60 1.5khz
// 70 2.8khz
// 80 5.4khz
// 90 10.4khz
// 100 19.9khz

こんな感じ、悪くないね。左の数字は0~1の100倍の数字。検索で辿り着いた人もよかったら
どうぞ使って下さいな。

■そしてMoog的VCFへの興味

インターフェースもデキたので、サンプル曲を試しにちょこちょこと作ってみて思う。
LowPassは確かにLowPassなんだけど、なんだか素っ気ない感じ。もっとシンセっぽい
レゾナンスギュビギュビの音が使いたい!!!という欲求がふつふつと。

ネットで調べてみると日本語は全滅。

英語のサイトでいくつかサンプルコードが落ちている。
一つづつ検証していく。

3つほど試してみたが、音が全く出ない!!困った・・
諦めかけた時、4つ目のサンプルが見つかる。

強引に修正して試してみたら、小さい音で鳴ってる!!おっ!やった!!
数値を百倍してみたらちゃんと音が鳴る!!すごい!!

ちゃんとMoogっぽいVCFになってるじゃん!!ギュビギュビいってる!!気持ちいい!!

こういのをココに転載するのってありなのかなぁ・・。
まいっか。誰かの役にたつかもしれんし。

※DFLさんがMUSICDSPにアップしてたものです。

■変数
double state[4];
double ix, ixfrac;
int ixint;
double freq, q, bw, gain, resonance;
double in1 = in2 = in3 = in4 = 0.0f;
double out = out1 = out2 = out3 = out4 = 0.0f;
double moogq = moogp = 0;
double state[0] = state[1] = state[2] = state[3] = 0.0f;
■初期化
// setting pole coefficient based on frequency
double fc = 2 * freq / samplerate;
double x2 = fc*fc;
double x3 = fc*x2;
moogp = -0.69346 * x3 - 0.59515 * x2 + 3.2937 * fc - 1.0072;
// setting Q
ix = moogp * 99;
ixint = (int)floor(ix);
ixfrac = ix - ixint;
■毎ループ
// MOOGフィルターの計算
in = in / 100;
out = 0.25 * (in - out); //negative feedback
double temp;
moogq = resonance * crossfade(ixfrac, gaintable[ixint + 99], gaintable[ixint + 100]);
for (int pole = 0; pole < 4; pole++) {
temp = state[pole];
out = saturate(out + moogp * (out - temp));
state[pole] = out;
out = saturate(out + temp);
}
out *= moogq; //scale the feedback
return out*100;
■必要なテーブルと関数
// クロスフェード
static inline double crossfade(double amount, double a, double b) {
return (1 - amount)*a + amount*b;
}
// サチュレート
static inline double saturate(double input)
{
double x1 = abs(input + 0.95);
double x2 = abs(input - 0.95);
return 0.5 * (x1 - x2);
}
static double gaintable[199] = {
0.999969, 0.990082, 0.980347, 0.970764, 0.961304, 0.951996, 0.94281, 0.933777, 0.924866, 0.916077,
0.90741, 0.898865, 0.890442, 0.882141, 0.873962, 0.865906, 0.857941, 0.850067, 0.842346, 0.834686,
0.827148, 0.819733, 0.812378, 0.805145, 0.798004, 0.790955, 0.783997, 0.77713, 0.770355, 0.763672,
0.75708, 0.75058, 0.744141, 0.737793, 0.731537, 0.725342, 0.719238, 0.713196, 0.707245, 0.701355,
0.695557, 0.689819, 0.684174, 0.678558, 0.673035, 0.667572, 0.66217, 0.65686, 0.651581, 0.646393,
0.641235, 0.636169, 0.631134, 0.62619, 0.621277, 0.616425, 0.611633, 0.606903, 0.602234, 0.597626,
0.593048, 0.588531, 0.584045, 0.579651, 0.575287, 0.570953, 0.566681, 0.562469, 0.558289, 0.554169,
0.550079, 0.546051, 0.542053, 0.538116, 0.53421, 0.530334, 0.52652, 0.522736, 0.518982, 0.515289,
0.511627, 0.507996, 0.504425, 0.500885, 0.497375, 0.493896, 0.490448, 0.487061, 0.483704, 0.480377,
0.477081, 0.473816, 0.470581, 0.467377, 0.464203, 0.46109, 0.457977, 0.454926, 0.451874, 0.448883,
0.445892, 0.442932, 0.440033, 0.437134, 0.434265, 0.431427, 0.428619, 0.425842, 0.423096, 0.42038,
0.417664, 0.415009, 0.412354, 0.409729, 0.407135, 0.404572, 0.402008, 0.399506, 0.397003, 0.394501,
0.392059, 0.389618, 0.387207, 0.384827, 0.382477, 0.380127, 0.377808, 0.375488, 0.37323, 0.370972,
0.368713, 0.366516, 0.364319, 0.362122, 0.359985, 0.357849, 0.355713, 0.353607, 0.351532, 0.349457,
0.347412, 0.345398, 0.343384, 0.34137, 0.339417, 0.337463, 0.33551, 0.333588, 0.331665, 0.329773,
0.327911, 0.32605, 0.324188, 0.322357, 0.320557, 0.318756, 0.316986, 0.315216, 0.313446, 0.311707,
0.309998, 0.308289, 0.30658, 0.304901, 0.303223, 0.301575, 0.299927, 0.298309, 0.296692, 0.295074,
0.293488, 0.291931, 0.290375, 0.288818, 0.287262, 0.285736, 0.284241, 0.282715, 0.28125, 0.279755,
0.27829, 0.276825, 0.275391, 0.273956, 0.272552, 0.271118, 0.269745, 0.268341, 0.266968, 0.265594,
0.264252, 0.262909, 0.261566, 0.260223, 0.258911, 0.257599, 0.256317, 0.255035, 0.25375 };

2015年6月11日木曜日

これなんだろ



この食べ物なんだろ・・


全く記憶にない・・


※本文を書いてるのは2ヶ月後


と思って写真のGPS情報見たら、


和食さと付近で撮った写真っぽい。


うーん・・・


あ、そうだ!!


モツ鍋食べたんだった!!


今どきは位置情報も写真についてて便利やな~

2015年6月10日水曜日

Windows:vstでFM音源鳴った・・

VSTのホストを使って、VSTインストを鳴らすってトコは割りとすんなりいった。
そこで、欲が出て、X68sound.dllの置き換えができるVSTinstが作れないか?というのが前回まで。

早速、FM音源とは何か?という勉強を始める。
ネットには、正直ほとんど資料は落ちていない。

FM音源の曲データを作るのはまだちょっとはあったけど、FM音源そのものを作りたい
という人は全くいないらしい。わはは。

もうしょうがないので、ちょろっとある資料を元に原理を調べてみる。

ふむふむ、まず、サイン波で音を鳴らす時、あの波が1秒間に440回だと、
「A」つまりラの音が鳴るという事がまずベース。

そこに、別のサイン波の音を畳み込んで計算すると、音が変調されて、
あの例の音になるらしい。

実際に、サイン波に別のサイン波を畳み込むという計算方法がまずわからなかった。
具体的には、簡単に書くと、

sin(2.0 * PI * 周波数)

これでとりあえず周波数のサイン波が出る。
畳み込みするためには、このカッコの中に、前のサイン波の結果を入れるのだ。

sin( sin(2.0 * PI * 周波数1) + (2.0 * PI * 周波数2))

こんな感じ。これで周波数1がモジュレータ、周波数2がキャリアとなる。ここまでは、
正直、すぐにできた。でも、FM音源独特のギョイ~~ンという感じにはならない。

■困った時は神様に頼る
というわけで、世の中に落ちていたソースを使って何がおかしいのかを探る。
x68sound.dllがビルドできたし、その他にもFMGENというソースも見つかった。
この2つのソースを行ったり来たりして解析を進める。

ADSRを自作してみた。しかし、目指すFM音源のADSRはものすごく特徴的で、
簡単な計算では全く似てこない。神様はやはりテーブルを作成していた。

ここで、powとかexpとかの使い方でハマった・・。
今でもよくわかんないけど、この辺りの関数をしっかり使うのが必要。

■ちゃんと計算したらダメ
やはり20年も前の技術なので、今の64bitの環境でヌルっと計算しても、あの感じ
にはならない。出来る限り再現したかったので、神様のソースに頼る。

■もうダメかと何回も思う・・
何度やってもいい感じにならないので数回諦めかけた。そこで何かひらめいて
次やってみたらちょっと進む、の繰り返し。もうたくさん躓いたので何か覚えてない!

とにかく、神様のソースを百回以上読んで、頂ける所はコピペ。自分で作る所は
自分で。あっちゃこっちゃガチャガチャやってたら、さっき、何とか鳴った!

ギョインって鳴った!

どうしてギョインって鳴るのかわかんないけど、とにかく鳴った!よかった!!

自作VSTinstに組み込めたので、今後は、

・オシレータをサイン波だけじゃなく、矩形波、三角波、ノコギリ波なども入れたい。
・エフェクターを入れ込みたい。
・現在リズム感が悪いので、チャキチャキと鳴らしたい。

この辺りを狙っております。いけるかな・・。


2015年6月4日木曜日

Windows:VSTホスト作成メモ

FM音源を鳴らす要領で、VSTインストを鳴らしてみたら、割りとちゃんと鳴った。
そこで細かくハマった所があったのでメモ。

■MIDIに頼ってもダメ
VSTiにMIDIデータを送れるっつーんで、ノート情報以外のを送ってみたけど、
うまく対応してくれるのと、そうでないのがある。そこで、ボリュームやパンは
結局自分で作る事に。

VSTiが送ってくるサンプルの大きさをいじって実現。

線形でやると全然音量的にはリニアにならないけど、元々のFM音源の方が
そうだったのでそのまま放置。データ作るようになってやっぱり必要だったら
例のlog10を使った奴を使うか・・。

■バスの作成方法わからず
神様の作ったサンプルは一つのVSTiをそのままウィンドウズのWAVEマッパ
に送るだけの超シンプルなもので、2トラック以上を実現しようとすると、何か
手が必要だった。

クラスを配列化して、スロットを作り、そこにVSTiをはめるトコまではまあ色々
あったけど何とかなった。

その次、音を混ぜるのってどうやるの!?ってトコでハマる。

色々と調べてみると、単純に、バッファのデータに次のデータを足せばOK
という事にたどり着く。えー!?そんなんでいいの!?

実際やってみたら、普通に加算でミックスされていた。意外と音って単純なの
ね・・。そういえば波形データ触る時も、単純に波形を足したりとかしてたわ。
なんだか当たり前の事を再確認した。

でも、その足したのをVSTエフェクトで加工したいのだけど、インのあるVST
への音を渡し方とかがさっぱりわからず。これがうまいこといくと、BUSを
作る事ができて、いい感じの音になるんだけどなぁ~。

■というわけで
次の方向性を模索するも、やはり、何もかも全部自分で用意したい!という
ロマンに取り憑かれてしまった。もやもやしていた仕様をまとめると、

・VSTインスト、VSTエフェクトを自作
→GUIを持たないシンプルなFM音源ナド
・VSTホストを自作。ZMS互換のMMLベース。
→データはGUIを使わず、全部テキスト
・音データを自作
・それらが動くレトロ的ゲームの作成

この辺りを狙いたい。狙った所で何があるのか全くわからないが。

2015年6月2日火曜日

Windows:VSTホストを作れるのか?

色々あったけど、途中で書いておけばよかった・・。だいぶ忘れた・・。

さて、FM音源ドライバーが一旦落ち着いて(バグはあるが)、次の展開を考えていた所、
ドライバーの演奏部分がいい感じにできているので、FM音源だけでなく、VSTの
インストゥルメントをプラグイン的に挿して演奏できたら面白く無い?という事に至る。

そこで早速ググってみるも、日本人は実質一人くらいしかVSTホストに関して
取り組んでない感じ。いや、やってるんだけど、ググっても全く出てこない。

この神様のような人の作ったVSTホストを解析して、ウチの演奏先をVSTにできる
のか、ということで2日程試行錯誤。

結果的には、先ほど音が鳴った。すごい。

でもハマった所をいくつかメモ。

■余計なライブラリを使うの止めて!
<balor>
神様もGUI部分は面倒臭かったらしく、2011年くらいに開発が止まったライブラリを
使っていた。balorというGUIなどをちゃちゃちゃと作れるライブラリ。

これに依存しているGUI部分の解析に時間がかかった・・。

DLしてきてそのままリンクしてもビルドできず。そこでプロジェクトを見つけてリビルド
してみるも、ビルドエラーなどで全くライブラリ作れず。神様はちょいちょいと修正
したらビルドできたよ!とか言ってたけど、何か決定的な壁を感じて断念。

GUI無しでも行けるはずなので、そこはもうbalor無しで取り組む事に。

<boost>
これは昔もミンナ使ってたライブラリだなぁとか懐かしい感じに。

確かにboost使うと色々と便利なのでこれ使い出したら頼っちゃうよね・・。
でもリンクやライブラリのコンパイルにえらい時間がかかった・・。四苦八苦。

スタティックとか色々の設定あるけど未だわからず。

<std>
もはやC++では当たり前の存在らしいstdライブラリ。標準ライブラリとして普通に
皆さん使ってますな。std::vectorとかすごくいいよね。これで速ければメモリの
無駄使いにならないし。

でもこれの理解にだいぶ時間がかかった・・。

■balorの置き換え
ちょいちょいと修正してみるも理解してないので進まず。なかなかビルドが通らず。
悩んでググってみると、英語のページでいい所を見つけた。

すっごくシンプルにVSTを読み込むサンプルがあった。

ここのサンプルをちょいちょいと試したら、VSTが読み込めた!やった!

そしてこのサンプルの内容がわかってくると、ようやく神様の作ったソースも
内容が少しづつ理解できるように。

そこで、英語のサンプルからちょっとずつ神様のサンプルへ移行。

■ネームスペース
未だよくわからんけど、コードの書き方に自分ルールが持ち込めるという事
らしいが、これにだいぶハマった・・。まあ自分ルールはいいんだけど、サンプル
としてはもっと素っぴんの状態でお願いしたいよね・・。

■クラス化
C出身で未だにCっぽいプログラムしか書けないが、サンプルを読むのにC++な
クラスは必須。最近は少しづつクラスの書き方も読めるようになってきた。
自分ではなかなかクラス設計できないんだけどね!