33 #if !defined(_CARBON_) && !defined(__APPLE__) && !defined(WIN32) 44 #include <sys/types.h> 46 #include <sys/fcntl.h> 48 #if defined(_CARBON_) || defined(__APPLE__) || LINUX 49 # include <sys/ioctl.h> 53 typedef unsigned int uint;
56 # include <linux/cdrom.h> 59 typedef std::string String;
60 typedef std::streampos streampos;
69 akai_stream_ready = 0,
70 akai_stream_end_reached = 1,
71 akai_stream_closed = 2
72 } akai_stream_state_t;
76 akai_stream_start = 0,
77 akai_stream_curpos = 1,
79 } akai_stream_whence_t;
93 # define CD_FRAMESIZE 2048 96 #define DISK_CLUSTER_SIZE 61440 98 typedef std::string String;
118 virtual akai_stream_state_t GetState()
const;
119 virtual int GetPos()
const;
120 virtual int SetPos(
int Where, akai_stream_whence_t Whence = akai_stream_start);
122 virtual int Available (uint WordSize = 1);
123 virtual int Read (
void* pData, uint WordCount, uint WordSize);
125 void ReadInt8(uint8_t* pData, uint WordCount);
126 void ReadInt16(uint16_t* pData, uint WordCount);
127 void ReadInt32(uint32_t* pData, uint WordCount);
128 int ReadInt8(uint8_t* pData);
129 int ReadInt16(uint16_t* pData);
130 int ReadInt32(uint32_t* pData);
132 uint16_t ReadInt16();
133 uint32_t ReadInt32();
136 virtual uint GetError()
const 149 #elif defined _CARBON_ || defined(__APPLE__) || LINUX 162 void OpenStream(
const char* path);
163 inline void swapBytes_16(
void* Word);
164 inline void swapBytes_32(
void* Word);
211 class AkaiDiskElement :
public Resource
214 AkaiDiskElement(uint Offset = 0)
225 void SetOffset(uint Offset)
230 void AkaiToAscii(
char * buffer,
int length);
243 uint16_t mFineLength;
245 uint32_t mCoarseLength;
249 friend class AkaiSample;
253 class AkaiSample :
public AkaiDiskElement
256 AkaiDirEntry GetDirEntry();
262 uint8_t mMidiRootNote;
267 uint8_t mActiveLoops;
269 uint8_t mFirstActiveLoop;
277 int8_t mTuneSemitones;
281 uint32_t mNumberOfSamples;
283 uint32_t mStartMarker;
294 AkaiSampleLoop mLoops[8];
297 uint16_t mSamplingFrequency;
299 int8_t mLoopTuneOffset;
304 bool LoadSampleData();
305 void ReleaseSampleData();
306 int SetPos(
int Where, akai_stream_whence_t Whence = akai_stream_start);
307 int Read(
void* pBuffer, uint SampleCount);
311 virtual ~AkaiSample();
317 AkaiDirEntry mDirEntry;
323 class AkaiKeygroupSample :
public AkaiDiskElement
335 int8_t mTuneSemitones;
351 friend class AkaiKeygroup;
367 int8_t mVelocityToAttack;
369 int8_t mVelocityToRelease;
371 int8_t mOffVelocityToRelease;
373 int8_t mKeyToDecayAndRelease;
375 friend class AkaiKeygroup;
393 int8_t mTuneSemitones;
397 uint8_t mKeyToFilter;
399 uint8_t mVelocityToFilter;
401 uint8_t mPressureToFilter;
403 uint8_t mEnveloppe2ToFilter;
421 AkaiEnveloppe mEnveloppes[2];
424 int8_t mVelocityToEnveloppe2ToFilter;
426 int8_t mEnveloppe2ToPitch;
428 bool mVelocityZoneCrossfade;
430 uint mVelocityZoneUsed;
456 AkaiKeygroupSample mSamples[4];
461 bool mHoldAttackUntilLoop;
463 bool mSampleKeyTracking[4];
465 uint8_t mSampleAuxOutOffset[4];
467 int16_t mVelocityToSampleStart[4];
469 int8_t mVelocityToVolumeOffset[4];
484 AkaiDirEntry GetDirEntry();
486 uint ListSamples(std::list<String>& rSamples);
487 AkaiSample* GetSample(uint Index);
488 AkaiSample* GetSample(
const String& rName);
497 uint8_t mMidiProgramNumber;
499 uint8_t mMidiChannel;
511 uint8_t mAuxOutputSelect;
513 uint8_t mMixOutputSelect;
519 int8_t mVelocityToVolume;
523 int8_t mPressureToVolume;
527 uint8_t mPanLFODepth;
529 uint8_t mPanLFODelay;
539 uint8_t mModulationToLFODepth;
541 uint8_t mPressureToLFODepth;
543 uint8_t mVelocityToLFODepth;
545 uint8_t mBendToPitch;
547 int8_t mPressureToPitch;
549 bool mKeygroupCrossfade;
551 uint8_t mNumberOfKeygroups;
554 int8_t mKeyTemperament[11];
558 int8_t mModulationToPan;
560 bool mStereoCoherence;
566 uint8_t mVoiceReassign;
568 uint8_t mSoftpedToVolume;
570 uint8_t mSoftpedToAttack;
572 uint8_t mSoftpedToFilter;
574 int8_t mSoftpedToTuneCents;
576 int8_t mSoftpedToTuneSemitones;
578 int8_t mKeyToLFORate;
580 int8_t mKeyToLFODepth;
582 int8_t mKeyToLFODelay;
584 uint8_t mVoiceOutputScale;
586 uint8_t mStereoOutputScale;
589 AkaiKeygroup* mpKeygroups;
603 std::list<AkaiSample*> mpSamples;
606 AkaiDirEntry mDirEntry;
620 AkaiDirEntry GetDirEntry();
622 uint ListPrograms(std::list<AkaiDirEntry>& rPrograms);
627 uint ListSamples(std::list<AkaiDirEntry>& rSamples);
628 AkaiSample* GetSample(uint Index);
629 AkaiSample* GetSample(
const String& rName);
645 std::list<AkaiProgram*> mpPrograms;
646 std::list<AkaiSample*> mpSamples;
649 AkaiDirEntry mDirEntry;
664 uint ListVolumes(std::list<AkaiDirEntry>& rVolumes);
681 std::list<AkaiVolume*> mpVolumes;
701 uint GetPartitionCount();
706 std::list<AkaiPartition*> mpPartitions;
709 #define AKAI_FILE_ENTRY_SIZE 24 710 #define AKAI_DIR_ENTRY_OFFSET 0xca 711 #define AKAI_DIR_ENTRY_SIZE 16 712 #define AKAI_ROOT_ENTRY_OFFSET 0x0 714 #define AKAI_PARTITION_END_MARK 0x8000 715 #define AKAI_BLOCK_SIZE 0x2000 717 #define AKAI_FAT_OFFSET 0x70a 719 #define AKAI_MAX_FILE_ENTRIES_S1000 125 //should be 128 ?? 720 #define AKAI_MAX_FILE_ENTRIES_S3000 509 // should be 512 ?? 721 #define AKAI_MAX_DIR_ENTRIES 100 722 #define AKAI_TYPE_DIR_S1000 1 723 #define AKAI_TYPE_DIR_S3000 3 725 #define AKAI_PROGRAM_ID 1 726 #define AKAI_KEYGROUP_ID 2 727 #define AKAI_SAMPLE_ID 3 bool WriteImage(const char *path)
Extract Akai data track and write it into a regular file.
Encapsulates one disk partition of an AKAI disk.
DiskImage(const char *path)
Open an image from a file.
Toplevel AKAI image interpreter.
Accessing AKAI image either from file or a drive (i.e.
AKAI instrument definition.
Subdivision of an AKAI disk partition.
virtual int Read(void *pData, uint WordCount, uint WordSize)
Returns number of successfully read words.