# 🎵 Algoritmia - Lenguaje de Programación Musical - Doble Intérprete
Intérprete de Algoritmia es desarrollado como proyecto final para el curso de **Implementación de Lenguajes de Programación** de la Universidad Peruana Cayetano Heredia.
Algoritmia es un lenguaje de programación orientado a la composición algorítmica que permite generar partituras musicales en formato PDF, MIDI y WAV, en base a reglas Sintácticas y Léxicas.
- ✅ Variables y asignaciones
- ✅ Operaciones aritméticas (+, -, *, /, %)
- ✅ Operadores relacionales (=, /=, <, >, <=, >=)
- ✅ Condicionales (if/else)
- ✅ Bucles (while)
- ✅ Listas y operaciones con listas
- ✅ Procedimientos con parámetros
- ✅ Recursividad
- ✅ Entrada/Salida (lectura y escritura)
- ✅ Reproducción de notas musicales
- ✅ Generación automática de partituras (PDF)
- ✅ Generación de archivos de audio (MIDI y WAV)
- Python 3.8+
- Java JDK 17+ (para ANTLR)
- ANTLR 4.13.1
- LilyPond (para generar partituras)
- Timidity++ (para generar archivos WAV)
- FluidSynth (Para repuesto en generación de audio)
antlr4-python3-runtime==4.13.1
git clone <url-del-repositorio>
cd PythonProject2python -m venv .venv
# En Windows:
.venv\Scripts\activate
# En Linux/Mac:
source .venv/bin/activatepip install -r requirements.txt- Windows: Descargar desde aquí
- Linux:
sudo apt-get install lilypond - Mac:
brew install lilypond
- Windows: Descargar desde aquí
- Linux:
sudo apt-get install timidity - Mac:
brew install timidity
- Windows: Descargar desde aquí (se recomienda la versión con instalador o usar MSYS2 para instalar fluidsynth)
- Linux:
sudo apt-get install fluidsynth(Debian/Ubuntu) osudo dnf install fluidsynth(Fedora) - Mac:
brew install fluidsynth
java -jar antlr-4.13.1-complete.jar -Dlanguage=Python3 -visitor Algoritmia.g4O usar el Makefile (Linux/Mac):
make grammarpython algoritmia.py <archivo.alg> [procedimiento_inicial]# Ejecutar desde el procedimiento Main (por defecto)
python algoritmia.py examples.alg
# Ejecutar desde un procedimiento específico
python algoritmia.py examples.alg MiProcedimientoMain |:
<w> "Hello Algoritmia"
(:) {C D E F G}
:|
Main |:
x <- 10
y <- 20
<w> "La suma es:" x + y
(:) {C D E}
:|
Main |:
<?> n
if n > 0 |:
<w> "Positivo"
:| else |:
<w> "No positivo"
:|
:|
Main |:
i <- 1
while i <= 5 |:
<w> i
i <- i + 1
:|
:|
Factorial n |:
if n <= 1 |:
<w> 1
:| else |:
temp <- n - 1
resultado <- n
i <- temp
while i > 0 |:
resultado <- resultado * i
i <- i - 1
:|
<w> resultado
:|
:|
Main |:
Factorial 5
:|
Hanoi n origen desti aux |:
if n > 0 |:
temp <- n - 1
Hanoi temp origen aux desti
nota <- 28 + n * 2
(:) nota
<w> origen "-->" desti
Hanoi temp aux desti origen
:|
:|
Main |:
Hanoi 3 1 3 2
:|
examples.alg- Ejemplo básicotest_euclides.alg- Algoritmo de Euclides (MCD)test_hanoi_musical.alg- Torres de Hanoi con músicatest_escalas.alg- Generador de escalas musicalestest_listas.alg- Operaciones con listastest_factorial.alg- Cálculo de factorialtest_melodia.alg- Composición musical compleja
python run_all_tests.pyAlgoritmia utiliza el sistema de notación musical inglés:
C, D, E, F, G, A, B
A0, B0, C1, D1, ..., A7, B7, C8
nota <- C ### Do central (28)
nota <- nota + 7 ### Una octava más alta
PythonProject2/
├── algoritmia.py # Intérprete principal
├── Algoritmia.g4 # Gramática ANTLR
├── AlgoritmiaLexer.py # Analizador léxico (generado)
├── AlgoritmiaParser.py # Analizador sintáctico (generado)
├── AlgoritmiaVisitor.py # Visitor pattern (generado)
├── AlgoritmiaListener.py # Listener pattern (generado)
├── requirements.txt # Dependencias Python
├── Makefile # Comandos de compilación
├── README.md # Este archivo
├── examples.alg # Ejemplo básico
├── test_*.alg # Archivos de prueba
└── antlr-4.13.1-complete.jar # ANTLR runtime
Para cada archivo .alg ejecutado con éxito, se generan:
archivo.ly- Código fuente LilyPondarchivo.pdf- Partitura en formato PDFarchivo.mid- Audio en formato MIDIarchivo.wav- Audio en formato WAV
- Validación inicial: Verificación de argumentos y existencia del archivo
- Análisis: Léxico y sintáctico usando ANTLR4
- Recolección: Identificación y almacenamiento de procedimientos
- Ejecución: Invocación del procedimiento inicial con gestión de ámbitos
- Procesamiento de instrucciones: Asignaciones, lectura/escritura, condicionales, bucles, listas y reproducción musical
- Evaluación de expresiones: Variables, números, notas musicales, operaciones y listas
- Generación de salida: Conversión de la partitura a formato LilyPond, compilación a PDF/MIDI y conversión a WAV
Error: "No such file or directory: algoritmia.py
Asegúrate de estar en el directorio correcto del proyecto.
Error: "java: command not found"
Instala Java JDK y agrégalo al PATH del sistema.
Error: "lilypond: command not found"
Instala LilyPond y agrégalo al PATH del sistema.
Error: "timidity: Can't read configuration file"
En Windows, ejecuta timidity con el parámetro -c NUL:
timidity -c NUL archivo.mid -Ow -o archivo.wavProyecto desarrollado para el curso de Implementación de Lenguajes de Programación.
Universidad Peruana Cayetano Heredia
- Frank Kevin Jauregui Bendezu
- Jesus Anselmo Morales Alvarado
- Brigitte Bernal Belisario
- Nardy Liz Condori Mamani
Este proyecto es de uso académico para el curso de Implementación de Lenguajes de Programación.
- ANTLR - Framework para generación de parsers
- LilyPond - Software de notación musical
- Timidity++ - Sintetizador MIDI
¡Disfruta componiendo con Algoritmia! 🎵