Fix dead link, Frequency, Instrument editor related issue
This commit is contained in:
parent
a3bca9efa7
commit
3b411cd14f
|
@ -296,7 +296,7 @@ void DivPlatformES5506::e_pin(bool state)
|
||||||
DivSample* s=parent->getSample(sample);
|
DivSample* s=parent->getSample(sample);
|
||||||
// get frequency offset
|
// get frequency offset
|
||||||
double off=1.0;
|
double off=1.0;
|
||||||
double center=s->centerRate;
|
double center=(double)s->centerRate;
|
||||||
if (center<1) {
|
if (center<1) {
|
||||||
off=1.0;
|
off=1.0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -710,7 +710,7 @@ void DivPlatformES5506::tick(bool sysTick) {
|
||||||
DivSample* s=parent->getSample(sample);
|
DivSample* s=parent->getSample(sample);
|
||||||
// get frequency offset
|
// get frequency offset
|
||||||
double off=1.0;
|
double off=1.0;
|
||||||
double center=s->centerRate;
|
double center=(double)s->centerRate;
|
||||||
if (center<1) {
|
if (center<1) {
|
||||||
off=1.0;
|
off=1.0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -884,33 +884,30 @@ void DivPlatformES5506::tick(bool sysTick) {
|
||||||
if (chan[i].noteChanged.offs) {
|
if (chan[i].noteChanged.offs) {
|
||||||
if (chan[i].pcm.freqOffs!=chan[i].pcm.nextFreqOffs) {
|
if (chan[i].pcm.freqOffs!=chan[i].pcm.nextFreqOffs) {
|
||||||
chan[i].pcm.freqOffs=chan[i].pcm.nextFreqOffs;
|
chan[i].pcm.freqOffs=chan[i].pcm.nextFreqOffs;
|
||||||
const int nextFreq=NOTE_ES5506(i,chan[i].prevNote);
|
const int nextFreq=NOTE_ES5506(i,chan[i].currNote);
|
||||||
if (chan[i].nextFreq!=nextFreq) {
|
if (chan[i].nextFreq!=nextFreq) {
|
||||||
chan[i].nextFreq=nextFreq;
|
chan[i].nextFreq=nextFreq;
|
||||||
chan[i].noteChanged.freq=1;
|
chan[i].noteChanged.freq=1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
chan[i].noteChanged.offs=0;
|
|
||||||
}
|
}
|
||||||
if (chan[i].noteChanged.note) {
|
if (chan[i].noteChanged.note) {
|
||||||
if (chan[i].prevNote!=chan[i].nextNote) {
|
if (chan[i].currNote!=chan[i].nextNote) {
|
||||||
chan[i].prevNote=chan[i].nextNote;
|
chan[i].currNote=chan[i].nextNote;
|
||||||
const int nextFreq=NOTE_ES5506(i,chan[i].nextNote);
|
const int nextFreq=NOTE_ES5506(i,chan[i].nextNote);
|
||||||
if (chan[i].nextFreq!=nextFreq) {
|
if (chan[i].nextFreq!=nextFreq) {
|
||||||
chan[i].nextFreq=nextFreq;
|
chan[i].nextFreq=nextFreq;
|
||||||
chan[i].noteChanged.freq=1;
|
chan[i].noteChanged.freq=1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
chan[i].noteChanged.note=0;
|
|
||||||
}
|
}
|
||||||
if (chan[i].noteChanged.freq) {
|
if (chan[i].noteChanged.freq) {
|
||||||
if (chan[i].baseFreq!=chan[i].nextFreq) {
|
if (chan[i].baseFreq!=chan[i].nextFreq) {
|
||||||
chan[i].baseFreq=chan[i].nextFreq;
|
chan[i].baseFreq=chan[i].nextFreq;
|
||||||
chan[i].freqChanged=true;
|
chan[i].freqChanged=true;
|
||||||
}
|
}
|
||||||
chan[i].noteChanged.freq=0;
|
|
||||||
}
|
}
|
||||||
chan[i].noteChanged.dummy=0;
|
chan[i].noteChanged.changed=0;
|
||||||
}
|
}
|
||||||
if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) {
|
if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) {
|
||||||
chan[i].freq=CLAMP_VAL(parent->calcFreq(chan[i].baseFreq,chan[i].pitch,false,2,chan[i].pitch2,chipClock,chan[i].pcm.freqOffs),0,0x1ffff);
|
chan[i].freq=CLAMP_VAL(parent->calcFreq(chan[i].baseFreq,chan[i].pitch,false,2,chan[i].pitch2,chipClock,chan[i].pcm.freqOffs),0,0x1ffff);
|
||||||
|
@ -1023,7 +1020,7 @@ int DivPlatformES5506::dispatch(DivCommand c) {
|
||||||
DivSample* s=parent->getSample(sample);
|
DivSample* s=parent->getSample(sample);
|
||||||
// get frequency offset
|
// get frequency offset
|
||||||
double off=1.0;
|
double off=1.0;
|
||||||
double center=s->centerRate;
|
double center=(double)s->centerRate;
|
||||||
if (center<1) {
|
if (center<1) {
|
||||||
off=1.0;
|
off=1.0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1087,6 +1084,7 @@ int DivPlatformES5506::dispatch(DivCommand c) {
|
||||||
if (c.value!=DIV_NOTE_NULL) {
|
if (c.value!=DIV_NOTE_NULL) {
|
||||||
chan[c.chan].note=c.value;
|
chan[c.chan].note=c.value;
|
||||||
chan[c.chan].nextNote=chan[c.chan].note;
|
chan[c.chan].nextNote=chan[c.chan].note;
|
||||||
|
chan[c.chan].pcm.nextFreqOffs=chan[c.chan].pcm.freqOffs;
|
||||||
chan[c.chan].freqChanged=true;
|
chan[c.chan].freqChanged=true;
|
||||||
chan[c.chan].noteChanged.changed=0xff;
|
chan[c.chan].noteChanged.changed=0xff;
|
||||||
chan[c.chan].volChanged.changed=0xff;
|
chan[c.chan].volChanged.changed=0xff;
|
||||||
|
|
|
@ -62,7 +62,7 @@ class DivPlatformES5506: public DivDispatch, public es550x_intf {
|
||||||
loopEnd(0),
|
loopEnd(0),
|
||||||
loopMode(DIV_SAMPLE_LOOPMODE_ONESHOT) {}
|
loopMode(DIV_SAMPLE_LOOPMODE_ONESHOT) {}
|
||||||
} pcm;
|
} pcm;
|
||||||
int freq, baseFreq, nextFreq, pitch, pitch2, note, nextNote, prevNote, ins, wave;
|
int freq, baseFreq, nextFreq, pitch, pitch2, note, nextNote, currNote, ins, wave;
|
||||||
unsigned int volMacroMax, panMacroMax;
|
unsigned int volMacroMax, panMacroMax;
|
||||||
bool active, insChanged, freqChanged, keyOn, keyOff, inPorta, useWave, isReverseLoop, isTranswave, transwaveIRQ;
|
bool active, insChanged, freqChanged, keyOn, keyOff, inPorta, useWave, isReverseLoop, isTranswave, transwaveIRQ;
|
||||||
unsigned int cr;
|
unsigned int cr;
|
||||||
|
@ -173,7 +173,7 @@ class DivPlatformES5506: public DivDispatch, public es550x_intf {
|
||||||
pitch2(0),
|
pitch2(0),
|
||||||
note(0),
|
note(0),
|
||||||
nextNote(0),
|
nextNote(0),
|
||||||
prevNote(0),
|
currNote(0),
|
||||||
ins(-1),
|
ins(-1),
|
||||||
wave(-1),
|
wave(-1),
|
||||||
volMacroMax(0xffff),
|
volMacroMax(0xffff),
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Ensoniq ES5504 emulation core
|
Ensoniq ES5504 emulation core
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Ensoniq ES5504 emulation core
|
Ensoniq ES5504 emulation core
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Ensoniq ES5505 emulation core
|
Ensoniq ES5505 emulation core
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Ensoniq ES5504 emulation core
|
Ensoniq ES5504 emulation core
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Ensoniq ES5506 emulation core
|
Ensoniq ES5506 emulation core
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Ensoniq ES5504 emulation core
|
Ensoniq ES5504 emulation core
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Ensoniq ES5504/ES5505/ES5506 emulation core
|
Ensoniq ES5504/ES5505/ES5506 emulation core
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Ensoniq ES5504/ES5505/ES5506 emulation core
|
Ensoniq ES5504/ES5505/ES5506 emulation core
|
||||||
|
@ -8,141 +8,16 @@
|
||||||
See es550x.cpp for more info
|
See es550x.cpp for more info
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
#ifndef _VGSOUND_EMU_ES550X_HPP
|
#ifndef _VGSOUND_EMU_ES550X_HPP
|
||||||
#define _VGSOUND_EMU_ES550X_HPP
|
#define _VGSOUND_EMU_ES550X_HPP
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace es550x
|
#include <algorithm>
|
||||||
{
|
#include <memory>
|
||||||
typedef unsigned char u8;
|
#include "util.hpp"
|
||||||
typedef unsigned short u16;
|
|
||||||
typedef unsigned int u32;
|
|
||||||
typedef unsigned long long u64;
|
|
||||||
typedef signed char s8;
|
|
||||||
typedef signed short s16;
|
|
||||||
typedef signed int s32;
|
|
||||||
|
|
||||||
// get bitfield, bitfield(input, position, len)
|
|
||||||
template<typename T> T bitfield(T in, u8 pos, u8 len = 1)
|
|
||||||
{
|
|
||||||
return (in >> pos) & (len ? (T(1 << len) - 1) : 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// get sign extended value, sign_ext<type>(input, len)
|
|
||||||
template<typename T> T sign_ext(T in, u8 len)
|
|
||||||
{
|
|
||||||
len = std::max<u8>(0, (8 * sizeof(T)) - len);
|
|
||||||
return T(T(in) << len) >> len;
|
|
||||||
}
|
|
||||||
|
|
||||||
// std::clamp is only for C++17 or later; I use my own code
|
|
||||||
template<typename T> T clamp(T in, T min, T max)
|
|
||||||
{
|
|
||||||
return std::min(std::max(in, min), max);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, T InitWidth, u8 InitEdge = 0>
|
|
||||||
struct clock_pulse_t
|
|
||||||
{
|
|
||||||
void reset(T init = InitWidth)
|
|
||||||
{
|
|
||||||
m_edge.reset();
|
|
||||||
m_width = m_width_latch = m_counter = init;
|
|
||||||
m_cycle = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool tick(T width = 0)
|
|
||||||
{
|
|
||||||
bool carry = ((--m_counter) <= 0);
|
|
||||||
if (carry)
|
|
||||||
{
|
|
||||||
if (!width)
|
|
||||||
m_width = m_width_latch;
|
|
||||||
else
|
|
||||||
m_width = width; // reset width
|
|
||||||
m_counter = m_width;
|
|
||||||
m_cycle = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
m_cycle++;
|
|
||||||
|
|
||||||
m_edge.tick(carry);
|
|
||||||
return carry;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_width(T width) { m_width = width; }
|
|
||||||
void set_width_latch(T width) { m_width_latch = width; }
|
|
||||||
|
|
||||||
// Accessors
|
|
||||||
bool current_edge() { return m_edge.m_current; }
|
|
||||||
bool rising_edge() { return m_edge.m_rising; }
|
|
||||||
bool falling_edge() { return m_edge.m_rising; }
|
|
||||||
T cycle() { return m_cycle; }
|
|
||||||
|
|
||||||
struct edge_t
|
|
||||||
{
|
|
||||||
edge_t()
|
|
||||||
: m_current(InitEdge ^ 1)
|
|
||||||
, m_previous(InitEdge)
|
|
||||||
, m_rising(0)
|
|
||||||
, m_falling(0)
|
|
||||||
, m_changed(0)
|
|
||||||
{
|
|
||||||
set(InitEdge);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tick(bool toggle)
|
|
||||||
{
|
|
||||||
u8 current = m_current;
|
|
||||||
if (toggle)
|
|
||||||
current ^= 1;
|
|
||||||
set(current);
|
|
||||||
}
|
|
||||||
|
|
||||||
void set(u8 edge)
|
|
||||||
{
|
|
||||||
edge &= 1;
|
|
||||||
m_rising = m_falling = m_changed = 0;
|
|
||||||
if (m_current != edge)
|
|
||||||
{
|
|
||||||
m_changed = 1;
|
|
||||||
if (m_current && (!edge))
|
|
||||||
m_falling = 1;
|
|
||||||
else if ((!m_current) && edge)
|
|
||||||
m_rising = 1;
|
|
||||||
m_current = edge;
|
|
||||||
}
|
|
||||||
m_previous = m_current;
|
|
||||||
}
|
|
||||||
|
|
||||||
void reset()
|
|
||||||
{
|
|
||||||
m_previous = InitEdge;
|
|
||||||
m_current = InitEdge ^ 1;
|
|
||||||
set(InitEdge);
|
|
||||||
}
|
|
||||||
|
|
||||||
u8 m_current : 1; // current edge
|
|
||||||
u8 m_previous : 1; // previous edge
|
|
||||||
u8 m_rising : 1; // rising edge
|
|
||||||
u8 m_falling : 1; // falling edge
|
|
||||||
u8 m_changed : 1; // changed flag
|
|
||||||
};
|
|
||||||
|
|
||||||
edge_t m_edge;
|
|
||||||
T m_width = InitWidth; // clock pulse width
|
|
||||||
T m_width_latch = InitWidth; // clock pulse width latch
|
|
||||||
T m_counter = InitWidth; // clock counter
|
|
||||||
T m_cycle = 0; // clock cycle
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
// ES5504/ES5505/ES5506 interface
|
// ES5504/ES5505/ES5506 interface
|
||||||
using namespace es550x;
|
|
||||||
class es550x_intf
|
class es550x_intf
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -158,7 +33,6 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
// Shared functions for ES5504/ES5505/ES5506
|
// Shared functions for ES5504/ES5505/ES5506
|
||||||
using namespace es550x;
|
|
||||||
class es550x_shared_core
|
class es550x_shared_core
|
||||||
{
|
{
|
||||||
friend class es550x_intf; // es550x specific memory interface
|
friend class es550x_intf; // es550x specific memory interface
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Ensoniq ES5504/ES5505/ES5506 Shared Accumulator emulation core
|
Ensoniq ES5504/ES5505/ES5506 Shared Accumulator emulation core
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Ensoniq ES5504/ES5505/ES5506 Shared Filter emulation core
|
Ensoniq ES5504/ES5505/ES5506 Shared Filter emulation core
|
||||||
|
|
|
@ -0,0 +1,139 @@
|
||||||
|
/*
|
||||||
|
License: BSD-3-Clause
|
||||||
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
|
Copyright holder(s): cam900
|
||||||
|
Various core utilities for vgsound_emu
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _VGSOUND_EMU_CORE_UTIL_HPP
|
||||||
|
#define _VGSOUND_EMU_CORE_UTIL_HPP
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
typedef unsigned char u8;
|
||||||
|
typedef unsigned short u16;
|
||||||
|
typedef unsigned int u32;
|
||||||
|
typedef unsigned long long u64;
|
||||||
|
typedef signed char s8;
|
||||||
|
typedef signed short s16;
|
||||||
|
typedef signed int s32;
|
||||||
|
|
||||||
|
// get bitfield, bitfield(input, position, len)
|
||||||
|
template<typename T> T bitfield(T in, u8 pos, u8 len = 1)
|
||||||
|
{
|
||||||
|
return (in >> pos) & (len ? (T(1 << len) - 1) : 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// get sign extended value, sign_ext<type>(input, len)
|
||||||
|
template<typename T> T sign_ext(T in, u8 len)
|
||||||
|
{
|
||||||
|
len = std::max<u8>(0, (8 * sizeof(T)) - len);
|
||||||
|
return T(T(in) << len) >> len;
|
||||||
|
}
|
||||||
|
|
||||||
|
// std::clamp is only for C++17 or later; I use my own code
|
||||||
|
template<typename T> T clamp(T in, T min, T max)
|
||||||
|
{
|
||||||
|
return std::min(std::max(in, min), max);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T, T InitWidth, u8 InitEdge = 0>
|
||||||
|
struct clock_pulse_t
|
||||||
|
{
|
||||||
|
void reset(T init = InitWidth)
|
||||||
|
{
|
||||||
|
m_edge.reset();
|
||||||
|
m_width = m_width_latch = m_counter = init;
|
||||||
|
m_cycle = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool tick(T width = 0)
|
||||||
|
{
|
||||||
|
bool carry = ((--m_counter) <= 0);
|
||||||
|
if (carry)
|
||||||
|
{
|
||||||
|
if (!width)
|
||||||
|
m_width = m_width_latch;
|
||||||
|
else
|
||||||
|
m_width = width; // reset width
|
||||||
|
m_counter = m_width;
|
||||||
|
m_cycle = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_cycle++;
|
||||||
|
|
||||||
|
m_edge.tick(carry);
|
||||||
|
return carry;
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_width(T width) { m_width = width; }
|
||||||
|
void set_width_latch(T width) { m_width_latch = width; }
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
bool current_edge() { return m_edge.m_current; }
|
||||||
|
bool rising_edge() { return m_edge.m_rising; }
|
||||||
|
bool falling_edge() { return m_edge.m_rising; }
|
||||||
|
T cycle() { return m_cycle; }
|
||||||
|
|
||||||
|
struct edge_t
|
||||||
|
{
|
||||||
|
edge_t()
|
||||||
|
: m_current(InitEdge ^ 1)
|
||||||
|
, m_previous(InitEdge)
|
||||||
|
, m_rising(0)
|
||||||
|
, m_falling(0)
|
||||||
|
, m_changed(0)
|
||||||
|
{
|
||||||
|
set(InitEdge);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tick(bool toggle)
|
||||||
|
{
|
||||||
|
u8 current = m_current;
|
||||||
|
if (toggle)
|
||||||
|
current ^= 1;
|
||||||
|
set(current);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set(u8 edge)
|
||||||
|
{
|
||||||
|
edge &= 1;
|
||||||
|
m_rising = m_falling = m_changed = 0;
|
||||||
|
if (m_current != edge)
|
||||||
|
{
|
||||||
|
m_changed = 1;
|
||||||
|
if (m_current && (!edge))
|
||||||
|
m_falling = 1;
|
||||||
|
else if ((!m_current) && edge)
|
||||||
|
m_rising = 1;
|
||||||
|
m_current = edge;
|
||||||
|
}
|
||||||
|
m_previous = m_current;
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset()
|
||||||
|
{
|
||||||
|
m_previous = InitEdge;
|
||||||
|
m_current = InitEdge ^ 1;
|
||||||
|
set(InitEdge);
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 m_current : 1; // current edge
|
||||||
|
u8 m_previous : 1; // previous edge
|
||||||
|
u8 m_rising : 1; // rising edge
|
||||||
|
u8 m_falling : 1; // falling edge
|
||||||
|
u8 m_changed : 1; // changed flag
|
||||||
|
};
|
||||||
|
|
||||||
|
edge_t m_edge;
|
||||||
|
T m_width = InitWidth; // clock pulse width
|
||||||
|
T m_width_latch = InitWidth; // clock pulse width latch
|
||||||
|
T m_counter = InitWidth; // clock counter
|
||||||
|
T m_cycle = 0; // clock cycle
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Konami K005289 emulation core
|
Konami K005289 emulation core
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Konami K005289 emulation core
|
Konami K005289 emulation core
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Namco 163 Sound emulation core
|
Namco 163 Sound emulation core
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Namco 163 Sound emulation core
|
Namco 163 Sound emulation core
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/blob/main/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
OKI MSM6295 emulation core
|
OKI MSM6295 emulation core
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/blob/main/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
OKI MSM6295 emulation core
|
OKI MSM6295 emulation core
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/blob/main/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holders: cam900
|
Copyright holder(s): cam900
|
||||||
Various core utilities for vgsound_emu
|
Various core utilities for vgsound_emu
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/blob/main/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Dialogic ADPCM core
|
Dialogic ADPCM core
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Konami SCC emulation core
|
Konami SCC emulation core
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Konami SCC emulation core
|
Konami SCC emulation core
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Konami VRC VI sound emulation core
|
Konami VRC VI sound emulation core
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holder(s): cam900
|
Copyright holder(s): cam900
|
||||||
Konami VRC VI sound emulation core
|
Konami VRC VI sound emulation core
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holders: cam900
|
Copyright holder(s): cam900
|
||||||
Seta/Allumer X1-010 Emulation core
|
Seta/Allumer X1-010 Emulation core
|
||||||
|
|
||||||
the chip has 16 voices, all voices can be switchable to Wavetable or PCM sample playback mode.
|
the chip has 16 voices, all voices can be switchable to Wavetable or PCM sample playback mode.
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
see https://github.com/cam900/vgsound_emu/LICENSE for more details
|
see https://github.com/cam900/vgsound_emu/blob/vgsound_emu_v1/LICENSE for more details
|
||||||
|
|
||||||
Copyright holders: cam900
|
Copyright holder(s): cam900
|
||||||
Seta/Allumer X1-010 Emulation core
|
Seta/Allumer X1-010 Emulation core
|
||||||
|
|
||||||
See x1_010.cpp for more info.
|
See x1_010.cpp for more info.
|
||||||
|
|
|
@ -213,7 +213,7 @@ void DivPlatformSoundUnit::tick(bool sysTick) {
|
||||||
DivInstrument* ins=parent->getIns(chan[i].ins,DIV_INS_SU);
|
DivInstrument* ins=parent->getIns(chan[i].ins,DIV_INS_SU);
|
||||||
DivSample* sample=parent->getSample(ins->amiga.getSample(chan[i].note));
|
DivSample* sample=parent->getSample(ins->amiga.getSample(chan[i].note));
|
||||||
if (sample!=NULL) {
|
if (sample!=NULL) {
|
||||||
unsigned int sampleEnd=sample->offSU+(s->isLoopable()?sample->loopEnd:sample->samples);
|
unsigned int sampleEnd=sample->offSU+(sample->isLoopable()?sample->loopEnd:sample->samples);
|
||||||
unsigned int off=sample->offSU+chan[i].hasOffset;
|
unsigned int off=sample->offSU+chan[i].hasOffset;
|
||||||
chan[i].hasOffset=0;
|
chan[i].hasOffset=0;
|
||||||
if (sampleEnd>=getSampleMemCapacity(0)) sampleEnd=getSampleMemCapacity(0)-1;
|
if (sampleEnd>=getSampleMemCapacity(0)) sampleEnd=getSampleMemCapacity(0)-1;
|
||||||
|
@ -221,7 +221,7 @@ void DivPlatformSoundUnit::tick(bool sysTick) {
|
||||||
chWrite(i,0x0b,off>>8);
|
chWrite(i,0x0b,off>>8);
|
||||||
chWrite(i,0x0c,sampleEnd&0xff);
|
chWrite(i,0x0c,sampleEnd&0xff);
|
||||||
chWrite(i,0x0d,sampleEnd>>8);
|
chWrite(i,0x0d,sampleEnd>>8);
|
||||||
if (s->isLoopable()) {
|
if (sample->isLoopable()) {
|
||||||
unsigned int sampleLoop=sample->offSU+sample->loopStart;
|
unsigned int sampleLoop=sample->offSU+sample->loopStart;
|
||||||
if (sampleLoop>=getSampleMemCapacity(0)) sampleLoop=getSampleMemCapacity(0)-1;
|
if (sampleLoop>=getSampleMemCapacity(0)) sampleLoop=getSampleMemCapacity(0)-1;
|
||||||
chWrite(i,0x0e,sampleLoop&0xff);
|
chWrite(i,0x0e,sampleLoop&0xff);
|
||||||
|
|
|
@ -344,7 +344,7 @@ void putDispatchChan(void* data, int chanNum, int type) {
|
||||||
ImGui::Text(" - pitch2: %d",ch->pitch2);
|
ImGui::Text(" - pitch2: %d",ch->pitch2);
|
||||||
ImGui::Text("* note: %d",ch->note);
|
ImGui::Text("* note: %d",ch->note);
|
||||||
ImGui::Text(" - next: %d",ch->nextNote);
|
ImGui::Text(" - next: %d",ch->nextNote);
|
||||||
ImGui::Text(" - prev: %d",ch->prevNote);
|
ImGui::Text(" - curr: %d",ch->currNote);
|
||||||
ImGui::Text("- ins: %d",ch->ins);
|
ImGui::Text("- ins: %d",ch->ins);
|
||||||
ImGui::Text("- wave: %d",ch->wave);
|
ImGui::Text("- wave: %d",ch->wave);
|
||||||
ImGui::Text("- VolMacroMax: %d",ch->volMacroMax);
|
ImGui::Text("- VolMacroMax: %d",ch->volMacroMax);
|
||||||
|
|
|
@ -2587,7 +2587,8 @@ void FurnaceGUI::drawInsEdit() {
|
||||||
P(ImGui::Checkbox("Don't test/gate before new note",&ins->c64.noTest));
|
P(ImGui::Checkbox("Don't test/gate before new note",&ins->c64.noTest));
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
if (ins->type==DIV_INS_AMIGA || ins->type==DIV_INS_ES5506) if (ImGui::BeginTabItem("Sample")) {
|
if (ins->type==DIV_INS_AMIGA || ins->type==DIV_INS_ES5506) {
|
||||||
|
if (ImGui::BeginTabItem("Sample")) {
|
||||||
String sName;
|
String sName;
|
||||||
if (ins->amiga.initSample<0 || ins->amiga.initSample>=e->song.sampleLen) {
|
if (ins->amiga.initSample<0 || ins->amiga.initSample>=e->song.sampleLen) {
|
||||||
sName="none selected";
|
sName="none selected";
|
||||||
|
@ -2708,16 +2709,36 @@ void FurnaceGUI::drawInsEdit() {
|
||||||
if (ImGui::InputInt("Initial Transwave Index##TransWaveInit",&ins->amiga.transWave.ind,1,16)) { PARAMETER
|
if (ImGui::InputInt("Initial Transwave Index##TransWaveInit",&ins->amiga.transWave.ind,1,16)) { PARAMETER
|
||||||
if (ins->amiga.transWave.ind<1) ins->amiga.transWave.ind=0;
|
if (ins->amiga.transWave.ind<1) ins->amiga.transWave.ind=0;
|
||||||
if (ins->amiga.transWave.ind>=(int)(ins->amiga.transWaveMap.size())) ins->amiga.transWave.ind=ins->amiga.transWaveMap.size()-1;
|
if (ins->amiga.transWave.ind>=(int)(ins->amiga.transWaveMap.size())) ins->amiga.transWave.ind=ins->amiga.transWaveMap.size()-1;
|
||||||
|
if (ins->amiga.transWave.sliceEnable) {
|
||||||
|
DivInstrumentAmiga::TransWaveMap ind=ins->amiga.transWaveMap[ins->amiga.transWave.ind];
|
||||||
|
if (ind.ind>=0 && ind.ind<(short)(e->song.sampleLen)) {
|
||||||
|
DivSample* s=e->song.sample[ind.ind];
|
||||||
|
ins->amiga.transWave.updateSize(s->samples,ind.loopStart,ind.loopEnd);
|
||||||
|
ins->amiga.transWave.slicePos((double)(ins->amiga.transWave.slice)/4095.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ImGui::Checkbox("Use Transwave Slice##UseTransWaveSlice",&ins->amiga.transWave.sliceEnable)) { PARAMETER
|
||||||
|
if (ins->amiga.transWave.sliceEnable) {
|
||||||
|
ins->amiga.transWave.slicePos((double)(ins->amiga.transWave.slice)/4095.0);
|
||||||
|
if (ins->amiga.transWave.sliceEnable) {
|
||||||
|
DivInstrumentAmiga::TransWaveMap ind=ins->amiga.transWaveMap[ins->amiga.transWave.ind];
|
||||||
|
if (ind.ind>=0 && ind.ind<(short)(e->song.sampleLen)) {
|
||||||
|
DivSample* s=e->song.sample[ind.ind];
|
||||||
|
ins->amiga.transWave.updateSize(s->samples,ind.loopStart,ind.loopEnd);
|
||||||
|
ins->amiga.transWave.slicePos((double)(ins->amiga.transWave.slice)/4095.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
P(ImGui::Checkbox("Use Transwave Slice##UseTransWaveSlice",&ins->amiga.transWave.sliceEnable));
|
|
||||||
DivInstrumentAmiga::TransWaveMap ind=ins->amiga.transWaveMap[ins->amiga.transWave.ind];
|
DivInstrumentAmiga::TransWaveMap ind=ins->amiga.transWaveMap[ins->amiga.transWave.ind];
|
||||||
if (ins->amiga.transWave.sliceEnable && (ind.ind>=0 && ind.ind<e->song.sampleLen)) {
|
if (ins->amiga.transWave.sliceEnable && (ind.ind>=0 && ind.ind<e->song.sampleLen)) {
|
||||||
double sliceInit=(double)(ins->amiga.transWave.slice)/4095.0;
|
ins->amiga.transWave.slicePos((double)(ins->amiga.transWave.slice)/4095.0);
|
||||||
double slicePos=ins->amiga.transWave.slicePos(sliceInit);
|
|
||||||
double sliceStart=ins->amiga.transWave.sliceStart;
|
double sliceStart=ins->amiga.transWave.sliceStart;
|
||||||
double sliceEnd=ins->amiga.transWave.sliceEnd;
|
double sliceEnd=ins->amiga.transWave.sliceEnd;
|
||||||
P(CWSliderScalar("Initial Transwave Slice##TransWaveSliceInit",ImGuiDataType_U16,&ins->amiga.transWave.slice,&_ZERO,&_FOUR_THOUSAND_NINETY_FIVE,fmt::sprintf("%d: %.6f - %.6f",ins->amiga.transWave.slice,sliceStart,sliceEnd).c_str())); rightClickable
|
if (CWSliderScalar("Initial Transwave Slice##TransWaveSliceInit",ImGuiDataType_U16,&ins->amiga.transWave.slice,&_ZERO,&_FOUR_THOUSAND_NINETY_FIVE,fmt::sprintf("%d: %.6f - %.6f",ins->amiga.transWave.slice,sliceStart,sliceEnd).c_str())) { PARAMETER
|
||||||
ImGui::Text("Position: %.6f", slicePos);
|
ins->amiga.transWave.slicePos((double)(ins->amiga.transWave.slice)/4095.0);
|
||||||
|
} rightClickable
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTable("TransWaveMap",6,ImGuiTableFlags_ScrollY|ImGuiTableFlags_Borders|ImGuiTableFlags_SizingStretchSame)) {
|
if (ImGui::BeginTable("TransWaveMap",6,ImGuiTableFlags_ScrollY|ImGuiTableFlags_Borders|ImGuiTableFlags_SizingStretchSame)) {
|
||||||
ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed); // Number
|
ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed); // Number
|
||||||
|
@ -2772,6 +2793,10 @@ void FurnaceGUI::drawInsEdit() {
|
||||||
transWaveMap.loopEnd=s->loopEnd;
|
transWaveMap.loopEnd=s->loopEnd;
|
||||||
}
|
}
|
||||||
transWaveMap.updateSize(s->samples,transWaveMap.loopStart,transWaveMap.loopEnd);
|
transWaveMap.updateSize(s->samples,transWaveMap.loopStart,transWaveMap.loopEnd);
|
||||||
|
if (ins->amiga.transWave.sliceEnable && i==ins->amiga.transWave.ind) {
|
||||||
|
ins->amiga.transWave.updateSize(s->samples,transWaveMap.loopStart,transWaveMap.loopEnd);
|
||||||
|
ins->amiga.transWave.slicePos((double)(ins->amiga.transWave.slice)/4095.0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::EndCombo();
|
ImGui::EndCombo();
|
||||||
|
@ -2785,6 +2810,10 @@ void FurnaceGUI::drawInsEdit() {
|
||||||
if (transWaveMap.loopStart<0) transWaveMap.loopStart=0;
|
if (transWaveMap.loopStart<0) transWaveMap.loopStart=0;
|
||||||
if (transWaveMap.loopStart>transWaveMap.loopEnd) transWaveMap.loopStart=transWaveMap.loopEnd;
|
if (transWaveMap.loopStart>transWaveMap.loopEnd) transWaveMap.loopStart=transWaveMap.loopEnd;
|
||||||
transWaveMap.updateSize(s->samples,transWaveMap.loopStart,transWaveMap.loopEnd);
|
transWaveMap.updateSize(s->samples,transWaveMap.loopStart,transWaveMap.loopEnd);
|
||||||
|
if (ins->amiga.transWave.sliceEnable && i==ins->amiga.transWave.ind) {
|
||||||
|
ins->amiga.transWave.updateSize(s->samples,transWaveMap.loopStart,transWaveMap.loopEnd);
|
||||||
|
ins->amiga.transWave.slicePos((double)(ins->amiga.transWave.slice)/4095.0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
|
@ -2795,6 +2824,10 @@ void FurnaceGUI::drawInsEdit() {
|
||||||
if (transWaveMap.loopEnd<transWaveMap.loopStart) transWaveMap.loopEnd=transWaveMap.loopStart;
|
if (transWaveMap.loopEnd<transWaveMap.loopStart) transWaveMap.loopEnd=transWaveMap.loopStart;
|
||||||
if (transWaveMap.loopEnd>(int)(s->samples)) transWaveMap.loopEnd=s->samples;
|
if (transWaveMap.loopEnd>(int)(s->samples)) transWaveMap.loopEnd=s->samples;
|
||||||
transWaveMap.updateSize(s->samples,transWaveMap.loopStart,transWaveMap.loopEnd);
|
transWaveMap.updateSize(s->samples,transWaveMap.loopStart,transWaveMap.loopEnd);
|
||||||
|
if (ins->amiga.transWave.sliceEnable) {
|
||||||
|
ins->amiga.transWave.updateSize(s->samples,transWaveMap.loopStart,transWaveMap.loopEnd);
|
||||||
|
ins->amiga.transWave.slicePos((double)(ins->amiga.transWave.slice)/4095.0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
|
@ -2825,15 +2858,19 @@ void FurnaceGUI::drawInsEdit() {
|
||||||
}
|
}
|
||||||
ImGui::EndTable();
|
ImGui::EndTable();
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTabItem("Transwave Macros")) {
|
|
||||||
macroList.push_back(FurnaceGUIMacroDesc("Transwave control",&ins->std.fbMacro,0,1,32,uiColors[GUI_COLOR_MACRO_OTHER],false,false,NULL,NULL,true,transwaveControlModes));
|
|
||||||
macroList.push_back(FurnaceGUIMacroDesc("Transwave slice",&ins->std.fmsMacro,0,4095,160,uiColors[GUI_COLOR_MACRO_OTHER]));
|
|
||||||
ImGui::EndTabItem();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
|
if (ins->amiga.transWave.enable) {
|
||||||
|
if (ImGui::BeginTabItem("Transwave Macros")) {
|
||||||
|
macroList.push_back(FurnaceGUIMacroDesc("Transwave control",&ins->std.fbMacro,0,1,32,uiColors[GUI_COLOR_MACRO_OTHER],false,false,NULL,NULL,true,transwaveControlModes));
|
||||||
|
macroList.push_back(FurnaceGUIMacroDesc("Transwave slice",&ins->std.fmsMacro,0,4095,160,uiColors[GUI_COLOR_MACRO_OTHER]));
|
||||||
|
drawMacros(macroList);
|
||||||
|
ImGui::EndTabItem();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (ins->type==DIV_INS_N163) if (ImGui::BeginTabItem("Namco 163")) {
|
if (ins->type==DIV_INS_N163) if (ImGui::BeginTabItem("Namco 163")) {
|
||||||
if (ImGui::InputInt("Waveform##WAVE",&ins->n163.wave,1,10)) { PARAMETER
|
if (ImGui::InputInt("Waveform##WAVE",&ins->n163.wave,1,10)) { PARAMETER
|
||||||
if (ins->n163.wave<0) ins->n163.wave=0;
|
if (ins->n163.wave<0) ins->n163.wave=0;
|
||||||
|
|
Loading…
Reference in New Issue