Hacker News new | ask | show | jobs
by amiga386 31 days ago
Awesome!

As an aside, the only code I know that uses Paula's attached mode (where one channel can modulate the volume or pitch of another) is the sound effect used in X-Copy.

It sounds like this: https://youtu.be/2OG2tPx5gnU?t=22

and the code that generates that sound is this:

    PLAY_SAMPLE ; a6=_custom, d0=zero for high-pitch sound, nonzero for low-pitch sound
            move.w  #$F00,d1        ; high pitch: period=$d00-$f00 if d0 == 0
            tst.b   d0
            beq.s   .high
            move.w  #$7700,d1       ; low pitch: period=$7500-$7700 if d0 != 0
    .high   lea     MODULO,a0
            move.w  #$200-1,d0
    .down   move.w  d1,(a0)+
            subq.w  #1,d1
            dbra    d0,.down
            move.w  #$200-1,d0
    .up     addq.w  #1,d1
            move.w  d1,(a0)+
            dbra    d0,.up
            ; set up channel 2; whatever words this plays will
            ; be written to the period register of channel 3
            move.w  adkconr(a6),-(sp)       ; save ADKCON state for later
            move.w  #ADKF_SETCLR!ADKF_USE2P3,adkcon(a6)
            move.l  #MODULO,aud2+ac_ptr(a6)
            move.w  #$400,aud2+ac_len(a6)
            move.w  #0,aud2+ac_vol(a6)      ; no volume (no actual sound wanted!)
            move.w  #$90,aud2+ac_per(a6)    ; change period every $90 ticks
            lea     SAMPLE,a0               ; set up channel 3 to play a simple square wave
            move.l  #$7f7f8080,(a0)         ; square wave: 127 127 -128 -128 ...
            move.l  a0,aud3+ac_ptr(a6)
            move.w  #2,aud3+ac_len(a6)
            move.w  #DMAF_SETCLR!DMAF_AUD2|DMAF_AUD3,dmacon(a6) ; turn on sound DMA
            moveq   #$40,d2                 ; start with volume = 64
    .vol    move.w  d2,aud3+ac_vol(a6)      ; write channel 3 volume
            move.w  #$600-1,d1              ; wait a bit
    1$      move.b  vhposr(a6),d0
    2$      cmp.b   vhposr(a6),d0
            beq.s   2$
            dbra    d1,1$
            subq    #8,d2                   ; repeat to fade
            bpl.s   .vol
            moveq   #0,d0                   ; stop sound
            move.w  d0,aud2+ac_len(a6)
            move.w  d0,aud3+ac_vol(a6)
            move.w  d0,aud3+ac_len(a6)
            move.w  #DMAF_AUD2!DMAF_AUD3,dmacon(a6)
            move.w  (sp)+,d0                ; restore ADKCON
            btst    #ADKB_USE2P3,d0
            bne.s   .keepon
            move.w  #ADKF_USE2P3,adkcon(a6)
    .keepon rts
            section 2,bss,chip
    SAMPLE  ds.w    2
    MODULO  ds.w    $400