
Trovador IA: cuando compone el modelo, no el código
Trovador IA es el hermano de Eco pensado para el contraste, no para sustituirlo. En Eco, el modelo solo lee el ánimo de un texto —una palabra de una lista cerrada de cinco— y todo lo musical lo decide después un algoritmo con reglas: mismo texto, siempre la misma melodía, explicable paso a paso. En Trovador IA se le pide al modelo mucho más: que componga él mismo la secuencia entera de notas, con sus aciertos y sus fallos de verdad. Mismo centro, mismo profesor, mismo modelo local en ROCKY vía LM Studio, mismas cinco escalas y el mismo “instrumento” que Eco —reescrito aquí desde cero, sin importar una sola línea de código de esa carpeta, por el mismo principio de independencia que ya siguen Eco y Postal IA entre sí— pero aquí, si se repite la petición con el mismo texto, casi seguro suena distinto.
El reparto de tareas, invertido respecto a Eco
Eco separa tres piezas: el modelo interpreta, el código compone, el navegador reproduce. Trovador IA mantiene la misma separación en tres piezas, pero con los papeles del medio invertidos: el modelo ya no se limita a interpretar un ánimo, sino que compone directamente —decide una escala y una secuencia de eventos musicales, grado a grado—; el código ya no compone nada, solo traduce con matemáticas fijas lo que el modelo ha decidido; y el navegador, con la Web Audio API de siempre, reproduce el resultado sin ninguna librería de audio externa y sin generar ni guardar ningún archivo de sonido. La honestidad del proyecto depende de que esa segunda pieza nunca disimule lo que el modelo realmente propuso: ni corrige un grado “raro” para que suene mejor, ni rellena con una melodía de emergencia si el modelo falla del todo.
Qué comparte con Eco, y qué es exactamente al revés
El “instrumento” es idéntico: las mismas cinco escalas (alegre, melancólico, misterioso, enérgico, calmado), con los mismos tempos y timbres por ánimo, reescritas a mano en melodia.py de Trovador IA —no importadas de Eco— para que la comparación entre ambos proyectos sea limpia. Lo que cambia por completo es quién decide qué nota suena después de cuál. En Eco, cada palabra clave se convierte en un número con un hash polinómico determinista, y ese número elige el grado y la octava dentro de la escala: dado el mismo texto, siempre el mismo cálculo, siempre la misma melodía. En Trovador IA no hay ningún hash: el grado de cada nota lo escribe el modelo directamente en su respuesta JSON, y la única operación que le aplica el código es resolverlo dentro de la escala si se sale de rango —una octava más arriba o más abajo, nunca un grado distinto del que pidió el modelo.
Qué le pide el código al modelo
El system prompt de Trovador IA no pide una lectura emocional, como el de Eco: pide una composición completa, en un único JSON con una estructura fija.
python
SYSTEM_PROMPT_COMPOSICION = (
"Eres un compositor breve en espanol. Cuando te doy un texto o un "
"tema, compones tu mismo una melodia corta a partir de el: eliges una "
"escala y una secuencia de notas dentro de esa escala. Respondes "
"UNICAMENTE con un objeto JSON, sin explicaciones, sin bloques de "
"codigo y sin ningun texto antes o despues, con exactamente esta "
"forma:\n"
'{"escala": "...", "eventos": [{"grado": 0, "duracion": "media"}, '
'{"grado": 2, "duracion": "corta"}]}\n\n'
"El campo \"escala\" debe ser EXACTAMENTE una de estas cinco palabras: "
+ ", ".join(NOMBRES_ESCALAS) + ". Elige la que mejor encaje con el "
"animo del texto.\n"
"El campo \"eventos\" es la melodia: una lista, en el orden en que "
"suenan, de entre 5 y 7 notas (nunca mas de 24, pero 5 a 7 es lo que "
"hace una melodia corta con cuerpo). Cada nota tiene un \"grado\" "
"(...) y una \"duracion\" que debe ser EXACTAMENTE una de estas tres "
"palabras: corta, media, larga. Tu decides la secuencia completa: "
"cuantas notas hay, que grados y que duraciones -- nadie va a "
"corregir tu composicion despues, asi que hazla tu misma lo mejor "
"que puedas."
)
Con temperatura 0,75 —un valor medio, elegido a propósito: ni tan bajo como el 0,4 de análisis de ánimo de Eco, porque aquí se le pide mucho más que elegir entre cinco palabras; ni tan alto como para que el JSON salga mal formado casi siempre—. El rescate de JSON, si el modelo envuelve la respuesta en un bloque de código markdown pese a que se le pide lo contrario, es el mismo mecanismo en dos pasos que ya usa Eco.
Cómo se traduce eso en sonido, sin decidir nada creativo
melodia.py recibe la escala y la lista de eventos y no juzga si la composición es buena o mala: solo hace matemáticas exactas. La única red de seguridad sobre el grado que propone el modelo es puramente técnica, nunca creativa.
python
def _semitono_desde_grado(grado, semitonos_escala):
"""Resuelve un grado entero -- puede ser negativo o mayor que el
tamano de la escala -- en un semitono absoluto respecto a la tonica,
mediante octava + modulo. El operador // de Python ya redondea hacia
abajo con numeros negativos, asi que un grado negativo cae de forma
natural en la octava inferior."""
tamano = len(semitonos_escala)
indice = grado % tamano
octava = grado // tamano
return semitonos_escala[indice] + 12 * octava
Grado 9 en una escala de 5 notas es la nota número 4 de esa escala, una octava por encima; grado -1 es la última nota de la escala, una octava por debajo. El código nunca decide que un grado “suena raro” y lo cambia: solo lo sitúa en la octava que le corresponde. La duración relativa (corta/media/larga) se traduce a segundos según el tempo de la escala elegida, con la misma fórmula de temperamento igual que usa Eco para pasar de semitonos a frecuencia. Si la escala no es una de las cinco válidas, o el modelo propone más de 24 eventos, se avisa en la propia interfaz —nunca en silencio—.
Un ajuste real: cuando el modelo componía solo 3 notas
Nada más probarlo con LM Studio real en ROCKY, José Luis escribió un texto de tres líneas y la melodía resultante tenía solo 3 notas: muy poco cuerpo para lo que pedía el prompt original (“entre 4 y 24 notas”). Un modelo de 3B, al no tener un ejemplo claro de cuántas notas se esperan, tiende a quedarse corto. La solución no fue tocar el código de traducción —eso habría sido “corregir” la composición del modelo, justo lo que este proyecto no debe hacer— sino afinar lo que se le pide: el prompt ahora pide explícitamente “entre 5 y 7 notas”, dejando claro que el límite de 24 es solo un tope de seguridad, no un objetivo. Es el mismo tipo de ajuste que el “3 a 5 palabras clave” de Eco: se tunea la petición, nunca se rellena la respuesta. Si el modelo sigue devolviendo menos notas alguna vez, seguirá mostrándose tal cual —es exactamente el límite honesto que este proyecto quiere dejar ver en clase, no un fallo que haya que tapar.
Un vistazo real al verde institucional
La interfaz, al principio, compartía la estética oscura de Eco a propósito, por el principio de contraste limpio entre los dos proyectos. José Luis pidió cambiarla a una paleta clara en verdes, “tipo Junta de Andalucía”. La primera versión fue una paleta verde aproximada, inventada a ojo; para no quedarse en una aproximación, se abrió una pestaña de Chrome y se buscó el manual real: el sistema de diseño vigente de la Agencia Digital de Andalucía (actualizado en marzo de 2026) publica los colores exactos que usa la propia Junta en sus servicios digitales —verde principal #087021, verde de hover #0B4C1A, verde de apoyo #C4DDCA, y los colores de estado para error, aviso, éxito e información—. La interfaz de Trovador IA se rehízo con esos valores reales, con dos únicas excepciones deliberadas: el texto secundario y el texto de aviso no tienen un tono oficial pensado para leerse como texto sobre fondo blanco (los oficiales están pensados para fondos sólidos), así que ahí se usaron dos tonos propios, en la misma familia de color, elegidos por legibilidad.
Cómo se instala y se arranca, paso a paso desde cero
Esta guía asume que no hay nada instalado todavía. En Windows:
1. Instalar Python. Ir a python.org/downloads y descargar la versión más reciente de Python 3. Al instalar, es importante marcar la casilla “Add python.exe to PATH” antes de pulsar instalar —si no, luego el ordenador no reconoce el comando python—. Para comprobar que se ha instalado bien, abrir el símbolo del sistema (o PowerShell) y escribir:
python --version
Debería aparecer algo como Python 3.12.x.
2. Instalar LM Studio y descargar el modelo. Ir a lmstudio.ai, descargar e instalar LM Studio. Abrirlo, ir a la pestaña de búsqueda de modelos (icono de lupa) y buscar llama-3.2-3b-instruct; descargarlo (puede tardar varios minutos, según la conexión). Después, ir a la pestaña del servidor local (Developer / Local Server), elegir ese modelo en el desplegable y pulsar “Start Server”. Por defecto debe quedar escuchando en el puerto 1234, que es el que espera main.py. LM Studio tiene que quedarse abierto, con el servidor encendido, mientras se usa Trovador IA.
3. Tener la carpeta del proyecto a mano. Copiar la carpeta trovadoria (con main.py, melodia.py, requirements.txt y la subcarpeta static) en cualquier sitio del ordenador, por ejemplo en C:\Trovador-IA.
4. Instalar las dependencias de Python. Abrir una terminal dentro de esa carpeta (en el explorador de archivos, estando dentro de la carpeta, se puede escribir cmd en la barra de direcciones y pulsar Intro, o hacer clic derecho y elegir “Abrir en Terminal”) y ejecutar:
pip install -r requirements.txt
Esto instala FastAPI, Uvicorn, Requests y Slowapi. Solo hace falta la primera vez.
5. Arrancar el programa. Con LM Studio abierto y el servidor local encendido, en esa misma terminal:
uvicorn main:app --reload --port 8013
Si todo va bien, la terminal muestra que el servidor está escuchando. Esa ventana hay que dejarla abierta: si se cierra, el programa se para.
6. Abrir Trovador IA en el navegador. Con el servidor arrancado, abrir cualquier navegador y escribir en la barra de direcciones:
http://127.0.0.1:8013
7. Usarlo. Escribir un texto o un tema en el cuadro, pulsar “Componer melodía” y esperar unos segundos mientras el modelo compone. Aparecerán la escala, el modo musical, el tempo, el timbre, los grados que ha elegido el modelo y el piano roll. “Reproducir” hace sonar la melodía, “Detener” la corta. Y el botón que no existe en Eco: “Improvisar otra vez” repite exactamente la misma petición, con el mismo texto, para comprobar en el momento que —casi seguro— suena distinto.
javascript
botonImprovisar.addEventListener("click", async function () {
if (!ultimoTexto) return;
await componer(ultimoTexto, botonImprovisar, "Improvisando...", "Improvisar otra vez");
});
Código de acceso opcional. Si el centro pide restringir el acceso, se define la variable TROVADOR_TOKEN antes de arrancar (en PowerShell: $env:TROVADOR_TOKEN = "tu-codigo"; en símbolo del sistema: set TROVADOR_TOKEN=tu-codigo) y se escribe ese mismo código en el campo de la interfaz. Sin definirla, el acceso queda abierto —cómodo para probarlo en casa o en una clase controlada—.
Cómo se ha comprobado
test_melodia.py (17 pruebas, sin ningún framework, mismo estilo que el de Eco) comprueba que la traducción de escala y eventos a notas es una función pura —mismos datos de entrada, siempre la misma salida—, que un grado igual al tamaño de la escala sube exactamente una octava y uno negativo baja una octava, que las tres duraciones se ordenan bien, que una escala desconocida cae a un valor por defecto con aviso, que más de 24 eventos se recortan con aviso visible, y que sin ningún evento utilizable el programa lanza un error claro en vez de inventar una melodía. Y, a diferencia de la primera versión de Eco, esto ya se ha probado con LM Studio real en ROCKY: esa prueba real es, de hecho, la que sacó a la luz el ajuste de las 3 notas descrito más arriba.
Qué no hace todavía (límites honestos)
- Se ha probado ya con LM Studio real, pero solo con unos pocos textos: falta probar con muchos más para saber si el rango de 5 a 7 notas se cumple de forma consistente, o si hace falta seguir ajustando el prompt.
- El código de acceso (
TROVADOR_TOKEN) existe pero está desactivado por defecto, igual que en Eco: no pide nada en local. - La paleta de color reproduce los tonos oficiales de la Junta de Andalucía salvo en dos matices —el texto secundario y el texto de aviso— que son una elección propia por legibilidad, no un valor sacado del manual.
- Esto no es composición musical con criterio armónico real: es un modelo pequeño y local decidiendo una secuencia de notas, con sus aciertos y sus fallos de verdad. Es, de hecho, la parte más interesante para el aula: ver esos límites en directo.
- Todavía no se ha probado en clase con alumnado, ni se ha hecho la actividad de contraste “misma frase, dos máquinas” (Eco y Trovador IA) que propone el proyecto.
Siguiente paso
Que José Luis siga probando Trovador IA con varios textos seguidos, compruebe si la variedad de escalas y el número de notas convencen, y valore cuándo llevar ya al aula la actividad de contraste con Eco: mismo texto, dos máquinas, dos maneras muy distintas de “componer”.

Etiqueta:AIDARAC, Composición por IA, eco, ies monterroso, lm studio, melodía generativa, montesteam, ROCKY, Trovador IA, web audio api



