wallaby Posted October 27, 2016 Share Posted October 27, 2016 Are there any examples of driving the DPC+ sound chip from ASM? I think the TIA was designed for sound effects mainly and its dashing my dreams of nice chiptunes for my game. I've been searching around for a bit, but I haven't found any sound examples at all. Another 3 voices would be a lot of fun to utilize. Quote Link to comment Share on other sites More sharing options...
+SpiceWare Posted October 27, 2016 Share Posted October 27, 2016 http://atariage.com/forums/topic/163495-harmony-dpc-programming Quote Link to comment Share on other sites More sharing options...
wallaby Posted October 28, 2016 Author Share Posted October 28, 2016 http://atariage.com/...dpc-programming Yes, this demonstrates the sound, and is a great resource, but it is extremely difficult excise from the demo code. I don't have an ARM development environment so I can't compile the source and tinker with it there. Plus, some ASM commands seem incompatible with my version DASM and/or I lack the understanding on how to port it to an empty DPC+ project. All I need is a demo of playing a single sound that I can duplicate for the other voices. This has a visualizer, and what looks like a tracker (which is cool, but beyond my current ability to re-use), and important data that is spread around the source. The variables at the top and wave data at the bottom (also very cool). It's very tantalizing, but I can't get past weird compiler errors I'm getting and at a fundamental level I don't know what it is doing most of the time. Assuming I already have a graphics loop, what is the smallest loop I can use to just play sounds? (No visualization) Quote Link to comment Share on other sites More sharing options...
+SpiceWare Posted October 28, 2016 Share Posted October 28, 2016 ARM code? There's no ARM source code. There is an ARM file, which contains the DPC+ driver. The driver is precompiled, you don't build it yourself. Each demo is in its own 4K bank. The music demo is in "bank 1", starting at line 733. The "visualizer" is just a super simple kernel: KERNEL1: sta WSYNC lda AMPLITUDE sta AUDV0 and #$0f tax lda ShowAmplitude0,x sta GRP0 lda ShowAmplitude1,x sta GRP1 dey bne KERNEL1 All it does is take the value for AMPLITUDE and display it graphically via the players. Changing it to this will remove the visualization: KERNEL1: sta WSYNC lda AMPLITUDE sta AUDV0 dey bne KERNEL1 The main thing with DPC+ music is you have to LOAD the value from AMPLITUDE and STORE it in AUDV0 once per scanline. Using A is not required, you can use LDX / STX or LDY / STY as needed. While the demo is a bit dated*, you should be able to experiment with the code in Bank 1 to get an understanding on how DPC+ music works. Posting "weird compiler errors" isn't very useful - nobody can help if you don't post the errors. Due note that my time is very limited for the next couple of weeks, so hopefully others can step up to help you resolve the problems. Also be sure to read DPCplus.h.* nowadays we include the DPC+ Driver at compile time rather than manually merging it after running dasm. Quote Link to comment Share on other sites More sharing options...
wallaby Posted October 29, 2016 Author Share Posted October 29, 2016 (edited) I agree what you're saying, but I found it difficult to isolate just the music code. When I attempt to compile the .asm with DASM, the errors I get are: C:\Atari\DPCPlus>c:\atari\dasm dpcplus.asm dpcplus.asm (6547): error: Unknown Mnemonic '35,'. dpcplus.asm (6550): error: Unknown Mnemonic '$CA,'. dpcplus.asm (6550): error: Unknown Mnemonic '$CA,'. dpcplus.asm (6550): error: Unknown Mnemonic '$CA,'. dpcplus.asm (6550): error: Unknown Mnemonic '$CA,'. dpcplus.asm (6550): error: Unknown Mnemonic '$CA,'. dpcplus.asm (6554): error: Unknown Mnemonic '$F8,'. dpcplus.asm (6554): error: Unknown Mnemonic '$F8,'. dpcplus.asm (6554): error: Unknown Mnemonic '$F8,'. dpcplus.asm (6554): error: Unknown Mnemonic '$F8,'. dpcplus.asm (6554): error: Unknown Mnemonic '$F8,'. dpcplus.asm (6554): error: Unknown Mnemonic '$F8,'. dpcplus.asm (6554): error: Unknown Mnemonic '$F8,'. dpcplus.asm (6554): error: Unknown Mnemonic '$F8,'. dpcplus.asm (6554): error: Unknown Mnemonic '$F8,'. dpcplus.asm (6554): error: Unknown Mnemonic '$F8,'. dpcplus.asm (6554): error: Unknown Mnemonic '$F8,'. dpcplus.asm (6554): error: Unknown Mnemonic '$F8,'. dpcplus.asm (6554): error: Unknown Mnemonic '$F8,'. dpcplus.asm (6554): error: Unknown Mnemonic '$F8,'. dpcplus.asm (6554): error: Unknown Mnemonic '$F8,'. dpcplus.asm (6554): error: Unknown Mnemonic '$F8,'. dpcplus.asm (6558): error: Unknown Mnemonic '$C4'. dpcplus.asm (6558): error: Unknown Mnemonic '$C4'. dpcplus.asm (6558): error: Unknown Mnemonic '$C4'. dpcplus.asm (6558): error: Unknown Mnemonic '$C4'. dpcplus.asm (6558): error: Unknown Mnemonic '$C4'. dpcplus.asm (6558): error: Unknown Mnemonic '$C4'. dpcplus.asm (6558): error: Unknown Mnemonic '$C4'. dpcplus.asm (6558): error: Unknown Mnemonic '$C4'. dpcplus.asm (6558): error: Unknown Mnemonic '$C4'. dpcplus.asm (6558): error: Unknown Mnemonic '$C4'. dpcplus.asm (6558): error: Unknown Mnemonic '$C4'. dpcplus.asm (6558): error: Unknown Mnemonic '$C4'. dpcplus.asm (6558): error: Unknown Mnemonic '$C4'. dpcplus.asm (6558): error: Unknown Mnemonic '$C4'. dpcplus.asm (6558): error: Unknown Mnemonic '$C4'. dpcplus.asm (6558): error: Unknown Mnemonic '$C4'. dpcplus.asm (6558): error: Unknown Mnemonic '$C4'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6563): error: Unknown Mnemonic '$80,'. dpcplus.asm (6568): error: Unknown Mnemonic '$8A,'. dpcplus.asm (6568): error: Unknown Mnemonic '$8A,'. dpcplus.asm (6568): error: Unknown Mnemonic '$8A,'. dpcplus.asm (6568): error: Unknown Mnemonic '$8A,'. dpcplus.asm (6568): error: Unknown Mnemonic '$8A,'. Unrecoverable error(s) in pass, aborting assembly! Complete. But that's just the tip of the iceberg. So what I thought the best thing to do was isolate the code and slowly copy-paste it into a known working compile until it stops working. But there are some syntax that seem incompatible. I'll try to remove just the sound making part of this again to find out exactly what, if you like. That's the main reason I asked for the most atomic example. Like the "hello world" of DPC+ sound. I'll give it another shot. Edited October 29, 2016 by wallaby Quote Link to comment Share on other sites More sharing options...
wallaby Posted October 29, 2016 Author Share Posted October 29, 2016 sta AUDV0 lda (MPTR2),Y Gets the error "Value in 'lda (MPTR2),Y' must be <$100." Same error for all of the MPTRx loads. I guess it's saying the value is too high. If I comment it out, it compiles. But there is no sound or anything. Quote Link to comment Share on other sites More sharing options...
wallaby Posted October 29, 2016 Author Share Posted October 29, 2016 ShowAmplitude0: .byte zz________ .byte zzX_______ .byte zzXX______ .byte zzXXX_____ .byte zzXXXX____ .byte zzXXXXX___ .byte zzXXXXXX__ .byte zzXXXXXXX_ .byte zzXXXXXXXX ds 8, zzXXXXXXXX ShowAmplitude1: ds 8, zz________ .byte zz________ .byte zzX_______ .byte zzXX______ .byte zzXXX_____ .byte zzXXXX____ .byte zzXXXXX___ .byte zzXXXXXX__ .byte zzXXXXXXX_ .byte zzXXXXXXXX ALIGN 256 MusicData0: ; Bar 0 DC.B C4 DC.B 0 DC.B 0 DC.B 0 DC.B E4 DC.B 0 DC.B 0 DC.B 0 DC.B G4 DC.B 0 DC.B 0 DC.B 0 The showamplitude data won't compile. (A different type of byte definition syntax?) The music data compiles but crashes the game. Even if I just put DC.B C4 on a line on its own, the game crashes. What is DC.B? A special kind of datatype? It looks like C4, G4, E4 are types of notes and not hex? I can get sound coming out, but it doesn't sound nice and it's only possible if I set NOTE0 to #3. But it just sounds like the normal Atari TIA. Quote Link to comment Share on other sites More sharing options...
Thomas Jentzsch Posted October 29, 2016 Share Posted October 29, 2016 I suppose you are using Windows (like me), because I get the same errors. Then try this litte program, which converts the line feeds from Unix to Windows format. From command line: todos.exe *.asm todos.zip Quote Link to comment Share on other sites More sharing options...
wallaby Posted October 29, 2016 Author Share Posted October 29, 2016 I suppose you are using Windows (like me), because I get the same errors. Yes! That was it. Thank you for that. So now it compiles, but it crashes Stella. I'm guessing because DPC+ has changed since it was written? I wonder if those other errors were the result of copying Linux LFs into my code. Back to try again. Quote Link to comment Share on other sites More sharing options...
wallaby Posted October 29, 2016 Author Share Posted October 29, 2016 lda #44 STA NOTE0 STA NOTE1 STA NOTE2 lda #SINE_WAVE sta WAVEFORM0 sta WAVEFORM1 sta WAVEFORM2 lda AMPLITUDE sta AUDV0 All this does is generate a crackling sound. #44 is the value of the note C4. This is running once per drawscreen. Anything obvious I'm doing wrong? Quote Link to comment Share on other sites More sharing options...
iesposta Posted October 29, 2016 Share Posted October 29, 2016 Every scan line or every other scanline, including "blank". Quote Link to comment Share on other sites More sharing options...
wallaby Posted October 29, 2016 Author Share Posted October 29, 2016 Okay, I understand. I'm using 50% bB and %50 ASM for my game and I incorrectly assumed it was supported in the bB DPC+ kernel. I think I'll have to pass on it for now. There isn't enough space to add it to bB's DPC+ bank. It's strange though, the waveforms are in the kernel. If I were to add LDA AMPLITUDE and STA AUDV0 to each blank, I think it would throw the timing off. Quote Link to comment Share on other sites More sharing options...
+SpiceWare Posted October 29, 2016 Share Posted October 29, 2016 I'm on a Mac, which is Unix based. End of line is just a Line Feed while Windows wants Carriage Return + Line Feed. Without the Carriage Return the programs on Windows think all the text is on a single line. You can use the tool Thomas posted, or just open the files in WordPad and save them. Run all the source files through the process, not just the asm file: DPC_frequencies.h DPCplus.asm DPCplus.h graphics.h macro.h VCS.h Quote Link to comment Share on other sites More sharing options...
+SpiceWare Posted October 29, 2016 Share Posted October 29, 2016 sta AUDV0 lda (MPTR2),Y Whenever you run into something like that try searching the source for the variable. You'll find MPTR2 defined on line 218. MPTR2 is a RAM variable, so it's not defined as part of the ROM in bank 1 but rather with all the other RAM variables beginning at line 194. The variables are broken out by demo, the music ones start on line 210. ShowAmplitude0: .byte zz________ .byte zzX_______ .byte zzXX______ .byte zzXXX_____ .byte zzXXXX____ .byte zzXXXXX___ .byte zzXXXXXX__ .byte zzXXXXXXX_ .byte zzXXXXXXXX ds 8, zzXXXXXXXX ShowAmplitude1: ds 8, zz________ .byte zz________ .byte zzX_______ .byte zzXX______ .byte zzXXX_____ .byte zzXXXX____ .byte zzXXXXX___ .byte zzXXXXXX__ .byte zzXXXXXXX_ .byte zzXXXXXXXX The showamplitude data won't compile. (A different type of byte definition syntax?) The music data compiles but crashes the game. Even if I just put DC.B C4 on a line on its own, the game crashes. What is DC.B? A special kind of datatype? It looks like C4, G4, E4 are types of notes and not hex? I can get sound coming out, but it doesn't sound nice and it's only possible if I set NOTE0 to #3. But it just sounds like the normal Atari TIA. The values like zzXXXXXXXX are defined in graphics.h, just need to run it through your end-of-line converter. Likewise C4 and such are in DPC_frequencies.h which probably also needs to be run through the converter. DC.B is an alternate way of defining a byte value. Most likely they weren't happy if DPC_frequencies.h had the wrong end-of-line for Windows. Yes! That was it. Thank you for that. So now it compiles, but it crashes Stella. I'm guessing because DPC+ has changed since it was written? I wonder if those other errors were the result of copying Linux LFs into my code. Back to try again. I just downloaded the source and compiled it. It ran just fine in Stella, so something with your conversion to Windows is the problem. Quote Link to comment Share on other sites More sharing options...
+SpiceWare Posted October 29, 2016 Share Posted October 29, 2016 Okay, I understand. I'm using 50% bB and %50 ASM for my game and I incorrectly assumed it was supported in the bB DPC+ kernel. I think I'll have to pass on it for now. There isn't enough space to add it to bB's DPC+ bank. It's strange though, the waveforms are in the kernel. If I were to add LDA AMPLITUDE and STA AUDV0 to each blank, I think it would throw the timing off. Ah - based on the topic title, and not being in the bB forum, I thought you were doing an assembly only project. If you're trying to use this with bB then you will get very scratchy sound because bB isn't doing the load AMPLITUDE and store AUDV0 that's required on every scanline. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.