summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--lib/SMF.cc1
-rw-r--r--lib/message.cc1
-rw-r--r--tools/mididump.cc1
3 files changed, 3 insertions, 0 deletions
diff --git a/lib/SMF.cc b/lib/SMF.cc
index ba3179d..2c62b1f 100644
--- a/lib/SMF.cc
+++ b/lib/SMF.cc
@@ -1,62 +1,63 @@
1#include <iostream> 1#include <iostream>
2#include <fstream> 2#include <fstream>
3#include <algorithm> 3#include <algorithm>
4#include <iterator> 4#include <iterator>
5#include <cstring>
5#include <midillo/SMF.h> 6#include <midillo/SMF.h>
6 7
7namespace midillo { 8namespace midillo {
8 using std::ifstream; 9 using std::ifstream;
9 using std::ofstream; 10 using std::ofstream;
10 using std::cin; 11 using std::cin;
11 using std::cout; 12 using std::cout;
12 using std::copy; 13 using std::copy;
13 using std::ostream_iterator; 14 using std::ostream_iterator;
14 using std::endl; 15 using std::endl;
15 16
16 void SMF_t::load(const char *f,bool stdinable) { 17 void SMF_t::load(const char *f,bool stdinable) {
17 if(stdinable && !strcmp(f,"-")) { 18 if(stdinable && !strcmp(f,"-")) {
18 load(cin); 19 load(cin);
19 }else{ 20 }else{
20 ifstream s(f,std::ios::in|std::ios::binary); 21 ifstream s(f,std::ios::in|std::ios::binary);
21 load(s); 22 load(s);
22 } 23 }
23 } 24 }
24 25
25 void SMF_t::load(istream& s) { 26 void SMF_t::load(istream& s) {
26 mthd.load(s); 27 mthd.load(s);
27 tracks.resize(mthd.ntracks); 28 tracks.resize(mthd.ntracks);
28 tracks_t::iterator i = tracks.begin(); 29 tracks_t::iterator i = tracks.begin();
29 for(int t=0;t<mthd.ntracks;++t,++i) { 30 for(int t=0;t<mthd.ntracks;++t,++i) {
30 i->load(s); 31 i->load(s);
31 } 32 }
32 } 33 }
33 34
34 void SMF_t::save(const char *f,bool stdoutable) const { 35 void SMF_t::save(const char *f,bool stdoutable) const {
35 if(stdoutable && !strcmp(f,"-")) { 36 if(stdoutable && !strcmp(f,"-")) {
36 save(cout); 37 save(cout);
37 }else{ 38 }else{
38 ofstream s(f,std::ios::out|std::ios::trunc|std::ios::binary); 39 ofstream s(f,std::ios::out|std::ios::trunc|std::ios::binary);
39 save(s); 40 save(s);
40 } 41 }
41 } 42 }
42 43
43 void SMF_t::save(ostream& s) const { 44 void SMF_t::save(ostream& s) const {
44 mthd.save(s); 45 mthd.save(s);
45 for(tracks_t::const_iterator i=tracks.begin();i!=tracks.end();++i) { 46 for(tracks_t::const_iterator i=tracks.begin();i!=tracks.end();++i) {
46 i->save(s); 47 i->save(s);
47 } 48 }
48 } 49 }
49 50
50 void SMF_t::dump(ostream& s) const { 51 void SMF_t::dump(ostream& s) const {
51 std::ios::fmtflags ff = s.flags(); 52 std::ios::fmtflags ff = s.flags();
52 s.unsetf(std::ios::hex); s.setf(std::ios::dec); 53 s.unsetf(std::ios::hex); s.setf(std::ios::dec);
53 s 54 s
54 << "SMF with " << tracks.size() << " track(s)" << endl 55 << "SMF with " << tracks.size() << " track(s)" << endl
55 << mthd << endl; 56 << mthd << endl;
56 copy( 57 copy(
57 tracks.begin(), tracks.end(), 58 tracks.begin(), tracks.end(),
58 ostream_iterator<MTrk_t>(s,"\n") ); 59 ostream_iterator<MTrk_t>(s,"\n") );
59 s.flags(ff); 60 s.flags(ff);
60 } 61 }
61 62
62} 63}
diff --git a/lib/message.cc b/lib/message.cc
index 8f9e68a..6a5cfd6 100644
--- a/lib/message.cc
+++ b/lib/message.cc
@@ -1,98 +1,99 @@
1#include <algorithm> 1#include <algorithm>
2#include <iterator> 2#include <iterator>
3#include <cassert>
3#include <midillo/message.h> 4#include <midillo/message.h>
4#include <midillo/util.h> 5#include <midillo/util.h>
5#include <midillo/exception.h> 6#include <midillo/exception.h>
6 7
7namespace midillo { 8namespace midillo {
8 using std::copy; 9 using std::copy;
9 using std::ostream_iterator; 10 using std::ostream_iterator;
10 11
11 unsigned long message_t::calculate_save_size(int& rs) const { 12 unsigned long message_t::calculate_save_size(int& rs) const {
12 unsigned long rv = 0; 13 unsigned long rv = 0;
13 if(status!=rs) { 14 if(status!=rs) {
14 ++rv; 15 ++rv;
15 rs = status; 16 rs = status;
16 }else if((status&status_event_bits)==status_system) { 17 }else if((status&status_event_bits)==status_system) {
17 rs = -1; 18 rs = -1;
18 ++rv; // XXX: is it really needed? 19 ++rv; // XXX: is it really needed?
19 } 20 }
20 switch(status&status_event_bits) { 21 switch(status&status_event_bits) {
21 case status_note_off: 22 case status_note_off:
22 case status_note_on: 23 case status_note_on:
23 case status_polyphonic_key_pressure: // aka status_aftertouch 24 case status_polyphonic_key_pressure: // aka status_aftertouch
24 case status_control_change: 25 case status_control_change:
25 case status_pitch_wheel_change: 26 case status_pitch_wheel_change:
26 rv += 2; break; 27 rv += 2; break;
27 case status_program_change: 28 case status_program_change:
28 case status_channel_pressure: 29 case status_channel_pressure:
29 ++rv; break; 30 ++rv; break;
30 case status_system: 31 case status_system:
31 switch(status&status_system_bits) { 32 switch(status&status_system_bits) {
32 case status_system_sysex: 33 case status_system_sysex:
33 case status_system_end_of_sysex: 34 case status_system_end_of_sysex:
34 rv += data.size()+1; break; 35 rv += data.size()+1; break;
35 case status_system_MTC_quarter_frame: 36 case status_system_MTC_quarter_frame:
36 case status_system_song_select: 37 case status_system_song_select:
37 ++rv; break; 38 ++rv; break;
38 case status_system_song_position_pointer: 39 case status_system_song_position_pointer:
39 rv += 2; break; 40 rv += 2; break;
40 case status_system_tune_request: 41 case status_system_tune_request:
41 case status_system_timing_clock: // aka status_system_midi_clock 42 case status_system_timing_clock: // aka status_system_midi_clock
42 case status_system_midi_tick: 43 case status_system_midi_tick:
43 case status_system_start: // aka status_system_midi_start 44 case status_system_start: // aka status_system_midi_start
44 case status_system_stop: // aka status_system_midi_stop 45 case status_system_stop: // aka status_system_midi_stop
45 case status_system_continue: // aka status_system_midi_continue 46 case status_system_continue: // aka status_system_midi_continue
46 case status_system_active_sense: 47 case status_system_active_sense:
47 break; /* XXX: ensure there is no data? */ 48 break; /* XXX: ensure there is no data? */
48 case status_system_meta: // also reset, but not for the purpose of midi file 49 case status_system_meta: // also reset, but not for the purpose of midi file
49 ++rv; 50 ++rv;
50 rv += calcVLsize(data.size()); 51 rv += calcVLsize(data.size());
51 rv += data.size(); 52 rv += data.size();
52 break; 53 break;
53 default: 54 default:
54 throw exception(CODEPOINT,"Internal error"); 55 throw exception(CODEPOINT,"Internal error");
55 break; 56 break;
56 } 57 }
57 break; 58 break;
58 default: 59 default:
59 throw exception(CODEPOINT,"Internal error"); 60 throw exception(CODEPOINT,"Internal error");
60 break; 61 break;
61 } 62 }
62 return rv; 63 return rv;
63 } 64 }
64 65
65 void message_t::save(int& rs,ostream& s) const { 66 void message_t::save(int& rs,ostream& s) const {
66 if(status!=rs) { 67 if(status!=rs) {
67 s.put(status); 68 s.put(status);
68 if(!s.good()) 69 if(!s.good())
69 throw exception_output_error(CODEPOINT,"Error writing midi status byte"); 70 throw exception_output_error(CODEPOINT,"Error writing midi status byte");
70 rs = status; 71 rs = status;
71 }else if((status&status_event_bits)==status_system) { 72 }else if((status&status_event_bits)==status_system) {
72 rs = -1; 73 rs = -1;
73 s.put(status); // XXX: is it really needed? 74 s.put(status); // XXX: is it really needed?
74 if(!s.good()) 75 if(!s.good())
75 throw exception_output_error(CODEPOINT,"Error writing midi system status byte"); 76 throw exception_output_error(CODEPOINT,"Error writing midi system status byte");
76 } 77 }
77 switch(status&status_event_bits) { 78 switch(status&status_event_bits) {
78 case status_note_off: 79 case status_note_off:
79 case status_note_on: 80 case status_note_on:
80 case status_polyphonic_key_pressure: // aka status_aftertouch 81 case status_polyphonic_key_pressure: // aka status_aftertouch
81 case status_control_change: 82 case status_control_change:
82 case status_pitch_wheel_change: 83 case status_pitch_wheel_change:
83 save_data(s,2); break; 84 save_data(s,2); break;
84 case status_program_change: 85 case status_program_change:
85 case status_channel_pressure: 86 case status_channel_pressure:
86 save_data(s,1); break; 87 save_data(s,1); break;
87 case status_system: 88 case status_system:
88 switch(status&status_system_bits) { 89 switch(status&status_system_bits) {
89 case status_system_sysex: 90 case status_system_sysex:
90 case status_system_end_of_sysex: 91 case status_system_end_of_sysex:
91 save_sysex(s); break; 92 save_sysex(s); break;
92 case status_system_MTC_quarter_frame: 93 case status_system_MTC_quarter_frame:
93 case status_system_song_select: 94 case status_system_song_select:
94 save_data(s,1); break; 95 save_data(s,1); break;
95 case status_system_song_position_pointer: 96 case status_system_song_position_pointer:
96 save_data(s,2); break; 97 save_data(s,2); break;
97 case status_system_tune_request: 98 case status_system_tune_request:
98 case status_system_timing_clock: // aka status_system_midi_clock 99 case status_system_timing_clock: // aka status_system_midi_clock
diff --git a/tools/mididump.cc b/tools/mididump.cc
index 83b7086..604bcc0 100644
--- a/tools/mididump.cc
+++ b/tools/mididump.cc
@@ -1,84 +1,85 @@
1#include <getopt.h> 1#include <getopt.h>
2#include <iostream> 2#include <iostream>
3#include <fstream> 3#include <fstream>
4#include <string> 4#include <string>
5#include <algorithm> 5#include <algorithm>
6#include <cstring>
6using namespace std; 7using namespace std;
7#include <konforka/exception.h> 8#include <konforka/exception.h>
8#include <midillo/SMF.h> 9#include <midillo/SMF.h>
9using namespace midillo; 10using namespace midillo;
10 11
11#include "config.h" 12#include "config.h"
12#define PHEADER PACKAGE " " VERSION " - mididump - dump midi files" 13#define PHEADER PACKAGE " " VERSION " - mididump - dump midi files"
13#define PCOPY "Copyright (c) 2006 Klever Group" 14#define PCOPY "Copyright (c) 2006 Klever Group"
14 15
15static void usage(const char *p) { 16static void usage(const char *p) {
16 cerr << PHEADER << endl 17 cerr << PHEADER << endl
17 << PCOPY << endl << endl 18 << PCOPY << endl << endl
18 << " " << p << " [options] [<input-file>[ <output-file>]]" << endl << endl 19 << " " << p << " [options] [<input-file>[ <output-file>]]" << endl << endl
19 << " -h, --help" << endl 20 << " -h, --help" << endl
20 << " --usage display this text" << endl 21 << " --usage display this text" << endl
21 << " -V, --version display version number" << endl 22 << " -V, --version display version number" << endl
22 << " -L, --license show license" << endl; 23 << " -L, --license show license" << endl;
23} 24}
24 25
25main(int argc,char **argv) { 26main(int argc,char **argv) {
26 try { 27 try {
27 while(true) { 28 while(true) {
28 static struct option opts[] = { 29 static struct option opts[] = {
29 { "help", no_argument, 0, 'h' }, 30 { "help", no_argument, 0, 'h' },
30 { "usage", no_argument, 0, 'h' }, 31 { "usage", no_argument, 0, 'h' },
31 { "version", no_argument, 0, 'V' }, 32 { "version", no_argument, 0, 'V' },
32 { "license", no_argument, 0, 'L' }, 33 { "license", no_argument, 0, 'L' },
33 { NULL, 0, 0, 0 } 34 { NULL, 0, 0, 0 }
34 }; 35 };
35 int c = getopt_long(argc,argv,"f:hVLl",opts,NULL); 36 int c = getopt_long(argc,argv,"f:hVLl",opts,NULL);
36 if(c==-1) 37 if(c==-1)
37 break; 38 break;
38 switch(c) { 39 switch(c) {
39 case 'h': 40 case 'h':
40 usage(*argv); 41 usage(*argv);
41 exit(0); 42 exit(0);
42 break; 43 break;
43 case 'V': 44 case 'V':
44 cerr << VERSION << endl; 45 cerr << VERSION << endl;
45 exit(0); 46 exit(0);
46 break; 47 break;
47 case 'L': 48 case 'L':
48 extern const char *COPYING; 49 extern const char *COPYING;
49 cerr << COPYING << endl; 50 cerr << COPYING << endl;
50 exit(0); 51 exit(0);
51 break; 52 break;
52 default: 53 default:
53 cerr << "Huh??" << endl; 54 cerr << "Huh??" << endl;
54 break; 55 break;
55 } 56 }
56 } 57 }
57 const char *infile = "-"; 58 const char *infile = "-";
58 if(optind<argc) 59 if(optind<argc)
59 infile = argv[optind++]; 60 infile = argv[optind++];
60 const char *oufile = "-"; 61 const char *oufile = "-";
61 if(optind<argc) 62 if(optind<argc)
62 oufile = argv[optind++]; 63 oufile = argv[optind++];
63 if(optind<argc) { 64 if(optind<argc) {
64 usage(*argv); 65 usage(*argv);
65 exit(1); 66 exit(1);
66 } 67 }
67 SMF_t in(infile); 68 SMF_t in(infile);
68 if(strcmp(oufile,"-")) { 69 if(strcmp(oufile,"-")) {
69 ofstream s(oufile); s << in; 70 ofstream s(oufile); s << in;
70 }else{ 71 }else{
71 cout << in; 72 cout << in;
72 } 73 }
73 return 0; 74 return 0;
74 }catch(konforka::exception& e) { 75 }catch(konforka::exception& e) {
75 cerr << "Oops... Konforka exception:" << endl 76 cerr << "Oops... Konforka exception:" << endl
76 << " what: " << e.what() << endl 77 << " what: " << e.what() << endl
77 << " where: " << e.where() << endl; 78 << " where: " << e.where() << endl;
78 return 1; 79 return 1;
79 }catch(exception& e) { 80 }catch(exception& e) {
80 cerr << "Oops... Exception:" << endl 81 cerr << "Oops... Exception:" << endl
81 << " what: " << e.what() << endl; 82 << " what: " << e.what() << endl;
82 return 1; 83 return 1;
83 } 84 }
84} 85}