int main(int argc, char** argv) { options.setOptions(argc, argv); checkOptions(options); int status; MidiFile midifile; if (options.getArgCount()) { status = midifile.read(options.getArg(1)); } else { status = midifile.read(cin); } if (status == 0) { cerr << "Error: could not read MIDI file" << endl; exit(1); } int tpq = midifile.getTicksPerQuarterNote(); midifile.linkNotePairs(); if (joinQ) { midifile.joinTracks(); } MidiEvent* mev; double duration; if (secondsQ) { midifile.doTimeAnalysis(); } if (secondsQ) { cout << "SEC\tDUR\tTRACK\tNOTE\n"; } else if (quarterQ) { cout << "QTRS\tDUR\tTRACK\tNOTE\n"; } else { cout << "TICKS\tDUR\tTRACK\tNOTE\n"; } cout << "============================\n"; for (int track=0; track < midifile.getTrackCount(); track++) { for (int i=0; i<midifile[track].size(); i++) { mev = &midifile[track][i]; if (!mev->isNoteOn()) { continue; } if (secondsQ) { duration = mev->getDurationInSeconds(); } else { duration = mev->getTickDuration(); } if (secondsQ) { cout << mev->seconds << '\t'; cout << duration << '\t'; } else if (quarterQ) { cout << mev->tick/tpq << '\t'; cout << duration/tpq << '\t'; } else { cout << mev->tick << '\t'; cout << duration << '\t'; } cout << mev->track << '\t'; cout << mev->getKeyNumber(); cout << endl; } if (midifile.getTrackCount() > 1) { cout << endl; } } return 0; }
void PCH_ChartManager::LoadMidiToDB(PCH_CString filePath,PCH_CString fileHash, bool update) { std::ifstream in2(filePath, std::ios::in | std::ios::binary); MidiFile midifile(in2); if (!midifile.status()) { printf("Error reading MIDI file %s\n",filePath); return; } printf("Loading midi file data...\n"); if(update) { printf("Deleting existing data...\n"); _db->DeleteChart(filePath); } midifile.absoluteTicks(); midifile.linkNotePairs(); midifile.doTimeAnalysis(); printf("Analysis complete...\n"); int totalTracks =midifile.size(); MidiEvent* mev; int chartID = _db->AddChart(filePath, fileHash); int trackID = 0; int trackItemCount = 0; #ifndef PCH_USE_HEAP PCH_ControllerEvent newEvent; PCH_ChartInstrument newInst; PCH_ChartTrackNote newNote; PCH_PitchBend newBend; #endif for (int track=0; track < totalTracks; track++) { trackItemCount = midifile[track].size(); if(trackItemCount == 0) continue; trackID = _db->AddTrack(chartID,track); printf("Track #%d added...\n",trackID); _db->BeginTransaction(); for (int i=0; i<trackItemCount; i++) { mev = &midifile[track][i]; if(mev->isTimbre()) { #ifdef PCH_USE_HEAP PCH_ChartInstrument* newInst = new PCH_ChartInstrument(); newInst->Channel = mev->getChannel(); newInst->Seconds = mev->seconds; newInst->InstrumentID = mev->getP1(); _db->AddInstrument(trackID,newInst); delete newInst; newInst = NULL; #else newInst.Channel = mev->getChannel(); newInst.Seconds = mev->seconds; newInst.InstrumentID = mev->getP1(); _db->AddInstrument(trackID,&newInst); #endif } if(mev->getCommandByte() == 0xFF && mev->getP1() == 0x03)//Title { printf("Title found\n"); unsigned char* title = &midifile[track][i][3];//CMD + p1 + p2 are omitted int titleSize = mev->getP2(); if(titleSize > 0) { char* strTitle = new char[titleSize+1]; memcpy(strTitle,title,titleSize); strTitle[titleSize] = '\0'; _db->SetTrackTitle(trackID, strTitle); } printf("Title end\n"); } if(mev->isNote()) //if(false) { if(mev->isNoteOn()) { #ifdef PCH_USE_HEAP PCH_ChartTrackNote* newNote = new PCH_ChartTrackNote(); newNote->Seconds = mev->seconds; newNote->SecondsDuration = mev->getDurationInSeconds(); newNote->Channel = mev->getChannel(); newNote->KeyNumber = mev->getKeyNumber(); newNote->Velocity = mev->getVelocity(); _db->AddNote(trackID, newNote); delete newNote; newNote = NULL; #else newNote.Seconds = mev->seconds; newNote.SecondsDuration = mev->getDurationInSeconds(); newNote.Channel = mev->getChannel(); newNote.KeyNumber = mev->getKeyNumber(); newNote.Velocity = mev->getVelocity(); _db->AddNote(trackID, &newNote); #endif } } if(mev->isController()) { #ifdef PCH_USE_HEAP PCH_ControllerEvent* newEvent = new PCH_ControllerEvent(); newEvent->Seconds = mev->seconds; newEvent->Channel = mev->getChannel(); newEvent->ControllerID = mev->getP1(); newEvent->Value = mev->getP2(); _db->AddEvent(trackID, newEvent); delete newEvent; newEvent = NULL; #else newEvent.Seconds = mev->seconds; newEvent.Channel = mev->getChannel(); newEvent.ControllerID = mev->getP1(); newEvent.Value = mev->getP2(); _db->AddEvent(trackID, &newEvent); #endif } if(mev->isPitchbend()) { #ifdef PCH_USE_HEAP PCH_PitchBend* newBend = new PCH_PitchBend(); newBend->Seconds = mev->seconds; newBend->Channel = mev->getChannel(); newBend->PitchBend = mev->getP1() + (mev->getP2() << 7); _db->AddPitchBend(trackID, newBend); delete newBend; newBend = NULL; #else newBend.Seconds = mev->seconds; newBend.Channel = mev->getChannel(); newBend.PitchBend = mev->getP1() + (mev->getP2() << 7); _db->AddPitchBend(trackID, &newBend); #endif } } _db->CommitTransaction(); } }