Jump to content

Bem vindo à Unidev
Registre para ter acesso a todos os recursos do site. Uma vez registrado e logado, você poderá criar tópicos, postar em tópicos já existentes, gerenciar seu perfil e muito mais. Se você já tem uma conta, faça login aqui - ou então crie aqui uma conta agora mesmo!
Photo

Controlar volume


  • Please log in to reply
9 replies to this topic

#1
lordzero

lordzero

    Moderador(a)

  • Membro
  • PipPip
  • 850 posts

Eai

 

Ando afastado do mundo Unity3D...

 

estava pensando aqui em fazer um controle da musica e som ambiente do meu jogo...

 

Segue meu codigo em C#:

 

        if (sliderMusic >= 90)
            {
                ap.bgmPlayer.audio.volume = 0.9f;
        }
        
             if (sliderMusic >= 50)
            {
                ap.bgmPlayer.audio.volume = 0.5f;
        }
        
               if (sliderMusic >= 30)
            {
                ap.bgmPlayer.audio.volume = 0.3f;
        }
        
               if (sliderMusic >= 0)
            {
                ap.bgmPlayer.audio.volume = 0.0f;
        }

 

Alguem conhece uma forma melhor que esta?

 

Vlw


  • lordzero likes this
Aquele que tem a resposta e não a compreende é como aquele que nunca teve a resposta.

#2
Lucas B. Luna

Lucas B. Luna

    Membro

  • Membro
  • PipPip
  • 225 posts
Só isto aqui não funcionaria também?
ap.bgmPlayer.audio.volume = 0.01f * sliderMusic;
EDIT: Para quem for fazer uso deste tópico futuramente, peço encarecidamente que leia meu terceiro post.

Edited by Lucas B. Luna, 01 janeiro 2018 - 07:42 .

  • lordzero likes this

tux.gif
slack.jpg


#3
lordzero

lordzero

    Moderador(a)

  • Membro
  • PipPip
  • 850 posts

 

Só isto aqui não funcionaria também?

ap.bgmPlayer.audio.volume = 0.01f * sliderMusic;

 

Obrigado pela sugestão!

 

Levando em consideração que a "Slider Bar" tanto serve para diminuir como para aumentar o som....

 

Tenho q tentar identificar o evento se está aumentando ou diminuindo... pra poder fazer a alteração...


Aquele que tem a resposta e não a compreende é como aquele que nunca teve a resposta.

#4
Lucas B. Luna

Lucas B. Luna

    Membro

  • Membro
  • PipPip
  • 225 posts

Levando em consideração que a "Slider Bar" tanto serve para diminuir como para aumentar o som....
 
Tenho q tentar identificar o evento se está aumentando ou diminuindo... pra poder fazer a alteração...

Tem mesmo? Por quê? A engine exige isso? Soa muito estranho, pra ser sincero. Em qualquer outro lugar, se você tem a posição atual do slider e o valor mínimo e máximo que essa posição pode ter, você pode atribuir ao volume do áudio uma simples função linear* da diferença entre as posições atual e mínima do slider (OK, em alguns casos o melhor seria uma função exponencial, mas, ainda assim, não precisaria checar se o volume estaria aumentando ou diminuindo). Ou seja, em termos gerais:
volume = (slider_current_position - slider_min_position) / (slider_max_position - slider_min_position);
Pelo que eu entendi, a variável que define o volume final do áudio que sai do seu jogo é ap.bgmPlayer.audio.volume, onde o valor 0.0f corresponde ao silêncio e o valor 1.0f ao volume máximo. Também, ao que parece, sliderMusic é um número que varia de 0 a 100 o qual representa a posição do slider. Então, ao que tudo indica, simplesmente usar uma função linear da posição do slider, a saber, 0.01f * sliderMusic, seria suficiente para obter o valor desejado para ap.bgmPlayer.audio.volume. Ou isso, ou eu me equivoquei sobre o significado dessas variáveis, o que, se for o caso, humildemente lhe pediria que as esclarecesse.
 
Pode nos dizer o que acontece se você substituir o código que você mostrou por aquele que eu te passei no meu primeiro post?
 
* = Na verdade, provavelmente você vai ter que usar uma função exponencial mesmo. Favor, ver meu próximo post.

Edited by Lucas B. Luna, 01 janeiro 2018 - 07:52 .

  • lordzero likes this

tux.gif
slack.jpg


#5
lordzero

lordzero

    Moderador(a)

  • Membro
  • PipPip
  • 850 posts

Tem mesmo? Por quê? A engine exige isso? Soa muito estranho, pra ser sincero. Em qualquer outro lugar, se você tem a posição atual do slider e o valor mínimo e máximo que essa posição pode ter, você pode atribuir ao volume do áudio uma simples função linear da diferença entre as posições atual e mínima do slider (OK, em alguns casos o melhor seria uma função exponencial, mas, ainda assim, não precisaria checar se o volume estaria aumentando ou diminuindo). Ou seja, em termos gerais:

volume = (slider_current_position - slider_min_position) / (slider_max_position - slider_min_position);

Pelo que eu entendi, a variável que define o volume final do áudio que sai do seu jogo é ap.bgmPlayer.audio.volume, onde o valor 0.0f corresponde ao silêncio e o valor 1.0f ao volume máximo. Também, ao que parece, sliderMusic é um número que varia de 0 a 100 o qual representa a posição do slider. Então, ao que tudo indica, simplesmente usar uma função linear da posição do slider, a saber, 0.01f * sliderMusic, seria suficiente para obter o valor desejado para ap.bgmPlayer.audio.volume. Ou isso, ou eu me equivoquei sobre o significado dessas variáveis, o que, se for o caso, humildemente lhe pediria que as esclarecesse.

 

Pode nos dizer o que acontece se você substituir o código que você mostrou por aquele que eu te passei no meu primeiro post?

 

Amigo obrigado por ajudar!

 

Vou fazer alguns testes e te passo um retorno!


  • Lucas B. Luna likes this
Aquele que tem a resposta e não a compreende é como aquele que nunca teve a resposta.

#6
Lucas B. Luna

Lucas B. Luna

    Membro

  • Membro
  • PipPip
  • 225 posts
lordzero, não sei como as coisas estão indo por ai, mas, de qualquer forma, lembra de quando eu disse isto aqui?

(OK, em alguns casos o melhor seria uma função exponencial [...])

A questão é que, como a percepção humana de volume é logarítmica, será preciso usar uma função exponencial para calcular o volume na maior parte dos casos (não apenas em "alguns").
 
Se você usar uma função linear, provavelmente irá notar que a sua percepção da mudança de volume é mais drástica no intervalo de 0% a 50% do que de 50% a 100%. Eu sabia disso, mas não achei que seria uma aproximação tão grosseira assim, principalmente tratando-se de um jogo. Mudei de ideia após ler isto.
 
A fórmula da qual você precisa é esta:
v = a · e b · x

Onde v é o volume* (um número que varia de 0.0 a 1.0) que você quer encontrar; x (outro número que varia entre 0.0 e 1.0) é a fração que a posição do slider representa entre a posição mínima e a posição máxima, a qual é calculada por:
x = (slider_current_position - slider_min_position) / (slider_max_position - slider_min_position);
e é a constante neperiana/número de Euler. Seu valor em notação decimal é aproximadamente 2.718281828459045235360287471352662497757247093.

Finalmente, a e b são dois coeficientes constantes que definem o formato da curva do gráfico da função. Segundo a página que eu linkei, a escolha de quais valores usar para esses coeficientes depende da diferença em dB entre o silêncio e o volume máximo produzido pelo dispositivo de áudio... O que aparentemente varia muito de dispositivo para dispositivo, então a sua única escolha deve ser pegar uma diferença em dB qualquer e decidir qual você acha que tem os melhores coeficientes. A página sugeriu para a maior parte dos casos usar os coeficientes correspondentes a uma diferença de 60 dB... Mas quando eu fui testar aqui (num slider de 129 níveis), os coeficientes que mais se encaixaram foram os correspondentes a uma diferença de 20 dB (o som já ficava inaudível ainda longe da "posição 0" usando outros coeficientes).

Aqui está uma tabela de coeficientes para você testar:
20  dB: a = 0.1;         b = 2.30258509299404568401;
30  dB: a = 0.031623;    b = 3.45387057504097521618;
40  dB: a = 0.01;        b = 4.60517018598809136803;
50  dB: a = 0.0031623;   b = 5.75645566803502090020;
60  dB: a = 0.001;       b = 6.90775527898213705205;
70  dB: a = 0.00031623;  b = 8.05904076102906658422;
80  dB: a = 0.0001;      b = 9.21034037197618273607;
90  dB: a = 0.000031623; b = 10.36162585402311226824;
100 dB: a = 0.00001;     b = 11.51292546497022842008;
Eu fiz o meu próprio slider de volume em C para checar (se quiser, baixe o excutável para Windows junto com o código fonte aqui. Use as setas esquerda e direita do teclado para mover o slider). A função que eu escrevi para modificar o volume foi esta:
void set_volume(double x)
{
    const double a = 0.1;
    const double b = 2.30258509299404568401;
    if(x < a) volume = x;
    else {
        volume = a * exp(b * x);
        if(volume > 1.0f) volume = 1.0f;
    }
}
Por razões explicadas na página que eu linkei, para x < a, eu faço simplesmente volume = x. E se o valor encontrado para o volume através da função exponencial acabar ficando maior que 1.0, eu faço volume = 1.0, para não ter problemas de overflow. "exp" é uma função da biblioteca padrão do C que calcula e elevado a algum número (pelo o que eu li, em C# a função "o método" que faz a mesma coisa é Math.Exp).

* = Tecnicamente, talvez um termo mais adequado para designar esse v seria "fator de escala da forma de onda". Eu acho que "volume" na verdade é o nome da sensação que ocorre em resposta à intensidade da onda sonora, como "tom" é o nome da sensação que ocorre em resposta à frequência. De qualquer maneira... Quando eu falar em "volume" saiba que eu estou me referindo a esse tal "fator de escala" (que eu acho que esse ap.bgmPlayer.audio.volume representa), o qual influencia a intensidade da onda emitida.

tux.gif
slack.jpg


#7
lordzero

lordzero

    Moderador(a)

  • Membro
  • PipPip
  • 850 posts

Eai

 

Ando afastado do mundo Unity3D...

 

estava pensando aqui em fazer um controle da musica e som ambiente do meu jogo...

 

Segue meu codigo em C#:

 

        if (sliderMusic >= 90)
            {
                ap.bgmPlayer.audio.volume = 0.9f;
        }
        
             if (sliderMusic >= 50)
            {
                ap.bgmPlayer.audio.volume = 0.5f;
        }
        
               if (sliderMusic >= 30)
            {
                ap.bgmPlayer.audio.volume = 0.3f;
        }
        
               if (sliderMusic >= 0)
            {
                ap.bgmPlayer.audio.volume = 0.0f;
        }

 

Alguem conhece uma forma melhor que esta?

 

Vlw

 

 

Sobre o meu "código porco"

 

Esqueci e inverti o sinal... na verdade é assim  "<=" menor ou igual...

 

Dai ficou assim:

 

        if (sliderMusic <= 90)
            {
                ap.bgmPlayer.audio.volume = 0.9f;
        }
        
             if (sliderMusic <= 50)
            {
                ap.bgmPlayer.audio.volume = 0.5f;
        }
        
               if (sliderMusic <= 30)
            {
                ap.bgmPlayer.audio.volume = 0.3f;
        }
        
               if (sliderMusic <= 0)
            {
                ap.bgmPlayer.audio.volume = 0.0f;
        }


Aquele que tem a resposta e não a compreende é como aquele que nunca teve a resposta.

#8
lordzero

lordzero

    Moderador(a)

  • Membro
  • PipPip
  • 850 posts

lordzero, não sei como as coisas estão indo por ai, mas, de qualquer forma, lembra de quando eu disse isto aqui?
A questão é que, como a percepção humana de volume é logarítmica, será preciso usar uma função exponencial para calcular o volume na maior parte dos casos (não apenas em "alguns").
 
Se você usar uma função linear, provavelmente irá notar que a sua percepção da mudança de volume é mais drástica no intervalo de 0% a 50% do que de 50% a 100%. Eu sabia disso, mas não achei que seria uma aproximação tão grosseira assim, principalmente tratando-se de um jogo. Mudei de ideia após ler isto.
 
A fórmula da qual você precisa é esta:
v = a · e b · x

Onde v é o volume* (um número que varia de 0.0 a 1.0) que você quer encontrar; x (outro número que varia entre 0.0 e 1.0) é a fração que a posição do slider representa entre a posição mínima e a posição máxima, a qual é calculada por:

x = (slider_current_position - slider_min_position) / (slider_max_position - slider_min_position);
e é a constante neperiana/número de Euler. Seu valor em notação decimal é aproximadamente 2.718281828459045235360287471352662497757247093.

Finalmente, a e b são dois coeficientes constantes que definem o formato da curva do gráfico da função. Segundo a página que eu linkei, a escolha de quais valores usar para esses coeficientes depende da diferença em dB entre o silêncio e o volume máximo produzido pelo dispositivo de áudio... O que aparentemente varia muito de dispositivo para dispositivo, então a sua única escolha deve ser pegar uma diferença em dB qualquer e decidir qual você acha que tem os melhores coeficientes. A página sugeriu para a maior parte dos casos usar os coeficientes correspondentes a uma diferença de 60 dB... Mas quando eu fui testar aqui (num slider de 129 níveis), os coeficientes que mais se encaixaram foram os correspondentes a uma diferença de 20 dB (o som já ficava inaudível ainda longe da "posição 0" usando outros coeficientes).

Aqui está uma tabela de coeficientes para você testar:
20  dB: a = 0.1;         b = 2.30258509299404568401;
30  dB: a = 0.031623;    b = 3.45387057504097521618;
40  dB: a = 0.01;        b = 4.60517018598809136803;
50  dB: a = 0.0031623;   b = 5.75645566803502090020;
60  dB: a = 0.001;       b = 6.90775527898213705205;
70  dB: a = 0.00031623;  b = 8.05904076102906658422;
80  dB: a = 0.0001;      b = 9.21034037197618273607;
90  dB: a = 0.000031623; b = 10.36162585402311226824;
100 dB: a = 0.00001;     b = 11.51292546497022842008;
Eu fiz o meu próprio slider de volume em C para checar (se quiser, baixe o excutável para Windows junto com o código fonte aqui. Use as setas esquerda e direita do teclado para mover o slider). A função que eu escrevi para modificar o volume foi esta:
void set_volume(double x)
{
    const double a = 0.1;
    const double b = 2.30258509299404568401;
    if(x < a) volume = x;
    else {
        volume = a * exp(b * x);
        if(volume > 1.0f) volume = 1.0f;
    }
}
Por razões explicadas na página que eu linkei, para x < a, eu faço simplesmente volume = x. E se o valor encontrado para o volume através da função exponencial acabar ficando maior que 1.0, eu faço volume = 1.0, para não ter problemas de overflow. "exp" é uma função da biblioteca padrão do C que calcula e elevado a algum número (pelo o que eu li, em C# a função "o método" que faz a mesma coisa é Math.Exp).

* = Tecnicamente, talvez um termo mais adequado para designar esse v seria "fator de escala da forma de onda". Eu acho que "volume" na verdade é o nome da sensação que ocorre em resposta à intensidade da onda sonora, como "tom" é o nome da sensação que ocorre em resposta à frequência. De qualquer maneira... Quando eu falar em "volume" saiba que eu estou me referindo a esse tal "fator de escala" (que eu acho que esse ap.bgmPlayer.audio.volume representa), o qual influencia a intensidade da onda emitida.

 

 

Sua resposta está bastante "avançada" e detalhada, obrigado por compartilhar. :)


Aquele que tem a resposta e não a compreende é como aquele que nunca teve a resposta.

#9
Lucas B. Luna

Lucas B. Luna

    Membro

  • Membro
  • PipPip
  • 225 posts

Peço desculpas caso a minha resposta tenha ficado muito "sobrecarregada", parceiro. A verdade é que essa questão do volume não é a mais trivial mesmo. Eu tentei simplificar o máximo que eu pude, postando até o código que eu usei tal como estava no arquivo fonte.

 

Se você quiser tratar do controle de volume corretamente, por bem ou por mal, funções exponenciais são a solução mais adequada mesmo. :wacko:


  • lordzero likes this

tux.gif
slack.jpg


#10
lordzero

lordzero

    Moderador(a)

  • Membro
  • PipPip
  • 850 posts

Peço desculpas caso a minha resposta tenha ficado muito "sobrecarregada", parceiro. A verdade é que essa questão do volume não é a mais trivial mesmo. Eu tentei simplificar o máximo que eu pude, postando até o código que eu usei tal como estava no arquivo fonte.

 

Se você quiser tratar do controle de volume corretamente, por bem ou por mal, funções exponenciais são a solução mais adequada mesmo. :wacko:

 

Ok!

 

Obrigado


  • Lucas B. Luna likes this
Aquele que tem a resposta e não a compreende é como aquele que nunca teve a resposta.




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users