summaryrefslogtreecommitdiff
path: root/src/JSystem/JAudio/JASBasicInst.cpp
blob: 5e425f2287786c03a340ed5e9060f57bb04f82cd (plain)
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
//
// Generated by dtk
// Translation Unit: JASBasicInst.cpp
//

#include "JSystem/JSystem.h" // IWYU pragma: keep

#include "JSystem/JAudio/JASBasicInst.h"
#include "JSystem/JAudio/JASBank.h"
#include "JSystem/JAudio/JASCalc.h"
#include "JSystem/JAudio/JASInstEffect.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "JSystem/JUtility/JUTAssert.h"

/* 80284844-80284888       .text __ct__Q28JASystem10TBasicInstFv */
JASystem::TBasicInst::TBasicInst() {
    field_0x4 = 1.0f;
    field_0x8 = 1.0f;
    mEffect = NULL;
    mEffectCount = 0;
    mOsc = NULL;
    mOscCount = 0;
    mKeyRegionCount = 0;
    mKeymap = NULL;
}

/* 80284888-80284914       .text __dt__Q28JASystem10TBasicInstFv */
JASystem::TBasicInst::~TBasicInst() {
    delete[] mKeymap;
    delete[] mEffect;
    delete[] mOsc;
}

/* 80284914-80284B4C       .text getParam__Q28JASystem10TBasicInstCFiiPQ28JASystem10TInstParam */
bool JASystem::TBasicInst::getParam(int key, int velo, TInstParam* param) const {
    param->field_0x0 = 0;
    param->field_0x38 = 0;
    param->mOscData = mOsc;
    param->mOscCount = mOscCount;
    param->field_0x10 *= field_0x4;
    param->field_0x14 *= field_0x8;
    for (int i = 0; i < mEffectCount; i++) {
        TInstEffect* effect = mEffect[i];
        if (!effect) {
            continue;
        }
        f32 y = effect->getY(key, velo);
        switch (effect->mTarget) {
        case 0:
            param->field_0x18 *= y;
            break;
        case 1:
            param->field_0x1c *= y;
            break;
        case 2:
            param->field_0x2c += y - 0.5;
            break;
        case 3:
            param->field_0x30 += y;
            break;
        case 4:
            param->field_0x34 += y;
            break;
        default:
            JUT_ASSERT(93, FALSE);
        }
    }
    const TKeymap* keymap = NULL;
    for (int i = 0; i < mKeyRegionCount; i++) {
        if (key <= mKeymap[i].mBaseKey) {
            keymap = &mKeymap[i];
            param->field_0x3c = i;
            break;
        }
    }
    if (!keymap) {
        return false;
    }
    for (int i = 0; i < keymap->mVeloRegionCount; i++) {
        const JASystem::TBasicInst::TVeloRegion * region = keymap->getVeloRegion(i);
        if (velo <= region->mBaseVel) {
            param->field_0x10 *= region->field_0x08;
            param->field_0x14 *= region->field_0x0c;
            param->field_0x4 = region->field_0x04;
            return true;
        }
    }
    return false;
}

/* 80284B4C-80284B54       .text getKeymapIndex__Q28JASystem10TBasicInstCFi */
int JASystem::TBasicInst::getKeymapIndex(int index) const {
    return index;
}

/* 80284B54-80284C10       .text setKeyRegionCount__Q28JASystem10TBasicInstFUl */
void JASystem::TBasicInst::setKeyRegionCount(u32 num) {
    delete[] mKeymap;
    mKeymap = new (TBank::getCurrentHeap(), 0) TKeymap[num];
    JUT_ASSERT(140, mKeymap != NULL);
    mKeyRegionCount = num;
}

/* 80284C10-80284CC4       .text setEffectCount__Q28JASystem10TBasicInstFUl */
void JASystem::TBasicInst::setEffectCount(u32 num) {
    delete[] mEffect;
    mEffectCount = num;
    if (num == 0) {
        mEffect = NULL;
        return;
    }
    mEffect = new (TBank::getCurrentHeap(), 0) TInstEffect*[num];
    JUT_ASSERT(157, mEffect != NULL);
    Calc::bzero(mEffect, num * 4);
}

/* 80284CC4-80284D7C       .text setEffect__Q28JASystem10TBasicInstFiPQ28JASystem11TInstEffect */
void JASystem::TBasicInst::setEffect(int index, TInstEffect* effect) {
    JUT_ASSERT(164, index < mEffectCount);
    JUT_ASSERT(165, index >= 0);
    mEffect[index] = effect;
}

/* 80284D7C-80284E30       .text setOscCount__Q28JASystem10TBasicInstFUl */
void JASystem::TBasicInst::setOscCount(u32 num) {
    delete[] mOsc;
    mOscCount = num;
    if (num == 0) {
        mOsc = NULL;
        return;
    }
    mOsc = new (TBank::getCurrentHeap(), 0) TOscillator::Osc_*[num];
    JUT_ASSERT(193, mOsc != NULL);
    Calc::bzero(mOsc, num * 4);
}

/* 80284E30-80284EE8       .text setOsc__Q28JASystem10TBasicInstFiPQ38JASystem11TOscillator4Osc_ */
void JASystem::TBasicInst::setOsc(int index, TOscillator::Osc_* osc) {
    JUT_ASSERT(199, index < mOscCount);
    JUT_ASSERT(200, index >= 0);
    mOsc[index] = osc;
}

/* 80284EE8-80284F70       .text getKeyRegion__Q28JASystem10TBasicInstFi */
JASystem::TBasicInst::TKeymap* JASystem::TBasicInst::getKeyRegion(int index) {
    JUT_ASSERT(217, index >= 0);
    if (index >= mKeyRegionCount) {
        return NULL;
    }
    return &mKeymap[index];
}

/* 80284F70-80284FC4       .text __dt__Q38JASystem10TBasicInst7TKeymapFv */
JASystem::TBasicInst::TKeymap::~TKeymap() {
    delete[] mVelomap;
}

/* 80284FC4-80285058       .text setVeloRegionCount__Q38JASystem10TBasicInst7TKeymapFUl */
void JASystem::TBasicInst::TKeymap::setVeloRegionCount(u32 num) {
    delete[] mVelomap;
    mVelomap = new (TBank::getCurrentHeap(), 0) JASystem::TBasicInst::TVeloRegion[num];
    JUT_ASSERT(244, mVelomap != NULL);
    mVeloRegionCount = num;
}

/* 80285058-802850E0       .text getVeloRegion__Q38JASystem10TBasicInst7TKeymapFi */
JASystem::TBasicInst::TVeloRegion* JASystem::TBasicInst::TKeymap::getVeloRegion(int index) {
    JUT_ASSERT(252, index >= 0);
    if (index >= mVeloRegionCount) {
        return NULL;
    }
    return &mVelomap[index];
}

/* 802850E0-80285168       .text getVeloRegion__Q38JASystem10TBasicInst7TKeymapCFi */
const JASystem::TBasicInst::TVeloRegion* JASystem::TBasicInst::TKeymap::getVeloRegion(int index) const {
    JUT_ASSERT(261, index >= 0);
    if (index >= mVeloRegionCount) {
        return NULL;
    }
    return &mVelomap[index];
}