Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
i307

Piano em C sobre o Windows 7

Recommended Posts

i307

Boas

necessito de fazer um piano programando em C. Isso faz-se acedendo à placa de som. Acontece que Vista ou superior o Windows barra esse acesso , apenas dando para contornar em Windows Xp.

Mas soube que usando o beep function conseguimos por o piano a funcionar em Windows 7. Alguém sabe como fazê-lo?

Se alguém souber como fazê-lo em Windows XP poste também.

Desde já obrigado.

Share this post


Link to post
Share on other sites
i307

Agora precisava de receber um vector e a cada numero do vector o tansforma-se em 1 segundo de uma determinada frequencia.

Apenas não sei o que usar para poder "tratar" dos inteiros do vector.

Share this post


Link to post
Share on other sites
i307

{
int v[30],time;

time=1000;

printf("Introduza os valores\n");
scanf("%d",&v[0]);
scanf("%d",&v[1]);
scanf("%d",&v[2]);

Beep(v[0],time);
Beep(v[0],time);
Beep(v[0],time);


}

Como fazer para que a quantidade de vezes que se faz o Beep seja defenida pela quantidade de vezes que o utilizador introduz um valor até que o valor seja 0?

Share this post


Link to post
Share on other sites
Localhost

→ Pedes quantas vezes quer

→ Fazes um while loop que verifica se o contador de vezes chegou às vezes definidas e se o valor introduzido é zero.

Exemplo:

#define MAX 100

scanf("%i", &quant);
assert(quant < MAX);
while(cont < quant && freq != 0) {
  // instruções
}

Explicação: cont é o contador, freq é o valor e quant é o número de vezes.

Aquele define é facultativo.


here since 2009

Share this post


Link to post
Share on other sites
i307

{
int v[30],time;
int f;

time=1000;

printf("Quantas vezes quer fazer");
scanf("%d",&f);

for (v[0]=1; v[0]<=10; v[0]++){

printf("Introduza os valores\n");
scanf("%d",&v[0]);
return v[0];

}

Beep(v[0],time);

}

Eu acho melhor fazer um for para o numero de vezes.

Agora não sei é como guardar os valores no vector e depois fazer o Beep de todos os valores do vector.

Não percebo mesmo nada de vectores  :bye2:

Share this post


Link to post
Share on other sites
Localhost

Que source confuso esse teu anterior. Ele nunca vai para o beep porque estás a fazer return dentro do loop, ou seja, vai sair logo na primeira iteração. Depois estás a modificar o valor do primeiro elemento do array. Parece-me que estás muito fresco. Aconselho-te a comprar um livro ou a arranjar algum pdf para teres noções básicas da sintaxe.

O que é que queres fazer neste programa?


here since 2009

Share this post


Link to post
Share on other sites
i307

Quero que ele receba um conjunto de valores do tipo inteiro e que depois faça a função beep para todos os valores , e tudo seguido.

Share this post


Link to post
Share on other sites
Localhost

Sabes ler do standard input? Sabes trabalhar com loops? É só isso que precisas para resolver isto.

Deixo aqui um protótipo:

#define MAX 100

int array[MAX];
int aux = 0;
int freq = 0;
// Este loop lê todos os valores
do {
  scanf("%i", &freq);
  array[aux] = freq;
  aux++;
}while(freq != 0);

Depois de fazeres isto tens de fazer outro loop, desta vez pode ser um for e chamar a função beep.


here since 2009

Share this post


Link to post
Share on other sites
i307

{
int v[30],time;
int f=0;
int aux = 0;
int freq = 0;
time=1000;



printf("Introduza os valores\n");
scanf("%d",&f);

do {
  scanf("%i", &f);
  v[aux] = f;
  aux++;
}while(freq != 0);

for (f=0; f<=aux; f++){

Beep(f,time);

}

Isto executa apenas os 2 primeiros valores.

Share this post


Link to post
Share on other sites
Localhost

Para que é que queres ler os valores se depois não os utilizas? Tens de chamar a função beep com os valores do array.


here since 2009

Share this post


Link to post
Share on other sites
i307

Já consigo que ele receba todos os valores até que se ponha 0.

Mas nao sei como fazer no for para ele fazer o beep  com os valores.

Share this post


Link to post
Share on other sites
Localhost

Tu não queres utilizar os valores guardados como frequências? Para isso tens de chamar a função beep com o valor que está a ser percorrido actualmente do array.


here since 2009

Share this post


Link to post
Share on other sites
i307

Tu não queres utilizar os valores guardados como frequências? Para isso tens de chamar a função beep com o valor que está a ser percorrido actualmente do array.

Pois , isso é que eu nao sei  :D

Share this post


Link to post
Share on other sites
Localhost

Isto é algum trabalho para a escola ou algo do género? É que se for nota-se que te baldaste um bocadinho às aulas  :D

Para isso em vez daquele f metes array[aux]

Tens de ter em atenção que a função beep tem o seguinte protótipo: beep(int frequencia, int duracao);

Para os mais observadores, eu só pûs int para ele entender.

Ou seja, o primeiro parametro é a frequência, tens de saber se os valores que armazenaste são frequências.


here since 2009

Share this post


Link to post
Share on other sites
i307

Isto é para uma cadeira onde temos de fazer cenas com C mesmo nao tendo dado C ainda (demos ainda coisas mais basicas) . Portanto torna-se ligeiramente complicado.

Epah desculpa mas não estou a entender  :wallbash:

O meu array não é o v (declarado como v[30]) ? É que o for não aceita que se ponha o array , nao estou a perceber onde tenho de por.

Share this post


Link to post
Share on other sites
Localhost

Tens de "pôr" na chamada à função beep.

Bem, vou supôr que o array vai contêr frequências e que vamos ter um tempo constante.

A chamada dentro do for ficava assim:

// Depois de ter lido tudo
const int time = 1000;
int aux = 0;
for(aux = 0; aux < 30; aux++) {
  Beep(array[aux], time);
}

Supondo que o tamanho do array é 30.

Se não percebeste alguma coisa do código, mesmo que não tenha nada a ver diz!


here since 2009

Share this post


Link to post
Share on other sites
i307

Mas tu estás a escrever array mas eu ponho v certo?

{
int v[30];
int f=0;
int aux = 0;
const time=1000;



do {
printf("Introduza os valores\n");
scanf("%i", &f);
f = v[aux];
aux++;
}

while(f != 0);

for(aux = 0; aux < 30; aux++)  {

  Beep(v[aux], time);

}
}

Isto é o que tenho. O som já está a passar o valor correcto mas só me deixa introduzir dois valores.

Share this post


Link to post
Share on other sites
i307

{
int v[30];
int f=0;
int aux = 0;
const time=1000;



do {
printf("Introduza os valores\n");
scanf("%i", &f);
aux++;
}

while(f != 0);

for(aux = 0; aux < 30; aux++)  {

  Beep(v[aux], time);

}
}

Agora já aceita muitos valores , mas dá muitos sons que eu não introduzo e durante muito mais tempo que um segundo portanto a frequencia ainda nao esta a passar como devia.

Share this post


Link to post
Share on other sites
Localhost

Sim, tens de pôr v, eu só pûs array para ser mais claro.

Só uma coisa que tens mal. f = v[aux]; Aqui era suposto o array receber a frequência e não a frequência receber valores do array.

Põe assim: v[aux] = f;


here since 2009

Share this post


Link to post
Share on other sites
Localhost

Porque o array está com valores aleatórios. Não tens mesmo noção do que estás a fazer :D

Eu sei que isto não é correcto mas fica aqui tudo direito:

int v[30];
int f = 0;
int aux = 0;
int max = 0;
const int time = 1000;
do {
  scanf("%i", &f);
  v[aux] = f;
  aux++;
}while(f != 0);
max = aux;
for(aux = 0; aux < max; aux++) {
  Beep(v[aux], time);
}


here since 2009

Share this post


Link to post
Share on other sites
Localhost

Porque devias pensar por ti próprio. Achas que tens algum proveito em termos de conhecimento em copiar e colar o meu código? Obvio que não. Se fizesses por ti próprio nunca mais te esquecias e percebias.

Mas abriu-se uma excepção. Btw, desculpa lá TheDark.


here since 2009

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.