【未完成】
音楽データ(MIDI, 独自のPaperTape)を読み込み演奏する。
Music Box 本体で演奏するモードと、 スピーカーから擬似的な音を鳴らずモードがある。
-
二種類のサーバで構成されている。
-
メイン・サーバ: 本体を制御するサーバ
Websocketで、JSON形式のコマンドを受取り、 本体を制御する。
本体を制御する代わりに、 擬似的な音をスピーカーから再生するモードもあり、 本体では再生できない音階も再生可能。(... 後述)
ポート番号を変えて、複数のモードを同時に立ち上げることが可能。
-
Webサーバ: ユーザインタフェース用:
http://IPorHOST:10080/musicbox/
ユーザからの入力を受け、メインサーバとWebsocket通信する。 (メイン・サーバからみるとクライアントとして動作する。)
ファイルのアップロード、 アップロードされたファイルの管理・保存、 パージングは、 Webサーバで行い、 パージングした結果のデータをメイン・サーバに送信して、演奏する。
(パージング結果をWebサーバ側で適切に管理すれば、 毎回パージングする必要は無い。)
-
-
全ての機能(上記2種類のサーバ、パージングなど)は、 一つのコマンド「
MusicBox
」で実行する。(
git
コマンドなどと同様)
$ sudo pigpiod
$ cd ~
$ python3 -m venv env1
$ cd ~/env1
$ source ./bin/activate
(env1)$ git clone https://github.com/ytani01/MusicBox.git
(env1)$ cd ~/env1/MusicBox
(env1)$ ./install.sh
メインサーバとWebサーバを起動する。 既に起動している場合は、全て終了(kill)してから、再起動する。
$ boot-musicbox.sh
全サービスを終了(kill)する場合は、
$ boot-musicbox.sh -k
ブラウザからアクセスして、サーボモータの調整を行う。
URL: http://IPaddress:10080/musicbox/
(env1)$ python3 -m pydoc musicbox.クラス名
$ MusicBox サブコマンド名 -h
$ install.sh help
[インストール後のディレクトリ構造]
$HOME/ ... ホームディレクトリ
|
+- bin/ ... シェルスクリプトなど
| |
| +- MusicBox ... メイン・コマンド・スクリプト (wrapper script)
| +- boot-musicbox.sh ... 起動スクリプト
|
+- musicbox-env ... 環境変数設定ファイル【インストール時に作成】
| 【環境変数】
| MUSICBOX_DIR ... git clone されたディレクトリ
| MUSICBOX_WORK ... 作業用ディレクトリ ($HOME/msucibox_work/)
| VENVDIR ... python3 Virtualenv ディレクトリ ($HOME/env1/ など)
| (etc.)
|
+- musicbox-servo.conf ... サーボ調整パラメータ保存ファイル
|
+- musicbox_work/ ... 作業用ディレクトリ
| |
| +- upload/ ... アップロードされたファイル(MIDIなど)
| +- music_data/ ... パーズ後の音楽データ
| +- log/ ... ログディレクトリ
|
+- env1/ ... python3 Virtualenv(venv) 【ユーザが作成する】
|
+- musicbox/ ... musicboxプロジェクトの gitリポジトリ
|
| 【以下、インストールに必要なライブラリなど】
|
+- ServoPCA9685/
+- StepperMotor/
+- MIDI-lib/
:
Music Box 本体を直接制御するサーバ
Websocketで通信して、 Webインタフェースなどから、コマンドを受取り、 曲を演奏したり、単発で音を鳴らしたりする。
以下は、基本的な使い方のみ。 オプションの詳細については、下記、リファレンスを参照
$ MusicBox server -h
$ MusicBox server &
-w N
オプションをつける。
(N = 1, 2, 3)
Music Boxをシミュレートする
$ ./MusicBox server -w 1 &
ピアノをシミュレートする (88音階)
$ ./MusicBox server -w 2 &
sin波のサンプル音でシミュレートする (128音階)
$ ./MusicBox server -w 3 &
以下、いくつかの例を示す。
詳細は、下記のマニュアル参照。
$ MusicBox -h
$ MusicBox サブコマンド名 -h
$ python3 -m pydoc musicbox.WsServer
$ MusicBox send single_play 0 2 4
$ MusicBox ptt kaeruno-uta.txt ws://localhost:8880/
$ MusicBox midi joy.mid ws://localhost:8880/
$ MusicBox send music_stop
$ MusicBox send music_start
$ MusicBox send music_seek 30
この方法だと、パージング処理を毎回しないで済む。
$ MusicBox midi midi_file music_data.json
$ MusicBox send music_load music_data.json
サーバが受付けるコマンド・メッセージの形式などについては、 下記を参照。
python3 -m pydoc musicbox.WsServer
紙テープをテキストで擬した形式
# '#'以降はコメント
600 # 以降の delay を 600msec とする
o-o-o----------
-o--o----------
--o-----o------
___o___o_____o_
-o-o-o---------
--o---o--------
--*-O-o-------- # 'o', 'O', '*'は、どれも紙テープの穴とみなす
-
トラック: 楽譜に相当
-
チャンネル: 楽器に相当
-
1つのトラックに、複数のチャンネルが存在可能
-
トラック、チャンネルは、「直列的に」結合されている。
MIDIデータ: [トラック1:チャンネル1]-[トラック1:チャンネル2]- --->
再生するには、 トラック・チャンネンルに分割して、 「並列に」再生する必要がある。
演奏 -+--> [トラック1:チャンネル0] -->
|
+--> [トラック2:チャンネル1] -->
|
+--> [トラック3:チャンネル2] -->
:
:
どれが主旋律かわからないので、自動選択は不可能。