Changeset 367:0216492669e8 in roaraudio
- Timestamp:
- 08/03/08 14:18:12 (16 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
include/libroardsp/midi.h
r203 r367 5 5 6 6 #include "libroar.h" 7 #include <math.h> 8 9 #define ROAR_MIDI_NOTE_NONE -1 10 11 #define ROAR_MIDI_NOTE_C 26162 12 #define ROAR_MIDI_NOTE_Cs 27718 13 #define ROAR_MIDI_NOTE_D 29366 14 #define ROAR_MIDI_NOTE_Ds 31112 15 #define ROAR_MIDI_NOTE_E 32962 16 #define ROAR_MIDI_NOTE_F 34922 17 #define ROAR_MIDI_NOTE_Fs 36999 18 #define ROAR_MIDI_NOTE_G 39199 19 #define ROAR_MIDI_NOTE_Gs 41530 20 #define ROAR_MIDI_NOTE_A 44000 21 #define ROAR_MIDI_NOTE_As 46616 22 #define ROAR_MIDI_NOTE_B 49388 23 24 #define ROAR_MIDI_MAX_NOTENAME_LEN (1+8) 25 26 #define ROAR_MIDI_TYPE_SINE 1 27 28 struct roar_note_octave { 29 uint16_t note; 30 char name[ROAR_MIDI_MAX_NOTENAME_LEN+1]; 31 int octave; 32 float freq; 33 int len_mul; 34 int len_div; 35 }; 36 37 38 char * roar_midi_note2name (uint16_t note); 39 uint16_t roar_midi_name2note (char * note); 40 float roar_midi_note2freq (uint16_t note); 41 42 //int roar_midi_free_no (struct roar_note_octave * note); 43 44 int roar_midi_find_octave (char * note); 45 int roar_midi_add_octave (struct roar_note_octave * note); 46 int roar_midi_notefill (struct roar_note_octave * note); 47 48 int roar_midi_gen_tone (struct roar_note_octave * note, int16_t * samples, float t, int rate, int channels, int type, void * opts); 7 49 8 50 #endif -
libroardsp/midi.c
r203 r367 3 3 #include "libroar.h" 4 4 5 struct { 6 uint16_t id; 7 float freq; 8 char * name; 9 } _libroar_notes[] = { 10 {ROAR_MIDI_NOTE_C , 261.625565, "C"}, 11 {ROAR_MIDI_NOTE_Cs, 277.182631, "C#"}, 12 {ROAR_MIDI_NOTE_D , 293.664768, "D"}, 13 {ROAR_MIDI_NOTE_Ds, 311.126984, "D#"}, 14 {ROAR_MIDI_NOTE_E , 329.627557, "E"}, 15 {ROAR_MIDI_NOTE_F , 349.228231, "F"}, 16 {ROAR_MIDI_NOTE_Fs, 369.994423, "F#"}, 17 {ROAR_MIDI_NOTE_G , 391.995436, "G"}, 18 {ROAR_MIDI_NOTE_Gs, 415.304698, "G#"}, 19 {ROAR_MIDI_NOTE_A , 440.000000, "A"}, 20 {ROAR_MIDI_NOTE_As, 466.163762, "A#"}, 21 {ROAR_MIDI_NOTE_B , 493.883301, "B"}, 22 {0, 0, NULL} 23 }; 24 25 char * roar_midi_note2name (uint16_t note) { 26 int i; 27 28 for (i = 0; _libroar_notes[i].name != NULL; i++) 29 if ( _libroar_notes[i].id == note ) 30 return _libroar_notes[i].name; 31 32 return NULL; 33 } 34 35 uint16_t roar_midi_name2note (char * note) { 36 int i; 37 38 for (i = 0; _libroar_notes[i].name != NULL; i++) 39 if ( strcasecmp(_libroar_notes[i].name, note) == 0 ) 40 return _libroar_notes[i].id; 41 42 return ROAR_MIDI_NOTE_NONE; 43 } 44 45 float roar_midi_note2freq (uint16_t note) { 46 int i; 47 48 for (i = 0; _libroar_notes[i].name != NULL; i++) 49 if ( _libroar_notes[i].id == note ) 50 return _libroar_notes[i].freq; 51 52 return -1; 53 } 54 55 int roar_midi_find_octave (char * note); 56 int roar_midi_add_octave (struct roar_note_octave * note) { 57 note->name[0] = 0; 58 return -1; 59 } 60 61 int roar_midi_notefill (struct roar_note_octave * note) { 62 int oct; 63 64 if ( !note ) 65 return -1; 66 67 if ( note->note && note->name[0] == 0 ) { 68 roar_midi_add_octave(note); 69 } else if ( !note->note && note->name[0] != 0 ) { 70 return -1; 71 } 72 73 oct = 1 << abs(note->octave); 74 75 note->freq = roar_midi_note2freq(note->note); 76 77 if ( note->octave < 0 ) { 78 note->freq /= oct; 79 } else { 80 note->freq *= oct; 81 } 82 83 return 0; 84 } 85 86 int roar_midi_gen_tone (struct roar_note_octave * note, int16_t * samples, float t, int rate, int channels, int type, void * opts) { 87 int i, c; 88 float ct; 89 float step = M_PI*2*note->freq/rate; 90 int16_t s; 91 92 /* 93 rate: 1/s 94 t : 1s 95 freq: 1/s 96 rew : 1s 97 */ 98 99 for (ct = 0, i = 0; ct <= t; ct += step, i += channels) { 100 s = 32767*sin(ct); 101 102 for (c = 0; c < channels; c++) 103 samples[i+c] = s; 104 } 105 106 return 0; 107 } 108 5 109 //ll
Note: See TracChangeset
for help on using the changeset viewer.