%LET whole = 750 ; *whole note in milliseconds ; DATA _NULL_ ; RETAIN ns 'CnC#DnD#EnFnF#GnG#AnA#Bn' nf 'CnDbDnEbEnFnGbGnAbAnBbBn' ; INFILE cards DLM = '|' DSD ; INPUT ont: $10. @@ ; nt = PUT (SUBSTR (ont,2), $2.) ; md = PUT (SCAN (ont,2), $4.) ; n = 12 * INPUT (ont, 1.) - 8.5 + (FIND (ns,nt) <> FIND (nf,nt)) / 2; f = 27.5 * 2 ** ((n - 1) / 12) ; CALL SOUND (f, &whole * (1 + ^^ FINDC (md,'.') / 2) / INPUT (md, 3.)); CARDS; 4Dn 4|4Gn 4|4Gn 8|4An 8|4Gn 8|4F# 8|4En 4|4Cn 4|4En 4|4An 4|4An 8|4Bn 8 4An 8|4Gn 8|4F# 4|4Dn 4|4F# 4|4Bn 4|4Bn 8|5Cn 8|4Bn 8|4An 8|4Gn 4|4En 4 4Dn 8|4Dn 8|4En 4|4An 4|4F# 4|4Gn 2|4Dn 4|4Gn 4|4Gn 4|4Gn 4|4F# 2|4F# 4 4Gn 4|4F# 4|4En 4|4Dn 2|4An 4|4Bn 4|4An 8|4An 8|4Gn 8|4Gn 8|5Dn 4|4Dn 4 4Dn 8|4Dn 8|4En 4|4An 4|4F# 4|4Gn 2 4Dn 4|4Gn 4|4Gn 8|4An 8|4Gn 8|4F# 8|4En 4|4Cn 4|4En 4|4An 4|4An 8|4Bn 8 4An 8|4Gn 8|4F# 4|4Dn 4|4F# 4|4Bn 4|4Bn 8|5Cn 8|4Bn 8|4An 8|4Gn 4|4En 4 4Dn 8|4Dn 8|4En 4|4An 4|4F# 4|4Gn 2|4Dn 4|4Gn 4|4Gn 4|4Gn 4|4F# 2|4F# 4 4Gn 4|4F# 4|4En 4|4Dn 2|4An 4|4Bn 4|4An 8|4An 8|4Gn 8|4Gn 8|5Dn 4|4Dn 4 4Dn 8|4Dn 8|4En 4|4An 4|4F# 4|4Gn 2 ; RUN;