Upgrade to Pro — share decks privately, control downloads, hide ads and more …

learning how DAWs work, with Zrythm

Atsushi Eno
December 11, 2022

learning how DAWs work, with Zrythm

2022-12-11 [音楽技術勉強会] Zrythm DAWから読み解くDAWの作り方

Atsushi Eno

December 11, 2022
Tweet

More Decks by Atsushi Eno

Other Decks in Technology

Transcript

  1. DAWを作るには何が必要?(一般論) GUI • トラックリスト/タイムライン • ファイルやプラグインの選択・接続 • ピアノロール: (MIDI)イベントリスト •

    オートメーションサポート • オーディオエディタ • Copy/Paste/Undo/Redoの設計 • プラグインウィンドウ/ダイアログ表示 GUI以外 • プラグインホストとオーディオエンジン ◦ 複数プラグインフォーマットの対応 ◦ 各種プラグインのリストアップ ◦ リアルタイム再生の対応 • オーディオ録音、MIDI入力 ◦ オーディオデバイス設定 • 楽曲の編集機能 ◦ Undo/Redo処理の実体はこっち • save/load, import/export • コード入力支援 • スクリプティング(マクロ)
  2. Zrythmはgtk4アプリケーション GUIリソース: ./resources/ui/*.ui ファイル gtk4のUIリソース (XML) cambalacheで開ける? 他言語化リソース: *.poファイル (gettext)

    翻訳のcontributionはWeblate経由でもできる atsushieno私見: できるなら.poファイルを編集してローカルで確認したほうがいい
  3. 楽曲のモデル: トラックの種類(一般論) - だいたいオーディオトラックと(MIDI)トラックから成る - Instrument trackとMIDI trackが別のこともある (Zrythm, Cubase)

    - Fxトラックでオーディオ入出力をルーティングできる - 実装はオーディオグラフ (後で) - オートメーショントラックで特定のパラメーターだけ編集 - やることはだいたいMIDIトラックと同じ - トラックはグループ化して管理できるのが一般的 - 他 - マスタートラック、テンポトラック、コードトラックなど
  4. 楽曲のモデル: トラックの編成(一般論) - トラックは複数のリージョン(あるいはクリップ)から成る - リージョンにはオーディオファイルや (MIDI)イベントが含まれる - 時間位置情報とセット -

    オーディオファイルは加工可能 - タイムストレッチやフェードイン/アウト指定が可能 - 内部的には加工前ファイルとは別情報として保持 - (MIDI)トラックはInstrumentを指定する - オーディオ/MIDIトラックにはエフェクト(プラグイン)を適用できる - ノート情報は変わりつつある - 伝統的にはMIDI 1.0レベルの情報 - 近年はオートメーション対応も求められる (MPE: Zrythmではv2以降)
  5. Zrythmのオーディオ・MIDIデバイスへのアクセス • 音楽の再生→オーディオ出力が必要 • 生演奏・歌の録音→オーディオ入力が必要 • MIDIキーボードの利用→MIDI入力が必要 プラットフォーム別オーディオAPIの利用 (WinMM /

    CoreAudio / ALSA / JACK / PulseAudio) 直接実装 から Jack + RtAudio経由の実装になりそう MIDI I/O: WinMM / CoreMIDI / JACK MIDI or ALSA Sequencer これもJack MIDI + RtMidi経由の実装になりそう
  6. 音楽の再生(ただし入力にも対応) オーディオ処理は遅れると各種ノイズが発生する - 処理速度も重要だが、リアルタイムでのオーディオ処理が最も重要 - 多くはOS側がリアルタイムスレッドでコールバックの主導権をもつ (WinMM / CoreAudio /

    Linux-PulseAudio) DAWからの音楽の再生は音楽プレイヤーとは、オーディオ処理の内容が根本的に違う - 音楽プレイヤー : MP3等をデコード(必要なら) → エフェクトを適用 - DAW: 全トラックの全プラグインに、オーディオと MIDIを処理させる → 結果を合成    ユーザーが再生中に曲を編集する(オーディオ・ MIDIの録音・即再生もある) Zrythm: オーディオエンジン初期化時にオーディオコールバックで engine_process() を指定
  7. プラグインホスト機能 DAWはプラグインホスト ZrythmはLV2ホスト (lv2/lilv) とCarlaホスト (falkTX/Carla) の2系統を実装 Carlaはさまざまなプラグインフォーマットをサポート AU, LV2,

    VST2, VST3, CLAP, LADSPA, DSSI, SF2, SFZ, Reaper JSFX 内部的にはlilv, VeSTige, JUCE, fluidsynth, SFZero (or sfizz), ysfxを利用 seealso: DISTRHO/Ildaeil - host as a plugin, wrapper around Carla ホストの仕事: プラグインリスト管理とインスタンス管理
  8. DAWのGUI: トラックリストとピアノロール(一般論) - とにかく情報項目が多いので見やすくする - トラックリスト : なるべく多く表示したい vs. 操作できる大きさ

    / 区別しやすさ - タイムラインは曲の長さ次第で無限に伸びる - ズーム・スクロールが重要 - テンポと拍子 (Time Signature) のトラック - Zrythmは(現状)打ち込み内容と連動しない(演奏表示のみ変更可能) - 再生時にアニメーションが必要 - 演奏に追従する - ページング: ピアノロール表示幅 or n拍子毎?
  9. 楽曲データの保存(一般論) DAWで保存すべき情報とは? - トラック編成 - 各トラックのプラグイン設定: グラフ(後述)、stateなど - オーディオセットアップ(デバイスの接続・選択状態など) -

    GUIの状態(音楽データではないが打ち込み作業環境の復元は有用) - 他の環境に持っていってロードしたい →エクスポート機能を使う - DAWとはそもそも何をし、何を保存すべきなのか ? 編集操作はundoable action = それぞれの編集操作状態が保存可能であることが理想 Zrythmの楽曲データ: メインはyamlをzstdで圧縮、他リソースを含むフォルダ
  10. hacking Zrythm mesonに対応しているIDE (テキストエディタの場合は何でも良いので、あくまで IDEとして) △ VSCodium / VSCode  meson

    addinがある / Clang Analyzerは機能するっぽい / デバッグが無理? × CLion (meson pluginにプロジェクトモデル構築機能がなく、解析できない) △ Gnome Builder(mesonネイティブ対応だがClang Analyzerが十分機能しない)
  11. ソースツリー ext/* : zrythmで取り込んだ外部コード subprojects/* : mesonが取り込む外部コード inc : ヘッダファイル

    (public? API) po : i18nリソース. *.potがマスター / .*poは訳文 resources : GUIレイアウトリソースなどもある Tips: バグの原因を探す: Zrythmのlogには関数名 などが記録されていて便利 src/ actions : (主に)GUIから呼び出せる処理 audio : オーディオエンジン (I/O, グラフ, 再生) gui : GUI実装 guile : ユーザースクリプティングのサポート plugins : プラグインホスト(呼び出し)部分 schemas : プロジェクトのデータモデル settings : ユーザー設定のデータモデル utils : その他