Changeset 367:0216492669e8 in roaraudio


Ignore:
Timestamp:
08/03/08 14:18:12 (16 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

done a lot basic midi things

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • include/libroardsp/midi.h

    r203 r367  
    55 
    66#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 
     28struct 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 
     38char         * roar_midi_note2name   (uint16_t note); 
     39uint16_t       roar_midi_name2note   (char * note); 
     40float          roar_midi_note2freq   (uint16_t note); 
     41 
     42//int            roar_midi_free_no     (struct roar_note_octave * note); 
     43 
     44int            roar_midi_find_octave (char * note); 
     45int            roar_midi_add_octave  (struct roar_note_octave * note); 
     46int            roar_midi_notefill    (struct roar_note_octave * note); 
     47 
     48int            roar_midi_gen_tone    (struct roar_note_octave * note, int16_t * samples, float t, int rate, int channels, int type, void * opts); 
    749 
    850#endif 
  • libroardsp/midi.c

    r203 r367  
    33#include "libroar.h" 
    44 
     5struct { 
     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 
     25char         * 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 
     35uint16_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 
     45float          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 
     55int            roar_midi_find_octave (char * note); 
     56int            roar_midi_add_octave  (struct roar_note_octave * note) { 
     57 note->name[0] = 0; 
     58 return -1; 
     59} 
     60 
     61int            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 
     86int 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 
    5109//ll 
Note: See TracChangeset for help on using the changeset viewer.