# Guia de MIDI

## Reproducir archivo MIDI

```python
from basskit.dlls.bassmidi import bassmidi
from basskit.dlls.bass import bass
from basskit.constantes.addons import *
from basskit.estructuras.addons import BASS_MIDI_FONT, HSOUNDFONT
import ctypes

bass.BASS_Init(-1, 44100, 0, 0, None)

# Cargar soundfont SF2
sf2 = bassmidi.BASS_MIDI_FontInit(b"soundfont.sf2", 0)

# Crear stream MIDI desde archivo
stream = bassmidi.BASS_MIDI_StreamCreateFile(0, b"archivo.mid", 0, 0, 0, 44100)

# Asignar soundfont
font = BASS_MIDI_FONT()
font.font = sf2
font.preset = -1  # Todos los presets
font.bank = 0
bassmidi.BASS_MIDI_StreamSetFonts(stream, ctypes.byref(font), 1)

# Cargar samples
bassmidi.BASS_MIDI_StreamLoadSamples(stream)

# Reproducir
bass.BASS_ChannelPlay(stream, 0)

# ... esperar ...

bass.BASS_StreamFree(stream)
bassmidi.BASS_MIDI_FontFree(sf2)
bass.BASS_Free()
```

## MIDI en tiempo real

```python
# Crear stream MIDI sintetizado
stream = bassmidi.BASS_MIDI_StreamCreate(16, 0, 44100)  # 16 canales

# Enviar evento: Note On, canal 0, nota C4 (60), velocidad 100
bassmidi.BASS_MIDI_StreamEvent(stream, 0, MIDI_EVENT_NOTE, 60 | (100 << 8))

# Cambiar programa a Piano (0)
bassmidi.BASS_MIDI_StreamEvent(stream, 0, MIDI_EVENT_PROGRAM, 0)
```

## Marcadores MIDI

```python
from basskit.estructuras.addons import BASS_MIDI_MARK

marca = BASS_MIDI_MARK()
bassmidi.BASS_MIDI_StreamGetMark(stream, BASS_MIDI_MARK_LYRIC, 0, ctypes.byref(marca))
if marca.text:
    print(marca.text.decode("utf-8"))
```
