From the original SynthMaker forum (2004–2014), with its members’ names and dates.
galaa ·
Hi all
As a means of delving into SM I have created a bass synth. If anyone fancies having a look at it and playing around with it and then letting me know any comments/criticisms/improvements I would be most grateful. you can download it from here:
http://www.theroadeyes.co.uk/SynthMaker/BassSynth.osm
I haven't spent much time on the GUI - All the compnents are just the standard SM controls.
Things I want to add:
- A glide control but have been having problems. i can get glide to work on mono signals but then when I convert the synth to mono other things don't work so I've kept as poly until I figure out what to do.
- An overdrive section to add a bit of 'crunch' to the sound
- A chorus (or other mod FX) section
Cheers
stefan ·
I will soon take a look at your synth, meanwhile, here is a very basic overdrive:
monoin in;
monoin drive;
monoout out;
out = in * (0.5 + drive * 50);
out = (out > 1.0) & 1.0 + (out <= 1.0) & out;
out = (out < -1.0) & -1.0 + (out >= -1.0) & out;
stefan ·
I like it's sound! Very... junoish. Add a noise source to the mixer as well! 🙂
A chorus and some gui tidying and this is ready for release.
galaa ·
Cheers for the overdrive code stefan, is there any chance you could quickly explain what the code is doing?
Thanks for the encouraging comments
stefan ·
Sure
Basicly it takes the input and boosts it to a louder signal (depending on the value of the drive input). The 0.5 is just there so you get a range that doesn't start at "silence".
So, lets say that you put in a sine signal that has amplitude 1.0
You set drive to 10 and hence boost the sine signal to an amplitude of 10.5 (due to the 0.5 value mentioned above)
What we then do is check if output is higher than 1.0, if it is, we set it to 1.0, otherwise we let it be.
Then we check if the output is below -1.0, if it is, we set it to -1.0, otherwise we let it be.
Feel free to ask further questions if I wasn't clear enough 🙂
galaa ·
Ah I see, so we are basically limiting the output volume of the signal so no matter how loud it gets 'inside' the overdrive unit the output never exceeds a range of -1 to +1.
I think it was the syntax that was confusing me cheers
stefan ·
Ok, is this easier to grasp? 🙂
monoin in;
monoin drive;
monoout out;
out = in * (0.5 + drive * 50);
out = min(out, 1.0);
out = max(out, -1.0);
the min function returns the smallest of the two values, the max returns the biggest. So if out is above 1.0, min will return 1.0, and if out is below -1.0, max will return -1.0.
galaa ·
Brilliant, a lot clearer thanks.
I come from a Reaktor background so while I understand the concepts I struggle with the syntax invloved in creating custom components
Thanks again stefan you're a legend!
stefan ·
Oh how quick legend status can evolve these days.
It's no biggie, really 🙂 These small snippets takes me a few secs to knock up so I don't mind 🙂
stefan ·
And oh, you could ofcourse do this without using the code module as well. hold on 🙂
stefan ·
Unfortunately there are atm missing some mono components, so I could only do a poly dist without using the code module, here it is:
galaa ·
I had already got to that one stefan. You must be slipping! (joke!)
Is it possible to create a noise generator in SM as I didn't think there was any way of generaing random numbers
stefan ·
You can create a pseudo-noise generator by feeding a sine oscillator back into it's own phase input. If the feedback gain is low, you get a "saw-alike" waveform. With high feedbacks you'll get noise.
galaa ·
Cheers stefan I'll give it a try
Tom7777 ·
Thanks for these 🙂
galaa ·
works a treat. Thanks. you were right, you do have to use suprisingly high feedback values
malc ·
All looking great galaa. Nice sound to it. Always great to see what other people are doing with SM. 🙂
Kitchen Sink ·
A min-max limiter (clipper actually) is probably one of the nastiest sounding distortions you can get. Usually people try to avoid digital clipping at all costs.
Here we enter the world of waveshapers, saturators, tube simulators etc.
There's some information to be found at http://www.musicdsp.org/
stefan ·
In my synth, I use a oversampled clipper. Hence you heavily reduce the amount of aliasing noise that normally occurs when using digital clipping.
Shifrin ·
Nice synth galaa, thanks for posting the .osm, always useful to see how other people are doing things 🙂
Shif.
sluggo ·
hi there,
I've been poking through your synth and I'm hoping you could answer a few questions for me. This is my first shot at synth building, so I'm lacking a bit of background in this area (but learning fast).
1. filter module. what does the multiplying of Cut (x128), Res (x2) and EG (x30) do? Is it that Cut x EG can have a maximum value of (128x30)=384, which when converted from pitch to freq gives you your desired maximum frequency? and Res=max of 2 which is a suitable amount for a lowpass filter? I'm sort of guessing here.
2. Amg EG: why are the EG controls each multiplied by 44100? Furthermore, what are the "default" values coming from the knob? for example, for the Attack if you multiply by x1, what would the min and max value be? ... are knob min and max always 0 -> 1?
3. in modules such as the filter knob module, what is the significance of linking the "F" from the MGUI to the Label, and what is the significance of having an input on the label?
Thanks,
sluggo
galaa ·
Hi sluggo.
I'm by no means an SM expert, so I'll try and explain what I was doing when I built my synth. To be honest I may not have wired it up right and it may only work by luck.
Here goes:
1. filter module. what does the multiplying of Cut (x128), Res (x2) and EG (x30) do? Is it that Cut x EG can have a maximum value of (128x30)=384, which when converted from pitch to freq gives you your desired maximum frequency? and Res=max of 2 which is a suitable amount for a lowpass filter? I'm sort of guessing here.
- Cut - In this post Basic Synth jorge talks about controlling the cut-off point of a filter using Pitch instead of freq. the freq input is expecting a value of 0-1 which is a linera scale, this means that you will have too much 'precision' at high frequencies. Instead use a scale of 0-128 which corresponds to MIDI note numbers (ie 57=A4=440Hz) this will give you a kind of logarithmic scale, or at leqast it sounds about right to my ears.
- Res - The max value of 2 is just a value that sounded right for my purposes. I chose this value as when at max it is just starting to go into self-oscillation. If I'd wanted a more severe effect I could have used a higher value.
- EG - The EG Amt determines how much the cut-off point is affected by the filter EG. The envelope is used to scale this value whichis then added to the cut-off point. So if the EG Amt knob is turned up full then the envelope can add 30 to the cut-off resulting in a very obvious difference. But with smaller EG Amt values you can have more subtle changes.
2. Amg EG: why are the EG controls each multiplied by 44100? Furthermore, what are the "default" values coming from the knob? for example, for the Attack if you multiply by x1, what would the min and max value be? ... are knob min and max always 0 -> 1?
The envelopes use the sample rate timer as their time base and the controls output default values of 0-1. So by multiplying 44100 by the knobs output (0-1) you can achieve envelope time setting of anywhere from 0-1sec. If your sample rate is set to 48kHz you would need to use a value of 48000 instead to achive a max setting of 1sec.
3. in modules such as the filter knob module, what is the significance of linking the "F" from the MGUI to the Label
To be perfectly honest I don't know the answer to this one. All the controls I've used are the standard ones that come with SM. I think jorge or malc would be able to answer this one
and what is the significance of having an input on the label?
Do you mean the 'S' input on the knob? This allows you to connect a String component so that you can name you control. I prefer to put my String component actually inside the knob so as to reduce the clutter on the screen in my schematics.
Hopefully I've been able to help you, if not feel free to berate me and demand more.
If anyone else reading this finds anything I've either missed out or got wrong feel free to ridicule me and put me right
galaa
malc ·
sluggo wrote: 3. in modules such as the filter knob module, what is the significance of linking the "F" from the MGUI to the Label, and what is the significance of having an input on the label?
The link you're talking about goes from the MGUI 'View Width' output to the Label Section module. The label section positions itself horizontally on the knob module panel based on the width of that panel. Try resizing the knob module and you'll see that the label always stays in the centre.
As galaa said, the String input to the label is to provide the text. You could just as easily have this inside the label as galaa suggests.
However, one reason for having the text outside the module is to allow for syncing. Modules can be synced so that when one changes so do all the others.
If you had a load of synchronised label modules and decided that you wanted to change the font size say then you'd only need to change one of the labels and the rest would automatically update. If you put the text inside these modules then the text would get synchronised too and they would all look the same.
Kitchen Sink ·
Isn't the "synchronized" concept a bit bad programming? I mean, if synchronized elements are used as a kind of work-around to have the same object instance visible in several places. Are they the same instance, or are they really synchronized copies? Of course, synchronization can have its uses, but this font/label thing smells like a kludge that will later on collapse in a big unmaintainable mess.
I'd like to thing of all components as objects, as in object oriented programming. One should be able to plug in an entire component as such, without needing to connect all (maybe dozens of) individual wires. Or what do you think? Currently there's no such thing as "interfaces" (think Java, Delphi's Object Pascal, COM, C++ pure virtual abstract base class, etc.).
In Synthmaker, an interface could be a collection of input/output "jacks", bound together as something you can plug with one wire. Then of course you could split the interface apart, if you wanted to patch only some parts of it, with component "signals" coming from various places. IMO, interfaces would be a huge step for making Synthmaker quicker and easier to use. Real polymorphism and object reuse. 🙂
sluggo ·
galaa, thanks a lot for the explanations. Everything is quite clear. How did you know abou the envelopes and sample rate timer, is this how most envelopes are implemented in dsp / modular synths?
galaa/malc, just to make sure we are talking about the same thing with the label. The label module has a string linked to it along with an input module. So I know that the string puts the text in the label, but I don't know why there is an input module.
thanks
malc ·
sluggo wrote: So I know that the string puts the text in the label, I don't know why there is an input module.
You don't need the Module Input (called label) if you're setting the text inside the knob, so this can be deleted.
galaa ·
sluggo wrote: How did you know abou the envelopes and sample rate timer, is this how most envelopes are implemented in dsp / modular synths?
I figured this out with a combination of taking the example synth apart and from stuff that other people posted on this forum. As for other dsp/modular systems I don't know. I come from a Reaktor background and that works in a different way so I find things like this a bit confusing at first
Kitchen Sink ·
malc wrote:
sluggo wrote: So I know that the string puts the text in the label, I don't know why there is an input module.
You don't need the Module Input (called label) if you're setting the text inside the knob, so this can be deleted.
But that's the kind of question you'll be getting a lot, after Synthmaker goes 1.0... 😉 I don't say it's unintuitive, but it's a bit too puristic programming. A combined data value / input connector would be much better.
It would work like this:
- if you want to get the value from somewhere else, you can override the data value by connecting something to the hybrid value/input.
- but if you want to enter a value directly, without creating a new value component cluttering the space, or deleting the input from inside the module, you can type it straight in the module input (click the input to activate in-place edit)
Synthmaker wouldn't need a conditional statement for this, because it's known at compile-time if the value should be used, or if it's overridden by an input connection.
This would improve workflow a lot and make Synthmaker much easier to use for beginners. It would also be a practical implementation of the "property inspector" thing I was after. IMO, every mouse click counts (no joke).
Do you understand what I'm trying to say? I'm lousy at describing my ideas in words, so maybe I should draw a picture.
Tom7777 ·
Kitchen Sink i know what you mean but i think the way SM works is much better and i dont really mind this at all as it allows you to do multiple things and not just the default that that modules designed for.
It would work like this:
- if you want to get the value from somewhere else, you can override the data value by connecting something to the hybrid value/input.
- but if you want to enter a value directly, without creating a new value component cluttering the space, or deleting the input from inside the module, you can type it straight in the module input (click the input to activate in-place edit)
I think that might work well as a right click command and a propeties box to enter the values, have empty values for each unless entered and any entered value gets made null by an incoming signals so connections will be perfect still and the system remains the same as it currently is yet then has a more simple/faster way to do it.
This would improve workflow a lot and make Synthmaker much easier to use for beginners.
Maybe but i think alot of people are having trouble doing these things because they are either completely new to modular environments or have used app similar and SM uses slightly different ways of doing these things.
Also as the apps still in beta the resources/help/tutorials are building up slowly but in the future there should me much more and a new user will be able to follow a simple guide and get to know whats going on.
But yeah that would speed up and make things a bit more simple. But remember complexity = originality so the old method of being able to connect everything should always stay within the program i think. 🙂
jorge ·
Hi Tom,
Tom7777 wrote: I think that might work well as a right click command and a propeties box to enter the values
I think it is very bad user interface design to use dialog boxes when there isnt a more user friendly way of interacting. So far, we have been trying to avoid dialog boxes as much as possible. You'll notice that on for example in-line editing, action panel buttons, loads of context sensitive stuff etc... Having a popup dialog box appearing when not absolutely necessary is IMO very distracting and not user friendly. The fact that most windows applications work that way is not a good reason for us to go the same way.
Tom7777 ·
hi jorge, I didn't actaully want this feature i think you read my post the wrong way, i just mean that the best way to include it if you did want to add this ever would be to do it via that type of system. Im all for complex things and think the way synthmaker handles events perfectly using the system it currently does and i don't want this to change at all.
The main reason i replied to the post was to show Kitchen Sink that i could understand what he was saying as nobody had replied to him.
Do you understand what I'm trying to say? I'm lousy at describing my ideas in words, so maybe I should draw a picture.
In my opinion i don't mind question/properties/dialog boxes but i think that as you are trying to avoid them it makes SM more original in a way. Another idea to do this without the use of popups is to have a option on the file/options bar at the top of the screen called Module Properties which is greyed out when no module is selected and is able to be selected when one is. That way there would be no popups and you could have control over input names ect like the over method only when chosen. 🙂
Kitchen Sink ·
I'm with Jorge here, all kinds of pop-up dialogs suck. One of the most horrific examples is Cubase SX's score editor, where you can't even edit text labels or chord symbols without using a separate "edit text" dialog box. I'm all for in-place editing.
Ayway, I drew some pictures about what I mean with the combined input/value connector:
As you can see, almost all that's required is already there in Synthmaker. Only the in-place editing of values without opening the modules is missing.
IMO this would reduce the need for clicking and opening modules just to change some values inside modules. It would also be very convenient to see all the parameter values ("properties") of a module this way. What do you think? 🙂
Tom7777 ·
I think this would be good as a seperate module or something because if you change the way the componants/modules are functioning it means updating all older modules which always is annoying 🙁 But as a seperate module definately that would be good.
Another idea to do this without the use of popups is to have a option on the file/options bar at the top of the screen called Module Properties which is greyed out when no module is selected and is able to be selected when one is. That way there would be no popups and you could have control over input names ect like the over method only when chosen.
malc ·
It's an interesting idea Kitchen Sink. Thanks for the pics - very handy.
The input connector labels are currently used to provide a short reminder of what the connector does. If you use this in the way you're suggesting then you'll lose this information.
How would this fit in with the primitives? Would you expect them to function in the same way?
This would only work for String, Int and Float connectors I assume? I mean you can't set the value of a poly, MIDI or Mouse connectors for example. Would there be no label in this case?
I'll have to think more about this. My initial thought is that if you need to have parameters that are editable from outside the module then that's exactly what the Module GUI stuff is for.
stefan ·
malc wrote: It's an interesting idea Kitchen Sink. Thanks for the pics - very handy.
The input connector labels are currently used to provide a short reminder of what the connector does. If you use this in the way you're suggesting then you'll lose this information.
How would this fit in with the primitives? Would you expect them to function in the same way?
This would only work for String, Int and Float connectors I assume? I mean you can't set the value of a poly, MIDI or Mouse connectors for example. Would there be no label in this case?
I'll have to think more about this. My initial thought is that if you need to have parameters that are editable from outside the module then that's exactly what the Module GUI stuff is for.
Also, take a look at this:
In-place value edit
malc ·
Kitchen Sink wrote: But that's the kind of question you'll be getting a lot, after Synthmaker goes 1.0...
I just wanted to come back to this. The question was in relation to part of a schematic posted by galaa (shown below).
This was a modification galaa made to a standard module. Whilst it does what he wants it could produce unexpected results under some circumstances. This is because the links from the Module Input and the String components will be added together at the input to the label (the first is appended to the second to make one string).
(absolutely no criticism is meant by this galaa btw 🙂)
My point is that we can't really stop people from programming SM how they like and if they share their schematics with others and then someone doesn't understand what they've done then there's not alot we can do about it 🙂
Kitchen Sink ·
malc wrote: The input connector labels are currently used to provide a short reminder of what the connector does. If you use this in the way you're suggesting then you'll lose this information.
Well, I thought it could be selectable from preferences or something. Or the values could be shown only when the module is selected. Currently, the input names are shown twice:
Currently, the module's function (what it does and why) must be identified from its name, input types, and input names. But I'd say there's still a very important aspect missing: its internal parameters. Don't you agree?
How would this fit in with the primitives? Would you expect them to function in the same way?
You mean the stock components that are "atomic" i.e. not modules? Only if they have a value to edit. I mean that the in-place editing should only be active if the input is internally connected to a value (or another editable input in a module inside). The connectors that can be edited, should look a bit different to indicate this.
This would only work for String, Int and Float connectors I assume? I mean you can't set the value of a poly, MIDI or Mouse connectors for example. Would there be no label in this case?
Yes, that's true. If it can't be edited, it would show the label, and it would look a bit different. And then there's the question of bus types. For them (if they have editable values inside) there could be some kind of value list, but that's really more advanced stuff that can be added in version 3.0 or something.
My initial thought is that if you need to have parameters that are editable from outside the module then that's exactly what the Module GUI stuff is for.
Well, what do I really need... Like you guys have shown so many times, there's almost nothing Synthmaker can't do, but this in-place value editing would be very convenient and save a lot of mouse clicks. Every mouse click really does count. Believe me, some users actually count mouse clicks. (at work, we develop Windows applications, and several times people have indeed calculated and documented how many key presses and mouse clicks a particular task needs, and how much that sucks)
malc ·
Kitchen Sink wrote: Every mouse click really does count
I'm totally with you there 🙂.
This subject seems to have got itself spread over several threads. My latest thoughts are here
galaa ·
I know this post has changed tack somewhat but I just thought I'd let those of you who are interested know that I've updated my synth. It now includes a phaser effect and overdrive and the GUI has been tidied up a bit
http://www.theroadeyes.co.uk/SynthMaker/BassSynth.osm
malc ·
Err..what, oh yeah your synth - sorry about that galaa 😉
I'll have a look thanks.
malc ·
Looking good galaa. The delay and phaser were not working. The second and third outputs from the Master module were not connected to anything. I used the output from the first connector and it worked.
Thanks.
galaa ·
Yeah, sorry I realised that I hadn't reconnected them as soon as I'd posted. I've updated the link so it'll work from now
infuzion ·
galaa wrote: Hi all
As a means of delving into SM I have created a bass synth. If anyone fancies having a look at it and playing around with it and then letting me know any comments/criticisms/improvements I would be most grateful.
Very cool sounding! For some reason, on my SE0.9.3g none of the controlls showed up on the front pannel. Easy to fix; I connected a module:GUI:ToChild to all the sub-modules' MGUI (V) outuput, except the 1st level module, where I had to "hard-wire" the ouput to the GUIs' input. So here it is:
http://rapidshare.de/files/1701446/BassSynth_050511_infuzion.rar.html
(190,485 bytes Open the link in a new tab/window, scroll to the bottom, then click on {Free}. The link will be on the bottome of the new page.)
Which brings me to these questions:
May I use parts of the code in my own creations?
May I branch my own version (with full credit)?
cheers
unkargherth ·
Nice Work Galaa !!!
Only a sugestion. Make the ouput of EG AMt ( in filter only) bipolar ( mult by 2 and substract 1) Then when knob is less than 0.5 you get a nice inverted ADSR. Also chaining two filters in series would be nice ( but carefull on Rezy)
Wrote something here? To have a post removed or your name hidden, write to [email protected].