@mcptoolshop/pianoai 1.0.0 → 1.2.0
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.
Potentially problematic release.
This version of @mcptoolshop/pianoai might be problematic. Click here for more details.
- package/README.es.md +75 -21
- package/README.fr.md +75 -21
- package/README.hi.md +75 -21
- package/README.it.md +91 -37
- package/README.ja.md +75 -21
- package/README.md +102 -21
- package/README.pt-BR.md +77 -23
- package/README.zh.md +75 -21
- package/dist/cli.js +175 -20
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.js +181 -7
- package/dist/mcp-server.js.map +1 -1
- package/dist/note-parser.d.ts +36 -0
- package/dist/note-parser.d.ts.map +1 -1
- package/dist/note-parser.js +107 -1
- package/dist/note-parser.js.map +1 -1
- package/dist/session.d.ts +5 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +33 -11
- package/dist/session.js.map +1 -1
- package/dist/smoke.js +89 -4
- package/dist/smoke.js.map +1 -1
- package/dist/teaching.d.ts +43 -1
- package/dist/teaching.d.ts.map +1 -1
- package/dist/teaching.js +185 -1
- package/dist/teaching.js.map +1 -1
- package/dist/types.d.ts +23 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vmpk.js +1 -1
- package/package.json +14 -14
package/README.es.md
CHANGED
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
Servidor MCP + CLI para enseñanza de piano con IA — reproduce a través de VMPK vía MIDI con retroalimentación por voz.
|
|
13
13
|
</p>
|
|
14
14
|
|
|
15
|
-
[](https://github.com/mcp-tool-shop-org/pianoai)
|
|
16
|
+
[](https://github.com/mcp-tool-shop-org/pianoai)
|
|
17
|
+
[](https://github.com/mcp-tool-shop-org/pianoai)
|
|
18
18
|
[-blue)](https://github.com/mcp-tool-shop-org/ai-music-sheets)
|
|
19
19
|
|
|
20
20
|
## ¿Qué es esto?
|
|
@@ -26,11 +26,14 @@ Un CLI en TypeScript y servidor MCP que carga canciones de piano desde [ai-music
|
|
|
26
26
|
- **4 modos de reproducción** — completa, compás por compás, manos separadas, bucle
|
|
27
27
|
- **Control de velocidad** — práctica lenta a 0.5x hasta reproducción rápida a 2x, acumulable con modificación de tempo
|
|
28
28
|
- **Seguimiento de progreso** — callbacks configurables en hitos porcentuales o por compás
|
|
29
|
-
- **
|
|
29
|
+
- **9 hooks de enseñanza** — console, silent, recording, callback, voice, aside, sing-along, compose, live feedback
|
|
30
|
+
- **Narración de canto** — nombres de notas, solfeo, contorno o sílabas hablados antes de cada compás
|
|
31
|
+
- **Canto sincronizado + piano** — concurrent (sensación de dúo) o before (voz primero) mediante `--with-piano`
|
|
30
32
|
- **Retroalimentación por voz** — salida `VoiceDirective` para integración con mcp-voice-soundboard
|
|
33
|
+
- **Retroalimentación en vivo** — estímulo en tiempo real, consejos de dinámica y avisos de dificultad durante la reproducción
|
|
31
34
|
- **Interjecciones aparte** — salida `AsideDirective` para la bandeja de mcp-aside
|
|
32
35
|
- **Análisis seguro** — las notas incorrectas se omiten con `ParseWarning`s recopilados
|
|
33
|
-
- **
|
|
36
|
+
- **8 herramientas MCP** — exponen el registro, notas de enseñanza, canto guiado y recomendaciones de canciones a LLMs
|
|
34
37
|
- **Analizador de notas** — notación científica de altura a MIDI y viceversa
|
|
35
38
|
- **Conector simulado** — cobertura completa de tests sin hardware MIDI
|
|
36
39
|
|
|
@@ -50,30 +53,42 @@ npm install -g @mcptoolshop/pianoai
|
|
|
50
53
|
|
|
51
54
|
```bash
|
|
52
55
|
# Listar todas las canciones
|
|
53
|
-
|
|
56
|
+
pianoai list
|
|
54
57
|
|
|
55
58
|
# Mostrar detalles de canción + notas de enseñanza
|
|
56
|
-
|
|
59
|
+
pianoai info moonlight-sonata-mvt1
|
|
57
60
|
|
|
58
61
|
# Reproducir una canción a través de VMPK
|
|
59
|
-
|
|
62
|
+
pianoai play let-it-be
|
|
60
63
|
|
|
61
64
|
# Reproducir con modificación de tempo
|
|
62
|
-
|
|
65
|
+
pianoai play basic-12-bar-blues --tempo 80
|
|
63
66
|
|
|
64
67
|
# Avanzar compás por compás
|
|
65
|
-
|
|
68
|
+
pianoai play autumn-leaves --mode measure
|
|
66
69
|
|
|
67
70
|
# Práctica a mitad de velocidad
|
|
68
|
-
|
|
71
|
+
pianoai play moonlight-sonata-mvt1 --speed 0.5
|
|
69
72
|
|
|
70
73
|
# Práctica lenta con manos separadas
|
|
71
|
-
|
|
74
|
+
pianoai play dream-on --speed 0.75 --mode hands
|
|
75
|
+
|
|
76
|
+
# Cantar junto — narrar nombres de notas durante la reproducción
|
|
77
|
+
pianoai sing let-it-be --mode note-names
|
|
78
|
+
|
|
79
|
+
# Cantar junto con solfeo, ambas manos
|
|
80
|
+
pianoai sing fur-elise --mode solfege --hand both
|
|
81
|
+
|
|
82
|
+
# Cantar + piano juntos (sensación de dúo)
|
|
83
|
+
pianoai sing let-it-be --with-piano
|
|
84
|
+
|
|
85
|
+
# Voz primero, luego piano
|
|
86
|
+
pianoai sing fur-elise --with-piano --sync before
|
|
72
87
|
```
|
|
73
88
|
|
|
74
89
|
## Servidor MCP
|
|
75
90
|
|
|
76
|
-
El servidor MCP expone
|
|
91
|
+
El servidor MCP expone 8 herramientas para integración con LLMs:
|
|
77
92
|
|
|
78
93
|
| Herramienta | Descripción |
|
|
79
94
|
|-------------|-------------|
|
|
@@ -81,6 +96,7 @@ El servidor MCP expone 7 herramientas para integración con LLMs:
|
|
|
81
96
|
| `song_info` | Obtener lenguaje musical completo, objetivos de enseñanza, sugerencias de práctica |
|
|
82
97
|
| `registry_stats` | Conteo de canciones por género y dificultad |
|
|
83
98
|
| `teaching_note` | Nota de enseñanza por compás, digitación, dinámicas |
|
|
99
|
+
| `sing_along` | Obtener texto cantable por compás (nombres de notas, solfeo, contorno, sílabas); soporta `withPiano` para acompañamiento sincronizado |
|
|
84
100
|
| `suggest_song` | Obtener una recomendación basada en criterios |
|
|
85
101
|
| `list_measures` | Vista general de compases con notas de enseñanza + advertencias de análisis |
|
|
86
102
|
| `practice_setup` | Sugerir velocidad, modo y configuración de voz para una canción |
|
|
@@ -95,8 +111,8 @@ pnpm mcp
|
|
|
95
111
|
```json
|
|
96
112
|
{
|
|
97
113
|
"mcpServers": {
|
|
98
|
-
"
|
|
99
|
-
"command": "
|
|
114
|
+
"pianoai": {
|
|
115
|
+
"command": "pianoai-mcp"
|
|
100
116
|
}
|
|
101
117
|
}
|
|
102
118
|
}
|
|
@@ -109,6 +125,7 @@ pnpm mcp
|
|
|
109
125
|
| `list [--genre <genre>]` | Listar canciones disponibles, opcionalmente filtradas por género |
|
|
110
126
|
| `info <song-id>` | Mostrar detalles de canción: lenguaje musical, notas de enseñanza, estructura |
|
|
111
127
|
| `play <song-id> [opts]` | Reproducir una canción a través de VMPK vía MIDI |
|
|
128
|
+
| `sing <song-id> [opts]` | Cantar junto — narrar notas durante la reproducción |
|
|
112
129
|
| `stats` | Estadísticas del registro (canciones, géneros, compases) |
|
|
113
130
|
| `ports` | Listar puertos de salida MIDI disponibles |
|
|
114
131
|
| `help` | Mostrar información de uso |
|
|
@@ -122,9 +139,18 @@ pnpm mcp
|
|
|
122
139
|
| `--speed <mult>` | Multiplicador de velocidad: 0.5 = mitad, 1.0 = normal, 2.0 = doble |
|
|
123
140
|
| `--mode <mode>` | Modo de reproducción: `full`, `measure`, `hands`, `loop` |
|
|
124
141
|
|
|
142
|
+
### Opciones de canto
|
|
143
|
+
|
|
144
|
+
| Bandera | Descripción |
|
|
145
|
+
|---------|-------------|
|
|
146
|
+
| `--mode <mode>` | Modo de canto: `note-names`, `solfege`, `contour`, `syllables` |
|
|
147
|
+
| `--hand <hand>` | Qué mano: `right`, `left`, `both` |
|
|
148
|
+
| `--with-piano` | Reproducir acompañamiento de piano mientras se canta |
|
|
149
|
+
| `--sync <mode>` | Sincronización voz+piano: `concurrent` (por defecto, dúo), `before` (voz primero) |
|
|
150
|
+
|
|
125
151
|
## Motor de enseñanza
|
|
126
152
|
|
|
127
|
-
El motor de enseñanza dispara hooks durante la reproducción.
|
|
153
|
+
El motor de enseñanza dispara hooks durante la reproducción. 9 implementaciones de hooks cubren todos los casos de uso:
|
|
128
154
|
|
|
129
155
|
| Hook | Caso de uso |
|
|
130
156
|
|------|-------------|
|
|
@@ -134,6 +160,8 @@ El motor de enseñanza dispara hooks durante la reproducción. 7 implementacione
|
|
|
134
160
|
| `createCallbackTeachingHook(cb)` | Personalizado — redirige a cualquier callback asíncrono |
|
|
135
161
|
| `createVoiceTeachingHook(sink)` | Voz — produce `VoiceDirective` para mcp-voice-soundboard |
|
|
136
162
|
| `createAsideTeachingHook(sink)` | Aparte — produce `AsideDirective` para la bandeja de mcp-aside |
|
|
163
|
+
| `createSingAlongHook(sink, song)` | Canto — narra notas/solfeo/contorno antes de cada compás |
|
|
164
|
+
| `createLiveFeedbackHook(voiceSink, asideSink, song)` | Retroalimentación — estímulo, consejos de dinámica, avisos de dificultad |
|
|
137
165
|
| `composeTeachingHooks(...hooks)` | Múltiple — despacha a múltiples hooks en serie |
|
|
138
166
|
|
|
139
167
|
### Retroalimentación por voz
|
|
@@ -159,6 +187,32 @@ await session.play();
|
|
|
159
187
|
// voiceHook.directives → todas las instrucciones de voz que se dispararon
|
|
160
188
|
```
|
|
161
189
|
|
|
190
|
+
### Narración de canto
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
import {
|
|
194
|
+
createSingAlongHook,
|
|
195
|
+
createVoiceTeachingHook,
|
|
196
|
+
composeTeachingHooks,
|
|
197
|
+
createSession,
|
|
198
|
+
} from "@mcptoolshop/pianoai";
|
|
199
|
+
import { getSong } from "@mcptoolshop/ai-music-sheets";
|
|
200
|
+
|
|
201
|
+
const song = getSong("let-it-be")!;
|
|
202
|
+
|
|
203
|
+
// Narrar solfeo antes de cada compás, luego notas de enseñanza
|
|
204
|
+
const singHook = createSingAlongHook(voiceSink, song, {
|
|
205
|
+
mode: "solfege",
|
|
206
|
+
hand: "right",
|
|
207
|
+
});
|
|
208
|
+
const teachHook = createVoiceTeachingHook(voiceSink);
|
|
209
|
+
const combined = composeTeachingHooks(singHook, teachHook);
|
|
210
|
+
|
|
211
|
+
const session = createSession(song, connector, { teachingHook: combined });
|
|
212
|
+
await session.play();
|
|
213
|
+
// singHook.directives → "Do... Mi... Sol" bloqueante antes de cada compás
|
|
214
|
+
```
|
|
215
|
+
|
|
162
216
|
### Composición de hooks
|
|
163
217
|
|
|
164
218
|
```typescript
|
|
@@ -212,13 +266,13 @@ await connector.disconnect();
|
|
|
212
266
|
## Arquitectura
|
|
213
267
|
|
|
214
268
|
```
|
|
215
|
-
ai-music-sheets (biblioteca)
|
|
269
|
+
ai-music-sheets (biblioteca) pianoai (tiempo de ejecución)
|
|
216
270
|
┌──────────────────────┐ ┌────────────────────────────────┐
|
|
217
271
|
│ SongEntry (híbrido) │────────→│ Note Parser (seguro + estricto)│
|
|
218
272
|
│ Registry (búsqueda) │ │ Session Engine (veloc.+progreso│
|
|
219
|
-
│ 10 canciones, 10 gén.│ │ Teaching Engine (
|
|
273
|
+
│ 10 canciones, 10 gén.│ │ Teaching Engine (9 hooks) │
|
|
220
274
|
└──────────────────────┘ │ VMPK Connector (JZZ) │
|
|
221
|
-
│ MCP Server (
|
|
275
|
+
│ MCP Server (8 herramientas) │
|
|
222
276
|
│ CLI (barra de progreso + voz) │
|
|
223
277
|
└─────────┬──────────────────────┘
|
|
224
278
|
│ MIDI
|
|
@@ -237,8 +291,8 @@ Enrutamiento de hooks de enseñanza:
|
|
|
237
291
|
## Testing
|
|
238
292
|
|
|
239
293
|
```bash
|
|
240
|
-
pnpm test #
|
|
241
|
-
pnpm smoke #
|
|
294
|
+
pnpm test # 181 tests con Vitest (parser + session + teaching + voice + aside + sing-along)
|
|
295
|
+
pnpm smoke # 29 smoke tests (integración, sin MIDI necesario)
|
|
242
296
|
pnpm typecheck # tsc --noEmit
|
|
243
297
|
```
|
|
244
298
|
|
package/README.fr.md
CHANGED
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
Serveur MCP + CLI pour l'enseignement du piano par IA — joue via VMPK par MIDI avec retour vocal.
|
|
13
13
|
</p>
|
|
14
14
|
|
|
15
|
-
[](https://github.com/mcp-tool-shop-org/pianoai)
|
|
16
|
+
[](https://github.com/mcp-tool-shop-org/pianoai)
|
|
17
|
+
[](https://github.com/mcp-tool-shop-org/pianoai)
|
|
18
18
|
[-blue)](https://github.com/mcp-tool-shop-org/ai-music-sheets)
|
|
19
19
|
|
|
20
20
|
## Qu'est-ce que c'est ?
|
|
@@ -26,11 +26,14 @@ Un CLI TypeScript et un serveur MCP qui charge des morceaux de piano depuis [ai-
|
|
|
26
26
|
- **4 modes de lecture** — complet, mesure par mesure, mains séparées, boucle
|
|
27
27
|
- **Contrôle de la vitesse** — 0.5x pour la pratique lente jusqu'à 2x en lecture rapide, cumulable avec le tempo personnalisé
|
|
28
28
|
- **Suivi de progression** — callbacks configurables par pourcentage ou par mesure
|
|
29
|
-
- **
|
|
29
|
+
- **9 hooks pédagogiques** — console, silencieux, enregistrement, callback, voix, aside, chant accompagné, composition, live feedback
|
|
30
|
+
- **Narration chantée** — noms de notes, solfège, contour ou syllabes prononcés avant chaque mesure
|
|
31
|
+
- **Chant synchronisé + piano** — concurrent (sensation de duo) ou before (voix d'abord) via `--with-piano`
|
|
30
32
|
- **Retour vocal** — sortie `VoiceDirective` pour l'intégration mcp-voice-soundboard
|
|
33
|
+
- **Retour pédagogique en direct** — encouragements en temps réel, conseils de dynamique et avertissements de difficulté pendant la lecture
|
|
31
34
|
- **Interjections aside** — sortie `AsideDirective` pour la boîte de réception mcp-aside
|
|
32
35
|
- **Analyse sécurisée** — les notes invalides sont ignorées avec collecte de `ParseWarning`
|
|
33
|
-
- **
|
|
36
|
+
- **8 outils MCP** — exposent le registre, les notes pédagogiques, le chant accompagné et les recommandations de morceaux aux LLMs
|
|
34
37
|
- **Analyseur de notes** — notation scientifique des hauteurs vers MIDI et inversement
|
|
35
38
|
- **Connecteur mock** — couverture de test complète sans matériel MIDI
|
|
36
39
|
|
|
@@ -50,30 +53,42 @@ npm install -g @mcptoolshop/pianoai
|
|
|
50
53
|
|
|
51
54
|
```bash
|
|
52
55
|
# Lister tous les morceaux
|
|
53
|
-
|
|
56
|
+
pianoai list
|
|
54
57
|
|
|
55
58
|
# Afficher les détails d'un morceau + notes pédagogiques
|
|
56
|
-
|
|
59
|
+
pianoai info moonlight-sonata-mvt1
|
|
57
60
|
|
|
58
61
|
# Jouer un morceau via VMPK
|
|
59
|
-
|
|
62
|
+
pianoai play let-it-be
|
|
60
63
|
|
|
61
64
|
# Jouer avec un tempo personnalisé
|
|
62
|
-
|
|
65
|
+
pianoai play basic-12-bar-blues --tempo 80
|
|
63
66
|
|
|
64
67
|
# Avancer mesure par mesure
|
|
65
|
-
|
|
68
|
+
pianoai play autumn-leaves --mode measure
|
|
66
69
|
|
|
67
70
|
# Pratique à mi-vitesse
|
|
68
|
-
|
|
71
|
+
pianoai play moonlight-sonata-mvt1 --speed 0.5
|
|
69
72
|
|
|
70
73
|
# Pratique lente mains séparées
|
|
71
|
-
|
|
74
|
+
pianoai play dream-on --speed 0.75 --mode hands
|
|
75
|
+
|
|
76
|
+
# Chanter ensemble — narrer les noms de notes pendant la lecture
|
|
77
|
+
pianoai sing let-it-be --mode note-names
|
|
78
|
+
|
|
79
|
+
# Chanter ensemble en solfège, deux mains
|
|
80
|
+
pianoai sing fur-elise --mode solfege --hand both
|
|
81
|
+
|
|
82
|
+
# Chanter + piano ensemble (duo)
|
|
83
|
+
pianoai sing let-it-be --with-piano
|
|
84
|
+
|
|
85
|
+
# Voix d'abord, puis piano
|
|
86
|
+
pianoai sing fur-elise --with-piano --sync before
|
|
72
87
|
```
|
|
73
88
|
|
|
74
89
|
## Serveur MCP
|
|
75
90
|
|
|
76
|
-
Le serveur MCP expose
|
|
91
|
+
Le serveur MCP expose 8 outils pour l'intégration LLM :
|
|
77
92
|
|
|
78
93
|
| Outil | Description |
|
|
79
94
|
|-------|-------------|
|
|
@@ -81,6 +96,7 @@ Le serveur MCP expose 7 outils pour l'intégration LLM :
|
|
|
81
96
|
| `song_info` | Obtenir le langage musical complet, les objectifs pédagogiques, les suggestions de pratique |
|
|
82
97
|
| `registry_stats` | Nombre de morceaux par genre et difficulté |
|
|
83
98
|
| `teaching_note` | Note pédagogique par mesure, doigtés, dynamiques |
|
|
99
|
+
| `sing_along` | Obtenir le texte chantable par mesure (noms de notes, solfège, contour, syllabes) ; supporte `withPiano` pour l'accompagnement synchronisé |
|
|
84
100
|
| `suggest_song` | Obtenir une recommandation selon des critères |
|
|
85
101
|
| `list_measures` | Aperçu des mesures avec notes pédagogiques + avertissements d'analyse |
|
|
86
102
|
| `practice_setup` | Suggérer la vitesse, le mode et les réglages vocaux pour un morceau |
|
|
@@ -95,8 +111,8 @@ pnpm mcp
|
|
|
95
111
|
```json
|
|
96
112
|
{
|
|
97
113
|
"mcpServers": {
|
|
98
|
-
"
|
|
99
|
-
"command": "
|
|
114
|
+
"pianoai": {
|
|
115
|
+
"command": "pianoai-mcp"
|
|
100
116
|
}
|
|
101
117
|
}
|
|
102
118
|
}
|
|
@@ -109,6 +125,7 @@ pnpm mcp
|
|
|
109
125
|
| `list [--genre <genre>]` | Lister les morceaux disponibles, avec filtre optionnel par genre |
|
|
110
126
|
| `info <song-id>` | Afficher les détails du morceau : langage musical, notes pédagogiques, structure |
|
|
111
127
|
| `play <song-id> [opts]` | Jouer un morceau via VMPK par MIDI |
|
|
128
|
+
| `sing <song-id> [opts]` | Chanter ensemble — narrer les notes pendant la lecture |
|
|
112
129
|
| `stats` | Statistiques du registre (morceaux, genres, mesures) |
|
|
113
130
|
| `ports` | Lister les ports de sortie MIDI disponibles |
|
|
114
131
|
| `help` | Afficher les informations d'utilisation |
|
|
@@ -122,9 +139,18 @@ pnpm mcp
|
|
|
122
139
|
| `--speed <mult>` | Multiplicateur de vitesse : 0.5 = moitié, 1.0 = normal, 2.0 = double |
|
|
123
140
|
| `--mode <mode>` | Mode de lecture : `full`, `measure`, `hands`, `loop` |
|
|
124
141
|
|
|
142
|
+
### Options de chant
|
|
143
|
+
|
|
144
|
+
| Option | Description |
|
|
145
|
+
|--------|-------------|
|
|
146
|
+
| `--mode <mode>` | Mode de chant : `note-names`, `solfege`, `contour`, `syllables` |
|
|
147
|
+
| `--hand <hand>` | Quelle main : `right`, `left`, `both` |
|
|
148
|
+
| `--with-piano` | Jouer l'accompagnement piano en chantant |
|
|
149
|
+
| `--sync <mode>` | Synchronisation voix+piano : `concurrent` (par défaut, duo), `before` (voix d'abord) |
|
|
150
|
+
|
|
125
151
|
## Moteur pédagogique
|
|
126
152
|
|
|
127
|
-
Le moteur pédagogique déclenche des hooks pendant la lecture.
|
|
153
|
+
Le moteur pédagogique déclenche des hooks pendant la lecture. 9 implémentations de hooks couvrent tous les cas d'usage :
|
|
128
154
|
|
|
129
155
|
| Hook | Cas d'usage |
|
|
130
156
|
|------|-------------|
|
|
@@ -134,6 +160,8 @@ Le moteur pédagogique déclenche des hooks pendant la lecture. 7 implémentatio
|
|
|
134
160
|
| `createCallbackTeachingHook(cb)` | Personnalisé — redirige vers n'importe quel callback asynchrone |
|
|
135
161
|
| `createVoiceTeachingHook(sink)` | Voix — produit des `VoiceDirective` pour mcp-voice-soundboard |
|
|
136
162
|
| `createAsideTeachingHook(sink)` | Aside — produit des `AsideDirective` pour la boîte de réception mcp-aside |
|
|
163
|
+
| `createSingAlongHook(sink, song)` | Chant — narre les notes/solfège/contour avant chaque mesure |
|
|
164
|
+
| `createLiveFeedbackHook(voiceSink, asideSink, song)` | Retour en direct — encouragements, conseils de dynamique, avertissements de difficulté |
|
|
137
165
|
| `composeTeachingHooks(...hooks)` | Multi — dispatch vers plusieurs hooks en série |
|
|
138
166
|
|
|
139
167
|
### Retour vocal
|
|
@@ -177,6 +205,32 @@ const composed = composeTeachingHooks(
|
|
|
177
205
|
);
|
|
178
206
|
```
|
|
179
207
|
|
|
208
|
+
### Narration chantée
|
|
209
|
+
|
|
210
|
+
```typescript
|
|
211
|
+
import {
|
|
212
|
+
createSingAlongHook,
|
|
213
|
+
createVoiceTeachingHook,
|
|
214
|
+
composeTeachingHooks,
|
|
215
|
+
createSession,
|
|
216
|
+
} from "@mcptoolshop/pianoai";
|
|
217
|
+
import { getSong } from "@mcptoolshop/ai-music-sheets";
|
|
218
|
+
|
|
219
|
+
const song = getSong("let-it-be")!;
|
|
220
|
+
|
|
221
|
+
// Narrer le solfège avant chaque mesure, puis les notes pédagogiques
|
|
222
|
+
const singHook = createSingAlongHook(voiceSink, song, {
|
|
223
|
+
mode: "solfege",
|
|
224
|
+
hand: "right",
|
|
225
|
+
});
|
|
226
|
+
const teachHook = createVoiceTeachingHook(voiceSink);
|
|
227
|
+
const combined = composeTeachingHooks(singHook, teachHook);
|
|
228
|
+
|
|
229
|
+
const session = createSession(song, connector, { teachingHook: combined });
|
|
230
|
+
await session.play();
|
|
231
|
+
// singHook.directives → "Do... Mi... Sol" bloquant avant chaque mesure
|
|
232
|
+
```
|
|
233
|
+
|
|
180
234
|
## API programmatique
|
|
181
235
|
|
|
182
236
|
```typescript
|
|
@@ -212,13 +266,13 @@ await connector.disconnect();
|
|
|
212
266
|
## Architecture
|
|
213
267
|
|
|
214
268
|
```
|
|
215
|
-
ai-music-sheets (bibliothèque)
|
|
269
|
+
ai-music-sheets (bibliothèque) pianoai (runtime)
|
|
216
270
|
┌──────────────────────┐ ┌────────────────────────────────┐
|
|
217
271
|
│ SongEntry (hybride) │────────→│ Note Parser (sûr + strict) │
|
|
218
272
|
│ Registry (recherche) │ │ Session Engine (vitesse+suivi) │
|
|
219
|
-
│ 10 morceaux, 10 genres│ │ Teaching Engine (
|
|
273
|
+
│ 10 morceaux, 10 genres│ │ Teaching Engine (9 hooks) │
|
|
220
274
|
└──────────────────────┘ │ VMPK Connector (JZZ) │
|
|
221
|
-
│ MCP Server (
|
|
275
|
+
│ MCP Server (8 outils) │
|
|
222
276
|
│ CLI (barre de progression+voix)│
|
|
223
277
|
└─────────┬──────────────────────┘
|
|
224
278
|
│ MIDI
|
|
@@ -237,8 +291,8 @@ Routage des hooks pédagogiques :
|
|
|
237
291
|
## Tests
|
|
238
292
|
|
|
239
293
|
```bash
|
|
240
|
-
pnpm test #
|
|
241
|
-
pnpm smoke #
|
|
294
|
+
pnpm test # 181 tests Vitest (parser + session + teaching + voice + aside + chant)
|
|
295
|
+
pnpm smoke # 29 tests d'intégration (pas de MIDI requis)
|
|
242
296
|
pnpm typecheck # tsc --noEmit
|
|
243
297
|
```
|
|
244
298
|
|
package/README.hi.md
CHANGED
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
AI-संचालित पियानो शिक्षण के लिए MCP सर्वर + CLI — MIDI के माध्यम से VMPK पर बजाता है और वॉइस फीडबैक देता है।
|
|
13
13
|
</p>
|
|
14
14
|
|
|
15
|
-
[](https://github.com/mcp-tool-shop-org/pianoai)
|
|
16
|
+
[](https://github.com/mcp-tool-shop-org/pianoai)
|
|
17
|
+
[](https://github.com/mcp-tool-shop-org/pianoai)
|
|
18
18
|
[-blue)](https://github.com/mcp-tool-shop-org/ai-music-sheets)
|
|
19
19
|
|
|
20
20
|
## यह क्या है?
|
|
@@ -26,11 +26,14 @@
|
|
|
26
26
|
- **4 प्लेबैक मोड** — full, measure-by-measure, hands separate, loop
|
|
27
27
|
- **स्पीड कंट्रोल** — 0.5x धीमे अभ्यास से 2x तेज़ प्लेबैक तक, टेम्पो ओवरराइड के साथ स्टैक होता है
|
|
28
28
|
- **प्रगति ट्रैकिंग** — प्रतिशत माइलस्टोन या प्रति-मेजर पर कॉन्फ़िगर करने योग्य कॉलबैक
|
|
29
|
-
- **
|
|
29
|
+
- **9 टीचिंग हुक** — console, silent, recording, callback, voice, aside, sing-along, compose, live feedback
|
|
30
|
+
- **सिंग-अलॉंग नैरेशन** — प्रत्येक मेजर से पहले नोट नाम, सोलफेज, कॉन्टूर, या सिलेबल बोले जाते हैं
|
|
31
|
+
- **सिंक्रोनाइज़्ड गायन + पियानो** — concurrent (डुएट फ़ील) या before (पहले वॉइस) `--with-piano` के माध्यम से
|
|
32
|
+
- **लाइव टीचिंग फीडबैक** — प्लेबैक के दौरान रीयल-टाइम प्रोत्साहन, डायनामिक्स टिप्स, और कठिनाई चेतावनियाँ
|
|
30
33
|
- **वॉइस फीडबैक** — mcp-voice-soundboard इंटीग्रेशन के लिए `VoiceDirective` आउटपुट
|
|
31
34
|
- **Aside इंटरजेक्शन** — mcp-aside इनबॉक्स के लिए `AsideDirective` आउटपुट
|
|
32
35
|
- **सुरक्षित पार्सिंग** — खराब नोट्स एकत्रित `ParseWarning` के साथ सुचारू रूप से स्किप होते हैं
|
|
33
|
-
- **
|
|
36
|
+
- **8 MCP टूल** — LLM के लिए रजिस्ट्री, टीचिंग नोट्स, सिंग-अलॉंग, और गाने की सिफारिशें उपलब्ध कराते हैं
|
|
34
37
|
- **नोट पार्सर** — साइंटिफिक पिच नोटेशन से MIDI और वापस
|
|
35
38
|
- **मॉक कनेक्टर** — MIDI हार्डवेयर के बिना पूर्ण टेस्ट कवरेज
|
|
36
39
|
|
|
@@ -50,30 +53,42 @@ npm install -g @mcptoolshop/pianoai
|
|
|
50
53
|
|
|
51
54
|
```bash
|
|
52
55
|
# सभी गाने सूचीबद्ध करें
|
|
53
|
-
|
|
56
|
+
pianoai list
|
|
54
57
|
|
|
55
58
|
# गाने का विवरण + टीचिंग नोट्स देखें
|
|
56
|
-
|
|
59
|
+
pianoai info moonlight-sonata-mvt1
|
|
57
60
|
|
|
58
61
|
# VMPK के माध्यम से गाना बजाएँ
|
|
59
|
-
|
|
62
|
+
pianoai play let-it-be
|
|
60
63
|
|
|
61
64
|
# टेम्पो ओवरराइड के साथ बजाएँ
|
|
62
|
-
|
|
65
|
+
pianoai play basic-12-bar-blues --tempo 80
|
|
63
66
|
|
|
64
67
|
# मेजर-दर-मेजर चरणबद्ध तरीके से चलें
|
|
65
|
-
|
|
68
|
+
pianoai play autumn-leaves --mode measure
|
|
66
69
|
|
|
67
70
|
# आधी गति से अभ्यास
|
|
68
|
-
|
|
71
|
+
pianoai play moonlight-sonata-mvt1 --speed 0.5
|
|
69
72
|
|
|
70
73
|
# धीमा हैंड्स-सेपरेट अभ्यास
|
|
71
|
-
|
|
74
|
+
pianoai play dream-on --speed 0.75 --mode hands
|
|
75
|
+
|
|
76
|
+
# सिंग अलॉंग — प्लेबैक के दौरान नोट नाम नैरेट करें
|
|
77
|
+
pianoai sing let-it-be --mode note-names
|
|
78
|
+
|
|
79
|
+
# सोलफेज के साथ सिंग अलॉंग, दोनों हाथ
|
|
80
|
+
pianoai sing fur-elise --mode solfege --hand both
|
|
81
|
+
|
|
82
|
+
# सिंग + पियानो एक साथ (डुएट फ़ील)
|
|
83
|
+
pianoai sing let-it-be --with-piano
|
|
84
|
+
|
|
85
|
+
# पहले वॉइस, फिर पियानो
|
|
86
|
+
pianoai sing fur-elise --with-piano --sync before
|
|
72
87
|
```
|
|
73
88
|
|
|
74
89
|
## MCP सर्वर
|
|
75
90
|
|
|
76
|
-
MCP सर्वर LLM इंटीग्रेशन के लिए
|
|
91
|
+
MCP सर्वर LLM इंटीग्रेशन के लिए 8 टूल उपलब्ध कराता है:
|
|
77
92
|
|
|
78
93
|
| टूल | विवरण |
|
|
79
94
|
|------|--------|
|
|
@@ -82,6 +97,7 @@ MCP सर्वर LLM इंटीग्रेशन के लिए 7 टू
|
|
|
82
97
|
| `registry_stats` | शैली और कठिनाई के अनुसार गानों की गिनती |
|
|
83
98
|
| `teaching_note` | प्रति-मेजर टीचिंग नोट, फिंगरिंग, डायनामिक्स |
|
|
84
99
|
| `suggest_song` | मानदंडों के आधार पर सिफारिश प्राप्त करें |
|
|
100
|
+
| `sing_along` | प्रति-मेजर गाने योग्य टेक्स्ट (नोट नाम, सोलफेज, कॉन्टूर, सिलेबल) प्राप्त करें; `withPiano` सपोर्ट |
|
|
85
101
|
| `list_measures` | टीचिंग नोट्स + पार्स चेतावनियों के साथ मेजर का अवलोकन |
|
|
86
102
|
| `practice_setup` | किसी गाने के लिए स्पीड, मोड, और वॉइस सेटिंग्स सुझाएँ |
|
|
87
103
|
|
|
@@ -95,8 +111,8 @@ pnpm mcp
|
|
|
95
111
|
```json
|
|
96
112
|
{
|
|
97
113
|
"mcpServers": {
|
|
98
|
-
"
|
|
99
|
-
"command": "
|
|
114
|
+
"pianoai": {
|
|
115
|
+
"command": "pianoai-mcp"
|
|
100
116
|
}
|
|
101
117
|
}
|
|
102
118
|
}
|
|
@@ -109,6 +125,7 @@ pnpm mcp
|
|
|
109
125
|
| `list [--genre <genre>]` | उपलब्ध गाने सूचीबद्ध करें, वैकल्पिक रूप से शैली द्वारा फ़िल्टर |
|
|
110
126
|
| `info <song-id>` | गाने का विवरण दिखाएँ: संगीत भाषा, टीचिंग नोट्स, संरचना |
|
|
111
127
|
| `play <song-id> [opts]` | MIDI के माध्यम से VMPK पर गाना बजाएँ |
|
|
128
|
+
| `sing <song-id> [opts]` | सिंग अलॉंग — प्लेबैक के दौरान नोट्स नैरेट करें |
|
|
112
129
|
| `stats` | रजिस्ट्री आँकड़े (गाने, शैलियाँ, मेजर) |
|
|
113
130
|
| `ports` | उपलब्ध MIDI आउटपुट पोर्ट सूचीबद्ध करें |
|
|
114
131
|
| `help` | उपयोग जानकारी दिखाएँ |
|
|
@@ -122,9 +139,18 @@ pnpm mcp
|
|
|
122
139
|
| `--speed <mult>` | स्पीड मल्टीप्लायर: 0.5 = आधा, 1.0 = सामान्य, 2.0 = दोगुना |
|
|
123
140
|
| `--mode <mode>` | प्लेबैक मोड: `full`, `measure`, `hands`, `loop` |
|
|
124
141
|
|
|
142
|
+
### सिंग विकल्प
|
|
143
|
+
|
|
144
|
+
| फ़्लैग | विवरण |
|
|
145
|
+
|--------|--------|
|
|
146
|
+
| `--mode <mode>` | सिंग-अलॉंग मोड: `note-names`, `solfege`, `contour`, `syllables` |
|
|
147
|
+
| `--hand <hand>` | कौन सा हाथ: `right`, `left`, `both` |
|
|
148
|
+
| `--with-piano` | गायन के दौरान पियानो संगत बजाएँ |
|
|
149
|
+
| `--sync <mode>` | वॉइस+पियानो सिंक: `concurrent` (डिफ़ॉल्ट, डुएट), `before` (पहले वॉइस) |
|
|
150
|
+
|
|
125
151
|
## टीचिंग इंजन
|
|
126
152
|
|
|
127
|
-
टीचिंग इंजन प्लेबैक के दौरान हुक फायर करता है।
|
|
153
|
+
टीचिंग इंजन प्लेबैक के दौरान हुक फायर करता है। 9 हुक इम्प्लीमेंटेशन हर उपयोग मामले को कवर करते हैं:
|
|
128
154
|
|
|
129
155
|
| हुक | उपयोग मामला |
|
|
130
156
|
|------|-------------|
|
|
@@ -134,6 +160,8 @@ pnpm mcp
|
|
|
134
160
|
| `createCallbackTeachingHook(cb)` | कस्टम — किसी भी async कॉलबैक पर रूट करें |
|
|
135
161
|
| `createVoiceTeachingHook(sink)` | वॉइस — mcp-voice-soundboard के लिए `VoiceDirective` उत्पन्न करता है |
|
|
136
162
|
| `createAsideTeachingHook(sink)` | Aside — mcp-aside इनबॉक्स के लिए `AsideDirective` उत्पन्न करता है |
|
|
163
|
+
| `createSingAlongHook(sink, song)` | सिंग-अलॉंग — प्रत्येक मेजर से पहले नोट नाम/सोलफेज/कॉन्टूर नैरेट करता है |
|
|
164
|
+
| `createLiveFeedbackHook(voiceSink, asideSink, song)` | लाइव फीडबैक — प्रोत्साहन, डायनामिक्स टिप्स, कठिनाई चेतावनियाँ |
|
|
137
165
|
| `composeTeachingHooks(...hooks)` | मल्टी — क्रमिक रूप से कई हुक पर डिस्पैच करता है |
|
|
138
166
|
|
|
139
167
|
### वॉइस फीडबैक
|
|
@@ -177,6 +205,32 @@ const composed = composeTeachingHooks(
|
|
|
177
205
|
);
|
|
178
206
|
```
|
|
179
207
|
|
|
208
|
+
### सिंग-अलॉंग नैरेशन
|
|
209
|
+
|
|
210
|
+
```typescript
|
|
211
|
+
import {
|
|
212
|
+
createSingAlongHook,
|
|
213
|
+
createVoiceTeachingHook,
|
|
214
|
+
composeTeachingHooks,
|
|
215
|
+
createSession,
|
|
216
|
+
} from "@mcptoolshop/pianoai";
|
|
217
|
+
import { getSong } from "@mcptoolshop/ai-music-sheets";
|
|
218
|
+
|
|
219
|
+
const song = getSong("let-it-be")!;
|
|
220
|
+
|
|
221
|
+
// प्रत्येक मेजर से पहले सोलफेज नैरेट करें, फिर टीचिंग नोट्स बोलें
|
|
222
|
+
const singHook = createSingAlongHook(voiceSink, song, {
|
|
223
|
+
mode: "solfege",
|
|
224
|
+
hand: "right",
|
|
225
|
+
});
|
|
226
|
+
const teachHook = createVoiceTeachingHook(voiceSink);
|
|
227
|
+
const combined = composeTeachingHooks(singHook, teachHook);
|
|
228
|
+
|
|
229
|
+
const session = createSession(song, connector, { teachingHook: combined });
|
|
230
|
+
await session.play();
|
|
231
|
+
// singHook.directives → प्रत्येक मेजर से पहले ब्लॉकिंग "Do... Mi... Sol"
|
|
232
|
+
```
|
|
233
|
+
|
|
180
234
|
## प्रोग्रामेटिक API
|
|
181
235
|
|
|
182
236
|
```typescript
|
|
@@ -212,13 +266,13 @@ await connector.disconnect();
|
|
|
212
266
|
## आर्किटेक्चर
|
|
213
267
|
|
|
214
268
|
```
|
|
215
|
-
ai-music-sheets (लाइब्रेरी)
|
|
269
|
+
ai-music-sheets (लाइब्रेरी) pianoai (रनटाइम)
|
|
216
270
|
┌──────────────────────┐ ┌────────────────────────────────┐
|
|
217
271
|
│ SongEntry (हाइब्रिड) │────────→│ Note Parser (सुरक्षित + सख्त) │
|
|
218
272
|
│ Registry (खोज) │ │ Session Engine (स्पीड+प्रगति) │
|
|
219
|
-
│ 10 गाने, 10 शैलियाँ │ │ Teaching Engine (
|
|
273
|
+
│ 10 गाने, 10 शैलियाँ │ │ Teaching Engine (9 हुक) │
|
|
220
274
|
└──────────────────────┘ │ VMPK Connector (JZZ) │
|
|
221
|
-
│ MCP Server (
|
|
275
|
+
│ MCP Server (8 टूल) │
|
|
222
276
|
│ CLI (प्रोग्रेस बार + वॉइस) │
|
|
223
277
|
└─────────┬──────────────────────┘
|
|
224
278
|
│ MIDI
|
|
@@ -237,8 +291,8 @@ ai-music-sheets (लाइब्रेरी) pianai (रनटाइम)
|
|
|
237
291
|
## टेस्टिंग
|
|
238
292
|
|
|
239
293
|
```bash
|
|
240
|
-
pnpm test #
|
|
241
|
-
pnpm smoke #
|
|
294
|
+
pnpm test # 181 Vitest टेस्ट (पार्सर + सेशन + टीचिंग + वॉइस + aside + सिंग-अलॉंग)
|
|
295
|
+
pnpm smoke # 29 स्मोक टेस्ट (इंटीग्रेशन, MIDI आवश्यक नहीं)
|
|
242
296
|
pnpm typecheck # tsc --noEmit
|
|
243
297
|
```
|
|
244
298
|
|