gzdoom-gles/libraries/opnmidi/chips/pmdwin/opna.h
Wohlstand 87d46ddd11 Update libOPNMIDI library to 1.5.0
## 1.5.0   2020-09-28
 * Drum note length expanding is now supported in real-time mode (Thanks to [Jean Pierre Cimalando](https://github.com/jpcima) for a work!)
 * Added support for OPNA chip with Neko Project II Kai YM2602 emulator usage (Thanks to [Jean Pierre Cimalando](https://github.com/jpcima) for a work!)
 * Added VGM file dumper which allows to output OPN2 commands into VGM file. (A new MIDI to VGM tool is now created with basing on libOPNMIDI)
 * Fixed an incorrect work of CC-121 (See https://github.com/Wohlstand/libADLMIDI/issues/227 for details)
 * Internality has been refactored and improved
2020-10-04 12:50:10 +02:00

91 lines
2.1 KiB
C

#ifndef __OPNA_H__
#define __OPNA_H__
#include <stdint.h>
#include "op.h"
#include "psg.h"
/* YM2608 (OPNA) ------------------------------------------------------ */
typedef struct _OPNA
{
int fmvolume;
uint32_t clock;
uint32_t rate;
uint32_t psgrate;
uint32_t status;
Channel4 ch[6];
Channel4* csmch;
int32_t mixdelta;
int mpratio;
uint8_t interpolation;
uint8_t timer_status;
uint8_t regtc;
uint8_t regta[2];
int32_t timera, timera_count;
int32_t timerb, timerb_count;
int32_t timer_step;
uint8_t prescale;
uint8_t devmask;
PSG psg;
Rhythm rhythm[6];
int8_t rhythmtl;
int rhythmtvol;
uint8_t rhythmkey;
int32_t mixl, mixl1;
int32_t mixr, mixr1;
uint8_t fnum2[9];
uint8_t reg22;
uint32_t reg29;
uint32_t statusnext;
uint32_t lfocount;
uint32_t lfodcount;
uint32_t lfotab[8];
uint32_t fnum[6];
uint32_t fnum3[3];
uint8_t aml;
uint32_t currentratio;
float rr;
uint32_t ratetable[64];
} OPNA;
#ifdef __cplusplus
extern "C" {
#endif
/* --------------------------------------------------------------------------- */
uint8_t OPNAInit(OPNA *opna, uint32_t c, uint32_t r, uint8_t ipflag);
void OPNAReset(OPNA *opna);
void OPNASetVolumeRhythm(OPNA *opna, int index, int db);
uint8_t OPNASetRate(OPNA *opna, uint32_t r, uint8_t ipflag);
void OPNASetChannelMask(OPNA *opna, uint32_t mask);
void OPNASetReg(OPNA *opna, uint32_t addr, uint32_t data);
void OPNASetPan(OPNA *opna, uint32_t chan, uint32_t data);
uint8_t OPNATimerCount(OPNA *opna, int32_t us);
void OPNAMix(OPNA *opna, int16_t *buffer, uint32_t nframes);
/* --------------------------------------------------------------------------- */
static inline uint32_t OPNAReadStatus(OPNA *opna) { return opna->status & 0x03; }
static inline int32_t OPNAGetNextEvent(OPNA *opna)
{
uint32_t ta = ((opna->timera_count + 0xffff) >> 16) - 1;
uint32_t tb = ((opna->timerb_count + 0xfff) >> 12) - 1;
return (ta < tb ? ta : tb) + 1;
}
#ifdef __cplusplus
}
#endif
#endif /* FM_OPNA_H */