Slide 1

Slide 1 text

Zrythmから読み解く DAWの作り方 atsushieno

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

Guest alextee

Slide 5

Slide 5 text

Zrythm: an emerging open source DAW

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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