🎹

TidalCyclesとAbleton LiveとのAbleton Link同期

に公開

概要

TidalCyclesとAbleton Liveを同期させるためにTidalCyclesのAbleton Link機能を有効化する手順をまとめました。結論ここに書いた通りです。

同期動作している動画

背景

このchordMapperというMIDIコントローラを開発しました。MIDIの同期信号を出力する機能があり、Korg Gadget3やAbleton Liveなどとは同期できるのですが、TidalCyclesはMIDI同期信号を入力できません。しかしAbleton Linkという別な形式の同期信号は対応しているようでした。Ableton Liveは持っているのでまずAbletonLiveとTidalCycles間で同期できるかなと思ったのですが、公式の手順通りにやってもAbletonLiveとTidalCyclesはAbleton Linkで同期できませんでした。これができなければchordMapperとも同期できないので調査が必要でした。

ごちゃごちゃ書きましたが、タイトル通りゴールはTidalCyclesとAbleton Liveとの同期のみです。

環境

name info
PC Mac mini 2023 M2 Pro 32GB RAM
OS Sequoia 15.6
SuperCollider 3.13.0
SuperDart v1.7.3
sc3-plugins 3.13.0
TidalCycles 1.10.1
Ableton Live Intro 12.1.11
Korg Gadget3(必須ではない) 3.1.6
VScode(別環境でも良いはず) 1.85.1
TidalCycles for VSCode(別環境でも良いはず) v1.4.1

調査手順

そもそもAbleton側はLinkが正常に動くか?

Korg Gadget3とのLinkで試してみた結果、正常に動いているようでした。AbletonLiveではこの手順でLink有効化しています。Linkボタン内にLink接続数が見えます。Firewallなどの原因ではないということです。

パケットは送信できているのか?

Ableton Linkはブロードキャストのポート20808で通信する仕様です。WireSharkのLoopback:lo0にてudp.port==20808のフィルタをかけてパケットの出方を確認したところ、Ableton LiveとKorg Gadget3はLink機能を片側のみ有効化している場合でも常に通信を行なっていました。一方でTidalCyclesは全く通信を出力すらしていませんでした。TidalCycles側の問題と見て間違いなさそうです。

Link機能有効化仕様

ここにデフォルトで有効化されていると書かれているのですが、ghciで以下調査したところ怪しい名前cEnableLinkがFalseでした。

ghci調査
% ghci
GHCi, version 9.6.7: https://www.haskell.org/ghc/  :? for help
ghci> :m +Sound.Tidal.Config
ghci> :browse Sound.Tidal.Config
type Config :: *
data Config
  = Config {cCtrlListen :: Bool,
            cCtrlAddr :: String,
            cCtrlPort :: Int,
            cCtrlBroadcast :: Bool,
            cVerbose :: Bool,
            cQuantum :: Foreign.C.Types.CDouble,
            cBeatsPerCycle :: Foreign.C.Types.CDouble,
            cFrameTimespan :: Double,
            cEnableLink :: Bool,
            cSkipTicks :: GHC.Int.Int64,
            cProcessAhead :: Double}
defaultConfig :: Config
setFrameTimespan :: Double -> Config -> Config
setProcessAhead :: Double -> Config -> Config
toClockConfig :: Config -> Sound.Tidal.Clock.ClockConfig
verbose :: Config -> String -> IO ()
ghci> cCtrlPort defaultConfig
6010
ghci> cCtrlListen defaultConfig
True
ghci> cCtrlBroadcast defaultConfig
False
ghci> cEnableLink defaultConfig
False

cEnableLinkとは何か調査

これをWeb検索するとこのQ&Aページでの言及が見つかりました。さらに調査すると、このページが見つかりました。どうもBootTidal.hsという設定ファイル内でenableLinkを指定する必要があるようでした。実は公式マニュアルではここに記述がありました。

修正方法

上記で調査した結果、BootTidal.hsの作成、行有効化、TidalCycle起動時のパス指定が必要であることが分かりました。まず以下を作成しました。公式のもののenableLinkを有効化しただけです。

/Users/[YOUR USERNAME]/.tidal/BootTidal.hs
:set -fno-warn-orphans -Wno-type-defaults -XMultiParamTypeClasses -XOverloadedStrings
:set prompt ""

-- Import all the boot functions and aliases.
import Sound.Tidal.Boot

default (Rational, Integer, Double, Pattern String)

-- Create a Tidal Stream with the default settings.
-- To customize these settings, use 'mkTidalWith' instead
tidalInst <- mkTidal

-- tidalInst <- mkTidalWith [(superdirtTarget { oLatency = 0.01 }, [superdirtShape])] (defaultConfig {cFrameTimespan = 1/50, cProcessAhead = 1/20})

-- This orphan instance makes the boot aliases work!
-- It has to go after you define 'tidalInst'.
instance Tidally where tidal = tidalInst

-- `enableLink` and `disableLink` can be used to toggle synchronisation using the Link protocol.
-- Uncomment the next line to enable Link on startup.
enableLink

-- You can also add your own aliases in this file. For example:
-- fastsquizzed pat = fast 2 $ pat # squiz 1.5

:set prompt "tidal> "
:set prompt-cont ""

次にVScodeのTidalCycles拡張機能の設定の以下を指定しました。

VScodeを立ち上げ直せばLink機能が有効化されています。WireSharkでパケットが出ており、AbletonLiveのLinkボタンにも数字が出力されます。私の場合はAbletonLiveでドラムパターンをループ実行してから遅れてTidalCyclesでd1 $ sound "bd hh sn hh"など実行し、同期できていることを確認しました。

終わりに

公式ドキュメントが修正途中だったようで翻弄されました。この対応で無事にchordMapper,AbletonLive,TidalCyclesが同期動作出来るようになりました。良い演奏が出来るようにがんばります。

Discussion