Skip to content

Repository files navigation

🥁 Drumly

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.

¿Cómo funciona?

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.


Requisitos

  • 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).

1. Crear el entorno e instalar dependencias Python

# 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.txt

2. Instalar ADTOF (transcripción de batería)

ADTOF-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

3. Instalar LilyPond (¡imprescindible para el PDF!)

  • 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 variable DRUMLY_LILYPOND con la ruta a un lilypond.exe que 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.

4. Instalar ffmpeg


Uso

python main.py
  1. Pulsa Seleccionar archivo y elige un MP3 o WAV.
  2. (Opcional) Marca Mostrar silencios en la partitura si quieres ver los silencios; por defecto está desactivado y solo se muestran las notas tocadas.
  3. Verás el progreso: Separando instrumentos… → Transcribiendo batería… → Generando partitura…
  4. 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.
  5. 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.
  6. 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.)

Acceso directo

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.


Estructura del proyecto

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

Notas técnicas

  • 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.).

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages