[ Foro de Pascal ]

Generar cancion

02-Aug-2010 18:59
oscar gomez
1 Respuestas

Mira es que he seguido en esto de programar y bueno me encontre con un programita en el cual quisiera pedir tu ayuda, es lo siguiente:

escriba un program que genere una cancion y la muestre por pantalla.

Una cancion esta formada por notas musicales representadas con digitos entre 1 y 7
las notas musicales de la cancion son generadas aleatoriamente de acuerdo a las siguientes reglas:
- la primera nota de la cancion no debe ser un DO
- si la nota generada es FA y la nota anterior fue un RE , la nota generada no sera tomada en cuenta en la cancion.

- si la nota generada es MI, se añade a la cancion  DO RE MI dos veces.

la cancion finaliza cuando las dos ultimas notas generadas sean las notas  DO SI o las notas FA SOL


 1  DO
 2  RE
 3  MI
 4  FA
 5  SOL
 6  LA
 7  SI  


Pues bien Antonio yo intento hacer lo siguiente pero claro tengo vacios y quisiera tu ayuda agradeciendote de ante mano por ella.

program musical;
uses crt;
var notas:array [1..7] of integer;
    cancion:array[1..50] of integer;
    i,j,x:integer;

begin
clrscr;
writeln;
randomize;
x:=0;
for i:=1 to 7 do
 begin
  notas[i]:=random(7)+1;
  if ( notas[1]=1) or ((notas[i]=4) and (notas[i-1]=2)) then
    notas[i]:=random(7)+1
   else
    begin
     cancion[i+x]:=notas[i];
     if (cancion[i+x]=3) then
      begin
       for k:=1 to 2 do
        for j:=1 to 3 do
          begin
             x:=x+1;
             cancion[i+x]:=j;
          end;
       end;
      end;

Antonio, no se como colocar la condicion de que la cancion finaliza cuando las dos ultimas notas generadas sean las notas DO SI  o las notas FA SOL , como puedo controlar, es decir como hacerlo dado que estoy utilizando un for de 1 hasta 7 como controla las dos ultimas notas generadas? otra cosa como podria mostrar en pantalla la cancion asociada a las respectivas letras segun el numero es decir que muestre por pantalla no las notas en formato numerico sino asociadas a su nota en formato letra

   



   
 


02-Aug-2010 20:33
Antonio P.G.

Saludos.

Me alegro de que sigas en esto de la programación, pero intenta abrir nuevos temas en el foro, que estás llenando este tema de programas :S:S :-).

Notas y respuestas a tus preguntas respecto al programa:
- Bucles:
"For": se usa cuando conocemos el número exacto de repeticiones. No es el caso.
"While": se usa cuando a lo mejor hay que hacer repeticiones hasta que se de una condición, que podía darse ya antes de hacer una primera vuelta. No es nuestro caso.
"Repeat...until": se usa cuando se para con una condición, y además cuando hay que dar al menos una vuelta. Es nuestro caso.

- Sistemas de generación aleatoria:
Si la canción para cuando aparecen esas notas... ¿cuándo parará? Pues bien, es que es posible que la canción nunca acabe y el programa se te quede colgado. (Es improbable que no acabe tras 1000 notas, pero puede ocurrir). Por ello te aconsejo que utilices un contador de seguridad, y que, por ejemplo, tras 200 notas escritas, se salga del bucle. Así no tendrás que esperar demasiado.

- Como escribir las letras, en vez de los números:
Crea un vector de strings de dos letras ( array [1..7] of string[3] ) con las notas almacenadas en las casillas. Esto lo puedes hacer al principio del programa, o como una constante (espero no equivocarme en la siguiente definición, ya que estoy en un PC en el que no lo puedo probar):

Const
..vec_const_notas : array [1..7] of string[3] = ['DO','RE','MI','FA','SOL','LA','SI'];

Si me he confundio en algo será en los ":" o el "=", pero el compilador te lo indica. En cualquier caso, cuando vayas a escribir, escribes el contenido de la casilla cuya posición es la aleatoria que se ha calculado, ¿ok?.

- Controlar las notas: Dos variables (A y B, en mi explicación) de tipo byte, o incluso de rango 1..7. Aquí va un esquemita de esos:

.......( Cargar el randomize y todos esos tinglados )...
..Das valor aleatorio a A hasta que no sea un Do (buclecito por quí, claro)
..Entras en bucle
....Das valor aleatorio a B
....Si B modifica a A, pues lo hacemos.
....Escribimos A
....Damos el valor de B a A
..Fin del bucle cuando condiciones
..Escribir A
................................

Se trata de ir "una nota por delante", digamos. Es el esquema principal; faltan meter cosas como lo del contador de seguridad. Al final, no nos podemos olvidar de "Escribir A", ya que la tenemos ahí almacenada. La parte más importante es la de "Si B modifica a A", porque dependiendo de el valor de B ("case"), pasan cosas distintas, que modifican tanto a A, como al contador de seguridad, como que  además hay que escribir cosas en pantalla.

- Creo que es suficiente con las variables que te he dicho. Opino que el array ese que tienes para la canción sobra, dado que queremos escribirla en pantalla, no almacenarla.

Espero que con esto te valga para bastante. Dale al coco, que dándole uno ejercita la mente, y así esto se volverá trivial.

¡Ciao!






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)