CLAM-Development  1.4.0
MIDIFileWriter.cxx
Go to the documentation of this file.
1 #include "MIDITrack.hxx"
2 #include "MIDISong.hxx"
3 #include "MIDIWriter.hxx"
4 #include "MIDIFileWriter.hxx"
5 
6 namespace CLAM
7 {
9  : mInput("MIDISong Input",this)
10  {
11  MIDIFileIOConfig cfg;
12  Configure(cfg);
13  }
14 
16  : mInput("MIDISong Input",this)
17  {
18  Configure(cfg);
19  }
20 
22  {
23  }
24 
26  {
27  bool result = Do(mInput.GetData());
28  mInput.Consume();
29  return result;
30  }
31 
32  bool MIDIFileWriter::Do(const MIDISong& in)
33  {
34  MIDI::Song s;
35  s.SetTicksPerQ(96);
36  // add tempo
37  MIDI::Track* tempo_track = new MIDI::Track;
38  s.AddTrack(tempo_track);
39  MIDI::MetaEvent* m_ev = new MIDI::MetaEvent(MIDI::Message(0xFF,0x51,0x03),0,3);
40  m_ev->mData[0]=0x07; m_ev->mData[1]=0xA1; m_ev->mData[2]=0x20;
41  tempo_track->Add(m_ev);
42 
43  int nTracks = in.GetNumberOfTracks();
44  for(int i=0; i < nTracks; i++)
45  {
46  MIDI::Track* track = new MIDI::Track;
47  s.AddTrack(track);
48  BuildEventList(in.GetTracks()[i]);
49  std::list<MIDIEvent>::const_iterator it = mEventList.begin();
50  for(; it != mEventList.end(); it++)
51  {
52  const MIDIEvent &ev = *it;
53  // add event to current track
54  if(ev.Length()==2)
55  {
56  track->Add(new MIDI::Event(MIDI::Message(ev.GetMessage()[0], ev.GetMessage()[1]), ev.Ticks()));
57  }
58  else
59  {
60  track->Add(new MIDI::Event(MIDI::Message(ev.GetMessage()[0],ev.GetMessage()[1],ev.GetMessage()[2]), ev.Ticks()));
61  }
62  }
63  }
64  // write midi file
65  MIDI::Writer w(mConfig.GetFileName().c_str());
66  w.Write(s);
67  return true;
68  }
69 
71  {
72  CopyAsConcreteConfig(mConfig, c);
73  return true;
74  }
75 
76  void MIDIFileWriter::BuildEventList(const MIDITrack& trk)
77  {
78  mEventList.clear();
79  int nEvents = trk.GetEventInfo().Size();
80  for(int i=0; i < nEvents; i++)
81  {
82  mEventList.push_back(trk.GetEventInfo()[i]);
83  }
84  TData t;
85  int channel=0;
86  MIDIEvent ev;
87  ev.GetMessage().Resize(3);
88  ev.GetMessage().SetSize(3);
89  int nNotes = trk.GetTrackMelody().GetNumberOfNotes();
90  for(int i=0; i < nNotes; i++)
91  {
92  if(i < trk.GetChannels().Size()) channel = trk.GetChannels()[i];
93  ev.GetMessage()[0] = (0x90 | channel);
94  t = trk.GetTrackMelody().GetNoteArray()[i].GetTime().GetBegin();
95  int key = trk.GetTrackMelody().GetNoteArray()[i].GetKey();
96  int vel = trk.GetTrackMelody().GetNoteArray()[i].GetVelocity();
97  ev.SetTime(t);
98  ev.GetMessage()[1]=key;
99  ev.GetMessage()[2]=vel;
100  mEventList.push_back(ev);
101  t = trk.GetTrackMelody().GetNoteArray()[i].GetTime().GetEnd();
102  ev.SetTime(t);
103  ev.GetMessage()[2]=0;
104  mEventList.push_back(ev);
105  }
106  mEventList.sort();
107  }
108 }
109 
110 // END
111