PythonでTENORI-ONを動かすblog(仮)

PythonでMIDIを作ってYAMAHAのTENORI-ONをごにょごにょするよ。

備忘録)MIDIでエレクトーンをハックする記事

Raspberry Pi × MIDIの外部出力について調べていて、たまたま見つけた。

 

qiita.com

ArduinoMIDIでしかもエレクトーン!!!

とどめにPS2のコントローラー制御まで。

 

非常にグッときました。ご飯3杯いける勢いです。

 

「ゲームのコントローラーで既存の楽器(あるいは電子機器)を制御する」は組み合わせとしては無限大。

なので、心の引き出しにそっとストックしておこうと思います。(今は技術も時間も足りない)

 

そういえば、昔のMakeでは、ゲームボーイのソフトをハックしたり、センサーで既成のゲームをハックする作品もありました。近年はそういうタイプはあまり見ていない気がします。

 

 

 

 

Raspberry PiのMIDI出力がうまくいかないので、、

色々試したいが、万が一tenorion壊したら困るので、何かシステム・エクスクルーシブ出力に対応した安いMIDI機器がないか調べてみたのだが。

 

ポケットミクが税込・送料込990円で売られていた(※)ので、買ってしまった。

 

で、届いたのでとりあえず「MIDI Trail」を使って、既存のMIDIを流してみることにした。


普段、歌モノあんまり聴かないので、とりあえずブラジル音楽の巨匠エグベルト・ジスモンチである。

 

本家。アルバム『Alma』に入っているピアノver.が一番好きです。


たぶん、今のPythonを少しいじればリアルタイムでMIDI流すこともできると思われるので、ドラゴンボールの擬音の音読とか喋らせてみたいところ。


目的から逸れたけど、面白そうなので余裕ができたら遊んでみよう。

 

※定価は4980円(税抜)。現在の最安値は2000円くらいです。

 

product.rakuten.co.jp

 

実録。RaspberryPiでPythonが動くまで

正直、こんなに手こずると思わなかった。

インポートは予想外に時間がかかるということを痛感した。
macで動いているコードをRaspberryPiで動かせるようになるのに、まさか丸1日かかるとは。


●numpy,pandas関連のインポートで2時間かかった。
=>CPUのスペックか。。まぁ、安定した通信環境で放置しておけば良いので。
 (とはいえ、Amazon Primeで映画「銀魂」一本見終わって、愕然とした。)

pyenv関連は下記を参考にさせていただいた。
pandasはエラーにならなかったけれど、scipyは40分ぐらいしたところでエラーになり失念した。

plant-raspberrypi3.hatenablog.com

 

pygameのインポートエラー
=>さほど時間はかからないが、'Unable to run "sdl-config". Please make sure a development version of SDL is installed.'というエラーが出た。
下記で解決できた。

qiita.com

 

●PILインストール
下記のコマンドですんなりいけた

$ sudo apt-get install python-imaging

 

tkinterが一番はまった!!!!
色々情報が多いが必要なパッケージはpython3-tkだった。

ただし、先にpyenvを入れてると、関連づけがうまくできないようでエラーになってしまう。
ModuleNotFoundError: No module named '_tkinter'

一度pyenvをアンインストールして、入れ直したら解決した。

Ubuntのpyenv上でtkinterを使えるようにする - Python学習講座

 


・・・ここまでやって、ようやくエラーなしでコードが動くようになった。

が、tenorion本体にMIDI信号が流れていないのか、うんともすんとも言わない。

 

戦いはまだ続く模様。

 

もくもく会参加してきた

ひょんなことから「RaspberryPiもくもく会」に参加してきたのだった。

 

家だけで作業していると、イベント本番のトラブル対応に弱くなるので、予行演習も兼ねて行ってきた部分もあるのだけれど、色々勉強になりました。

 

[装備について学習したこと]
●有線LANケーブルはあった方が安心
 Wi-FIが繋がらないと詰むので、ブリッジ接続の備えがあった方が良い。
 「今時のマシンはクロスケーブルでなくてもいける」というが、ストレートケーブルで問題なさそう

●電源タップは口数だけで安心してはいけない
 3口のタップを持参したが、アダプタが大きいため、2口しか使えなかった。
 追加で延長か何か必要と気づいた。

●モニタ/キーボードはなんだかんだあった方が安心
 ssh接続があれば問題ないと思っていたが、イベントにおいては心の安定のためにあったほうが良い。。

●バックアップのSDカードは常に用意。
 時間ない時はRaspbian本体GUIのSDcard copierでいいのでバックアップを用意すべし。

●旅行バッグでは遠征の荷物が入りきらないと知った
 機材はギリギリ入ったが、着替え等を入れるバッグが追加で必要と判明した。
 (尚、機材だけで6kg近いのでリュックの購入を検討)

●ドライバセットはあった方が安心。


[環境周りで学習したこと]
●重めのインストールは通信の不安定なところでやってはいけない(かもしれない)
●カードも本体も、壊れるもの。
 Pythonのライブラリインストール中に、突然落ちて、そのまま本体ごとお亡くなりになった。合掌。
 直接関係あるか謎だけれど、「ちゃんとシャットダウンせずに、起動し直すと壊れることが多い」と教わった。

FTP設定しておくと便利
 実行コードを入れるのに、SDカード抜き差しするのは面倒。

 

[その他]
●セッティング・撤収は練習が必要。
●中身について説明するの下手なので、コードを印刷しておくと会話がしやすいかもしれない。

 

次回もくもく会は10/27とのことです。

raspberry-pi-moku.connpass.com

 

 

 

TKinterで簡易UIを作る

 

 Raspberry Piのモニターから文字入力させるため、TKinterでUIを作った。

 

 

ボタンの色が、どうオプション設定してもうまくできないのが気になる。。

が、はまるポイントはそれぐらい。

 

今、3.5インチモニター+キーボード+マウスで進めているが、ごちゃごちゃしているので。

モニターのタッチパネル+ソフトウェアキーボードでやるなら、7インチないと厳しいだろうか。など。紆余曲折。

 

f:id:bastardeyes:20180918002515p:plain

 


import tkinter as tk
from tkinter import messagebox

class Tkinter_app(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.create_widgets()

    def create_widgets(self):
        self.input_box=tk.Entry(width=30)
        self.input_box.grid(row=0,column=0,columnspan=4, padx=5, pady=20,sticky=(tk.N, tk.S, tk.E, tk.W))
        
        self.clear_btn=tk.Button(width=5, fg='#696969')
        self.clear_btn["text"]="クリア"
        self.clear_btn["command"]=self.clear_input_value
        self.clear_btn.grid(row=1,column=1,padx=5, pady=10,sticky=(tk.N, tk.S, tk.E, tk.W))#,sticky=(tk.N, tk.S, tk.E, tk.W)

        self.exec_btn=tk.Button(width=5,fg="#ff6347")
        self.exec_btn["text"]="実行"
        self.exec_btn["command"]=self.execute_input_value
        self.exec_btn.grid(row=1,column=2,padx=5, pady=10,sticky=(tk.N, tk.S, tk.E, tk.W))#,sticky=(tk.N, tk.S, tk.E, tk.W)
        
    def clear_input_value(self):
        self.input_box.delete(0, tk.END)
    
    def execute_input_value(self):
        msg = self.input_box.get()
        if len(msg)>0:
            messagebox.showinfo("Now Playing..", msg)
        
root = tk.Tk()
root.title("電光掲示板")
root.geometry("480x320")
root.config(bg="#f5f5f5")

app=Tkinter_app(master=root)
app.grid(column=0, row=1)
app.mainloop()
    

 

下記、参考にさせていただきました。

myenigma.hatenablog.com

 

 

Raspberry Piではまった。

気づいたら随分時間が経過していた。不覚。

今後2台目で同じことをやりそうなので、以下備忘録。

 

●環境
・本体:Raspberry Pi3 B+
・モニタ: QUIMAT 3.5" LCD DISPLAY
・SDカード:Sumsung MB-MC32GA

 

●はまった箇所
[モニタ]
1)Noobs経由でRaspbianを入れるとうまくいかない。
=>公式から "2018-06-27-raspbian-stretch.img"をダウンロードして、ETCHERを使ってSDカードに入れるのが最適解だった。

(フォーマットFAT32なので、4GB強のイメージファイルはコピペで移動できない)

 

2)専用ケースに入れると付属のHDMIジャックが奥まで入らない。接触不良で「No Signal」となって使えない。
=> 諦めて普通のHDMIケーブル使う(ただし見映えが悪い。かさばる。)

 

3)付属のDVDが読めない。

=>gitでドライバ落としてくれば事足りる。cloneは/boot 配下で実行。

 

4)ドライバのタッチパネル設定のコマンド「sudo ./MPI3508_480_320-show」がエラーになる。
エラー"this is not raspberrypi kernel, no need to update touch configure"
=> 本体ホストネームを初期設定(raspberrypi)から変更していたので出た模様。
  ホストネーム"raspberrypi"で行うのが吉かと。

  参考)ドライバのソースのこの部分。
   if test "$nodeplatform" = "raspberrypi";then


[本体]
・「3B+はdefaultでWi-Fi無効」
=>通常は、 /etc/wpa_supplicant/wpa_supplicant.conf に設定追加すればOK。

country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="XXXXX"
psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
scan_ssid=1 #SSIDがステルスの場合必要
}

 
=> しかし我が家で追加しても動かなかった。
 原因: なぜかWi-Fiのパスワードが、ルータの工場出荷状態に戻っていた。。

 (他の機器繋がってるので気づかなかった)

 

[PC]
・数回Raspbianを入れ直していたら、SSHが繋がらなくなった。
 =>sudo vi /Users/ユーザ名/.ssh/known_hosts で中身消す。

 

・・・迷走した結果、ssh接続してもhost downして動かなくなり、夜中にSDカードを再フォーマットするのを繰り返したり、色々ありました。。

 

相当のロスがあったが、ようやく開発に戻れる。

----------------

参考資料。

●モニタ周り、まとまっている記事。

Raspberry Pi で使えるポータブルモニタの決定版が出てた(タッチスクリーン付き、GPIOを占有しない、ケース付き、約3000円) - nomolkのブログ

 

●環境周り

Raspberry Piを自宅以外の場所で使う時に役立つ設定

Raspberry Pi 3をUpdateしたらWiFiに繋がらなくなった: 文系エンジニアの私的ナレッジベース

 

raspberry pi再インストール後にssh接続

ラズパイ の OS イメージを焼くときは Etcher が 便利 & UI カッコいい | 験なきものを思はずは