You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
4.3 KiB
139 lines
4.3 KiB
/*
|
|
Rosegarden
|
|
A sequencer and musical notation editor.
|
|
|
|
This program is Copyright 2000-2008
|
|
Guillaume Laurent <glaurent@telegraph-road.org>,
|
|
Chris Cannam <cannam@all-day-breakfast.com>,
|
|
Richard Bown <bownie@bownie.com>
|
|
|
|
The moral right of the authors to claim authorship of this work
|
|
has been asserted.
|
|
|
|
This program 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 2 of the
|
|
License, or (at your option) any later version. See the file
|
|
COPYING included with this distribution for more information.
|
|
*/
|
|
|
|
#ifndef _SEQUENCER_DATA_BLOCK_H_
|
|
#define _SEQUENCER_DATA_BLOCK_H_
|
|
|
|
#include "ControlBlock.h"
|
|
#include "RealTime.h"
|
|
#include "MappedEvent.h"
|
|
|
|
namespace Rosegarden
|
|
{
|
|
|
|
/**
|
|
* ONLY PUT PLAIN DATA HERE - NO POINTERS EVER
|
|
* (and this struct mustn't have a constructor)
|
|
*/
|
|
struct LevelInfo
|
|
{
|
|
int level;
|
|
int levelRight; // if stereo audio
|
|
};
|
|
|
|
class MappedComposition;
|
|
|
|
|
|
#define SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS 512 // can't be a symbol
|
|
#define SEQUENCER_DATABLOCK_MAX_NB_SUBMASTERS 64 // can't be a symbol
|
|
#define SEQUENCER_DATABLOCK_RECORD_BUFFER_SIZE 1024 // MIDI events
|
|
|
|
class SequencerDataBlock
|
|
{
|
|
public:
|
|
/**
|
|
* Constructor only initialises memory if initialise is true
|
|
*/
|
|
SequencerDataBlock(bool initialise);
|
|
|
|
RealTime getPositionPointer() const {
|
|
return RealTime(m_positionSec, m_positionNsec);
|
|
}
|
|
void setPositionPointer(const RealTime &rt) {
|
|
m_positionSec = rt.sec;
|
|
m_positionNsec = rt.nsec;
|
|
}
|
|
|
|
bool getVisual(MappedEvent &ev) const;
|
|
void setVisual(const MappedEvent *ev);
|
|
|
|
int getRecordedEvents(MappedComposition &) const;
|
|
void addRecordedEvents(MappedComposition *);
|
|
|
|
bool getTrackLevel(TrackId track, LevelInfo &) const;
|
|
void setTrackLevel(TrackId track, const LevelInfo &);
|
|
|
|
// Two of these to rather hamfistedly get around the fact
|
|
// we need to fetch this value twice - once from IPB,
|
|
// and again for the Mixer.
|
|
//
|
|
bool getInstrumentLevel(InstrumentId id, LevelInfo &) const;
|
|
bool getInstrumentLevelForMixer(InstrumentId id, LevelInfo &) const;
|
|
|
|
void setInstrumentLevel(InstrumentId id, const LevelInfo &);
|
|
|
|
bool getInstrumentRecordLevel(InstrumentId id, LevelInfo &) const;
|
|
bool getInstrumentRecordLevelForMixer(InstrumentId id, LevelInfo &) const;
|
|
|
|
void setInstrumentRecordLevel(InstrumentId id, const LevelInfo &);
|
|
|
|
bool getSubmasterLevel(int submaster, LevelInfo &) const;
|
|
void setSubmasterLevel(int submaster, const LevelInfo &);
|
|
|
|
bool getMasterLevel(LevelInfo &) const;
|
|
void setMasterLevel(const LevelInfo &);
|
|
|
|
void setControlBlock(ControlBlock *cb) { m_controlBlock = cb; }
|
|
ControlBlock *getControlBlock() { return m_controlBlock; }
|
|
|
|
// Reset the temporaries on (for example) GUI restart
|
|
//
|
|
void clearTemporaries();
|
|
|
|
protected:
|
|
int instrumentToIndex(InstrumentId id) const;
|
|
int instrumentToIndexCreating(InstrumentId id);
|
|
ControlBlock *m_controlBlock;
|
|
|
|
// Two ints rather than a RealTime, as the RealTime default ctor
|
|
// initialises the space & so can't be used from the GUI's
|
|
// placement-new ctor (which has no write access and doesn't want
|
|
// it anyway). Likewise we use char[] instead of MappedEvents
|
|
|
|
int m_positionSec;
|
|
int m_positionNsec;
|
|
|
|
int m_visualEventIndex;
|
|
bool m_haveVisualEvent;
|
|
char m_visualEvent[sizeof(MappedEvent)];
|
|
|
|
int m_recordEventIndex;
|
|
char m_recordBuffer[sizeof(MappedEvent) *
|
|
SEQUENCER_DATABLOCK_RECORD_BUFFER_SIZE];
|
|
|
|
InstrumentId m_knownInstruments[SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS];
|
|
int m_knownInstrumentCount;
|
|
|
|
int m_levelUpdateIndices[SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS];
|
|
LevelInfo m_levels[SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS];
|
|
|
|
int m_recordLevelUpdateIndices[SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS];
|
|
LevelInfo m_recordLevels[SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS];
|
|
|
|
int m_submasterLevelUpdateIndices[SEQUENCER_DATABLOCK_MAX_NB_SUBMASTERS];
|
|
LevelInfo m_submasterLevels[SEQUENCER_DATABLOCK_MAX_NB_SUBMASTERS];
|
|
|
|
int m_masterLevelUpdateIndex;
|
|
LevelInfo m_masterLevel;
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|