summaryrefslogtreecommitdiff
path: root/src/JSystem/JAudio/JASBankMgr.cpp
blob: a7eeb7787e9dfad2a535d1506d7d20f3d822d432 (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
//
// Generated by dtk
// Translation Unit: JASBankMgr.cpp
//

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

#include "JSystem/JAudio/JASBankMgr.h"
#include "JSystem/JAudio/JASBNKParser.h"
#include "JSystem/JAudio/JASBasicBank.h"
#include "JSystem/JAudio/JASCalc.h"
#include "JSystem/JAudio/JASChannel.h"
#include "JSystem/JAudio/JASChannelMgr.h"
#include "JSystem/JAudio/JASDriverTables.h"
#include "JSystem/JAudio/JASRate.h"
#include "JSystem/JAudio/JASSystemHeap.h"
#include "JSystem/JAudio/JASWaveBankMgr.h"
#include "JSystem/JKernel/JKRSolidHeap.h"
#include "JSystem/JUtility/JUTAssert.h"

s16 JASystem::BankMgr::OSC_RELEASE_TABLE[6] = { 1, 10, 0, 15, 0, 0};
JASystem::TOscillator::Osc_ JASystem::BankMgr::OSC_ENV = { 0, 1.0f, NULL, BankMgr::OSC_RELEASE_TABLE, 1.0f, 0.0f };

s32 JASystem::BankMgr::sTableSize;
JASystem::TBank** JASystem::BankMgr::sBankArray;
u16* JASystem::BankMgr::sVir2PhyTable;

/* 80288594-80288698       .text init__Q28JASystem7BankMgrFi */
void JASystem::BankMgr::init(int param_1) {
    u32 r31 = param_1 * 4;
    sBankArray = (TBank**)new (JASDram, 0) u8[r31];
    JUT_ASSERT(69, sBankArray != NULL);
    sVir2PhyTable = new (JASDram, 0) u16[param_1];
    JUT_ASSERT(72, sVir2PhyTable != NULL);
    Calc::bzero(sBankArray, r31);
    for (int i = 0; i < param_1; i++) {
        sVir2PhyTable[i] = 0xFFFF;
    }
    sTableSize = param_1;
}

/* 80288698-8028874C       .text registBank__Q28JASystem7BankMgrFiPQ28JASystem5TBank */
bool JASystem::BankMgr::registBank(int banknum, TBank* bank) {
    JUT_ASSERT(86, banknum >= 0);
    JUT_ASSERT(87, banknum < sTableSize);
    sBankArray[banknum] = bank;
    return true;
}

/* 8028874C-802887AC       .text registBankBNK__Q28JASystem7BankMgrFiPv */
bool JASystem::BankMgr::registBankBNK(int banknum, void* param_2) {
    setVir2PhyTable(*((u32*)(param_2) + 2), banknum);
    TBasicBank* bank = BNKParser::createBasicBank(param_2);
    if (bank == NULL) {
        return false;
    }
    return registBank(banknum, bank);
}

/* 802887AC-802887E0       .text getBank__Q28JASystem7BankMgrFi */
JASystem::TBank* JASystem::BankMgr::getBank(int param_1) {
    if (param_1 < 0) {
        return NULL;
    }
    if (param_1 >= sTableSize) {
        return NULL;
    }
    return sBankArray[param_1];
}

/* 802887E0-802887F0       .text getPhysicalNumber__Q28JASystem7BankMgrFUs */
u16 JASystem::BankMgr::getPhysicalNumber(u16 param_1) {
    return sVir2PhyTable[param_1];
}

/* 802887F0-802888A0       .text setVir2PhyTable__Q28JASystem7BankMgrFUli */
void JASystem::BankMgr::setVir2PhyTable(u32 vir_id, int banknum) {
    if (vir_id == 0xFFFF) {
        return;
    }
    JUT_ASSERT(127, vir_id < sTableSize);
    if (sVir2PhyTable[vir_id] != 0xFFFF) {
        OSReport("Warning : Duplicated Bank vir_id ID %d (%d,%d)\n", vir_id, sVir2PhyTable[vir_id], banknum);
    }
    sVir2PhyTable[vir_id] = banknum;
}

/* 802888A0-80288904       .text assignWaveBank__Q28JASystem7BankMgrFii */
bool JASystem::BankMgr::assignWaveBank(int param_1, int param_2) {
    TBank* bank = getBank(param_1);
    if (!bank) {
        return false;
    }
    TWaveBank* waveBank = WaveBankMgr::getWaveBank(param_2);
    if (!waveBank) {
        return false;
    }
    bank->field_0x4 = waveBank;
    return true;
}

/* 80288904-8028892C       .text clamp01__Q28JASystem7BankMgrFf */
f32 JASystem::BankMgr::clamp01(f32 param_1) {
    if (param_1 < 0.0f) {
        return 0.0f;
    }
    if (param_1 > 1.0f) {
        return 1.0f;
    }
    return param_1;
}

/* 8028892C-80288CE8       .text noteOn__Q28JASystem7BankMgrFPQ28JASystem11TChannelMgriiUcUcUl */
JASystem::TChannel* JASystem::BankMgr::noteOn(TChannelMgr*, int, int, u8, u8, u32) {
    /* Nonmatching */
}

/* 80288CE8-80288E44       .text noteOnOsc__Q28JASystem7BankMgrFPQ28JASystem11TChannelMgriUcUcUl */
JASystem::TChannel* JASystem::BankMgr::noteOnOsc(TChannelMgr* param_1, int param_2, u8 param_3, u8 param_4, u32 param_5) {
    /* Nonmatching */
    TChannel* channel = param_1->getLogicalChannel(0);
    if (!channel) {
        return NULL;
    }
    channel->field_0x14 = param_2;
    channel->field_0xc = 2;
    channel->field_0x0 = param_4;
    channel->field_0x1 = param_3;
    channel->field_0x50 = 16736.016f / Kernel::getDacRate();
    channel->field_0x58 = channel->field_0x50;
    s32 var1 = param_3;
    if (var1 < 0) {
        var1 = 0;
    }
    if (var1 > 127) {
        var1 = 127;
    }
    channel->field_0x58 *= Driver::C5BASE_PITCHTABLE[var1];
    channel->field_0x54 = 1.0f;
    channel->field_0x5c = channel->field_0x0 / 127.0f;
    channel->field_0x5c = channel->field_0x54 * (channel->field_0x5c * channel->field_0x5c);
    channel->mPanVec.mSound = 0.5f;
    channel->mFxmixVec.mSound = 0.0f;
    channel->mDolbyVec.mSound = 0.0f;
    channel->mPanVec.mEffect = 0.5f;
    channel->mFxmixVec.mEffect = 0.0f;
    channel->mDolbyVec.mEffect = 0.0f;
    channel->field_0x94 = 1.0f;
    channel->field_0x98 = 1.0f;
    channel->setOscInit(0, &OSC_ENV);
    channel->field_0xcc = 0;
    if (!channel->play(param_5)) {
        return NULL;
    }
    return channel;
}

/* 80288E44-80288F08       .text gateOn__Q28JASystem7BankMgrFPQ28JASystem8TChannelUcUcUl */
void JASystem::BankMgr::gateOn(JASystem::TChannel*, u8, u8, u32) {
    /* Nonmatching */
}