Python-Organ : Petit aperçu du prototype avec seulement deux générateurs de fréquences


Le Github Python-Organ a été mis à jour avec un premier code de test MicroPython exploitant deux générateurs de fréquences AD9833 (sur les 4 prévues à l'origine... j'attends la livraison des autres).

Source: Python-Organ
Et dans l'attente d'une vidéo avec du son... parce que le son est bon... je vous propose de jeter un coup d'oeil sur le code disponible dans GitHub.

Comment cela fonctionne t'il?
Pour commencer, deux classes Organ et Keyboard.
  • Organ s'occupe de gérer les notes à jouer sur les différents générateurs de fréquence disponibles.
  • Keyboard s'occupe de gérer la détection d'activation/désactivation des entrées sur le capteur capacitif.

Le coeur du script est relativement simple
La fonction  keyboard_changed() est appelée par la classe Keyboard lorsqu'une entrée est activée/désactivée sur le MPR121 (capteur capacitif).
Ses paramètres sont:
  • key pour la touche activée/pressé ou relâchée. Le paramètre key est un entier entre 0 et 11.
  • pressed pour indiquer si la touche est pressée/relâchée.
Une fois la touche convertie en note (entre A et G, notation impériale), il suffit de demander l'orgue de jouer la note en question avec organ.play_note(note) .

from ad9833 import AD9833, MODE_SINE
from mpr121 import MPR121
from machine import Pin, SPI, I2C

# Notes = Key,Frequency
# 523.25, 587.33, 659.26, 698.46, 783.99, 880, 987.77, 1046.50
NOTES = { 'C':523, 'D': 587, 'E':659, 'F':698, 'G':784, 'A':880, 'B':988, 'C1': 1046 }
# Keys = correspondance between KEY index and corresponding note
KEYS = ['C','D','E','F','G','A', 'B', 'C2']

class Organ:
    pass

class Keyboard:
    pass

# Create SPI bus for AD9833
spi = SPI(2, baudrate=9600, polarity=1, phase=0)
i2c = I2C(2)

# create organ & add voices
organ = Organ( spi=spi, debug=True )
organ.add_voice( "Y3" )
organ.add_voice( "Y4" )
organ.clear_all()

def keyboard_changed( key, pressed ):
   """ This will be called when a key is pressed or released """
   global organ
   # Key from 0 to 7 are for corresponding notes in NOTES
   if 0<= key <= len(KEYS):
      # Transform key index into Note letter
      note = KEYS[key]
      if pressed:
         organ.play_note(note)
      else:
         organ.clear_note(note)

# Create the keyboard
keyb=Keyboard( i2c=i2c, debug=True )
keyb.on_key_change = keyboard_changed
while True:
   keyb.update()

Et comme le mode debug est activé sur les classe Keyboard et Organ, il est possible de voir les message "Key Pressed", "Key release" ainsi que les "Play note" et "clear note" sur l'orgue.
"Play Note" mentionne la broche de chip_select utilisée, ce qui identifie le générateur de signal automatiquement sélectionné par la classe Organ.

Key 0 is PRESSED
Play note C on Y3 @ 523 Hz
Key 0 is Released
Clear note C on Y3
Key 0 is PRESSEDD on Y3 @ 587 Hz
Key 1 is Released
Clear note D on Y3
Key 1 is PRESSED
Play note D on Y3 @ 587 Hz
Key 1 is Released
Clear note D on Y3
Key 0 is PRESSED
Play note C on Y3 @ 523 Hz
Key 0 is Released
Clear note C on Y3
Key 0 is PRESSED
Play note C on Y3 @ 523 Hz
Key 0 is Released
Clear note C on Y3
Key 1 is PRESSED
Play note D on Y3 @ 587 Hz
Key 1 is Released
Clear note D on Y3

Ressource
Dépôt Github avec le code Python-Organ .

Liste d'achat

Aucun commentaire