00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "File.h"
00024
00025 #include <iostream>
00026 #include <fstream>
00027 using namespace std;
00028
00029 #include <string.h>
00030
00031 #include "Header.h"
00032 #include "Track.h"
00033
00034 #include "DataBuffer.h"
00035
00036 #include "types.h"
00037
00038 namespace MIDI
00039 {
00040 File::File(string path)
00041 : _path(path),_header(new Header())
00042 { }
00043
00044 void File::setPath(string path)
00045 {
00046 _path=path;
00047 }
00048
00049 unsigned int File::numTracks()
00050 {
00051 return _tracks.size();
00052 }
00053
00054 Header* File::header()
00055 {
00056 return _header;
00057 }
00058
00059 Track* File::track(unsigned int id)
00060 {
00061 return _tracks[id];
00062 }
00063
00064 void File::addTrack(Track* track)
00065 {
00066 _tracks.push_back(track);
00067 _header->setNumTracks(_tracks.size());
00068 }
00069
00070 Chunk* File::readChunk(ifstream& fh)
00071 {
00072 byte chunkID[5];
00073 dword chunkSize;
00074 byte buffer[100000];
00075
00076
00077 fh.read((char*)chunkID,4);
00078 chunkID[4]='\0';
00079
00080
00081 fh.read((char*)buffer,4);
00082 chunkSize=byte2dword(buffer);
00083
00084
00085 fh.read((char*)buffer,chunkSize);
00086
00087
00088 Chunk *ret=0;
00089 if(strcmp((char*)chunkID,"MThd")==0)
00090 ret=new Header(buffer,chunkSize);
00091 else if(strcmp((char*)chunkID,"MTrk")==0)
00092 ret=new Track(buffer,chunkSize);
00093 else
00094 ret=0;
00095
00096 return ret;
00097 }
00098
00099 bool File::open()
00100 {
00101 ifstream fh(_path.c_str(),ios::in | ios::binary);
00102 if(!fh.is_open()) return false;
00103
00104 delete _header;
00105 _header=(Header*)readChunk(fh);
00106
00107 for(int i=0;i<_header->numTracks();i++)
00108 {
00109 Track* track=(Track*)readChunk(fh);
00110 _tracks.push_back(track);
00111 }
00112
00113 fh.close();
00114 return true;
00115 }
00116
00117 bool File::write()
00118 {
00119 ofstream fh(_path.c_str(),ios::out | ios::binary);
00120 if(!fh.is_open()) return false;
00121
00122 DataBuffer headerData=_header->data();
00123
00124 fh.write("MThd",4);
00125 fh.write((char*)dword2byte(headerData.size()),4);
00126 fh.write((char*)headerData.data(),headerData.size());
00127
00128 for(int i=0;i<_header->numTracks();i++)
00129 {
00130 Track* track=_tracks[i];
00131 DataBuffer trackData=track->data();
00132
00133 fh.write("MTrk",4);
00134 fh.write((char*)dword2byte(trackData.size()),4);
00135 fh.write((char*)trackData.data(),trackData.size());
00136 }
00137
00138 fh.close();
00139 return true;
00140 }
00141 }