Spectro é uma biblioteca TypeScript para gerar espectrogramas a partir de dados de áudio (Float32Array).
Ela usa FFT com várias funções janela, possui escala Linear e Mel, colormaps inspirados no Matplotlib, filtros FIR (passa-baixa, passa-alta, passa-banda, rejeita-banda), eixo de frequência e eixo de tempo opcionais, hop size configurável, exportação PNG em alta resolução, além de detecção de pitch e extração de harmônicos.
Recursos
- Geração de espectrograma a partir de single channel Float32Array - Parâmetros flexíveis:
- Taxa de amostragem, faixa de frequência (fMin, fMax)
- Tamanho de FFT, hop size configurável e funções janela (None, Cosine, Hanning, BH7)
- Escala Linear ou Mel (remapeamento real na exibição) - Colormaps customizáveis
- Eixo de frequência e eixo de tempo opcionais (com ticks dinâmicos)
- Altura/largura finais do canvas (com margens dinâmicas quando eixos estão habilitados)
- Ganho (gainDb) e normalização por faixa (rangeDb) ancorada no pico global
- Exportação PNG em alta resolução (upscale configurável)
- Filtros FIR de pré-processamento: lowpass, highpass, bandpass, notch - Pitch Tracking (autocorrelação) e extração de harmônicos - Colormaps exportados e tipados (ex.: hot, jet, viridis, …)
Pré-requisitos
Antes de começar, certifique-se de ter as seguintes ferramentas instaladas:
- Node.js (recomendado versão LTS)
- npm (geralmente vem com o Node.js)
Instalação
Siga as etapas abaixo para configurar o projeto em sua máquina local:
1. Clone o repositório:
``bash
git clone https://github.com/IMNascimento/Spectro.git
` 2. Navegue até o diretório do projeto:
`bash
cd Spectro
` 3. Instale as dependências:
`bash
npm install
`
Configuração do TypeScript:
O arquivo tsconfig.json já está configurado para gerar módulos ES6 e arquivos de declaração (d.ts):
`json
{
"compilerOptions": {
"target": "ES5",
"module": "ES6",
"declaration": true,
"outDir": "./dist",
"strict": true,
"esModuleInterop": true,
"lib": ["dom", "es2015"]
},
"include": ["src/*/"]
}
`
Compilação
Para compilar o código TypeScript e gerar os arquivos JavaScript na pasta dist, execute:
`bash
npm run build
`
API (Visão Geral)
$3
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---:|---|
| sampleRate | number | 44100 | Taxa de amostragem (Hz). |
| scaleType | 'Linear' \| 'Mel' | 'Linear' | Escala vertical. Em Mel, a exibição remapeia a altura do espectrograma para a escala perceptual. |
| fMin | number | 1 | Frequência mínima (Hz). |
| fMax | number | 30000 | Frequência máxima (Hz). |
| fftSize | number | 2048 | Tamanho da FFT (potência de 2). |
| hopSize | number | fftSize/2 | Passo entre frames em amostras. |
| windowType | 'None' \| 'Cosine' \| 'Hanning' \| 'BH7' | 'BH7' | Função janela. |
| colormapName | string | 'hot' | Nome do colormap (precisa existir no window). |
| canvasHeight | number | 500 | Altura do espectrograma (área útil). |
| targetWidth | number | 0 | Largura final desejada; 0 usa window.innerWidth. |
| nTicks | number | 0 | Nº de ticks de frequência (0 = cálculo dinâmico). |
| gainDb | number | 0 | Ganho em dB aplicado ao espectro. |
| rangeDb | number | 80 | Faixa em dB p/ normalização ancorada no pico global. Se 0, usa fallback seguro 80. |
| showFrequencyAxis | boolean | false | Exibe eixo de frequência (adiciona margens laterais). |
| showTimeAxis | boolean | false | Exibe eixo de tempo (adiciona margem inferior). |
| timeTickMinPx | number | 60 | Espaçamento mínimo entre ticks do eixo de tempo (px). |
| filterType | 'none' \| 'lowpass' \| 'highpass' \| 'bandpass' \| 'notch' | 'none' | Tipo de filtro FIR aplicado antes da FFT. |
| filterCutoffs | number[] | [] | Para lowpass/highpass: [cutoff]. Para bandpass/notch: [lowCut, highCut]. |
| enablePitchDetection | boolean | false | Habilita detecção de frequência fundamental (autocorrelação). |
| enableHarmonicsExtraction | boolean | false | Habilita extração de harmônicos (múltiplos inteiros da fundamental). |
$3
- generateSpectrogram(audioData: Float32Array): HTMLCanvasElement Gera e retorna um