La gamme de Shepard: une illusion auditive
Créez une illusion auditive.
In[1]:=

range = 12;
duration = 10;
lfoFreq = .05;
basePitch = 30;
numOsc = 8;
midiToFreq[m_] := 2^((m - 69)/12)*440.
Générez des rampes d'accès pour contrôler les fréquences et les amplitudes des oscillateurs.
In[2]:=

phasors =
Table[AudioGenerator[{"Sawtooth", lfoFreq, 2. Pi/numOsc (i - 1.)},
duration, SampleRate -> 500]/2. + .5, {i, numOsc}];
AudioPlot[phasors, PlotLayout -> "Overlaid", PlotRange -> All]
Out[2]=

Créez des fréquences qui permettront de contrôler les oscillateurs. Les fréquences sont séparées exactement une octave les unes des autres et augmentent exponentiellement, de sorte que la tonalité augmente de façon linéaire.
In[3]:=

freqs = Table[
midiToFreq[(phasors[[i]])*12*numOsc + basePitch], {i, numOsc}];
AudioPlot[freqs, PlotLayout -> "Overlaid", PlotRange -> All]
Out[3]=

Créez des amplitudes qui contrôlent les oscillateurs. Les amplitudes vont à 0 lorsque les fréquences chutent à la valeur minimale.
In[4]:=

amps = Cos[#*Pi - Pi/2.] & /@ phasors;
AudioPlot[amps, PlotLayout -> "Overlaid", PlotRange -> All]
Out[4]=

Affichez la relation entre la fréquence et l'amplitude d'un oscillateur.
In[5]:=

AudioPlot[AudioNormalize /@ {freqs[[2]], amps[[2]]}, PlotRange -> All]
Out[5]=

Combinez une banque d'oscillateurs en utilisant les fréquences et les amplitudes créées.
In[6]:=

res = Mean[
Table[amps[[i]] AudioGenerator[{"Sin", freqs[[i]]}], {i, numOsc}]]
In[7]:=

Spectrogram[res, 8192, 4096, HannWindow,
PlotRange -> {All, {0, 10000}}, ImageSize -> Medium]
Out[7]=
