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

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

or 管理画面へ

タグ「Python」を含む投稿[119件](6ページ目)

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
Icon of admin
 python-vlc で音源を流す試験をしました。
 単に再生するだけなら簡単。
 ちょっと難儀したのは再生終了を確定する処理。再生後自動的にリセットされませんので、再生が終了したことを確認して後処理をしないといけません。
 vlc.MediaPlayer.is_playing()は再生中かどうかを把握出来ますが、これだけでは再生が終了したフェーズかわかりません。オレフラグ(下記ではis_playing)を併用して再生前か再生後かを判別します。再生後ならstop()を実行します。きちんとstop()しないともう一度再生が出来ないpython-vlc。
 下記は再生終了を確定する試験として繰り返し再生するモノです。

# -*- coding: utf-8 -*-

import time
import vlc

def play() :
 # 音声ファイルを定義
 play_music = ( [ vlc.MediaPlayer() ] )
 try :
  play_music[0].set_mrl( 'C:/音源.mp3' )
 except :
  return -1
 # 再生ボリューム設定
 play_music[0].audio_set_volume( 60 )
 # フラグ定義
 is_playing = 0  # 再生実行済みフラグ

 # Main Loop
 while True :
  try :
   # 予備睡眠
   time.sleep( 0.0001 )  # Ctl-Cの反応を良くするのに少しsleepを入れるといい
   # 停止中
   if( play_music[0].is_playing() == 0 ) :
    # 未開始で停止中
    if( is_playing == 0 ) :
     play_music[0].play()
     while ( play_music[0].is_playing() == 0 ) : # 再生状態が確定するまで待つ
      time.sleep( 0.001 )
     play_music[0].set_time( 0 )
     is_playing = 1
    # 再生終了で停止中
    else :   # if( is_playing == 1 ) :
     play_music[0].stop()  # 再生終了を宣言してインスタンスをリセットする 主にこれをやりたいがための処理
     is_playing = 0
   # 再生中
   else :
    pass   # 再生中に行う処理は書いていないのでとりあえずpass

  # Ctl-Cで終了
  except KeyboardInterrupt :
   play_music[0].stop()
   break
 return 0

if __name__ == "__main__" :
 play()



 python-vlc便利過ぎ。

追記
 vlc.MediaPlayer.get_length()とvlc.MediaPlayer.get_time()を使って再生が最後まで行ったかチェックしました。
 何曲か試しましたが、概ねlengthの-0.1~-0.2秒で終了しています。vlc.MediaPlayer.get_time()は取得単位の1msecで厳密にカウントされているモノでも無さそうなので表示上の誤差かもしれません。トラック別で音繋がり場合は少し不安がありますが、音のお尻には1-2秒の余白があるのが一般的ですし、そこまで突き詰めるシステムではありませんのでいいかなと。
 画面作りをやって LTC Generator と合わせれば完成が見えてきそうです。
 ウィンドウマネージャーはPython標準のtkinterを使う勉強をしています。書式は違いますが、考え方はHTMLとCSSを使ったweb画面作りに酷似していますので、方言的に翻訳が出来れば何とかなりそうです。ただ、ボタン操作や画面の更新をオブジェクト指向のイベント処理(割り込み)で書くので少し面倒ですし、LTC Generator の制御やvlcの部分はバックグラウンドの常駐処理にしたいのでウィンドウ制御とは別スレッドとなり手間がかかるかも。

#Python #タイムコード
Icon of admin
 オレメモ

 PythonでVLCを使った音楽再生方法を再整理。

 Windows11x64
 Python3.7
 VLC media player ver.3.0.18

 pipでpython-vlcをインストール。
コマンドプロンプト(管理者権限にて)
> pip3 install python-vlc

 pipとはPythonのライブラリを提供してくれるリポジトリのこと。先達に感謝。

 pythonでvlcによる再生。
import vlc

if __name__ == '__main__':
 p = vlc.MediaPlayer()   #vlc.MediaPlayerのインスタンスを作成
 p.set_mrl('sound.mp3')  #インスタンスに音源ファイルを関連付け 相対パスも可能らしいがフルパス指定を推奨
 p.play()         #再生開始

 これだけで音声ファイルが再生されます。

 以下基本的なAPI。
p = vlc.MediaPlayer()       #vlc.MediaPlayerのインスタンスを作成
p.set_mrl('<file_name>')     #インスタンスに音源ファイルを関連付け 相対パスも可能らしいがフルパス指定を推奨 ファイルはVLC media player で扱える物なら何でも。
p.play()             #再生開始 戻り値 0=正常再生/-1=再生出来ない ※ pauseされていれば再生再開
p.is_playing()          #再生中か 戻り値 0=再生していない/1=再生中
p.pause()             #再生中なら一時停止、一時停止中なら再生再開 戻り値無し
p.get_length()          #音源の長さを取得 戻り値 秒数(msec.)
p.get_time()           #音源の最初からの再生位置を取得 戻り値 秒数(msec.)
p.set_time(<msec.>)        #再生再開位置を秒数(msec.)で指定 戻り値無し ※ 再生中やpause()中でないと指定出来ない
p.audio_set_volume(<パーセント>) #0=mute,100=0dB(パーセント指示だと思っていいみたい。100以上も指定可能。)戻り値 0=再生中に設定成功/-1=設定はしたが再生はしていない
p.stop()             #停止 戻り値無し 次回のplay()では最初から始まる
※ 最後まで再生しきっても、stop()をしないと次回のplay()はスタートしない。再生終了で必ずstop()を実行する。
※ 停止中は次の再生開始秒数を指定出来ないので、特定の秒数(msec.)から再生する場合は、play()に続いてset_time(<msec.>)を実行する。ただし、pause()中は指定可能。
p.play()
p.set_time(<msec.>)


 複数の音源ファイルをプレイリストとして扱ってくれるクラスもあるのですが、LTCを作るには少し不便がありそうなため、1曲単位で扱うことにしています。

 vlc.MediaPlayer()のリストを作成する。
p = ( [vlc.MediaPlayer(), vlc.MediaPlayer(), vlc.MediaPlayer()] )
# p[0]、p[1]、p[2] などと使える。

 普通にオフジェクトのリストとして扱える。

 これだけはメモ。
 リストのオブジェクトを追加する。
p.append( vlc.MediaPlayer() )
# 上記に続いた場合は p[3] が追加される


 再生操作のレスポンスはとても良く、タイムラグはほとんど感じない。
 ただ、プレイリスト分のインスタンスを設定するにはメモリに注意かもしれない。

参考
 python-vlcのドキュメント
 ここの「vlc.MediaPlayer」を参照。

#Python
Icon of admin
 あまりにすんなり動いたので忘れてましたが、FT232RL凄いです、便利です。こんな素晴らしいデバイスをナゼ今まで使わなかったのか自分にクレームです。
 Pythonのシリアルも無茶苦茶簡単、PICのシリアルも設定が少し分かりにくいけど数行のアセンブラで送受信できて簡単。
 先人が作ってくれた素晴らしいシステムたちに感謝です。

#PIC #Python #電子工作
Icon of admin
 PythonでVLCライブラリを使った音源ファイルの再生は驚くほど簡単。
 インストールするべき諸々や音源モジュールの設定などもありますが、貴兄のサイトにいくらでもあるのでここでは割愛。
 VLCで再生が出来、Python本体とPython-VLCがインストールされていればいいと思います。

 以下、sound.mp3を再生するPythonのコード。

import vlc

if __name__ == '__main__':
 p = vlc.MediaPlayer()   #vlc.MediaPlayerのインスタンスを作成
 p.set_mrl('sound.mp3')  #インスタンスに音源ファイルを関連付け
 p.play()         #再生開始


 こんだけです!
 vlcのインスタンスを宣言し、音源ファイルを設定し、再生を指示するだけ。
 再生はバックグラウンドで行われるので、マルチスレッドを使うことなく再生中に他のことが出来るのも良点。
 ちなみに「p」はインスタンス名なので自由に定義して良いようです。

 Python-VLCはC言語などが使うlibVLCをPythonから呼び出せるようにしているので、libVLCで出来ることの大半が出来るようです。
 以下基本的なAPI。
p.set_mrl('sound.mp3')  #インスタンスに音源ファイルを関連付け
p.play()         #再生開始
p.pause()         #再生中なら一時停止、一時停止中なら再生再開
p.get_time()       #開始からの経過時間を取得(msec.)
p.set_time(1000)     #指定した秒数(msec.)にセット
p.audio_set_volume(100)  #0=mute,100=0dB(パーセント指示だと思っていいみたい)
p.stop()         #停止

 やりたいことはこれだけで済んでしまいそうな気もする。

 python-vlcのドキュメント
 沢山の事が出来るようですが、
 vlc.MediaPlayer
 の項を読むと上記のことがわかります。

#Python
Icon of admin
 ホール管理の増員で操作盤の置物になっているだけなので調べモノをし放題です。

 PythonのライブラリをC言語で作る方法の基本はわかりました。このサイトだけでほぼ解決。

 製作手順を大まかに書き出すと、

1)関数ライブラリを用意する。
 C言語で#includeして使える関数なら汎用でも自作でも何でもいい。
2)「ラッパー関数」を用意する。
 C言語の関数をPythonへ引き渡す定義をするソースファイル。Pythonからの呼び出し方と変数の変換方法をC言語で記述します。
3)セットアップファイルを用意する。
 セットアップファイルはgccで言うところのMakeFileです。Pythonで記述され、ファイル名はsetup.pyにすることが多いそうです。
4)ビルドする。
 セットアップファイルを使ってビルドする。
5)インストールする。
 セットアップファイルを使ってインストールする(動作の実際はPythonパッケージ管理のpipへの登録)。

 と、なります。
 ラッパー関数はC言語とPythonの両方を知らないと記述出来ないので少し難しいですが、セットアップファイルは定型の通り記述するだけです。

#C言語 #Python
Icon of admin
 Pythonはとても書きやすい。インタプリタなので即実行出来てデバッグも楽だし、処理速度を求めないなら短時間で書けて生産性がいい。
 けど、重要な部分をC言語で書くなら全部C言語で書いてもいいんでないか?
 Pythonが私の用途でイマイチな点は条件分岐を多用する繰り返し処理が遅いことです。だからこそPythonのライブラリをC言語で書こうとしているのですが、目的が機械制御ですからPythonを使っている時点でそもそも間違っていると言われても仕方ありません。

 ならなぜC言語を使わないのか。
 何十年も前の話ですがC言語に挫折したトラウマがあるからです。MS-DOS上のTurbo-Cを触ってみましたが、書けるには書けるものの、やりたい機械制御は霞の向うの桃源郷の様でした。正しくはデバイス制御が出来なかったとなるでしょうか。それが故にPICマイコンに目が向いたとも言えます。

 ですが、今は良い教科書が多く、ネットにも先達の情報があふれています。デバイス制御をするにも先達たちが作り上げた資産の恩恵に与れます。
 ケースバイケースでありますが、C/C++をもっと積極的に使った方がいい気がしてきました。

 機械制御を目的とした製作なら、Pythonで試作をしてC/C++で本命を書くのがいいかもしれません。
 PythonもC/C++も作法が違うだけで本質的には同じですし。

 てなわけで、PythonのライブラリをC言語で書くことを勉強するのではなく、RaspberryPiをC/C++で開発する勉強をすることにします。
 手始めに何十年も前に買ったANSI-Cの教科書を読み直しましょうか。Art-NetエンジンをC/C++で書くことを当面の目標にしましょう。これはPythonベースでほぼ完成していますからね。

#Python

■当面の課題

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

編集

■全文検索:

複合検索窓に切り替える

■複合検索:

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

■日付検索:

■カレンダー:

2023年6月
123
45678910
11121314151617
18192021222324
252627282930

■カテゴリ:

■最近の投稿:

最終更新日時:
2024年5月4日(土) 05時49分51秒