diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/midi.h | 33 | ||||
| -rw-r--r-- | src/midimapparser.cc (renamed from src/midiplayer.h) | 63 | ||||
| -rw-r--r-- | src/midimapparser.h (renamed from src/midimap.h) | 39 | ||||
| -rw-r--r-- | src/midimapper.cc | 74 | ||||
| -rw-r--r-- | src/midimapper.h | 16 | ||||
| -rw-r--r-- | src/midiplayer.cc | 174 | 
6 files changed, 75 insertions, 324 deletions
| diff --git a/src/midi.h b/src/midi.h deleted file mode 100644 index 5d1515e..0000000 --- a/src/midi.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            midi.h - * - *  Wed Sep 15 15:43:53 CEST 2010 - *  Copyright 2010 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU General Public License as published by - *  the Free Software Foundation; either version 2 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU General Public License for more details. - * - *  You should have received a copy of the GNU General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#ifndef __DRUMGIZMO_MIDI_H__ -#define __DRUMGIZMO_MIDI_H__ - -typedef unsigned int midi_note_t; -typedef unsigned int midi_velocity_t; - -#endif/*__DRUMGIZMO_MIDI_H__*/ diff --git a/src/midiplayer.h b/src/midimapparser.cc index e41c73a..07210a5 100644 --- a/src/midiplayer.h +++ b/src/midimapparser.cc @@ -1,9 +1,9 @@  /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */  /*************************************************************************** - *            midiplayer.h + *            midimapparser.cc   * - *  Sat Jul 26 15:23:18 CEST 2008 - *  Copyright 2008 Bent Bisballe Nyeng + *  Mon Aug  8 16:55:30 CEST 2011 + *  Copyright 2011 Bent Bisballe Nyeng   *  deva@aasimon.org   ****************************************************************************/ @@ -24,31 +24,46 @@   *  along with DrumGizmo; if not, write to the Free Software   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.   */ -#ifndef __DRUMGIZMO_MIDIPLAYER_H__ -#define __DRUMGIZMO_MIDIPLAYER_H__ +#include "midimapparser.h" -#include <jack/jack.h> -#include <jack/midiport.h> -#include <string> -#include <smf.h> +MidiMapParser::MidiMapParser(std::string file) +{ +  fd = fopen(file.c_str(), "r"); +} -class MidiPlayer { -public: -  MidiPlayer(std::string midifile); -  ~MidiPlayer(); +MidiMapParser::~MidiMapParser() +{ +  if(fd) fclose(fd); +} -  int process(jack_nframes_t nframes); +void MidiMapParser::startTag(std::string name, attr_t attr) +{ +  if(name == "map") { +    if(attr.find("note") != attr.end() && attr.find("instr") != attr.end()) { +      midimap[atoi(attr["note"].c_str())] = attr["instr"]; +    } +  } +} -private: -  jack_client_t *jack_client; -  jack_port_t *port; +int MidiMapParser::readData(char *data, size_t size) +{ +  if(!fd) return -1; +  return fread(data, 1, size, fd); +} -  size_t timer; -  size_t next; +#ifdef TEST_MIDIMAPPARSER +//Additional dependency files +//deps: +//Required cflags (autoconf vars may be used) +//cflags: +//Required link options (autoconf vars may be used) +//libs: +#include "test.h" -  smf_t *smf; -  smf_event_t *cur_event; -  unsigned int timeline; -}; +TEST_BEGIN; -#endif/*__DRUMGIZMO_MIDIPLAYER_H__*/ +// TODO: Put some testcode here (see test.h for usable macros). + +TEST_END; + +#endif/*TEST_MIDIMAPPARSER*/ diff --git a/src/midimap.h b/src/midimapparser.h index 6679d98..98ab886 100644 --- a/src/midimap.h +++ b/src/midimapparser.h @@ -1,9 +1,9 @@  /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */  /*************************************************************************** - *            midimap.h + *            midimapparser.h   * - *  Wed Sep 15 15:44:48 CEST 2010 - *  Copyright 2010 Bent Bisballe Nyeng + *  Mon Aug  8 16:55:30 CEST 2011 + *  Copyright 2011 Bent Bisballe Nyeng   *  deva@aasimon.org   ****************************************************************************/ @@ -24,20 +24,29 @@   *  along with DrumGizmo; if not, write to the Free Software   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.   */ -#ifndef __DRUMGIZMO_MIDIMAP_H__ -#define __DRUMGIZMO_MIDIMAP_H__ +#ifndef __DRUMGIZMO_MIDIMAPPARSER_H__ +#define __DRUMGIZMO_MIDIMAPPARSER_H__ -#include "midi.h" +#include <stdio.h> -class MidiMap { +#include "saxparser.h" + +#include "midimapper.h" + +class MidiMapParser : public SAXParser {  public: -  midi_note_t note; -  midi_velocity_t from; -  midi_velocity_t to; -  std::string instrument; -  // float gain; // TODO: Add this to gain the entire instrument. -}; +  MidiMapParser(std::string file); +  ~MidiMapParser(); + +  void startTag(std::string name, attr_t attr); -//typedef std::vector< MidiMap > MidiMaps; +  midimap_t midimap; + +protected: +  int readData(char *data, size_t size); + +private: +  FILE *fd; +}; -#endif/*__DRUMGIZMO_MIDIMAP_H__*/ +#endif/*__DRUMGIZMO_MIDIMAPPARSER_H__*/ diff --git a/src/midimapper.cc b/src/midimapper.cc index 243c22e..ca0cc21 100644 --- a/src/midimapper.cc +++ b/src/midimapper.cc @@ -26,74 +26,10 @@   */  #include "midimapper.h" -#include <stdio.h> - -#define NOTE_ON 0x9 - -MidiMapper::MidiMapper(DrumKit *drumkit) -{ -  this->drumkit = drumkit; -  /* -35  Acoustic Bass Drum  59  Ride Cymbal 2 -36  Bass Drum 1         60  Hi Bongo -37  Side Stick          61  Low Bongo -38  Acoustic Snare      62  Mute Hi Conga -39  Hand Clap           63  Open Hi Conga -40  Electric Snare      64  Low Conga -41  Low Floor Tom       65  High Timbale -42  Closed Hi-Hat       66  Low Timbale -43  High Floor Tom      67  High Agogo -44  Pedal Hi-Hat        68  Low Agogo -45  Low Tom             69  Cabasa -46  Open Hi-Hat         70  Maracas -47  Low-Mid Tom         71  Short Whistle -48  Hi-Mid Tom          72  Long Whistle -49  Crash Cymbal 1      73  Short Guiro -50  High Tom            74  Long Guiro -51  Ride Cymbal 1       75  Claves -52  Chinese Cymbal      76  Hi Wood Block -53  Ride Bell           77  Low Wood Block -54  Tambourine          78  Mute Cuica -55  Splash Cymbal       79  Open Cuica -56  Cowbell             80  Mute Triangle -57  Crash Cymbal 2      81  Open Triangle -58  Vibraslap -  */ -} - -//http://ccrma-www.stanford.edu/~craig/articles/linuxmidi/misc/essenmidi.html -Sample *MidiMapper::map(jack_midi_event_t event) +int MidiMapper::lookup(int note)  { -  Sample *sample = NULL; -#if 0 -  //  printf("m"); fflush(stdout); - -  if(event.size != 3) return NULL; -  if((event.buffer[0] & NOTE_ON) != NOTE_ON) return NULL; - -  int key = event.buffer[1]; -  int velocity = event.buffer[2]; - -  if(velocity == 0) return NULL; -  /* -  // Parse midi event -  printf("[ Time: %d  Size: %d  ", event.time, event.size); -  for(size_t j = 0; j < event.size; j++) { -    jack_midi_data_t m = event.buffer[j]; -    printf("  Data: %d ", m); -  } -  printf("]\n"); -  */ -   -  if(drumkit->instruments.find(key) == drumkit->instruments.end()) { -    printf("Unknown instrument %d\n", key); -    return NULL; -  } -   -  Velocity *v = drumkit->instruments[key]->getVelocity(velocity); -   -  if(!v) return NULL; -  sample = v->getSample(); -#endif -  return sample; +  if(midimap.find(note) == midimap.end()) return -1; +  std::string instr = midimap[note]; +  if(instrmap.find(instr) == instrmap.end()) return -1; +  return instrmap[instr];  } diff --git a/src/midimapper.h b/src/midimapper.h index c600d4f..74c268c 100644 --- a/src/midimapper.h +++ b/src/midimapper.h @@ -27,20 +27,18 @@  #ifndef __DRUMGIZMO_MIDIMAPPER_H__  #define __DRUMGIZMO_MIDIMAPPER_H__ -#include <jack/midiport.h> - -#include "drumkit.h" -  #include <map> +#include <string> + +typedef std::map<int, std::string> midimap_t; +typedef std::map<std::string, int> instrmap_t;  class MidiMapper {  public: -  MidiMapper(DrumKit *drumkit); - -  Sample *map(jack_midi_event_t event); +  int lookup(int note); -private: -  DrumKit *drumkit; +  instrmap_t instrmap; +  midimap_t midimap;  };  #endif/*__DRUMGIZMO_MIDIMAPPER_H__*/ diff --git a/src/midiplayer.cc b/src/midiplayer.cc deleted file mode 100644 index 9864d1c..0000000 --- a/src/midiplayer.cc +++ /dev/null @@ -1,174 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            midiplayer.cc - * - *  Sat Jul 26 15:23:19 CEST 2008 - *  Copyright 2008 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU General Public License as published by - *  the Free Software Foundation; either version 2 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo is distributed in the hope that it will be useful, - *  but WITHOUT ANY WARRANTY; without even the implied warranty of - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - *  GNU General Public License for more details. - * - *  You should have received a copy of the GNU General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "midiplayer.h" - -int _process(jack_nframes_t nframes, void *arg) -{ -  return ((MidiPlayer*)arg)->process(nframes); -} - -MidiPlayer::MidiPlayer(std::string filename) -{ -  timeline = 0; -  cur_event = NULL; - -  printf("Loading MIDI file: %s\n", filename.c_str()); -  smf = smf_load(filename.c_str()); -  printf("done\n"); - -	jack_status_t status; - -  jack_client_t *jack_client = jack_client_open("MidiGizmo", JackNullOption, &status); - -	port = jack_port_register(jack_client, -                            "midi_out", -                            JACK_DEFAULT_MIDI_TYPE, -                            JackPortIsOutput,// | JackPortIsTerminal, -                            0); - -  jack_set_process_callback(jack_client, _process, this); - -	jack_activate(jack_client); - -  jack_connect(jack_client, "MidiGizmo:midi_out", "DrumGizmo:midi_in"); - -  jack_connect(jack_client, "DrumGizmo:Alesis", "system:playback_1"); -  jack_connect(jack_client, "DrumGizmo:Kick-R", "system:playback_1"); -  jack_connect(jack_client, "DrumGizmo:Kick-L", "system:playback_1"); -  jack_connect(jack_client, "DrumGizmo:SnareTop", "system:playback_1"); -  jack_connect(jack_client, "DrumGizmo:SnareBottom", "system:playback_1"); -  jack_connect(jack_client, "DrumGizmo:SnareTrigger", "system:playback_1"); -  jack_connect(jack_client, "DrumGizmo:Tom1", "system:playback_1"); -  jack_connect(jack_client, "DrumGizmo:Tom2", "system:playback_1"); -  jack_connect(jack_client, "DrumGizmo:Tom3", "system:playback_1"); -  jack_connect(jack_client, "DrumGizmo:Tom4", "system:playback_1"); -  jack_connect(jack_client, "DrumGizmo:Ride", "system:playback_1"); -  //  jack_connect(jack_client, "DrumGizmo:Hihat", "system:playback_1"); - -  jack_connect(jack_client, "DrumGizmo:Alesis", "system:playback_2"); -  jack_connect(jack_client, "DrumGizmo:Kick-R", "system:playback_2"); -  jack_connect(jack_client, "DrumGizmo:Kick-L", "system:playback_2"); -  jack_connect(jack_client, "DrumGizmo:SnareTop", "system:playback_2"); -  jack_connect(jack_client, "DrumGizmo:SnareBottom", "system:playback_2"); -  jack_connect(jack_client, "DrumGizmo:SnareTrigger", "system:playback_2"); -  jack_connect(jack_client, "DrumGizmo:Tom1", "system:playback_2"); -  jack_connect(jack_client, "DrumGizmo:Tom2", "system:playback_2"); -  jack_connect(jack_client, "DrumGizmo:Tom3", "system:playback_2"); -  jack_connect(jack_client, "DrumGizmo:Tom4", "system:playback_2"); -  jack_connect(jack_client, "DrumGizmo:Ride", "system:playback_2"); -  //  jack_connect(jack_client, "DrumGizmo:Hihat", "system:playback_2"); - -  jack_connect(jack_client, "DrumGizmo:OH-R", "system:playback_1"); -  jack_connect(jack_client, "DrumGizmo:OH-L", "system:playback_2"); -  jack_connect(jack_client, "DrumGizmo:Amb-R", "system:playback_1"); -  jack_connect(jack_client, "DrumGizmo:Amb-L", "system:playback_2"); - -  /* -  timer = 0; -  next = 44100; -  */ -} - -MidiPlayer::~MidiPlayer() -{ -  smf_delete(smf); -} - -#if 0 // All -#define NUM_INST 11 -static int inst[] = { 35, 36, 38, 46, 41, 43, 45, 47, 49, 57, 51 }; -#endif - -#if 0 // Cymbals -#define NUM_INST 3 -static int inst[] = { 51, 49, 57 }; -#endif - -#if 0 // Toms -#define NUM_INST 4 -static int inst[] = { 41, 43, 45, 47 }; -#endif - -#if 0 // Kicks -#define NUM_INST 2 -static int inst[] = { 35, 36 }; -#endif -int MidiPlayer::process(jack_nframes_t nframes) -{ -  //  if(jack_port_connected_to(test_midi_port, "DrumGizmo:midi_in")) { -  void* port_buf = jack_port_get_buffer(port, nframes); -     - -  double cur_max_time = (double)(timeline + nframes) / 44100.0; -  double cur_min_time = (double)(timeline) / 44100.0; - -  printf("["); fflush(stdout); - -  if(!cur_event) cur_event = smf_get_next_event(smf); - -  do { -    if(cur_event) { -      if(!smf_event_is_metadata(cur_event)) { - -        printf("p"); fflush(stdout); - -        jack_nframes_t time = (jack_nframes_t)((cur_event->time_seconds - cur_min_time) * 44100.0); -        jack_midi_event_write(port_buf, time, (jack_midi_data_t*)cur_event->midi_buffer, -                              cur_event->midi_buffer_length); -      } -    } else { -      smf_rewind(smf); -    } -    cur_event = smf_get_next_event(smf); -    while(!cur_event) cur_event = smf_get_next_event(smf); -  } while(cur_event->time_seconds < cur_max_time && cur_event->time_seconds >= cur_min_time); - -  timeline += nframes; - -  printf("]\n"); fflush(stdout); - - -  /* -  if(timer > next) { // activate every second (44100 samples) - - -    jack_nframes_t time = (jack_nframes_t)(((float)rand() / (float)RAND_MAX) * nframes); -    size_t size = 3; -    jack_midi_data_t note[] = { NOTE_ON, inst[rand() % NUM_INST], rand() % 127}; -    jack_midi_event_write(port_buf, time, note, size); - -    timer = 0; -    next = (size_t)(((float)rand() / (float)RAND_MAX) * 0.2 * 44100); -  } - -  timer += nframes; -  */ -   -  return 0; -} - - | 
