Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Usei o prompt e deu NaN

Estava tudo funcionando, eu atribuia o nome da nota, ela era substituida pelo valor e fazia o cálculo, mas usando a função prompt e no Chrome responder qual é a nota, ele não substitui pelo valor da nota, como eu resolvo isso?

<mata charset = "UTF-8">

    <h3> Cálculo Frequência </h3>

<script>

function mostra(texto) {
    document.write(texto);
    document.write("<br><br>");
 }


 constante = 1.0594630943592953
 // 1.0594630943592953
 // 1.05946284

function calculaFrequencia(f1,n) {

    //fórmula da escala temperada, f1 é frequencia inicial, f2 é frequencia final, n é a quantidade de semitons entre a nota inicial e a final.

    return f1 * (Math.pow(constante, n));
}


function calculaOitava(x) {

    //Considerando lá 440, se o registro 4 é 440, o registro 3 é 220 e o registro 2 é 110. Logo a função do registro é: registro(n) = frequencia * 2 ^ (n - 4)

    return frequenciaBase * Math.pow(2, (x - 4));
}


//intervalo em semitons em referência ao lá

dó   = 0
réb  = 1
ré   = 2
mib  = 3
mi   = 4
fá   = 5
solb = 6
sol  = 7
láb  = 8
lá   = 9
sib  = 10
si   = 11



// A referência é o Lá. O registro é qual oitava está a nota, exemplo, no Lá4 o registro é 4. A referência do registro é Lá4 = 440 (ou 442).

//exemplo:
    //afinação = 440
    //nota = mi
    //registro = 3

var afinacao = parseInt(prompt ("Qual afinação do lá? Exemplo (440 ou 442)"));
var nota = prompt ("Qual nota? dó, réb, ré, mib, mi, fá, solb, sol, láb, lá, sib ou si?");
var registro = parseInt(prompt ("Qual registro? (Exemplo, lá4 está no registro 4)"));



// a referência é a relação entre dó e lá, usando o lá como afinação para obter a frequência do dó como base. 

referencia = calculaFrequencia(afinacao, -9);
frequenciaBase = calculaFrequencia(referencia, nota);
frequencia = Math.round(calculaOitava(registro));


mostra("Nota: " + nota)
mostra("Frequência base (registro 4): " + frequenciaBase + " Hz.")
mostra("Frequência da nota no registro " + registro + ": " + frequencia + " Hz.")




</script>
4 respostas

Olá, Eurico,

Pode colocar o código inteiro? Se for para adivinhar, é porque o prompt retorna um TEXTO (ou STRING) e não um número, mesmo que você tenha digitado um número. NaN significa Not a Number.

Lembre-se que os textos ficam entre aspas. Ex: "Eurico". Se eu responder o prompt com a nota, 10, o valor que a variável vai receber será "10", entre aspas, caracterizando um TEXTO (ou STRING). Para convertê-lo em número, utilizaremos a função parseInt(promt("Digite a primeira nota")) (observe que é assim mesmo que se escreve).

Lembra que foi explicado que o prompt precisa de um parâmetro, ou seja, algo escrito entre os parênteses? O parseInt também.

var nota = parseInt(promt("Digite a primeira nota"));

Se eu digitar 10 na caixa de texto que aparecer, ele devolverá "10" (entre aspas) e aí a linha ficará parseInt("10"). Aí ele irá entender que "10" é um número e colocará o número 10 na variável nota.

Desculpa, eu tinha posto o código e achei que tinha ido, mas fiz errado. Sobre o problema, acontece que no prompt, era pra ele me devolver uma string com o nome da nota e então com o var trocar o nome da nota pelo número, mas dá NaN. Se eu fizer sem o prompt funciona.

solução!

Olá, Eurico,

Agora eu entendi. O que você quer é que ele coloque o nome da nota (ex: dó) e que o programa já entenda o número (0). Com o parseInt isso não é possível mesmo.

Não confunda uma string com o nome da variável. Você criou uma variável chamada , porém quando o usuário digita o texto que ficará armazenado na variável nota, o texto não tem relação com a variável. Tanto que ele estará entre aspas.

var dó = 0;
nota = "dó";

Os dois dós não tem relação. E quando você usa o parseInt no texto "dó" ele vai ver que o texto não é um número e retornará NaN.

Para realizar isso que você quer com os elementos que nós aprendemos, eu colocaria uma série de IFs testando nome a nome e aí sim atribuindo o valor.

Aproveitando, sempre tente corrigir o seu próprio código, como o "mata" lá no começo, não declarar as variaveis ou ter variáveis com acentos.

Uma boa prática também é declarar todas as variáveis no começo do programa e também realizar a identação (usando o TAB). Assim fica mais fácil de ler o seu código. Daqui a um tempo, quando você revisitá-lo, seguir as boas práticas torna o código mais legível e fácil de reentendê-lo.

<meta charset = "UTF-8">

    <h3> Cálculo Frequência </h3>

<script>

    function mostra(texto) {
        document.write(texto);
        document.write("<br><br>");
    }

    constante = 1.0594630943592953
    // 1.0594630943592953
    // 1.05946284

    function calculaFrequencia(f1,n) {

        //fórmula da escala temperada, f1 é frequencia inicial, f2 é frequencia final, n é a quantidade de semitons entre a nota inicial e a final.

        return f1 * (Math.pow(constante, n));
    }


    function calculaOitava(x) {

        //Considerando lá 440, se o registro 4 é 440, o registro 3 é 220 e o registro 2 é 110. Logo a função do registro é: registro(n) = frequencia * 2 ^ (n - 4)

        return frequenciaBase * Math.pow(2, (x - 4));
    }


    //intervalo em semitons em referência ao lá

    function conversao(nota) {
        var numero;
        if (nota == "dó"){
            numero = 0;
        } else if (nota == "réb"){
            numero = 1;
        } else if (nota == "ré"){
            numero = 2;
        } else if (nota == "mib"){
            numero = 3;
        } else if (nota == "mi"){
            numero = 4;
        } else if (nota == "fá"){
            numero = 5;
        } else if (nota == "solb"){
            numero = 6;
        } else if (nota == "sol"){
            numero = 7;
        } else if (nota == "láb"){
            numero = 8;
        } else if (nota == "lá"){
            numero = 9;
        } else if (nota == "sib"){
            numero = 10;
        } else if (nota == "si"){
            numero = 11;
        } else { //CASO DE NÃO ENCONTRAR NENHUM
            numero = 12;
        }
        return numero;
    }

    // A referência é o Lá. O registro é qual oitava está a nota, exemplo, no Lá4 o registro é 4. A referência do registro é Lá4 = 440 (ou 442).

    //exemplo:
        //afinação = 440
        //nota = mi
        //registro = 3
    var afinacao = parseInt(prompt ("Qual afinação do lá? Exemplo (440 ou 442)"));
    var nota = prompt ("Qual nota? dó, réb, ré, mib, mi, fá, solb, sol, láb, lá, sib ou si?");
    var registro = parseInt(prompt ("Qual registro? (Exemplo, lá4 está no registro 4)"));

    // a referência é a relação entre dó e lá, usando o lá como afinação para obter a frequência do dó como base. 
    notaNumero = conversao(nota)
    referencia = calculaFrequencia(afinacao, -9);
    frequenciaBase = calculaFrequencia(referencia, notaNumero);
    frequencia = Math.round(calculaOitava(registro));

    mostra("Nota: " + nota)
    mostra("Frequência base (registro 4): " + frequenciaBase + " Hz.")
    mostra("Frequência da nota no registro " + registro + ": " + frequencia + " Hz.")

</script>

Muito obrigado!! Eu estava animado pra fazer e algumas coisas passaram, como o "mata". Sobre o if eu não tinha aprendido. Eu mantive os acentos nas variáveis da nota, porque na hora indicar as notas, a pessoa indicaria com acento e poderia dar erro. Mas eu não tinha pensado em fazer dessa forma, obrigado!