*From Chuck Rich*; data holidays; retain fmtname '@$holiday'; length data $3; ratio = 1.05946309436; str1 ='A A#B C C#D D#E F F#G G#'; str2='A BbCbB#DbD EbFbE#GbG Ab'; o = 1; do i = 0 to 87; p = 55 * ratio**i; data = compress(substr(str1,mod(i,12)*2+1,2)||o); output; if data^=compress(substr(str2,mod(i,12)*2+1,2)||o) then do; data = compress(substr(str2,mod(i,12)*2+1,2)||o); output; end; if mod(i,12)=2 then o=o+1; end; rename data=start p=label; keep fmtname data p; run; proc format cntlin=holidays; run; %macro play(input); data _Null_; %let i=1; %do %while(%scan(&input,&i,%str( ))^=); %let note = %scan(&input,&i,%str( )); %let pitch = %upcase(%scan(¬e,1,=)); %let duration = %scan(¬e,2,=); %let i = %eval(&i+1); %if &pitch=R %then call sleep((1/&duration)*750); %else call sound(input("&pitch",$holiday.),(1/&duration)*300); ; %end; run; %mend; %play(%str( C6=2 C6=2 D6=1 C6=1 F6=1 E6=.5 C6=2 C6=2 D6=1 C6=1 G6=1 F6=.5 C6=2 C6=2 C7=1 A6=1 F6=1 E6=1 D6=1 A#6=2 A#6=2 A6=1 F6=1 G6=1 F6=.5 )); %macro skip; %play(%str( C6=1 B5=1.5 A5=6 G5=1 R=2 F5=2 E5=1 D5=1 C5=1 R=2 G5=2 A5=1 R=2 A5=2 B5=1 R=2 B5=2 C6=.33 C6=2 C6=2 B5=2 A5=2 G5=2 G5=1.5 F5=4 E5=2 C6=2 C6=2 B5=2 A5=2 G5=2 G5=1.5 F5=4 E5=2 E5=2 E5=2 E5=2 E5=2 E5=4 F5=4 G5=1 R=4 F5=4 E5=4 D5=2 D5=2 D5=2 D5=4 E5=4 F5=1 R=4 E5=4 D5=4 C5=2 C6=1 A5=2 G5=1.5 F5=6 E5=2 F5=2 E5=1 D5=1 C5=1 )); %mend skip;