Merge branch 'master' of https://github.com/tildearrow/furnace into es5506_alt

This commit is contained in:
cam900 2023-01-13 09:48:52 +09:00
commit b64c089c56
23 changed files with 63 additions and 12 deletions

1
.github/issue_template.md vendored Normal file
View File

@ -0,0 +1 @@
<!-- NOTICE: if you are going to write a suggestion, see the Discussions section instead. any suggestions posted in Issues will be closed. -->

View File

@ -754,7 +754,7 @@ if (WARNINGS_ARE_ERRORS)
)
endif()
if (MSVC)
if (WIN32)
add_executable(furnace WIN32 ${USED_SOURCES})
elseif(ANDROID AND NOT TERMUX)
add_library(furnace SHARED ${USED_SOURCES})

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
demos/snes/tetristheme.fur Normal file

Binary file not shown.

Binary file not shown.

View File

@ -337,6 +337,7 @@ void DivPlatformAY8910::tick(bool sysTick) {
chan[i].dac.rate=((double)rate*((sunsoft||clockSel)?8.0:16.0))/(double)(MAX(1,off*chan[i].freq));
if (dumpWrites) addWrite(0xffff0001+(i<<8),chan[i].dac.rate);
}
if (chan[i].freq<0) chan[i].freq=0;
if (chan[i].freq>4095) chan[i].freq=4095;
if (chan[i].keyOn) {
//rWrite(16+i*5+1,((chan[i].duty&3)<<6)|(63-(ins->gb.soundLen&63)));

View File

@ -270,7 +270,7 @@ void DivPlatformAY8930::tick(bool sysTick) {
if (chan[i].std.pitch.had) {
if (chan[i].std.pitch.mode) {
chan[i].pitch2+=chan[i].std.pitch.val;
CLAMP_VAR(chan[i].pitch2,-32768,32767);
CLAMP_VAR(chan[i].pitch2,-65535,65535);
} else {
chan[i].pitch2=chan[i].std.pitch.val;
}
@ -336,6 +336,7 @@ void DivPlatformAY8930::tick(bool sysTick) {
chan[i].dac.rate=((double)chipClock*4.0)/(double)(MAX(1,off*chan[i].freq));
if (dumpWrites) addWrite(0xffff0001+(i<<8),chan[i].dac.rate);
}
if (chan[i].freq<0) chan[i].freq=0;
if (chan[i].freq>65535) chan[i].freq=65535;
if (chan[i].keyOn) {
if (!chan[i].nextPSGMode.dac) {

View File

@ -284,14 +284,14 @@ void DivPlatformGB::tick(bool sysTick) {
if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) {
if (i==3) { // noise
int ntPos=chan[i].baseFreq;
int ntPos=chan[i].baseFreq+chan[i].pitch2;
if (ntPos<0) ntPos=0;
if (ntPos>255) ntPos=255;
chan[i].freq=noiseTable[ntPos];
} else {
chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,chan[i].fixedArp?chan[i].baseNoteOverride:chan[i].arpOff,chan[i].fixedArp,true,0,chan[i].pitch2,chipClock,CHIP_DIVIDER);
if (chan[i].freq>2047) chan[i].freq=2047;
if (chan[i].freq<0) chan[i].freq=0;
if (chan[i].freq<1) chan[i].freq=1;
}
if (chan[i].keyOn) {
if (i==2) { // wave

View File

@ -278,6 +278,7 @@ void DivPlatformNES::tick(bool sysTick) {
ntPos+=chan[i].arpOff;
}
}
ntPos+=chan[i].pitch2;
if (parent->song.properNoiseLayout) {
chan[i].freq=15-(ntPos&15);
} else {

View File

@ -242,6 +242,7 @@ void DivPlatformPCE::tick(bool sysTick) {
chan[i].dacRate=((double)chipClock/2)/MAX(1,off*chan[i].freq);
if (dumpWrites) addWrite(0xffff0001+(i<<8),chan[i].dacRate);
}
if (chan[i].freq<1) chan[i].freq=1;
if (chan[i].freq>4095) chan[i].freq=4095;
chWrite(i,0x02,chan[i].freq&0xff);
chWrite(i,0x03,chan[i].freq>>8);

View File

@ -1064,12 +1064,11 @@ void ay8910_device::sound_stream_update(short** outputs, int outLen)
tone = &m_tone[chan];
const int period = std::max<int>(1, tone->period) * (m_step_mul << 1);
tone->count += is_expanded_mode() ? 32 : ((m_feature & PSG_HAS_EXPANDED_MODE) ? 1 : 2);
while (tone->count >= period)
{
tone->duty_cycle = (tone->duty_cycle - 1) & 0x1f;
tone->output = is_expanded_mode() ? BIT(duty_cycle[tone_duty(tone)], tone->duty_cycle) : BIT(tone->duty_cycle, 0);
tone->count -= period;
}
if (tone->count>=period) {
tone->duty_cycle = (tone->duty_cycle - (tone->count/period)) & 0x1f;
tone->output = is_expanded_mode() ? BIT(duty_cycle[tone_duty(tone)], tone->duty_cycle) : BIT(tone->duty_cycle, 0);
tone->count = tone->count % period;
}
}
const int period_noise = (int)(noise_period()) * m_step_mul;

View File

@ -659,11 +659,13 @@ void namco_audio_device::sound_stream_update(short** outputs, int len)
{
lmix[i]+=l_noise_data;
rmix[i]+=r_noise_data;
voice->last_out=(l_noise_data+r_noise_data)>>1;
}
else
{
lmix[i]+=-l_noise_data;
rmix[i]+=-r_noise_data;
voice->last_out=-((l_noise_data+r_noise_data)>>1);
}
if (hold)

View File

@ -152,6 +152,14 @@ void DivPlatformTX81Z::tick(bool sysTick) {
chan[i].freqChanged=true;
}
if (chan[i].std.panL.had) {
chan[i].chVolL=(chan[i].std.panL.val&2)>>1;
chan[i].chVolR=chan[i].std.panL.val&1;
chan[i].freqChanged=true;
immWrite(chanOffs[i]+ADDR_LR_FB_ALG,(chan[i].state.alg&7)|(chan[i].state.fb<<3)|(chan[i].active?0x40:0)|(chan[i].chVolR<<7));
}
if (chan[i].std.phaseReset.had) {
if (chan[i].std.phaseReset.val==1 && chan[i].active) {
chan[i].keyOn=true;

View File

@ -715,6 +715,17 @@ void DivPlatformYM2608::tick(bool sysTick) {
}
chan[15].freqChanged=true;
}
if (chan[15].std.pitch.had) {
if (chan[15].std.pitch.mode) {
chan[15].pitch2+=chan[15].std.pitch.val;
CLAMP_VAR(chan[15].pitch2,-65535,65535);
} else {
chan[15].pitch2=chan[15].std.pitch.val;
}
chan[15].freqChanged=true;
}
if (chan[15].std.panL.had) {
if (chan[15].pan!=(chan[15].std.panL.val&3)) {
chan[15].pan=chan[15].std.panL.val&3;

View File

@ -650,6 +650,17 @@ void DivPlatformYM2610::tick(bool sysTick) {
}
chan[adpcmBChanOffs].freqChanged=true;
}
if (chan[adpcmBChanOffs].std.pitch.had) {
if (chan[adpcmBChanOffs].std.pitch.mode) {
chan[adpcmBChanOffs].pitch2+=chan[adpcmBChanOffs].std.pitch.val;
CLAMP_VAR(chan[adpcmBChanOffs].pitch2,-65535,65535);
} else {
chan[adpcmBChanOffs].pitch2=chan[adpcmBChanOffs].std.pitch.val;
}
chan[adpcmBChanOffs].freqChanged=true;
}
if (chan[adpcmBChanOffs].std.panL.had) {
if (chan[adpcmBChanOffs].pan!=(chan[adpcmBChanOffs].std.panL.val&3)) {
chan[adpcmBChanOffs].pan=chan[adpcmBChanOffs].std.panL.val&3;

View File

@ -717,6 +717,17 @@ void DivPlatformYM2610B::tick(bool sysTick) {
}
chan[adpcmBChanOffs].freqChanged=true;
}
if (chan[adpcmBChanOffs].std.pitch.had) {
if (chan[adpcmBChanOffs].std.pitch.mode) {
chan[adpcmBChanOffs].pitch2+=chan[adpcmBChanOffs].std.pitch.val;
CLAMP_VAR(chan[adpcmBChanOffs].pitch2,-65535,65535);
} else {
chan[adpcmBChanOffs].pitch2=chan[adpcmBChanOffs].std.pitch.val;
}
chan[adpcmBChanOffs].freqChanged=true;
}
if (chan[adpcmBChanOffs].std.panL.had) {
if (chan[adpcmBChanOffs].pan!=(chan[adpcmBChanOffs].std.panL.val&3)) {
chan[adpcmBChanOffs].pan=chan[adpcmBChanOffs].std.panL.val&3;

View File

@ -71,6 +71,7 @@ const char* aboutLine[]={
"DeMOSic",
"DevEd",
"Dippy",
"djtuBIG-MaliceX",
"dumbut",
"FΛDE",
"Forte",
@ -99,6 +100,7 @@ const char* aboutLine[]={
"SuperJet Spade",
"SwapXFO",
"TakuikaNinja",
"TCORPStudios",
"The Blender Fiddler",
"TheDuccinator",
"theloredev",

View File

@ -5279,7 +5279,9 @@ void FurnaceGUI::drawInsEdit() {
if (volMax>0) {
macroList.push_back(FurnaceGUIMacroDesc(volumeLabel,&ins->std.volMacro,volMin,volMax,160,uiColors[GUI_COLOR_MACRO_VOLUME]));
}
macroList.push_back(FurnaceGUIMacroDesc("Arpeggio",&ins->std.arpMacro,-120,120,160,uiColors[GUI_COLOR_MACRO_PITCH],true,NULL,macroHoverNote,false,NULL,0,true,ins->std.arpMacro.val));
if (ins->type!=DIV_INS_MSM6258 && ins->type!=DIV_INS_MSM6295) {
macroList.push_back(FurnaceGUIMacroDesc("Arpeggio",&ins->std.arpMacro,-120,120,160,uiColors[GUI_COLOR_MACRO_PITCH],true,NULL,macroHoverNote,false,NULL,0,true,ins->std.arpMacro.val));
}
if (dutyMax>0) {
if (ins->type==DIV_INS_MIKEY) {
macroList.push_back(FurnaceGUIMacroDesc(dutyLabel,&ins->std.dutyMacro,0,dutyMax,160,uiColors[GUI_COLOR_MACRO_OTHER],false,NULL,NULL,true,mikeyFeedbackBits));
@ -5317,7 +5319,7 @@ void FurnaceGUI::drawInsEdit() {
}
}
}
if (ins->type!=DIV_INS_MSM5232) {
if (ins->type!=DIV_INS_MSM5232 && ins->type!=DIV_INS_MSM6258 && ins->type!=DIV_INS_MSM6295) {
macroList.push_back(FurnaceGUIMacroDesc("Pitch",&ins->std.pitchMacro,-2048,2047,160,uiColors[GUI_COLOR_MACRO_PITCH],true,macroRelativeMode));
}
if (ins->type==DIV_INS_FM ||