Maxによるオーディオプログラミング例

Max
===

[オーディオプログラミング言語 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/audiolang)

# 概要

https://cycling74.com/products/max

音楽とマルチメディア向けのグラフィカルな統合開発環境。作曲家やメディアアーティストらに20年以上使われ続けており、ノードベースのオーディオプログラミングではもっともメジャーな言語。商用製品。

現在の開発・保守はCycling'74（米国）。

元MITメディアラボのMiller Pucketteが1980年代IRCAM在籍時に開発したThe Patcherが原型。1990年にIRCAMからライセンス供与されたOpcode社がMaxの名前で商用化。その後Cycling'74社が設立され開発を継続。またMiller Pucketteは1996年に再設計した言語Pure Dataをリリースする。Cycling'74社は2017年Abletonにより買収され子会社となった。  
なお、Version4（～2007年）まではMax/MSPの名前で販売されていた。

## Maxのライブラリについて

Maxは歴史が長い分ライブラリの数も膨大です。必要なものはほぼそろっていて便利な反面、入門者は混乱するかもしれません。ライブラリはカテゴリーごとに名前がつけられています。

* Max　言語の基本部分。算術演算やファイル操作など
* MSP　オーディオライブラリ。ノード名は末尾に\~（チルダ）がつく
* Jitter　グラフィックスライブラリ。ノード名は先頭にjit.がつく
* BEAP　MSPパッチをbpatcherでモジュール化した高レベルオーディオライブラリ。モジュラーシンセに近い
* Vizzie　Jitterパッチをbpatcherでモジュール化した高レベルグラフィックスライブラリ
* Gen　低レベルライブラリ。制約が多い反面高速な処理が可能。オーディオに関してはサンプルレベルの処理を記述できる

このうちGenのみ他と混在ができず、Gen patcherと呼ばれる別ウィンドウで作成したパッチを呼び出して連携するかたちになります。

# 実装例

## MSPによる実装

### サイン波生成

![sine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/7c7a12c3-b3ac-7ff3-da49-356b305954c7.png)


### Delayエフェクト

wavファイルを読むにはsfplay\~にopenメッセージを送るだけでも対話的にファイル指定することができます。パッチがシンプルになるのでプログラム例ではそういった書き方をよく見かけます。もう少し実用的に、パッチを開いたときに自動で特定のwavファイルを読んで再生するようにするには、フルパスで指定する必要があるため次のようなやや複雑な処理になります。

![delay.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/4756f465-ca0b-7833-71e4-4d0f070626a5.png)


## Genによる実装

### サイン波生成

Genの場合サンプルレートから周波数を計算します。

![sine_gen2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/5529b9e7-7d4e-d26c-fa68-c25f78080eae.png)


上記Genパッチを呼ぶMSPパッチ例です。
![sine_gen1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/48134f42-ca58-6450-c84f-eacc608459d5.png)


### Delayエフェクト

Genでフィードバックループを作るには、historyで1サンプル遅延させるのがポイントです。

![delay_gen2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/d1f9fed8-f92f-909f-d415-a9d975adf71d.png)


上記Genパッチを呼ぶMax/MSPパッチ例です。
![delay_gen1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/bb9c61ec-9ae9-5863-7c37-85414ca38c5f.png)


## BEAPによる実装

BEAPはMaxをモジュラーシンセのように扱えるようにするライブラリです。通常MaxはGUI操作とパッチコード操作とではモードを切り替える必要がありますが、BEAPではその切り替えが頻繁に発生するため、ViewメニューからOperate While Unlockedをチェックしておくのがおすすめです。編集モードでどちらも操作できるようになりプログラミングが快適になります。

### サイン波生成

OSCILLATORのOffsetは0のときCの音程なので、9.00にするとA440の音を鳴らします。

![sine_beap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/3c26538e-830d-ecb4-ab82-82b69b5678a5.png)


### Delayエフェクト

GATEシーケンサーでトリガーしてサンプルを鳴らすようにしました。

![delay_beap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/0ceefefd-d97f-a9d0-d403-d12b85a12cff.png)


## Max for Liveによる実装

MaxはDAWであるAbleton Liveにも組み込まれています。ここではMax for Live(M4L)と呼ばれるAbleton Live版Maxでのパッチも示します。

### サイン波生成

LiveのブラウザのCollectionsからMax for Live選択してMax Instrumentとして作成します。M4LはDAWと連携できるのが売りなのでMIDI INとGUIをつけてみました。周波数はGUIから設定するようにしました。MIDI Note Onで音が鳴ります

![m4l_sine_patch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/27a0d80a-5dff-3c0d-e187-26fc9942a82f.png)


GUIはプレゼンテーション画面で調整します。

![m4l_sine_presentation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/716e4ee0-f182-9e8d-eb11-719ca1d0780b.png)


Liveの画面からはこのように見えます。

![m4l_sine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/a04e63ae-fca5-23c3-4335-8ebd9c30f8af.png)


### Delayエフェクト

LiveのブラウザのCollectionsからMax for Live選択してMax Audio Effectとして作成します。M4L版のディレイもGUIをつけてみました。実用を意識してLRそれぞれのチャンネルを別々に処理するようにしています。

![m4l_delay_patch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/894c2460-8f84-8528-9609-4a0fb9cfaef0.png)


プレゼンテーション画面です。

![m4l_delay_presentation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/e82326d0-01cb-28b5-0e65-f073b3fdee37.png)


Liveの画面です。

![m4l_delay.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/fb73b956-58c4-115b-d616-1881ea1ca31a.png)


# 感想

Maxは、ノードベースのオーディオプログラミングでは現状最良の選択肢で、エディタやライブラリも使いやすく洗練されています。膨大なライブラリはメリットでもデメリットでもあり、ある程度経緯を知っていないと何を使えばいいのか困惑することもあります。それでも自分に必要なものから少しずつでも覚えていく価値は十分あると思います。

Max本体もMax for Liveもユーザー数が多く、コミュニティも活発で情報が得やすいのも良い点です。

無償利用できる言語が多数ある中で、比較的高価な商用製品という点は目的によっては障害となるかもしれません。多くのPCを使用する展示作品や、大学教育で多数の学生に使わせる場合はライセンス数を気にする必要があります。

[オーディオプログラミング言語 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/audiolang)