Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

i307

Piano em C sobre o Windows 7

Mensagens Recomendadas

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.