stuff-from-scratch/src/audio/midi/reader/MidiChannelEventAdapter.cpp
2022-12-04 18:13:32 +00:00

72 lines
2 KiB
C++

#include "MidiChannelEventAdapter.h"
#include "BinaryStream.h"
#include "ByteUtils.h"
#include <iostream>
#include <bitset>
int MidiChannelEventAdapter::readEvent(std::ifstream* file, char firstByte, MidiChannelEvent* event, MidiChannelEvent::Type& lastEventType)
{
int first_four_bits = 0xF0;
int second_four_bits = 0xF;
int event_type = (firstByte & first_four_bits) >> 4;
int midi_channel = (firstByte & second_four_bits) >> 4;
unsigned byteCount = 0;
//std::cout << "Channel: " << midi_channel << std::endl;
const bool isStatusByte = ByteUtils::MostSignificantBitIsOne(firstByte);
if(isStatusByte)
{
event->SetTypeAndChannel(firstByte);
lastEventType = event->GetType();
}
else
{
event->SetType(lastEventType);
}
//std::cout << "MC Type " << static_cast<int>(event->GetType()) << std::endl;
switch(event->GetType())
{
case MidiChannelEvent::Type::NOTE_ON:
case MidiChannelEvent::Type::NOTE_OFF:
case MidiChannelEvent::Type::CONTROLLER:
{
if (isStatusByte)
{
byteCount += readEventData(file, event);
}
else
{
byteCount += readEventData(file, event, firstByte);
}
break;
}
case MidiChannelEvent::Type::PROGRAM:
{
int value0 = *BinaryStream::getNextByteAsInt(file);
byteCount ++;
break;
}
default:
//std::cout << "Unknown status event: " << std::bitset<8>(firstByte) << "|" << event_type <<std::endl;
break;
}
return byteCount;
}
int MidiChannelEventAdapter::readEventData(std::ifstream* file, MidiChannelEvent* event, char c)
{
int value0 = int(c);
int value1 = *BinaryStream::getNextByteAsInt(file);
event->SetValues(value0, value1);
return 1;
}
int MidiChannelEventAdapter::readEventData(std::ifstream* file, MidiChannelEvent* event)
{
int value0 = *BinaryStream::getNextByteAsInt(file);
int value1 = *BinaryStream::getNextByteAsInt(file);
event->SetValues(value0, value1);
return 2;
}