It is currently Mon Oct 20, 2014 5:46 pm

All times are UTC [ DST ]




Post new topic Reply to topic  [ 11 posts ] 
Author Message
 Post subject: Making sounds from 6502?
PostPosted: Sat Oct 18, 2008 6:09 pm 
Offline
 Profile

Joined: Tue Oct 14, 2008 12:43 am
Posts: 18
Is there some 6502 code to make some sounds using the different channels ?

I'm quite tempted to try and have a go at writing a tracker... but first just need to be able to make some noises using the seperate channels...

(Is there a doc somewhere with some info on the sound capabilities too?)


Top
 
PostPosted: Sun Oct 19, 2008 12:53 am 
Offline
User avatar
 WWW  Profile

Joined: Wed Jan 09, 2008 10:23 am
Posts: 359
Location: Glasgow, Scotland
Hi Stuart,

I've got a pile of notes somewhere. If I get a chance I will dig them out.

Failing that you could have a look at the Advanced User Guide for the BBC which is available to download from the internet.

Kind regards,

Francis.


Top
 
PostPosted: Sun Oct 19, 2008 8:31 pm 
Offline
User avatar
 WWW  Profile

Joined: Thu Apr 03, 2008 2:49 pm
Posts: 277
Location: Antarctica
Tom Walker's your man here, he's pretty good on the sound stuff. He's helping me out on my little pet project though so don't nick him! :)


Top
 
PostPosted: Sun Oct 19, 2008 8:47 pm 
Offline
User avatar
 Profile

Joined: Mon Jan 07, 2008 7:02 pm
Posts: 273
If you avoid using the OS routines (which I suggest you do), the following code outputs to the sound chip :

Code:
        ldy #&ff
        sty &fe43
        sta &fe4f
        iny
        sty &fe40
        ldy #2
.sndwait dey
        bne sndwait
        ldy #8
        sty &fe40
        rts


You would probably want to disable interrupts during this routine.

http://www.smspower.org/dev/docs/sound/SN76489-20030421.txt is a good document on the sound chip.


Top
 
PostPosted: Mon Oct 20, 2008 9:51 am 
Offline
User avatar
 WWW  Profile

Joined: Wed Jan 09, 2008 10:23 am
Posts: 359
Location: Glasgow, Scotland
Hi Tom,

Just a little side question regarding sound output.

Is there any method that you can recommend to playback a sampled sound at a given frequency? E.g., if I want a frequency of say 8000Hz, how can I playback a sample at that rate?

Kind regards,

Francis.


Top
 
PostPosted: Mon Oct 20, 2008 10:39 am 
Offline
User avatar
 WWW  Profile

Joined: Thu Jan 10, 2008 7:45 pm
Posts: 472
Location: Treddle's Wharf, Chigley
This article may be of interest:

http://bbc.nvg.org/doc/Speech.html


Top
 
PostPosted: Mon Oct 20, 2008 11:23 am 
Offline
User avatar
 Profile

Joined: Mon Jan 07, 2008 7:02 pm
Posts: 273
FrancisL wrote:
Hi Tom,

Just a little side question regarding sound output.

Is there any method that you can recommend to playback a sampled sound at a given frequency? E.g., if I want a frequency of say 8000Hz, how can I playback a sample at that rate?


Use timer interrupts. You want timer 1 on either VIA (probably User), set it to your sample frequency, and output new samples each interrupt. I've got some sample playback code somewhere if you want it.


Top
 
PostPosted: Mon Oct 20, 2008 12:00 pm 
Offline
User avatar
 WWW  Profile

Joined: Wed Jan 09, 2008 10:23 am
Posts: 359
Location: Glasgow, Scotland
DaveJ wrote:
This article may be of interest:

http://bbc.nvg.org/doc/Speech.html

I already have a copy of that article, but thanks anyway.

My main problem is that I am not clear on how to equate the playback speed in the program to the frequency of the waveform.

Kind regards,

Francis.


Top
 
PostPosted: Mon Oct 20, 2008 12:01 pm 
Offline
User avatar
 WWW  Profile

Joined: Wed Jan 09, 2008 10:23 am
Posts: 359
Location: Glasgow, Scotland
TomW wrote:
Use timer interrupts. You want timer 1 on either VIA (probably User), set it to your sample frequency, and output new samples each interrupt. I've got some sample playback code somewhere if you want it.

That could be useful to have a look at your code.

Kind regards,

Francis


Top
 
PostPosted: Mon Oct 20, 2008 7:52 pm 
Offline
User avatar
 Profile

Joined: Mon Jan 07, 2008 7:02 pm
Posts: 273
Okay, you first want some code to set up the timer (all C64-style, not too hard to change):

Code:
setuptimer sei

   lda #$7f  ;Disable all VIA ints
   sta $fe4e
   sta $fe6e

   lda #$c0  ;Enable timer 1
   sta $fe4e

   lda $fe4b
   ora #$40  ;Set bit 6 for free running timer 1
   sta $fe4b

   lda #150  ;1000000/152=6578hz
   sta $fe44 ;change these lines to change frequency!
   lda #0
   sta $fe45

   lda $204        ;set our IRQ handler
   sta OLDIRQ1V
   lda $205
   sta OLDIRQ1V+1
   lda #<irq1v
   sta $204
   lda #>irq1v
   sta $205

   cli

   rts


then the interrupt handler :

Code:
irq1v   tya
   pha
           txa
           pha

   lda #$40 ;Clear interrupt
   sta $fe4d

           lda SAMPLE ;(insert your own code here to load 4-bit sample)
           ora #VOLCONST ;(&90,&B0,&D0, or &F0 depending on what channel)
           jsr soundwrite

           pla
           tax
           pla
   tay
   lda $FC
   rti


That's the basics of it. You can modify the routines as you like, eg change sample frequency, write more than one volume register at a time to boost volume/quality, optimise the interrupt handler etc etc.


Top
 
PostPosted: Wed Jan 21, 2009 11:49 pm 
Offline
User avatar
 Profile

Joined: Mon Jan 07, 2008 7:02 pm
Posts: 273
Francis -

Don't know if you've got sample playback working yet, but I've disassembled a beeb sample player that could be useful. It's from The Yorkshire Boys' Retribution demo demo, it's got all sorts of problems (only 4-bit, iffy timing, all interrupts disabled) but it works, it's standalone, and I think it's simple enough to post here. I've attempted to comment it where possible.

Code:
$00001C00: sei
$00001C01: lda #$FF   ;set VIA DDR to output
$00001C03: sta $FE43
$00001C06: lda #$84   ;set all voices to max frequency
$00001C08: jsr $1C65
$00001C0B: lda #$00
$00001C0D: jsr $1C65
$00001C10: lda #$A4
$00001C12: jsr $1C65
$00001C15: lda #$00
$00001C17: jsr $1C65
$00001C1A: lda #$C4
$00001C1C: jsr $1C65
$00001C1F: lda #$00
$00001C21: jsr $1C65
$00001C24: lda #$00
$00001C26: sta $70
$00001C28: lda $75     ;set to $1D by loader, ie sample start $1D00
$00001C2A: sta $71
$00001C2C: ldy #$00
$00001C2E: lda ($70),y
$00001C30: and #$0F
$00001C32: jsr $1C79
$00001C35: ldy #$04
$00001C37: dey
$00001C38: bne $1C37
$00001C3A: lda ($70),y
$00001C3C: and #$F0
$00001C3E: lsr a
$00001C3F: lsr a
$00001C40: lsr a
$00001C41: lsr a
$00001C42: jsr $1C79
$00001C45: inc $70
$00001C47: bne $1C2C
$00001C49: inc $71
$00001C4B: lda $71
$00001C4D: cmp $76     ;set to $76, ie sample end at $75FF
$00001C4F: beq $1C00
$00001C51: lda #$81    ;check if key is pressed
$00001C53: ldx #$9D    ;this actually causes a delay
$00001C55: ldy #$80    ;resulting in a minor bump every 256 samples
$00001C57: jsr $FFF4
$00001C5A: cpx #$FF
$00001C5C: bne $1C2C
$00001C5E: lda #$0F    ;set all voices to no volume - not strictly necessary
$00001C60: jsr $1C79
$00001C63: cli
$00001C64: rts
$00001C65: sta $FE4F   ;write data to soundchip
$00001C68: ldy #$00
$00001C6A: sty $FE40
$00001C6D: nop         ;in a proper player, you'd do something useful with this time
$00001C6E: nop         ;instead of just nop-ing
$00001C6F: nop
$00001C70: nop
$00001C71: nop
$00001C72: nop
$00001C73: ldy #$08
$00001C75: sty $FE40
$00001C78: rts
$00001C79: tay
$00001C7A: lda $1C92,y ;grab adjusted volume from lookup table
$00001C7D: ora #$90    ;write to all 3 volume registers
$00001C7F: jsr $1C65
$00001C82: ora #$20
$00001C84: jsr $1C65
$00001C87: eor #$60
$00001C89: jsr $1C65
$00001C8C: ldy $74     ;set to 35 by loader
$00001C8E: dey         ;horrible delay loop
$00001C8F: bne $008E
$00001C91: rts
   ;lookup table to convert linear 4-bit sample to log 4-bit sample
$00001C92: .DB $00,$00,$01,$01,$01,$02,$02,$03,$04,$05,$06,$07,$08,$09,$0C,$0F


Top
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 11 posts ] 

All times are UTC [ DST ]


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron