001    
002    package ibxm;
003    
004    public class Channel {
005        public int pattern_loop_row;
006    
007        private Module module;
008        private Instrument instrument;
009        private Sample sample;
010        private int[] global_volume, current_note;
011        private boolean linear_periods, fast_volume_slides, key_on, silent;
012        private int sample_idx, sample_frac, step, left_gain, right_gain;
013        private int volume, panning, fine_tune, period, porta_period, key_add;
014        private int tremolo_speed, tremolo_depth, tremolo_tick, tremolo_wave, tremolo_add;
015        private int vibrato_speed, vibrato_depth, vibrato_tick, vibrato_wave, vibrato_add;
016        private int volume_slide_param, portamento_param, retrig_param;
017        private int volume_envelope_tick, panning_envelope_tick;
018        private int effect_tick, trigger_tick, fade_out_volume, random_seed;
019    
020        private int log_2_sampling_rate;
021        private static final int LOG_2_29024 = LogTable.log_2( 29024 );
022        private static final int LOG_2_8287 = LogTable.log_2( 8287 );
023        private static final int LOG_2_8363 = LogTable.log_2( 8363 );
024        private static final int LOG_2_1712 = LogTable.log_2( 1712 );
025    
026        private static final int[] sine_table = new int[] {
027              0, 24 ,  49,  74,  97, 120, 141, 161, 180, 197, 212, 224, 235, 244, 250, 253,
028            255, 253, 250, 244, 235, 224, 212, 197, 180, 161, 141, 120,  97,  74,  49,  24
029        };
030    
031        public Channel( Module mod, int sampling_rate, int[] global_vol ) {
032            module = mod;
033            global_volume = global_vol;
034            linear_periods = module.linear_periods;
035            fast_volume_slides = module.fast_volume_slides;
036            current_note = new int[ 5 ];
037            log_2_sampling_rate = LogTable.log_2( sampling_rate );
038        }
039        
040        public void reset() {
041            tremolo_speed = 0;
042            tremolo_depth = 0;
043            tremolo_wave = 0;
044            vibrato_speed = 0;
045            vibrato_depth = 0;
046            vibrato_wave = 0;
047            volume_slide_param = 0;
048            portamento_param = 0;
049            retrig_param = 0;
050            random_seed = 0xABC123;
051            instrument = module.get_instrument( 0 );
052            row( 48, 256, 0, 0, 0 );
053        }
054        
055        public void resample( int[] mixing_buffer, int frame_offset, int frames, int quality ) {
056            if( !silent ) {
057                switch( quality ) {
058                    default:
059                        sample.resample_nearest( sample_idx, sample_frac, step, left_gain, right_gain, mixing_buffer, frame_offset, frames );
060                        break;
061                    case 1:
062                        sample.resample_linear( sample_idx, sample_frac, step, left_gain, right_gain, mixing_buffer, frame_offset, frames );
063                        break;
064                    case 2:
065                        sample.resample_sinc( sample_idx, sample_frac, step, left_gain, right_gain, mixing_buffer, frame_offset, frames );
066                        break;
067                }
068            }
069        }
070    
071        public void update_sample_idx( int samples ) {
072            sample_frac += step * samples;
073            sample_idx += sample_frac >> IBXM.FP_SHIFT;
074            sample_frac &= IBXM.FP_MASK;
075        }
076        
077        public void set_volume( int vol ) {
078            if( vol < 0 ) {
079                vol = 0;
080            }
081            if( vol > 64 ) {
082                vol = 64;
083            }
084            volume = vol;
085        }
086        
087        public void set_panning( int pan ) {
088            if( pan < 0 ) {
089                pan = 0;
090            }
091            if( pan > 255 ) {
092                pan = 255;
093            }
094            panning = pan;
095        }
096        
097        public void row( int key, int inst_idx, int volume_column, int effect, int effect_param ) {
098            effect = effect & 0xFF;
099            if( effect >= 0x30 ) {
100                /* Effects above 0x30 are internal.*/
101                effect = 0;
102            }
103            if( effect == 0x00 && effect_param != 0 ) {
104                /* Arpeggio.*/
105                effect = 0x40;
106            }
107            if( effect == 0x0E ) {
108                /* Renumber 0x0Ex effect command.*/
109                effect = 0x30 + ( ( effect_param & 0xF0 ) >> 4 );
110                effect_param = effect_param & 0x0F;
111            }
112            if( effect == 0x21 ) {
113                /* Renumber 0x21x effect command.*/
114                effect = 0x40 + ( ( effect_param & 0xF0 ) >> 4 );
115                effect_param = effect_param & 0x0F;
116            }
117            current_note[ 0 ] = key;
118            current_note[ 1 ] = inst_idx;
119            current_note[ 2 ] = volume_column;
120            current_note[ 3 ] = effect;
121            current_note[ 4 ] = effect_param;
122            effect_tick = 0;        
123            trigger_tick += 1;
124            update_envelopes();
125            key_add = 0;
126            vibrato_add = 0;
127            tremolo_add = 0;
128            if( ! ( effect == 0x3D && effect_param > 0 ) ) {
129                /* Not note delay.*/
130                trigger( key, inst_idx, volume_column, effect );
131                /* Handle volume column.*/
132                switch( volume_column & 0xF0 ) {
133                    case 0x00:
134                        /* Do nothing.*/
135                        break;
136                    case 0x60:
137                        /* Volume slide down.*/
138                        break;
139                    case 0x70:
140                        /* Volume slide up.*/
141                        break;
142                    case 0x80:
143                        /* Fine volume slide down.*/
144                        set_volume( volume - ( volume_column & 0x0F ) );
145                        break;
146                    case 0x90:
147                        /* Fine volume slide up.*/
148                        set_volume( volume + ( volume_column & 0x0F ) );
149                        break;
150                    case 0xA0:
151                        /* Set vibrato speed.*/
152                        set_vibrato_speed( volume_column & 0x0F );
153                        break;
154                    case 0xB0:
155                        /* Vibrato.*/
156                        set_vibrato_depth( volume_column & 0x0F );
157                        vibrato();
158                        break;
159                    case 0xC0:
160                        /* Set panning.*/
161                        set_panning( ( volume_column & 0x0F ) << 4 );
162                        break;
163                    case 0xD0:
164                        /* Panning slide left.*/
165                        break;
166                    case 0xE0:
167                        /* Panning slide right.*/
168                        break;
169                    case 0xF0:
170                        /* Tone portamento.*/
171                        set_portamento_param( volume_column & 0x0F );
172                        break;
173                    default:
174                        /* Set volume.*/
175                        set_volume( volume_column - 0x10 );
176                        break;
177                }
178            }
179            if( instrument.vibrato_depth > 0 ) {
180                auto_vibrato();
181            }
182            switch( effect ) {
183                case 0x01:
184                    /* Portmento Up.*/
185                    set_portamento_param( effect_param );
186                    portamento_up();
187                    break;
188                case 0x02:
189                    /* Portamento Down.*/
190                    set_portamento_param( effect_param );
191                    portamento_down();
192                    break;
193                case 0x03:
194                    /* Tone Portamento.*/
195                    set_portamento_param( effect_param );
196                    break;
197                case 0x04:
198                    /* Vibrato.*/
199                    set_vibrato_speed( ( effect_param & 0xF0 ) >> 4 );
200                    set_vibrato_depth( effect_param & 0x0F );
201                    vibrato();
202                    break;
203                case 0x05:
204                    /* Tone Portamento + Volume Slide.*/
205                    set_volume_slide_param( effect_param );
206                    volume_slide();
207                    break;
208                case 0x06:
209                    /* Vibrato + Volume Slide.*/
210                    set_volume_slide_param( effect_param );
211                    vibrato();
212                    volume_slide();
213                    break;
214                case 0x07:
215                    /* Tremolo.*/
216                    set_tremolo_speed( ( effect_param & 0xF0 ) >> 4 );
217                    set_tremolo_depth( effect_param & 0x0F );
218                    tremolo();
219                    break;
220                case 0x08:
221                    /* Set Panning.*/
222                    set_panning( effect_param );
223                    break;
224                case 0x09:
225                    /* Set Sample Index.*/
226                    set_sample_index( effect_param << 8 );
227                    break;
228                case 0x0A:
229                    /* Volume Slide.*/
230                    set_volume_slide_param( effect_param );
231                    volume_slide();
232                    break;
233                case 0x0B:
234                    /* Pattern Jump.*/
235                    break;
236                case 0x0C:
237                    /* Set volume.*/
238                    set_volume( effect_param );
239                    break;
240                case 0x0D:
241                    /* Pattern Break.*/
242                    break;
243                case 0x0E:
244                    /* Extended Commands (See 0x30-0x3F).*/
245                    break;
246                case 0x0F:
247                    /* Set Speed/Tempo.*/
248                    break;
249                case 0x10:
250                    /* Set Global Volume.*/
251                    set_global_volume( effect_param );
252                    break;
253                case 0x11:
254                    /* global Volume Slide.*/
255                    set_volume_slide_param( effect_param );
256                    break;
257                case 0x14:
258                    /* Key Off*/
259                    if( effect_param == 0 ) {
260                        key_on = false;
261                    }
262                    break;
263                case 0x15:
264                    /* Set Envelope Tick.*/
265                    set_envelope_tick( effect_param );
266                    break;
267                case 0x19:
268                    /* Panning Slide.*/
269                    set_volume_slide_param( effect_param );
270                    break;
271                case 0x1B:
272                    /* Retrig + Volume Slide.*/
273                    set_retrig_param( effect_param );
274                    retrig_volume_slide();
275                    break;
276                case 0x1D:
277                    /* Tremor.*/
278                    set_retrig_param( effect_param );
279                    tremor();
280                    break;
281                case 0x24:
282                    /* S3M Fine Vibrato.*/
283                    set_vibrato_speed( ( effect_param & 0xF0 ) >> 4 );
284                    set_vibrato_depth( effect_param & 0x0F );
285                    fine_vibrato();
286                    break;
287                case 0x25:
288                    /* S3M Set Speed.*/
289                    break;
290                case 0x30:
291                    /* Amiga Set Filter.*/
292                    break;
293                case 0x31:
294                    /* Fine Portamento Up.*/
295                    set_portamento_param( 0xF0 | effect_param );
296                    portamento_up();
297                    break;
298                case 0x32:
299                    /* Fine Portamento Down.*/
300                    set_portamento_param( 0xF0 | effect_param );
301                    portamento_down();
302                    break;
303                case 0x33:
304                    /* Set Glissando Mode.*/
305                    break;
306                case 0x34:
307                    /* Set Vibrato Waveform.*/
308                    set_vibrato_wave( effect_param );
309                    break;
310                case 0x35:
311                    /* Set Fine Tune.*/
312                    break;
313                case 0x36:
314                    /* Pattern Loop.*/
315                    break;
316                case 0x37:
317                    /* Set Tremolo Waveform.*/
318                    set_tremolo_wave( effect_param );
319                    break;
320                case 0x38:
321                    /* Set Panning(Obsolete).*/
322                    break;
323                case 0x39:
324                    /* Retrig.*/
325                    set_retrig_param( effect_param );
326                    break;
327                case 0x3A:
328                    /* Fine Volume Slide Up.*/
329                    set_volume_slide_param( ( effect_param << 4 ) | 0x0F );
330                    volume_slide();
331                    break;
332                case 0x3B:
333                    /* Fine Volume Slide Down.*/
334                    set_volume_slide_param( 0xF0 | effect_param );
335                    volume_slide();
336                    break;
337                case 0x3C:
338                    /* Note Cut.*/
339                    if( effect_param == 0 ) {
340                        set_volume( 0 );
341                    }
342                    break;
343                case 0x3D:
344                    /* Note Delay.*/
345                    break;
346                case 0x3E:
347                    /* Pattern Delay.*/
348                    break;
349                case 0x3F:
350                    /* Invert Loop.*/
351                    break;
352                case 0x40:
353                    /* Arpeggio.*/
354                    break;
355                case 0x41:
356                    /* Extra Fine Porta Up.*/
357                    set_portamento_param( 0xE0 | effect_param );
358                    portamento_up();
359                    break;
360                case 0x42:
361                    /* Extra Fine Porta Down.*/
362                    set_portamento_param( 0xE0 | effect_param );
363                    portamento_down();
364                    break;
365            }
366            calculate_amplitude();
367            calculate_frequency();
368        }
369    
370        public void tick() {
371            int volume_column, effect, effect_param;
372            volume_column = current_note[ 2 ];
373            effect = current_note[ 3 ];
374            effect_param = current_note[ 4 ];
375            effect_tick += 1;
376            if( effect == 0x3D && effect_param == effect_tick ) {
377                /* Note delay.*/
378                row( current_note[ 0 ], current_note[ 1 ], volume_column, 0, 0 );
379            } else {
380                trigger_tick += 1;
381                vibrato_tick += 1;
382                tremolo_tick += 1;
383                update_envelopes();
384                key_add = 0;
385                vibrato_add = 0;
386                tremolo_add = 0;
387                if( instrument.vibrato_depth > 0 ) {
388                    auto_vibrato();
389                }
390                switch( volume_column & 0xF0 ) {
391                    case 0x60:
392                        /* Volume Slide Down.*/
393                        set_volume( volume - ( volume_column & 0x0F ) );
394                        break;
395                    case 0x70:
396                        /* Volume Slide Up.*/
397                        set_volume( volume + ( volume_column & 0x0F ) );
398                        break;
399                    case 0xB0:
400                        /* Vibrato.*/
401                        vibrato();
402                        break;
403                    case 0xD0:
404                        /* Panning Slide Left.*/
405                        set_panning( panning - ( volume_column & 0x0F ) );
406                        break;
407                    case 0xE0:
408                        /* Panning Slide Right.*/
409                        set_panning( panning + ( volume_column & 0x0F ) );
410                        break;
411                    case 0xF0:
412                        /* Tone Portamento.*/
413                        tone_portamento();
414                        break;
415                }
416                switch( effect ) {
417                    case 0x01:
418                        /* Portamento Up.*/
419                        portamento_up();
420                        break;
421                    case 0x02:
422                        /* Portamento Down.*/
423                        portamento_down();
424                        break;
425                    case 0x03:
426                        /* Tone Portamento.*/
427                        tone_portamento();
428                        break;
429                    case 0x04:
430                        /* Vibrato.*/
431                        vibrato();
432                        break;
433                    case 0x05:
434                        /* Tone Portamento + Volume Slide.*/
435                        tone_portamento();
436                        volume_slide();
437                        break;
438                    case 0x06:
439                        /* Vibrato + Volume Slide */
440                        vibrato();
441                        volume_slide();
442                        break;
443                    case 0x07:
444                        /* Tremolo.*/
445                        tremolo();
446                        break;
447                    case 0x0A:
448                        /* Volume Slide.*/
449                        volume_slide();
450                        break;
451                    case 0x11:
452                        /* Global Volume Slide.*/
453                        global_volume_slide();
454                        break;
455                    case 0x14:
456                        /* Key off.*/
457                        if( effect_tick == effect_param ) {
458                            key_on = false;
459                        }
460                        break;
461                    case 0x19:
462                        /* Panning Slide.*/
463                        panning_slide();
464                        break;
465                    case 0x1B:
466                        /* Retrig + Volume Slide.*/
467                        retrig_volume_slide();
468                        break;
469                    case 0x1D:
470                        /* Tremor.*/
471                        tremor();
472                        break;
473                    case 0x24:
474                        /* S3M Fine Vibrato.*/
475                        fine_vibrato();
476                        break;
477                    case 0x39:
478                        /* Retrig.*/
479                        retrig_volume_slide();
480                        break;
481                    case 0x3C:
482                        /* Note Cut.*/
483                        if( effect_tick == effect_param ) {
484                            set_volume( 0 );
485                        }
486                        break;
487                    case 0x40:
488                        /* Arpeggio.*/
489                        switch( effect_tick % 3 ) {
490                            case 1:
491                                key_add = ( effect_param & 0xF0 ) >> 4;
492                                break;
493                            case 2:
494                                key_add = effect_param & 0x0F;
495                                break;
496                        }
497                        break;
498                }
499            }
500            calculate_amplitude();
501            calculate_frequency();
502        }
503    
504        private void set_vibrato_speed( int speed ) {
505            if( speed > 0 ) {
506                vibrato_speed = speed;
507            }
508        }
509    
510        private void set_vibrato_depth( int depth ) {
511            if( depth > 0 ) {
512                vibrato_depth = depth;
513            }
514        }
515        
516        private void set_vibrato_wave( int wave ) {
517            if( wave < 0 || wave > 7 ) {
518                wave = 0;
519            }
520            vibrato_wave = wave;
521        }
522    
523        private void set_tremolo_speed( int speed ) {
524            if( speed > 0 ) {
525                tremolo_speed = speed;
526            }
527        }
528    
529        private void set_tremolo_depth( int depth ) {
530            if( depth > 0 ) {
531                tremolo_depth = depth;
532            }
533        }
534    
535        private void set_tremolo_wave( int wave ) {
536            if( wave < 0 || wave > 7 ) {
537                wave = 0;
538            }
539            tremolo_wave = wave;
540        }
541    
542        private void vibrato() {
543            int vibrato_phase;
544            vibrato_phase = vibrato_tick * vibrato_speed;
545            vibrato_add += waveform( vibrato_phase, vibrato_wave ) * vibrato_depth >> 5;
546        }
547    
548        private void fine_vibrato() {
549            int vibrato_phase;
550            vibrato_phase = vibrato_tick * vibrato_speed;
551            vibrato_add += waveform( vibrato_phase, vibrato_wave ) * vibrato_depth >> 7;
552        }
553    
554        private void tremolo() {
555            int tremolo_phase;
556            tremolo_phase = tremolo_tick * tremolo_speed;
557            tremolo_add += waveform( tremolo_phase, tremolo_wave ) * tremolo_depth >> 6;
558        }
559    
560        private void set_portamento_param( int param ) {
561            if( param != 0 ) {
562                portamento_param = param;
563            }
564        }
565    
566        private void tone_portamento() {
567            int new_period;
568            if( porta_period < period ) {
569                new_period = period - ( portamento_param << 2 );
570                if( new_period < porta_period ) {
571                    new_period = porta_period;
572                }
573                set_period( new_period );
574            }
575            if( porta_period > period ) {
576                new_period = period + ( portamento_param << 2 );
577                if( new_period > porta_period ) {
578                    new_period = porta_period;
579                }
580                set_period( new_period );
581            }
582        }
583        
584        private void portamento_up() {
585            if( ( portamento_param & 0xF0 ) == 0xE0 ) {
586                /* Extra-fine porta.*/
587                if( effect_tick == 0 ) {
588                    set_period( period - ( portamento_param & 0x0F ) );
589                }   
590            } else if( ( portamento_param & 0xF0 ) == 0xF0 ) {
591                /* Fine porta.*/
592                if( effect_tick == 0 ) {
593                    set_period( period - ( ( portamento_param & 0x0F ) << 2 ) );
594                }
595            } else {
596                /* Normal porta.*/
597                if( effect_tick > 0 ) {
598                    set_period( period - ( portamento_param << 2 ) );
599                }
600            }
601        }
602        
603        private void portamento_down() {
604            if( ( portamento_param & 0xF0 ) == 0xE0 ) {
605                /* Extra-fine porta.*/
606                if( effect_tick == 0 ) {
607                    set_period( period + ( portamento_param & 0x0F ) );
608                }   
609            } else if( ( portamento_param & 0xF0 ) == 0xF0 ) {
610                /* Fine porta.*/
611                if( effect_tick == 0 ) {
612                    set_period( period + ( ( portamento_param & 0x0F ) << 2 ) );
613                }
614            } else {
615                /* Normal porta.*/
616                if( effect_tick > 0 ) {
617                    set_period( period + ( portamento_param << 2 ) );
618                }
619            }
620        }
621    
622        private void set_period( int p ) {
623            if( p < 32 ) {
624                p = 32;
625            }
626            if( p > 32768 ) {
627                p = 32768;
628            }
629            period = p;
630        }
631    
632        private void set_global_volume( int vol ) {
633            if( vol < 0 ) {
634                vol = 0;
635            }
636            if( vol > 64 ) {
637                vol = 64;
638            }
639            global_volume[ 0 ] = vol;
640        }
641    
642        private void set_volume_slide_param( int param ) {
643            if( param != 0 ) {
644                volume_slide_param = param;
645            }
646        }
647    
648        private void global_volume_slide() {
649            int up, down;
650            up = ( volume_slide_param & 0xF0 ) >> 4;
651            down = volume_slide_param & 0x0F;
652            set_global_volume( global_volume[ 0 ] + up - down );
653        }
654    
655        private void volume_slide() {
656            int up, down;
657            up = ( volume_slide_param & 0xF0 ) >> 4;
658            down = volume_slide_param & 0x0F;
659            if( down == 0x0F && up > 0 ) {
660                /* Fine slide up.*/
661                if( effect_tick == 0 ) {
662                    set_volume( volume + up );
663                }
664            } else if( up == 0x0F && down > 0 ) {
665                /* Fine slide down.*/
666                if( effect_tick == 0 ) {
667                    set_volume( volume - down );
668                }
669            } else {
670                /* Normal slide.*/
671                if( effect_tick > 0 || fast_volume_slides ) {
672                    set_volume( volume + up - down );
673                }
674            }
675        }
676    
677        private void panning_slide() {
678            int left, right;
679            left = ( volume_slide_param & 0xF0 ) >> 4;
680            right = volume_slide_param & 0x0F;
681            set_panning( panning - left + right );
682        }
683    
684        private void set_retrig_param( int param ) {
685            if( param != 0 ) {
686                retrig_param = param;
687            }
688        }
689    
690        private void tremor() {
691            int on_ticks, cycle_length, cycle_index;
692            on_ticks = ( ( retrig_param & 0xF0 ) >> 4 ) + 1;
693            cycle_length = on_ticks + ( retrig_param & 0x0F ) + 1;
694            cycle_index = trigger_tick % cycle_length;
695            if( cycle_index >= on_ticks ) {
696                tremolo_add = -64;
697            }
698        }
699    
700        private void retrig_volume_slide() {
701            int retrig_volume, retrig_tick;
702            retrig_volume = ( retrig_param & 0xF0 ) >> 4;
703            retrig_tick = retrig_param & 0x0F;
704            if( retrig_tick > 0 && ( trigger_tick % retrig_tick ) == 0 ) {
705                set_sample_index( 0 );
706                switch( retrig_volume ) {
707                    case 0x01:
708                        set_volume( volume - 1 );
709                        break;
710                    case 0x02:
711                        set_volume( volume - 2 );
712                        break;
713                    case 0x03:
714                        set_volume( volume - 4 );
715                        break;
716                    case 0x04:
717                        set_volume( volume - 8 );
718                        break;
719                    case 0x05:
720                        set_volume( volume - 16 );
721                        break;
722                    case 0x06:
723                        set_volume( volume - volume / 3 );
724                        break;
725                    case 0x07:
726                        set_volume( volume / 2 );
727                        break;
728                    case 0x09:
729                        set_volume( volume + 1 );
730                        break;
731                    case 0x0A:
732                        set_volume( volume + 2 );
733                        break;
734                    case 0x0B:
735                        set_volume( volume + 4 );
736                        break;
737                    case 0x0C:
738                        set_volume( volume + 8 );
739                        break;
740                    case 0x0D:
741                        set_volume( volume + 16 );
742                        break;
743                    case 0x0E:
744                        set_volume( volume + volume / 2 );
745                        break;
746                    case 0x0F:
747                        set_volume( volume * 2 );
748                        break;
749                }
750            }
751        }
752    
753        private void set_sample_index( int index ) {
754            if( index < 0 ) {
755                index = 0;
756            }
757            sample_idx = index;
758            sample_frac = 0;
759        }
760    
761        private void set_envelope_tick( int tick ) {
762            volume_envelope_tick = tick;
763            panning_envelope_tick = tick;
764        }
765    
766        private void trigger( int key, int instrument_idx, int volume_column, int effect ) {
767            if( instrument_idx > 0 ) {
768                instrument = module.get_instrument( instrument_idx );
769                sample = instrument.get_sample_from_key( key );
770                set_volume( sample.volume );
771                if( sample.set_panning ) {
772                    set_panning( sample.panning );
773                }
774                set_envelope_tick( 0 );
775                fade_out_volume = 32768;
776                key_on = true;
777            }
778            if( key > 0 ) {
779                if( key < 97 ) {
780                    porta_period = key_to_period( key );
781                    if( effect != 0x03 && effect != 0x05 ) {
782                        if( ( volume_column & 0xF0 ) != 0xF0 ) {
783                            /* Not portamento.*/
784                            trigger_tick = 0;
785                            if( vibrato_wave < 4 ) {
786                                vibrato_tick = 0;
787                            }
788                            if( tremolo_wave < 4 ) {
789                                tremolo_tick = 0;
790                            }
791                            set_period( porta_period );
792                            set_sample_index( 0 );
793                        }
794                    }
795                } else {
796                    /* Key off.*/
797                    key_on = false;
798                }
799            }
800        }
801    
802        private void update_envelopes() {
803            Envelope envelope;
804            if( instrument.volume_envelope_active ) {
805                if( !key_on ) {
806                    fade_out_volume -= instrument.volume_fade_out & 0xFFFF;
807                    if( fade_out_volume < 0 ) {
808                        fade_out_volume = 0;
809                    }
810                }
811                envelope = instrument.get_volume_envelope();
812                volume_envelope_tick = envelope.next_tick( volume_envelope_tick, key_on );
813            }
814            if( instrument.panning_envelope_active ) {
815                envelope = instrument.get_panning_envelope();
816                panning_envelope_tick = envelope.next_tick( panning_envelope_tick, key_on );
817            }
818        }
819    
820        private void auto_vibrato() {
821            int sweep, depth, rate;
822            sweep = instrument.vibrato_sweep & 0xFF;
823            depth = instrument.vibrato_depth & 0x0F;
824            rate = instrument.vibrato_rate & 0x3F;
825            if( trigger_tick < sweep ) {
826                depth = depth * trigger_tick / sweep;
827            }
828            vibrato_add += waveform( trigger_tick * rate, 0 ) * depth >> 9;
829        }
830    
831        private int waveform( int phase, int wform ) {
832            int amplitude;
833            amplitude = 0;
834            switch( wform & 0x3 ) {
835                case 0:
836                    /* Sine. */
837                    if( ( phase & 0x20 ) == 0 ) {
838                        amplitude =  sine_table[ phase & 0x1F ];
839                    } else {
840                        amplitude = -sine_table[ phase & 0x1F ];
841                    }
842                    break;
843                case 1:
844                    /* Saw. */
845                    if( ( phase & 0x20 ) == 0 ) {
846                        amplitude =   ( phase & 0x1F ) << 3;
847                    } else {
848                        amplitude = ( ( phase & 0x1F ) << 3 ) - 255;
849                    }
850                    break;
851                case 2:
852                    /* Square. */
853                    if( ( phase & 0x20 ) == 0 ) {
854                        amplitude =  255;
855                    } else {
856                        amplitude = -255;
857                    }
858                    break;
859                case 3:
860                    /* Random. */
861                    amplitude = ( random_seed >> 15 ) - 255;
862                    random_seed = ( random_seed * 65 + 17 ) & 0xFFFFFF;
863                    break;
864            }
865            return amplitude;
866        }
867    
868        private int key_to_period( int key ) {
869            int octave, log_2_period, period_out;
870            octave = ( key << IBXM.FP_SHIFT ) / 12 + sample.transpose;
871            if( linear_periods ) {
872                period_out = 7744 - ( octave * 768 >> IBXM.FP_SHIFT );
873            } else {
874                log_2_period = LOG_2_29024 - octave;
875                period_out = LogTable.raise_2( log_2_period );
876                period_out = period_out >> ( IBXM.FP_SHIFT - 1 );
877                period_out = ( period_out >> 1 ) + ( period_out & 1 );
878            }
879            return period_out;
880        }
881    
882        private void calculate_amplitude() {
883            int envelope_volume, tremolo_volume, amplitude;
884            int envelope_panning, mixer_panning, panning_range;
885            Envelope envelope;
886            envelope_volume = 0;
887            if( instrument.volume_envelope_active ) {
888                envelope = instrument.get_volume_envelope();
889                envelope_volume = envelope.calculate_ampl( volume_envelope_tick );
890            } else {
891                if( key_on ) {
892                    envelope_volume = 64;
893                }
894            }
895            tremolo_volume = volume + tremolo_add;
896            if( tremolo_volume < 0 ) {
897                tremolo_volume = 0;
898            }
899            if( tremolo_volume > 64 ) {
900                tremolo_volume = 64;
901            }
902            amplitude = tremolo_volume << IBXM.FP_SHIFT - 6;
903            amplitude = amplitude * envelope_volume >> 6;
904            amplitude = amplitude * fade_out_volume >> 15;
905            amplitude = amplitude * global_volume[ 0 ] >> 6;
906            amplitude = amplitude * module.channel_gain >> IBXM.FP_SHIFT;
907            silent = sample.has_finished( sample_idx );
908            if( amplitude <= 0 ) {
909                silent = true;
910            } else {
911                envelope_panning = 32;
912                if( instrument.panning_envelope_active ) {
913                    envelope = instrument.get_panning_envelope();
914                    envelope_panning = envelope.calculate_ampl( panning_envelope_tick );
915                }
916                mixer_panning = ( panning & 0xFF ) << IBXM.FP_SHIFT - 8;
917                panning_range = IBXM.FP_ONE - mixer_panning;
918                if( panning_range > mixer_panning ) {
919                    panning_range = mixer_panning;
920                }
921                mixer_panning = mixer_panning + ( panning_range * ( envelope_panning - 32 ) >> 5 );
922                left_gain = amplitude * ( IBXM.FP_ONE - mixer_panning ) >> IBXM.FP_SHIFT;
923                right_gain = amplitude * mixer_panning >> IBXM.FP_SHIFT;
924            }
925        }
926    
927        private void calculate_frequency() {
928            int vibrato_period, log_2_freq; 
929            vibrato_period = period + vibrato_add;
930            if( vibrato_period < 32 ) {
931                vibrato_period = 32;
932            }
933            if( vibrato_period > 32768 ) {
934                vibrato_period = 32768;
935            }
936            if( linear_periods ) {
937                log_2_freq = LOG_2_8363 + ( 4608 - vibrato_period << IBXM.FP_SHIFT ) / 768;
938            } else {
939                log_2_freq = module.pal ? LOG_2_8287 : LOG_2_8363;
940                log_2_freq = log_2_freq + LOG_2_1712 - LogTable.log_2( vibrato_period );
941            }
942            log_2_freq += ( key_add << IBXM.FP_SHIFT ) / 12;
943            step = LogTable.raise_2( log_2_freq - log_2_sampling_rate );
944        }
945    }
946