音を鳴らすことがようやくできるようになった。だがまだまだいい加減なつくりだ。適当にウェーブテーブルを作って再生してみると、結構PSGっぽい音を奏でる。まだフィルターも実装していないのでまったくの素の音である。
実装をさらに進める前に、デバッグ用に簡単なステップシーケンサークラスを作ることにする。
音を鳴らすことがようやくできるようになった。だがまだまだいい加減なつくりだ。適当にウェーブテーブルを作って再生してみると、結構PSGっぽい音を奏でる。まだフィルターも実装していないのでまったくの素の音である。
実装をさらに進める前に、デバッグ用に簡単なステップシーケンサークラスを作ることにする。
No related posts.
「std::bind – メンバ関数の束縛がよくわからん」は単なる凡ミスだった。bindの書き方は誤りではなかった。
関連記事:
音楽再生スレッドのリアルタイム性能について | Phile-webコミュニティ.
Windowsにおけるリアルタイム音声再生の留意点。再生アプリであれば今のところこの記事の内容でほぼ網羅されているのではないかなと思う。
レイテンシ(≒バッファサイズ)はDAWなんかではもっとシビアだ。再生アプリではバッファを短くするとブチブチ鳴る確率が高くなるので、再生アプリではできる限りバッファを大きくとる設計でよいと思う。しかしDAWでレイテンシを200msとか取るとキーボードを弾いてから発音までに明らかに遅れを感じる。私のような鈍感な素人でも、5ms位から遅れを感じるようになる。理想は1msくらいかなとか勝手に思っている。なので相当パフォーマンスに配慮した設計が必要になってくる。
WASAPIが出るまではWindows標準で低レイテンシな再生を行うのはカーネルストリーミングという手法しかなくて、それもちょっと裏技的な感じのするものだった。あとは3rdベンダーのASIOを使うかだが、これは対応するハードウェアが限られていた。WASAPIの登場によって低レイテンシなサウンド再生が可能になったのだが、対応しているソフトウェアでもレイテンシを1-3msで設定するとブチブチなるものがある。高性能なハードウェアが安価で利用できる現在にあってもリアルタイム音声処理はソフトウェアの最適化が品質に大きく影響する世界である。
Windows 8 CPではMetro StyleでのWASAPI排他モードでのサウンド再生がサポートされてないようだ。ひょっとすると私のハードの問題だけかもしれないが。なので1-3msの低レイテンシなサウンド再生は現状だと厳しくて、これがRTMでもそうならMetro StyleでDAW的なソフトを作るのはできないことはないが、その品質はある程度以下のものしか望めないことになる。
関連記事:
関連記事:
下記のようなコードを書いたが、std::bindの部分が意図したように動かない。std::functionにstd::bindでthisポインタを保持させたいのだが、どうもthisポインターが指すインスタンスのコピーを保持してしまっているような感じなのである。thisポインタの部分をstd::ref(*this)にしても同じだった。よくわからん..。そもそもこんな使い方だめだっけかな..。
struct WaveTable : public Oscillator
{
typedef std::vector<float> WaveDataType;
typedef std::function<void (float * ,float)> ProcessorType;
WaveTable() : waveCounter_(0.0f),stereo_(false)
{
Stereo(false);
};
void Process(float * data,float delta)
{
// ステレオのときはProcessStereo()を呼ぶ
// モノラルのときはProcessSMono()を呼ぶ
processor_(data,delta);
}
void ProcessMono(float * data,float delta)
{
// モノラル時の処理
}
void ProcessStereo(float * data,float delta)
{
// ステレオ時の処理
}
bool Stereo() const {return stereo_;}
void Stereo(bool v) {
stereo_ = v;
if(v)
{
// ステレオのときはProcessStereo()を呼ぶ
processor_ = std::bind(&WaveTable::ProcessStereo,this,_1,_2);
} else {
// モノラルのときはProcessSMono()を呼ぶ
processor_ = std::bind(&WaveTable::ProcessMono,this,_1,_2);
}
}
関連記事:
関連記事:
音源作りをぼちぼちと続けている。昨日今日と休日だったので音が鳴る程度まで持っていこうと思っていたけれどいつもどおりのグダグダした休日を送りそこまでいけそうにない。最近はソファーでごろごろするのが至福の時間となっていて、特に昼食をしっかり取った後のソファーでの昼寝がもう最高に好きで、シエスタのある国に移住したいと思っているほどだ。このソファーは結婚した時から使っている。布製のカバーはあちこちに綻びができているが寝心地はきわめてよい。まあごろごろ+昼寝で数時間を費やし、あとは家事手伝いをするのが2時間、TVやネットで2-3時間、残された時間はほとんどない。ヘタレの生活というものはこういうものなのだ。
それはさておき、今は「ベタ」に実装していっているけれども、パフォーマンス的に問題が出そうな気もするし、実際は大したことないような気もするが、Synth-1なんかはやっぱりコンパイラの最適化だけではなくて自前での最適化も行ってあのクォリティを保っているのでなんらかの最適化は必要だろう。アルゴリズムの最適化を施すということが先決だが、SIMDを使用した最適化の余地も残しておきたい。だがMetro Styleではその余地はあまりなさそうである。わたくしはX64を志向しているのでインラインアセンブラは使えないし、XBYAKも使えない。唯一イントリンシックが使えそうだけど、それだけではたして大丈夫だろうかとも思う。デスクトップでXAMLを使えるようになって、VS 11 Expressでデスクトップアプリが作れるか、もしくはMetro Styleでデスクトップアプリ並みのAPIが使えるようになればベストなのだが、マイクロソフトさんはそういうことを実現してくれるだろうか。いやしないだろうね。たぶん。特に後者はしないだろうね。ARMとかの対応もあるし。
そんなこと考えてないで、動くものを作ることが先だが。
No related posts.
Implementing MicroThread / Coroutine via esp-swap for Danmaku Shoot….
マイクロ・スレッド(コルーチン)によるシューティングゲームの製作。コルーチンを使うと状態変数の数が減ってコードの見通しもすごく良くなる。シューティングゲームにはもってこいなんだけどパフォーマンスに課題があり実用的ではなかった。
このプレゼンのアイデアはコンテキスト・スイッチを自前で実装することでパフォーマンスの問題を解消するというもの。このアイデアはやねうらおさんも10年ほど前に言っていた。
これ以外で実装するとなるとスレッドやファイバーなんかを使わなくてはいけなくなり、コンテキスト・スイッチの負荷が無視できなくなる。Windows7以降だとUMSを使ったりとか。スレッドやファイバーでの実装例としてはBoost.CorouineやHamigaki.Coroutineなどがある。
コルーチンとか継続ネタって何年かに一回盛り上がるんだよね。ワールドカップやオリンピックのように。最近はBoost.Contextでまた盛り上がってきているような気がする。
今作っているシューティングゲームもこの考えを取り入れたいが、X64だとインライン・アセンブラが使えないしまたMetro StyleだとXBYAK使えないのでどうしようか悩んでいる。デスクトップ・アプリにすると今度はUIの問題が出てくるし本当に悩ましいね。一番の問題は高い壁(私にとって)を乗り越えられない私のヘタレさだが。
関連記事:
Windows Runtime XAML for the Desktop | Paul Spiteri's Blog.
WinRT XAMLをデスクトップで使えないかを調べた記事。C#のデスクトップアプリではできた。もちろん非公式だが。
デスクトップ + WinRT XAMLという組み合わせを望んでいる人は結構多いみたい。やっぱりWindows FormやMFCよりも高機能だしね。唯一ダメだったのはパフォーマンスだったけどそれもネイティブになったことで改善されたから。
ネイティブC++ではほんとにUI開発環境はダメだというか進化がなかった。ダイアログエディタから止まっている。WinRT XAMLだとネイティブだしUIデザイナーも優秀だしデスクトップでサポートしてくれればUI開発環境が飛躍的に向上するのだが。
Windows 8 で改善してほしいフォントと日本語テキスト表示の問題 – Togetter.
これは確かにそう思うね。最近仕事でAppleのプロダクトを触る機会が多いけど、フォントの美しさの違いは私のような素人でもわかる。Windowsの画面に見慣れているとMacやiPadの画面の美しさは衝撃的だ。ただそれだけでMacにしようとは思わないが。