TidalCycles on Raspberry pi
ラズパイでLiveCodingできる環境が欲しくてセットアップしました。Raspbian上にSuperColliderとLiveCoding環境TidalCyclesを導入し、MIDIで外部のシンセサイザーを演奏するところまでできました。途中けっこうハマる部分もあったので、メモを残しておきます。もし同じことをやろうとしてる人(いるのか...?)がいれば、助けになりましたら幸いです。
Livecoding、TidalCyclesの解説はこちら↓↓↓↓
https://www.slideshare.net/HirokiMatsui8/vivet-sound-workshop-algorithmx
はじめに 〜Raspberry PiでLiveCodingする意義
本記事で紹介するところまでだと、ラップトップと比較して音楽、音響合成でのアドバンテージはぶっちゃけあまり無いです(笑) センサーを使ったりGPIOピンを使って外部デバイスと連携する、といった使い方に夢が広がってると思います。
ただしまるっきりメリットがない...という訳でなく、ハードウェア一式が安価に手に入ること、普段使いの環境では躊躇される大胆な設定の書き換えができる点など、コンピューターの学習的な面では優れた点が多いと思ってます。僕自身ProcessingやSuperColliderからプログラミング入門した背景があり、Raspberry Piのセットアップやトラブル対処から多くを学ぶことができました。またスペックやリソースに制約があることが、かえって創作欲に繋がることもある・・・はず!
あとはラズパイが小さなディスプレイに収まってるビジュアルに萌えるかどうかですかね...ぼくは2018年にTidal Workshop(多摩美)で見かけてイチコロでした笑
ハードウェアについて
本体
Raspberry Pi 4BのRAM 2GBを使いました。以前は3B+を使ってましたが、4Bが断然安定する印象です。またSuperDirtは起動時にサンプルファイルをメモリにすべて読み込むため、メモリはでかいほど安心です。OSを入れるmicro SDカードは16GBにしました。
ディスプレイ
ラズパイを背中にマウントできる7インチのものを使いました。USB給電すればタッチパネルとして使えるそうです(試してない)。余談ですが説明書がなく組み立てが結構難しかったです・・・
https://www.amazon.co.jp/gp/product/B0819PJYRN/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&psc=1
サウンドカード
ラズパイ周辺機器としてはこれに電源(USB typeC、容量に注意)とキーボード(Mac用のものは~が入力できなかったので、windows用US配列のものを購入)があればばっちりかと思いますが、僕は高音質でプレイするために追加でGPIO接続のサウンドカードを導入しました。
https://www.amazon.co.jp/gp/product/B01HCC0210/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&psc=1
この価格帯には珍しく、RCAアウトプットとインプットを両方備えたモデルです。将来的にSuperColliderと組み合わせて2in 2outのエフェクターとして使ってみたかったのでこちらにしました。音質は価格の割にいいかんじです。ただ以前raspi 3B+とともに使ってたKumanのカードのほうがクリアさで上かなという印象です。(こちらはインプット端子がなく、またGPIOピンは無いのでそちらの拡張はできません)
https://www.amazon.co.jp/gp/product/B01HCUBRHA/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1
ハードウェア・シンセサイザー(KORG NTS-1)
ラズパイではメモリやスペックに制約があるので、重たいシンセシスやエフェクトなど無茶をするとふつうに落ちます・・・これに対する一つの解決策が、外部のシンセサイザーを使うことです。TidalCyclesはMIDIでパターンを作ることも得意なので、ハードウェアを演奏に取り込むことができます。
今回はミニマルなラズパイ環境に合わせ、カードサイズのシンセサイザー、KORG NTS-1を使いました。もとから高品位なシンセですが、オシレーターやエフェクトをLogue-SDKで自作することもできるイケメンです。USBケーブル一本でラズパイから給電・MIDI信号のやりとりまでできるのもグッド。
Raspberry Piのセットアップ
OS書き込みに関しては僕が書くまでもなく良記事がたくさんありますが、現在だと公式のImagerを使う方法がラクです。https://www.raspberrypi.org/downloads/
こちらから使ってるPCのOSに合ったものをダウンロードし、Imagerを起動したら「書き込むOSの種類」と「書き込み対象のSDカード」を選んでwriteを押すだけです。OSはベーシックなRaspberry Pi OS (32-bit) A port of Debian with the Raspberry Pi Desktop (Recommended)を使いました。マインクラフトを遊びたい場合はothersからフル・バージョンを選びましょう。書き込み完了したらラズパイ本体にさします。
あとはディスプレイに本体をマウントし、サウンドカードがあればこの時点で乗せちゃいましょう。ラズパイの電源を入れればセットアップと各種設定(言語、タイムゾーン、ディスプレイ、wifiなど)が始まります。
便利設定
なんやかんや日本語入力したい状況もあるので、日本語入力ソフトを導入します(システム言語を日本語にするとデフォルトでインストールされるようです)。メニューバーにある端末を起動し、以下で導入します。
sudo apt-get update
sudo apt-get install fcitx-mozc
また僕はUS配列のキーボードを使っているのですが、
/etc/default/keyboard の中に XKBOPTIONS="ctrl:nocaps" を追記しcapslockをctrlとして使っています。
SuperCollider導入
基本的に公式の手順を踏めばすんなり入ります。GUI版とCUI版がありますが、GUI版が使いやすいと思います。https://github.com/supercollider/supercollider/blob/develop/README_RASPBERRY_PI.md
GUI版インストール手順
端末で一行ずつ実行します。特にライブラリのインストールとSuperColliderのビルドは時間がかかるのでおやつを用意したほうがいいかもしれません。全て終わったら再起動しましょう(端末にrebootと打ち込み実行)。
#ビルドに必要なライブラリをインストール
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get install libjack-jackd2-dev libsndfile1-dev libasound2-dev libavahi-client-dev libreadline-dev libfftw3-dev libxt-dev libudev-dev libncurses5-dev cmake git qttools5-dev qttools5-dev-tools qtdeclarative5-dev libqt5svg5-dev qjackctl
#SuperColliderのダウンロードとビルド
cd ~
git clone --recurse-submodules https://github.com/supercollider/supercollider.git
cd supercollider
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DSUPERNOVA=OFF -DSC_ED=OFF -DSC_EL=OFF -DSC_VIM=ON -DNATIVE=ON -DSC_USE_QTWEBENGINE:BOOL=OFF ..
cmake --build . --config Release --target all -- -j3
sudo cmake --build . --config Release --target install
sudo ldconfig
#jackドライバー(SuperColliderのブートで自動起動)の起動時設定
echo /usr/bin/jackd -P75 -p16 -dalsa -dhw:0 -r44100 -p1024 -n3 > ~/.jackdrc
SuperDirtもここで導入しちゃいましょう。スタートメニューからsound -> SuperColliderを起動し、以下のコードを打ち込んでCtrl + return(enter)で実行します。これもそこそこ時間がかかります・・・
Quarks.checkForUpdates({Quarks.install("SuperDirt", "v1.1.1"); thisProcess.recompile()})
TidalCyclesのセットアップ
執筆時でTidalCyclesの最新版はv1.6.1ですが、しっかり動作しました。こちらも端末に一行ずつ打ち込んで実行していきます。
sudo apt-get install haskell-platform
cabal update
cabal install tidal
テキストエディタ(Emacs)のセットアップ
TidalCyclesではAtom, VSCode, Vim, Emacsなど多様なエディタがサポートされています。ことRaspberry Piではなるべく軽快な環境で実行したいため、ここではEmacsのセットアップを紹介します。端末から
sudo apt install emacs25
でemacsを導入します。バージョンは24.1以降ならオッケーとのことです。
スタートメニューのprogrammingカテゴリーにあるemacs(GUI)を起動したら、/home/piの下に.emacs.dというディレクトリが作られるはずです。その中にinit.elというファイルを作成し、以下の三行を書きましょう。
(require ‘package)
(add-to-list ‘package-archives ‘(“melpa” . “https://melpa.org/packages/”) t)
(package-initialize)
これでmelpaというemacsのパッケージ管理システムを介してTidalモードを拡張する準備ができました。再度emacsを起動し、
M-x package-refresh-cntents
M-x package-install <return> tidal <return>
でemacsにtidalを導入します。これによりinit.elにtidalを読み込むコードが自動的に追記されます。
ちなみにM-xというのはMetaキー(Alt)を押しながらxという意味です。
このあとC-xというのもでてきますが、これはCtrl + xという意味です。
そのほか僕がinit.elに書いてる便利設定です。
;;起動時の画面をシンプルにする
(setq inhibit-startup-message t)
(setq initial-scratch-message "")
(setq make-backup-files nil)
(setq delete-auto-save-files t)
(menu-bar-mode -1)
(tool-bar-mode -1)
;;かっこを自動保管したり光らせたりする
(column-number-mode t)
(global-linum-mode t)
(set-face-attribute 'linum nil
:foreground "gray15"
:height 0.8)
(blink-cursor-mode 0)
(electric-pair-mode 1)
(show-paren-mode 1)
(set-face-attribute 'show-paren-match nil
:background "gray77")
;;Ctrl + hをdeleteとして使用
(define-key key-translation-map (kbd "C-h") (kbd "<DEL>"))
そしてカラーリングをかっこよくします
;;color
(if window-system (progn
(add-to-list 'default-frame-alist '(foreground-color . "white"))
(add-to-list 'default-frame-alist '(background-color . "black"))
(add-to-list 'default-frame-alist '(cursor-color . "white"))
(add-to-list 'default-frame-alist '(mouse-color . "white"))
;;mode line's color
(set-face-foreground 'mode-line "gray33")
(set-face-background 'mode-line "gray15")
;;region's color
(set-face-background 'region "LightSteelBlue1")
;;other modeline
(set-face-foreground 'mode-line-inactive "black")
(set-face-background 'mode-line-inactive "gray85")
;;syntax
(set-face-foreground 'font-lock-comment-face "azure2")
(set-face-foreground 'font-lock-string-face "PaleTurquoise1")
(set-face-foreground 'font-lock-keyword-face "MistyRose")
(set-face-foreground 'font-lock-function-name-face "SteelBlue1")
(set-face-bold-p 'font-lock-function-name-face t)
(set-face-foreground 'font-lock-variable-name-face "RoyalBlue1")
(set-face-foreground 'font-lock-type-face "aquamarine1")
(set-face-foreground 'font-lock-builtin-face "khaki1")
(set-face-foreground 'font-lock-constant-face "honeydew1")
(set-face-foreground 'font-lock-warning-face "red")
(set-face-bold-p 'font-lock-warning-face nil)
))
かっこいいと思ってるのは僕だけかもしれません。
TidalCyclesの実行
TidalCyclesの演奏方法はこちらに詳しくあります。流れとしては
1. SuperColliderを起動しSuperDirt.startを実行
2. test.tidalなど拡張子.tidalファイルをEmacsで開き、
C-c C-sでTidalをブート(Ctrlを押しっぱなしにしながらc, cだけ離してs)
3. d1 $sound "bd"などをctrl + returnで実行
注意点は、SuperDirt.startをやったときに、SuperCollider IDEのポストウィンドウにSuperDirt: listening to Tidal on port 57120がなかなか表示されない場合があります。そのときは再起動しましょう。
Sound Card(AudioInjector)の設定
まず、こちらからインストーラーを落とし、解凍&実行します
https://github.com/Audio-Injector/stereo-and-zero/raw/master/audio.injector.scripts_0.1-1_all.deb
その後、端末で以下を一行ずつ実行。
audioInjector-setup.sh
#上が終わったら一旦reboot
amixer set 'Output Mixer HiFi' on
#以下二行はデフォルトのインプットをRCAとMICどちらにするかの設定。好きな方にする
alsactl --file /usr/share/doc/audioInjector/asound.state.RCA.thru.test restore
alsactl --file /usr/share/doc/audioInjector/asound.state.MIC.thru.test restore
これでデフォルトのサウンドカードとして認識されるようになるので、あとはいつも通りsupercollider & Tidalを起動するのみです。高音質LiveCodingを楽しんでください😎
外部シンセ(KORG NTS-1)との連携
Raspberry Piでは、Tidalcycles userbaseに書いてあるMIDIのセットアップの後に、qjackctlの設定をする必要があります。まずはSuperColliderでSuperDirt.start実行後に以下を順に実行してください。
MIDIClient.init; //post windowに利用可能なMIDIデバイスの一覧が表示される。
//ここではkorg NTS-1をターゲットにする
~midiOut = MIDIOut.newByName("NTS-1 digital kit", "NTS-1 digital kit MIDI 1");
~dirt.soundLibrary.addMIDI("midi", ~midiOut);
~midiOut.latency = 0.1;
あこの後端末を起動し、qjackctlでjackの設定ウィンドウを立ち上げます。connectタブからALSAタブと進み、SuperColliderのout0とNTS1を接続します。もしALSAのタブが表示されてない場合は、qjackctlのsetupメニューでalsa sequencer supportみたいなやつにチェックを入れqjackctlを再起動しましょう。
あとはTidalをブートし、
d1 $note "0 3 5 7" #sound "midi"
などと打ち込み実行するとシンセが鳴ってくれるはずです!
(完全に余談ですが、約4ヶ月ぶりのツイートがこれでした・・・)