public NSF(NESCore nes, int specialChips) { this.nes = nes; chipCount = 0; if ((FlagVRC6 & specialChips) != 0) { VRC6 = new Channels.VRC6(0, 1, 2, 3); chipCount++; } else { VRC6 = new Channels.External(); } if ((FlagVRC7 & specialChips) != 0) { VRC7 = new Channels.External(); chipCount++; } else { VRC7 = new Channels.External(); } if ((FlagFDS & specialChips) != 0) { FDS = new Channels.FDS(); chipCount++; } else { FDS = new Channels.External(); } if ((FlagMMC5 & specialChips) != 0) { hasMMC5 = true; MMC5 = new Channels.MMC5(nes); chipCount++; } else { MMC5 = new Channels.External(); } if ((FlagN163 & specialChips) != 0) { N163 = new Channels.N163(); chipCount++; } else { N163 = new Channels.External(); } if ((FlagFME7 & specialChips) != 0) { FME7 = new Channels.FME7(); chipCount++; } else { FME7 = new Channels.External(); } }
public APU(NESCore nes, int sampleRate) { this.nes = nes; this.sampleRate = sampleRate; switch (nes.nesRegion) { default: case SystemType.NTSC: CPUClock = 1789773; FPS = (CPUClock * 3.0) / 89341.5; modeZeroDelay = 7459;//http://nesdev.parodius.com/bbs/viewtopic.php?p=64281#64281 modeZeroFrameLengths = new int[] { 7456, 7458, 7458, 7458 }; modeOneDelay = 1; modeOneFrameLengths = new int[] { 7458, 7456, 7458, 7458, 7452 }; break; case SystemType.PAL: CPUClock = 1662607; FPS = (CPUClock * 3.2) / 106392; modeZeroDelay = 8315; modeZeroFrameLengths = new int[] { 8314, 8312, 8314, 8314 }; modeOneDelay = 1; modeOneFrameLengths = new int[] { 8314, 8314, 8312, 8314, 8312 }; break; } if (this.sampleRate == -1) { this.sampleRate = CPUClock; } rollingAveWindow = this.sampleRate / 10; SetFPS(FPS); output = new short[this.sampleRate]; //the buffers really don't need to be this large, but it should prevent overflows when the FPS is set exceptionally low. for (int i = 0; i < 32; i++) { pulseTable[i] = ((95.52 / (8128.0 / i + 100.0))); pulseTableShort[i] = (int)(pulseTable[i] * 0x7FFF); //Half the range for internal channels, half for external. } for (int i = 0; i < 204; i++) { tndTable[i] = ((163.67 / (24329.0 / i + 100.0))); tndTableShort[i] = (int)(tndTable[i] * 0x7FFF); } volume.square1 = 1; volume.square2 = 1; volume.triangle = 1; volume.noise = 1; volume.dmc = 1; volume.external = 1; square1 = new Channels.Square(nes, true, true); square2 = new Channels.Square(nes, true, false); triangle = new Channels.Triangle(nes); noise = new Channels.Noise(nes); dmc = new Channels.DMC(nes, CPUClock); external = new Channels.External(); }
public APU(NESCore nes, int sampleRate) { this.nes = nes; this.sampleRate = sampleRate; switch (nes.nesRegion) { default: case SystemType.NTSC: CPUClock = 1789773; FPS = (CPUClock * 3.0) / 89341.5; modeZeroDelay = 7459;//http://nesdev.parodius.com/bbs/viewtopic.php?p=64281#64281 modeZeroFrameLengths = new int[] { 7456, 7458, 7458, 7458}; modeOneDelay = 1; modeOneFrameLengths = new int[] { 7458, 7456, 7458, 7458, 7452}; break; case SystemType.PAL: CPUClock = 1662607; FPS = (CPUClock * 3.2) / 106392; modeZeroDelay = 8315; modeZeroFrameLengths = new int[] { 8314, 8312, 8314, 8314 }; modeOneDelay = 1; modeOneFrameLengths = new int[] { 8314, 8314, 8312, 8314, 8312 }; break; } if (this.sampleRate == -1) this.sampleRate = CPUClock; rollingAveWindow = this.sampleRate / 10; SetFPS(FPS); output = new short[this.sampleRate]; //the buffers really don't need to be this large, but it should prevent overflows when the FPS is set exceptionally low. for (int i = 0; i < 32; i++) { pulseTable[i] = ((95.52 / (8128.0 / i + 100.0))); pulseTableShort[i] = (int)(pulseTable[i] * 0x7FFF); //Half the range for internal channels, half for external. } for (int i = 0; i < 204; i++) { tndTable[i] = ((163.67 / (24329.0 / i + 100.0))); tndTableShort[i] = (int)(tndTable[i] * 0x7FFF); } volume.square1 = 1; volume.square2 = 1; volume.triangle = 1; volume.noise = 1; volume.dmc = 1; volume.external = 1; square1 = new Channels.Square(nes, true, true); square2 = new Channels.Square(nes, true, false); triangle = new Channels.Triangle(nes); noise = new Channels.Noise(nes); dmc = new Channels.DMC(nes, CPUClock); external = new Channels.External(); }