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

learning how DAWs work, with Zrythm

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for Atsushi Eno Atsushi Eno
December 11, 2022

learning how DAWs work, with Zrythm

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

Avatar for Atsushi Eno

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 : その他