Dentro del conjunto de aplicaciones dirigidas a la improvisación para acordeón. 🎼 Abrir el editor
El Editor Musical (MI y MIII) forma parte de un conjunto de aplicaciones dirigidas a la improvisación musical. Su finalidad es proporcionar un entorno de trabajo en el que el usuario pueda generar ideas musicales, experimentar con ellas, descubrir nuevas relaciones entre sus elementos y desarrollar materiales que puedan servir como punto de partida para la improvisación o la composición.
La aplicación no se plantea como un editor convencional cuya finalidad principal sea escribir una obra musical terminada. Su función es facilitar la interacción con materiales musicales y ofrecer distintas maneras de modificarlos, combinarlos y observar sus posibilidades. Una idea puede surgir de una secuencia introducida por el usuario, de un proceso generativo, de una transformación o de la combinación de varios materiales.
Para ello, reúne herramientas que permiten trabajar con:
La escucha y la observación son partes fundamentales de este proceso. El usuario puede generar un material, escucharlo, examinar su organización, modificarlo y volver a escucharlo para valorar el resultado. Así, la aplicación permite pasar de una idea inicial a distintas posibilidades musicales sin necesidad de que exista previamente una composición definida.
El objetivo es convertir la interacción con los materiales musicales en una forma de generar y desarrollar ideas. La escritura, la edición y la representación en partitura son medios para explorar esas ideas, no un fin en sí mismos.
La aplicación trabaja con dos manuales del acordeón:
El manual MII (bajos estándar o Stradella) no se usa en esta app: el editor se centra en MI + MIII, la combinación típica de un acordeón con bajos cromáticos.
Ambos manuales tienen la misma extensión y se escriben de forma independiente: no hay dependencia entre ellos. Lo único que cambia es con qué mano se tocan (derecha = MI, izquierda = MIII).
Cada manual tiene su propio pentagrama:
Además, en el proceso generativo, MI puede actuar como serie tonal y MIII como serie rítmica, y fusionarse.
| Necesidad | Cómo lo resuelve la app |
|---|---|
| Generar materiales seriales | Generador de series simétricas, de series dodecafónicas y matriz dodecafónica |
| Variantes de una idea | Retrogradación (R) e Inversión (I) |
| Filtrar posiciones del material Nuevo | Generador "Filtrar posiciones" (§29bis) |
| Airear el material en el tiempo Nuevo | Generador "Espaciar eventos" (§29ter) |
| Referencia rítmica | Claqueta con BPM, cuenta atrás y pulso de reproducción |
| Trabajo por manuales | Dos pentagramas con claves y volúmenes independientes |
| Ver y oír a la vez | Resaltado bicolor sincronizado con el audio |
| Ver la partitura en grande | Botón de pantalla completa, o automático al reproducir |
| Guardar y recuperar ideas | JSON, MusicXML y guardado de proceso generativo |
| Aislar y escuchar un fragmento | Seleccionar compases (clic + Shift+clic) y pulsar ▶ Reproducir. |
| Aplicar la misma transformación a los dos manuales | Cruzada MI + MIII con Ctrl+clic o botón "Aplicar a ambos manuales". |
| Copiar bloques de compases | Portapapeles interno con botones Copiar / Pegar. |
| Copiar y pegar motivos dentro de un compás | Portapapeles de fragmentos con modos insertar / sustituir. |
| Combinar serie tonal con serie rítmica | Fusión MI (tonal) + MIII (rítmica). |
| Encajar dos voces de distinta longitud | Realineación por MCM. |
| Recorrer la matriz dodecafónica | Matriz P/R/I/RI con envío a manual. |
| Revisar y revertir pasos del proceso generativo | Historial con comparación antes/después. |
| Introducir notas con el ratón | Dos representaciones visuales de MI: piano y botones. |
| Desplazar la entrada una octava Nuevo | Botones 8va ↓ / 8va ↑ y etiqueta de estado. Ver §15bis. |
| Ver la nota seleccionada en el texto Nuevo | Sincronización textarea ⇄ pentagrama (§12bis). |
| Seleccionar varias notas sueltas Nuevo | Multiselección no contigua con Ctrl+Shift+clic (§13bis). |
| Ocultar herramientas avanzadas Nuevo | Paneles colapsables (§11bis) y Modo Iniciación (§14bis). |
| Cambiar de modo con el teclado Nuevo | Atajo Alt+M (§14bis). |
La aplicación forma parte de un conjunto de aplicaciones dirigidas a la improvisación para acordeón.
Los flujos descritos en esta parte se realizan en el editor. Puedes abrirlo en otra pestaña: 🎼 Abrir el editor.
Un entorno web que funciona con un solo archivo HTML para editar, transformar, visualizar y reproducir fragmentos musicales escritos en notación textual, renderizados como partituras de dos pentagramas enlazados por una llave y barras de sistema:
Puede entenderse como un editor de ideas musicales: un entorno pensado principalmente para generar, explorar y desarrollar materiales mediante series, patrones simétricos, retrogradaciones, inversiones, procesos generativos y matrices dodecafónicas. La entrada y edición de notas permiten aportar o modificar materiales; la partitura y la reproducción ayudan a observarlos y escucharlos durante ese trabajo.
No se limita, por tanto, a preparar una partitura terminada: permite trabajar con materiales provisionales, probar variantes y decidir qué posibilidades merece la pena desarrollar.
Usa VexFlow 5 para el grabado musical, Web Audio API para el sonido y Web MIDI API para entrada desde teclados externos.
| Elemento | Acción |
|---|---|
| ↶ Deshacer | Retrocede un paso (Ctrl+Z). |
| ↷ Rehacer | Avanza un paso (Ctrl+Y). |
| ▶ Reproducir / ⏹ Parar | Alterna: reproduce la partitura o el rango seleccionado. Al reproducir, la partitura entra en pantalla completa automáticamente (ver §7.5). |
| 🔰 Iniciación / ⚙️ Avanzado Nuevo | Alterna el modo Iniciación (interfaz simplificada). Ver §14bis. Atajo: Alt+M. |
| 🔔 Pulso | Checkbox. Mientras suena la reproducción, marca el pulso con un click por tiempo. |
| ⛶ Pantalla completa | Alterna la pantalla completa del área de partitura. |
| 📤 Exportar JSON | Guarda el proyecto (ambos cuadros de texto). |
| 📥 Importar JSON | Carga un proyecto guardado. |
| 💾 MusicXML | Exporta .musicxml (compatible con MuseScore, Sibelius, Finale). |
| 📖 Manual | Abre este documento en otra pestaña. |
Todo el panel lateral está compuesto por bloques colapsables. Se pueden plegar y desplegar individualmente, y el estado se guarda entre sesiones (§11bis). El orden es:
Cada sistema muestra MI arriba y MIII abajo, enlazados por llave y barra final. Esta zona puede verse a pantalla completa.
<duracion> <nota1> <nota2> ... <notaN>
Regla básica: la primera palabra de cada línea es la duración; todo lo que sigue son las notas del mismo evento (un acorde si hay varias). Para tener varios eventos, usa una línea por evento.
Ejemplos:
4 C4 ← una negra (C4)
4 C4 D4 E4 F4 ← un acorde de cuatro notas, todas negras
4 C4 E4 G4 ← un acorde de tres notas
4 rest ← un silencio de negra
2. Bb3 ← una blanca con puntillo
4 C4
4 D4
4 E4
4 F4 ← cuatro negras consecutivas (una por línea)
| Código | Nombre | Beats (en 4/4) |
|---|---|---|
1 o redonda | Redonda | 4 |
2. o blanca. | Blanca con puntillo | 3 |
2 o blanca | Blanca | 2 |
4. o negra. | Negra con puntillo | 1.5 |
4 o negra | Negra | 1 |
8. o corchea. | Corchea con puntillo | 0.75 |
8 o corchea | Corchea | 0.5 |
16 o semicorchea | Semicorchea | 0.25 |
C4, D#5, Bb3, F#2…# sostenido, b bemol, n becuadro.4 rest
rest 4
silencio 4
s 4
El símbolo ~ al final de una línea liga su última nota con la primera nota de la línea siguiente, si tienen la misma altura.
4 C4 ~
4 C4
Se interpreta como una sola nota lógica con la duración sumada. Si cruza la barra de compás, se parte en trozos y se liga.
time 3/4
time 6/8
compas 2/4
m 5/4
t 7/8
c 2/2
Los cambios de compás pueden generar compases de silencio. Cuentan como contenido musical y participan en las transformaciones.
Además de la entrada por texto, la app ofrece varias formas de introducir notas con el ratón y con el instrumento:
MI es el manual derecho. Puede ser de teclas o de botones, según el instrumento. Para poder introducir notas con el ratón en cualquiera de las dos disposiciones, el editor ofrece dos representaciones visuales:
| Representación | Tipo de manual | Disposición | Rango |
|---|---|---|---|
| Piano | Manual de teclas | Teclas blancas y negras, disposición cromática horizontal tipo piano. | 3 octavas (E2–E5 por defecto; desplazable, ver §15bis). |
| Botones | Manual de botones | Botones redondos en 3 filas cromáticas dispuestas diagonalmente. | 3 filas (filas 3, 4 y 5 del manual). |
El piano se genera dinámicamente al cargar la página, con anchos proporcionales al espacio disponible. Los botones están fijos en el HTML, con su disposición de tres filas.
El piano y los botones son representaciones visuales, no un teclado físico. Para tocar con un instrumento real, se usa la entrada MIDI (§3.8). Para escribir con el teclado del ordenador, se usan las teclas A–G y Shift + A–G (§9.7).
Nota histórica: en versiones anteriores del editor existía un "teclado virtual" cromático (C4–B5). Ha sido sustituido por estas dos representaciones, más fieles a los dos tipos de manual derecho.
MI [cX–cY].| Grupo | Botón | Acción |
|---|---|---|
| Nota / rango | ♯ | Añade # a las notas seleccionadas. |
| ♭ | Añade b. | |
| ♮ | Fuerza becuadro. | |
| ⏸ | Convierte en silencio. | |
| Eliminar (Supr) | Borra la nota o el contenido de los compases. | |
| Deseleccionar | Limpia la selección principal, la cruzada y la multiselección. | |
| Cruzada MI ⇄ MIII | Quitar cruzada | Solo si hay cruzada activa. |
| Aplicar a ambos manuales | Solo si hay rango y no hay cruzada. | |
| Copiar/pegar compases | 📋 Copiar compases | Guarda el rango en el portapapeles de compases. |
| 📋 Pegar compases | Reemplaza el rango con el portapapeles de compases. | |
| Copiar/pegar fragmento | 🎼 Copiar fragmento | Guarda notas/silencios contiguos en el portapapeles de fragmentos. |
| 🎼 Insertar | Inserta el fragmento al inicio del compás destino y desplaza el resto. | |
| 🎼 Sustituir | Reemplaza los primeros N beats del compás destino. |
Los grupos sin ningún botón visible se ocultan automáticamente.
La cruzada permite aplicar la misma transformación a dos rangos de compases, uno en cada manual, a la vez.
Ctrl+C fuera de un textarea).📋 Portapapeles: N compás(es) de MI/MIII.Ctrl+V fuera de un textarea).Además del portapapeles de compases, la app incluye un portapapeles de fragmentos para copiar y pegar contenido musical dentro de un compás. Los dos portapapeles son independientes.
🎼 Fragmento copiado: N beat(s) de MI (M eventos)
Ctrl+Shift+C.Ctrl+Shift+V)Ctrl+V)| Portapapeles de compases | Portapapeles de fragmentos | |
|---|---|---|
| Qué copia | Compases completos | Notas/silencios contiguos |
| Cómo se selecciona | Clic / Shift+clic en compases | Shift+clic en notas o silencios |
| Atajo copiar | Ctrl+C (fuera de textarea) | Ctrl+Shift+C |
| Atajo pegar | Ctrl+V (fuera de textarea) | Ctrl+V (insertar) / Ctrl+Shift+V (sustituir) |
| Modos de pegado | Solo reemplazar | Insertar y sustituir |
<textarea>, <input> o <button>).#ea580c.#16a34a.requestAnimationFrame anclado a audioCtx.currentTime.viewBox.Esc también sale de pantalla completa (nativo del navegador).timeSig del primer compás de MI.Limitación: el pulso usa un únicotimeSig(el del primer compás de MI). Si la pieza tiene cambios de compás (4/4 → 3/4), el acento se descuadra a partir del cambio.
https://, el enlace abre la app alojada en esa dirección. Con file://, solo funciona en el equipo que tiene el archivo y en la misma ruta.Las transformaciones permiten explorar distintas posibilidades de un mismo material. No presuponen que una variante sea la definitiva: se pueden escuchar y comparar los resultados, combinarlos con otros materiales o seguir transformándolos.
Diálogo guiado por prompts: nota base, nº de intervalos, tamaño en semitonos, dirección (asc, desc, o 2,2), duración.
Invierte el orden temporal de las unidades de sonido.
| Alcance | Comportamiento |
|---|---|
| Global | Toda la secuencia de unidades se invierte. Los silencios de padding cuentan como unidades. |
| Por compás | Cada compás invierte sus unidades por separado. |
| Rango seleccionado | Solo las unidades del rango se invierten entre sí. |
nueva = eje − (original − eje).↑ / ↓, + / -, Shift+↑ / Shift+↓ (±1 octava).Prioridad de destinos al transponer con +/-: multiselección > fragmento > nota individual > rango de compases. El primer destino que esté activo es el que se transpone.
Global / Por compás.
Al cambiar la duración de una nota o silencio seleccionado (con 1/2/4/8/S), si el checkbox Preservar posición temporal del panel generativo está marcado:
Si el checkbox está desmarcado, el cambio de duración deja que el editor rellene el hueco al final del compás.
Cuando hay un fragmento seleccionado (Shift+clic en notas o silencios contiguos), las teclas + / - transpongan solo las notas de ese fragmento.
| Acción | Resultado |
|---|---|
| Clic en compás | Selecciona ese compás. Sincroniza con la textarea (§12bis). |
| Shift + clic en compás | Extiende la selección a un rango continuo de compases. |
| Ctrl + clic en compás del otro manual | Crea o reemplaza la cruzada. |
| Ctrl + Shift + clic en compás del otro manual | Extiende el rango cruzado. |
| Clic en nota | Selecciona el acorde entero. Sincroniza con la textarea. |
| Ctrl/Cmd + clic en nota | Alterna esa nota individual del acorde (toggle). |
| Ctrl/Cmd + Shift + clic en nota Nuevo | Multiselección no contigua: añade la nota a un conjunto (verde). Ver §13bis. |
| Shift + clic en nota o silencio | Selecciona un fragmento continuo dentro del mismo manual. |
| Clic en zona vacía | Deselecciona. |
↑ / ↓ | Transpone ±1 semitono; dentro de un acorde, mueve el foco entre las notas apiladas. |
Shift+↑ / Shift+↓ | Transpone ±1 octava. |
+ / - | Transpone ±1 semitono (multiselección > fragmento > nota > rango). |
Shift + + / Shift + - | Transpone ±1 octava. |
← / → | Navega secuencialmente por las notas del manual activo. |
Shift+← / Shift+→ | Extiende o reduce el fragmento seleccionado. |
Esc | Deselecciona (funciona incluso dentro de un textarea). |
Supr / Backspace | Si hay selección: borra. Si no: limpia ambos editores. |
| Tecla | Acción |
|---|---|
Ctrl+Z / Cmd+Z | Deshacer. |
Ctrl+Y / Cmd+Y | Rehacer. |
Ctrl+Shift+Z / Cmd+Shift+Z | Rehacer (alternativo). |
Deshacer y Rehacer funcionan siempre, incluso con el foco dentro de un textarea.
| Tecla | Acción |
|---|---|
Espacio | Inicia / detiene la claqueta y la grabación MIDI. |
Enter | Play / Stop de la reproducción. |
Tab | Alterna el manual activo (MI ↔ MIII). |
| Tecla | Acción |
|---|---|
Ctrl+C / Cmd+C | Copiar compases. Fuera de un textarea. |
Ctrl+V / Cmd+V | Pegar compases, o insertar fragmento si lo último copiado fue un fragmento. |
Ctrl+Shift+C / Cmd+Shift+C | Copiar fragmento. |
Ctrl+Shift+V / Cmd+Shift+V | Pegar fragmento sustituyendo los primeros N beats. |
| Tecla | Acción |
|---|---|
R | Retrogradar. |
I | Invertir. |
| Tecla | Acción |
|---|---|
1 / 2 / 4 / 8 | Con selección: cambia la duración de lo seleccionado. Sin selección: fija la duración base de entrada. |
S o 9 | Semicorchea (16). Ambas teclas hacen lo mismo. Mismo doble comportamiento: con selección cambia la duración, sin selección fija la base. El editor acepta las dos porque S es mnemotécnico (Semicorchea) y 9 es coherente con la fila numérica 1/2/4/8. En teclados sin Numpad, S está más cerca de la mano izquierda. |
. | Puntillo: con selección, activa el puntillo; sin selección, alterna el puntillo global de entrada. |
, | Igual que .. |
| Tecla | Acción |
|---|---|
a – g | Inserta la nota natural más cercana a la anterior. |
Shift + a – g | Inserta un silencio. |
| Clic en tecla del piano o botón del manual de botones | Inserta la nota pulsada en el manual activo. |
| 8va ↓ / 8va ↑ Nuevo | Desplaza la entrada del piano y los botones una octava arriba o abajo. Ver §15bis. |
| Tecla | Acción |
|---|---|
| Alt+↓ | Siguiente panel del sidebar (lo abre, cierra los demás). |
| Alt+↑ | Panel anterior (lo abre, cierra los demás). |
| Alt+Enter | Alterna el panel enfocado sin cerrar los demás. |
| Alt+Shift+Q | Alterna el estado global (toggle): si hay algún panel abierto, los cierra todos; si están todos cerrados, los abre todos. |
Ver §11bis para el detalle del sistema.
| Acción | Resultado |
|---|---|
| Seleccionar texto en la textarea | Resalta en violeta las notas correspondientes en el SVG. |
| Clic en nota del pentagrama | Selecciona su línea en la textarea (sin robar el foco al pentagrama). |
| Shift+clic (fragmento) | Selecciona el rango de líneas en la textarea. |
| Clic en compás / rango de compases | Selecciona las líneas que abarcan esos compases. |
| Multiselección (Ctrl+Shift+clic) | Selecciona el rango envolvente en la textarea. |
Ver §12bis para el detalle del sistema.
| Tecla | Acción |
|---|---|
| Alt+M | Alterna entre el Modo Iniciación y el Modo Avanzado. Ver §14bis. |
| Contexto del foco | Comportamiento |
|---|---|
<textarea> | Todas las teclas de escritura funcionan con normalidad. Solo Ctrl+Z, Ctrl+Y, Ctrl+Shift+Z, Esc y Alt+M se interceptan. |
<input> | Igual. |
<button> | Espacio y Enter activan el botón (comportamiento nativo). |
| Resto de la página | Todos los atajos están activos, incluidos los del acordeón de paneles y Alt+M. |
Los siguientes ejemplos muestran maneras de trabajar con la aplicación, no recetas obligatorias ni procedimientos destinados necesariamente a obtener una obra terminada. Cuando el flujo lo permita, conviene escuchar y observar cada resultado, valorar qué ha cambiado y decidir si se conserva, se modifica o se utiliza como punto de partida para otro paso.
I (o botón Invertir).▶ Reproducir con el rango aún seleccionado..musicxml en MuseScore / Sibelius / Finale.Ctrl+Shift+C).R o I o ↑ / ↓.Enter. La partitura entra en pantalla completa.Enter.2 F4 / 4 D4 / 4 D4 ~ / 4 D4 / 2 rest.↑.4/4.Ejemplo: 7 negras duran 7 tiempos. En 4/4, MCM(7, 4) = 28; la app repite la serie 4 veces y la escribe en 7 compases de 4/4.
Ver §29bis para el detalle completo.
Ver §29ter para el detalle completo.
Resultado: subconjunto de la serie con silencios intercalados.
En la app, pulsa 📚 Ejemplos para cargar el punto de partida o el resultado de cada ejercicio. Cada carga se puede deshacer. Usa el resultado como referencia y reconstruye el proceso con los pasos siguientes.
Una serie de siete negras dura siete tiempos; una barra de 4/4, cuatro. Buscamos el primer instante en que coinciden el comienzo de la serie y el primer tiempo del compás: MCM(7, 4) = 28. Por tanto, la serie se repite cuatro veces y ocupa siete compases. Los comienzos sucesivos caen en los pulsos 1, 4, 3, 2 y 1.
Las dos opciones parten de la sucesión de doce alturas del ejemplo adjunto «alternancia regular». La sucesión original es:
4 C4
4 C#4
4 A4
4 G#4
4 F#4
4 B4
4 D4
4 E4
4 F4
4 G4
4 D#4
4 A#4
Opción A — Eco O/O. En Generador, aplica Espaciar eventos con Fuente Iniciador, Slots 2, Posición Después y Destino MI. Vuelve a aplicar Espaciar eventos con la misma fuente y Slots, pero Posición Antes y Destino MIII. MI toca en los pulsos impares y MIII responde en los pares con la misma sucesión.
Opción B — O/R. Aplica primero Retrogradar (R) desde Fuente Iniciador a Destino MIII. Después aplica Espaciar eventos a Texto actual de MIII, con Slots 2 y Posición Después. Por último, aplica Espaciar eventos desde Iniciador a MI, con Slots 2 y Posición Antes. MIII presenta R en los pulsos impares y MI responde con O en los pares.
La tarjeta permite cargar el resultado de cada opción. En ambos casos, cada manual ocupa 24 pulsos (seis compases de 4/4). La app no tiene un botón único de alternancia: las dos versiones se construyen combinando los generadores disponibles.
Ahora se busca que dos voces que empiezan juntas terminen juntas. Tomamos la fusa como unidad común: MI contiene 12 fusas; MIII contiene 7 semicorcheas, equivalentes a 14 fusas. Por tanto, MCM(12, 14) = 84 fusas. MI repite su serie 7 veces y MIII, 6. Ambas duran 10,5 tiempos de negra.
32 y MIII, 7 eventos con duración 16.La app representa esa duración como un compás de 84/32: 84 fusas equivalen a 10,5 negras. Es una métrica larga y poco habitual. En este ejercicio, el MCM alinea los finales de las voces; no hace que el final caiga en una barra convencional de 4/4.
MI aporta una melodía de ocho alturas; MIII aporta un patrón rítmico de cuatro eventos. La fusión conserva las alturas de MI y toma de MIII las duraciones y la alternancia entre notas y silencios. Como el modo es cíclico, el patrón rítmico se repite dos veces.
El primer ciclo con NO produce 8 C4, 8 rest, 2 E4, 4 rest; el segundo vuelve a empezar con G4. Con SÍ, el resultado es 8 C4, 2 D4, 8 E4, 2 F4, 8 G4, 2 A4, 8 B4, 2 C5. Las alturas C3 y G3 escritas en MIII solo marcan que esos eventos son notas: la fusión usa sus duraciones, y la altura de salida procede de MI. El generador mantiene MIII intacto y escribe el resultado en el manual de Destino. Los botones de referencia cargan estados de partitura; para reconstruir cada resultado hay que escoger el valor correspondiente de Omitir silencios y aplicar el generador.
La inversión cambia el signo de cada intervalo: lo que sube, baja. Para un motivo dado, el contorno invertido es siempre el mismo. Lo que el eje decide es dónde se coloca ese contorno: qué nota del original se queda fija y en qué registro aparece el resultado.
Partimos del motivo D4–F4–A4–C5 (cuatro negras, intervalos +3, +4, +3). Las tres inversiones comparten los intervalos −3, −4, −3 y, por tanto, descienden.
D4 B3 G3 E3. D4 queda fija al principio; es la nota más aguda del resultado.C5 A4 F4 D4. El eje es la media entre D4 (62) y C5 (72), que cae en G4 (67). Ninguna nota queda fija, pero los pares se reflejan alrededor de G4.A#5 G5 D#5 C5. C5 queda fija al final; es la nota más grave del resultado.Los tres resultados son la misma figura descendente en tres registros, no tres contornos distintos. El ejercicio sirve para ver cómo el eje determina la ubicación de la inversión y qué punto queda anclado, mientras la sucesión de intervalos invertidos se conserva.
El generador escribe A#5 y D#5 en lugar de sus equivalentes enarmónicos Bb5 y Eb5: como el motivo original no contiene bemoles, la app usa la enarmonía con sostenidos por defecto.
D4 F4 A4 C5; MIII está vacío.En los tres casos se conservan duración, número de notas y contorno interválico. Cambian el registro y qué nota del original permanece anclada.
Todos los bloques del panel lateral (sidebar) son colapsables: se pueden plegar y desplegar individualmente con un clic en su cabecera. Además, un único par de teclas permite recorrerlos como un acordeón, abriendo el que interese y cerrando los demás.
Los paneles que se pueden plegar son:
Por defecto, se muestran abiertos el bloque verde (Configuración) y el bloque 1 (Iniciador). Los demás están plegados.
Cada cabecera tiene una flechita ▸ a la derecha. Al abrir el panel, la flecha gira 90° y queda apuntando hacia abajo (▾).
El estado (abierto/cerrado) de cada panel se guarda en localStorage. Al recargar la página, cada panel recupera el estado que tenía la última vez.
Esto significa que:
En lugar de 11 atajos individuales, se ha implementado un único par de teclas que recorre los paneles en el orden en que aparecen en el sidebar:
| Tecla | Acción |
|---|---|
| Alt+↓ | Pasa al siguiente panel y lo abre (cierra los demás). |
| Alt+↑ | Pasa al panel anterior y lo abre (cierra los demás). |
| Alt+Enter | Alterna el panel enfocado sin cerrar los demás. Útil para tener dos paneles abiertos a la vez. |
| Alt+Shift+Q | Alterna el estado global (toggle): si hay algún panel abierto, los cierra todos; si están todos cerrados, los abre todos. |
Si el usuario abre un panel con el ratón, el índice del acordeón se resincroniza: la próxima pulsación de Alt+↓ continúa desde el panel que él abrió, no desde donde se quedó el teclado.
Si un panel está oculto (por ejemplo, porque el modo Iniciación oculta las herramientas avanzadas), el atajo sigue funcionando internamente: cambia el estado abierto/cerrado aunque el panel no esté visible en ese momento. Al volver al modo avanzado, el panel aparece con el estado que le hayamos dejado.
| Tipo | Qué controla | Ejemplo |
|---|---|---|
| Colapsable | El usuario decide si el bloque está plegado o desplegado. El estado se guarda. | Configuración de claves, Claqueta MIDI, los bloques 1–5 del panel generativo… |
| Condicional | El bloque aparece o desaparece según la selección activa. No tiene estado persistente. | El Inspector de selección. |
El editor tiene una sincronización bidireccional entre lo que se ve en el pentagrama y lo que se ve en los cuadros de texto "Notas para MI" y "Notas para MIII". Sirve para orientarse rápidamente: no hace falta contar líneas a mano para saber qué nota corresponde a qué línea del texto.
Al seleccionar algo en el pentagrama, la parte del texto que corresponde a lo seleccionado se marca visualmente:
| Acción en el pentagrama | Qué se marca en el textarea |
|---|---|
| Clic simple en una nota o silencio | La línea del texto donde está esa nota/silencio. |
| Shift+clic (fragmento, naranja) | El rango de líneas entre la primera y la última nota del fragmento. |
| Clic en compás | Todas las líneas que abarcan ese compás. |
| Clic en un rango de compases (Shift+clic) | Todas las líneas que abarcan los compases seleccionados. |
| Multiselección (Ctrl+Shift+clic, verde) | El rango envolvente de las notas multiseleccionadas (de la primera a la última). |
| Clic en etiqueta MI / MIII | Todo el texto del manual correspondiente. |
Cuando el pentagrama tiene el foco (no la textarea), el navegador no suele dibujar la selección nativa del textarea. Para que se vea igualmente, el editor dibuja un overlay: un rectángulo azul translúcido, con un borde azul sólido a la izquierda, que se superpone sobre las líneas afectadas del textarea.
El overlay es puramente visual: no interfiere con el teclado ni con el ratón. Desaparece cuando la textarea recibe el foco (porque entonces ya se ve la selección nativa).
El overlay usa el line-height real del textarea para calcular en qué píxel empieza cada línea. Como el CSS del textarea declara un line-height explícito (1.4), el cálculo es exacto: no hay desfase aunque haya 30 líneas.
Al seleccionar texto con el ratón en la textarea, las notas correspondientes del pentagrama se resaltan en violeta (color #a855f7).
mouseup).keyup).scroll), por si la selección queda fuera de la vista.Los tres modos de selección del editor (clic simple azul, fragmento naranja, multiselección verde) conviven con la sincronización:
Al deseleccionar (Esc o clic en zona vacía), la sincronización también se limpia.
time intercaladas entre las notas.time x/y no generan nota en el pentagrama, así que seleccionarlas en el textarea no resalta nada en el SVG.Además de las selecciones ya existentes (nota individual azul, fragmento naranja, rango de compases azul), la app permite marcar varias notas sueltas a la vez, sin que formen una secuencia contigua. Se pintan en verde (color #16a34a).
Al hacer el primer Ctrl+Shift+clic, la nota que ya estaba seleccionada en azul se añade automáticamente a la multiselección. Así no hay que hacer un gesto especial para arrancar.
Multiselección en MI: 3 nota(s) [líneas 5, 9, 12].Una vez que hay una o varias notas multiseleccionadas, se pueden transponer todas a la vez con:
| Tecla | Acción |
|---|---|
| + / = | Sube todas las notas multiseleccionadas 1 semitono. |
| - / _ | Baja todas las notas 1 semitono. |
| Shift++ | Sube 1 octava. |
| Shift+- | Baja 1 octava. |
| Numpad + / - | Igual que los de la fila normal. |
En algunos teclados, escribir + requiere mantener Shift; en ese caso la app lo interpreta como una transposición de octava. Para subir un semitono, pulsa = sin Shift (o usa + del teclado numérico).
Cuando se pulsa + o -, el editor decide a qué aplicarlo según esta prioridad:
4 C4 D4 E4 F4.C4 → se vuelve azul.D4 → ambos se vuelven verdes.F4 → los tres se vuelven verdes; E4 queda sin marcar.4 C#4 D#4 E4 F#4.El editor incluye un Modo Iniciación: una interfaz simplificada para niños o para primeros contactos con la aplicación. Se activa y desactiva con el botón 🔰 Iniciación de la cabecera, o con el atajo Alt+M.
En lugar de la ayuda técnica, aparece un mensaje amable:
🎵 Escribe notas y pulsa ▶ Reproducir
Ejemplo (una nota por línea, cuatro negras):
4 C4·4 D4·4 E4·4 F4
Si escribes las cuatro notas en una sola línea, sonarán a la vez (un acorde), no una tras otra.
También puedes pulsar las teclas del piano o los botones de colores.
Se puede alternar entre Modo Iniciación y Modo Avanzado sin usar el ratón:
| Tecla | Acción |
|---|---|
| Alt+M | Alterna el modo activo. La M es mnemotécnica de "Modo". |
El atajo se ignora cuando el foco está en un <textarea> o <input>, para no interferir con la escritura.
Al cambiar de modo con el atajo, la acción se anota en el Registro de actividad con el modo al que se ha cambiado.
El modo elegido se guarda en localStorage. Al recargar la página, la app arranca en el último modo usado.
Se puede salir en cualquier momento pulsando ⚙️ Avanzado o Alt+M.
La entrada del piano y de los botones se puede desplazar una octava arriba o abajo con dos botones situados en la fila de opciones de "Entrada rápida".
| Botón | Acción | Rango resultante |
|---|---|---|
| 8va ↓ | Baja la entrada una octava. | E1–E4 |
| 8va ↑ | Sube la entrada una octava. | E3–E6 |
Entre ambos hay una etiqueta de estado que muestra el desplazamiento actual:
−1 → una octava por debajo del rango por defecto.0 → rango por defecto (E2–E5).+1 → una octava por encima del rango por defecto.Solo hay tres estados de desplazamiento:
| Estado | Rango del piano y de los botones | Cómo llegar |
|---|---|---|
| −1 | E1–E4 | Pulsar 8va ↓ una vez desde el estado 0. |
| 0 | E2–E5 (por defecto) | Estado inicial, o volver desde −1 o +1. |
| +1 | E3–E6 | Pulsar 8va ↑ una vez desde el estado 0. |
Si se intenta ir más allá de los límites, aparece en el Registro de actividad un mensaje:
Límite inferior (E1–E4).
Límite superior (E3–E6).
El desplazamiento afecta a toda la entrada visual:
El resto del editor (pentagrama, reproducción de la partitura, atajos de transposición, etc.) no se ve afectado: el desplazamiento es solo una ayuda para introducir notas fuera del rango por defecto.
0 y el piano cubre E2–E5.−1 y el piano cubre E1–E4.0 y luego pasa a +1. El piano cubre E3–E6.En el Registro de actividad aparecen mensajes del tipo:
🎹 Entrada −1 octava(s). Rango: E1 – E4.
🎹 Entrada +0 octava(s). Rango: E2 – E5.
🎹 Entrada +1 octava(s). Rango: E3 – E6.
El desplazamiento de octava es independiente del manual activo. Si el usuario está escribiendo en MI y luego pasa a MIII, la octava seleccionada se mantiene. No hay dos desplazamientos separados: uno solo, global a los dos manuales.
La entrada MIDI no se ve afectada por este desplazamiento. Cuando el usuario toca en un teclado MIDI externo, se registra la nota real que llega por el puerto MIDI, sin transponerla. El desplazamiento solo afecta a la entrada visual (piano y botones en pantalla).
0.Esta parte describe las reglas que sigue la app para escribir música.
La app no maneja armaduras. Todas las alteraciones se escriben explícitamente cuando son necesarias.
Las ligaduras entre compases sí están soportadas. Una nota ligada es una sola unidad de sonido.
La app no escribe 𝄪 ni 𝄫. Si una transposición produce una doble alteración, se escribe con la enarmonía simple más cercana.
El editor escribe siempre la alteración explícita (# o b) cuando el sonido efectivo de la nota no es natural.
No hay accidentales de cortesía.
Al transponer o modificar una nota, las demás notas del compás conservan su sonido previo.
La app puede generar silencios automáticos al completar compases incompletos. Esos silencios cuentan como contenido musical real.
Una nota ligada es una sola unidad de sonido: un solo ataque, duración total.
Cuando un evento no cabe entero en el compás actual, la app lo parte automáticamente.
Al cambiar la duración de notas o silencios (con el checkbox Preservar posición temporal activo), la app inserta silencios explícitos para que las notas siguientes no se desplacen.
MI puede ser un manual de teclas o de botones. La notación textual, el render y la reproducción son idénticos en ambos casos: la diferencia está solo en cómo se toca el instrumento, no en cómo se escribe.
La correspondencia entre el textarea y el pentagrama se hace por número de línea: la línea n del texto corresponde al lineIndex n del evento en el parseador. Esto permite que la sincronización sea exacta y barata, sin heurísticas.
El desplazamiento de octava del piano y de los botones es una ayuda de entrada visual, no un cambio en el modelo musical. No altera la partitura, ni el audio de reproducción, ni la entrada MIDI. Solo cambia la octava que se escribe al pulsar una tecla o botón en pantalla.
Los generadores de transformación (Retrogradar, Invertir, Transponer, Filtrar posiciones, Espaciar eventos, Fusionar MI+MIII) no modifican el material de entrada. Solo escriben el resultado en el manual de Destino. La fuente (Iniciador, texto de MI, texto de MIII o generador anterior) permanece intacta.
letra + alteración opcional + octava
Dentro de un compás, una alteración explícita afecta a las notas siguientes de la misma letra y octava.
La alteración vigente se reinicia al empezar cada compás.
# o b, siempre se escribe el signo.n solo si la vigente era # o b.Los signos redundantes se eliminan al Generar Partituras.
Se transpone desde el sonido efectivo previo. Las demás notas conservan su sonido (D6).
Las notas modificadas cambian; las demás conservan su sonido previo.
Reescribe cada compás con la norma tipográfica usando los sonidos efectivos actuales. No cambia sonidos.
El pentagrama dibuja el sonido efectivo de cada nota, pero el signo gráfico solo se escribe cuando cambia respecto a la vigente.
El audio reproduce el sonido efectivo de cada nota.
Una nota ligada es una sola unidad de sonido. Las transformaciones tratan cada unidad como un bloque indivisible.
Un bloque ligado que ocupe varios items se consolida en su forma canónica si cabe entero en un compás.
El silencio de "padding" cuenta como un silencio más del fragmento. Los silencios consecutivos se fusionan en una sola unidad.
Invierte el orden temporal de las unidades de sonido.
Refleja cada unidad de sonido alrededor de un eje.
Cuando un evento no cabe entero en el compás, la app lo parte (ver D9).
Al aplicar un valor (1/2/4/8/16) a un manual desde el bloque Voz, la nueva duración se calcula indexando durMap con el valor tal como se escribe ("1", "2", "4"…), no con el código interno ("w", "h", "q"…).
El generador transform.filterPositions conserva el evento n-ésimo del material de entrada según el patrón elegido (Impar, Par, Cada N, Lista personalizada). Si Conservar silencios está desactivado, los silencios que caigan en posición válida también se descartan.
El generador transform.spaceEvents expande cada evento del material de entrada en N "slots" del mismo valor que el evento. Los slots que no ocupa el evento se rellenan con silencios de la misma duración. La posición del silencio (Antes / Después) determina si el silencio va antes o después del evento.
| Concepto | Notación estándar | Esta app |
|---|---|---|
| Armadura | Existe | No |
| Doble sostenido | 𝄪 | D (enarmonía) |
| Accidental de cortesía | Permitido | No permitido |
| Ligadura entre compases | Permitida | Soportada |
| Forma compacta | Preferida | Solo al normalizar |
| Partición automática de eventos | Manual | Automática |
| Multiselección no contigua Nuevo | Posible en editores profesionales | Soportada |
| Desplazamiento de octava de entrada Nuevo | N/A (se toca la nota directamente) | Soportado (3 estados) |
| Filtrado por posición Nuevo | Manual (borrar notas a mano) | Soportado |
| Espaciado automático de eventos Nuevo | Manual (insertar silencios a mano) | Soportado |
Estos temas no están implementados en la app.
No soportada.
No soportadas (𝄪, 𝄫).
Con Ctrl+clic se puede alternar la selección de notas individuales, pero el render y algunas transformaciones aún tratan el acorde entero como bloque.
No soportado.
La cuantización MIDI redondea a la figura más cercana; no soporta tresillos.
Los generadores usan una semilla fija (12345), salvo "Barajar fila" y "Fila nueva". La semilla no es visible ni editable.
El pulso de reproducción usa un único timeSig (el del primer compás de MI). No respeta cambios de compás dentro de la pieza.
La multiselección no contigua (verde) solo se puede transponer con +/-. No se puede cambiar la duración de las notas multiseleccionadas a la vez.
El textarea solo admite selecciones contiguas, así que la multiselección no contigua se marca como rango envolvente en el texto. No hay forma de marcar solo las líneas exactas sin que las intermedias queden también marcadas.
Los paneles colapsables están en un orden fijo. No se pueden arrastrar para reordenar.
Los botones 8va ↓ / 8va ↑ solo funcionan con el ratón. No hay atajo de teclado asociado.
El desplazamiento de octava vuelve a 0 al recargar la página. No se guarda en localStorage.
El generador "Filtrar posiciones" no admite rangos del tipo "2-5" en la lista personalizada. Solo acepta posiciones individuales separadas por comas.
Los silencios que genera "Espaciar eventos" siempre tienen la misma duración que el evento original. No se puede elegir otra duración para el silencio.
Se añadirán a medida que surjan.
{
"mi": "texto de MI",
"miii": "texto de MIII"
}
partitura_proyecto.json.{
"version": "2.0",
"process": {
"iniciador": { "generator": "source.row12", "params": {...}, "manual": "MI", "events": [...] },
"generador": { "generator": "transform.filterPositions", "source": "iniciador", "params": {...}, "manual": "MIII", "events": [...] },
"voces": {
"MI": { "value": 4, "loop": true },
"MIII": { "value": 4, "loop": true }
}
},
"texts": { "MI": "...", "MIII": "..." }
}
score-partwise versión 3.1.P1 (MI) y P2 (MIII).divisions = 16 por negra.<chord/>.<alter> + <accidental>.<rest/>.<time>.<tie> + <tied>.__padding) también se exportan para que cada compás sume la duración exacta de su compás.localStorage NuevoLa app guarda tres claves en localStorage:
| Clave | Qué guarda | Valores |
|---|---|---|
em_mode_iniciacion_kids | Modo Iniciación | "1" = modo Iniciación, "0" = modo avanzado |
em_collapse_<id> | Estado de cada panel colapsable | "1" = abierto, "0" = cerrado |
em_collapse_idx_<n> | Estado de paneles sin id propio | Igual que el anterior, con índice |
El editor no guarda automáticamente el contenido de las textareas: para eso hay que pulsar 📤 Exportar JSON. Tampoco se persiste el desplazamiento de octava.
| Módulo | Responsabilidad |
|---|---|
Parsing (parseNotes, splitIntoMeasures, partirEvento) | Texto → eventos → compases. |
Herencia (aplicarHerenciaACompas, calcularSonidosEfectivos) | Sonido efectivo con herencia. |
Unidades (agruparEnBloques, descomponerBeats) | Unidades de sonido y figuras estándar. |
Render (renderScores) | VexFlow + overlays HTML. |
Audio (playAudio, playTone, updateVisuals, stopAudio) | Síntesis + resaltado + pulso. |
Pantalla completa (toggleScoreFullscreen) | Alternar fullscreen del área de partitura. |
Selección (selectedRange, selectedRangeOther) | Selección principal y cruzada. |
Multiselección (window.multiNoteSelection) Nuevo | Conjunto no contiguo de líneas multiseleccionadas (verde). |
Sincronización (selectLinesInTextarea, positionOverlay) Nuevo | Enlace textarea ⇄ pentagrama + overlay visual. |
Paneles colapsables (details.collapsible-panel) Nuevo | Sistema nativo de plegado + persistencia en localStorage. |
| Atajo único acordeón Nuevo | Navegación por los paneles con Alt+↓/↑. |
| Modo Iniciación + Alt+M Nuevo | Alternar la visibilidad de las herramientas avanzadas. |
| Octava de entrada Nuevo | window.__inputOctaveOffset y window.__shiftNote: desplazamiento visual de piano y botones. |
Portapapeles de compases (clipboard) | Copia interna de compases. |
Portapapeles de fragmentos (fragmentClipboard) | Copia de notas/silencios contiguos. |
| Transformaciones clásicas | Manipulación estructural del texto. |
| Proceso generativo | Orquestación de generadores. |
| Historial generativo | Pila de pasos + comparación antes/después. |
| Matriz dodecafónica | Matriz P/R/I/RI + envío a manual. |
| Representaciones visuales de MI | initPianoAndAcordeon: piano y botones. |
| Persistencia | JSON, MusicXML, JSON de proceso y localStorage. |
| Deshacer/Rehacer | Snapshots con tope de 100 pasos. |
[
{
type: "note" | "rest",
duration: "4",
keys: [{ key: "c/4", accidental: "" }, ...],
rawLine: "4 C4 E4",
lineIndex: 3,
timeSig: "4/4",
__stableId: "note-mi-7",
__padding: false,
tieNext: false,
tiePrev: true,
tieOriginIndex: 2
},
...
]
{
iniciador: { generator, params, manual, events },
generador: { generator, source, params, manual, events },
voces: {
MI: { value, loop, preservePosition },
MIII: { value, loop, preservePosition }
}
}
history = [
{
label: "Iniciador «Serie dodecafónica» → MI",
before: { mi: "...", miii: "..." },
after: { mi: "...", miii: "..." }
},
...
]
M[i][j] = (p[j] + p[0] - p[i]) mod 12
donde p = [pc_0, pc_1, ..., pc_11] son las 12 pitch classes de la fila,
todas en el rango 0..11.
Fila 0 = P original (P0)
Columna 0 = I original (I0)
Diagonal = p[i] (pitch class de la fila en posición i)
La función initPianoAndAcordeon() construye ambas representaciones:
<div id="piano"> generado dinámicamente. El rango se desplaza con window.__shiftNote.#acordeon). Sus etiquetas también se recalculan con window.__shiftNote.addManualNote() que aplica midiNumberToNoteNameWithContext.La sincronización se apoya en tres piezas:
lineIndex: cada evento del parser guarda su número de línea del texto original. Los mapas svgNoteHeadElements[manual] usan lineIndex:tokenIdx como clave, así que la correspondencia texto → SVG es inmediata.selectLinesInTextarea(manual, startLine, endLine) usa setSelectionRange para marcar el rango de caracteres correspondiente. No hace focus() para no robar el teclado al pentagrama.<div class="sync-line-overlay"> posicionado sobre las líneas afectadas, calculado a partir del line-height, el padding y el scroll del textarea.El color del resaltado en el pentagrama (cuando se selecciona texto en la textarea) es violeta (.nota-desde-textarea).
Los paneles se implementan con el elemento nativo <details>:
<details class="collapsible-panel" id="panelX" open>
<summary>Título del panel</summary>
<div class="collapsible-content">...</div>
</details>
toggle guarda el estado en localStorage.▸/▾ es CSS puro (::after en summary).Un módulo escucha keydown en fase de captura y gestiona Alt+↓, Alt+↑, Alt+Enter y Alt+Shift+Q. Mantiene un índice current que apunta al panel enfocado. Al abrir un panel:
openOnly)..kb-focused).scrollIntoView.Un listener de click sobre summary resincroniza el índice cuando el usuario abre un panel con el ratón. Alt+Shift+Q actúa como toggle: si hay algún panel abierto los cierra todos; si están todos cerrados los abre todos.
El modo se gestiona con la clase mode-iniciacion en el <body>:
advanced-only se ocultan con display: none !important.initiation-only se muestran.Un listener global escucha Alt+M en fase de captura. Antes de actuar, comprueba que el foco no esté en <textarea> ni <input>, para no interferir con la escritura.
Se gestiona con una variable global window.__inputOctaveOffset (valores: −1, 0, +1) y una función window.__shiftNote(noteName) que devuelve el nombre de nota desplazado en octavas. Al pulsar 8va ↓ o 8va ↑:
window.__inputOctaveOffset.applyOffset(), que:
dataset.nota de los botones.initPianoAndAcordeon().#octaveOffsetLabel.La entrada MIDI no consulta __shiftNote: las notas del puerto MIDI se insertan tal cual.
El generador transform.filterPositions recorre el array de eventos de la fuente y construye un Set con las posiciones a conservar (1-based). Parámetros:
pattern: "odd" | "even" | "everyN" | "customList"
n: entero 2–12 (solo para everyN)
customList: array de enteros (solo para customList)
keepRests: "false" | "true"
Si keepRests = "false", los eventos de tipo rest se descartan aunque caigan en posición válida. El resultado se escribe en el manual Destino.
El generador transform.spaceEvents expande cada evento en N slots del mismo duration que el evento. Parámetros:
slots: entero 2–8 (forzado a mínimo 2 y máximo 8)
position: "after" | "before"
Para cada evento se emiten los silencios correspondientes (N-1) y el evento limpio:
durCodeOf(ev) extrae el código de duración (1, 2, 4, 8, 16) saltando prefijos de tuplet y aceptando tanto códigos numéricos como nombres de figura.sinTilde(raw) elimina el sufijo ~ de la nota original para romper ligaduras colgantes.tieOriginIndex de la nota limpia.handleMuseScoreKeyDown comprueba el elemento activo antes de interceptar teclas. Solo Ctrl+Z, Ctrl+Y, Ctrl+Shift+Z, Esc y Alt+M se interceptan de forma incondicional. Los atajos de paneles usan Alt combinado con otras teclas, que no interfiere con la escritura.
| Función | Propósito |
|---|---|
parseNoteToken | "C#4" → {letter, accidental, octave, semis}. |
midiNumberToNoteName / …WithContext | MIDI → nombre. |
parseNotes | Texto → eventos. |
splitIntoMeasures | Eventos → compases. Usa partirEvento. |
partirEvento | Parte un evento que no cabe entero en un compás. |
makePaddingRests | Silencios de relleno. |
aplicarHerenciaACompas | Aplica herencia de compás y ligadura. |
calcularSonidosEfectivos | Lista de sonidos efectivos del compás. |
sonidoEfectivoDelUltimoToken | Sonido efectivo del último token del compás. |
agruparEnBloques | Agrupa items ligados consecutivos. |
descomponerBeats | Descompone una duración en figuras estándar. |
revalidarLigaduras | Elimina ligaduras rotas tras una transformación. |
renderScores | Dibuja todo. |
renderSelectionOverlay | Pinta selección principal (azul) y cruzada (violeta). |
setNoteHighlight | Pinta / restaura una nota. |
playAudio / stopAudio / togglePlayback | Reproducción, parada y alternancia. Incluye el pulso si el checkbox está activo. |
toggleScoreFullscreen | Alterna pantalla completa del área de partitura. |
executeRetrograde / executeInvert | Transformaciones clásicas. |
transposeSelectedMeasures / transposeSelectedNote | Transposición. |
transposeMultiSelection Nuevo | Transpone las notas multiseleccionadas (verde). |
transposeFragment Nuevo | Transpone las notas del fragmento (naranja). |
handleMeasureClick / handleNoteClick | Selección. |
copySelectionToOtherManual | Botón "Aplicar a ambos manuales". |
copySelectedMeasures / pasteIntoSelectedMeasures | Portapapeles interno de compases. |
fragCopy | Copia el fragmento seleccionado. |
fragPasteInsert / fragPasteReplace | Pegar fragmento insertando / sustituyendo. |
fragSetSelection / fragClearSelection / fragHasSelection / fragCanCopy | Gestión de selección de fragmento. |
fragHighlight / fragNavigate / fragEnsureMeasuresExist | Resaltado, navegación y materialización de compases. |
fragGetTargetMeasureInfo / fragUpdateUI | Destino y refresco del inspector. |
updateInsGroupVisibility | Oculta grupos del Inspector sin botones visibles. |
changeDurationOnSelection | Cambia duración con preservación opcional de posición. |
toggleDotOnSelectedNote | Alterna puntillo. |
makeRng | PRNG determinista (mulberry32). |
shuffleArray | Baraja un array (Fisher-Yates) con un RNG. |
generateRandomRow | Genera una fila dodecafónica aleatoria. |
shuffleCurrentRow / newRandomRow | Botones 🎲 Barajar fila / Fila nueva. |
runIniciador | Ejecuta el generador fuente y escribe el resultado. |
runGenerador | Ejecuta un generador de transformación. |
applyVozValue | Aplica valor, puntillo y compás a un manual con preservación de posición. |
realignVoicesByMCM | Repite el material de cada manual hasta el MCM de beats. |
saveProcess / loadProcess / onProcessFileSelected | Guardar / cargar proceso generativo. |
GENERATORS | Catálogo: source.* y transform.*. |
registrarPaso / volverAPaso / renderHistory | Historial de pasos del proceso generativo. |
mostrarComparacion / nombresNotas / resumen | Comparación antes/después de los textareas. |
construirMatriz | Construye la matriz P/R/I/RI de una fila dodecafónica. |
serieDe / pcDeKey | Extrae las pitch classes de un manual. |
enviarForma | Escribe una forma (P/R/I/RI) en un manual. |
initPianoAndAcordeon | Construye el piano (manual de teclas) y conecta los botones (manual de botones). |
addManualNote | Función interna de initPianoAndAcordeon: inserta una nota en el manual activo con la duración activa. |
selectLinesInTextarea Nuevo | Selecciona un rango de líneas en la textarea. |
positionOverlay Nuevo | Coloca el overlay visual sobre las líneas seleccionadas. |
getExactLineHeight Nuevo | Obtiene el line-height real del textarea (con medición por div espejo si el CSS no lo declara). |
refreshFromTextarea Nuevo | Refresca el resaltado del SVG cuando cambia la selección de la textarea. |
applySvgHighlight Nuevo | Aplica la clase .nota-desde-textarea a las notas del SVG. |
multiselHighlight / multiselClear Nuevo | Gestión del resaltado verde de la multiselección no contigua. |
Listener de keydown (Alt+↓/↑/Enter/Shift+Q) Nuevo | Atajo único acordeón de los paneles. Alt+Shift+Q actúa como toggle. |
Listener de toggle en details Nuevo | Persistencia del estado de los paneles en localStorage. |
applyMode / toggleMode (módulo Iniciación) Nuevo | Activa o desactiva el modo Iniciación; también se puede invocar con Alt+M. |
window.__shiftNote Nuevo | Desplaza un nombre de nota en octavas según __inputOctaveOffset. |
applyOffset / refreshAccordionButtons / refreshPiano Nuevo | Reconstruyen el piano y los botones al cambiar de octava. |
undo / redo | Historial global. |
toggleMetronome | Claqueta + grabación MIDI. |
handleMIDIMessage | Entrada MIDI. |
handleMuseScoreKeyDown | Atajos de teclado (respeta foco). |
exportJSON / importJSON / exportMusicXML | Persistencia. |
__padding) son visibles y participan en las transformaciones, pero no son editables directamente desde el texto.timeSig.time del textarea no generan nota en el pentagrama, así que no se resaltan al seleccionarlas.2-5 en la lista personalizada: solo posiciones individuales.El proceso generativo reúne bloques que permiten crear materiales, transformarlos y ajustar su organización temporal. Según lo que se quiera explorar, el usuario puede aplicar uno o varios bloques, encadenar operaciones o detenerse en cualquier punto. El ajuste a un ciclo común mediante el MCM es una posibilidad de trabajo, no el objetivo obligatorio de todo proceso.
Esta secuencia describe una organización posible del trabajo con materiales: partir de una fuente, transformarla y ajustar su realización temporal. No es un proceso automático que tenga que completarse siempre de principio a fin. El usuario decide qué material utilizar, qué operación aplicar, dónde escribir el resultado y cuándo detenerse, volver atrás o iniciar otra exploración. La escucha, la observación y la comparación orientan esas decisiones.
| Bloque | Rol | Entrada | Salida |
|---|---|---|---|
| 1. Iniciador | Producir material desde cero. | Parámetros del generador fuente. | Un array de eventos que se escribe en un manual. |
| 2. Generador | Transformar material existente. | Material del Iniciador, del texto de un manual, o del generador anterior. | Un array de eventos transformado que se escribe en un manual. |
| 3. Voz | Definir la realización temporal. | Manuales MI y MIII (texto real). | Duración uniforme, repetición hasta ciclo MCM, preservación de posición, puntillo y compás forzados. |
| Bloque | Rol | Entrada | Salida |
|---|---|---|---|
| 4. Historial y comparación | Revisar y revertir los pasos aplicados en los bloques 1–3, 5. | Cada clic en Aplicar/Realinear/Enviar. | Pila de pasos con etiqueta, comparación antes/después y botón «↶ Volver». |
| 5. Matriz dodecafónica | Recorrer las formas P/R/I/RI de una fila dodecafónica. | Fila de 12 pitch classes extraída de un manual. | Tabla clicable que envía la forma elegida a un manual. |
┌─────────────────────┐
│ 1. INICIADOR │
│ source.row12 │
│ source.row │
│ source.serieA │
│ source.serieB │
│ source.serieC │
│ source.intervals │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ 2. GENERADOR │
│ transform.retro │
│ transform.invers │
│ transform.transp │
│ transform.filter │◄── nuevo
│ transform.space │◄── nuevo
│ transform.fuse │◄── lee MI y MIII directamente
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ 3. VOZ │
│ valor por manual │
│ puntillo │
│ compás │
│ bucle hasta MCM │
│ preservar posición │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ 4. HISTORIAL │
│ registro de pasos │
│ comparación │
│ «↶ Volver» │
└─────────────────────┘
┌─────────────────────┐
│ 5. MATRIZ │
│ P / R / I / RI │
│ envío a manual │
└─────────────────────┘
El Iniciador crea un material de partida a partir de los parámetros elegidos por el usuario. Ese material puede servir como punto inicial de una exploración o como fuente para una transformación posterior; no constituye por sí mismo una composición terminada.
Al pulsar Aplicar iniciador:
Ojo: aplicar un Iniciador crea un proceso nuevo. Si ya había un Generador aplicado, se pierde.
| Control | Valores | Efecto |
|---|---|---|
| Tipo | source.row12, source.row, source.serieA, source.serieB, source.serieC, source.intervals | Al cambiar, los parámetros se reconstruyen. |
| Parámetros | Dinámicos | Dependen del generador. |
| Manual | MI / MIII | Dónde se escribe el resultado. |
| Aplicar iniciador | Botón | Ejecuta y escribe. |
| Limpiar manual | Botón | Vacía el manual elegido (con undo). |
| Estado | Texto | Muestra el número de eventos escritos o el error. |
source.row12 — Serie dodecafónica (fila dada)row: 12 notas. Por defecto: C4 C#4 D4 D#4 E4 F4 F#4 G4 G#4 A4 A#4 B4.value: valor (1/2/4/8/16). Por defecto: 4.source.row — Fila dada (cualquier longitud)Igual que source.row12, pero admite cualquier número de notas.
source.serieA — Serie A (12 notas · fusas) NuevoSerie de 12 notas predefinida, pensada para escribir con fusas. Es un caso particular de source.row12 con los parámetros ya rellenos.
| Parámetro | Valor por defecto |
|---|---|
| Notas (12) | B4 Bb4 F#4 G4 A4 G#4 D4 C#5 C5 F4 E4 D#5 |
| Valor | 32 (Fusa) |
El usuario puede editar la lista de notas y el valor antes de pulsar Aplicar iniciador.
source.serieB — Serie B (7 notas · semicorcheas) NuevoSerie de 7 notas predefinida, pensada para escribir con semicorcheas. Es un caso particular de source.row con los parámetros ya rellenos.
| Parámetro | Valor por defecto |
|---|---|
| Notas (7) | D#4 F4 C#5 G#4 G4 B4 A4 |
| Valor | 16 (Semicorchea) |
El usuario puede editar la lista de notas y el valor antes de pulsar Aplicar iniciador.
source.serieC — Serie C (12 notas) NuevoSerie dodecafónica de 12 alturas distintas, predefinida. Como todas las series, el usuario puede editar las notas y el valor antes de aplicar.
| Parámetro | Valor por defecto |
|---|---|
| Notas (12) | F#5 C5 D5 F5 Eb5 C#5 E5 B4 Bb4 G4 A4 G#4 |
| Valor | 4 (Negra) |
Las tres series (serieA,serieB,serieC) son opcionales: aparecen como opciones adicionales en el desplegable Tipo del bloque Iniciador, junto a las ya existentes. Si el usuario no las usa, no le afectan.
source.intervals — Por intervalos| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
startNote | nota | C4 | Nota inicial. |
endNote | nota | C5 | Nota objetivo. |
intervals | array de enteros ≠ 0 | 1, 3 | Semitonos permitidos. Los valores negativos invierten el sentido del paso (bajar en modo Ascendente, subir en modo Descendente). El 0 se descarta automáticamente. |
mode | enum | mixed | asc, desc, mixed. |
maxNotes | entero | 12 | Número máximo de notas. |
value | enum | 4 | Valor. |
El intervalo se elige recorriendo la lista en ciclo: con la lista [1, 3, -1] el resultado es +1, +3, −1, +1, +3, −1…. La dirección del movimiento (subir o bajar) la decide el desplegable Modo. En mixed se sortea en cada paso con semilla fija 12345.
El Generador aplica una operación al material de la fuente seleccionada. La elección de la fuente, de los parámetros y del destino permite probar distintas relaciones y variantes. El resultado puede escucharse y observarse antes de decidir si se utiliza como nueva fuente, si se compara con el original o si se descarta.
| Control | Valores | Efecto |
|---|---|---|
| Tipo | transform.* | Al cambiar, los parámetros se reconstruyen. |
| Fuente | iniciador, texto-MI, texto-MIII, generador | De dónde tomar el material. |
| Parámetros | Dinámicos | Dependen del generador. |
| Destino | MI / MIII | Dónde se escribe el resultado. |
| Aplicar generador | Botón | Ejecuta y escribe. Registra el paso. |
| Estado | Texto | Muestra el resultado o el error. |
| Fuente | Qué lee | Cuándo usarla |
|---|---|---|
Iniciador | El array de eventos generado por el último Iniciador aplicado. | Caso normal: Iniciador → Generador. |
Texto actual de MI | El textarea de MI tal cual está ahora. | Para transformar material escrito a mano. |
Texto actual de MIII | El textarea de MIII tal cual está ahora. | Para transformar material escrito a mano en MIII. |
Generador anterior | El array de eventos del último Generador aplicado. | Para encadenar generadores: G1 → G2. |
transform.retrograde — Retrogradar (R)Invierte el orden temporal del material. Corta las ligaduras exteriores.
transform.inversion — Invertir (I)axis: first / last / middle.nueva = 2·eje − original.transform.transpose — Transponersemitones: entero entre −36 y +36. Por defecto: 3.transform.fuseManuals — Fusionar MI (tonal) + MIII (rítmica)Este generador ignora la Fuente seleccionada y lee siempre los textareas de MI y MIII directamente.
Se detalla en §29.
transform.filterPositions — Filtrar posiciones NuevoConserva solo los eventos del material de entrada que caen en ciertas posiciones (impar, par, cada N, lista personalizada). Sí usa la Fuente seleccionada. Se detalla en §29bis.
transform.spaceEvents — Espaciar eventos NuevoIntercala silencios alrededor de cada evento para separarlo en el tiempo. Sí usa la Fuente seleccionada. Se detalla en §29ter.
El bloque Voz permite explorar la realización temporal del material ya escrito. No transforma alturas. «Aplicar valor» cambia duraciones; «Completar ciclo» repite un manual hasta una barra; «Realinear» puede repetir ambos manuales hasta que coincidan. La casilla MCM solo controla esta última acción. Estos ajustes permiten comprobar cómo cambia el resultado musical al modificar su organización temporal, sin alterar necesariamente el material de alturas.
| Control | Valores | Efecto |
|---|---|---|
| Manual | MI / MIII | Manual sobre el que actuar. |
| Valor | 1 / 2 / 4 / 8 / 16 | Duración a aplicar a todos los eventos. |
| Puntillo | keep / yes / no | Mantener el puntillo original, forzarlo, o quitarlo. Por defecto: keep. |
| Compás | keep / 4/4 / 3/4 / 2/4 / 5/4 / 6/8 / 7/8 | Mantener el compás del material, o forzarlo. Por defecto: keep. |
| Repetir las dos voces hasta su MCM | checkbox | Activa la repetición de ambas voces al usar «Realinear ambas voces»; no afecta a «Aplicar valor» ni a «Completar ciclo en este manual». |
| Preservar posición temporal | checkbox | Inserta silencios explícitos al acortar. |
| Aplicar valor a este manual | Botón | Cambia la duración, el puntillo y el compás del manual. Registra el paso. |
| Completar ciclo en este manual (MCM) | Botón | Repite solo el manual elegido hasta que su duración complete un número entero de compases. Conserva el compás y registra el paso. |
| Realinear ambas voces | Botón | Repite el material de ambos manuales hasta el MCM. Registra el paso. |
Al pulsar Aplicar valor a este manual:
Cuando MI y MIII tienen distinta longitud en beats, Realinear ambas voces repite el material de cada manual las veces necesarias para que ambos ciclos coincidan.
repeticiones = MCM / beats_del_manual.loop = false, no se repite.Completar ciclo en este manual (MCM) compara la duración de la serie del manual seleccionado con la duración del compás elegido. Repite la serie el menor número de veces para que termine en un límite de compás. No modifica el otro manual ni cambia el compás seleccionado.
La serie dura 7 tiempos y cada compás dura 4. El MCM es 28, así que se repite 4 veces: 28 negras en 7 compases de 4/4.
4 C4
4 D4
4 E4
4 F4
8 C4
8 D4
8 E4
8 F4
4 rest
4 C4
4 D4
4 E4
4 F4
8 C4
8 rest
8 D4
8 rest
8 E4
8 rest
8 F4
8 rest
4 C4
4 D4
4 E4
4. C4
4. D4
4. E4
4. rest
4 C4
4 D4
4 E4
4 F4
4 G4
4 A4
time 3/4
4 C4
4 D4
4 E4
4 F4
4 G4
4 A4
Cuando el Iniciador es source.row12 o source.row, aparecen dos botones extra bajo los parámetros.
Reordena aleatoriamente las notas que ya están en el campo Fila (Fisher-Yates).
Reemplaza el campo Fila por una fila dodecafónica nueva: las 12 pitch classes en orden aleatorio, todas en la octava 4.
El generador transform.fuseManuals cruza dos materiales independientes:
Este generador ignora la Fuente. Lee siempre los textareas de MI y MIII.
ignoreRests = true).direct / retrograde / shuffle).truncate: recorre min(len(MI), len(MIII)).cyclic: recorre len(MI), accede a MIII[i mod len(MIII)].| Parámetro | Valores | Efecto |
|---|---|---|
rhythmDir | direct / retrograde / shuffle | Dirección de la serie rítmica. |
mode | cyclic / truncate | Repetir o cortar la serie rítmica. |
ignoreRests | false / true | Omitir silencios de la serie rítmica. |
4 C4
4 D4
4 E4
4 F4
8 rest
8 rest
2 rest
4 rest
8 C4
8 D4
2 E4
4 F4
4 C4
4 D4
4 E4
4 F4
4 G4
4 A4
4 B4
4 C5
4 rest
8 rest
2 rest
4 C4
8 D4
2 E4
4 F4
8 G4
2 A4
4 B4
8 C5
4 C4
8 D4
2 E4
4 C4
2 D4
4 E4
8 F4
8 C4
8 rest
4 D4
4 E4
8 C4
4 D4
4 E4
8 F4
transform.filterPositions) NuevoEl generador transform.filterPositions recorre el material de entrada evento a evento (una nota o un silencio = un evento) y conserva solo los que caen en ciertas posiciones. Los demás se descartan. Es un "tamiz" posicional.
Este generador sí usa la Fuente seleccionada (Iniciador, texto de MI o MIII, o generador anterior). Escribe el resultado en el manual de Destino. El material de entrada no se modifica.
| Parámetro | Valores | Efecto |
|---|---|---|
| Patrón | Impar (1, 3, 5, 7…) | Conserva los eventos en posición 1, 3, 5, 7… |
| Par (2, 4, 6, 8…) | Conserva los eventos en posición 2, 4, 6, 8… | |
| Cada N | Conserva 1, 1+N, 1+2N, 1+3N… | |
| Lista personalizada | Conserva las posiciones escritas a mano (separadas por comas). | |
| N (para cada N) | 2 a 12 | Solo se usa si el Patrón es Cada N. Por defecto: 3. |
| Lista (ej. 1,3,5) | Números separados por comas | Solo se usa si el Patrón es Lista personalizada. Por defecto: 1,3,5. |
| Conservar silencios | No / Sí | Si es No, los silencios que caigan en posición válida también se descartan. Si es Sí, se mantienen. |
Iniciador: Fila dada con C4 D4 E4 F4 G4 A4 B4 C5 (8 notas, negras).
Generador: Filtrar posiciones → Fuente: Iniciador → Destino: MIII → Patrón: Impar.
Resultado en MIII:
4 C4
4 E4
4 G4
4 B4
En el log: 🔎 filterPositions: 8 eventos → 4 (patrón odd).
Mismo material. Patrón Cada N, N = 3.
Resultado en MIII:
4 C4
4 F4
En el log: 🔎 filterPositions: 8 eventos → 2 (patrón everyN, N=3).
Lista: 2, 5, 7.
Resultado en MIII:
4 D4
4 A4
4 B4
En el log: 🔎 filterPositions: 8 eventos → 3 (patrón customList, lista=2,5,7).
Entrada con silencios intercalados (6 eventos):
4 C4
4 rest
4 E4
4 rest
4 G4
4 rest
Con Patrón Impar y Conservar silencios = No:
4 C4
4 E4
4 G4
Con Patrón Impar y Conservar silencios = Sí:
4 C4
4 rest
4 E4
4 rest
4 G4
4 rest
Resultado: subconjunto par de la serie, retrogradado.
| Caso | Qué pasa |
|---|---|
| Entrada vacía | Error: El material de entrada está vacío. |
| Lista personalizada vacía o con números < 1 | Error: El patrón no definió ninguna posición. |
| El filtro deja 0 eventos | Error: El filtro dejó el material vacío. (no se escribe nada) |
| Posiciones mayores que el nº de eventos | Se ignoran silenciosamente. Si todas caen fuera → error "material vacío". |
Notas con ligaduras (~) | La ligadura se rompe si su nota destino se descarta. El editor elimina el ~ de la nota origen. |
transform.spaceEvents) NuevoEl generador transform.spaceEvents toma cada evento del material de entrada y lo expande en N "slots", donde cada slot tiene la misma duración que el evento original. Los slots que no ocupa el evento se rellenan con silencios.
Este generador sí usa la Fuente seleccionada. El material de entrada no se modifica: solo se escribe el resultado expandido en el manual de Destino.
| Parámetro | Valores | Efecto |
|---|---|---|
| Slots por evento | 2 a 8 | Cada evento ocupa N casillas. N=2 → nota + 1 silencio. N=3 → nota + 2 silencios. Etc. Por defecto: 2. |
| Posición del silencio | Después (nota → silencios) | El evento va primero, luego los silencios. |
| Antes (silencios → nota) | Primero los silencios, luego el evento. |
Iniciador: Fila dada con C4 D4 E4 F4 (4 negras).
Generador: Espaciar eventos → Slots: 2 → Posición: Después.
Resultado en el manual destino:
4 C4
4 rest
4 D4
4 rest
4 E4
4 rest
4 F4
4 rest
En el log: ↔️ spaceEvents: 4 eventos → 8 (slots=2, silencio after).
Mismo material, Posición Antes:
4 rest
4 C4
4 rest
4 D4
4 rest
4 E4
4 rest
4 F4
Posición Después, Slots = 3 (2 silencios por evento):
4 C4
4 rest
4 rest
4 D4
4 rest
4 rest
4 E4
4 rest
4 rest
4 F4
4 rest
4 rest
Si la entrada tiene duraciones distintas, cada evento genera silencios de su propia duración.
Entrada:
2 C4
4 D4
8 E4
Slots=2, Después:
2 C4
2 rest
4 D4
4 rest
8 E4
8 rest
La blanca genera un silencio de blanca, la negra un silencio de negra, la corchea uno de corchea.
Entrada con tresillo:
t3:2 8 C4
8 D4
8 E4
Slots=2, Después:
8 C4
8 rest
8 D4
8 rest
8 E4
8 rest
Los silencios salen como corcheas normales (no forman parte del tresillo). El generador rompe el tuplet intencionadamente: la expansión no conserva la agrupación.
Entrada con ligadura:
4 C4 ~
4 C4
4 D4
Slots=2, Después:
4 C4
4 rest
4 C4
4 rest
4 D4
4 rest
La ligadura se elimina explícitamente. Si no se hiciera, al insertar silencios la segunda C4 dejaría de ser continuación de la primera y la ligadura quedaría colgando.
Resultado: 4 notas, cada una precedida de 2 silencios de su misma duración.
| Caso | Qué pasa |
|---|---|
| Entrada vacía | Error: El material de entrada está vacío. |
| Slots < 2 | Se fuerza a 2 (mínimo). |
| Slots > 8 | Se fuerza a 8 (máximo). |
| Nota con ligadura entrante | La ligadura se rompe en la nota original. |
Tuplet (t3:2 8 C4) | Los silencios se generan con la duración real (corchea), no como tuplet. |
Duración con puntillo (4.) | El silencio se genera con la misma duración (4. rest). |
| Aspecto | Filtrar posiciones | Espaciar eventos |
|---|---|---|
| Efecto | Descarta eventos | Inserta silencios |
| Nº de eventos | Se reduce o igual | Se multiplica por N |
| Cambia duración | No | No (los silencios heredan la duración) |
| Rompe ligaduras | Sí, si el destino desaparece | Sí, siempre |
| Preserva tuplets | No (los eventos sueltos pierden el grupo) | No (los silencios son figuras normales) |
| Preserva orden | Sí | Sí |
| Acepta silencios | Configurable (checkbox) | Sí (los trata como un evento más) |
Serie dodecafónica, Valor Negra (4), Destino MI.Resultado: 12 notas en MI, 12 notas + 12 silencios en MIII.
Resultado: 6 notas + 6 silencios, alternando.
Resultado: dos voces que dialogan con materiales derivados del mismo origen.
Esta herramienta toma las notas escritas en un manual y las distribuye entre MI y MIII en bloques alternos. Sirve para espacializar una serie generada o escrita previamente, manteniendo su secuencia temporal.
Pulsa Repartir entre manuales. El contenido anterior de ambos manuales se sustituye por el resultado; ↶ Deshacer restaura el estado previo.
Nota sobre el historial: esta operación sí se puede deshacer mediante el sistema general de deshacer, pero no se incorpora al bloque «Historial y comparación» del panel generativo. Por tanto, no aparece allí como un paso registrado ni genera una comparación antes/después.
Se conservan el orden, la duración de cada evento, los cambios de compás y las ligaduras válidas. Cada nota y sus continuaciones ligadas quedan en el mismo manual. Los silencios de la serie de partida se escriben en ambos manuales, de modo que mantienen su posición temporal. Los acordes cuentan como un evento para el reparto.
Con esta serie en MI, el tamaño de bloque 1 y «Empieza en MI»:
4 C4
8 D4
4. E4
4 F4
MI conserva C4 y E4; MIII recibe D4 y F4. En las posiciones asignadas al otro manual se insertan silencios de la misma duración:
MI: MIII:
4 C4 4 rest
8 rest 8 D4
4. E4 4. rest
4 rest 4 F4
La duración total y el instante de cada nota se mantienen, aunque la distribución gráfica y sonora pasa a alternar entre manuales.
{
"version": "2.0",
"process": {
"iniciador": { "generator": "source.row12", "params": {...}, "manual": "MI", "events": [...] },
"generador": { "generator": "transform.inversion", "source": "iniciador", "params": {...}, "manual": "MIII", "events": [...] },
"voces": {
"MI": { "value": 4, "loop": true, "preservePosition": true },
"MIII": { "value": 4, "loop": true, "preservePosition": true }
}
},
"texts": { "MI": "...", "MIII": "..." }
}
genProcess.proceso_generativo.json.El bloque 4. Historial y comparación registra cada paso aplicado en el panel generativo y permite volver a un estado anterior. Además de servir para deshacer, facilita revisar el recorrido seguido y comparar cómo ha evolucionado el material entre operaciones.
Se registra un paso cada vez que se pulsa uno de estos botones:
Iniciador «Serie dodecafónica» → MIGenerador «Invertir» → MIIIVoz MI: valor 2 con puntillo, compás 3/4Realinear ambas voces (MCM)Matriz: P0 → MIIIAl registrar un paso, se muestra bajo la lista una comparación entre los dos estados de cada manual que cambió:
MI
antes: C4 D4 E4 F4
después: C4 D4 E4 F4 G4
MIII
antes: (vacío)
después: C3 D3 E3 F3
Cada paso tiene un botón ↶ Volver que:
El historial del panel y el Ctrl+Z del editor son mecanismos independientes. Pulsar «↶ Volver» sí hace un snapshot, así que puedes deshacerlo con Ctrl+Z.
El historial vive en memoria (history[]). Se pierde al recargar la página. No se guarda en el JSON del proceso.
El bloque 5. Matriz dodecafónica construye la matriz clásica P/R/I/RI de una fila dodecafónica y permite enviar cualquier forma a un manual.
Dada una fila dodecafónica (las 12 pitch classes en un orden determinado), se definen cuatro formas:
| Forma | Nombre | Definición |
|---|---|---|
| P | Prima (original) | La fila tal cual. |
| R | Retrogradación | La fila leída de atrás hacia delante. |
| I | Inversión | La fila reflejada en intervalos (mismo intervalo, sentido contrario). |
| RI | Retrogradación de la inversión | La inversión leída de atrás hacia delante. |
M[i][j] = (p[j] + p[0] − p[i]) mod 12
donde p = [pc_0, pc_1, …, pc_11] son las 12 pitch classes de la fila,
todas en el rango 0..11.
| Control | Valores | Efecto |
|---|---|---|
| Serie de | MI / MIII | De qué manual se extrae la fila. |
| Enviar a | MI / MIII | A qué manual se envía la forma elegida. |
| Valor | 1 / 2 / 4 / 8 / 16 | Duración que se asigna a cada nota de la forma. |
| Generar matriz | Botón | Construye la tabla. |
La tabla muestra 12 filas y 12 columnas, con cuatro bandas de etiquetas clicables:
I0–I11. Envía la columna hacia abajo (I).P0–P11. Envía la fila hacia la derecha (P).R0–R11. Envía la fila hacia la izquierda (R).RI0–RI11. Envía la columna hacia arriba (RI).La diagonal principal aparece resaltada en naranja.
Los números n de las etiquetas indican la pitch class con la que empieza la forma (0 = C, 1 = C#, 2 = D, …, 11 = B).
✅ P5 enviada a MIII.Entrada en MI (fila dodecafónica por defecto):
4 C4 C#4 D4 D#4 E4 F4 F#4 G4 G#4 A4 A#4 B4
Resultado en MIII:
4 G4
4 G#4
4 A4
4 A#4
4 B4
4 C5
4 C#5
4 D5
4 D#5
4 E5
4 F5
4 F#5
| Función | Semilla actual | Reproducible |
|---|---|---|
runIniciador | 12345 fija | Sí |
runGenerador | 12345 fija | Sí |
transform.fuseManuals con shuffle | 12345 fija | Sí |
shuffleCurrentRow (🎲 Barajar fila) | Date.now() | No |
newRandomRow (🎲 Fila nueva) | Date.now() | No |
La sincronización es unidireccional en cada sentido, pero las dos direcciones conviven:
El cambio de "quién dirige" es transparente: no hay que configurar nada.
La multiselección no se guarda en el JSON del proyecto ni en el del proceso. Es un estado transitorio de la sesión.
Los dos primeros se persisten en localStorage. La octava, no.
Esto significa que dos usuarios en el mismo navegador comparten preferencias de panel y modo. Si se necesita aislar, habría que usar un prefijo distinto por usuario o un backend.
La Fuente generador anterior permite encadenar G1 → G2, pero solo un nivel.
Cada botón que escribe texto hace su propio snapshot de undo. El historial propio del panel (§31) permite volver a un paso concreto, pero es un mecanismo aparte del Ctrl+Z general.
El pulso usa un único timeSig. No respeta cambios de compás dentro de la pieza.
Ambos generadores siguen la convención general: no modifican la fuente. Escriben el resultado en el manual de Destino. Por eso son intercambiables con el resto de generadores y se pueden encadenar usando la fuente generador anterior.
source.row12, fila por defecto, valor 4, Manual MI.transform.inversion, Fuente = Iniciador, axis = first, Destino = MIII.MCM(6, 12) = 12
MI: 12 / 6 = 2 repeticiones
MIII: 12 / 12 = 1 repetición
Aparecen 2 pasos. Pulsar «↶ Volver» en el primero descarta el segundo.
source.row12, Valor Negra, Manual MI.Resultado en MIII: 4 notas + 4 silencios, alternando.
~.<details>.Regla base: la primera palabra de cada línea es la duración. Todo lo que sigue son las notas del mismo evento: una sola nota, o varias formando un acorde (todas simultáneas). Para tener varios eventos, usa una línea por evento.
| Comando | Efecto |
|---|---|
4 C4 | Una negra (C4). Un evento, una nota. |
4 C4 D4 E4 F4 | Un acorde de cuatro notas negras (simultáneas). No son cuatro negras seguidas. |
4 C4 E4 G4 | Un acorde de tres notas (Do mayor, todas negras). |
4 C4 repetido en 4 líneas | Cuatro negras consecutivas (una por línea). |
4 rest / 4 s / 4 silencio | Silencio de negra. |
2. Bb3 | Blanca con puntillo (Si♭3). |
1 C4 / 2 C4 / 4 C4 / 8 C4 / 16 C4 | Redonda / blanca / negra / corchea / semicorchea. |
time 3/4 (o compas, m, t, c) | Cambio de compás. |
4 C4 ~ al final de línea | Ligadura con la primera nota de la línea siguiente. |
t3:2 8 C4 seguido de 8 D4, 8 E4 | Tresillo: 3 corcheas en el tiempo de 2. |
| Tecla | Acción | Respeta el foco |
|---|---|---|
| ↑ / ↓ | Transponer ±1 semitono (o moverse dentro del acorde) | Sí |
| Shift+↑ / Shift+↓ | Transponer ±1 octava | Sí |
| + / - (y con Shift) | Transponer (multiselección > fragmento > nota > rango) | Sí |
| ← / → | Navegar entre notas | Sí |
| Shift+← / Shift+→ | Extender / reducir fragmento | Sí |
| Alt+↓ Nuevo | Siguiente panel (acordeón) | Sí |
| Alt+↑ Nuevo | Panel anterior (acordeón) | Sí |
| Alt+Enter Nuevo | Alternar panel enfocado sin cerrar los demás | Sí |
| Alt+Shift+Q Nuevo | Alternar todos los paneles (toggle) | Sí |
| Alt+M Nuevo | Alternar Modo Iniciación / Avanzado | Sí (ignora textarea/input) |
| Ctrl+Z / Cmd+Z | Deshacer | No |
| Ctrl+Y / Cmd+Y | Rehacer | No |
| Ctrl+Shift+Z | Rehacer (alternativo) | No |
| Esc | Deseleccionar (o salir de pantalla completa) | No |
| Espacio | Claqueta + grabación MIDI | Sí |
| Enter | Play / Stop | Sí |
| Tab | Alternar manual MI ↔ MIII | Sí |
| Supr / Backspace | Borrar selección o limpiar editores | Sí |
| R | Retrogradar | Sí |
| I | Invertir | Sí |
| 1 2 4 8 | Duración | Sí |
| S o 9 | Semicorchea (16) | Sí |
| . / , | Puntillo | Sí |
| Ctrl+C / Ctrl+V | Copiar / pegar compases | Sí |
| Ctrl+Shift+C | Copiar fragmento | Sí |
| Ctrl+Shift+V | Pegar fragmento (sustituir) | Sí |
| a–g | Insertar nota natural | Sí |
| Shift+a–g | Insertar silencio | Sí |
data-note-id único.playAudio() programa cada nota con su tiempo exacto de inicio y duración. Con 🔁 Bucle, programa por adelantado las notas de la vuelta siguiente para mantener la continuidad.requestAnimationFrame (updateVisuals) comprueba si now está dentro del intervalo de cada evento..playing y se llama a setNoteHighlight(el, color).setNoteHighlight(el, null) para restaurar los colores originales.stopAudio().Por qué no basta el CSS: VexFlow 5 dibuja las cabezas de nota como <ellipse> con fill aplicado inline. Hay que recorrer los descendientes y modificar el atributo directamente.
Es un mecanismo aparte del resaltado de reproducción. Se activa al seleccionar texto en la textarea y añade la clase .nota-desde-textarea a las cabezas de nota correspondientes. Se limpia al perder el foco o al deseleccionar.
Cuando el pentagrama selecciona una línea (clic simple, fragmento, compás, multiselección), se dibuja un <div class="sync-line-overlay"> encima de esa línea en el textarea. Se calcula con getExactLineHeight(), que mide el line-height real de la textarea (con un div espejo si el CSS no lo declara). El overlay se oculta cuando la textarea recibe el foco (porque entonces ya se ve la selección nativa).
| Tecla | <textarea> / <input> | <button> | Resto |
|---|---|---|---|
| Espacio | Escribe espacio. | Activa botón. | Claqueta. |
| Enter | Salto de línea. | Activa botón. | Play/Stop. |
| Tab | Tabulador. | Mueve foco. | Alterna manual. |
| Esc | Deselecciona. | Deselecciona. | Deselecciona / sale fullscreen. |
| Supr / Backspace | Borra carácter. | — | Borra selección o limpia. |
| R | Escribe r. | — | Retrogradar. |
| I | Escribe i. | — | Invertir. |
| 1/2/4/8/S/9 | Escribe. | — | Duración. |
| . / , | Escribe. | — | Puntillo. |
| + / - | Escribe. | — | Transponer. |
| ← / → | Mueve cursor. | — | Navega (Shift = extiende). |
| ↑ / ↓ | Mueve cursor. | — | Transponer. |
| a–g | Escribe. | — | Inserta nota. |
| Shift+a–g | Escribe mayúscula. | — | Inserta silencio. |
| Ctrl+Z / Ctrl+Y | Deshacer / Rehacer. | Deshacer / Rehacer. | Deshacer / Rehacer. |
| Ctrl+C / Ctrl+V | Copiar / pegar texto. | Copiar / pegar compases. | Copiar / pegar compases o fragmento. |
| Ctrl+Shift+C | — | Copiar fragmento. | Copiar fragmento. |
| Ctrl+Shift+V | — | Pegar fragmento. | Pegar fragmento. |
| Alt+↓ / ↑ Nuevo | — | — | Acordeón de paneles. |
| Alt+Enter Nuevo | — | — | Alternar panel enfocado. |
| Alt+Shift+Q Nuevo | — | — | Alternar todos los paneles (toggle). |
| Alt+M Nuevo | — | Alternar Modo Iniciación / Avanzado. | Alternar Modo Iniciación / Avanzado. |
4 F#4 F4 F4 F4
4 F#4 Fn4 F4 F4
Entrada:
4 F4
4 F4
4 F4
4 F4
Acción: seleccionar compás, pulsar ↑.
4 F#4
4 F#4
4 F#4
4 F#4
Tras Generar Partituras:
4 F#4
4 F4
4 F4
4 F4
4 C4 ~
4 C4
Retrogradar (R): el resultado es 2 C4.
Entrada:
2 F4
4 D4
4 D4 ~
4 D4
2 rest
Tras ↑:
2 F#4
4 D#4
4 D#4 ~
4 D#4
2 rest
Entrada:
2 F4
4 D4
4 D4 ~
4 D4
2 rest
Tras R:
2. rest
4 D4 ~
4 D4
4 D4
2 F4
Entrada:
2 F4
4 G#4
4 G#4 ~
4 G#4
2 rest
Tras I con eje F4:
2 F4
4 D4
4 D4 ~
4 D4
2 rest
4 F#4 F#4 F#4
Tras Generar Partituras:
4 F#4 F4 F4
Entrada en MI:
4 C4 D4 E4 F4
Resultado: sin cambios.
4 C4 D4 E4 F4
Resultado:
4 C4 C4 D4 E4
4 F4 rest rest rest
Entrada en MI: 4 C4 / 4 D4 / 4 E4.
Acción: Voz MI, Valor = 4, Puntillo = "Con puntillo", Preservar posición = OFF.
Resultado:
4. C4
4. D4
4. E4
4. rest
Entrada en MI: 4 C4 … 4 A4 (6 negras).
Acción: Voz MI, Valor = 4, Compás = 3/4.
Resultado:
time 3/4
4 C4
4 D4
4 E4
4 F4
4 G4
4 A4
Entrada en MI (fila dodecafónica): 4 C4 C#4 D4 D#4 E4 F4 F#4 G4 G#4 A4 A#4 B4.
Resultado en MIII:
4 G4
4 G#4
4 A4
4 A#4
4 B4
4 C5
4 C#5
4 D5
4 D#5
4 E5
4 F5
4 F#5
1/2/4/8/S y, si quieres, activa el puntillo con ..Entrada en MI:
4 C4
4 D4
4 E4
4 F4
4 E4) queda marcada con un overlay azul claro.4 D4 y 4 E4).Entrada en MI: 4 C4 D4 E4 F4.
C4 → se vuelve azul.D4 → ambos se vuelven verdes (multiselección).F4 → los tres se vuelven verdes; E4 queda sin marcar.4 C#4 D#4 E4 F#4.Objetivo: escribir una nota grave (Mi1) sin cambiar la partitura general.
#octaveOffsetLabel: muestra 0.−1 y el piano ahora cubre E1–E4.4 E1).0.+1 y el piano cubre E3–E6.4 E6).En el Registro de actividad aparecen los mensajes del cambio de octava con el rango resultante.
Ambas teclas hacen lo mismo:
En teclados sin Numpad, S está más cerca de la mano izquierda; en teclados con Numpad, 9 es más rápido de pulsar.
Fila dada, Notas: C4 D4 E4 F4 G4 A4 B4 C5, Valor Negra (4), Manual MI.Resultado en MIII: 4 C4 / 4 E4 / 4 G4 / 4 B4.
Resultado en MIII: 4 C4 / 4 rest / 4 E4 / 4 rest / 4 G4 / 4 rest / 4 B4 / 4 rest.
source.row12, valor Negra, Manual MI.Resultado en MIII: 4 notas (posiciones 1, 4, 7, 10 de la serie), cada una precedida de 2 silencios de su misma duración.
em.html).
Manual Unificado V11.1 — Editor Musical (MI y MIII).
La aplicación forma parte de un conjunto de aplicaciones dirigidas a la improvisación para acordeón.