はじめに
株式会社 ジークス 3年目の竹村です。
今回もMuseScore × Pythonの記事になります!
MuseScoreはGUIのソフトウェアで、作成した楽譜をPDFエクスポートして使用することが多いです。
しかしながら、これを開いてエクスポートするのは、些か面倒なことです。
特にフォルダ内一括とかできると便利だなと感じていました。
今回はそんなプログラムを作成してみました。
Geminiさんの力を借りつつ、その日のうちに作れる内容でした!(あ、日付は超えてた!)
ハンドブックの存在
昼休み、MuseScore、コマンドラインで扱えたりしないかな?
そしたら、Pythonで使えるのにな?
と、MuseScoreのハンドブックを読み漁っていると、気になる記事が出てきました。
mscoreコマンドで、PDFやMIDIの書き出し含め、大量の操作ができるという内容。
MuseScoreは、比較的最近4系になり、私が使っているのは4系。
古い3系ベースに記載された記事みたいだけど、4系でも大丈夫かな?と思いつつ調査してみました。
コマンドラインでの確認
mscore -v
と打ち込んだが、、何も起こらない。
私のMuseScoreはパッケージ管理システムのFlatpakからインストールしています。
その影響かパスが通ってませんでした。
Geminiさんに聞きつつ、Flatpakのパスを通します。
バッシュの設定を開いて、
$ nano ~/.bashrc
mscoreで動くように最後の行に起動コマンドのエイリアスを追記して、
alias mscore='flatpak run org.musescore.MuseScore'
反映。
$ source ~/.bashrc
下記を打ち込むと、MuseScoreが起動しました。
$ mscore
下記はPDFエクスポートのコマンドです。
カレントディレクトリにMuseScoreのフォルダが存在して、その場に書き出したい時のコマンド。
$ mscore -o Pensativa.pdf Pensativa/Pensativa.mscx
msczファイルならこんな感じ
$ mscore -o Pensativa.pdf Pensativa.mscz
これらのコマンドで、うまくコマンドでエクスポートできることは確認できました。
しかも、mscx, msczのいずれのファイルにも対応しています。
両者の違いは下記の記事で紹介しています。
プログラムの流れ
さて、いちいちコマンドを打ち込むのも面倒なので、一括エクスポートと、曲名入力でエクスポートのプログラムを作っていきたいと思います。
今回はサクッとPythonでやってみました。
流れとしては下記のような感じ。
- 一括書き出しの場合
- 一括・個別を選択
- カレントディレクトリのフォルダ一覧を取得
- フォルダをループ
- フォルダ内にmscxファイルがあればエクスポート
- 個別書き出しの場合
- 一括・個別を選択
- ファイル名を入力
- ファイルが存在したらエクスポート
ちなみに、エクスポート先は、一階層上から分岐する別のフォルダです。
というのも、MuseScoreファイルのGit管理を行なっており、PDFは管理対象外としたいため。
作成したPython
実際に作成したファイルがこちらになります。
コードのサジェスト機能もあり、比較的スムーズに組むことができました。
ファイルが存在しない場合の処理などもつけています。
import subprocess
import glob
import os
# Path to MuseScore command line tool installed via Flatpak
MS_COMMAND = ["flatpak", "run", "org.musescore.MuseScore"]
# MuseScore file extension (.mscx)
MS_EXTENSION = ".mscx"
# PDF file extension
PDF_EXTENSION = ".pdf"
# Export modes
BULK_MODE = "1"
PICKUP_MODE = "2"
# Export Directory
EXPORT_DIR = "../museScoreFolder/PDF/"
# Export Score
def export_pdf(score_name):
# mscore command
subprocess.run(
# ex: flatpak run org.musescore.MuseScore -o ../museScoreFolder/PDF/Pensativa.pdf Pensativa/Pensativa.mscx
MS_COMMAND + ["-o", f"{EXPORT_DIR}{score_name}{PDF_EXTENSION}", f"{score_name}/{score_name}{MS_EXTENSION}"]
)
# Export by File Name
def export_pickup():
score_name = input("Enter the name of the score (without extension): ")
# Check exists of the score file
if(len(glob.glob(f"{score_name}/{score_name}{MS_EXTENSION}")) > 0):
# if exists
export_pdf(score_name)
else:
print("Score file does not exist. Please try again.")
return
# Export Bulk
def export_bulk():
# check every directory
for path in glob.glob('*/'):
if os.path.isdir(path):
score_name = path.replace('/', '')
# Check exists mscx file in the directory
is_exists_mscx = len(glob.glob(f"{path}{score_name}{MS_EXTENSION}")) > 0
if is_exists_mscx:
# if exists
print(f"Exporting: {score_name}")
export_pdf(score_name)
else:
print(f"{score_name}: mscx file is none")
# Select Export Mode
def select_mode():
select_mode = input("Please select export mode: \n"
f"{BULK_MODE}. Export all scores\n"
f"{PICKUP_MODE}. Export selected scores\n")
if select_mode == BULK_MODE:
export_bulk()
elif select_mode == PICKUP_MODE:
export_pickup()
else:
print("Invalid selection. Please try again.")
return
# main function
def main():
print("MuseScore PDF export program")
select_mode()
print("Program finished")
main()
動作
指定のディレクトリにエクスポートされていました!
こちらがその楽譜!
GUIでエクスポートしたサイト差異はないです!
動作の様子はこんな感じ。
次に追加する機能としては、任意の複数曲書き出しとかですかね。
おわりに
今回はMuseScoreをコマンドで呼び出す機能を応用し、Pythonで書き出しプログラムを実装してみました。
今後は他のコマンドも使って何かできないか考えてみたいと思います。
環境
OS Ubuntu Studio 24.04 LTS
パッケージ管理 Flatpak 1.14.6
楽譜エディタ MuseScore 4.6.3
