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.

gene_sinus_1.svg

Branchements

Il n’y a rien en entrée de la carte.

branchements_oscillo_synthese.svg

Lecture de tous les échantillons de la table

table_sinus.ods

table_sinus_1.svg

Modification de la période

Si je lis un point sur 2, je double la fréquence du signal :

table_sinus_2.svg

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 θ \theta et la lecture du kieˋme k^{\text{ième}} échantillon de la table.

θ(t+Te)=θ(t)+2.π.(FwaveFe) \theta(t+T_{e})= \theta(t)+2.\pi.(\frac{F_{wave}}{F_{e}}) , avec 0θ2.π 0\leq\theta\leq 2.\pi

gene_sinus_theta.svg

$ \left\{\begin{array}{ll} 0\leq\theta\leq 2.\pi \\ 0\leq k\leq TAILLETABLE-1 \end{array} \right. $

–> k=(TAILLETABLE1)θ2.π k=(TAILLETABLE-1)*\frac{\theta}{2.\pi}

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.