From 2289074fe008a0d1a8d05f44a12a405351aad506 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Mon, 8 Aug 2011 22:19:46 +0200 Subject: New midimapper. --- src/midi.h | 33 ---------- src/midimap.h | 43 ------------- src/midimapparser.cc | 69 ++++++++++++++++++++ src/midimapparser.h | 52 +++++++++++++++ src/midimapper.cc | 74 ++-------------------- src/midimapper.h | 16 +++-- src/midiplayer.cc | 174 --------------------------------------------------- src/midiplayer.h | 54 ---------------- 8 files changed, 133 insertions(+), 382 deletions(-) delete mode 100644 src/midi.h delete mode 100644 src/midimap.h create mode 100644 src/midimapparser.cc create mode 100644 src/midimapparser.h delete mode 100644 src/midiplayer.cc delete mode 100644 src/midiplayer.h (limited to 'src') 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/midimap.h b/src/midimap.h deleted file mode 100644 index 6679d98..0000000 --- a/src/midimap.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * midimap.h - * - * Wed Sep 15 15:44:48 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_MIDIMAP_H__ -#define __DRUMGIZMO_MIDIMAP_H__ - -#include "midi.h" - -class MidiMap { -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. -}; - -//typedef std::vector< MidiMap > MidiMaps; - -#endif/*__DRUMGIZMO_MIDIMAP_H__*/ diff --git a/src/midimapparser.cc b/src/midimapparser.cc new file mode 100644 index 0000000..07210a5 --- /dev/null +++ b/src/midimapparser.cc @@ -0,0 +1,69 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * midimapparser.cc + * + * Mon Aug 8 16:55:30 CEST 2011 + * Copyright 2011 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 "midimapparser.h" + +MidiMapParser::MidiMapParser(std::string file) +{ + fd = fopen(file.c_str(), "r"); +} + +MidiMapParser::~MidiMapParser() +{ + if(fd) fclose(fd); +} + +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"]; + } + } +} + +int MidiMapParser::readData(char *data, size_t size) +{ + if(!fd) return -1; + return fread(data, 1, size, fd); +} + +#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" + +TEST_BEGIN; + +// TODO: Put some testcode here (see test.h for usable macros). + +TEST_END; + +#endif/*TEST_MIDIMAPPARSER*/ diff --git a/src/midimapparser.h b/src/midimapparser.h new file mode 100644 index 0000000..98ab886 --- /dev/null +++ b/src/midimapparser.h @@ -0,0 +1,52 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * midimapparser.h + * + * Mon Aug 8 16:55:30 CEST 2011 + * Copyright 2011 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_MIDIMAPPARSER_H__ +#define __DRUMGIZMO_MIDIMAPPARSER_H__ + +#include + +#include "saxparser.h" + +#include "midimapper.h" + +class MidiMapParser : public SAXParser { +public: + MidiMapParser(std::string file); + ~MidiMapParser(); + + void startTag(std::string name, attr_t attr); + + midimap_t midimap; + +protected: + int readData(char *data, size_t size); + +private: + FILE *fd; +}; + +#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 - -#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 - -#include "drumkit.h" - #include +#include + +typedef std::map midimap_t; +typedef std::map 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; -} - - diff --git a/src/midiplayer.h b/src/midiplayer.h deleted file mode 100644 index e41c73a..0000000 --- a/src/midiplayer.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * midiplayer.h - * - * Sat Jul 26 15:23:18 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. - */ -#ifndef __DRUMGIZMO_MIDIPLAYER_H__ -#define __DRUMGIZMO_MIDIPLAYER_H__ - -#include -#include -#include -#include - -class MidiPlayer { -public: - MidiPlayer(std::string midifile); - ~MidiPlayer(); - - int process(jack_nframes_t nframes); - -private: - jack_client_t *jack_client; - jack_port_t *port; - - size_t timer; - size_t next; - - smf_t *smf; - smf_event_t *cur_event; - unsigned int timeline; -}; - -#endif/*__DRUMGIZMO_MIDIPLAYER_H__*/ -- cgit v1.2.3