信号データの生成

前回のサンプルライブラリを修正しました. (終了処理用の関数 pcmFin() 周辺にバグが潜んでいました.) 今回の実習を始める前に,最新バージョンへ更新してください. pcm.c をDLし, make コマンドを実行.
サンプルプログラムと基本的な波形

まず,新たなサンプルアプリ wave.c で基本的な波形のWAVファイルを生成し, audacitypaplay で波形と音色を確認・比較しよう.

任意波形の加算合成

次に,教科書の第3章などを参考にして, 基本的波形を複数の正弦波によって加算合成 "additive synthesis" するプログラム synth.c を実装しよう.

合成波形の振幅変調

さらに,教科書の第5章や第9章などを参考にして, 合成波形の包絡線 "envelope"(振幅の時間的変化)の形状を 振幅変調 "amplitude modulation"(AM)によって整えよう.

現実の楽器の響きのような, 音の強弱の微妙な変化を表現したいですね.
本日の課題
  1. 複数の WAVファイルを入力し, 音を連結(つなぎ合わせ)出力するプログラム seq.c を作成せよ.
    要するに,シーケンサー(自動演奏器)です.
    • 実行例:
      $ ./seq C.wav D.wav E.wav > C-D-E.wav
      $ paplay C-D-E.wav	# 連続音のドレミ♫
      
      これって,テキストファイルに対する cat コマンドみたいなものですが, WAV ファイルを cat で連結しても,ファイルの外枠の連結はできますが, 中身の音声データの連結にはならず,連続音は再生できませんよ.
    • ヒント:
      • 処理手順:
        1. すべての入力ファイルを pcmLoad()
        2. pcmInit() で出力ファイル(データの容器)を作成.
        3. 各入力の全標本値を出力のデータ配列に追加コピー.
          なお,個別の標本値ではなく, memcpy() で標本値の配列をコピーすれば秒殺です. バイナリデータ dat ではなく, 実数データ val の方をコピーしてください. サンプルライブラリでは, 出力時に val から dat を自動的に再構築するので, 出力用の dat の内容は書き換えられてしまいますよ.
        4. pcmWrite() でファイル出力.
        5. 最後にpcmFin()
      • 簡単のための制約条件:(外してヨシ)
        • すべての入力ファイルと出力ファイルのPCM属性 (量子化深度,チャネル,標本化周期)は等しいものとする.
        • 出力の収録時間については,全入力のそれの合計とする.
  2. 複数の WAVファイルを入力し, 音を混合(重ね合わせ)出力するプログラム mix.c を作成せよ.
    要するに,ミキサー(混合器)"mixer" ですね. 複数音で和音とか,複数楽器で合奏.
    • 実行例:
      $ ./mix C.wav E.wav G.wav > CEG.wav
      $ paplay CEG.wav	# 和音のドミソ♪
      
    • ヒント:
      • 処理手順:
        1. WAV 構造体の配列を用意.
        2. pcmLoad() でファイル入力.
        3. pcmInit() で出力ファイル(データの容器)を作成.
        4. 全入力の瞬時値を混合して出力の瞬時値を算出.
        5. 値域オーバによる音割れ対策も必要.
        6. pcmWrite() でファイル出力.
        7. 最後に pcmFin()
      • 簡単のための制約条件:(外してヨシ)
        • すべての入力ファイルと出力ファイルのPCM属性 (量子化深度,チャネル,標本化周期)は等しいものとする.
        • できれば,収録時間は異なっていても良いようにしたい. 出力の収録時間については,全入力のそれの最大値とする.
レポート提出

メロディ作成手順の例:(お辞儀の曲として知られるカデンツの演奏)

$ ./mix C5.wav E.wav G.wav > CEG.wav	# ドミソ
$ ./mix B.wav F.wav G.wav > BFG.wav	# シファソ
$ ./seq CEG.wav BFG.wav CEG.wav | paplay	# ジャーン⤴ジャーン⤵ジャーン⤴
次回予告

(c) 2023, yanagawa@kushiro-ct.ac.jp