Sto cercando un algoritmo universale che modifichi il pitch e il tempo mantenendo la frequenza di campionamento. (Sto provando a programmare un generatore di suoni (seno, triangolo ...) come esercizio)
Voglio solo spremere insieme i campioni del suono in modo che appaia più corto e più alto.
È facile se vuoi accelerarlo con un bel numero come 2 (lascia fuori ogni secondo campione) ma cosa succede se vuoi accelerarlo di 2,5?
Qualcuno può nominare un algoritmo per questo? (preferibilmente in C ++, ma anche altri linguaggi vanno bene)
( Ho trascorso gli ultimi 30 minuti a scrivere un algoritmo che calcola la media dei decimali di un numero (come la media di ogni 2,5 numeri). Poi ho capito che è totalmente inutile quindi per favore aiutaci )
Questo approccio ha senso ?: (Aggiungerà pseudocodice a breve)
N is the amount of the pitch
Divide the index of every sample of the sound by N (2/2.8=0.71; 3/2.5=1.07)
For every whole number, compute the distances to the next samples (0.29; 0.07)
Value portions of distance (1-(0.29/0.36)=19%; 1-(0.07/0.36)=81%
New number (New Sample = (19%*SampleA + 81%*SampleB)/2)
Codice:
byte[] input;
double f = factor;
byte[] output = new byte[ceil(input / f)];
output[0] = input[0]
for(int i = 1; i < output.length) {
output[i] = (input[floor(i*factor)] + input[ceil(i*factor)]) / 2;
}