読者です 読者をやめる 読者になる 読者になる

S.F. Page

Programming,Music,etc...

DAWもどきの作成

ビルドできるようになった。

ようやくC++/CXを使ってWinRT APIをDesktopアプリからいじれるようになった。ただいまコンパイルエラーと格闘中である。 WinRTで置き換わっている部分は古いAPIを使わないでおこう。PPLや新しいAPIたちも積極的に使っていこう。

WASAPI管理クラスのコンパイルは通るようになった。

WASAPI管理クラスのコンパイルは通るようになった。 これをMetro UIと結び付ける必要があるのだが、面倒臭いんだよね。データバインドを使いたいところだけど、WASAPI管理クラスはref classじゃないので簡単にはできなさそう。ref classを使うとデータバイン…

WaitForSingleObject

WASAPIでイベント駆動モードで動かすためにはイベントを待つ必要があるのでWaitForSingleObjectを使っていたのだけれどMetro Styleでは使えなくなっていた。WaitForSingleObjectExに移行せよということのようだ。Metro Styleへの移行とともに古いAPIを淘汰す…

Code View デバッガ

VS11のデバッガを使っていて、つくづく思うのはCode Viewでデバッガ環境が変わったなということ。 私はゲームがアセンブラで作られていた時代にゲーム会社に3年ほど勤めていたのだけれど、その時にはソースコードにブレークポイントを設定して止めたり、ステ…

コードの変更

以前作ったCore Audio管理クラス群をWindows8に移植し始めた。今のところ、 __com_ptrはMicrosoft::WRL::ComPtrに変更 MMDeviceによるデバイス列挙はWindows::Devices::Enumerationに変更 IAudioClient2のActivateはActivateAudioInterfaceに変更 eDataFlow…

Sleepの代替

Sleepが使えないというのはちょっとした話題になっていたようだ。 How used sleep function in windows 8 consumer preview version Thread.Sleep in Win8 Is there a supported API in Metro for replacing "Sleep" ? Sleepの代替としては.NET4.5のTask.Del…

ActivateAudioInterfaceは使える。

ドキュメント化されていないActivateAudioInterfaceの件。このAPIからIAudioClient2インターフェースを取得することができる。 DeviceInformationからIAudioClient2を取得する方法が分かったので、以前作ったものをベースにWASAPI管理クラスを作っていくこと…

IAudioClientをActivateするには?

Windows::Devices::Enumerationでサウンドデバイスを列挙することができることはわかったが、DeviceInformationからどのようにしてIAudioClientを得るのかがよくわからない。おそらくActivateAudioInterfaceなのだろうがドキュメント化されていない。ヘッダ…

DeviceInformationCollectionの列挙はrange-based forでも列挙できた。

DeviceInformationCollectionの列挙はrange-based forでもできた。 DeviceInformation::FindAllAsync(DeviceClass::AudioRender)->Completed = ref new AsyncOperationCompletedHandler<DeviceInformationCollection^>( [=] (IAsyncOperation<DeviceInformationCollection ^>^ asyncInfo, AsyncStatus asyncStatus) { if(as</deviceinformationcollection></deviceinformationcollection^>…

WinRTでオーディオデバイスを列挙してみた

WinRTを使ってオーディオレンダリングデバイスを列挙してみた。ソースはこんな感じ。もうC++に見えませんな。。 DeviceInformation::FindAllAsync(DeviceClass::AudioRender)->Completed = ref new AsyncOperationCompletedHandler<DeviceInformationCollection^>( [=] (IAsyncOperation<DeviceInformationCollection ^>^ a</deviceinformationcollection></deviceinformationcollection^>…

UI部分は全面的に作りなおすことにする

いろいろ考えたがGame of Life 3Dを見てUI部分は全面的に作りなおすことにした。Windowラッパ部分も全面的に見直す。コントロールは自前で作る。描画はDirect2D/Direct3d/DirectWriteを使って行う。UIデザイナも作ることにする。

オーナードローに取り組む

シーケンスエディタダイアログのオーナードローに取り組むことにした。その前に今までの変更をcommitしておいた。 ソースコード しかしSIDEMuというブランチを作っているがブランチ名と内容が合ってきていない。まあ最終的にはSIDエミュを鳴らすつもりなので…

オーナードローのメモ

オーナードローについてのメモ。 オーナードローの方法 コントロールを作る時(CreateWindowとかダイアログエディタでコントロールを配置するとき)にウィンドウスタイルにコントロール毎に決められているオーナードローのフラグをセットする。ボタンの場合…

コントロールの自前描画を考えている

シーケンサ部分は古い感じの蛍光表示管のような感じか、オレンジ色のプラズマディスプレイぽい感じにしたい。そうするにはコントロールを自前描画する必要がある。 方法としてはオーナードローにして、描画はDirect2Dで行おうかなとか考えているけどまだまと…

ラッパライブラリの改良 – イベントハンドラは結局LRESULTで返すことにした

イベントハンドラの戻り値は結局LRESULTで統一することにした。WNDPROCもDLGPROCも。boolで返すのはやめにした。メッセージによっては真偽の2値以外の値を返す必要があるので。 template <typename ProcType = WNDPROC> struct base_win32_window : public base_window { typedef ProcTyp</typename>…

MC-4 Operation Manual

会社の行き帰りの電車の中でMC-4 Operation Manualを読んでいた。なかなかわかりやすいマニュアルである。譜面を例に、スタッカートだとゲートタイムを短めにレガートだとゲートタイムとステップタイムを同じくらいにするとかくらいの細かい解説がなされてい…

ラッパライブラリの改良 - イベントハンドラとか

ラッパライブラリのベースクラスの実装はとりあえず終わったものの、戻り値の処理についてどうしようかなと思っている。今のところイベントハンドラ側でboolで返させてOSにはLRESULTもしくはBOOL似変換して返すようにしている。 /** window ベースクラス */ …

ウィンドウプロシージャの戻り値とか

ウィンドウプロシージャの戻り値 ウィンドウプロシージャの戻り値はLRESULT(LONG_PTR)であり普通は0を返す。この0を返すというのはどういう意味があるのかつい最近までわかっていなかった。またメッセージにかかわらず0を返せば良いというものではないという…

Windowsメッセージハンドラの実装方法を考える

本格的にUI作りに取り組むにあたり自前のWindowラッパを改良しようとしているところ。 ウィンドウメッセージのハンドリングについて検討している。 多くのWindowsラッパではhwndをインスタンス変数として種々のAPIをメンバ関数としてラップするのが普通であ…

Windowラッパの部分を改善してみるかな

DarkWave StudioやHiloのソースコードを見ていると少し自前作成のWindowラッパが見劣りしてきたので改善してみようかなと思っている。やらないかもしれないけど。 具体的にはキーボードやマウスイベントなどの部分をデフォルトでハンドルできるようにすると…

第 4 章: Hilo ユーザー エクスペリエンスの設計

第 4 章: Hilo ユーザー エクスペリエンスの設計. 第四章はUIの設計方法について書いてある。確かにこういうモックアップを作る工程は必要だし、この部分は紙に手書きが一番効率がいいような気がする。私もこれに倣ってシーケンスエディタの設計をやってみる…

ちょっといろいろおさらいとか。考え事とか。

シーケンスエディタは本格的にUIを作るのでUI周りのAPIのおさらいとかをBoost MSMの学習と並行して行なっている。High DPIとか、DirectWrite、Direct2Dなど。歳をとるとほうっておくとどんどん脳から情報が失われていくので維持が本当に大変だ。 画面イメー…

Boost MSMをどう実装に持っていくかを考えている

サンプルコードはなんとか読めるようになったけれど、これをどう実際のコードに持っていくかを考えている。状態を値から型で保持するので(メタだから当たり前だけど)考え方を変えなくてはいけない。今の既存のコードは変数で状態を持っていて、スレッドセ…

Boost.MSMの使い方

Boost Meta State Machine (MSM)のドキュメントを読んだけれど英語のせいもあってかピンとこない。日本語のドキュメントを探すとすごい深堀りしている方を発見。その中の資料がすごくわかりやすかった。 Boost勉強会#6札幌の発表資料事前公開 上記ドキュメン…

Boost.StateChartとMeta State Machine

シーケンスエディタの状態遷移を書くのにBoost.StateChartが使えないか試してみようと思う。 またMeta State Machineとかもあるようでなんか面白そうだが、私に理解できるだろうか。

やはりST/GT方式でまずいくかな。

シーケンスエディタを作るところで、停滞気味となっている。やっぱり作るのが億劫なのだ。なんでかというと面倒だしあんまりこの手の画面を作ったことがないからだと思う。 私はピアノをまともに弾けないので必然的に打ち込みとなる。いろいろググるとやっぱ…

MIDI Editor

今まで「MIDIシーケンサ」でググっていたんだけれども、「MIDI Editor」でもヒットすることに気がついた。海外ではMIDI Editorが一般的なのかな。 ググッた結果を見ていくと、この手のソフトはピアノロールなんていうのは今や当たり前な機能なのだということ…

お手本のチェック

シーケンサ部分だけれども、データフォーマットは大体固まった。今はエディタ部分をどうするか思案していところ。一番苦手なところなのでインターネット上にあるオープンソースのMIDIエディタとかのソースコードを参考に作ろうかなと思っている。でもベタなW…

シーケンサ作り - データフォーマットを考える

年末・年始と集中してやる時間はなかったが、シーケンサのデータフォーマットを考えていた。データフォーマットはAodixに倣うつもりでいる。普通の(といってもレコポやSTED)MIDIシーケンサとしても使えるし、トラッカーみたくパターン+シーケンスの組み合…

リサイズ可能してみた。

今のウィンドウサイズだとシーケンサ画面では小さいような気もするのでリサイズ可能にしてみた。 シーケンサウィンドウのフォントを「これ」にしたいなと思っている。普通だとフォントをインストールしないといけないんだけれど、DirectWriteではカスタムフ…

シーケンサ部分の作成 - タブダイアログのみ

タブ周りのコードを整理し、ハリボテのシーケンサタブを作成してみた。これから中身を実装していくつもり。そのまえにMC-4のドキュメントを読まないとね。。 シーケンサを動かすには今のウィンドウサイズでは小さいのでリサイズ可能にするつもりだけど、まだ…

タブダイアログのクラス化

シーケンサ部分を作る前にタブが増えてきたのでタブ周りのコードを整理することにした。 タブコントロールはタブ内に表示されるものはすべて自前で作成する必要がある。タブは切り替えてくれるけれど、タブの中身は切り替えてくれないのである。私は「How to…

ENSONIQ製シンセサイザー搭載FL管モデルフォント「ENSONIQ FL」

ENSONIQ製シンセサイザー搭載FL管モデルフォント「ENSONIQ FL」. このフォントを使ってシーケンサ部分を作ってみたいな。

シーケンサ部分を作ろうかなと思う

SIDの解析もそこそこにシーケンサ部分を作ろうかなと思う。脳内では32chぐらいでオーケストレーションできているイメージをふくらませたりして盛り上がっているけど、いざ手を動かして作ろうとすると全然ヤル気が出ないのだが。 画面としてはAodixのエディッ…

エミュレーションをできる限り端折ってSIDファイルを鳴らしたい

MOS 6581のエミュレータ&プレイヤーライブラリであるsidplayとReSIDのソースコードをざっくりと見終えた。やっぱり再生部分はC64エミュレータ上の6510の機械語で作られた再生ルーチンでSID(6581/8580)エミュレータを動かすようである。 私はC64エミュレータ…

ソースコードチェックはサボり気味

年末に来てトラブルが重なり、気が滅入ってソースコードを見るどころではなかった。だいぶ持ちなおしてきたが。

SID Play2 - プレイヤ本体はC64アプリ?

ソースコードを読んでいる。.sidプレイヤーはどうもC64エミュレータ上で動くアプリのようである。.sidファイルを読み込んでC64のエミュレーションメモリにコピーし、同様にエミュレーションメモリ上にアプリをコピーし実行しているようだ。とても面白い構造…

SIDPlay2のコードを読む事にした

SIDPlay2は64bitでも普通にコンパイルできたので、コードを読んで中身を学ぶことにした。 SIDPlay2は.sidファイルを再生するプレイヤーだけれど単にSIDをエミュレートするのではないようだ。6510CPUのエミュレーションコードも入っている。ひょっとするとC64…

SIDPlay2のビルドはできた。

sidplay2のx64ビルドは意外と簡単にできた。「sidplay2 fork with resid-fp」だとVS用プロジェクトファイルがおかしいのとソースコードにも不具合があったので結局元の「SIDPLAY2 Home Page」からコードをチェックアウトしてビルドしなおした。一箇所だけソ…

SIDPlay2のビルド

まずはSIDエミュレーション音源を鳴らしてみようと思う。SIDエミュレーション音源のライブラリ&プレイヤーとしてはsidPlay、それのfork版の「sidplay2 fork with resid-fp」があるのでそれを64ビットでビルドして動かし、プレイヤの構造を勉強してから自分…

サウンド・チップを鳴らしてみようかな

前からやりたかったSIDやらMAMEの中にあるサウンド・チップエミュレーションコードを取り込んで鳴らしてみようかなと思っている。

考え事

キャプチャが動いてそこそこ安定したところで次はどうしようかと思案中。 いろいろやりたいことをリストアップしてみると 出力データのエクスポート サンプリングレートコンバート デジタルフィルタ(IIR,FIR) フーリエ変換による周波数解析 いろいろなオー…

少しいじった

やっぱりミキサ処理を出力処理と同時に行うことにした。結果キャプチャの遅れがかなり少なくなった。 次は何しようかなと考えている。フィルタやFFTをやるにはまだ知識が足りていない。

ようやくキャプチャできるようになった。

ようやくキャプチャできるようになった。まだメモリ破壊のBUGは残っているが。なんで起こるのかはよくわかっていない。気がつくとヒープが壊れている。 聴いてみた感じだがキャプチャ->キャプチャキュー->ミキサ->ミキサキュー->出力となるのでWASAPIが持つ…

音は鳴るようになった

ようやく音は鳴るようになった。でもまだマイク入力(キャプチャー)は動かしていない。WAVデータとタイミングを合わせてミックスしないといけないので少し考えないといけない。

やっぱり1発では動かない。

WAVファイルを読み込み非同期で再生しながら、マイク入力をキャプチャし、ミックスして出力に送ろうとしている。ようやくコンパイルが終わり動かしてみたらスピンロックを多用しているのが効いたかCPU負荷が98%近くまで上昇しPCが死亡。恐ろしいプログラムだ…

もう少しでできそう

マイク入力(キャプチャデバイス)とWAVファイルデータをミックスして出力するように改造している。もう少しでできそうなのだがヤル気が萎えてきているせいで遅々として進まない。寒いせいだろうか。 マイク入力(キャプチャデバイス)とWAVファイルデータを…

大幅な作り直し

今までの延長線上で作りなおそうと思ったけれど、クラスの構造から大幅に見なおすことにした。具体的には下記の図のように改造しようとしている。 それぞれの四角は個別のクラスとして実装し直す。それぞれは別々のスレッドで動作する。スレッド間でデータを…

What happens when audio rendering fails? - Larry Osterman's WebLog - Site Home - MSDN Blogs

What happens when audio rendering fails? - Larry Osterman's WebLog - Site Home - MSDN Blogs. あ、そうだIAudioSessionControlの実装を忘れていた。これ読んで思い出した。

キャプチャ対応の進捗や今後とか

キャプチャ対応だが今週末の土日でなんとか鳴るかなと言った進み具合である。 一応方向性としては再生アプリではなく、DAW/トラッカーのようなものをめざしている。なのでそれを構築するために必要な知識を得つつ、巷のコードを参考にしながら興味のある機能…