pianobooster/src/MidiFile.h

84 lines
2.5 KiB
C++

/*********************************************************************************/
/*!
@file MidiFile.h
@brief xxxxx.
@author L. J. Barman
Copyright (c) 2008-2013, L. J. Barman, all rights reserved
This file is part of the PianoBooster application
PianoBooster 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 3 of the License, or
(at your option) any later version.
PianoBooster 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 PianoBooster. If not, see <http://www.gnu.org/licenses/>.
*/
/////////////////////////////////////////////////////////////////////////////
#ifndef __MIDIFILE_H__
#define __MIDIFILE_H__
#include <string>
#include <fstream>
#include "MidiEvent.h"
#include "MidiTrack.h"
#include "Merge.h"
#define DEFAULT_PPQN 96 /* Standard value for pulse per quarter note */
#define MAX_TRACKS 40
// Reads data from a standard MIDI file
class CMidiFile : public CMerge
{
public:
CMidiFile()
{
midiError(SMF_NO_ERROR);
m_ppqn = DEFAULT_PPQN;
setSize(MAX_TRACKS);
for (int i = 0; i < arraySize(m_tracks); i++)
m_tracks[i] = 0;
m_numberOfTracks = 0;
}
void openMidiFile(const std::string &filename);
int readWord(void);
int readHeader(void);
void rewind();
static int getPulsesPerQuarterNote(){return m_ppqn;}
template<typename T = int>
static T ppqnAdjust(float value) {
return static_cast<T>((value * static_cast<float>(CMidiFile::getPulsesPerQuarterNote()))/DEFAULT_PPQN );
}
QString getSongTitle() {return m_songTitle;}
void setLogLevel(int level){CMidiTrack::setLogLevel(level);}
midiErrors_t getMidiError() { return m_midiError;}
int numberOfTracks() const {return m_numberOfTracks;}
private:
bool checkMidiEventFromStream(int streamIdx);
CMidiEvent fetchMidiEventFromStream(int streamIdx);
void midiError(midiErrors_t error) {m_midiError = error;}
std::fstream m_file;
static int m_ppqn;
midiErrors_t m_midiError;
CMidiTrack* m_tracks[MAX_TRACKS];
QString m_songTitle;
int m_numberOfTracks;
};
#endif // __MIDIFILE_H__