|Portada|Blog|Space|

[Índice] > Un script musical

Un interesante ejercicio para aprender awk, un script capaz de generar
algunas notas aleatorias.

Para simplificar usé la función seno que tiene el gnu awk aunque no es
estándar. En caso de que no esté presente se puede cambiar sin(angle) por:

  angle*(1 - angle*angle*(1 - angle*angle*(0.05 - angle*angle/840))/6)

Y aquí viene el script, cambien el último pipe por >/dev/dsp en el caso
que tengan OSS:

awk '
BEGIN { M_PI = 3.14159265 }
function modulate(freq,
  angle){
  angle = modulate_angle[freq] + 2 * M_PI / DSPRATE * freq
  modulate_angle[freq] = (angle>M_PI) ? angle-2*M_PI : angle
  return sin(angle)
}

function vol(f){
  vol_step++
  if(rand()>0.9999){
    vol_datas[f]=1
    return 1
  } else {
    if(vol_datas[f]==0) return 0;
    vol_datas[f]-=0.0005
    if(vol_datas[f]<0)
      vol_datas[f]=0
    return vol_datas[f]
  }
}

function putnote(){
  v=0;
  for(f=400; f<=1400; f+=200){
    v+=vol(f)*modulate(f)
  }
  if(v>1) v=1
  if(v<-1) v=-1
  printf("%c", 80+int(80*v))
}

BEGIN {
  DSPRATE = 8000
  while(1) putnote()
}
'  | sox -r 8000 -c 1 -t raw -u -1 - -t alsa default:0


---------
Los documentos en este sitio se encuentran licenciados bajo la GFDL.
Ver comentarios: [Hay i comentarios]
Para agregar un comentario: agregue a la URL: ?do=show_comment_form (explicación)