🗐 電装工芸日記 - 舞台照明機器の製作とか -

能登半島地震で被災された方々にお見舞い申し上げます。

or 管理画面へ

2023年7月 この範囲を時系列順で読む この範囲をファイルに出力する

Icon of admin
 PysimpleGUI は簡単な画面を簡単に作れますが、母体である Tkinter の機能の一部を直接引っ張り出すことで思った以上に細かい作り込みも出来ます。
 もちろん、直接使うのに比べたら出来ることは少ないのですが、少ない学習量と記述量でここまで出来るなら御の字だと思います。主なGUIライブラリは、一つのことをするのに「あっちにコレ」「そっちにソレ」と彼方此方に記述をしなければなりません。細かく言うなら、雛形 class をオーバーライドして自分用の class 定義を延々とやらねばならず、Pythonの書き方としては王道なのでしょうが、簡単なことを簡単に実現するには程遠い感じです。
 何を以って良しとするかは難しいですが、GUI画面製作の入門として PysilmpleGUI がお勧めなのは間違いありません。class ってイマイチわからない、って人も使えると思います。
 もちろん、オブジェクト指向の書き方が出来るプログラム言語で class を使わないのは魅力が半減ですから身に付けるべきですケドね。

 本業が詰まってしまい LTC Player の製作は完全に止まっていますが、合間に勉強を進めていきましょう。

#Python

2023年6月 この範囲を時系列順で読む この範囲をファイルに出力する

Icon of admin
 そんなこんなで LTC Player の製作は止まっています。進めたいのですが時間だけでなくアタマの容量も不足してます。
 PysimpleGUI を筆頭にプログラム環境でどこまで出来るかを探りながらなので、自分でもどう仕上がるかわからんという本音もあります。
 最近気づいたのは、sg.FileBrowse() などのボタンとしてレイアウトしなければならない機能は、不可視設定した column に入れ込んでしまえば表示しなくても使えること、ボタンオブジェクトを押したことにする .Click() を使えば他の event から(もちろんメニューからも)読み出せるというものです。PysimpleGUIを使ったことがないとピンとこないことですが、これは PysimpleGUI のレイアウトに自由度を与えてくれます。

追記
 .Bind() を使うと細かいキーボード操作を event として取り込むことが出来るらしい。
 キー操作をプレスにするかリリースにするかを選べるハズです。この辺りも研究課題です。

#Python
Icon of admin
 このところサーバーを作っていました。設置場所は某劇場の舞台事務所です。
 インターネットにも行けるごく普通の館内LANを使うのですが、館内のフリーwi-fiと元を同じくする回線です。先の設定がどうなっているのかわかりませんが、ネットマスクの桁数から想像するにフリーwi-fiの回線そのものと思われます。無料で使わせてもらえるので贅沢を言ってはいけませんが、接続しているパソコンと共有しているフォルダは絶対に隠さなければなりません。
 となると、必要な通信は通って不必要は通信は遮断するゲートウェイサーバーを構成する必要があります。その他の課題は、ローカルLANをwi-fiにすることです。机の配置の都合でLANケーブルを敷設出来ないからです。
 サーバー機の構成は、機体がジャンクのPC、OSはdebian、データストレージはRAID1にしたHDDを2台とバックアップ用のUSB-HDD、wi-fiのアクセスポイントとしてUSBのwi-fiトングです。マザーボードにはLANコネクタが2個あるので、外向きLANと内向きLANを構成してwi-fiトングは内向きのLANとブリッジします。
 これまでにも近い構成を何度も組んでいますからすんなり終わるだろと思ったら大間違い。このところのdebianはヴァージョンが上がるごとにセキュリティ対策が増え、設定が微増するのは仕方ないとして、旧来のコマンドが使えなくなったり設定の仕方がちょっとだけ変わるのです。私からすればよくわからん方言となりますので調べるのに時間がかかりました。持った通りに組めましたが、思惑より2日間余計にかかって他の仕事がヤバイ。
 おまけというか蛇足ですが、VPNで本社にも繋がる様にしておきました。本社の共有フォルダにアクセス出来れば業務も楽だろうと。

 突っ込んだ話ですが、DHCPサーバー、DNSサーバーとしてdnsmasqを使ってみました。簡易的なモノというイメージがありますが、私が組む小規模サーバーにはisc-dhcp-serverやbind9よりも等身大です。複雑な振り分けやルーティングはしませんので機能は十分ですし何よりも設定が分かりやすい。これらはサーバーを作り始めた当初に難儀したところですからこの使い勝手は感激レベルです。一つ問題を上げるなら、起動後、wi-fiトングと内向きLANとのブリッジが完了する前にdnsmasqが起動すると正常に動作しないので、dnsmasqの起動に待ちを入れる必要があったことです。これを見つけるのに少し時間がかかりました。
 /etc/resolv.conf を dhcpcd に書きかえらない対策が必要なことも気付くのに時間がかかりました。dnsmasq は自分でルートファイルを持たないために設定が簡単ですが、dhcpでアドレスを受け取る際に得たDNSサーバーの情報で /etc/resolv.conf を書き換えてしまうのです。これをされると自分でDNSサーバーを持っている場合に不都合が出るので、/etc/resolv.conf は書き換え不可にしなければならないのです。dnsmasq にも書き換えしない設定があるようですが、何度やっても書き換えられてしまう。ならば、/etc/resolvconf をOSレベルで書き換えられてない様にすればいい。同様の問題を抱えた先達がいましたので有難くパクらせて頂きました。パーミッションを400にするのかと思いきや、パーミッションより上位のフラグがあって、それを設定するのがいいらしい。# chattr +i /etc/resolv.conf とのこと。+i は書き換え不可のフラグを立てるスイッチです。外すなら -i だそうな。
 あと、DHCPクライアントをdhcpcdにしました。RaspberryPiで慣れているのもありますが、旧来の /etc/network/interfaces だけで設定するより何をしてもスムーズ。特にwi-fiトングをアクセスポイントにする hostapd を使うなら dhcpcd 一択と思えるほど快適でした。

 書き始めたらキリがありませんが、都度の感想も書き入れた設定記録を残したので、次の製作では参考にしつつ読んで楽しもうと思います。

 サーバーの設定は server world さんを参考にしています。
 server world
 ここの通りにすればちゃんと動きますので、私はここのレシピで基本設定をしてから好みに変更する様にしています。
 ただし、セキュリティについては別です。基本はフォルダやファイルのパーミッション、ルーティング、IPフィルタリングですが、ここはそうった解説を書かない方針と見受けらえます。それらについては別途勉強しなければなりません。

#サーバー
Icon of admin
 LTC Player はファイルを読み込んでセットリストの編集をするところまで来ました。
 この辺り、かなり面倒です。編集の手順、再生中のLockなど、よく考えないといけません。
 それでも、かなりそれっぽくはなってきました。

#Python
Icon of admin
 LTC Player はPySimpleGUIとpython-vlcを勉強しながら書いてきたためにソースコードがゴチャゴチャ。
 この先もあるので、変数やインスタンスの名前も手直ししながら大整理をしました。時間がかかりましたが読みやすく手直しもし易くなりました。
 で、そんな整理をすると出てくる出てくる細かいバグ。
 先日、mp3再生中にポジションスライダーを動かすと警告が出て再生速度などがおかしくなることがありましたが、対策はplay()、stop()、pause()を実行した後にis_playing()が望みのフラグを返すまで待つというものです。コレが抜けてる所が数カ所。状況が整っていないのに次の指令が来ることが原因だったようで、再生速度が狂う現象は解消されました。mp3でスライダーを多用すると再生時間のズレが出るのは変わりませんが、wavなら期待通りの動きなのでいいかなと。

 現在の画面。PlayListとNEXTはモックアップです。
20230621223221-admin.jpg

#Python
Icon of admin
 LTC Player はPySimpleGUIの扱い方を探りながらです。Tkinterのラッパーらしいですが、簡単に使える反面制約が多いので、別な意味で難しいところがあります。
 主な制約はウェジット(オブジェクト)の並べ方によって挙動が違うことです。全てではないのですが「ナゼそうなる!?」に出会うことが少なくありません。昨日もExecl的な表示をするTable機能で出くわしてしまい数時間悩んでしまいました。下記の試作品では「Add Music」が今の位置では期待通りの挙動をしますが、表の左隣りでは期待通りに動きません。ウェジットを単独テストしてからレイアウトに入れ込めば期待に反する挙動が起きても並べ方が原因だろうと予想出来ます。
 問題点と言えば問題点ですが、クセといえばそれまでですし、TkinterやKivyに比べて簡単なことは余りある価値です。これで無理な製作は自分はやらないとすればいいでしょう。

 画像は製作途中の物です。パラメータやレイアウトは今後変更していきますが、基本的な機能は実装出来ました。挙動を確認しながら進めていきます。
 一般的な音楽プレーヤーには無い機能を考えています。
 画面でわかりやすいのは「▼ NEXT ▼」です。プレイリストの順番で再生していくのは当然ですが、これにアサインしてからPLAYに行く前提です。曲順が入れ替わっても前の曲が再生している最中に呼び出せます。照明の卓っぽいですねwww。
 あとは、曲間というか次の曲への手順を決めます。曲間が自動停止か続くかはもちろん、次の曲へ渡すまでの秒数を決める様にします。表のNextの列にPauseとあるのは自動停止、秒数らしき数字があるのは曲続きの意味と待ち秒数です。
20230619113316-admin.jpg
 VLCにも少し問題があります。
 スライダーで再生ポジションを表示し変更できる様にしてありますが、スライダーの動作によってはVLCがタイムスタンプのエラーを出します。圧縮が高いmp3の為かもしれませんが原因は不明です。
 止まりはしないのですが、エラー発生の後、テンポやピッチが狂うことがあります。ダンスイベントが主目的ですから本番でポジションスライダーを触ることは無いと思いますが、必要な時にテンポやピッチが狂うのは困ります。
 処理手順の変更でエラーを防止できないか調べることにします。

追記
 ふとアイデアが出て、本業中なのに手を止めて修正www
 VLCのエラーは対策が出来たっぽい。
 かなり面倒な手順ですが、
0)ポジションスライダーのイベント確認
1)再生停止 stop()
2)ポジションスライダーの情報からポジション値を計算
3)再生開始 play()(タイム00:00:00.00からになります)
4)再生確定まで待つ
5)ポジション値をセット
6)操作が一時停止中ならpause()
 といった感じ。
 VLCをリセットし、改めて再生して位置を宣言する手順です。
 コマンドプロンプトにはエラー表示が出ず、テンポやピッチの狂いも起こっていないようです。

追記の2
 mp3ファイルではポジションスライダーの行き来を繰り返すとタイムスタンプがズレることがあります。
 いやーな感じでしたが、wavファイル(非圧縮)だと起こりません。mp3の圧縮方法を知っていると納得出来ますし、wavファイルで問題が無いならいいかなと。

#Python
Icon of admin
 LTC Player を試作ってみました。
20230618062945-admin.jpg
 まだまだ途中ですが、ウィンドウの下半分はこんな感じかなと。音源ファイルを選択して再生出来ます。再生、停止などは当たり前ですが、スライダーで再生位置指示と音量を付けてあります。音量は音源に対するものでシステムの音量は変化しません。上半分にはプレイリストを表示する予定です。
 PySimpleGUIはレイアウトの制約が多いのですが、その範囲で並べればいいだけです。自由度を求めるならTkinterやKivyですが、これらはプログラミングが大変過ぎます。PySimpleGUIなら予習2日、製作数時間でここまで出来ました。
 ボタンがフォーカス(押してはいないけど選択された状態)されているとスペースキーで押されたことになるので、フォーカスをボタン類から外すか常にPLAYボタンがフォーカスされた状態にするにはどうするかが課題です。
 キー入力の取得も簡単でした。ウィンドウを表示コマンドにキーイベントを拾うスイッチを加えるだけです。キーボードで押された文字が戻り値に入ります。日本語入力状態には対策が必要です。

追記
 ボタンのフォーカス問題ですが、ダミーボタンを置き、常にこれがフォーカスされる様にしました。
 イベントが発生してPySimpleGUI.Window.read()を抜けたらイの一・無条件にダミーボタンをフォーカスするのです。
 今はボタンしかレイアウトしていませんのでいいですが、強制フォーカスがダメな時には強制フォーカスの実行に条件を付けましょう。

#Python
Icon of admin
 LTC Player を作るのにPythonのGUIライブラリを検討しています。
 Python標準のtkinterも良いと思うのですが少し物足りない感じ。
 マルチプラットホーム対応で無料の条件ですと kivy が良さそうです。出来ることが多すぎて難しそうですが、これは贅沢な悩みです。
 kivyはkv言語と呼ばれるコマンド群を使うことでスタイルシートの様な使い方が出来る様です。Tkinterよりも細かい画面作りが可能ということです。
 何が出来るのか、どこまで出来るのか、どうやったら使えるのかはこれからの勉強です。

追記
 仕事の合間にkivyについて調べてみましたがとても難しい。これで出来ない表現は無いように思える程ですが、ここまで必要か疑問。正直、kivyの学習には時間がかかり過ぎます。
 別なGUIライブラリが無いかと調べたところ「PySimpleGUI」というのがありました。必要な表現が出来るかわかりませんが簡単です。コマンドで画面を描きますが、難易度はFileMakerProの画面描きと大差ない感じです。

#Python
Icon of admin
 昨日書いたpython-vlcが別なPCでも再生出来るか、mp3以外のフォーマットも再生出来るかチェックしました。
 もちろんVLCで再生する物は問題なく再生出来ますが、VLCのアプリで再生するよりも音の締まりと広がりが良いように聴こえる。。。
 何が違うんでしょう!?

 音源再生アプリ(LTC Player)には一般的な音源プレーヤーにはあまり無い機能を付けます。
1)音源毎に音量設定
2)再生開始点、終了点の設定
3)曲の終わりで止めるか曲続きか。曲続きなら曲間秒数も設定。
4)処理が許せば、指定秒数からの F.I/O も実装。可能ならクロスフェードも実装。
 ダンスイベントですと音源の音量がマチマチですし、前後の無音(白身)がやたら長い物があったりするからです。
 通常は事前に音量と白身を調整して現場に臨むのですが、あったら便利かなと思う機能です。
 あとは、先日も書きましたが、raspberryPi pico を使ってプログラムマブルキーボードを作って外部スイッチにします。

#タイムコード #Python
Icon of admin
 LTC Generator は卓に繋いで20時間以上正常に連続動作しています。PCとのやりとりの都合で手直しはありますが、基本的な機能はこれで完成とします。
 python-vlcでの音出しも方向性が見えましたので、あと必要な要素はPC上のソフトウェアです。
 Pythonのウィンドウマネージャーはtkinterが一番ベタな選択肢です。Python標準ですから安定性が期待出来ますし、WindowsでもMacOSでもLinuxでも同じソースで動きます。もっと書きやすくデザイン性に優れたウィンドウマネージャーもあるそうですが、何が違うのかよくわからないですし、基本過ぎるモノに慣れれば便利な物も使えるでしょうから、当面はtkinterを勉強してみます。つか、目に見えないところで動作するソフトウェアばかり書いてきたので画面作りは苦手です。

#タイムコード #Python

■当面の課題

桜のライトアップの季節です。花粉症の季節でもあります。
自分は平気ですが、花粉症の部下は死にそうな顔をしています。

編集

■複合検索:

  • 投稿者名:
  • 投稿年月:
  • #タグ:
  • カテゴリ:
  • 出力順序:

■日付検索:

■カレンダー:

2023年7月
1
2345678
9101112131415
16171819202122
23242526272829
3031

■カテゴリ:

■最近の投稿:

最終更新日時:
2024年4月25日(木) 20時49分22秒