Synthese Sonore
Méthode de la lecture de Tables
Le principe est le suivant : à chaque Te, un nouvel échantillon sera fourni par la carte afin de générer un signal de période Twave.
Branchements
Il n’y a rien en entrée de la carte.
Lecture de tous les échantillons de la table
Modification de la période
Si je lis un point sur 2, je double la fréquence du signal :
Le fichier signalTables.h contient une table de 1000 points de sinusoide : int16_t sinus_int[1000].
Q1. Modifier le programme afin de générer un signal sinusoidal de période 1000*Te ( vérifier la fréquence à l’oscilloscope ).
Q2. Même question pour un signal sinusoidal deux fois plus rapide.
Choix de la période de la sinusoide
L’objectif est désormais de pouvoir choisir Twave, période du signal généré.
Il faut donc trouver une relation entre l’évolution de et la lecture du échantillon de la table.
, avec
–>
Mise en Oeuvre
Q3. Modifier le programme afin de générer une sinusoide à une fréquence Fwave réglable.
Génération d’un Signal Carré / Triangle / Dent de Scie
Génération des points de la sinusoïde
gene_signal.py
#!/usr/bin/python
import numpy as np
import matplotlib.pyplot as plt
import sys
from scipy import signal
#=======================================================================
# GENERATION POINTS SINUS - Mise en Forme dans sinus.txt
#=======================================================================
N=20 # Nb points
theta=np.linspace(0.,2*np.pi,N)
print(theta)
SINUS_F32=np.sin(theta)
SINUS_INT=np.round(2**14*np.sin(theta))
print(SINUS_F32)
print(SINUS_INT)
plt.subplot(211)
plt.grid()
plt.plot(theta,SINUS_F32,label="float")
plt.ylabel("$\sin(\Theta)$")
plt.xlabel("$\Theta$")
plt.legend()
plt.subplot(212)
plt.grid()
plt.plot(theta,SINUS_INT,label="int")
plt.ylabel("$\sin(\Theta)$")
plt.xlabel("$\Theta$")
plt.legend()
plt.show()
fd = open("sinus.txt", "a")
fd.truncate(0)
print("float32_t sinus_f32[%d]=\n{" % N, file=fd)
for i in range(N):
print("%f," % SINUS_F32[i], file=fd)
print("};\n", file=fd)
print("int16_t sinus_int[%d]=\n{" % N, file=fd)
for i in range(N):
print("%f," % SINUS_INT[i], file=fd)
print("};\n", file=fd)
fd.close()
Q4. Modifier le programme afin de générer un signal carré puis triangulaire, et enfin dent de scie.
REMARQUE : La fonction python signal.sawtooth permet de générer les points des signaux triangle et dent de scie, la fonction signal.square permet de générer les points d’un signal carré.
Modulation de fréquence avec les signaux Midi
Le tableau float table_freq[200] défini dans le fichier notes.h fait la relation entre le numéro reçu dans un message midi de type note on ou note off et la fréquence de la note correspondante.
Q5. Modifier le programme pour contrôler la fréquence du signal généré à l’aide du clavier maître.