A. 技術番号 1 は非常にプロセッサを集中的に使用するため、実際には実行可能ではないことを読みました。これは、iPad のような ARM プロセッサにも当てはまりますか?
これにより、単純な問題が複雑になります (しゃれが意図されています)。Accelerate.framework は、これらの関数 (fwiw) の最適化されたバリエーションを提供しますが、単純な問題を複雑にしています。一般的な注意事項: デバイスでの浮動小数点計算は低速です。浮動小数点の実装は、プログラムをかなり危険にさらす可能性があります。機能、ポリフォニー、または品質が大幅に低下する可能性があります。要件を知らなければ、浮動小数点計算でうまくいくかどうかを判断するのは困難です。
B. どの手法を選択したとしても、オシレータの出力にローパス フィルタを接続するだけで、エイリアシングの問題を解決できますか?
オーバーサンプリングしない限り、時間領域で生成された信号では機能しません。
C. そのようなオシレータを実装する方法について他に何か提案はありますか?
下記参照
D. どの C++ ツールキットを使用するかについて何か提案はありますか? 私は CCRMA の STK を見てきましたが、他にもっと適切なライブラリがあるかどうかはわかりません。
STK は、組み込みシンセサイザー用に設計されたツールキットというよりも、教育ツールに似ています。より適切な実装が存在します。
オプション 1. ノブの位置を取得して実際の信号のスペクトル (振幅と周波数の配列) を計算する関数を考え出し、一連の正弦関数と合計ブロックを使用して出力信号を実装します。
オプション 2. 1. と同様ですが、サインと合計の代わりに逆フーリエ変換を適用します (この時点では、それらが実際に同じものかどうかはわかりません)。
デスクトップでは比較的遅いです。
オプション 4. 2 つのノコギリ波 (偶数倍音と奇数倍音の両方を含む) から始め、1 つを反転して合計し、ノブでそれぞれの振幅を制御します。波形は
エイリアスのない生成のために、これを非常に効率的に (たとえば、BLIT を使用して) 行うことができます。ただし、BLIT は少数の波形に制限されています (Saw と Square に使用できます)。歴史を振り返って、「2000年頃のハードウェアおよびソフトウェアシンセで、この問題をどのように解決したか」と尋ねることができます。これが1つの解決策でした。もう一つは:
オプション 3. 可能なノブ位置ごとに波形テーブルを生成し、ウェーブ テーブル合成技術を使用して出力信号を生成します。
デバイスの機能を考慮して、これまたは BLIT の int 実装をお勧めします。
このテーブルは理解と実装が簡単で、優れたサウンドと CPU の結果を提供します。また、CPU/メモリ/品質のトレードオフを高度に構成できます。
エイリアスを解放したい(または近い)場合は、BLIT(またはその親戚)を選択してください。その理由は、ウェーブテーブルで可聴エイリアシングを最小限またはまったくなくすために、十分な量のメモリと十分な量のオーバーサンプリングが必要になるためです。
実装:
BLIT (およびファミリ) の実装がオンラインで多数あります。
テーブルのナプキン落書きは次のとおりです。
enum { WF_Sine, WF_Saw, WF_Square, WF_COUNT };
enum { TableSize = SomePowerOfTwo };
struct sc_waveform {
uint32_t at[TableSize];
};
enum { NPitches = Something };
sc_waveform oscs[WF_COUNT][NPitches];
初期化時に、加算合成を使用してデータを取り込みoscs
ます。
再生中は、次のいずれかを使用します。
- テーブルから読み取るための補間とオーバーサンプリング
- または、信号のかなりの量のオーバーサンプリングとダウンサンプリング (これは CPU 効率的です)。
参考までに: オーバーサンプリングせずに無責任な量のメモリ (利用可能な量を考慮して) を消費したテーブルの線形補間は、最高の部分音を可聴的に減衰させず、 44.1kHzでレンダリング。これは単純なブルート フォース アプローチです。少し余分な作業を行うことで、より良い結果を得ることができます。
最後に、「Vector Synthesis」をグーグルで検索すると、関連情報も見つかるはずです。あなたが説明しているのは、その原始的な形式です。