function freq = nota2freq(nota)
%NOTA2FREQ Determina la frequenza di una nota
%
% F = NOTA2FREQ(NOMENOTA);
% 
% Le note vanno espresse secondo la seguente notazione:
%
%   Do4 -> Do centrale
%   Do5 -> Do all'ottava sopra
%   
% Altri esempi: Sol#2, Mib3, Fa##4 (:= Sol4) ...
%
% Il codice non è case sensitive, i.e., 'Sol2', 'sol2, 'SOL2' rappresentano
% tutti la stessa nota.

% Logaritmo della frequenze di riferimento, ovvero quella del do centrale
freq = log2(220) + 1 / 4;

%Separiamo il nome della nota da diesis e ottave
leggendo_nome_nota = true;
octave = 0;
nome_nota = "";
sharps = 0; flats = 0; % Numero di diesis o bemolle
for j = 1 : length(nota)
    if leggendo_nome_nota
        if nota(j) < 65 || nota(j) > 122
            leggendo_nome_nota = false;
            nome_nota = nota(1 : j - 1);
        end
    end
    
    if ~leggendo_nome_nota
        switch nota(j)
            case '#'
                sharps = sharps + 1;
            case 'b'
                flats = flats + 1;
            otherwise
                octave = textscan(nota(j:end), '%f'); 
                octave = octave{1} - 4;
                break;
        end     
    end
end

% Aggiustiamo la frequenza con l'ottave
freq = freq + octave;

% Aggiungiamo eventuali diesis o bemolle
freq = freq + (sharps - flats) / 12;

% E infine regoliamo la frequenza in base alla posizione nella scala
switch lower(nome_nota)
    case 'do'
    case 're'
        freq = freq + 2 / 12;
    case 'mi'
        
        freq = freq + 4 / 12;
    case 'fa'
        
        freq = freq + 5 / 12;
    case 'sol'
        
        freq = freq + 7 / 12;
    case 'la'
        
        freq = freq + 9 / 12;
    case 'si'
        
        freq = freq + 11 / 12;
    otherwise
        error('Nome nota non supportato');
end
    

% Calcoliamo 2^freq
freq = pow2(freq);

end

