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. Zrythmから読み解く
    DAWの作り方
    atsushieno

    View Slide

  2. Agenda
    Zrythmの紹介(手短に)
    デモ
    DAWを作るためには何が必要? →
    Hacking Zrythm
    gtk4アプリケーション
    楽曲のモデル
    オーディオ・MIDIデバイスへのアクセス
    音楽の再生
    プラグインホスト機能
    GUI
    オーディオエディタ
    ルーティング・オーディオグラフ

    View Slide

  3. 行動規範
    (完全版は https://music-tech.connpass.com/event/267483/ にあります)
    「性別、性的自認・性的指向、年齢、障害、身体的特徴、人種、民族、宗教(あるいは無宗教)、技術
    的指向などを理由としたハラスメントの無い状態を維持」してください
    何か問題があって対処に困った場合は イベントページの運営メンバー にご連絡ください

    View Slide

  4. Guest
    alextee

    View Slide

  5. Zrythm: an emerging open source DAW

    View Slide

  6. DAWとしての位置付け?
    LibreArts記事の概観だと「 現代の電子音楽に特化した伝統的なシーケンサー」

    View Slide

  7. Zrythm is free (as in speech)
    https://git.sr.ht/~alextee/zrythm
    クロスプラットフォームで動作(GtkアプリなのでGNOME環境で最適)
    AGPLv3ライセンス
    パッケージは有償(フリーソフトウェアは売るのも自由)
    はやめのリリース、しょっちゅうリリース(伽藍とバザール)
    Linux Audioコミュニティでも注目されている

    View Slide

  8. Get Involved
    バグレポート: sr.ht zrythm-bug
    機能要望: sr.ht zrythm-feature
    ※今はv1リリースの優先度が高い
    ※将来的なタスクは v2

    View Slide

  9. Playing with Zrythm (demo)
    disclaimer:
    - まだbeta開発版で、たまに落ちるかも… (backupは頻繁に作られる)
    - 配信環境なのでより不安定気味
    半年前のunfa liveの頃より格段に安定しているはず(これも配信)

    View Slide

  10. DAWを作るには何が必要?(一般論)
    GUI
    ● トラックリスト/タイムライン
    ● ファイルやプラグインの選択・接続
    ● ピアノロール: (MIDI)イベントリスト
    ● オートメーションサポート
    ● オーディオエディタ
    ● Copy/Paste/Undo/Redoの設計
    ● プラグインウィンドウ/ダイアログ表示
    GUI以外
    ● プラグインホストとオーディオエンジン
    ○ 複数プラグインフォーマットの対応
    ○ 各種プラグインのリストアップ
    ○ リアルタイム再生の対応
    ● オーディオ録音、MIDI入力
    ○ オーディオデバイス設定
    ● 楽曲の編集機能
    ○ Undo/Redo処理の実体はこっち
    ● save/load, import/export
    ● コード入力支援
    ● スクリプティング(マクロ)

    View Slide

  11. Zrythmはgtk4アプリケーション
    GNOMEアプリケーションではないのでWindows/Macでも動作する
    meson(GNOMEの標準ビルドシステム)でビルド
    cf. Ardour FAQ「GUIツールキットの違いは大したこと無い」
    atsushieno私見
    「そうかな…?」

    View Slide

  12. Zrythmはgtk4アプリケーション
    GUIリソース: ./resources/ui/*.ui ファイル
    gtk4のUIリソース (XML)
    cambalacheで開ける?
    他言語化リソース: *.poファイル (gettext)
    翻訳のcontributionはWeblate経由でもできる
    atsushieno私見: できるなら.poファイルを編集してローカルで確認したほうがいい

    View Slide

  13. 楽曲のモデル: トラックの種類(一般論)
    - だいたいオーディオトラックと(MIDI)トラックから成る
    - Instrument trackとMIDI trackが別のこともある (Zrythm, Cubase)
    - Fxトラックでオーディオ入出力をルーティングできる
    - 実装はオーディオグラフ (後で)
    - オートメーショントラックで特定のパラメーターだけ編集
    - やることはだいたいMIDIトラックと同じ
    - トラックはグループ化して管理できるのが一般的
    - 他 - マスタートラック、テンポトラック、コードトラックなど

    View Slide

  14. 楽曲のモデル: トラックの編成(一般論)
    - トラックは複数のリージョン(あるいはクリップ)から成る
    - リージョンにはオーディオファイルや
    (MIDI)イベントが含まれる
    - 時間位置情報とセット
    - オーディオファイルは加工可能
    - タイムストレッチやフェードイン/アウト指定が可能
    - 内部的には加工前ファイルとは別情報として保持
    - (MIDI)トラックはInstrumentを指定する
    - オーディオ/MIDIトラックにはエフェクト(プラグイン)を適用できる
    - ノート情報は変わりつつある
    - 伝統的にはMIDI 1.0レベルの情報
    - 近年はオートメーション対応も求められる (MPE: Zrythmではv2以降)

    View Slide

  15. 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経由の実装になりそう

    View Slide

  16. 音楽の再生(ただし入力にも対応)
    オーディオ処理は遅れると各種ノイズが発生する
    - 処理速度も重要だが、リアルタイムでのオーディオ処理が最も重要
    - 多くはOS側がリアルタイムスレッドでコールバックの主導権をもつ
    (WinMM / CoreAudio / Linux-PulseAudio)
    DAWからの音楽の再生は音楽プレイヤーとは、オーディオ処理の内容が根本的に違う
    - 音楽プレイヤー : MP3等をデコード(必要なら) → エフェクトを適用
    - DAW: 全トラックの全プラグインに、オーディオと
    MIDIを処理させる → 結果を合成
       ユーザーが再生中に曲を編集する(オーディオ・
    MIDIの録音・即再生もある)
    Zrythm: オーディオエンジン初期化時にオーディオコールバックで engine_process() を指定

    View Slide

  17. プラグインホスト機能
    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
    ホストの仕事: プラグインリスト管理とインスタンス管理

    View Slide

  18. DAWのGUI: トラックリストとピアノロール(一般論)
    - とにかく情報項目が多いので見やすくする
    - トラックリスト : なるべく多く表示したい vs. 操作できる大きさ / 区別しやすさ
    - タイムラインは曲の長さ次第で無限に伸びる
    - ズーム・スクロールが重要
    - テンポと拍子 (Time Signature) のトラック
    - Zrythmは(現状)打ち込み内容と連動しない(演奏表示のみ変更可能)
    - 再生時にアニメーションが必要
    - 演奏に追従する
    - ページング: ピアノロール表示幅 or n拍子毎?

    View Slide

  19. DAWのGUI: (MIDI)イベントの編集(一般論)
    - トラックリストの中でどう表示するか
    - CCやベロシティなどを表示するパネルも必要になる
    - タイムラインとピアノロールの同期/非同期
    - 特殊なコピー/ペースト操作
    - MPEやNote Expressionへの対応(Zrythmはv2以降)
    - ノート管理パラダイムの変化

    View Slide

  20. オーディオエディタ
    これ単体でもアプリになりうる機能(!)
    タイムストレッチング
    フェードイン/アウト

    View Slide

  21. ノードグラフ: プラグインのルーティング(一般論)
    有向非巡回グラフ (DAG)
    Zrythmの実装 - src/audio/graph.c
    Ardourのルーティング [PDF] (Robin Gareus)
    cf. juce::AudioProcessorGraph
    cf. Tracktion Graph (@ ADC21)

    View Slide

  22. 楽曲データの保存(一般論)
    DAWで保存すべき情報とは?
    - トラック編成
    - 各トラックのプラグイン設定: グラフ(後述)、stateなど
    - オーディオセットアップ(デバイスの接続・選択状態など)
    - GUIの状態(音楽データではないが打ち込み作業環境の復元は有用)
    - 他の環境に持っていってロードしたい
    →エクスポート機能を使う
    - DAWとはそもそも何をし、何を保存すべきなのか
    ?
    編集操作はundoable action = それぞれの編集操作状態が保存可能であることが理想
    Zrythmの楽曲データ: メインはyamlをzstdで圧縮、他リソースを含むフォルダ

    View Slide

  23. その他の諸機能
    コード入力支援
    - いわゆるmusicality
    - コードトラックに手作業でコードを入力する
    - 現在のコードに基づいて入力が支援される
    - ソフトウェア技術的にはそんなに難しくない(はず?)
    ユーザースクリプティング
    - GNU guileを利用 (Scheme / ECMAScript)
    - ユーザーの利便性(広く) vs. 後方互換性の維持(狭く)

    View Slide

  24. hacking Zrythm
    mesonに対応しているIDE
    (テキストエディタの場合は何でも良いので、あくまで IDEとして)
    △ VSCodium / VSCode
     meson addinがある / Clang Analyzerは機能するっぽい / デバッグが無理?
    × CLion (meson pluginにプロジェクトモデル構築機能がなく、解析できない)
    △ Gnome Builder(mesonネイティブ対応だがClang Analyzerが十分機能しない)

    View Slide

  25. ソースツリー
    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 : その他

    View Slide