SIDcog - The sound of the Commodore 64 ! (Now in the OBEX)

123578

Comments

  • megaionstormmegaionstorm Posts: 178
    edited 2011-08-27 - 09:51:06
    How is it possible to create the dmp-files?
  • AntoineDoinelAntoineDoinel Posts: 309
    edited 2011-08-27 - 10:15:35
    How is it possible to create the dmp-files?

    hi megaionstorm

    try the link to the "SID dumper" app linkws in the very first post of this thread:
    http://forums.parallax.com/showthread.php?118285-SIDcog-The-sound-of-the-Commodore-64-!-(Now-in-the-OBEX)&p=863861&viewfull=1#post863861
  • troxxantroxxan Posts: 4
    edited 2012-04-04 - 17:28:38
    serial sid player download link is dead. your work is awesome btw..
  • kuronekokuroneko Posts: 3,623
    edited 2012-04-04 - 18:09:22
    troxxan wrote: »
    serial sid player download link is dead. your work is awesome btw..
    Try this link http://forums.parallax.com/showthread.php?130658-SIDcog-serial-player.
  • average joeaverage joe Posts: 795
    edited 2012-04-05 - 02:20:42
    Wow, this is amazing. Thanks for such an incredible emulator!
    I FINALLY have had a chance to play with this a bit, and still have some questions. I have not finished fine tuning my hardware, so sd card is still not working. I can't wait to get that going.
    But first, and most important, does anyone have experience with the Midi in object in OBEX. I opened it up, but couldn't find DOC on how the midi stream is output. I see to call event check, but not sure what to do after. It sounds like you other guys have this figured out so any help, hints?

    Also something others have figured out, so I wanted to ask. Running multiple instances of sidcog should be easy. Declare multiple instances of sidcog in OBJ, then access each one just like normal. What I'm wondering is, do I need a pin for EACH INSTANCE?

    Antoine has a great start on what I'd like to get running, but still trying to understand his code. I'm also trying to figure out what I need to change from "SidSynth_02_110718"
    Thank you again Johannes,

    *EDIT*
    I figured out the midi in object... Had to read the htm. *Once again the noob in me strikes!*
  • average joeaverage joe Posts: 795
    edited 2012-04-05 - 06:14:27
    So I have been trying to get midi working properly and it seems as if the OSC is not fully turning off on note off? I hacked in midi note on and off, just in attempts to get this working.
               pfw.clearscreen(0)
               pfw.setChar(0, 0, 0, 0, $0, $FFFF)
               pfw.size(1)      
               pfw.str(string("Starting Sid Midi"))
    
               Midi.Start(26,MidiInMode)
               
                 SID.start(rightPin, leftPin)           'Start the emulated SID chip in one cog 
                 SID.resetRegisters                         'Reset all SID registers
                 SID.setVolume(15)                           'Set volume to max
                   wait.pause1s(1)
                   
                 SID.setWaveform(0, SID#SQUARE)             'Set waveform type on channel1 to square wave
                 SID.setPulseWidth(0, 1928)                 'Set the pulse width on channel1 to 47:53
                 SID.setADSR(0, 2, 5, 9, 6)                 'Set Envelope on channel1
                 SID.setWaveform(1, SID#NOISE)               'Set waveform type on channel2 to noise (drum sound)
                 SID.setADSR(1, 0, 8, 4, 7)                  'Set Envelope on channel2
                 SID.setWaveform(2, SID#SAW)                 'Set waveform type on channel3 to saw wave
                 SID.setADSR(2, 7, 4, 8, 9)                  'Set Envelope on channel3
                                   'Lp    Bp     Hp       
                 SID.setFilterType(true, false, false) 'Enable lowpass filter
    
                                   'Ch1   Ch2    Ch3
                 SID.setFilterMask(true, false, false) 'Enable filter on the "bass channel" (channel1)
    
                 SID.setResonance(0)         'Set the resonance value to max
    
                 repeat b from 0 to 2
                  SID.noteOff(b)
                  
               b := cognew(SidMidi, @stack)
               
               pfw.setChar(120, 80, 0, 0, $0, $FFFF)
               pfw.str(string("Push to stop"))
    
               tswait
               cogstop(b)
               Midi.Stop
               Sid.Stop
    
    PUB SidMidi | Sco,Mco, channel, note, velocity, event  
    
     REPEAT
       event := Midi.evt         
       note := event
       channel := note
       'Velocity := note
    
       event := (event & $FF00_0000) >> 24
       channel := (channel & $00FF_0000) >> 16
       note := (note & $0000_FF00) >> 8
      ' Velocity &= $0000_00FF
       
          if event == 0                                 ' Note on if note > 0   
            SID.noteOn(channel, note2freq(note))        
          elseif event == 1
            SID.noteOff(channel)                    ' Note off if note = 0
    

    *edit*
    After a bit more playing around, I found disabling the filter made this go away. Now the note "glitches" on release. Not sure if this is just the patch or what. My midi interface is giving me slight clicks on notes so I'm going to revise grounding to try to fix this. Not sure if this is part of the problem but I read something about keeping audio pins low numbers? Could someone elaborate on this? I'm currently using P24 and 27 for output. Also I just realized I never set the cutoff for the filter. Could this be it? What would a LPF with a cutoff set to 0 and resonance set to 15 do? Self oscillate and give the current problem? I'll have to play with this a bit later.
  • average joeaverage joe Posts: 795
    edited 2012-04-05 - 14:44:34
    I updated the midi handler a bit, still no CC implementation. I've been having a blast jamming with sidcog, I'll record a demo in a bit. I'm still having problems with the LPF. I have not tested the rest of the filers. I tried setting different cuttoffs and resonances and it still seems to be self-oscillating. Can someone tell me why? What to look for? I'm totally confused and although it's cool without the filters, I really want to get things working.
  • RaymanRayman Posts: 11,276
    edited 2012-04-05 - 16:15:49
    Hey, I didn't realize this was in OBEX now... That's great! I'll definitely be checking it out now.
  • Ahle2Ahle2 Posts: 1,063
    edited 2012-04-06 - 01:21:58
    @average joe
    "do I need a pin for EACH INSTANCE?"
    Yes, unless you mix the samples from each instance and output them using an extra cog.

    After a bit more playing around, I found disabling the filter made this go away. Now the note "glitches" on release. Not sure if this is just the patch or what. My midi interface is giving me slight clicks on notes so I'm going to revise grounding to try to fix this.
    I'm not following you at all, what exactly are the symptoms...

    Not sure if this is part of the problem but I read something about keeping audio pins low numbers?
    Could someone elaborate on this? I'm currently using P24 and 27 for output.
    Even more important is to use a low cog number. Launching SIDcog in cog 7 while all other cores are running sounds very noisy.

    Also I just realized I never set the cutoff for the filter. Could this be it? What would a LPF with a cutoff set to 0 and resonance set to 15 do? Self oscillate and give the current problem? I'll have to play with this a bit later.
    Just like the real SID, SIDcog can't self oscillate. Setting the cutoff freq to 0 and using a LPF will make everything routed through the filter "inaudible" *; Even if resonance is set to 15!
    * Well, just like any LPF it doesn't completely damp all frequencies above the cutoff. But most frequencies components will be "inaudible" two octaves above cutoff.

    I've been having a blast jamming with sidcog, I'll record a demo in a bit.
    Pleas do that! :)

    I'm still having problems with the LPF. I have not tested the rest of the filers. I tried setting different cuttoffs and resonances and it still seems to be self-oscillating.
    Are getting a pure sinus tone? At what frequency?
    As stated above, SIDcog can't self-oscillate so it must be something else. Can you give me a minimalistic code example where you have got this problem.

    Can someone tell me why? What to look for? I'm totally confused and although it's cool without the filters, I really want to get things working.

    Without debugging this myself it's very hard to see the reason for your problems.

    @Rayman
    All my PSG emulators are in the OBEX, so most retro nerds will be able to get their need for square waves satisfied.
    Bute I havn't done any emulators for the Pokey or the 2A03 yet. (Nintendo and Atari nerds... please forgive me)

    /Johannes

  • average joeaverage joe Posts: 795
    edited 2012-04-06 - 01:34:05
    Here's the basic method.
    PUB SidMidi | sco, channel, note, velocity, event, NotesPlayed[3]
               Midi.Start(26,MidiInMode)
               
                 SID.start(rightPin, leftPin)           'Start the emulated SID chip in one cog 
                 
                 SID.resetRegisters                         'Reset all SID registers
                 
                 SID.setVolume(15)                           'Set volume to max
                   'wait.pause1s(1)
                   
                 
                 SID.setWaveform(0, SID#SQUARE)             'Set waveform type on channel1 to square wave
                 
                 SID.setPulseWidth(0, 1928)                 'Set the pulse width on channel1 to 47:53
                 SID.setADSR(0, 2, 9, 5, 4)    'Set Envelope on channel1
                 
                 SID.setWaveform(1, SID#NOISE)               'Set waveform type on channel2 to noise (drum sound)
                 SID.setADSR(1, 0, 8, 4, 7)                  'Set Envelope on channel2
                 SID.setWaveform(2, SID#SAW)                 'Set waveform type on channel3 to saw wave
                 SID.setADSR(2, 7, 4, 8, 9)                  'Set Envelope on channel3
                                   'Lp    Bp     Hp       
                 'SID.setFilterType(true, false, false) 'Enable lowpass filter
    
                                   'Ch1   Ch2    Ch3
                 'SID.setFilterMask(true, false, false) 'Enable filter on the "bass channel" (channel1)
    
                 'SID.setResonance(15)         'Set the resonance value to max
                 'xSID.setCutoff(548)
                 'deadend
                 repeat sco from 0 to 2
                  SID.noteOff(sco)
          
    
     REPEAT
       event := Midi.evt         
       note := event
       channel := note
       'Velocity := note
    
       event := (event & $FF00_0000) >> 24
       channel := (channel & $00FF_0000) >> 16
       note := (note & $0000_FF00) >> 8
      ' Velocity &= $0000_00FF
       
          if event == 1
           if notesPlayed[channel] < 2
             SID.noteOff(channel)
           notesPlayed[channel]--
    
          elseif event == 0                           ' Note on if note > 0   
            SID.noteOn(channel, note2freq(note))
               notesPlayed[channel]++   
    
    It is started when a press on the touchscreen is detected in the right hitbox like so.
          elseif tmpx > 550
             if  tmpy > 2800
             
               pfw.clearscreen(0)
               pfw.setChar(0, 0, 0, 0, $0, $FFFF)
               pfw.size(1)      
               pfw.str(string("Starting Sid Midi"))
    
            
               b := cognew(SidMidi, @stack)
               
               pfw.setChar(120, 80, 0, 0, $0, $FFFF)
               pfw.str(string("Push to stop"))
    
               tswait
               cogstop(b)
               Midi.Stop
               Sid.Stop
    
    I'm recording examples now.
    *edit*
    The first example is with code above, then with code below.
    PUB SidMidi | sco, channel, note, velocity, event, NotesPlayed[3]
               Midi.Start(26,MidiInMode)
               
                 SID.start(rightPin, leftPin)           'Start the emulated SID chip in one cog 
                 
                 SID.resetRegisters                         'Reset all SID registers
                 
                 SID.setVolume(15)                           'Set volume to max
                   'wait.pause1s(1)
                   
                 
                 SID.setWaveform(0, SID#SQUARE)             'Set waveform type on channel1 to square wave
                 
                 SID.setPulseWidth(0, 1928)                 'Set the pulse width on channel1 to 47:53
                 SID.setADSR(0, 2, 9, 5, 4)    'Set Envelope on channel1
                 
                 SID.setWaveform(1, SID#NOISE)               'Set waveform type on channel2 to noise (drum sound)
                 SID.setADSR(1, 0, 8, 4, 7)                  'Set Envelope on channel2
                 SID.setWaveform(2, SID#SAW)                 'Set waveform type on channel3 to saw wave
                 SID.setADSR(2, 7, 4, 8, 9)                  'Set Envelope on channel3
                                   'Lp    Bp     Hp       
                 SID.setFilterType(true, false, false) 'Enable lowpass filter
    
                                   'Ch1   Ch2    Ch3
                 SID.setFilterMask(true, false, false) 'Enable filter on the "bass channel" (channel1)
    
                 SID.setResonance(7)         'Set the resonance value to max
                 SID.setCutoff(548)
                 'deadend
                 repeat sco from 0 to 2
                  SID.noteOff(sco)
          
    
     REPEAT
       event := Midi.evt         
       note := event
       channel := note
       'Velocity := note
    
       event := (event & $FF00_0000) >> 24
       channel := (channel & $00FF_0000) >> 16
       note := (note & $0000_FF00) >> 8
      ' Velocity &= $0000_00FF
       
          if event == 1
           if notesPlayed[channel] < 2
             SID.noteOff(channel)
           notesPlayed[channel]--
    
          elseif event == 0                           ' Note on if note > 0   
            SID.noteOn(channel, note2freq(note))
               notesPlayed[channel]++   
    
    The first example is followed by a pause, then the second example. Please don't mind my crappy playing. The click heard at the beginning is sidcog starting. This is present with or without filter.Not a biggie, getting the filter working is #1 priority right now!


    I re-read your post again, and have a few more questions.
    Re- sample mixing, I see that others have used sterio spatializer, is this the best way to mix samples, and how do I "pipe" them in? I'll dig a bit more on this myself, I was hoping for some tips from the masters though.

    Re- self oscillation, I didn't think the sid was capable of this. I though I'd check though.

    Thanks for your time and help. You have some very amazing releases! Keep up the good work!
  • Ahle2Ahle2 Posts: 1,063
    edited 2012-04-06 - 02:48:12
    Are you using the latest version of SIDcog from the OBEX?
  • average joeaverage joe Posts: 795
    edited 2012-04-06 - 02:58:58
    SIDcog - SID/MOS8580 emulator v1.2 (C) 2011 Johannes Ahlebrand
    From the header. I'm not sure if it's related to my software. I will strip everything down to bare minimum and try again. Hopefully I can figure out what's causing that ringing on note off. You did hear what I was referring to as far as filter ring. I'm also curious if you heard the glitch on NoteOff without the filter?
  • average joeaverage joe Posts: 795
    edited 2012-04-06 - 09:09:09
    I've been playing around a bit more and just made this demo for SidCog. The song is Skrillex - Scary Monsters and Nice Sprites
    http://soundcloud.com/joe-heinz/skrillex-scary-monsters-and-1
    CON
     _clkmode       = xtal1 + pll16x                        ' use crystal x 16
     _xinfreq       = 5_000_000                             'with 5mhz crystal 
    
      doNoteOn            = $00000001
      doNoteOff           = $00000002
      doAftertouch        = $00000004
      doController        = $00000008
      doProgramChange     = $00000010
      doChannelPressure   = $00000020
      doPitchWheel        = $00000040
      doSysex             = $00000100
      doMTC               = $00000200
      doSongPosPtr        = $00000400
      doSongSelect        = $00000800
      doTuneRequest       = $00001000
      doMidiClock         = $00002000
      doMidiTick          = $00004000
      doMidiStart         = $00008000
      doMidiContinue      = $00010000
      doMidiStop          = $00020000
      doActiveSense       = $00040000
      doReset             = $00080000 
    
    
      MidiInMode = doNoteOn+doNoteOff
    
      LeftPin            = 24       '<-- Audio Out pins
      RightPin           = 27
    
    OBJ 
        midi: "MidiIn"
         sid : "SidCog"
    PUB BOOT   |                       'bootstrap, initalizes pins, then starts pst, init display, start asm, clear screen and display hello world
            
    SidMidi
    
    
    
    
    PUB SidMidi | sco, channel, note, velocity, event, NotesPlayed[3]
               Midi.Start(26,MidiInMode)
               
                 SID.start(rightPin, leftPin)           'Start the emulated SID chip in one cog 
                 
                 SID.resetRegisters                         'Reset all SID registers
                 
                 SID.setVolume(15)                           'Set volume to max
                   'wait.pause1s(1)
                   
                 
                 SID.setWaveform(0, SID#SQUARE)             'Set waveform type on channel1 to square wave
                 
                 SID.setPulseWidth(0, 1928)                 'Set the pulse width on channel1 to 47:53
                 SID.setADSR(0, 2, 9, 5, 4)    'Set Envelope on channel1
                 
                 SID.setWaveform(1, SID#NOISE)               'Set waveform type on channel2 to noise (drum sound)
                 SID.setADSR(1, 0, 8, 4, 7)                  'Set Envelope on channel2
                 SID.setWaveform(2, SID#SAW)                 'Set waveform type on channel3 to saw wave
                 SID.setADSR(2, 7, 4, 8, 9)                  'Set Envelope on channel3
                                   'Lp    Bp     Hp       
              SID.setFilterType(true, false, false) 'Enable lowpass filter
    
                                   'Ch1   Ch2    Ch3
                 SID.setFilterMask(true, false, false) 'Enable filter on the "bass channel" (channel1)
    
                 SID.setResonance(15)         'Set the resonance value to max
    
                 SID.setCutoff(287)
                 'deadend
                 repeat sco from 0 to 2
                  SID.noteOff(sco)
          
    
     REPEAT
       event := Midi.evt         
       note := event
       channel := note
       'Velocity := note
    
       event := (event & $FF00_0000) >> 24
       channel := (channel & $00FF_0000) >> 16
       note := (note & $0000_FF00) >> 8
      ' Velocity &= $0000_00FF
       
          if event == 1
           'if notesPlayed[channel] < 2
             SID.noteOff(channel)
           'notesPlayed[channel]--
    
          elseif event == 0                           ' Note on if note > 0   
            SID.noteOn(channel, note2freq(note))
          '     notesPlayed[channel]++
    
    PUB note2freq(note) | octave
        octave := note/12
        note -= octave*12 
        return (noteTable[note]>>(8-octave))
        
    
    
    DAT
    noteTable word 16350, 17320, 18350, 19450, 20600, 21830, 23120, 24500, 25960, 27500, 29140, 30870
               
    
  • Ahle2Ahle2 Posts: 1,063
    edited 2012-04-08 - 01:08:42
    I really like the melody in "Scary Monsters and Nice Sprites"... a little bit of drums and some smooth pads and it will be a hit. :)

    About the self-oscillation heard in the clip you have provided. It sounds like a square wave so it can't be from the filter itself.
    But as you say it is only heard when the filter is activated... strange.
    I don't have the time to investigate this right now. I'm sorry! :(

    /Johannes
  • average joeaverage joe Posts: 795
    edited 2012-04-08 - 01:21:27
    That is perfectly fine. I tried isolating the object from all other code, including midi and control. Played with cog#. Did not try different pins yet since my hardware is hard wired. I'll see what I can figure out later as I have a 2 - part work around for now. #`1, keep filter values below limit. #2, turn filter OFF if note off and filter > limit. No code on this yet but should keep the gremlin at bay for now.
    I totally understand you're inability to work on this right now. It's not a big deal at all since I have the work around. I was just hoping I was doing something wrong, or it was a known bug or whatnot. Thanks for ALL of you're work, help, time and wonderful objects.
    BTW in case you were unaware, scary monsters is a huge hit in the USA. *at least among all the Electronic Dance Music people I know* Real song here http://youtu.be/cvvboQlGqb0 I only reference this because you've got great sound emulation running, and I was wondering how you would think the best way to do the bleeps and bloops. I can describe the method elsewhere so as not to hi-jack your thread BUT. This style is VERY popular now among people I know. My favorite song is this http://youtu.be/Z3_gyFD2Ndk the video fits the song. Song starts @ 1:00... I will post tomorrow more on this.
  • Ahle2Ahle2 Posts: 1,063
    edited 2012-04-08 - 03:02:11
    Okey, I see.. didn't know that "scary monster" is a real song.

    Here are some tunes I recorded from a QuickStart board running a "filter tweaked" SIDcog object.
    The filter cutoff matches a real 8580 much better than before.(this version will be uploaded to OBEX in the near future)
    "Sid register writes" are streamed from "SIDcog serial player" running on my PC to an instance of "SIDcogSlave.spin" running on the Propeller.

    http://soundcloud.com/ahle2/sets/sid-emulation-running-on-a

    /Johannes
  • average joeaverage joe Posts: 795
    edited 2012-04-08 - 03:17:09
    OOOOO I can't WAIT! It does sound WAY closer from the demos. Major development has come to a screeching halt for the next few days. How much work would it take to get access to the filter section? Sid's had the audio in but if I remember right there was just a summing in. You should update this page http://en.wikipedia.org/wiki/MOS_Technology_SID to reflect your work.
    *edit*
    My buddy asked JUST about Paula emulation. Not something I'm interested in, but he's a retro-gaming enthusiast. He also mentioned an arcade cab running on the prop. We have a 2 player cab with usb - keyboard mapped controls. I told him it was possible, but I don't have the time. He just laughed...
  • Ahle2Ahle2 Posts: 1,063
    edited 2012-04-24 - 14:32:29
    SIDcog version 1.3 is out.
    Download it from the OBEX!

    Changes in version 1.3

    - Fixed a bug when noise + any other waveform was selected at the same time
    - Calibrated the cutoff frequency to better match a real 8580
    - Cycle optimized code to "make room" for the point below
    - Increased resonance accuracy (replaced "4 step logaritmic lookup table" with "16 step bit linear multiplication")
    - Increased ADSR accuracy a little bit more (the ADSR bug is still not implemented)

    /Johannes
  • Oldbitcollector (Jeff)Oldbitcollector (Jeff) Posts: 8,090
    edited 2012-06-09 - 23:08:59
    @Ahle2:

    Is there any chance you can help me some with some code like this that works with the new version of SIDcog?
    PUB getNoteChannel( channelNumber ) | freq, tmp  
      freq := byte[@ch1_frequencyLo + (channelNumber*8)] | (byte[@ch1_frequencyLo + (channelNumber*8) + 1]<<8) 
      freq := f.FDiv( 16777216.0, f.FFloat(freq) )
      freq := f.FDiv( C64_Clock_Freq, freq )
      tmp  := f.FDiv ( freq, 8.1757989156 ) ' 8.1757989156Hz = Frequency of Midi note 0 ( C )
      tmp  := f.FMul ( tmp, 1.041 )
      tmp  := f.Log10( tmp ) 
      tmp  := f.FMul ( tmp, 39.8631348 )    ' 3.3219279( convert to Log2 ) * 12( 12 notes / octave )
      return f.FTrunc( tmp )
    

    Thanks!
    OBC
  • Ahle2Ahle2 Posts: 1,063
    edited 2012-06-11 - 02:27:17
    It should work the same as before, Just copy-paste the method. :)
  • Oldbitcollector (Jeff)Oldbitcollector (Jeff) Posts: 8,090
    edited 2012-06-11 - 05:29:15
    Grabbed the chunk of code as well as the "float" object which it calls on.. The code tends to lock up on that command now.

    Just had a duh moment thanks to Marko. I may have forgotten that "float" requires a start call. DUH!
    (I'm so used to the concept of floating point being automatic. Where's prop2?)

    OBC
  • TumblerTumbler Posts: 323
    edited 2012-06-11 - 07:13:42
    This is wunderful Ahle!
    SidCog playing 'Enola gay' at youtube :http://www.youtube.com/watch?v=O5Szv-8oej8&list=UUWYbKz2Sm27cdXqD5b6HEUA&feature=plcp
  • Oldbitcollector (Jeff)Oldbitcollector (Jeff) Posts: 8,090
    edited 2012-06-11 - 07:37:30
    @Tumbler, yes!! That board looks great too! Did you do your PCB for that Propeller Platform?

    OBC
  • TumblerTumbler Posts: 323
    edited 2012-06-11 - 08:45:58
    Jeff, It's a Gadget Gangster Prop Platform. Since it's not available anymore, i had to order it via expess pcb :)
    It's a nice one
  • Oldbitcollector (Jeff)Oldbitcollector (Jeff) Posts: 8,090
    edited 2012-06-11 - 09:29:34
    Tumbler wrote: »
    Jeff, It's a Gadget Gangster Prop Platform. Since it's not available anymore, i had to order it via expess pcb :)
    It's a nice one
    You know, there is no reason for that board to be out of stock. Time to bug Nick about it!
  • Oldbitcollector (Jeff)Oldbitcollector (Jeff) Posts: 8,090
    edited 2012-06-13 - 09:20:15
    @IDEA

    Is there a way to "grep" the attack, decay, sustain, filter, etc, etc. settings from a DMP file so that you could "lift" an interesting sounding instrument from an existing DMP file? This would make an interesting addition to my SIDSynth project.

    OBC
  • Ahle2Ahle2 Posts: 1,063
    edited 2012-06-13 - 13:16:27
    That will only work for very early SID tunes. Most pre 1985 SIDs used fixed register values and only triggered note on and note off; The result was very static and didn't sound very "natural" or "lively".

    Here's an example from 1984

    Then in 1985 the man the myth the legend, Rob Hubbard, began updating register values 50 times per second (between note on and note offs) and effects such as pulse width modulation and vibrato could be achieved.

    Listen to the fat bass in the beginning of the tune. The pulse width is updated 50 times per second and is "animated" from 0% to 100% and then from 100% back to 0%. (WOW what a difference in livelyness)
    Then listen to the triangle lead; The frequency is also updated 50 times a second, it sweeps up and down many times per second to achieve vibrato.

    Later SID tunes uses even more "tricks", such as changing between different waveforms on the fly, like.. triangle... wait some ms...then square... wait some more ms... then noise... etc.
    Here's an example of drums sounds using that technique.

    (Btw, another technique is heard in this tunes, called arpeggio. By changing between three notes many times per second, a choord could be played with a single channel)

    Then SID musicians began sweeping the filter cutoff like "real" synthesizers and the result was even more interesting.

    Have a listen to the bass, the filter is set to max resonance and the cutoff sweeps up and down. Just WOW, the SID was so far ahead of anything found in a computer back then.
    It took almost a decade before musicians began using the SID chip as Bob Yannes intended. That's the reason why old SID tunes almost sounds as "bad" as they would on an Atari 800 or Amstrad CPC.


    So to take a snapshot of the register settings from a single "frame" will not yield a correct result... SID music is ALL about updating register values many times per second.
  • Ahle2Ahle2 Posts: 1,063
    edited 2012-06-13 - 13:52:37
    New SID tunes uses "all the tricks in the book" and the results is soooo insanely amazing that even Bob Yannes would be surprised that it comes out of his chip from 1981.
  • Ahle2Ahle2 Posts: 1,063
    edited 2012-06-14 - 10:59:18
    Some people have asked me to share all my dmp-files, so here they are!
  • pik33pik33 Posts: 792
    edited 2012-06-15 - 00:47:16
    There is "bilinski" tune in this archive... headerless, 400 Hz... 400 Hz!!!
Sign In or Register to comment.