-
Notifications
You must be signed in to change notification settings - Fork 18
Expand file tree
/
Copy pathSF2.cpp
More file actions
122 lines (104 loc) · 4.4 KB
/
SF2.cpp
File metadata and controls
122 lines (104 loc) · 4.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*************************************************************************************
* Original code copyright (C) 2012 Steve Folta
* Converted to Juce module (C) 2016 Leo Olivers
* Forked from https://github.com/stevefolta/SFZero
* For license info please see the LICENSE file distributed with this source code
*************************************************************************************/
#include "SF2.h"
#include "RIFF.h"
#define readAbyte(name, file) name = (byte)file->readByte();
#define readAchar(name, file) name = file->readByte();
#define readAdword(name, file) name = (dword)file->readInt();
#define readAword(name, file) name = (word)file->readShort();
#define readAshort(name, file) name = file->readShort();
#define readAchar20(name, file) file->read(name, 20);
#define readAgenAmountType(name, file) name.shortAmount = file->readShort();
#define SF2Field(type, name) readA##type(name, file)
void sfzero::SF2::iver::readFrom(juce::InputStream *file)
{
#include "sf2-chunks/iver.h"
}
void sfzero::SF2::phdr::readFrom(juce::InputStream *file)
{
#include "sf2-chunks/phdr.h"
}
void sfzero::SF2::pbag::readFrom(juce::InputStream *file)
{
#include "sf2-chunks/pbag.h"
}
void sfzero::SF2::pmod::readFrom(juce::InputStream *file)
{
#include "sf2-chunks/pmod.h"
}
void sfzero::SF2::pgen::readFrom(juce::InputStream *file)
{
#include "sf2-chunks/pgen.h"
}
void sfzero::SF2::inst::readFrom(juce::InputStream *file)
{
#include "sf2-chunks/inst.h"
}
void sfzero::SF2::ibag::readFrom(juce::InputStream *file)
{
#include "sf2-chunks/ibag.h"
}
void sfzero::SF2::imod::readFrom(juce::InputStream *file)
{
#include "sf2-chunks/imod.h"
}
void sfzero::SF2::igen::readFrom(juce::InputStream *file)
{
#include "sf2-chunks/igen.h"
}
void sfzero::SF2::shdr::readFrom(juce::InputStream *file)
{
#include "sf2-chunks/shdr.h"
}
sfzero::SF2::Hydra::Hydra()
: phdrItems(nullptr), pbagItems(nullptr), pmodItems(nullptr), pgenItems(nullptr), instItems(nullptr), ibagItems(nullptr),
imodItems(nullptr), igenItems(nullptr), shdrItems(nullptr), phdrNumItems(0), pbagNumItems(0), pmodNumItems(0), pgenNumItems(0),
instNumItems(0), ibagNumItems(0), imodNumItems(0), igenNumItems(0), shdrNumItems(0)
{
}
sfzero::SF2::Hydra::~Hydra()
{
delete phdrItems;
delete pbagItems;
delete pmodItems;
delete pgenItems;
delete instItems;
delete ibagItems;
delete imodItems;
delete igenItems;
delete shdrItems;
}
void sfzero::SF2::Hydra::readFrom(juce::InputStream *file, juce::int64 pdtaChunkEnd)
{
int i, numItems;
#define HandleChunk(chunkName) \
if (FourCCEquals(chunk.id, #chunkName)) \
{ \
numItems = static_cast<int>(chunk.size / SF2::chunkName::sizeInFile); \
chunkName##NumItems = numItems; \
chunkName##Items = new SF2::chunkName[numItems]; \
for (i = 0; i < numItems; ++i) \
{ \
chunkName##Items[i].readFrom(file); \
} \
} \
else
while (file->getPosition() < pdtaChunkEnd)
{
sfzero::RIFFChunk chunk;
chunk.readFrom(file);
HandleChunk(phdr) HandleChunk(pbag) HandleChunk(pmod) HandleChunk(pgen) HandleChunk(inst) HandleChunk(ibag) HandleChunk(imod)
HandleChunk(igen) HandleChunk(shdr)
{
}
chunk.seekAfter(file);
}
}
bool sfzero::SF2::Hydra::isComplete()
{
return phdrItems && pbagItems && pmodItems && pgenItems && instItems && ibagItems && imodItems && igenItems && shdrItems;
}