Jump to content
DZ-Jay

How To: Intellivision Music Tracker

Recommended Posts

Yes, I fully understand the notation. I am already using something similar in my own routines. But if I have a simple instrument that normally would play a note for an infinite amount of ticks, at some point I would want to silence it, perhaps for several bars ahead. So setting the volume within a NUL statement would not have effect? Would I rather use "C-1 00L" to ensure a new note is played at zero volume?

 

Oh well, eventually I'll try it myself and figure out what works and doesn't. :)

 

(I'm trying to write a mod2inty script right now)

Share this post


Link to post
Share on other sites

Yes, I fully understand the notation. I am already using something similar in my own routines. But if I have a simple instrument that normally would play a note for an infinite amount of ticks, at some point I would want to silence it, perhaps for several bars ahead. So setting the volume within a NUL statement would not have effect? Would I rather use "C-1 00L" to ensure a new note is played at zero volume?

 

Oh well, eventually I'll try it myself and figure out what works and doesn't. :)

 

(I'm trying to write a mod2inty script right now)

 

I modified my previous post to add a comment to that effect. Basically, "NUL 00L" is functionally equivalent to "C-1 00L" in that you are triggering an event to set the volume to zero. My guess is that since "NUL" doesn't change the note, it may be executed faster by ignoring the channel's active frequency.

 

As you know, at each row you can change the tone, volume, instrument, or any combination therein. "NUL" is just shorthand to change volume, since no note is specified.

 

The reason I insist on thinking of this as an event is that, NUL has no effect at all, just lets the channel continue at its current frequency. If you need a note to last for more than 15 rows (L = $F), then you can chain multiple NOTE() macros for the channel with "NUL," essentially saying "no change for L more rows." That way you can have a very long sustaining note.

 

-dZ.

  • Like 1

Share this post


Link to post
Share on other sites

Great!

 

I just realized the AY chip never goes below 27 Hz (NTSC) or 30 Hz (PAL) so just like with the SN76489, one can't really set the frequency to zero. Fiddling with the channel enables would be complicated and no gain, so the practical way to silence a channel is to change the volume, and don't care about which frequency it keeps playing. This is different from the Commodore world which I am used to, where both the VIC-I and SID chips have settings for the frequency 0 Hz. I can't speak for POKEY, the NES sound or other earlier sound chips which was the more common solution but clearly there were two schools about this.

Share this post


Link to post
Share on other sites

I'm not sure if this is a support forum, but I have a real question that perhaps only Arnauld can answer. I have spent a big part of the afternoon and the whole evening, and is >this< close to being able to present a tool that will be able to generate note data from a MOD file, plus all the supporting macros and data required to get the assembly file.

 

Here is my question:

 

@@drum1, @@drum2 and @@hithat in the supplied demo song define three drum envelopes with corresponding frequencies. This I understand perfectly, as it matches how most SID music editors work.

 

In the instrument definitions in the demo song, exactly 4 different musical instruments are defined, then follows the three drum sounds MUSIC.drum1, MUSIC.drum2 and MUSIC.hithat which are referenced by DRM with indexes 1, 2, 3.

 

Now I wanted to define 5 musical instruments (the instructions say up to 15 instruments may be used), plus the three drum sounds. However this screws up the routine a lot, as it seems the playback routine takes the fifth defined instrument as the first drum sound, the first defined drum sound as the second, the second defined drum sound as the third etc. Basically the drums slowly fade away and cause distortion.

 

I can only imagine what would happen with a song that has only 3 defined musical instruments + drums following. I imagine it would try to use the first pattern definition as a drum instrument definition.

 

Is this a problem on my part? It is said up to 15 instruments can be defined, but perhaps instruments number 4, 5, 6 (when starting to count from 0) must be drum sounds? I am using tracker.asm and trkdemo.asm with non-copyright date of 2008.

 

After removing the fifth musical instrument, the drums sound like intended. This can be verified by taking demosong.asm and either duplicate the fourth instrument in @@instr or comment away it for the effect to appear.

 

Edit: I tried to be clever and interleave the drum instruments, but since those take fewer bytes than the other instruments do, it caused a very nasty crash as soon as I tried to access an instrument indexed beyond those. I understand this is not the expected way to do it, so I'll chalk it down as an user error.

Edited by carlsson

Share this post


Link to post
Share on other sites

I'm not sure if this is a support forum, but I have a real question that perhaps only Arnauld can answer. I have spent a big part of the afternoon and the whole evening, and is >this< close to being able to present a tool that will be able to generate note data from a MOD file, plus all the supporting macros and data required to get the assembly file.

 

Here is my question:

 

@@drum1, @@drum2 and @@hithat in the supplied demo song define three drum envelopes with corresponding frequencies. This I understand perfectly, as it matches how most SID music editors work.

 

In the instrument definitions in the demo song, exactly 4 different musical instruments are defined, then follows the three drum sounds MUSIC.drum1, MUSIC.drum2 and MUSIC.hithat which are referenced by DRM with indexes 1, 2, 3.

 

Now I wanted to define 5 musical instruments (the instructions say up to 15 instruments may be used), plus the three drum sounds. However this screws up the routine a lot, as it seems the playback routine takes the fifth defined instrument as the first drum sound, the first defined drum sound as the second, the second defined drum sound as the third etc. Basically the drums slowly fade away and cause distortion.

 

I can only imagine what would happen with a song that has only 3 defined musical instruments + drums following. I imagine it would try to use the first pattern definition as a drum instrument definition.

 

Is this a problem on my part? It is said up to 15 instruments can be defined, but perhaps instruments number 4, 5, 6 (when starting to count from 0) must be drum sounds? I am using tracker.asm and trkdemo.asm with non-copyright date of 2008.

 

After removing the fifth musical instrument, the drums sound like intended. This can be verified by taking demosong.asm and either duplicate the fourth instrument in @@instr or comment away it for the effect to appear.

 

Edit: I tried to be clever and interleave the drum instruments, but since those take fewer bytes than the other instruments do, it caused a very nasty crash as soon as I tried to access an instrument indexed beyond those. I understand this is not the expected way to do it, so I'll chalk it down as an user error.

 

Hi, carlsson,

 

This is not a support forum for the tracker, so perhaps you should create a new thread. However, since it is related to the tracker data definition, we can address your immediate question.

 

I don't think I follow your problem completely, so I may need more information. I will say that you can have up to 16 instruments per song. That is, each song header has a pointer to the instruments table. That table can define up to 15 instruments (1 .. 15), and their one-based index is what is used when defining notes in sub-patterns.

 

You are right in that the demo song has four instruments defined and 3 drums following, and that the drums are referenced starting at index 1, so it seems strange. I'll take a look at the tracker library macros and see how the drums are referenced internally.

 

-dZ.

Share this post


Link to post
Share on other sites

This is my song right now (hoping that the editor doesn't kill my message)

 

MUSIC       PROC

;;  Pitch effects                                                           ;;
@@pitch01   DECLE   0, 0, 0, 0
@@pitch02	  DECLE	0, 3, 8, 12
@@pitch03	  DECLE	0, 4, 7, 12
@@pitch04	  DECLE	0, 6, 9, 12

;;  Envelopes                                                               ;;
@@env01     DECLE   2
            DECLE   $FEDC, $BA98, $7654, $3210
            DECLE   $0000, $0000, $0000, $0000
            DECLE   $0000, $0000, $0000, $0000
            DECLE   $0000, $0000, $0000, $0000

@@env02     DECLE   1
            DECLE   $FFFF, $EEEE, $DDDD, $CCCC
            DECLE   $BBBB, $AAAA, $9999, $8888
            DECLE   $7777, $6666, $5555, $4444
            DECLE   $3333, $2222, $1111, $0000

;;  Drums                                                                   ;;
@@drum1     DRUM($380, $10, 0, 1, $F)
            DRUM($380, $10, 1, 0, $F)
            DRUM($380, $10, 1, 0, $F)
            DRUM($580, $1F, 1, 0, $E)
            DRUM($580, $1F, 1, 1, $D)
            DRUM($580, $1F, 1, 1, $C)
            DRUM($580, $1F, 1, 0, $A)
            DRUM($580, $1F, 1, 0, $

@@drum2     DRUM($280, $10, 0, 1, $F)
            DRUM($280, $10, 1, 0, $F)
            DRUM($280, $10, 1, 0, $F)
            DRUM($480, $1F, 1, 0, $E)
            DRUM($480, $1F, 1, 1, $D)
            DRUM($480, $1F, 1, 1, $C)
            DRUM($480, $1F, 1, 0, $A)
            DRUM($480, $1F, 1, 0, $

@@hithat    DRUM($380, $04, 0, 1, $D)
            DRUM($380, $04, 0, 1, $6)
            DRUM(0, 0, 0, 0, 0)
            DRUM(0, 0, 0, 0, 0)
            DRUM(0, 0, 0, 0, 0)
            DRUM(0, 0, 0, 0, 0)
            DRUM(0, 0, 0, 0, 0)
            DRUM(0, 0, 0, 0, 0)

            ENDP

SONG00      PROC

;;  Speed / Pointers                                                        ;;
            DECLE   6, @@patterns, @@instr

;;  Order of patterns                                                       ;;
            DECLE   0, 1, 2, 2, 3, 4, (-2 AND $FFFF)

;;  Details of patterns                                                     ;;
@@patterns  DECLE   48, @@pd00, @@pb00, @@ps00
	  DECLE	48, @@pd01, @@pb01, @@ps00
	  DECLE	48, @@pd01, @@pb01,	@@pc01 
	  DECLE	48, @@pc01, @@pb01, @@pm01  ; add drums
	  DECLE	48, @@pc01, @@pb01, @@pm02  ; add drums

;;  Standard instruments (pitch effect, vibrato, envelope)                  ;;
@@instr     DECLE   MUSIC.pitch01, 1, MUSIC.env01
	  DECLE	MUSIC.pitch02, 1, MUSIC.env01
            DECLE   MUSIC.pitch03, 1, MUSIC.env01
	  DECLE	MUSIC.pitch04, 1, MUSIC.env01
;           DECLE   MUSIC.pitch01, 2, MUSIC.env02

;;  Drums                                                                   ;;
            DECLE   MUSIC.drum1
            DECLE   MUSIC.drum2
            DECLE   MUSIC.hithat

; Actual music instrument - unreachable / causes crash!


;;  Patterns                                                                ;;

; silence
@@ps00	NOTE("NUL 00F")
	NOTE("NUL 00F")
	NOTE("NUL 00F")

; drums first two blocks
@@pd00	NOTE("NUL 002") 
	NOTE("DRM 3F1") ; hihat
	NOTE("DRM 3F3")
	NOTE("DRM 3F1")
	NOTE("DRM 3F3")
	NOTE("DRM 3F1")
	NOTE("DRM 3F3")
	NOTE("DRM 3F1")
	NOTE("DRM 3F3")
	NOTE("DRM 3F1")
	NOTE("DRM 3F3")
	NOTE("DRM 3F1")
	NOTE("DRM 3F3")
	NOTE("DRM 3F1")
	NOTE("DRM 3F3")
	NOTE("DRM 3F1")
	NOTE("DRM 3F0")

; drums remaining blocks
@@pd01	NOTE("DRM 1F2")
	NOTE("DRM 3F1")
	NOTE("DRM 3F0")
	NOTE("DRM 2F2")
	NOTE("DRM 3F1")
	NOTE("DRM 3F0")
	NOTE("DRM 1F1")
	NOTE("DRM 1F0")
	NOTE("DRM 3F1")
	NOTE("DRM 3F0")
	NOTE("DRM 2F2")
	NOTE("DRM 3F1")
	NOTE("DRM 3F0")
	NOTE("DRM 1F2")
	NOTE("DRM 3F1")
	NOTE("DRM 3F0")
	NOTE("DRM 2F2")
	NOTE("DRM 3F1")
	NOTE("DRM 3F0")
	NOTE("DRM 1F1")
	NOTE("DRM 1F0")
	NOTE("DRM 3F1")
	NOTE("DRM 3F0")
	NOTE("DRM 2F1")
	NOTE("DRM 2F0")
	NOTE("DRM 3F0")
	NOTE("DRM 2F0")
	NOTE("DRM 3F0")

; instrument 1 = plain short
; instrument 2 = arpeggio short 038
; instrument 3 = arpeggio short 047
; instrument 4 = arpeggio short 069
; instrument 5 = plain long

; chords - currently not mixed in
@@pc01	NOTE("F#4 2F2")
	NOTE("NUL 001")
	NOTE("F#4 2F2")
	NOTE("NUL 003")
	NOTE("G-4 3F2")
	NOTE("NUL 001")
	NOTE("G#4 2F2")
	NOTE("NUL 003")
	NOTE("A-4 3F1")
	NOTE("NUL 000")
	NOTE("A-4 3F1")
	NOTE("NUL 002")
	NOTE("A-4 3F2")
	NOTE("NUL 000")
	NOTE("F#4 2F1")
	NOTE("NUL 000")
	NOTE("F#4 2F1")
	NOTE("NUL 000")
	NOTE("G-4 4F2")
	NOTE("NUL 002")

; bass first block
@@pb00	NOTE("D-1 1F2")
	NOTE("NUL 002")
	NOTE("F#1 1F2")
	NOTE("NUL 002")
	NOTE("G-1 1F2")
	NOTE("NUL 002")
	NOTE("G#1 1F2")
	NOTE("NUL 002")
	NOTE("A-1 1F2")
	NOTE("NUL 002")
	NOTE("G-1 1F2")
	NOTE("NUL 002")
	NOTE("F#1 1F2")
	NOTE("NUL 002")
	NOTE("E-1 1F2")
	NOTE("NUL 002")

; bass remaining blocks
@@pb01	NOTE("D-1 1F2")
	NOTE("D-2 1F2")
	NOTE("F#1 1F2")
	NOTE("F#2 1F2")
	NOTE("G-1 1F2")
	NOTE("G-2 1F2")
	NOTE("G#1 1F2")
	NOTE("G#2 1F2")
	NOTE("A-1 1F2")
	NOTE("A-2 1F2")
	NOTE("G-1 1F2")
	NOTE("G-2 1F2")
	NOTE("F#1 1F2")
	NOTE("F#2 1F2")
	NOTE("E-1 1F2")
	NOTE("E-2 1F2")

; melody
@@pm01	NOTE("NUL 001")
	NOTE("F#5 1F0")
	NOTE("G-5 1F1")
	NOTE("A-5 1F2")
	NOTE("B-5 1F2")
	NOTE("G-5 1F5")
	NOTE("NUL 001")
	NOTE("G-5 1F0")
	NOTE("F#5 1F0")
	NOTE("E-5 1F1")
	NOTE("D-5 1F0")
	NOTE("C#5 1F1")
	NOTE("D-5 1F0")
	NOTE("E-5 1F1")
	NOTE("A-4 1F2")
	NOTE("B-5 1F2")
	NOTE("A-5 1F2")
	NOTE("F#5 1F2")
	NOTE("A-5 1F5")
	NOTE("NUL 000")

@@pm02	NOTE("NUL 001")
	NOTE("F#5 1F0")
	NOTE("G-5 1F1")
	NOTE("A-5 1F2")
	NOTE("F#5 1F2")
	NOTE("D-5 1F2")
	NOTE("B-4 1F2")
	NOTE("E-5 1F5")
	NOTE("D-5 1F0")
	NOTE("C#5 1F1")
	NOTE("D-5 1F0")
	NOTE("E-5 1F1")
	NOTE("A-4 1F2")
	NOTE("C#5 1F2")
	NOTE("D-5 1F6")
	NOTE("C#5 1F4")
	NOTE("NUL 000")
            ENDP
mmix.asm

 

If I enable the fifth line under @@instr, the one that uses envelope 2, the drum sounds go weird. The same effect can be done to the demo song with the same odd behavior.

 

I was kind of expecting some declaration of how many instruments one uses, or a @@drumscomehere label that tells the assembler that here are the pointers to the drum sounds. But I can't find any, it seems to be magic.

 

As a related note, the chords in pattern 3 and 4 which currently try to take over channel 1 after the drums, disappear completely. So does any other pattern trying to follow after drums. However in this case I have verified that the demo song allows non-drum patterns to follow, so that must be some weird user error on my part.

 

I can definitely open a new thread, if that keeps things more clean and easier to follow.

 

Edit: I solved my second problem, about a non-drum pattern following a drum pattern. It seems the very last sound in a drum pattern must not be a drum. NUL is efficient to enable non-drum sounds in the next pattern.

Edited by carlsson

Share this post


Link to post
Share on other sites

Hmm... Strangely enough, it seems that the drums are hard-coded to occur on the fifth instrument. I don't know if this is by design for a specific reason, or if Arnauld just forgot to generalize that part of his tracker after composing the demo song.

 

First, the NOTE() macro adds 84 to the instrument number of a DRUM definition, which serves as a threshold during playback to tell whether the instrument is a drum (i.e., instrument indices 85 or greater are drums). Then during playback, as you can see below, after subtracting 85 from the instrument number, the actual index to the instruments table is composed by skipping ahead four records of three elements (which are the normal instruments).

 

That is weird. Like I mentioned in the tutorial, I had not played with the drums feature so I am not very familiar with it, but this is very strange indeed.

;; ------------------------------------------------------------------------ ;;
;;  Drum                                                                    ;;
;; ------------------------------------------------------------------------ ;;
;;  NOTE: drums are currently supported on channel A only                   ;;
;; ------------------------------------------------------------------------ ;;
@@drum      CMPI    #8,     R2          ; end of drum ?
            BGE     @@end_drum

            SUBI    #85-3*4,R1          ; get pointer to drum data
            ADD     INS_PTR,R1
            [email protected]    R1,     R4
            SLL     R2,     2
            ADDR    R2,     R4

So, it seems that you can define up to 15 normal instruments -- unless you use drums, in which case you can only define 4 normal instruments and 11 drums. OK.

 

I guess this can be fixed but I'm intrigued to know why this was done in the first place.

 

Arnauld, any insight you could provide?

 

-dZ.

 

P.S. Drums are only supported on channel "A."

Edited by DZ-Jay
  • Like 1

Share this post


Link to post
Share on other sites

 

I can definitely open a new thread, if that keeps things more clean and easier to follow.

 

Edit: I solved my second problem, about a non-drum pattern following a drum pattern. It seems the very last sound in a drum pattern must not be a drum. NUL is efficient to enable non-drum sounds in the next pattern.

 

 

Perhaps a new thread to deal with this issue may be better. I wanted this thread to remain clean as a reference on how to use the tracker. Once we solve these issues we can add additional information here.

 

 

I was kind of expecting some declaration of how many instruments one uses, or a @@drumscomehere label that tells the assembler that here are the pointers to the drum sounds. But I can't find any, it seems to be magic.

 

It's not magic, see my post above.

 

By the way, the problem is that only Arnauld knows how to use his tracker. The data format tutorial was based on information he provided in an e-mail and some reverse-engineering I did. I even had to dig in the code to find out how to stop a song from repeating at the end, and discovered the magic constant $F000.

Edited by DZ-Jay
  • Like 1

Share this post


Link to post
Share on other sites

Here's another tidbit of information: According to the IntelliWiki, a drum is fully defined by 8 frames. I take this to mean in contrast to a normal instrument, which is defined by how many number of frames you'd like, as long as all patterns are the same length. This could be why your drum patterns are breaking: make sure they are exactly 8 frames in length.

 

Honestly, I will have to go through the tracker source and reverse-engineer the drums to see exactly what's going on. Most of everything else I had already figured out because I spent considerable time analysing it, but never the drums.

  • Like 1

Share this post


Link to post
Share on other sites

A bit of trial and error just solved this problem as well:

 

Each DECLE results in a 16-bit number, whether it is an address pointer or an integer (vibrato range). The musical instruments thus are 6 bytes each, with pointers to respective pitch effect and envelope tables. The drum instruments though only has one 16-bit pointer each, so those are 2 bytes each.

 

What I did wrong last night was to think 4 instruments + 3 drum sounds = 7, so the next music instrument should be 8. I should have considered that three drum sounds take up exactly as much room as 1 music instrument, so the next usable instrument is ... 6!

 

However if I add a fourth drum sound, I need to pad out with two unreachable DECLE's to get the stepping right and the next usable music instrument becomes 7. If you only have one or two drum sounds, you will equally have to pad out this section so the number of bytes in the binary is a multiple of 6.

 

While this feels a bit hacker like, I think it could be worth including in the tutorial/description, as it actually enables one to use more music instruments:

 

1-4 are music instruments

5 are three drum instruments DRM 1-3. If you have less or more drums, pad as required. You can DECLE all three drums on a single row for more clarity.

6 is your next music instrument (or 7 if you have more than three drums)

 

I will open a new thread later tonight with my script and instructions.

Edited by carlsson

Share this post


Link to post
Share on other sites

A bit of trial and error just solved this problem as well:

 

Each DECLE results in a 16-bit number, whether it is an address pointer or an integer (vibrato range). The musical instruments thus are 6 bytes each, with pointers to respective pitch effect and envelope tables. The drum instruments though only has one 16-bit pointer each, so those are 2 bytes each.

 

What I did wrong last night was to think 4 instruments + 3 drum sounds = 7, so the next music instrument should be 8. I should have considered that three drum sounds take up exactly as much room as 1 music instrument, so the next usable instrument is ... 6!

 

However if I add a fourth drum sound, I need to pad out with two unreachable DECLE's to get the stepping right and the next usable music instrument becomes 7. If you only have one or two drum sounds, you will equally have to pad out this section so the number of bytes in the binary is a multiple of 6.

 

While this feels a bit hacker like, I think it could be worth including in the tutorial/description, as it actually enables one to use more music instruments:

 

1-4 are music instruments

5-X are drum instruments, though referenced with DRM 1-N

X+1 are music instruments if you make sure to align them right according to number of drums you used

 

I will open a new thread later tonight with my script and instructions.

 

Thanks for that. I rather just patch the macro to do it for you automatically, or fix the broken source. I don't think hard-coding drums to start on the 5th instrument is useful when there are 15 available. I think there should be a separate instrument table with a pointer. Updating the SONG header should work, though that would require an additional variable. I'll think about it.

 

Any ideas would be welcome.

 

By the way, this is only an issue if you use the drums feature, which judging by the lack of concerns before, not many people use. When not in use, instruments are read straight down from 1 to 15 in order.

 

-dZ.

Edited by DZ-Jay
  • Like 1

Share this post


Link to post
Share on other sites

A pointer to a separate drum table was what I looked for so yes, that would make sense to me.

 

While this is not what you're asking for, GoatTracker (among others) on the C64 have waveform/arpeggio tables that kind of combine the pitch effects with drums, and doesn't need to define drum sounds separately. It also allows one to define sounds that start with a percussive sound, and changes into e.g. a bass or arpeggio chord with the given note value. A few examples:

01: 81 D0 ; high pitched noise for 1 frame, fixed frequency (>= 80)
02: 41 A4 ; medium pitched square wave, fixed frequency
03: 11 85 ; low pitched triangle wave, fixed frequency
04: 41 00 ; square wave at the frequency of the played note!
05: FF 00 ; end arpeggio entry

06: 41 00 ; square wave at the frequency of the played note
07: 41 04 ; played note + four semitones (major third)
08: 41 07 ; played note + seven semitones (fifth)
09: FF 06 ; jump to line 6 and repeat over and over


I understand it would be quite some rewrite of the Intellivision music routines to work in a similar way, but it would open up for additional possibilities at the cost of not visually being able to see in the music data what is a note and what is a drum.

Share this post


Link to post
Share on other sites

A pointer to a separate drum table was what I looked for so yes, that would make sense to me.

 

While this is not what you're asking for, GoatTracker (among others) on the C64 have waveform/arpeggio tables that kind of combine the pitch effects with drums, and doesn't need to define drum sounds separately. It also allows one to define sounds that start with a percussive sound, and changes into e.g. a bass or arpeggio chord with the given note value. A few examples:

01: 81 D0 ; high pitched noise for 1 frame, fixed frequency (>= 80)
02: 41 A4 ; medium pitched square wave, fixed frequency
03: 11 85 ; low pitched triangle wave, fixed frequency
04: 41 00 ; square wave at the frequency of the played note!
05: FF 00 ; end arpeggio entry

06: 41 00 ; square wave at the frequency of the played note
07: 41 04 ; played note + four semitones (major third)
08: 41 07 ; played note + seven semitones (fifth)
09: FF 06 ; jump to line 6 and repeat over and over

 

I understand it would be quite some rewrite of the Intellivision music routines to work in a similar way, but it would open up for additional possibilities at the cost of not visually being able to see in the music data what is a note and what is a drum.

 

Yeah, I hear ya', but I'm not re-writing the tracker right now. I am also trying to avoid adding a pointer to the drums definition because that would require storing it in another variable. I guess I could get away by re-deriving the address from the SONG header (SONG + 3) every time, but I don't know if this will have an impact on performance during playback. It's just one more ADD though.

 

Thoughts?

-dZ.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...