Exemple #1
0
 public void init(uint samplingRate, MDSound mds, VGM_PCM_BANK[] PCMBank)
 {
     this.mds          = mds;
     this.samplingRate = samplingRate;
     pcmStep           = samplingRate / (double)DAC_SMPL_RATE;
     pcmExecDelta      = 0;
     this.PCMBank      = PCMBank;
     refresh();
     DacCtrlUsed = 0x00;
     for (byte CurChip = 0x00; CurChip < 0xFF; CurChip++)
     {
         DacCtrl[CurChip]        = new DACCTRL_DATA();
         DacCtrl[CurChip].Enable = false;
     }
 }
Exemple #2
0
        /**
         * PCM_Update(): Update the PCM buffer.
         * @param buf PCM buffer.
         * @param Length Buffer length.
         */
        private int PCM_Update(byte ChipID, int[][] buf, int Length)
        {
            pcm_chip_ chip = PCM_Chip[ChipID];
            int       i, j;

            int[]     bufL, bufR;  //, *volL, *volR;
            uint      Addr, k;
            pcm_chan_ CH;

            bufL = buf[0];
            bufR = buf[1];

            // clear buffers
            for (int d = 0; d < Length; d++)
            {
                bufL[d] = 0;
                bufR[d] = 0;
            }

            // if PCM disable, no sound
            if (chip.Enable == 0)
            {
                return(1);
            }

            // for long update
            for (i = 0; i < 8; i++)
            {
                CH = chip.Channel[i];

                // only loop when sounding and on
                if (CH.Enable > 0 && CH.Muted == 0)
                {
                    Addr = CH.Addr >> PCM_STEP_SHIFT;
                    //volL = &(PCM_Volume_Tab[CH->MUL_L << 8]);
                    //volR = &(PCM_Volume_Tab[CH->MUL_R << 8]);

                    for (j = 0; j < Length; j++)
                    {
                        // test for loop signal
                        if (chip.RAM[Addr] == 0xFF)
                        {
                            CH.Addr = (Addr = CH.Loop_Addr) << PCM_STEP_SHIFT;
                            if (chip.RAM[Addr] == 0xFF)
                            {
                                break;
                            }
                            else
                            {
                                j--;
                            }
                        }
                        else
                        {
                            if ((chip.RAM[Addr] & 0x80) != 0)
                            {
                                CH.Data  = chip.RAM[Addr] & 0x7F;
                                bufL[j] -= (int)(CH.Data * CH.MUL_L);
                                bufR[j] -= (int)(CH.Data * CH.MUL_R);
                            }
                            else
                            {
                                CH.Data = chip.RAM[Addr];
                                // this improves the sound of Cosmic Fantasy Stories,
                                // although it's definately false behaviour
                                if (CH.Data == 0 && chip.Smpl0Patch != 0)
                                {
                                    CH.Data = -0x7F;
                                }
                                bufL[j] += (int)(CH.Data * CH.MUL_L);
                                bufR[j] += (int)(CH.Data * CH.MUL_R);
                            }

                            bufL[j] = MDSound.Limit(bufL[j], Int16.MaxValue, Int16.MinValue);
                            bufR[j] = MDSound.Limit(bufR[j], Int16.MaxValue, Int16.MinValue);

                            // update address register
                            k       = Addr + 1;
                            CH.Addr = (CH.Addr + CH.Step) & 0x7FFFFFF;
                            Addr    = CH.Addr >> PCM_STEP_SHIFT;

                            for (; k < Addr; k++)
                            {
                                if (chip.RAM[k] == 0xFF)
                                {
                                    CH.Addr = (Addr = CH.Loop_Addr) << PCM_STEP_SHIFT;
                                    break;
                                }
                            }
                        }
                    }

                    if (chip.RAM[Addr] == 0xFF)
                    {
                        CH.Addr = CH.Loop_Addr << PCM_STEP_SHIFT;
                    }
                }
            }

            return(0);
        }
Exemple #3
0
 public dacControl(uint samplingRate, MDSound mds)
 {
     init(samplingRate, mds, null);
 }