Aplicación de escritorio que toma una canción (MP3 o WAV), aísla la pista de batería y genera una partitura PDF lista para leer.
tu_cancion.mp3
│ 1. Demucs separa la mezcla en stems
├─▶ tu_cancion_drums.wav ← solo batería
└─▶ tu_cancion_sin_bateria.wav ← todo menos la batería
│ 2. ADTOF "escucha" la batería y detecta cada golpe
▼
tu_cancion_drums.mid ← MIDI (las notas, no audio)
│ 3. pretty_midi + LilyPond dibujan las notas en pentagrama
▼
tu_cancion_partitura.pdf ← partitura final
+ BPM estimado con librosa
Cada canción genera su propia carpeta dentro de output/:
output/
└── Yo Soy de Bolivia/
├── Yo Soy de Bolivia_drums.wav
├── Yo Soy de Bolivia_sin_bateria.wav
├── Yo Soy de Bolivia_drums.mid
└── Yo Soy de Bolivia_partitura.pdf
Nota sobre el MIDI: un MP3/WAV es sonido grabado; un MIDI son instrucciones (qué golpe, cuándo y con qué fuerza), como una partitura digital. Para dibujar una partitura necesitamos las notas (MIDI), no la onda de audio. El MP3 se convierte a WAV automáticamente dentro del programa: no tienes que hacerlo a mano.
¿Por qué no Basic Pitch? Basic Pitch (de Spotify) solo detecta melodía/tono y no puede transcribir batería. Por eso Drumly usa ADTOF, un modelo entrenado específicamente para reconocer golpes de batería.
- Python 3.11 (el stack de ML aún no es estable en 3.13).
- LilyPond (motor de grabado de partituras).
- ffmpeg (para que Demucs pueda leer MP3).
# Crear y activar un entorno virtual con Python 3.11
py -3.11 -m venv .venv # Windows
# python3.11 -m venv .venv # macOS / Linux
# Activar
.venv\Scripts\activate # Windows (PowerShell/CMD)
# source .venv/bin/activate # macOS / Linux
pip install -r requirements.txtADTOF-pytorch no está en PyPI; se instala desde su repositorio. Trae los pesos del modelo incluidos y solo depende de torch/librosa/pretty_midi:
pip install git+https://github.com/xavriley/ADTOF-pytorch.git- Windows:
winget install LilyPond.LilyPond(recomendado, versión estable 2.24), o descargar desde https://lilypond.org/download.html. Si tienes una instalación que no arranca, define la variableDRUMLY_LILYPONDcon la ruta a unlilypond.exeque funcione, o desinstala la rota. - macOS:
brew install lilypond(o el binario de https://lilypond.org/macos-x.html). - Linux (Debian/Ubuntu):
sudo apt install lilypond
Comprueba que funciona: lilypond --version.
- Windows: https://www.gyan.dev/ffmpeg/builds/ (añadir al
PATH) owinget install ffmpeg. - macOS:
brew install ffmpeg. - Linux:
sudo apt install ffmpeg.
python main.py- Pulsa Seleccionar archivo y elige un MP3 o WAV.
- (Opcional) Marca Mostrar silencios en la partitura si quieres ver los silencios; por defecto está desactivado y solo se muestran las notas tocadas.
- Verás el progreso: Separando instrumentos… → Transcribiendo batería… → Generando partitura…
- Al terminar se abre la pantalla de mezcla:
- Sliders de volumen para Batería y Otros (sin batería), en vivo.
- Play/Pausa, barra de progreso con tiempo y BPM estimado.
- Botón 📄 para abrir la partitura PDF.
- Export → guardar la mezcla de audio (con tus volúmenes), abrir el PDF o abrir la carpeta de la canción.
- Botón 🎯 Practicar en tiempo real → abre una vista grande con la partitura y
un cursor que la sigue mientras suena la batería:
- BPM y compás (2/4, 3/4, 4/4) detectados; ambos se pueden cambiar.
- Al cambiar el BPM, la batería se estira al tempo elegido sin cambiar el tono y el cursor sigue sincronizado.
- Retroceder/avanzar en tiempo real: barra de progreso, clic en la partitura, o los botones ⏮ (al inicio) y ⏪ 5s.
- Sliders de volumen para Batería, Otros y Metrónomo, con los mismos valores que dejaste en el mezclador (útil para guiarte con voces/ instrumentos).
- Metrónomo opcional (con su propio volumen), con casilla "Acentuar 1er tiempo" para marcar más fuerte el inicio de cada compás.
- El cursor compensa la latencia de salida del audio para quedar alineado con lo que suena, a cualquier tempo.
- Tempo real (beat tracking): la partitura, las barras de compás y el metrónomo siguen los pulsos reales de la canción — si la banda acelera o frena (grabaciones en vivo), la notación no se desfasa.
- Anclaje manual: pausa donde de verdad empieza el compás 1, pulsa 📍 Marcar aquí el inicio del compás 1 (se ajusta al pulso más cercano), elige el compás (2/4, 3/4, 4/4) y pulsa 📄 Aplicar a la partitura para regenerar el PDF con tu anclaje, sin re-transcribir.
- Cursor centrado: la posición actual queda siempre clavada en el centro de la pantalla (también al hacer clic en cualquier punto de la partitura); la partitura se desplaza por debajo.
- Pulso del metrónomo: Canción (sigue los beats reales detectados) o Manual (escribe un BPM y el click suena a ese ritmo fijo, 20–300).
- El metrónomo y los compases se anclan al primer tiempo detectado de la canción (no al segundo 0), para que el click no quede corrido si hay intro.
- Botón 🔄 Re-transcribir (en la pantalla de mezcla): re-ejecuta la transcripción (ADTOF + BPM/compás/primer tiempo + PDF) sobre los stems ya separados, sin repetir la separación de Demucs. Útil si la transcripción o el metrónomo quedaron desfasados. (El PDF de descarga no cambia; esto es solo para practicar. El compás detectado sí se usa para notar el PDF en 3/4, 4/4, etc.)
Se incluye run_drumly.bat (doble clic para lanzar, con consola para ver errores).
En Windows también puedes crear un acceso directo en el escritorio que apunte a
.venv\Scripts\pythonw.exe con argumento main.py y carpeta de trabajo el
proyecto (así se lanza sin ventana de consola).
Los archivos se guardan en output/ con el nombre de la canción:
cancion_drums.wav, cancion_drums.mid, cancion_partitura.pdf.
Drumly/
├── main.py # Punto de entrada (lanza la UI)
├── ui/app.py # Ventana CustomTkinter
├── pipeline/
│ ├── separator.py # Demucs: audio -> _drums.wav
│ ├── transcriber.py # ADTOF: _drums.wav -> _drums.mid
│ └── score.py # music21 + LilyPond: _drums.mid -> _partitura.pdf
├── output/ # Archivos generados
├── requirements.txt
└── README.md
- Demucs detecta automáticamente si hay GPU (CUDA); si no, usa la CPU.
- La separación es pesada y se ejecuta en un hilo aparte para no congelar la interfaz.
- La partitura usa clave de percusión, compás 4/4 y sin armadura.
- La transcripción automática no es perfecta: el MIDI/partitura puede necesitar ajustes manuales en un editor (MuseScore, etc.).