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();
}
}
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
@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
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