Técnico

Flash 10 – Dynamic Sound Generation – II

Olá pessoal, essa é o segundo post da sequência de três partes sobre Dynamic Sounds no Flash Player 10. Veja aqui a primeira parte da sequência. A idéia inicial era fazer um grande screencast explicando como gerar sons dinâmicos e as novas features da API de som, mas enquanto estava criando o screencast concluí que o conteúdo seria melhor entendido se fosse escrito. Da mesma forma que a tesoura não serve para pregar mas para cortar e o martelo não serve para cortar mas para pregar, creio que um screencast, pelo seu caráter visual, serve muito bem para demonstrar um sistema ou detalhar o funcionamento de uma classe em Actionscript 3.0 mas não serve tão bem para demonstrar conceitos abstratos, pois estes necessitam imaginação. Logo abaixo, está o download da classe utilizada para gerar sons dinâmicos no Flash 10.

Imaginem agora, eu tentando explicar em um screencast essa fórmula: 🙂

Fórmula básica da onda senóide
y(t) = A * seno(2 * π * F * t + f);

sendo:

A → A amplitude máxima da onda.
π → o número PÍ (3,14….);
F → A frequência da nossa onda.
t → o tempo, que pode ser em segundos(s), milissegundos(ms) etc.
f → a fase da nossa onda que no nosso caso é sempre zero.

Pois bem, a API de som do Flash Player 10 utiliza ByteArray para guardar em buffer o som manipulado. Se o nosso objeto Sound (flash.media.Sound) não carregou nenhum arquivo de audio (wav, mp3, midi etc.) o Sound Object vai disparar um evento(flash.events.SampleDataEvent) do tipo SAMPLE_DATA de tempos em tempos, sempre que ele precisar de uma nova amostra de som. As amostras de som guardadas em buffer pelo objeto variam entre 0.3 e 0.5 segundos. Portanto o objeto dispara esse evento aproximadamente 2 vezes e meia por segundo.

Capturamos este evento com uma função handler:

Esta função captura o evento gerado e aplica a formula acima para gerar os dados do som preenchendo o ByteArray.

private function sineWaveGenerator(event:SampleDataEvent):void
{
//bitRate do Flash Player
var bitrate:Number = 44100;
var samplesQuantity:Number = 4500;

var frequenciaAngular:Number = frequencia/bitrate;
var sample:Number;

for (var t:Number=0; t

O ByteArray é preenchido com números que indicam a oscilação de onda sonora. Por isso a necessidade de usar a formula básica da onda senóide para cria-los. A nova Sound API do Flash 10 pega esses números e transforma-os no som que ouvimos quando colocamos esse algoritmo para funcionar.

Simplificando a função:

A frequência (Hz):
Precisamos da frequência da nota musical que queremos tocar e, como o Flash Player utiliza o bitrate de 44100 Hz (maior qualidade), precisamos dividir a frequência(por exemplo 440 Hz para o Lá do piano) pelo bitrate do flash. Assim obtemos a Frequência Angular e utilizamos ela para o cálculo na formula.

O ByteArray e a quantidade de Samples:
O ByteArray é preenchido com números que indicam a oscilação de onda sonora. Por isso a necessidade de usar a formula básica da onda senóide para cria-los. A nova Sound API do Flash 10 pega esses números e transforma-os no som que ouvimos quando colocamos esse algoritmo para funcionar. Outro detalhe importante é que o ByteArray é preenchido de dois em dois samples. Um é o lado esquerdo, o outro é o lado direito do som Stereo.

O tempo:
A variação espacial da onda sonora acontece em função do tempo. O tempo no nosso exemplo está diretamente ligado a quantidade de Samples dentro do ByteArray, de maneira que o objeto Sound vai “espalhar” os samples em um espaço de 0.3 até 0.5 segundos que é o tamanho do buffer para sons gerados. Por isso os 'estalos' acontecem com quantidades de samples muito pequenas.

O “event.position”:
De maneira geral, o event.position representa a posição atual na linha do tempo do som em execução. Ele pode ser usado como uma “compensação” para a latência, (entenda, a comunicação entre a placa mãe e a placa de som), somando-o com o tempo, modificando em tempo de execução a quantidade de Samples no ByteArray. Isto também está relacionado com os possíveis 'estalos' do som.

Pois bem, na terceira parte da sequência vamos ver alguns usos interessantes para a nova API de som do Flash Player 10.

Deixo aqui o download da classe NotesPlayer que criei com o algoritmo pronto para usar e o link para o projeto no google.code, com o objetivo de criar um suporte para músicos, com mapas de acordes e varios usos para a API de som.

Até!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Compartilhe isso: