2012-05-23 12 views
7

Sto lavorando con binaural beats e sto provando a creare un'applicazione Java in grado di riprodurre due suoni allo leggermente diverse frequenze ... circa 25-30Hz di differenza.In Java, c'è un modo per sintetizzare un tono di una frequenza specifica?

In un mondo perfetto, mi piacerebbe fornire a Java due ingressi interi, ad esempio 440 e 410, e Java riprodurre un tono a 440 Hz e un tono a 410Hz.

Dato quello che ho visto nelle classi javax.sound.*, sembra che Java supporti solo l'equivalente di note di pianoforte ... A4 a 440Hz, quindi A-sharp-4 a 466.164Hz e nell'altra direzione, G -sharp-4 @ 415.305Hz. Mentre "adiacenti" sono generalmente all'interno dell'intervallo per produrre un battito binaurale, sto cercando di ottenere un maggiore controllo sulla frequenza dei miei toni.

Dal sintesi audio semplice non è altro che la frequenza, l'intensità e la durata-di-tempo, sarebbe appare a me che da qualche parte nelle viscere delle javax.sound.* classi, c'è un qualche tipo di ricerca che dice che quando dico Java per suonare "A4", cioè 440Hz. La domanda diventa se c'è un modo per hackerare quel tavolo per dire che "A4.1" è l'equivalente di 449Hz.

Sono stato a scherzo con javax.sound.midi, non ho ancora esplorato javax.sound.sampled; sembra che avrei bisogno di campionare i miei toni per usare le classi sampled; Preferisco sintetizzare. Guidami bene se mi sbaglio.

La maggior parte delle interfacce di terze parti che ho visto sono orientate specificamente alla produzione e alla manipolazione della musica e, come tali, sono limitate nella loro capacità di lavorare con i microtones. Qualcuno ha qualche esperienza o raccomandazioni per una soluzione?

+0

Si sta utilizzando 'javax.sound.midi' o' javax.sound.sampled'? –

+0

@LaurenceGonsalves Ho giocato con 'midi', non ho ancora esplorato' sampled'; sembra che avrei bisogno di campionare i miei toni per usare le classi 'sampled'; Preferisco sintetizzare. Guidami bene se mi sbaglio. – dwwilson66

+0

Non mi aspetterei che midi fornisca quasi quel controllo a grana fine. È più inteso come interfaccia di controllo tra diversi dispositivi e ha un numero limitato di note disponibili. –

risposta

5

È possibile generare campioni e inviarli alla scheda audio utilizzando le classi in javax.sound.sampled.*; fondamentalmente creare un oscillatore software.

Si richiede una certa conoscenza, ma può essere davvero divertente quando si arriva a farlo funzionare;)

stavo giocando con questi classificati quando ho creato questo: http://bobusumisu.net/testing/bobusynth-alpha1/

Ecco il tutorial che mi abbia fatto iniziare : http://www.drdobbs.com/jvm/230500178

+0

Neat synth app! javax.sound.sampled è sicuramente la strada da percorrere. Grazie per il link tutorial, non vedo l'ora di leggerlo in dettaglio. A proposito, quando ho suonato il synth, mi sono "bloccato" all'onda triangolare. Le altre manopole hanno funzionato bene per me però. –

4

Questo è solo per completare la risposta già fornita e accettata (che ho dato un +1).

È possibile utilizzare wavetables come alternativa all'esecuzione di funzioni di trigger al volo - una sorta di metà campionata/metà sintetizzata. Uso anche una tavola sinusoidale con sei cursori indipendenti che puntano verso di essa per la sintesi FM, e ho duplicato diverse patch Yamaha DX7 in questo modo. Ma tutto questo è stato fatto tramite javax.sound.sampled. Una volta che è stato creato un soft-synth, è possibile controllarlo con le classi della libreria midi.

Diciamo che si popola un array 1K con float per una singola onda sinusoidale.

Se si "riproduce" la tabella delle onde incrementandola e scorrendola attraverso di essa ed estraendo a turno ciascun membro della matrice (per scrivere sulla scheda audio tramite una SourceDataLine), si otterrà un pitch direttamente correlato alla frequenza di campionamento. Per 44100 campioni al secondo, l'array di 1024 membri ciclerà 44100/1024 = 43.066 ... volte per riempire quel "secondo" con i dati (un tono molto basso - circa 43 Hz). Se salti ogni secondo membro del tavolo, il tono è doppio, ecc.Per ottenere l'intonazione 440, è necessario trovare il corretto "incremento" da utilizzare per scorrere l'array della tabella wave, che può essere trovato: incr = (dimensione della tabella d'onda * altezza desiderata)/frequenza di campionamento

Ad esempio (1024 * 440)/44100 restituisce un incremento di: 10.21678 ... Quindi, se il primo valore della waveTable è nella posizione dell'array 0, il secondo valore da utilizzare sarà tra le posizioni 10 e 11. Per ottenere un valore che si trova tra due posizioni di matrice, utilizzare l'interpolazione lineare.

Io uso questo metodo, con le librerie javax.sound.sampled, per un "Theremin" a questo link. È visualizzata una tastiera, ma puoi facilmente sentire/vedere il controllo microtonale mentre muovi il mouse sui tasti.

http://www.hexara.com/VSL/JTheremin.htm

In quanto sopra, la posizione del mouse (chiamato tramite MouseMotionListener) viene utilizzato per calcolare il passo desiderato tramite questa funzione:

return Math.pow(2, ((mouseX + tuningLoc)/(octaveWidth))); 

dove octaveWidth è il numero di pixel che copre un'ottava.

+0

@philfreihofer - svenimento. Suono un theremin e sto cercando di hackerare un sensore di movimento xbox kinect per creare input per un software theremin. Questo link è solo per le rocce. Mi hai dato qualcosa per scherzare con questo fine settimana. Anche la tavola ondulata è un'idea interessante. :) – dwwilson66

+0

Felice di sentire che ti stai godendo il link! : D Devo menzionare, ci sono alcune complicazioni nella gestione di un flusso di eventi quando si controllano il volume/pitch che non ho completamente "risolto" - ma l'implementazione è ancora abbastanza buona in termini di reattività. (Java non fornisce garanzie "in tempo reale"). Sono felice di fornire maggiori informazioni quando arrivi. Abbastanza fico che tu abbia e giochi a Theremin! Sei il primo giocatore di Theremin a darmi feedback, e sono felice di ascoltare i suggerimenti. –