You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
2.7 KiB
108 lines
2.7 KiB
/*
|
|
SoLoud audio engine
|
|
Copyright (c) 2015 Jari Komppa
|
|
|
|
VIC 6560/6561 sound chip emulator
|
|
Copyright (c) 2015 Petri Hakkinen
|
|
|
|
This software is provided 'as-is', without any express or implied
|
|
warranty. In no event will the authors be held liable for any damages
|
|
arising from the use of this software.
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
including commercial applications, and to alter it and redistribute it
|
|
freely, subject to the following restrictions:
|
|
|
|
1. The origin of this software must not be misrepresented; you must not
|
|
claim that you wrote the original software. If you use this software
|
|
in a product, an acknowledgment in the product documentation would be
|
|
appreciated but is not required.
|
|
|
|
2. Altered source versions must be plainly marked as such, and must not be
|
|
misrepresented as being the original software.
|
|
|
|
3. This notice may not be removed or altered from any source
|
|
distribution.
|
|
*/
|
|
|
|
#ifndef SOLOUD_VIC_H
|
|
#define SOLOUD_VIC_H
|
|
|
|
#include "soloud.h"
|
|
|
|
/*
|
|
A very bare bones emulator for Commodore VIC-20 sound chip. Supports both PAL and NTSC models.
|
|
Bass, alto and soprano should be quite close to original vic, noise probably not so.
|
|
|
|
The first three channels (bass, alto and soprano) are square waveform generators with 7-bit frequency.
|
|
The highest bit of each oscillator register switches the oscillator on/off.
|
|
The fourth oscillator generates a noise waveform.
|
|
|
|
VIC-20 does not have per channel volume control, only global volume,
|
|
which you can change by setting audio source's volume.
|
|
|
|
To get that authentic moldy VIC-20 sound, the audio source should be coupled with a biquad resonant filter
|
|
with the following params: type = LOWPASS, sample rate = 44100, frequency = 1500, resonance = 2.0.
|
|
*/
|
|
|
|
namespace SoLoud
|
|
{
|
|
class Vic;
|
|
|
|
class VicInstance : public AudioSourceInstance
|
|
{
|
|
public:
|
|
VicInstance(Vic *aParent);
|
|
~VicInstance();
|
|
|
|
virtual unsigned int getAudio(float *aBuffer, unsigned int aSamplesToRead, unsigned int aBufferSize);
|
|
virtual bool hasEnded();
|
|
|
|
public:
|
|
Vic* m_parent;
|
|
unsigned int m_phase[4];
|
|
unsigned int m_noisePos;
|
|
};
|
|
|
|
class Vic : public AudioSource
|
|
{
|
|
public:
|
|
// VIC model
|
|
enum
|
|
{
|
|
PAL = 0,
|
|
NTSC
|
|
};
|
|
|
|
// VIC sound registers
|
|
enum
|
|
{
|
|
BASS = 0,
|
|
ALTO,
|
|
SOPRANO,
|
|
NOISE,
|
|
MAX_REGS
|
|
};
|
|
|
|
Vic();
|
|
|
|
virtual ~Vic();
|
|
|
|
void setModel(int model);
|
|
|
|
int getModel() const;
|
|
|
|
void setRegister(int reg, unsigned char value);
|
|
|
|
unsigned char getRegister(int reg);
|
|
|
|
public:
|
|
virtual AudioSourceInstance *createInstance();
|
|
int m_model;
|
|
float m_clocks[4]; // base clock frequencies for oscillators, dependent on VIC model
|
|
unsigned char m_regs[MAX_REGS];
|
|
unsigned char m_noise[8192];
|
|
};
|
|
};
|
|
|
|
#endif
|
|
|