Estoy diseñando un afinador de guitarra acústica basado en MCU. He roto el espectro de frecuencias de la nota C2 (65.41 Hz) a la nota C5 (523.25 Hz) en muchas subbandas para darle al usuario una descripción precisa de la nota que está pulsando. La letra de la nota, el número y una indicación de si están ligeramente afilados, ligeramente planos o bien afinados aparecerán en una pantalla LCD.
El problema es que no puedo ver una manera de evitar una cadena masiva if-else para determinar en qué banda se encuentra la frecuencia de entrada. Tengo 66 casos de 'else if ()', y esto me parece muy lento / ineficiente / tonto. Necesito saber qué nota han tocado y enviarla a la pantalla LCD antes de que llegue el siguiente pulso. En la frecuencia más alta, esto me da un poco menos de 2 ms. El simple hecho de registrar 32 bits en serie para el controlador LCD consume una cantidad decente de esos 2 ms, por lo que debo averiguar en qué banda se encuentra la frecuencia con bastante rapidez. ¿Puedo hacer algo para mejorar el software y evitar una cantidad ridícula de declaraciones if-else?
Editar para más información:
Estoy programando en C en un AVR ATmega. Para asociar una frecuencia con una nota, estoy usando la fórmula: frecuencia = 440 * 2 ^ (x / 12), donde x es el número de medios pasos alejados de A4 (440 Hz). Una entrada está bien sintonizada si está dentro de +/- 0.25 medios pasos desde su frecuencia central. Se considera plano si está a menos de 0.25 medios pasos desde el centro pero más de 1 medio paso desde el centro (donde los medios pasos son negativos con respecto al centro). Es agudo si está a más de 0.25 pasos intermedios desde el centro pero a menos de 1 paso medio desde el centro (donde los medios pasos son positivos con respecto al centro).
Por ejemplo:
G2 plano = [92.5 Hz, 96.6 Hz]
G2 bueno = [96.6 Hz, 99.4 Hz]
G2 sharp = [99.4 Hz, 103.8 Hz]
Donde la frecuencia central de G2 es 98 Hz.