Jump to content

SID as a drum machine?


idiotcountry2
 Share

Recommended Posts

Yeah, the MBSID with the MBSEQ would be a nice drum machine even for live performance. If you need this only in a studio, you have to build only the basic version (CORE+SID PCBs), the rest is controlled via MIDI. For playing live I recommend to build the fullest version, to change all the parameters on-the-fly... Hope it helped.

Link to comment
Share on other sites

A special drum firmware is a nice idea, but who creates the sounds?

There are some percussion patches in the SID preset library, but they don't sound as good as those we know from the favourite C64 tunes. So, if somebody could try to optimize the drum sounds (it's not due to a lack of MBSID engine possibilities, but just my personal lack of knowledge on drum sound programming), I could think about the requirements for a firmware variation.

Currently, the only solution is to use a single core for each drum sound, or to sample the sounds, and to play them with a sampler.

But I guess that a special firmware could allow to play drums on 3 oscillators indepently, and to provide the same dynamic allocation like MBFM, which means: 3 oscillators could quickly switch between the sound settings, and therefore play any drum sound without changing the patch, just selected by the note number)

However, first it's your turn: give me at least 128 drum patches! :)

Best Regards, Thorsten.

Link to comment
Share on other sites

awesome idea - before weekend i will make 8 BD patches, 8 SD, 4 OH, 4 CH, maybe some rimshots, cymbals, ...

unfortunately snare will sound really poor with just 1 osc... i'll see what i can do... maybe i can modulate the noise at high enough frequency so we get the lower snare harmonics? LFO won't do though... maybe WT modulation? how fast can that be?

Link to comment
Share on other sites

If you could send me some drum patches until this weekend, this would be nice. I just thought about the technical realization, and came to he conclusion, that with some acceptable compromisses I could create a first version very fast (maybe at saturday afternoon :)

Here some specs I wrote down:

Project Name: MIDIbox SID-D (MBSID-D)

Key features:

    * drum sounds playable from a single MIDI channel (by default channel 10)
    * in addition to the MIDI channel, also the note range can be specified, so that multiple MBSID-D modules can be assigned to different note ranges within channel 10
    * will use the same patch structure like a normal MBSID - this saves me from creating new, dedicated tools (JSynthLib)
    * this means also, that drum sounds can be edited from a normal MBSID control surface via remote
    * in addition, MBSID-D should also provide a control surface which should be similar to a common MBSID control surface, just downstripped to the drum parameters. Hardware compatible with Step C (but there are also limitations, see below)
    * 4 drum kits per BankStick, each drum kit consists of 30 drum sounds
    * only one oscillator per drum voice
    * Software Engine will provide following dedicatedfunctions for each voice seperately: 32 step wavetable with 3 tracks, 2 LFOs, 1 EG
    * BankStick required! Up to 8 BankSticks (for 32 drum kits!)
    * dynamic switching between the patches depending on the MIDI notes being played
    * this means that a sequencer has direct access to all 30 drum sounds of a drum kit, but only 3 sounds can be played at the same time at each module. If more than three notes are played, the 'oldest' sound will be dropped (exception: grouped percussions) - Re-use MBFM
    * the firmware should provide drum groups, e.g. to combine an open HiHat with closed HiHat - grouped percussions should not change the oscillator - Re-use MBFM
    * each drum voice uses following parameters of a common MBSID patch structure:


    [tt]
    CC # | Hex | Description                                  | Range      | Reset
    =====+=====+==============================================+=============+======
      1 | 01h | Modulation Wheel                            |  0-127: val |    0
    -----+-----+----------------------------------------------+-------------+------
      2 | 02h | Velocity Init Value                          |  0-127: val |    0
      3 | 03h | Modulation Wheel Init Value                  |  0-127: val |    0
    -----+-----+----------------------------------------------+-------------+------
      13 | 0Dh | Velocity Depth                              |  0- 63: neg |  127
        |    | negative depth (0-63) inverts the effect    |    64: off |   
        |    |                                              | 64-127: pos |   
      14 | 0Eh | Modulation Wheel Depth                      |  0- 63: neg |  127
        |    | negative depth (0-63) inverts the effect    |    64: off |   
        |    |                                              | 64-127: pos |   
    -----+-----+----------------------------------------------+-------------+------
      17 | 11h | Voice Transpose                              |  0- 63: neg |  64
        |    |                                              |    64: off |   
        |    |                                              | 64-127: pos |   
    -----+-----+----------------------------------------------+-------------+------
      21 | 15h | Voice Finetune                              |  0- 63: neg |  64
        |    |                                              |    64: off |   
        |    |                                              | 64-127: pos |   
    -----+-----+----------------------------------------------+-------------+------
      25 | 19h | Oscillator Pitchrange in Number of Notes    |    0: off  |    2
        |    | Used by PitchBender and Finetune            | 1-127: val  |   
    -----+-----+----------------------------------------------+-------------+------
      33 | 21h | Oscillator Waveform                          |            |    4
        |    |  Bit 0: Triangle                            |            |
        |    |  Bit 1: Saw                                |            |
        |    |  Bit 2: Pulse                              |            |
        |    |  Bit 3: Noise (disables all other waveforms)|            |
        |    |  Bit 4: Disable Voice                      |            |
        |    |  Bit 5: Sync (*)                            |            |
        |    |  Bit 6: Ringmodulator (*)                  |            |
        |    | (* not sure, if sync and ringmod makes sense)|            |
    -----+-----+----------------------------------------------+-------------+------
      37 | 25h | Oscillator Pulsewidth                        |  0- 63: neg |  64
        |    |                                              |    64: off |   
        |    |                                              | 64-127: pos |   
    -----+-----+----------------------------------------------+-------------+------
      44 | 2Ch | Filter Channel                              |            |    0
        |    |  Bit 0: Filter for Voice off                |            |
      46 | 2Eh | Global Filter CutOff frequency              |  0-127: val |  127
      47 | 2Fh | Global Filter Resonance                      |  0-127: val |    0
    -----+-----+----------------------------------------------+-------------+------
      49 | 31h | Voice Attack                                |  0-127: val |    0
    -----+-----+----------------------------------------------+-------------+------
      53 | 35h | Voice Decay                                  |  0-127: val |    0
    -----+-----+----------------------------------------------+-------------+------
      57 | 39h | Voice Sustain                                |  0-127: val |  127
    -----+-----+----------------------------------------------+-------------+------
      61 | 3Dh | Voice Release                                |  0-127: val |    0
    -----+-----+----------------------------------------------+-------------+------
      64 | 40h | LFO1 Rate                                    |      0: off |    0
        |    |                                              |  1-127: val |
      65 | 41h | LFO2 Rate                                    | see above  |    0
    -----+-----+----------------------------------------------+-------------+------
      72 | 48h | LFO1 Depth                                  |  0- 63: neg |  64
        |    | negative depth (0-63) inverts the waveform  |    64: off |   
        |    |                                              | 64-127: pos |   
      73 | 49h | LFO2 Depth                                  | see above  |  64
    -----+-----+----------------------------------------------+-------------+------
      78 | 4Eh | ENV1 Depth                                  | see above  |  64 
    -----+-----+----------------------------------------------+-------------+------
      80 | 50h | LFO1 Mode                                    |            |    3
        |    |  Bit 0: Enable LFO                          |            |
        |    |  Bit 6-4: Waveform                          |            |
        |    |            0: Sine                          |            |
        |    |            1: Triangle                      |            |
        |    |            2: Saw                            |            |
        |    |            3: Pulse                          |            |
        |    |            4: Random                        |            |
        |    |            5: analog input                  |            |
      81 | 51h | LFO2 Mode                                    |            |
    -----+-----+----------------------------------------------+-------------+------
      86 | 56h | Envelope 1 Curve                            |  0-63: neg |  64
        |    | Note: Curve must be enabled seperately      |      0: lin |
        |    | for Attack/Decay/Release parameter w/ CC#110 | 64-127: pos |
    -----+-----+----------------------------------------------+-------------+------
      88 | 58h | Envelope 1 Attack                            |  0-127: val |    0
      89 | 59h | Envelope 1 Decay                            |  0-127: val |    0
      90 | 5Ah | Envelope 1 Sustain                          |  0-127: val |    0
      91 | 5Bh | Envelope 1 Release                          |  0-127: val |    0
    -----+-----+----------------------------------------------+-------------+------
      97 | 61h | Assigned LFOs for Pitch of Voice            |            |    1
        |    |  Bit 0: LFO1 controls Note Pitch on/off    |            |
        |    |  Bit 1: LFO2 controls Note Pitch on/off    |            |
    -----+-----+----------------------------------------------+-------------+------
    101 | 65h | Assigned LFOs for Pulsewidth of Voice        |            |    2
        |    |  Bit 0: LFO1 controls PulseWidth on/off    |            |
        |    |  Bit 1: LFO2 controls PulseWidth on/off    |            |
    -----+-----+----------------------------------------------+-------------+------
    105 | 69h | Assigned Envelopes for Voice                |            |    0
        |    |  Bit 0: ENV1 controls Pitch                |            |
        |    |  Bit 1: -                                  |            |
        |    |  Bit 2: -                                  |            |
        |    |  Bit 3: -                                  |            |
        |    |  Bit 4: ENV1 controls PulseWidth            |            |
        |    |  Bit 5: -                                  |            |
    -----+-----+----------------------------------------------+-------------+------
    108 | 6Ch | Assigned LFOs for Global Filter CutOff Frequency  |        |    4
        |    |  Bit 0: LFO1 controls CutOff on/off        |            |
        |    |  Bit 1: LFO2 controls CutOff on/off        |            |
    -----+-----+----------------------------------------------+-------------+------
    109 | 6Dh | Assigned Envelopes for Global Filter        |            |    0
        |    |  Bit 0: ENV1 controls CutOff                |            |
    -----+-----+----------------------------------------------+-------------+------
    110 | 6Eh | Use curve parameter on ENV1                  |            |    0
        |    |  Bit 0: ENV1, Attack                        |            |
        |    |  Bit 1: ENV1, Decay                        |            |
        |    |  Bit 2: ENV1, Release                      |            |
    -----+-----+----------------------------------------------+-------------+------
    111 | 6Fh | Sound Engine Options                        |            |    0
        |    |  Bit 0-7: reserved                          |            |
    -----+-----+----------------------------------------------+-------------+------
    117 | 75h | Assign Velocity to Controller                |    0: off  |    0
        |    |                                              | 1-127: Ctrl |
    118 | 76h | Assign Modulation Wheel to Controller        |    0: off  |    0
        |    |                                              | 2-127: Ctrl |
    -----+-----+----------------------------------------------+-------------+------
    120 | 78h | Voice Wavetable Rate                        |  1-127: val |    0
        |    |                                              |      0: off |   
    121 | 79h | Assign Wavetable Parameter #1 to Controller  |      0: off |    0
        |    |                                              | 1-127: Ctrl |
    122 | 7Ah | Assign Wavetable Parameter #2 to Controller  |      0: off |    0
        |    |                                              | 2-127: Ctrl |
    123 | 7Bh | Assign Wavetable Parameter #3 to Controller  |      0: off |    0
        |    |                                              | 1-127: Ctrl |
    -----+-----+----------------------------------------------+-------------+------
    124 | 7Ch | Oscillator Phase synchronization            | 0: off      |   
        |    |                                              | 1: on      |
    -----+-----+----------------------------------------------+-------------+------
    125 | 7Dh | MIDI Sync (synchronizes LFOs/ENVs/WTs        |  0: intern |    0
        |    | to MIDI clock)                              |  7: all    |
        |    |  Bit 0: sync Wavtable Sequencer            |            |
        |    |  Bit 1: sync LFOs                          |            |
        |    |  Bit 2: sync Envelopes                      |            |
        |    |                                              |            |
        |    | Examples: 01: sync only sequencer,          |            |
        |    |          02: sync only LFOs                |            |
        |    |          06: sync LFOs and envelopes        |            |
    [/tt]

    In addition, following parameters should be globally available in a Drum Kit:

    • Volume
    • Global CutOff and Resonance
    • Global Frequency Transpose
    • Global Filter Configuration (LP/BP/HP)
    • Split Layer (Lower Note, Higher Note)
    • Layer Note Transpose

    Drumkit can be selected via Program Change Event (0..31)

    This gives us following possibilities:

      * MBSID-D can be used standalone or as MIDI slave of Step A, B or C interface
      * a complete Step C (4 SIDs) can be partitionized like desired. For Example: use two SIDs with MBSID firmware, and two SIDs with MBSID-D firmware - one MBSID-D assigned to note range ...B-2, the other to Note Range C-3...
      * Or use MBSID-D as standalone drum expander(s) without CS in addition to your normal MBSID setup. So long you don't want to edit the drum sound parameters, you can connect the MIDI-INs of your MBSID-D(s) in parallel to the MIDI IN of your normal MBSID
      * It won't be possible to edit parameters of slaves from a "master MBSID-D" (reason: see my posting from 19.11.)
      * patches edited on a normal MBSID can be partly re-used for the MBSID-D. No conversion is required, just only the restrictions (see parameter list above) have to be taken into account



      I don't know, how much I can reduce the normal firmware, but perhaps there will be enough memory free for an additional 8-track drum sequencer - these sequences could be saved in one of the BankSticks! :)
      (maybe I should this take into account for the 303 Control Extension)

      Best Regards, Thorsten.
Link to comment
Share on other sites

Today I made some performance evaluations.

It is not a good idea to load the drum sounds directly from BankStick at the time they should be played, because this leads to a latency of 5 mS. Thats the time which passes to load 42 bytes from a BankStick when other tasks are running in background (the software engine which handles the LFOs and ENVs takes ca. 50% of this time)

So, the only way to realize a latency much below 500 uS is to preload the whole Drumkit into RAM - thats the way I will go. The RAM data can be compressed, I hope that at least 20 drum sounds will be loadable at once - this should be enough

This leads to the side effect, that a MBSID-D master has no RAM anymore to edit the parameters of a MBSID-D slave in realtime. However, this should also be acceptable. It will still be possible to prepare a drumkit on the master, and to dump it to the slave before the use. Maybe the use of MBSID-D as a CS master is a corner case anyhow - I will still use my common MBSID as master

Another point which I noticed and which will affect the sound architecture is the damned SID envelope bug. The VCA envelope of the previous sound can affect the envelope of the new sound (hick ups). One measure to compensate this is to clear the envelope registers when the sound is finished (the required delay could be calculated from the ADSR settings). Another possibility is to clear the registers, to wait some time (I don't know how long), and to play the new sound thereafter... this would increase the latency... however, lets see

Best Regards, Thorsten.

Link to comment
Share on other sites

i'm really sorry TK - this weekend was totally crazy for me - i had to help moving my father and assembling his kitchen :/

i'll really try hard to find time during this week.

the following goes for 6581. haven't tried it with 8580 yet.

from what i was trying i can say this - the bassdrums can sound pretty good, especially for 808-like sounds. triangular waveform has very quiet higher harmonics and sounds almost like sine even without the lowpass filter. other waveforms result in distorted/overdriven-like sound, can be used for gabber. combined waveforms aren't useful for bassdrums cause they're really low on bass.

the high hats will be no problem. the pitched noise offers a variety of tonal options. even without filters.

toms will be fine, similar to bassdrum.

snares will be the toughest... how fast can the LFO go? how fast can the WT go? it's really nice to have the "tone" in the snare sound, otherwise it's way too hollow. something could be done with the lower frequency noise... i'll see.

other percussion sounds could probably realized without big problems and i don't think they're as critical as the basic ones.

i'm wondering - would it be possible to set the filter on/off per-patch? since the patches are only 1 channel it could be done. or do you think the popping when turning the filter channels on/off would be too annoying? it would be really useful.

others could post their experience and observations on drum sounds design here. what do you guys think about the snares?

Link to comment
Share on other sites

Have you ever tried the WT examples in the preset library? Eg, "WT Synth Drum 11" is a pretty nice snare drum - I'm especially searching for improved versions of these WT sounds, and for additional C64 typical special sounds

LFO frequency: see bottom of http://www.ucapps.de/midibox_sid/sid_cc_implementation_chart.txt

Wt frequency goes up to 1.2 kHz (rate=127)

Filter: see CC#44 in the table above!

It doesn't pop so long you are playing the sound which gets use of the filter very often. Thats difficult to describe for somebody who isn't that much into the MBFM voice allocation algorithm, let's try it: first the algorithm searches for a voice which was assigned to the same instrument like the new one. If such a voice/instrument combination is available, the appr. voice will be taken -> no filter crackle. If it was not found, it takes the first voice slot of the "voice queue", normaly the voice which wasn't used the longest time. If this voice was also assigned to a filter -> evtl. filter crackle. If all three voices are allocated, the this "longest" note will be dropped... replaced by the new one.  -> evtl. filter crackle.

So, it depends on type of drum patches which are combined, on the frequency of use, and on the style which should be played (maybe the sounds are so loud, that the popping filter is not regognized?)

I already thought about instrument groups (especially for HiHats, see above), maybe an additional feature could be the possibility to assign the group to a special voice in order to avoid that the filter is switched on/off. The implementation is a piece of cake, but I fear that the usage gets too complicated for most people... :-/ Do you know a more simple solution?

Best Regards, Thorsten.

P.S.: to avoid that somebody gets it wrong: this algorithm works great with MBFM, no crackling sounds can be regognized when voices are assigned to different instruments. The "crackle" problem is a SID specific problem, since it only provides one filter for all three oscillators. In other words: this is a resource which has to be shared.

Link to comment
Share on other sites

here are a few patches for you Thorsten (and others):

http://s12.yousendit.com/d.aspx?id=3P1VW5DIU6V480UTCJEBGD4TTR

i hope anyone likes any of them and can use them :/

they sound much better on 8580 but also pretty much recognizable on 6581.

one thing i noticed - the osc envelope gets retriggered randomly when using WT. is that a known error? it happens on both chips.

anyway - all the samples are 1OSC, max 1 ENV, max 1 LFO. no filters. i think the bassdrums and the snares are the best but the cymbals are also usable. oops i just remembered i forgot the clap  :D i'll see what i can do.

any feedback appreciated.

Link to comment
Share on other sites

i'm glad you like the patches. i can make many more.

a question - i found the patches work (sound) alot better if you stop the ocillators with the WT when the sound should stop. is that an okay thing to do? i mean do others (you?) do that in your patches?

regarding the filters - i could really use the HP and BP filter to improve the high hats but those filters applied to any other patch would worsten it quite a bit. do you think it's still okay to use such specific filters? i mean if someone will then turn on the filter for the bassdrum it will sound really bad. when the patches use no filters at all you can still put all 3 channels through a filter for "equalizing" purpuses but not if the filters are specifically defined for a patch. do you know what i mean? i'm just wondering what would be best.

then another question about the WTs - i'm not completely sure how they work but is this normal: if i set an absolute value in one WT step then i can't set it any lower in any of the next steps. i haven't experimented much with this specific case but what i did - i was trying to alternate the OSC1 sustain level between two values (lets say 63 and 31 but when it hits the first value lower than the current one the WT just kind of stops... any idea what i'm trying to say?

Link to comment
Share on other sites

i'm glad you like the patches. i can make many more.

yes, please!

a question - i found the patches work (sound) alot better if you stop the ocillators with the WT when the sound should stop. is that an okay thing to do? i mean do others (you?) do that in your patches?

Yes, I'm doing this very often. It has the advantage is, that it doesn't matter, how long the note is played, and that the sound stops with a specific tone.

regarding the filters - i could really use the HP and BP filter to improve the high hats but those filters applied to any other patch would worsten it quite a bit. do you think it's still okay to use such specific filters? i mean if someone will then turn on the filter for the bassdrum it will sound really bad. when the patches use no filters at all you can still put all 3 channels through a filter for "equalizing" purpuses but not if the filters are specifically defined for a patch. do you know what i mean? i'm just wondering what would be best.

Don't think so much about the integration of filters. Just do the sounds - if the combination of specific sounds results into strange effects, people are always able to use them on a second SID, or to record them seperately.

Focus should be to have a large variety of sounds (therefore I'm asking for help)

Btw.: Rio has also sent me some patches in the meantime

then another question about the WTs - i'm not completely sure how they work but is this normal: if i set an absolute value in one WT step then i can't set it any lower in any of the next steps. i haven't experimented much with this specific case but what i did - i was trying to alternate the OSC1 sustain level between two values (lets say 63 and 31 but when it hits the first value lower than the current one the WT just kind of stops... any idea what i'm trying to say?

Thats the normal behaviour of the sustain level. Once it has been lowered, you can only make it higher by retriggering the gate. So, the SID VCA has (unfortunately) not the same behaviour like the software implemented EG. And it especially has a bug (the famous SID ADSR bug) - the attack is sometimes delayed and "hicks up", especially on high release values.

Best Regards, Thorsten.

Link to comment
Share on other sites

ahh so that's probably also why you didnt make sustain available as the modulation target (in the mod matrix) ;)

it's a shame though cause every time the gate is triggered the VCA punches with the max volume first and you can hear that. so the workaround with WTing the note triggers and then setting the sustain for each one (very fast) won't work. maybe something can be done with the attack hmm...

any idea how to make a channel quieter?

Link to comment
Share on other sites

Unfortunately I'm not able to release a complete MBSID-D yet, since the reprogramming of the control surface is much more effort than expected - the whole engine is programmed on a different way now, and this requires conceptional changes in the CS handling.

However, on the other hand the engine itself works pretty well, therefore I've uploaded a prebuilt alpha version (binary only) which should give you the chance to optimize your drum patches, and to combine them to complete drumkits:

http://www.ucapps.de/mios/mbsid-d_alpha1.zip

This package also includes the drumpatches which I've received so far from Kokoon, Rio and Illogik. Plus my own drumkit which contains some Hubbard-like drums

Here a short preview:

http://www.midibox.org/midibox_sid/mbsid-d_demo2.mp3

As "alpha1" should indicate, the firmware is definietly not final. Editing patches is currently a little bit tricky: you can play the currently edited patch with MIDI Note C-2 of Drumkit 1. Once the patch is finished, you can upload it to the final patch location with Right Click->Store

The patches are assigned to Note C-2 ... G#3 (21 drum patches)

Each bank contains 6 drumkits, they can be selected with CC#0 (and not with Program Change yet, since this interfes with the JSynthLib "Play Patch" function) - as a final solution, I propably have to create a Drum specific JSynthLib module...

However, hope that you have the same fun with this release like me - I'm going to create much more drum sounds today :)

Best Regards, Thorsten.

Link to comment
Share on other sites

Hi Kokoon,

why is it that you say that we need a bankstick for all this?

because without a BankStick you would only be able to store a single Patch, but a Drumkit consists of 21 patches...

any idea how to make a channel quieter?

In the meantime I found a solution: it's now possible to stop an envelope immediately, with the effect that the result is more reproducible. 00 will be written into the ADSR registers of the SID, if a wavetable sequence is stopped with "END 7F"

Here an example:

Track 1 assigned to Waveform

Track 2 and 3 not used in this example ((don't assign a track to the VCA envelope anymore...)

Wavetable:

[tt]

Step      Trk1    Comment

  01  PLAY  01    Switch to Triangle

  02  PLAY  08    Switch to Noise

  03  PLAY  04    Switch to Pulse

  04  PLAY  04    Hold Pulse

  05  PLAY  14    Release Gate

  06  PLAY  14    let Gate cleared                 

  07  PLAY  14    dito

  08  END  7F    stop Wavetable and clear VCA envelope

[/tt]

set attack to 0, decay rate very short, sustain low, release high

Now you can control the volume with following parameters: VCA decay, sustain and wavetable rate

Another advantage of this method (clearing the envelope registers) is, that it fixes the envelope bug of the SID in most cases. It's still possible to provoke the "hick ups", but only, if the notes are played so fast, so that the envelope registers are not cleared between two notes. There must also be a delay of ca. 20 mS between two notes in order wait until the envelope is "seddled". But so long this is guaranteed, the SID output is more reproducible now :)

Here a link to the release which features this function (I will build this also into the main MBSID firmware to keep it compatible)

http://www.ucapps.de/mios/mbsid-d_alpha2.zip

Best Regards, Thorsten.

Link to comment
Share on other sites

  • 3 weeks later...

hi people;

i was checking out the mb-sid-d app and came to the conclusion that the patches i made are all pitched  way to high; i think i was on the wrong octave when making it  :-[

of course i was planning to fix them right away; but now i can't seem to get my MBSID working properly; so untill i fix this i can't fix the patches.

no real problem; (they were quite strange/experimental anyway) but if you want to use them i suggest you pitch them way down to get the stuff i intended.

cheers, marcel

Link to comment
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...
 Share

×
×
  • Create New...