
Bubble System 2 channel Wavetable sound generator logic is configuration with K005289, 4 bit PROM and DAC. K005289 controls pitch and 5 bit address generator per channel, Waveform select and Volume control is tied to AY-3-8910 ports. (each port for per channels) these configuration is better known as K005289, the part of logic. furnace emulates this configurations as single system, waveform format is 15 level and 32 width.
85 lines
2.5 KiB
C++
85 lines
2.5 KiB
C++
/**
|
|
* Furnace Tracker - multi-system chiptune tracker
|
|
* Copyright (C) 2021-2022 tildearrow and contributors
|
|
*
|
|
* 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.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*/
|
|
|
|
#ifndef _K005289_H
|
|
#define _K005289_H
|
|
|
|
#include "../dispatch.h"
|
|
#include <queue>
|
|
#include "../macroInt.h"
|
|
#include "sound/k005289/k005289.hpp"
|
|
|
|
class DivPlatformK005289: public DivDispatch {
|
|
struct Channel {
|
|
int freq, baseFreq, pitch, note;
|
|
unsigned char ins;
|
|
bool active, insChanged, freqChanged, keyOn, keyOff, inPorta;
|
|
signed char vol, outVol, wave;
|
|
signed char waveROM[32] = {0}; // 4 bit PROM per channel on bubble system
|
|
DivMacroInt std;
|
|
Channel():
|
|
freq(0),
|
|
baseFreq(0),
|
|
pitch(0),
|
|
note(0),
|
|
ins(-1),
|
|
active(false),
|
|
insChanged(true),
|
|
freqChanged(false),
|
|
keyOn(false),
|
|
keyOff(false),
|
|
inPorta(false),
|
|
vol(15),
|
|
outVol(15),
|
|
wave(-1) {}
|
|
};
|
|
Channel chan[2];
|
|
bool isMuted[2];
|
|
|
|
k005289_core* k005289;
|
|
unsigned short regPool[4];
|
|
void updateWave(int ch);
|
|
friend void putDispatchChan(void*,int,int);
|
|
public:
|
|
void acquire(short* bufL, short* bufR, size_t start, size_t len);
|
|
int dispatch(DivCommand c);
|
|
void* getChanState(int chan);
|
|
unsigned char* getRegisterPool();
|
|
int getRegisterPoolSize();
|
|
int getRegisterPoolDepth();
|
|
void reset();
|
|
void forceIns();
|
|
void tick();
|
|
void muteChannel(int ch, bool mute);
|
|
bool isStereo();
|
|
bool keyOffAffectsArp(int ch);
|
|
void setFlags(unsigned int flags);
|
|
void notifyWaveChange(int wave);
|
|
void notifyInsDeletion(void* ins);
|
|
void poke(unsigned int addr, unsigned short val);
|
|
void poke(std::vector<DivRegWrite>& wlist);
|
|
const char** getRegisterSheet();
|
|
const char* getEffectName(unsigned char effect);
|
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
|
void quit();
|
|
~DivPlatformK005289();
|
|
};
|
|
|
|
#endif
|