# Teclado de piano

> Un teclado de piano clicable para sintetizadores en Python — glissando, velocidad, notas encendidas desde MIDI o un secuenciador y teclas del ordenador para tocar.

Source: https://albakore.github.io/pyzed/es/audio/components/piano/

(Image: Un teclado de cuatro octavas iluminando una progresión de acordes y un arpegio)

**En pocas palabras:**

Un teclado que se toca con el ratón: haz clic en una tecla para tocar una nota y arrastra por las
teclas para deslizarte de una a otra. Las notas que llegan de fuera (un teclado MIDI, un
secuenciador) se iluminan.

```python
from pyzed import audio, ui

engine = audio.Engine()
synth = engine.add("midi_in")  # las notas de note_on/note_off llegan a los módulos midi_in
...

ui.audio.Piano(start=48, octaves=3, pressed=sorted(self.held),
               on_note_on=lambda e: engine.note_on(e.value.note, e.value.velocity),
               on_note_off=lambda e: engine.note_off(e.value))
```

## Notas y velocidad

Las notas son números MIDI: 60 es el do central (C4) y 69 el la de 440 Hz. `note_on` entrega un
`Note(note, velocity)`; cuanto más abajo de una tecla haces clic, más fuerte suena (velocidad de 30
a 127). `note_off` entrega el número de nota. Al arrastrar por las teclas se suelta una y se pulsa
la siguiente.

`ui.audio.note_name(61)` devuelve `"C#4"`, útil para etiquetas.

## Tocar con el teclado del ordenador

`ui.audio.KEYBOARD` asigna teclas a semitonos como la mayoría de apps de música: la fila
`a s d f g h j k` son las teclas blancas y `w e t y u o p` las negras.

```python
def on_key(self, combo):
    if combo in ui.audio.KEYBOARD and combo not in self.keys:
        self.keys.add(combo)
        note = self.octave * 12 + ui.audio.KEYBOARD[combo]
        engine.note_on(note)

def on_key_up(self, key):
    if key in self.keys:
        self.keys.discard(key)
        engine.note_off(self.octave * 12 + ui.audio.KEYBOARD[key])
```

| Propiedad | Por defecto | Qué hace |
| --- | --- | --- |
| `start` | `48` | La primera nota (redondeada hacia abajo a un do). |
| `octaves` | `2` | Cuántas octavas (más el último do). |
| `pressed` | `()` | Notas que se iluminan, tocadas desde fuera. |
| `color` | `"accent"` | Color de las teclas pulsadas. |
| `key_width`, `height` | `24`, `110` | Tamaño de una tecla blanca. |
| `labels` | `True` | Escribe el nombre de cada do. |

Eventos: `on_note_on` (`Note(note, velocity)`), `on_note_off` (el número de nota).
