Sound

#include <dsound.h>

Notes in LegOS are represented by the note_t struct, which is defined as follows:

typedef struct {
  unsigned char pitch;
  unsigned char length;
} note_t;

Normally, you should declare a note_t * and then fill it in. For example:

note_t nbc[] = { { PITCH_C, EIGHTH },
                 { PITCH_A, EIGHTH },
                 { PITCH_F, EIGHTH },
                 { PITCH_END, EIGHTH } };

when dsound_play() is called, it will play each note in succession and for the specified duration until it reaches a PITCH_END note, when it will stop.


The following pitches have been defined
#define PITCH_A0 	 0
#define PITCH_Am0 	 1
#define PITCH_H0 	 2
#define PITCH_C1 	 3
#define PITCH_Cm1 	 4
#define PITCH_D1 	 5
#define PITCH_Dm1 	 6
#define PITCH_E1 	 7
#define PITCH_F1 	 8
#define PITCH_Fm1 	 9
#define PITCH_G1 	 10
#define PITCH_Gm1 	 11
#define PITCH_A1 	 12
#define PITCH_Am1 	 13
#define PITCH_H1 	 14
#define PITCH_C2 	 15
#define PITCH_Cm2 	 16
#define PITCH_D2 	 17
#define PITCH_Dm2 	 18
#define PITCH_E2 	 19
#define PITCH_F2 	 20
#define PITCH_Fm2 	 21
#define PITCH_G2 	 22
#define PITCH_Gm2 	 23
#define PITCH_A2 	 24
#define PITCH_Am2 	 25
#define PITCH_H2 	 26
#define PITCH_C3 	 27
#define PITCH_Cm3 	 28
#define PITCH_D3 	 29
#define PITCH_Dm3 	 30
#define PITCH_E3 	 31
#define PITCH_F3 	 32
#define PITCH_Fm3 	 33
#define PITCH_G3 	 34
#define PITCH_Gm3 	 35
#define PITCH_A3 	 36
#define PITCH_Am3 	 37
#define PITCH_H3 	 38
#define PITCH_C4 	 39
#define PITCH_Cm4 	 40
#define PITCH_D4 	 41
#define PITCH_Dm4 	 42
#define PITCH_E4 	 43
#define PITCH_F4 	 44
#define PITCH_Fm4 	 45
#define PITCH_G4 	 46
#define PITCH_Gm4 	 47
#define PITCH_A4 	 48
#define PITCH_Am4 	 49
#define PITCH_H4 	 50
#define PITCH_C5 	 51
#define PITCH_Cm5 	 52
#define PITCH_D5 	 53
#define PITCH_Dm5 	 54
#define PITCH_E5 	 55
#define PITCH_F5 	 56
#define PITCH_Fm5 	 57
#define PITCH_G5 	 58
#define PITCH_Gm5 	 59
#define PITCH_A5 	 60
#define PITCH_Am5 	 61
#define PITCH_H5 	 62
#define PITCH_C6 	 63
#define PITCH_Cm6 	 64
#define PITCH_D6 	 65
#define PITCH_Dm6 	 66
#define PITCH_E6 	 67
#define PITCH_F6 	 68
#define PITCH_Fm6 	 69
#define PITCH_G6 	 70
#define PITCH_Gm6 	 71
#define PITCH_A6 	 72
#define PITCH_Am6 	 73
#define PITCH_H6 	 74
#define PITCH_C7 	 75
#define PITCH_Cm7 	 76
#define PITCH_D7 	 77
#define PITCH_Dm7 	 78
#define PITCH_E7 	 79
#define PITCH_F7 	 80
#define PITCH_Fm7 	 81
#define PITCH_G7 	 82
#define PITCH_Gm7 	 83
#define PITCH_A7 	 84
#define PITCH_Am7 	 85
#define PITCH_H7 	 86
#define PITCH_C8 	 87
#define PITCH_Cm8 	 88
#define PITCH_D8 	 89
#define PITCH_Dm8 	 90
#define PITCH_E8 	 91
#define PITCH_F8 	 92
#define PITCH_Fm8 	 93
#define PITCH_G8 	 94
#define PITCH_Gm8 	 95
#define PITCH_A8 	 96

#define PITCH_PAUSE   	 97
#define PITCH_MAX     	 98
#define PITCH_END     	 255

The following note lengths have been defined

#define WHOLE            16
#define HALF             8
#define QUARTER          4
#define EIGHTH           2

void dsound_system ( SOUND );
plays pre-defined system sound SOUND. Currently, only DSOUND_BEEP is a defined system sound. There are no others.

wakeup_t dsound_finished ( wakeup_t data );
wakeup function that wakes up the calling thread when the RCX has finished playing any sounds that it is supposed to.

int dsound_playing ( );

returns: non-zero if the system is playing a sound, zero if not

void dsound_stop ( );
stops any sound playing that is in progress

void dsound_play ( const note_t *notes );
Plays an array of notes, as explained above. This is a non-blocking call, so a call to this function will simply set the sound player in motion, it will not wait for it to finish.
Parameters: notes - a pointer to the first note to play. The array must end with a note having pitch PITCH_END, otherwise bad things may happen

More advanced sound commands are available, but we won't cover them here. Poke through dsound.h if you're interested