Category : C Source Code
Archive   : INT_MUS.ZIP
Filename : INT_MUS.C

 
Output of file : INT_MUS.C contained in archive : INT_MUS.ZIP
/**********************************************/
/* int_music.c */
/* written by Raymond F. Genovese */
/**********************************************/


#include

/* the note defines */
#define C 0
#define Cs 1
#define Db 1
#define D 2
#define Ds 3
#define Eb 3
#define E 4
#define F 5
#define Fs 6
#define Gb 6
#define G 7
#define Gs 8
#define Ab 8
#define A 9
#define As 10
#define Bb 10
#define B 11

/* psuedo operations defines */
#define REPEAT 12 /* repeat from begining */
#define SO 13 /* switch octaves */
#define R 14 /* rest (duration follows) */
#define END 15 /* end of the song */

/* duration defines */
#define S 1
#define EI 2
#define Q 4
#define H 8
#define W 16
#define DW 32

/* the notes:frequency array */
unsigned int notes[6][12]={
/* actually starts at octave #3 */
{17145,17173,16209,15299,14441,13630,12865,12143,11462,10818,10211,9638},
{9097,8586,8105,7650,7224,6816,6432,6071,5729,5409,5105,4819},
{4548,4293,4052,3825,3610,3410,3216,3036,2867,2705,2554,2409},
{2274,2147,2026,1912,1805,1702,1608,1518,1433,1352,1276,1205},
{1137,1073,1013,956,903,852,804,759,716,676,638,602},
{569,537,507,478,451,426,402,380,358,338,319,301}
};

unsigned char taps[]={SO,1,G,W,R,EI,G,Q,R,EI,SO,2,C,DW,R,W,
SO,1,G,W,R,EI,SO,2,C,Q,R,EI,E,DW,R,DW,
SO,1,G,W,R,EI,SO,2,C,Q,R,EI,E,W,R,S,
SO,1,G,W,R,EI,SO,2,C,Q,R,EI,E,W,R,S,
SO,1,G,W,R,EI,SO,2,C,Q,R,EI,E,W,R,S,
R,W,C,W,R,EI,E,Q,R,EI,G,W,
R,W,E,W,R,EI,C,W,R,EI,SO,1,G,W,R,W,
G,W,R,EI,G,Q,R,EI,SO,2,C,DW,R,DW,R,DW,
REPEAT};

/* globals for the song routines */
char c_note,c_duration,c_octave,*ptr,*s_song;
char sp_on,sp_off,lsb,msb,end,save_add1c[4];

void install(),restore();
void interrupt p_song();
void interrupt (*oldvector)();

void install()
{
/* installs the p_song interrupt */
/* set ptr to the song data array before calling this routine! */

/* set up */
sp_off=inportb(97);
sp_on=sp_off|3;
/* set up song */
c_duration=0;
oldvector=getvect(0x1c);
disable();
setvect(0x1c,&p_song);
enable();
/* it's playing */
}

void restore()
{
/* restores the old timer vector and speaker state */
/* *oldvector MUST have been initialized by install()! */
disable();
setvect(0x1c,oldvector);
enable();
outportb(97,sp_off);
}

void interrupt p_song()
{
if(c_duration)
c_duration--;
else
{
c_note=*ptr;
switch(c_note)
{
case 12: ptr=s_song;
break;
case 13: ptr++;
c_octave=*ptr;
ptr++;
break;
case 14: ptr++;
c_duration=*ptr;
outportb(97,sp_off);
ptr++;
break;
case 15: end=1;
break;
default: ptr++;
c_duration=*ptr;
lsb=notes[c_octave][c_note]%256;
msb=notes[c_octave][c_note]/256;
outportb(67,182);
outportb(66,lsb);
outportb(66,msb);
outportb(97,sp_on);
ptr++;
break;
}
}
}

main()
{
ptr=taps;
s_song=ptr;
install();
while(!kbhit())
printf("This is printing while playing\n");
restore();

}


  3 Responses to “Category : C Source Code
Archive   : INT_MUS.ZIP
Filename : INT_MUS.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/