Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
learning how DAWs work, with Zrythm
Search
Atsushi Eno
December 11, 2022
Technology
0
1.2k
learning how DAWs work, with Zrythm
2022-12-11 [音楽技術勉強会] Zrythm DAWから読み解くDAWの作り方
Atsushi Eno
December 11, 2022
Tweet
Share
More Decks by Atsushi Eno
See All by Atsushi Eno
Taking trends in music app development into the future mobile ecosystem
atsushieno
0
14
DTM entry level hands-on
atsushieno
0
180
[COSCUP2024] Catching up Trends in Audio App Development
atsushieno
0
770
Building Kotlin Multiplatform Libraries in 2024
atsushieno
0
3.8k
Kotlin Multiplatformで MIDI 1.0/2.0 ライブラリを作っている話
atsushieno
1
720
building_audio_plugin_ecosystem_on_Android.pdf
atsushieno
0
1.1k
get updated to the latest realtime audio processings knowledge base (2023) (再履修: 2023年までの リアルタイムオーディオ処理)
atsushieno
1
1.2k
What for, Where and How to Adopt MIDI 2.0
atsushieno
0
1.3k
audio plugin format study meetup 2022.7.6 (JP)
atsushieno
0
1.7k
Other Decks in Technology
See All in Technology
食べログが挑む!飲食店ネット予約システムで自動テスト無双して手動テストゼロを実現する戦略
hagevvashi
1
140
こんなデータマートは嫌だ。どんな? / waiwai-data-meetup-202504
shuntak
5
1.7k
20250413_湘南kaggler会_音声認識で使うのってメルス・・・なんだっけ?
sugupoko
1
320
LLM とプロンプトエンジニアリング/チューターをビルドする / LLM, Prompt Engineering and Building Tutors
ks91
PRO
1
200
Re:VIEWで書いた「Compose で Android の edge-to-edge に対応する」をRoo Codeで発表資料にしてもらった
tomoya0x00
0
260
DuckDB MCPサーバーを使ってAWSコストを分析させてみた / AWS cost analysis with DuckDB MCP server
masahirokawahara
0
210
データベースで見る『家族アルバム みてね』の変遷 / The Evolution of Family Album Through the Lens of Databases
kohbis
4
1.1k
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
21k
MCPを活用した検索システムの作り方/How to implement search systems with MCP #catalks
quiver
0
220
ウォンテッドリーにおける Platform Engineering
bgpat
0
180
はじめてのSDET / My first challenge as a SDET
bun913
1
180
低レイヤを知りたいPHPerのためのCコンパイラ作成入門 / Building a C Compiler for PHPers Who Want to Dive into Low-Level Programming
tomzoh
0
190
Featured
See All Featured
Speed Design
sergeychernyshev
29
880
How to Ace a Technical Interview
jacobian
276
23k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
32
4.9k
A Tale of Four Properties
chriscoyier
158
23k
KATA
mclloyd
29
14k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.3k
It's Worth the Effort
3n
184
28k
[RailsConf 2023] Rails as a piece of cake
palkan
54
5.4k
GraphQLとの向き合い方2022年版
quramy
46
14k
Documentation Writing (for coders)
carmenintech
69
4.7k
Gamification - CAS2011
davidbonilla
81
5.2k
Unsuck your backbone
ammeep
670
57k
Transcript
Zrythmから読み解く DAWの作り方 atsushieno
Agenda Zrythmの紹介(手短に) デモ DAWを作るためには何が必要? → Hacking Zrythm gtk4アプリケーション 楽曲のモデル オーディオ・MIDIデバイスへのアクセス
音楽の再生 プラグインホスト機能 GUI オーディオエディタ ルーティング・オーディオグラフ
行動規範 (完全版は https://music-tech.connpass.com/event/267483/ にあります) 「性別、性的自認・性的指向、年齢、障害、身体的特徴、人種、民族、宗教(あるいは無宗教)、技術 的指向などを理由としたハラスメントの無い状態を維持」してください 何か問題があって対処に困った場合は イベントページの運営メンバー にご連絡ください
Guest alextee
Zrythm: an emerging open source DAW
DAWとしての位置付け? LibreArts記事の概観だと「 現代の電子音楽に特化した伝統的なシーケンサー」
Zrythm is free (as in speech) https://git.sr.ht/~alextee/zrythm クロスプラットフォームで動作(GtkアプリなのでGNOME環境で最適) AGPLv3ライセンス パッケージは有償(フリーソフトウェアは売るのも自由)
はやめのリリース、しょっちゅうリリース(伽藍とバザール) Linux Audioコミュニティでも注目されている
Get Involved バグレポート: sr.ht zrythm-bug 機能要望: sr.ht zrythm-feature ※今はv1リリースの優先度が高い ※将来的なタスクは
v2
Playing with Zrythm (demo) disclaimer: - まだbeta開発版で、たまに落ちるかも… (backupは頻繁に作られる) - 配信環境なのでより不安定気味
半年前のunfa liveの頃より格段に安定しているはず(これも配信)
DAWを作るには何が必要?(一般論) GUI • トラックリスト/タイムライン • ファイルやプラグインの選択・接続 • ピアノロール: (MIDI)イベントリスト •
オートメーションサポート • オーディオエディタ • Copy/Paste/Undo/Redoの設計 • プラグインウィンドウ/ダイアログ表示 GUI以外 • プラグインホストとオーディオエンジン ◦ 複数プラグインフォーマットの対応 ◦ 各種プラグインのリストアップ ◦ リアルタイム再生の対応 • オーディオ録音、MIDI入力 ◦ オーディオデバイス設定 • 楽曲の編集機能 ◦ Undo/Redo処理の実体はこっち • save/load, import/export • コード入力支援 • スクリプティング(マクロ)
Zrythmはgtk4アプリケーション GNOMEアプリケーションではないのでWindows/Macでも動作する meson(GNOMEの標準ビルドシステム)でビルド cf. Ardour FAQ「GUIツールキットの違いは大したこと無い」 atsushieno私見 「そうかな…?」
Zrythmはgtk4アプリケーション GUIリソース: ./resources/ui/*.ui ファイル gtk4のUIリソース (XML) cambalacheで開ける? 他言語化リソース: *.poファイル (gettext)
翻訳のcontributionはWeblate経由でもできる atsushieno私見: できるなら.poファイルを編集してローカルで確認したほうがいい
楽曲のモデル: トラックの種類(一般論) - だいたいオーディオトラックと(MIDI)トラックから成る - Instrument trackとMIDI trackが別のこともある (Zrythm, Cubase)
- Fxトラックでオーディオ入出力をルーティングできる - 実装はオーディオグラフ (後で) - オートメーショントラックで特定のパラメーターだけ編集 - やることはだいたいMIDIトラックと同じ - トラックはグループ化して管理できるのが一般的 - 他 - マスタートラック、テンポトラック、コードトラックなど
楽曲のモデル: トラックの編成(一般論) - トラックは複数のリージョン(あるいはクリップ)から成る - リージョンにはオーディオファイルや (MIDI)イベントが含まれる - 時間位置情報とセット -
オーディオファイルは加工可能 - タイムストレッチやフェードイン/アウト指定が可能 - 内部的には加工前ファイルとは別情報として保持 - (MIDI)トラックはInstrumentを指定する - オーディオ/MIDIトラックにはエフェクト(プラグイン)を適用できる - ノート情報は変わりつつある - 伝統的にはMIDI 1.0レベルの情報 - 近年はオートメーション対応も求められる (MPE: Zrythmではv2以降)
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経由の実装になりそう
音楽の再生(ただし入力にも対応) オーディオ処理は遅れると各種ノイズが発生する - 処理速度も重要だが、リアルタイムでのオーディオ処理が最も重要 - 多くはOS側がリアルタイムスレッドでコールバックの主導権をもつ (WinMM / CoreAudio /
Linux-PulseAudio) DAWからの音楽の再生は音楽プレイヤーとは、オーディオ処理の内容が根本的に違う - 音楽プレイヤー : MP3等をデコード(必要なら) → エフェクトを適用 - DAW: 全トラックの全プラグインに、オーディオと MIDIを処理させる → 結果を合成 ユーザーが再生中に曲を編集する(オーディオ・ MIDIの録音・即再生もある) Zrythm: オーディオエンジン初期化時にオーディオコールバックで engine_process() を指定
プラグインホスト機能 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 ホストの仕事: プラグインリスト管理とインスタンス管理
DAWのGUI: トラックリストとピアノロール(一般論) - とにかく情報項目が多いので見やすくする - トラックリスト : なるべく多く表示したい vs. 操作できる大きさ
/ 区別しやすさ - タイムラインは曲の長さ次第で無限に伸びる - ズーム・スクロールが重要 - テンポと拍子 (Time Signature) のトラック - Zrythmは(現状)打ち込み内容と連動しない(演奏表示のみ変更可能) - 再生時にアニメーションが必要 - 演奏に追従する - ページング: ピアノロール表示幅 or n拍子毎?
DAWのGUI: (MIDI)イベントの編集(一般論) - トラックリストの中でどう表示するか - CCやベロシティなどを表示するパネルも必要になる - タイムラインとピアノロールの同期/非同期 - 特殊なコピー/ペースト操作
- MPEやNote Expressionへの対応(Zrythmはv2以降) - ノート管理パラダイムの変化
オーディオエディタ これ単体でもアプリになりうる機能(!) タイムストレッチング フェードイン/アウト
ノードグラフ: プラグインのルーティング(一般論) 有向非巡回グラフ (DAG) Zrythmの実装 - src/audio/graph.c Ardourのルーティング [PDF] (Robin
Gareus) cf. juce::AudioProcessorGraph cf. Tracktion Graph (@ ADC21)
楽曲データの保存(一般論) DAWで保存すべき情報とは? - トラック編成 - 各トラックのプラグイン設定: グラフ(後述)、stateなど - オーディオセットアップ(デバイスの接続・選択状態など) -
GUIの状態(音楽データではないが打ち込み作業環境の復元は有用) - 他の環境に持っていってロードしたい →エクスポート機能を使う - DAWとはそもそも何をし、何を保存すべきなのか ? 編集操作はundoable action = それぞれの編集操作状態が保存可能であることが理想 Zrythmの楽曲データ: メインはyamlをzstdで圧縮、他リソースを含むフォルダ
その他の諸機能 コード入力支援 - いわゆるmusicality - コードトラックに手作業でコードを入力する - 現在のコードに基づいて入力が支援される - ソフトウェア技術的にはそんなに難しくない(はず?)
ユーザースクリプティング - GNU guileを利用 (Scheme / ECMAScript) - ユーザーの利便性(広く) vs. 後方互換性の維持(狭く)
hacking Zrythm mesonに対応しているIDE (テキストエディタの場合は何でも良いので、あくまで IDEとして) △ VSCodium / VSCode meson
addinがある / Clang Analyzerは機能するっぽい / デバッグが無理? × CLion (meson pluginにプロジェクトモデル構築機能がなく、解析できない) △ Gnome Builder(mesonネイティブ対応だがClang Analyzerが十分機能しない)
ソースツリー 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 : その他