gagaku-player 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- gagaku_player-0.1.0/.gitignore +14 -0
- gagaku_player-0.1.0/LICENSE +21 -0
- gagaku_player-0.1.0/PKG-INFO +175 -0
- gagaku_player-0.1.0/README.md +146 -0
- gagaku_player-0.1.0/examples/asagasumi_ichikotsu.gaku +45 -0
- gagaku_player-0.1.0/examples/demo_hyojo.gaku +24 -0
- gagaku_player-0.1.0/examples/tsukikage_oshiki.gaku +35 -0
- gagaku_player-0.1.0/examples/wakatake_sojo.gaku +45 -0
- gagaku_player-0.1.0/gagaku/__init__.py +3 -0
- gagaku_player-0.1.0/gagaku/__main__.py +4 -0
- gagaku_player-0.1.0/gagaku/assets/gagaku.ico +0 -0
- gagaku_player-0.1.0/gagaku/assets/gagaku.png +0 -0
- gagaku_player-0.1.0/gagaku/audio.py +43 -0
- gagaku_player-0.1.0/gagaku/formatter.py +131 -0
- gagaku_player-0.1.0/gagaku/gui.py +564 -0
- gagaku_player-0.1.0/gagaku/instruments.py +493 -0
- gagaku_player-0.1.0/gagaku/render.py +94 -0
- gagaku_player-0.1.0/gagaku/score.py +256 -0
- gagaku_player-0.1.0/gagaku/scoreview.py +165 -0
- gagaku_player-0.1.0/gagaku/staffview.py +442 -0
- gagaku_player-0.1.0/gagaku/synth.py +406 -0
- gagaku_player-0.1.0/gagaku/tunings.json +29 -0
- gagaku_player-0.1.0/main.py +29 -0
- gagaku_player-0.1.0/pyproject.toml +56 -0
- gagaku_player-0.1.0/tests/test_formatter.py +41 -0
- gagaku_player-0.1.0/tests/test_instruments.py +43 -0
- gagaku_player-0.1.0/tests/test_render.py +57 -0
- gagaku_player-0.1.0/tests/test_score.py +57 -0
- gagaku_player-0.1.0/tests/test_staff.py +22 -0
- gagaku_player-0.1.0/tools/make_icon.py +18 -0
- gagaku_player-0.1.0/tools/make_previews.py +28 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ZiTengXiang
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: gagaku-player
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: 雅楽の譜字をテキストで書くと、笙・篳篥・竜笛・琵琶・筝・鞨鼓・鉦鼓・太鼓の合奏として再生するデスクトップアプリ
|
|
5
|
+
Project-URL: Homepage, https://zitengxiang.github.io/gagaku-player/
|
|
6
|
+
Project-URL: Source, https://github.com/ZiTengXiang/gagaku-player
|
|
7
|
+
Project-URL: Issues, https://github.com/ZiTengXiang/gagaku-player/issues
|
|
8
|
+
Author: ZiTengXiang
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: gagaku,japanese traditional music,music,notation,synthesizer,雅楽
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Environment :: Win32 (MS Windows)
|
|
14
|
+
Classifier: Environment :: X11 Applications
|
|
15
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
16
|
+
Classifier: Natural Language :: Japanese
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Topic :: Multimedia :: Sound/Audio :: Players
|
|
24
|
+
Classifier: Topic :: Multimedia :: Sound/Audio :: Sound Synthesis
|
|
25
|
+
Requires-Python: >=3.10
|
|
26
|
+
Requires-Dist: numpy>=1.24
|
|
27
|
+
Requires-Dist: sounddevice>=0.4; platform_system != 'Windows'
|
|
28
|
+
Description-Content-Type: text/markdown
|
|
29
|
+
|
|
30
|
+
# 雅楽譜プレイヤー
|
|
31
|
+
|
|
32
|
+
[](https://github.com/ZiTengXiang/gagaku-player/actions/workflows/ci.yml)
|
|
33
|
+
[](https://pypi.org/project/gagaku-player/)
|
|
34
|
+
|
|
35
|
+
雅楽の譜字をテキストで入力すると、笙・篳篥・竜笛・琵琶・筝・鞨鼓・鉦鼓・太鼓の合奏として再生する Python デスクトップアプリ。
|
|
36
|
+
|
|
37
|
+
紹介サイト: https://zitengxiang.github.io/gagaku-player/
|
|
38
|
+
|
|
39
|
+
## インストールと起動
|
|
40
|
+
|
|
41
|
+
pip で入れる場合:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
pip install gagaku-player
|
|
45
|
+
gagaku-player --demo # サンプル曲「若竹」を開く
|
|
46
|
+
gagaku-player 曲.gaku # 譜面を開く
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
ソースから動かす場合:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
git clone https://github.com/ZiTengXiang/gagaku-player.git
|
|
53
|
+
cd gagaku-player
|
|
54
|
+
pip install -r requirements.txt
|
|
55
|
+
python main.py examples/demo_hyojo.gaku
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
- 必要なもの: Python 3.10+、numpy(tkinter は Python に標準添付)。`python -m gagaku` でも起動できる。
|
|
59
|
+
- Windows では追加のインストールは不要(再生に標準の `winsound` を使う)。macOS/Linux では pip で入れると再生用の `sounddevice` も入る(ソースから動かす場合は `pip install sounddevice`)。
|
|
60
|
+
- Windows でアイコンから起動したい場合は、`pythonw.exe main.py` を実行するショートカットを作り、アイコンに `gagaku/assets/gagaku.ico` を指定する(`pythonw` ならコンソール画面が出ない)。アイコンは `python tools/make_icon.py` で作り直せる(Pillow と游明朝フォントが必要)。
|
|
61
|
+
- コンソールなしで起動して落ちた場合は、`error.log` に詳細を書き出してダイアログを出す。
|
|
62
|
+
|
|
63
|
+
## 画面
|
|
64
|
+
|
|
65
|
+
- 左「譜面テキスト」タブ: 譜面エディタ。再生中は鳴っている譜字が黄色くハイライトされる。エラーの行は赤くなる。
|
|
66
|
+
- 左「楽譜表示」タブ: 全楽器の拍の頭を縦にそろえ、1段5小節で全楽器を上下に並べた総譜(読み取り専用)。小節の区切りは譜面の `|`、延ばしは細い線で示す。再生中は鳴っている音がハイライトされ、音をクリックするとテキストの該当箇所が選択される(そのまま F6 でそこから再生)。
|
|
67
|
+
- 左「五線譜」タブ: 全楽器を1段5小節の総譜として五線譜で書き、各音の下に譜字を付ける(読み取り専用)。1拍 = 4分音符で、小節や拍をまたぐ音はタイでつなぐ。音部記号は楽器の音域から自動で選ぶ(ト音記号・ヘ音記号・オクターブ上下のト音記号)。調号は使わず ♯ を音ごとに付ける。笙は合竹を和音で、琵琶の掻撥と筝の閑掻・早掻は鳴る音をアルペジオ付きの和音で書く。打楽器は1線譜(鞨鼓・鉦鼓は×の符頭、来はトレモロ)。再生ハイライトとクリックでのジャンプは楽譜表示と同じ。
|
|
68
|
+
- 右上: 譜字パレット(楽器タブごと)。クリックするとカーソル位置に挿入。
|
|
69
|
+
- 右下: ミキサー(パートごとのミュート・音量)。
|
|
70
|
+
- ツールバー: 再生(F5) / カーソル位置から再生(F6) / 停止(Esc) / 速さ% / 残響 / WAV書き出し。
|
|
71
|
+
|
|
72
|
+
## 譜面の書式(.gaku, UTF-8テキスト)
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
title: 曲名
|
|
76
|
+
mode: 平調 # 壱越調 平調 双調 黄鐘調 盤渉調 太食調
|
|
77
|
+
tempo: 60 # 1拍あたりのBPM
|
|
78
|
+
|
|
79
|
+
[笙]
|
|
80
|
+
乙 - - - | 一 - 工 - |
|
|
81
|
+
[竜笛]
|
|
82
|
+
干 - 五 丄 | 責干:2 中 夕 |
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
| トークン | 意味 |
|
|
86
|
+
|---|---|
|
|
87
|
+
| `譜字` | 1拍 |
|
|
88
|
+
| `譜字:2` / `譜字:1/2` | 長さ指定(拍) |
|
|
89
|
+
| `-` `ー` | 直前の音を1拍延ばす |
|
|
90
|
+
| `.` `・` `〇` `休` (`.:2` も可) | 休み |
|
|
91
|
+
| `\|` | 小節線(見た目だけ) |
|
|
92
|
+
| `tempo=72` | その位置からテンポ変更(全パート共通) |
|
|
93
|
+
| `譜字'` / `譜字,` | 1オクターブ上 / 下 |
|
|
94
|
+
| `# …` | コメント |
|
|
95
|
+
|
|
96
|
+
1つのパートを複数の `[楽器]` 段に分けて書いてもよい(後ろへ続く)。`[笙] 乙 - 下 |` のように楽器名と同じ行に音を続けて書くこともできる。パートの長さが揃わないとステータスバーに警告が出る。
|
|
97
|
+
|
|
98
|
+
### 縦にそろえる(自動整形)
|
|
99
|
+
|
|
100
|
+
ファイルを開いたとき・保存したとき・再生/WAV書き出しのとき、または「縦にそろえる」ボタン(Ctrl+Shift+F)で、譜面テキストを次の形に整形する。
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
# ---- 1〜5小節
|
|
104
|
+
[笙] 十 - 凢 - | 乞 - 一 - | ...
|
|
105
|
+
[篳篥] 丄 四 六 工 | 五 - 工 六 | ...
|
|
106
|
+
[竜笛] 責丄 干 六 中 | 夕 - 中 六 | ...
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
- 1段に5小節。各段で全楽器の行が上下に並び、拍の頭が縦にそろう(等幅フォント表示で)。小節は `|` で区切る。
|
|
110
|
+
- 拍と拍の間は空白2つ、同じ拍の中の音(半拍など)は空白1つ。`乙:2` は `乙 -` のように書き直す。
|
|
111
|
+
- 整形しても音は変わらない(各音の開始拍・長さ・テンポ変化は同じ)。本文の途中に書いたコメントはヘッダの後ろへまとめて移る。
|
|
112
|
+
- 入力中は自動では動かないので、書き足した後に縦がずれたら Ctrl+Shift+F で直せる。
|
|
113
|
+
|
|
114
|
+
### 楽器ごとの譜字
|
|
115
|
+
|
|
116
|
+
| 楽器 | 譜字 |
|
|
117
|
+
|---|---|
|
|
118
|
+
| 笙 | 合竹: 乞 一 工 凢 乙 下 十 美 行 比、特殊合竹 乙美 乙言 凢美 凢言。`単千` のように「単」を付けると一本だけ。双調では「十」が5音の十になる。 |
|
|
119
|
+
| 篳篥 | 舌 五 工 凢 六 四 一 丄 丁(低い順, G4〜A5、Wikipedia「篳篥」の正律)。ムは現行曲では使わない。音頭に塩梅を付ける。平調では、舌を正律の G4 から F#4(下無)に、丄を G5 から F#5 に半音下げて吹く(メリ)。ほかの調子のメリは未設定で、`tunings.json` の `hichiriki` で譜字ごとに上書きできる。 |
|
|
120
|
+
| 竜笛 | 五 丄 夕 中 丅 六 干(〒)(和)。`責六` または `六'` で責。干は六の上(E6)で鳴る。低い干(E5)は `干,`。 |
|
|
121
|
+
| 琵琶 | 1弦 一 工 凢 フ 斗 / 2弦 乚 下 十 乙 コ / 3弦 ク 七 ヒ 〻 之 / 4弦 丄 八 丨 ム 也(開放, 第1〜4柱)。通常は掻撥、`単ク` で単音。掻撥は2・3本なら拍の前半を等分し、4本なら 0・1/2・5/8・3/4 拍で鳴らす(`instruments.py` の `BIWA_SWEEP_RHYTHM` で変更可)。 |
|
|
122
|
+
| 筝 | 一〜十 斗 為 巾(単音)、`閑三` = 閑掻、`早三` = 早掻。 |
|
|
123
|
+
| 鞨鼓 | 正(右の単打)、片来(左桴のみのロール)、諸来(両桴のロール)。ロールは `諸来:3` のように長さを指定。 |
|
|
124
|
+
| 鉦鼓 | 金・生(一打)、ク(左)、レイ(右)、クレイ(左右2打)。 |
|
|
125
|
+
| 太鼓 | 図(軽い前打)、百(強打)。 |
|
|
126
|
+
|
|
127
|
+
## 音高・調弦について
|
|
128
|
+
|
|
129
|
+
- 基準ピッチは A4 = 430 Hz(`gagaku/tunings.json` の `a4_hz`)。平均律で計算している。
|
|
130
|
+
- 笙の各竹の音高と合竹の構成、竜笛の譜字の音高は、Wikipedia「笙」「龍笛」の表による。
|
|
131
|
+
- **楽琵琶・楽箏の調子ごとの調弦は、調べた範囲では出典が見つからなかった。** そのため各調子の主音と音階から組んだ**暫定値**になっている。正確な調弦は `gagaku/tunings.json` を書き換えれば反映される(琵琶は各弦の[開放, 第1〜4柱]、筝は一〜巾の13弦)。
|
|
132
|
+
- 閑掻・早掻・掻撥・来の奏法は、手順を簡略化した近似。
|
|
133
|
+
- 音色は numpy による合成で、サンプル音源ではない。
|
|
134
|
+
- 笙: 合竹が替わっても共通の竹は鳴り続け、入れ替わる竹だけが手移りで少しずつずれて出入りする。合竹ごとに息で膨らむ。
|
|
135
|
+
- 篳篥・竜笛: 休みまでの音をひと続きのフレーズとして合成し、音と音の間を塩梅でつなぐ(篳篥は上行時にいったん下げてから押し上げる)。同じ音が続くときは指打ちで切る。
|
|
136
|
+
- 琵琶・筝: 倍音ごとに減衰の違う弦の音に、撥・爪の打撃音と胴の共鳴を加える。
|
|
137
|
+
- 鞨鼓・太鼓・鉦鼓: 膜・金属の非整数倍モードによる合成。
|
|
138
|
+
- 楽器ごとの試聴用WAVは `python tools/make_previews.py` で `previews/` に書き出せる。
|
|
139
|
+
|
|
140
|
+
## 構成
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
main.py 起動
|
|
144
|
+
gagaku/score.py 譜面パーサ
|
|
145
|
+
gagaku/instruments.py 譜字→音高/奏法、楽器ごとの音色
|
|
146
|
+
gagaku/tunings.json 琵琶・筝の調弦(編集可)
|
|
147
|
+
gagaku/synth.py 合成・残響
|
|
148
|
+
gagaku/render.py ミックス・WAV書き出し
|
|
149
|
+
gagaku/audio.py 再生
|
|
150
|
+
gagaku/gui.py Tkinter GUI
|
|
151
|
+
gagaku/scoreview.py 楽譜表示(1段5小節の総譜)
|
|
152
|
+
gagaku/formatter.py 譜面テキストの整形(拍頭を縦にそろえる)
|
|
153
|
+
gagaku/staffview.py 五線譜表示(字譜つき)
|
|
154
|
+
gagaku/assets/ アイコン
|
|
155
|
+
examples/ サンプル譜(pip 版ではパッケージ内に同梱)
|
|
156
|
+
tools/make_previews.py 楽器ごとの試聴用WAVを書き出す
|
|
157
|
+
tools/make_icon.py アイコンを作り直す
|
|
158
|
+
tests/ pytest のテスト
|
|
159
|
+
docs/ 紹介サイト(GitHub Pages)
|
|
160
|
+
.github/workflows/ CI(テスト・ビルド)と PyPI への公開
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## 開発
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
pip install -e . pytest
|
|
167
|
+
python -m pytest
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
- push や pull request のたびに、GitHub Actions が Windows / Ubuntu × Python 3.10〜3.13 でテストし、パッケージをビルドする(`.github/workflows/ci.yml`)。
|
|
171
|
+
- PyPI への公開は、`gagaku/__init__.py` の `__version__` を上げてから、同じ番号のタグ(例 `v0.1.1`)で GitHub のリリースを作ると自動で行われる(`.github/workflows/publish.yml`、Trusted Publishing)。
|
|
172
|
+
|
|
173
|
+
## ライセンス
|
|
174
|
+
|
|
175
|
+
[MIT License](LICENSE)
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# 雅楽譜プレイヤー
|
|
2
|
+
|
|
3
|
+
[](https://github.com/ZiTengXiang/gagaku-player/actions/workflows/ci.yml)
|
|
4
|
+
[](https://pypi.org/project/gagaku-player/)
|
|
5
|
+
|
|
6
|
+
雅楽の譜字をテキストで入力すると、笙・篳篥・竜笛・琵琶・筝・鞨鼓・鉦鼓・太鼓の合奏として再生する Python デスクトップアプリ。
|
|
7
|
+
|
|
8
|
+
紹介サイト: https://zitengxiang.github.io/gagaku-player/
|
|
9
|
+
|
|
10
|
+
## インストールと起動
|
|
11
|
+
|
|
12
|
+
pip で入れる場合:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
pip install gagaku-player
|
|
16
|
+
gagaku-player --demo # サンプル曲「若竹」を開く
|
|
17
|
+
gagaku-player 曲.gaku # 譜面を開く
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
ソースから動かす場合:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
git clone https://github.com/ZiTengXiang/gagaku-player.git
|
|
24
|
+
cd gagaku-player
|
|
25
|
+
pip install -r requirements.txt
|
|
26
|
+
python main.py examples/demo_hyojo.gaku
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
- 必要なもの: Python 3.10+、numpy(tkinter は Python に標準添付)。`python -m gagaku` でも起動できる。
|
|
30
|
+
- Windows では追加のインストールは不要(再生に標準の `winsound` を使う)。macOS/Linux では pip で入れると再生用の `sounddevice` も入る(ソースから動かす場合は `pip install sounddevice`)。
|
|
31
|
+
- Windows でアイコンから起動したい場合は、`pythonw.exe main.py` を実行するショートカットを作り、アイコンに `gagaku/assets/gagaku.ico` を指定する(`pythonw` ならコンソール画面が出ない)。アイコンは `python tools/make_icon.py` で作り直せる(Pillow と游明朝フォントが必要)。
|
|
32
|
+
- コンソールなしで起動して落ちた場合は、`error.log` に詳細を書き出してダイアログを出す。
|
|
33
|
+
|
|
34
|
+
## 画面
|
|
35
|
+
|
|
36
|
+
- 左「譜面テキスト」タブ: 譜面エディタ。再生中は鳴っている譜字が黄色くハイライトされる。エラーの行は赤くなる。
|
|
37
|
+
- 左「楽譜表示」タブ: 全楽器の拍の頭を縦にそろえ、1段5小節で全楽器を上下に並べた総譜(読み取り専用)。小節の区切りは譜面の `|`、延ばしは細い線で示す。再生中は鳴っている音がハイライトされ、音をクリックするとテキストの該当箇所が選択される(そのまま F6 でそこから再生)。
|
|
38
|
+
- 左「五線譜」タブ: 全楽器を1段5小節の総譜として五線譜で書き、各音の下に譜字を付ける(読み取り専用)。1拍 = 4分音符で、小節や拍をまたぐ音はタイでつなぐ。音部記号は楽器の音域から自動で選ぶ(ト音記号・ヘ音記号・オクターブ上下のト音記号)。調号は使わず ♯ を音ごとに付ける。笙は合竹を和音で、琵琶の掻撥と筝の閑掻・早掻は鳴る音をアルペジオ付きの和音で書く。打楽器は1線譜(鞨鼓・鉦鼓は×の符頭、来はトレモロ)。再生ハイライトとクリックでのジャンプは楽譜表示と同じ。
|
|
39
|
+
- 右上: 譜字パレット(楽器タブごと)。クリックするとカーソル位置に挿入。
|
|
40
|
+
- 右下: ミキサー(パートごとのミュート・音量)。
|
|
41
|
+
- ツールバー: 再生(F5) / カーソル位置から再生(F6) / 停止(Esc) / 速さ% / 残響 / WAV書き出し。
|
|
42
|
+
|
|
43
|
+
## 譜面の書式(.gaku, UTF-8テキスト)
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
title: 曲名
|
|
47
|
+
mode: 平調 # 壱越調 平調 双調 黄鐘調 盤渉調 太食調
|
|
48
|
+
tempo: 60 # 1拍あたりのBPM
|
|
49
|
+
|
|
50
|
+
[笙]
|
|
51
|
+
乙 - - - | 一 - 工 - |
|
|
52
|
+
[竜笛]
|
|
53
|
+
干 - 五 丄 | 責干:2 中 夕 |
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
| トークン | 意味 |
|
|
57
|
+
|---|---|
|
|
58
|
+
| `譜字` | 1拍 |
|
|
59
|
+
| `譜字:2` / `譜字:1/2` | 長さ指定(拍) |
|
|
60
|
+
| `-` `ー` | 直前の音を1拍延ばす |
|
|
61
|
+
| `.` `・` `〇` `休` (`.:2` も可) | 休み |
|
|
62
|
+
| `\|` | 小節線(見た目だけ) |
|
|
63
|
+
| `tempo=72` | その位置からテンポ変更(全パート共通) |
|
|
64
|
+
| `譜字'` / `譜字,` | 1オクターブ上 / 下 |
|
|
65
|
+
| `# …` | コメント |
|
|
66
|
+
|
|
67
|
+
1つのパートを複数の `[楽器]` 段に分けて書いてもよい(後ろへ続く)。`[笙] 乙 - 下 |` のように楽器名と同じ行に音を続けて書くこともできる。パートの長さが揃わないとステータスバーに警告が出る。
|
|
68
|
+
|
|
69
|
+
### 縦にそろえる(自動整形)
|
|
70
|
+
|
|
71
|
+
ファイルを開いたとき・保存したとき・再生/WAV書き出しのとき、または「縦にそろえる」ボタン(Ctrl+Shift+F)で、譜面テキストを次の形に整形する。
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
# ---- 1〜5小節
|
|
75
|
+
[笙] 十 - 凢 - | 乞 - 一 - | ...
|
|
76
|
+
[篳篥] 丄 四 六 工 | 五 - 工 六 | ...
|
|
77
|
+
[竜笛] 責丄 干 六 中 | 夕 - 中 六 | ...
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
- 1段に5小節。各段で全楽器の行が上下に並び、拍の頭が縦にそろう(等幅フォント表示で)。小節は `|` で区切る。
|
|
81
|
+
- 拍と拍の間は空白2つ、同じ拍の中の音(半拍など)は空白1つ。`乙:2` は `乙 -` のように書き直す。
|
|
82
|
+
- 整形しても音は変わらない(各音の開始拍・長さ・テンポ変化は同じ)。本文の途中に書いたコメントはヘッダの後ろへまとめて移る。
|
|
83
|
+
- 入力中は自動では動かないので、書き足した後に縦がずれたら Ctrl+Shift+F で直せる。
|
|
84
|
+
|
|
85
|
+
### 楽器ごとの譜字
|
|
86
|
+
|
|
87
|
+
| 楽器 | 譜字 |
|
|
88
|
+
|---|---|
|
|
89
|
+
| 笙 | 合竹: 乞 一 工 凢 乙 下 十 美 行 比、特殊合竹 乙美 乙言 凢美 凢言。`単千` のように「単」を付けると一本だけ。双調では「十」が5音の十になる。 |
|
|
90
|
+
| 篳篥 | 舌 五 工 凢 六 四 一 丄 丁(低い順, G4〜A5、Wikipedia「篳篥」の正律)。ムは現行曲では使わない。音頭に塩梅を付ける。平調では、舌を正律の G4 から F#4(下無)に、丄を G5 から F#5 に半音下げて吹く(メリ)。ほかの調子のメリは未設定で、`tunings.json` の `hichiriki` で譜字ごとに上書きできる。 |
|
|
91
|
+
| 竜笛 | 五 丄 夕 中 丅 六 干(〒)(和)。`責六` または `六'` で責。干は六の上(E6)で鳴る。低い干(E5)は `干,`。 |
|
|
92
|
+
| 琵琶 | 1弦 一 工 凢 フ 斗 / 2弦 乚 下 十 乙 コ / 3弦 ク 七 ヒ 〻 之 / 4弦 丄 八 丨 ム 也(開放, 第1〜4柱)。通常は掻撥、`単ク` で単音。掻撥は2・3本なら拍の前半を等分し、4本なら 0・1/2・5/8・3/4 拍で鳴らす(`instruments.py` の `BIWA_SWEEP_RHYTHM` で変更可)。 |
|
|
93
|
+
| 筝 | 一〜十 斗 為 巾(単音)、`閑三` = 閑掻、`早三` = 早掻。 |
|
|
94
|
+
| 鞨鼓 | 正(右の単打)、片来(左桴のみのロール)、諸来(両桴のロール)。ロールは `諸来:3` のように長さを指定。 |
|
|
95
|
+
| 鉦鼓 | 金・生(一打)、ク(左)、レイ(右)、クレイ(左右2打)。 |
|
|
96
|
+
| 太鼓 | 図(軽い前打)、百(強打)。 |
|
|
97
|
+
|
|
98
|
+
## 音高・調弦について
|
|
99
|
+
|
|
100
|
+
- 基準ピッチは A4 = 430 Hz(`gagaku/tunings.json` の `a4_hz`)。平均律で計算している。
|
|
101
|
+
- 笙の各竹の音高と合竹の構成、竜笛の譜字の音高は、Wikipedia「笙」「龍笛」の表による。
|
|
102
|
+
- **楽琵琶・楽箏の調子ごとの調弦は、調べた範囲では出典が見つからなかった。** そのため各調子の主音と音階から組んだ**暫定値**になっている。正確な調弦は `gagaku/tunings.json` を書き換えれば反映される(琵琶は各弦の[開放, 第1〜4柱]、筝は一〜巾の13弦)。
|
|
103
|
+
- 閑掻・早掻・掻撥・来の奏法は、手順を簡略化した近似。
|
|
104
|
+
- 音色は numpy による合成で、サンプル音源ではない。
|
|
105
|
+
- 笙: 合竹が替わっても共通の竹は鳴り続け、入れ替わる竹だけが手移りで少しずつずれて出入りする。合竹ごとに息で膨らむ。
|
|
106
|
+
- 篳篥・竜笛: 休みまでの音をひと続きのフレーズとして合成し、音と音の間を塩梅でつなぐ(篳篥は上行時にいったん下げてから押し上げる)。同じ音が続くときは指打ちで切る。
|
|
107
|
+
- 琵琶・筝: 倍音ごとに減衰の違う弦の音に、撥・爪の打撃音と胴の共鳴を加える。
|
|
108
|
+
- 鞨鼓・太鼓・鉦鼓: 膜・金属の非整数倍モードによる合成。
|
|
109
|
+
- 楽器ごとの試聴用WAVは `python tools/make_previews.py` で `previews/` に書き出せる。
|
|
110
|
+
|
|
111
|
+
## 構成
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
main.py 起動
|
|
115
|
+
gagaku/score.py 譜面パーサ
|
|
116
|
+
gagaku/instruments.py 譜字→音高/奏法、楽器ごとの音色
|
|
117
|
+
gagaku/tunings.json 琵琶・筝の調弦(編集可)
|
|
118
|
+
gagaku/synth.py 合成・残響
|
|
119
|
+
gagaku/render.py ミックス・WAV書き出し
|
|
120
|
+
gagaku/audio.py 再生
|
|
121
|
+
gagaku/gui.py Tkinter GUI
|
|
122
|
+
gagaku/scoreview.py 楽譜表示(1段5小節の総譜)
|
|
123
|
+
gagaku/formatter.py 譜面テキストの整形(拍頭を縦にそろえる)
|
|
124
|
+
gagaku/staffview.py 五線譜表示(字譜つき)
|
|
125
|
+
gagaku/assets/ アイコン
|
|
126
|
+
examples/ サンプル譜(pip 版ではパッケージ内に同梱)
|
|
127
|
+
tools/make_previews.py 楽器ごとの試聴用WAVを書き出す
|
|
128
|
+
tools/make_icon.py アイコンを作り直す
|
|
129
|
+
tests/ pytest のテスト
|
|
130
|
+
docs/ 紹介サイト(GitHub Pages)
|
|
131
|
+
.github/workflows/ CI(テスト・ビルド)と PyPI への公開
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## 開発
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
pip install -e . pytest
|
|
138
|
+
python -m pytest
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
- push や pull request のたびに、GitHub Actions が Windows / Ubuntu × Python 3.10〜3.13 でテストし、パッケージをビルドする(`.github/workflows/ci.yml`)。
|
|
142
|
+
- PyPI への公開は、`gagaku/__init__.py` の `__version__` を上げてから、同じ番号のタグ(例 `v0.1.1`)で GitHub のリリースを作ると自動で行われる(`.github/workflows/publish.yml`、Trusted Publishing)。
|
|
143
|
+
|
|
144
|
+
## ライセンス
|
|
145
|
+
|
|
146
|
+
[MIT License](LICENSE)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# 朝霞(あさがすみ) — 壱越調のオリジナル曲(このアプリのための作曲。古典曲ではない)
|
|
2
|
+
# ゆっくり始まり、次第に速まり、最後の小節で緩む。
|
|
3
|
+
title: 朝霞
|
|
4
|
+
mode: 壱越調
|
|
5
|
+
tempo: 46
|
|
6
|
+
|
|
7
|
+
# ---- 1〜5小節
|
|
8
|
+
[笙] 凢 - 乙 下 | 乞 - - 下 | 乙 - 凢 - | 乙 - - - | 下 - 乞 下 |
|
|
9
|
+
[篳篥] 六 - 四 一 | 丁 - - 一 | 四 - 六 - | 四 - - - | 一 - 丁 一 |
|
|
10
|
+
[竜笛] 六 - 干 責五 | 責夕 - 責中:1/2 責夕:1/2 責五 | 干 - 六 - | 干 - - 責五:1/2 干:1/2 | 責五 - 責夕 責五 |
|
|
11
|
+
[琵琶] 也 - - - | 八 - - - | 七 - ク - | 七 - - - | ヒ - - - |
|
|
12
|
+
[筝] 閑三 - 早四 - | 閑六 - 早六 - | 閑四 - 早三 - | 閑四 - 早四 - | 閑五 - 早六 - |
|
|
13
|
+
[鞨鼓] . . 正 . | 片来 - . 正 | . . 正 . | 諸来 - - 正 | . . 正 . |
|
|
14
|
+
[鉦鼓] . . . . | 金 . . . | . . . . | クレイ . . . | . . . . |
|
|
15
|
+
[太鼓] . . . . | . . . . | . . . . | . . 図 百 | . . . . |
|
|
16
|
+
|
|
17
|
+
# ---- 6〜10小節
|
|
18
|
+
[笙] 乙 - 凢 乙 | 凢 - 一 乞 | 一 - - - | 乞 - 一 凢 | 乙 - - - |
|
|
19
|
+
[篳篥] 四 - 六 四 | 六 - 工 五 | 工 - - - | 五 - 工 六 | 四 - - - |
|
|
20
|
+
[竜笛] 干 - 六 干 | 六 - 中 夕 | 中 - - 六:1/2 中:1/2 | 夕 - 中 六 | 干 - - - |
|
|
21
|
+
[琵琶] 七 - 也 - | 也 - 丨 - | 丨 - - - | 八 - 丨 - | 七 - - - |
|
|
22
|
+
[筝] 閑四 - 早三 - | 閑三 - 早七 - | 閑七 - 早七 - | 閑六 - 早七 - | 閑四 - 早四 - |
|
|
23
|
+
[鞨鼓] 片来 - . 正 | . . 正 . | 諸来 - - 正 | tempo=50 . . 正 . | 片来 - . 正 |
|
|
24
|
+
[鉦鼓] 金 . . . | . . . . | クレイ . . . | . . . . | 金 . . . |
|
|
25
|
+
[太鼓] . . . . | . . . . | . . 図 百 | . . . . | . . . . |
|
|
26
|
+
|
|
27
|
+
# ---- 11〜15小節
|
|
28
|
+
[笙] 下 乙 凢 - | 一 - 乞 - | 一 凢 乙 - | 下 - 乙 凢 | 乙 - 凢 乙 |
|
|
29
|
+
[篳篥] 一 四 六 - | 工 - 五 - | 工 六 四 - | 一 - 四 六 | 四 - 六 四 |
|
|
30
|
+
[竜笛] 責五 干 六 - | 中 - 夕 - | 中 六 干 - | 責五 - 干 六 | 干 - 六 干 |
|
|
31
|
+
[琵琶] ヒ - 也 - | 丨 - 八 - | 丨 - 七 - | ヒ - 七 - | 七 - 也 - |
|
|
32
|
+
[筝] 閑五 - 早三 - | 閑七 - 早六 - | 閑七 - 早四 - | 閑五 - 早四 - | 閑四 - 早三 - |
|
|
33
|
+
[鞨鼓] . . 正 . | 諸来 - - 正 | tempo=54 . . 正 . | 片来 - . 正 | . . 正 . |
|
|
34
|
+
[鉦鼓] . . . . | クレイ . . . | . . . . | 金 . . . | . . . . |
|
|
35
|
+
[太鼓] . . . . | . . 図 百 | . . . . | . . . . | . . . . |
|
|
36
|
+
|
|
37
|
+
# ---- 16小節
|
|
38
|
+
[笙] 凢 - - - |
|
|
39
|
+
[篳篥] 六 - - - |
|
|
40
|
+
[竜笛] 六 - - - |
|
|
41
|
+
[琵琶] 也 - - - |
|
|
42
|
+
[筝] 閑三 - - - |
|
|
43
|
+
[鞨鼓] tempo=42 諸来 - - 正 |
|
|
44
|
+
[鉦鼓] クレイ . . . |
|
|
45
|
+
[太鼓] . . 図 百 |
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# 平調によるデモ譜(実在の曲の譜ではなく、書式説明用の短いフレーズ)
|
|
2
|
+
title: 平調 デモ
|
|
3
|
+
mode: 平調
|
|
4
|
+
tempo: 50
|
|
5
|
+
|
|
6
|
+
# ---- 1〜5小節
|
|
7
|
+
[笙] 乙 - - - | 一 - - - | 工 - - - | 凢 - - - | 乙 - - - |
|
|
8
|
+
[篳篥] 四 - 一 - | 丁 - 一 - | 四 - 六 - | 四 - - - | 四 - 一 丁 |
|
|
9
|
+
[竜笛] 干 - 五 丄 | 夕 - 中 - | 夕 中 六 - | 中 - 夕 - | 責干 - 中 夕 |
|
|
10
|
+
[琵琶] ク - - - | 七 - - - | ク - - - | 丄 - - - | ク - - - |
|
|
11
|
+
[筝] 閑三 - - - | 閑五 - - - | 閑四 - - - | 早三 - - - | 閑三 - - - |
|
|
12
|
+
[鞨鼓] . . 正 . | 片来 - . 正 | . . 正 . | 諸来 - - 正 | . . 正 . |
|
|
13
|
+
[鉦鼓] . . . . | 金 . . . | . . . . | クレイ . . . | . . . . |
|
|
14
|
+
[太鼓] . . . . | . . . . | . . 図 百 | . . . . | . . . . |
|
|
15
|
+
|
|
16
|
+
# ---- 6〜8小節
|
|
17
|
+
[笙] 下 - - - | 十 - - - | 乙 - - - |
|
|
18
|
+
[篳篥] 一 - 四 - | 六 - 工 五 | 工 - - - |
|
|
19
|
+
[竜笛] 丄 - 五 - | 干 - - 五:1/2 丄:1/2 | 干 - - - |
|
|
20
|
+
[琵琶] 七 - - - | 丄 - - - | ク - - - |
|
|
21
|
+
[筝] 閑六 - - - | 閑五 - - - | 早三 - - - |
|
|
22
|
+
[鞨鼓] 片来 - . 正 | . . 正 . | 諸来 - - 正 |
|
|
23
|
+
[鉦鼓] 金 . . . | . . . . | クレイ . . . |
|
|
24
|
+
[太鼓] . . . . | . . 図 百 | . . . . |
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# 月影(つきかげ) — 黄鐘調のオリジナル曲(このアプリのための作曲。古典曲ではない)
|
|
2
|
+
# 前奏4小節は笙と竜笛だけでゆったりと。5小節目から全員が加わり、最後に緩む。
|
|
3
|
+
title: 月影
|
|
4
|
+
mode: 黄鐘調
|
|
5
|
+
tempo: 40
|
|
6
|
+
|
|
7
|
+
# ---- 1〜5小節
|
|
8
|
+
[笙] 乞 - - - | 凢 - 乙 - | 下 - - 乙 | 凢 - 一 乞 | 乞 - 一 凢 |
|
|
9
|
+
[篳篥] . . . . | . . . . | . . . . | . . . . | 五 - 工 六 |
|
|
10
|
+
[竜笛] 夕 - - 中 | 六 - 干 - | 責五 - - 干 | 六 - 中 夕 | 夕 - 中 六 |
|
|
11
|
+
[琵琶] . . . . | . . . . | . . . . | . . . . | ク - 七 - |
|
|
12
|
+
[筝] . . . . | . . . . | . . . . | . . . . | 閑三 - 早四 - |
|
|
13
|
+
[鞨鼓] . . . . | . . . . | . . . . | . . . . | tempo=48 . . 正 . |
|
|
14
|
+
[鉦鼓] . . . . | . . . . | . . . . | . . . . | . . . . |
|
|
15
|
+
[太鼓] . . . . | . . . . | . . . . | . . . . | . . . . |
|
|
16
|
+
|
|
17
|
+
# ---- 6〜10小節
|
|
18
|
+
[笙] 乙 - - 凢 | 下 - 乙 凢 | 一 - - - | 凢 - 乙 下 | 乞 - 下 乙 |
|
|
19
|
+
[篳篥] 四 - - 六 | 一 - 四 六 | 工 - - - | 六 - 四 一 | 丁 - 一 四 |
|
|
20
|
+
[竜笛] 干 - - 六 | 責五 - 干 六 | 中 - - 夕:1/2 中:1/2 | 六 - 干 責五 | 責夕 - 責五 干 |
|
|
21
|
+
[琵琶] 八 - - - | 丨 - 八 - | 七 - - - | 丄 - 八 - | 也 - 丨 - |
|
|
22
|
+
[筝] 閑六 - - - | 閑七 - 早六 - | 閑四 - - - | 閑五 - 早六 - | 閑三 - 早七 - |
|
|
23
|
+
[鞨鼓] 片来 - . 正 | . . 正 . | 諸来 - - 正 | . . 正 . | 片来 - . 正 |
|
|
24
|
+
[鉦鼓] 金 . . . | . . . . | クレイ . . . | . . . . | 金 . . . |
|
|
25
|
+
[太鼓] . . . . | . . . . | . . 図 百 | . . . . | . . . . |
|
|
26
|
+
|
|
27
|
+
# ---- 11〜12小節
|
|
28
|
+
[笙] 凢 - 一 - | 乞 - - - |
|
|
29
|
+
[篳篥] 六 - 工 - | 五 - - - |
|
|
30
|
+
[竜笛] 六 - 中 - | 夕 - - - |
|
|
31
|
+
[琵琶] 丄 - 七 - | 也 - - - |
|
|
32
|
+
[筝] 閑五 - 早四 - | 閑三 - - - |
|
|
33
|
+
[鞨鼓] . . 正 . | tempo=40 諸来 - - 正 |
|
|
34
|
+
[鉦鼓] . . . . | クレイ . . . |
|
|
35
|
+
[太鼓] . . . . | . . 図 百 |
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# 若竹(わかたけ) — 双調のオリジナル曲(このアプリのための作曲。古典曲ではない)
|
|
2
|
+
# 明るく動きのある旋律。段ごとに速まり、終止で落ち着く。
|
|
3
|
+
title: 若竹
|
|
4
|
+
mode: 双調
|
|
5
|
+
tempo: 70
|
|
6
|
+
|
|
7
|
+
# ---- 1〜5小節
|
|
8
|
+
[笙] 十 - 凢 - | 乞 - 一 - | 乙 - - 十 | 乞 - 十 - | 乙 - 凢 乙 |
|
|
9
|
+
[篳篥] 丄 四 六 工 | 五 - 工 六 | 四 六 四 丄 | 丁 - 丄 - | 四 - 六 四 |
|
|
10
|
+
[竜笛] 責丄 干 六 中 | 夕 - 中 六 | 干 六 干 責丄 | 責夕 - 責丄 - | 干 - 六 干 |
|
|
11
|
+
[琵琶] ク - 八 - | 七 - ヒ - | 丨 - - - | 七 - ク - | 丨 - 八 - |
|
|
12
|
+
[筝] 閑三 - 早六 - | 閑四 - 早五 - | 閑七 - 早七 - | 閑四 - 早三 - | 閑七 - 早六 - |
|
|
13
|
+
[鞨鼓] 正 . 正 . | 片来 - 正 . | 正 . 正 . | 諸来 - 正 正 | tempo=78 正 . 正 . |
|
|
14
|
+
[鉦鼓] 金 . . . | 金 . . . | 金 . . . | クレイ . 金 . | 金 . . . |
|
|
15
|
+
[太鼓] . . . . | . . . . | . . . . | . . 図 百 | . . . . |
|
|
16
|
+
|
|
17
|
+
# ---- 6〜10小節
|
|
18
|
+
[笙] 十 - - 乙 | 凢 - 乞 - | 凢 - - - | 十 - 乞 十 | 乙 - 凢 - |
|
|
19
|
+
[篳篥] 丄 - - 四 | 六 工 五 工 | 六 - - - | 丄 - 丁 丄 | 四 - 六 - |
|
|
20
|
+
[竜笛] 責丄 - - 干 | 六 中 夕 中 | 六 - - 中:1/2 六:1/2 | 責丄 - 責夕 責丄 | 干 - 六 - |
|
|
21
|
+
[琵琶] ク - - - | 八 - 七 - | 八 - - - | ク - 七 - | 丨 - 八 - |
|
|
22
|
+
[筝] 閑三 - 早三 - | 閑六 - 早四 - | 閑六 - - - | 閑三 - 早四 - | 閑七 - 早六 - |
|
|
23
|
+
[鞨鼓] 片来 - 正 . | 正 . 正 . | 諸来 - 正 正 | tempo=84 正 . 正 . | 片来 - 正 . |
|
|
24
|
+
[鉦鼓] 金 . . . | 金 . . . | クレイ . 金 . | 金 . . . | 金 . . . |
|
|
25
|
+
[太鼓] . . . . | . . . . | . . 図 百 | . . . . | . . . . |
|
|
26
|
+
|
|
27
|
+
# ---- 11〜15小節
|
|
28
|
+
[笙] 一 凢 乙 十 | 乞 - - - | 十 - 凢 - | 凢 - 一 乞 | 一 - - 凢 |
|
|
29
|
+
[篳篥] 工 六 四 丄 | 丁 - - - | 丄 四 六 四 | 六 - 工 五 | 工 五 工 六 |
|
|
30
|
+
[竜笛] 中 六 干 責丄 | 責夕 - - 責中:1/2 責夕:1/2 | 責丄 干 六 干 | 六 - 中 夕 | 中 夕 中 六 |
|
|
31
|
+
[琵琶] ヒ - 丨 - | 七 - - - | ク - 八 - | 八 - ヒ - | ヒ - - - |
|
|
32
|
+
[筝] 閑五 - 早七 - | 閑四 - - - | 閑三 - 早六 - | 閑六 - 早五 - | 閑五 - 早五 - |
|
|
33
|
+
[鞨鼓] 正 . 正 . | 諸来 - 正 正 | tempo=90 正 . 正 . | 片来 - 正 . | 正 . 正 . |
|
|
34
|
+
[鉦鼓] 金 . . . | クレイ . 金 . | 金 . . . | 金 . . . | 金 . . . |
|
|
35
|
+
[太鼓] . . . . | . . 図 百 | . . . . | . . . . | . . . . |
|
|
36
|
+
|
|
37
|
+
# ---- 16小節
|
|
38
|
+
[笙] 十 - - - |
|
|
39
|
+
[篳篥] 丄 - - - |
|
|
40
|
+
[竜笛] 責丄 - - - |
|
|
41
|
+
[琵琶] 也 - - - |
|
|
42
|
+
[筝] 閑三 - - - |
|
|
43
|
+
[鞨鼓] tempo=72 諸来 - 正 正 |
|
|
44
|
+
[鉦鼓] クレイ . 金 . |
|
|
45
|
+
[太鼓] . . 図 百 |
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""再生バックエンド。Windows では標準の winsound、それ以外は sounddevice があれば使う。"""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import sys
|
|
5
|
+
import tempfile
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
from .render import write_wav
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Player:
|
|
12
|
+
def __init__(self):
|
|
13
|
+
self._tmp = Path(tempfile.gettempdir()) / "gagaku_player_preview.wav"
|
|
14
|
+
self._sd = None
|
|
15
|
+
if sys.platform != "win32":
|
|
16
|
+
try:
|
|
17
|
+
import sounddevice as sd # type: ignore
|
|
18
|
+
self._sd = sd
|
|
19
|
+
except ImportError:
|
|
20
|
+
pass
|
|
21
|
+
|
|
22
|
+
@property
|
|
23
|
+
def available(self) -> bool:
|
|
24
|
+
return sys.platform == "win32" or self._sd is not None
|
|
25
|
+
|
|
26
|
+
def play(self, data):
|
|
27
|
+
self.stop()
|
|
28
|
+
if sys.platform == "win32":
|
|
29
|
+
import winsound
|
|
30
|
+
write_wav(self._tmp, data)
|
|
31
|
+
winsound.PlaySound(str(self._tmp), winsound.SND_FILENAME | winsound.SND_ASYNC)
|
|
32
|
+
elif self._sd is not None:
|
|
33
|
+
from .render import SR
|
|
34
|
+
self._sd.play(data, SR)
|
|
35
|
+
else:
|
|
36
|
+
raise RuntimeError("再生には sounddevice が必要です (pip install sounddevice)")
|
|
37
|
+
|
|
38
|
+
def stop(self):
|
|
39
|
+
if sys.platform == "win32":
|
|
40
|
+
import winsound
|
|
41
|
+
winsound.PlaySound(None, winsound.SND_PURGE)
|
|
42
|
+
elif self._sd is not None:
|
|
43
|
+
self._sd.stop()
|