Inspirado pelo vídeo do minute physics decidi fazer esse mini projeto para mostrar como fazer projetos envolvendo faixas de som audíveis no próprio navegador, totalmente em python através do Jupyter Notebook.

Para isso, vamos usar o espectro do átomo de hidrogênio, e vamos fazer um shift linear nele para dentro do espectro audível de frequências sonoras. O nome dado a esse processo é sonificação, você pode usar o link para saber mais caso se interesse.

%matplotlib inline
from __future__ import division, print_function, absolute_import
import scipy.constants as const
import numpy as np
import scipy

from matplotlib.pyplot import plot
from scipy.io import wavfile
from IPython.core.display import HTML, display
try:
    from IPython.display import Audio
    def wavPlayer(data, rate):
        display(Audio(data, rate=rate))
except ImportError:
    pass
from numpy import sin, pi
rate = 44100 # freq = 44.1 khz
duration = 3 # duração do audio

# função para normalizar o seno na amplitude certa para um arquivo wav 
normedsin = lambda f,t : 2**13*sin(2*pi*f*t)

time = np.linspace(0,duration, num=rate*duration)

Primeiro teste para o wav Player

Para começar, vamos começar tocando algo em 440 Hz

import numpy
import struct 
import warnings 
la    = lambda t : normedsin(440,t)

# plot rápido da onda nos primeiros 25 ms
plot(time[0:1000], la(time)[0:1000])

ampl = la(time).astype(np.int16)

# função que salva o áudio  e toca ele em HTML5
wavPlayer(ampl, rate)

As diferentes frequências emitidas por um átomo de hidrogênio são analiticamente calculadas através da formula de Rydberg:

$$\frac{1}{\lambda} = R \left(\frac{1}{n_1} - \frac{1}{n_2}\right) $$

Como sabemos, essa relação tem um formato muito similar a das freqências emitidas do hidrogênio

$$ f_{n,m} = \frac{c}{\lambda} = \frac{R_h}{h} \left(\frac{1}{n} - \frac{1}{m}\right) $$

Para o caso de $n = 1$ reconhecemos a famosa série de Lyman, e para $n = 2$ a série de Balmer

f0 = const.Rydberg*const.c
print("A maior frequência do hidrogênio é ",f0,"Hz. e corresponde a n = 1, m = ∞")
fshift = 440
print("todavia odemos shiftar o espectro para 440 Hz (A)")
A maior frequência do hidrogênio é  3289841960250880.5 Hz. e corresponde a n = 1, m = ∞
todavia odemos shiftar o espectro para 440 Hz (A)
ryd = lambda n,m : fshift*(1/(n**2) -1/(m**2))
flyman = lambda x : ryd(1,x)
fbalmer = lambda x : ryd(2,x)
ser = lambda t : sum( [normedsin(flyman(i),t)+normedsin(fbalmer(i+1),t) for i in range(2,8)])

# e uma função em forma de vetor para realizar operações em cada um dos seus elementos
serv = scipy.vectorize(ser)
ss= serv(time)
plot(time, ss) 
ss = 2**15*ss/ss.max()
wavPlayer(ss.astype(np.int16),rate)