2016-04-22 22 views
6

Sto cercando di ricreare l'intera gamma di una chitarra utilizzando solo 6 clip audio.Rapporto di frequenza e intonazione per AudioClip - Unity3D

Stavo pensando che ci sarebbe stato un modo per impostare la frequenza di una clip audio ma la frequenza audio restituisce solo la frequenza dell'audio in base al formato di compressione e non al tono effettivo.

So che posso leggere GetSpectrumData, ma quella soluzione è piuttosto complessa e richiederebbe un'analisi di Fourier Transform o qualcosa del genere.

Influendo sul tono, è facile modificare il tono in modo da poter andare su e giù ma c'è un modo per capire quali sono i passaggi da utilizzare.

void Update() 
{ 
    CheckAudio(KeyCode.Q, 1.0f); 
    CheckAudio(KeyCode.W, 1.1f); 
    CheckAudio(KeyCode.E, 1.2f); 
    CheckAudio(KeyCode.R, 1.3f); 
    CheckAudio(KeyCode.T, 1.4f); 
} 

void CheckAudio(KeyCode key, float pitch) 
{ 
    if (Input.GetKeyDown (key)) 
    { 
     audio.pitch = pitch; 
     audio.Play(); 
    } 
} 

Posso sentire che non suona bene.

Conoscendo il tono iniziale E4 329,63Hz con passo a 1 c'è qualche equazione che influisce sul tono, otterrei il prossimo tasto F4 349,23Hz (o abbastanza vicino)?

Si deve considerare anche che Unity AudioSource limita il pitch nell'intervallo -3/3 (che ritengo sia più che necessario).

MODIFICA: Aggiunta di alcune ricerche personali. Sembra che l'intonazione 1 sia la nota iniziale e l'impostazione a 2 dia la stessa chiave un'ottava più alta.

Poiché una scala cromatica (tutte le note in bianco e nero sul piano) è di 12 tasti, presumo che l'utilizzo di 1/12 per ogni passaggio dovrebbe farlo.

Sembra vicino, ma mi è caduto non è giusto. Ecco il nuovo codice:

[SerializeField] private AudioSource audio; 
float step = 1f/12f; 
KeyCode[]keys = new KeyCode[]{ 
    KeyCode.Q, KeyCode.W,KeyCode.E,KeyCode.R,KeyCode.T, 
    KeyCode.Y, KeyCode.U, KeyCode.I, KeyCode.O, KeyCode.P, 
    KeyCode.A, KeyCode.S, KeyCode.D 
}; 

void Update() 
{ 
    float f = 0.0f; 
    foreach (KeyCode key in keys) 
    { 
     CheckAudio(key, f); 
     f += 1f; 
    } 
} 

void CheckAudio(KeyCode key, float pitch) 
{ 
    if (Input.GetKeyDown (key)) 
    { 
     audio.pitch = 1f + pitch * step; 
     audio.Play(); 
    } 
} 

risposta

5

cosa si sta cercando di fare la volontà non lavoro ben semplicemente cambiando il passo dell'audio. Cambiando il tono, ti imbatterai in altri problemi, come il suono che termina troppo velocemente o che richiede più tempo per finire e il suono non sarà buono neanche.

La prima soluzione di è quello di fare un plugin (sintetizzatore) in C++ che legge il file audio da l'Unità e cambiare la frequenza. Dovrebbe anche eseguire altre azioni per risolvere i problemi di velocità. Questo è molto complicato a meno che tu non sia un ingegnere audio con delle ottime capacità matematiche. E provare questo su un dispositivo mobile è tutta un'altra storia. OnAudioFilterRead è una funzione da utilizzare se si decide di utilizzare questo metodo.

Il secondo e la raccomandato soluzione è quella di creare un file audio per ogni chitarra chiave poi metterli in una matrice di audioClip. Questo risolve ogni altri problemi. Il lato negativo è che avrete più file.

EDIT:

Se non si preoccupano che sia perfetto, è possibile utilizzare qualcosa di sotto di questo bel ragazzo sul internet.

void playSound(){ 
    float transpose = -4; 
    float note = -1; 
    if (Input.GetKeyDown("a")) note = 0; // C 
    if (Input.GetKeyDown("s")) note = 2; // D 
    if (Input.GetKeyDown("d")) note = 4; // E 
    if (Input.GetKeyDown("f")) note = 5; // F 
    if (Input.GetKeyDown("g")) note = 7; // G 
    if (Input.GetKeyDown("h")) note = 9; // A 
    if (Input.GetKeyDown("j")) note = 11; // B 
    if (Input.GetKeyDown("k")) note = 12; // C 
    if (Input.GetKeyDown("l")) note = 14; // D 

    if (note>=0){ // if some key pressed... 
     audio.pitch = Mathf.Pow(2, (note+transpose)/12.0); 
     audio.Play(); 
} 

EDIT: Per coloro che sono interessati a perché l'equazione Mathf.Pow viene utilizzato e lavorare, leggere quanto segue: https://en.wikipedia.org/wiki/Twelfth_root_of_two

+0

Sì ho pensato della seconda soluzione, ma è stata la scansione se ci sarebbe stato un altro approccio programmatico per evitare gli svantaggi che hai citato. Ora che lo porti, potrebbe essere richiesto il fatto che il suono sia più breve mentre si sale. Pensando ad una chitarra, quando si sale la tastiera, la corda è più corta e risuona anche meno a lungo. Poiché si tratta di un progetto di ricerca personale, immagino che andrò con una soluzione non del tutto perfetta. Grazie comunque. – Everts

+0

@Everts Se non ti importa di quanto sia perfetto, puoi provare quel codice dall'Edit appena creato. Non è da parte mia, ma ho messo un link da dove proviene. Penso che sia l'equazione che stai probabilmente cercando. – Programmer

+0

Va bene, la modifica è in realtà più che abbastanza vicina. Mi sto confrontando con un pianoforte online e va bene. Grazie mille per quello. – Everts