Creating a simple synthesizer in Pure Data – Part II

Level: 
Tools: 

Part I: A simple synthesizer in Pure Data – Part I

The next steps:

What we are going to do now is to add an ADSR envelope to our synthesizer and then allow it to play more than one note simultaneously.

We also have a lot of new concepts to introduce, including some that are very basic and that, if you tinkered a little with your patch and with pd in general after the first tutorial, you may be already familiar with.

Adding the envelope

ADSR Envelope

Roughly speaking, an envelope changes the signal amplitude through time. The ADSR envelope does this based on four variables: Attack, Decay, Sustain and Release. Excluding Sustain, they all represent a duration in time. Sustain represents amplitude, not duration. Here's a quick explanation:

  • Attack represents the time from the key press to the moment the signal reaches full amplitude. Amplitude starts at zero (silence) and, during the amount of time given by the Attack variable, rises to one (maximum amplitude).
  • Decay comes in after Attack and represents the amount of time for the signal to reach the amplitude given by the Sustain variable.
  • Sustain is the amplitude that will be maintained while the key is down.
  • After releasing the key, Release is the amount of time before the amplitude drops to zero.
ADSR Envelope
ADSR Envelope

Start by adding four sliders (Ctrl+Shift+H for horizontal or Ctrl+Shift+V for vertical) and giving them the labels A, D, S and R. This can be accomplished by right-clicking the sliders and choosing Properties, if you don't remember. In this dialog, we are also going to set the range of each slider and maybe set their send symbols as well. We will get into send soon, but let's talk about ranges first.

In the Properties dialog, you will notice a button labeled lin. When clicked on, this button's label will toggle between lin and log, representing linear and logarithmic scales, respectively. You may also have noticed that when changing from lin to log, range fields set to zero will change to a non-zero value.

Linear and Logarithmic scales

Logarithmic scales are very useful when dealing with a large range of quantities and when dealing with most things related to human perception. The decibel, used frequently to measure sound pressure levels, is a logarithmic unit and our own musical scale is also a logarithmic scale of pitches. I'll give now an example of how useful it also can be for quantities related to time.

Imagine that you want to select a value between 1 millisecond and 20 seconds for the duration of an event using a slider that is 128 pixels wide (no need to imagine too much, this is exactly what you want to do now). While the perceived difference between a sound that decays in 10ms and other that decays in 110ms (difference of 100ms) is very pronounced, the difference between 19,000ms and 19,100ms (also 100ms) will hardly be perceived by any human being.

In a linear scale, each pixel you move in this slider will represent ~156ms. This means that you will have, perception-wise, a very low precision when dealing with small values while you'll have a precision higher than you need with the higher values. The logarithmic scale fixes this problem by giving more space to the lower values and less space to the higher ones.

When using a linear scale, equally spaced markings in the scale will represent equal distances between values. In a logarithmic scale equally spaced markings will represent equal proportions between values.


Equal distances vs. equal proportions

Since we can't establish a proportion between zero and other values, your slider will never be able to output a zero in log mode. No finite value in dB, for example, represents absolute silence.

You can choose whatever ranges and scales you want now. For time-related sliders (Attack, Decay and Release), I think a range from 0 to 10 seconds is a good choice. Remember that you need to use milliseconds, so it's a range from 0 to 10,000. For Sustain there is no choice, really, because you need a value between 0 and 1.

If you choose linear scales, then just fill the Properties dialog with the appropriate values and you're done. With logarithmic scales, however, we need to add an offset so we can have a range that includes zero. Just move the range a little higher (e.g., 10 to 10,010 in time sliders and 0.1 to 1.1 in Sustain), then connect each slider to an operator that will give you a range starting from zero (in the given example, - 10 for time-related sliders and - 0.1 for Sustain).

Sliders with offset values
Sliders with offset values

Now we need to send, the values from the sliders so we can receive them elsewhere. It will be slightly different depending on whether you offset the output from the sliders or not.

send and receive

The objects send and receive (also abbreviated to, respectively, s and r) can:

  • make your patch cleaner by removing wires from inconvenient places;
  • establish communication between your patch and other patches running at the same time.

First you create a send object with a unique name passed as argument and connect some x object to it. Then you create a receive object with the same name and connect it to some y object. This will work exactly the same as if x and y were connected directly, with the difference that y can even reside in another patch!

Of course, this also means that you cannot run two instances of this patch (the one with send) simultaneously, because there would be two send objects with the same name and this is not allowed. You can, however, use as many name-fellow receive objects as you like.

send and receive in the same patch and between two different patches
send and receive in the same patch and between two different patches

When you open the Properties of some objects, you have the option of setting a send symbol and a receive symbol from there. This will work exactly like connecting it to send and receive objects, but allow a cleaner (and more obscure) connection. To give a tip about the existence of such connections, objects using this method appear without their inlets and/or outlets (depending if you are using receive and/or send symbols) so you know they are silently sending or receiving stuff. Their invisible inlets or outlets are still usable though.

There's a workaround to the problem with multiple instances of the same patch with a send object, but I think it's too early to talk about that. It's about using the $0 variable, take a look at this if you're curious.

If you're using only the sliders, without adding offsets to the values, just open the Properties dialog of each of your sliders and set your send symbols to a, d, s and r. I think you know which is which. Have in mind the fact that pd is case-sensitive, so 'a' is not the same as 'A'.

Note the absence of outlets in the sliders, due to the usage of send symbols
Note the absence of outlets in the sliders, due to the usage of send symbols

If you have added the offsets, then you cannot send your values directly from the sliders. You will need to add four send objects (let's use the abbreviated version: s): s a, s d, s s and s r, and then connect each of the offset values to the corresponding send.

Using send objects
Using send objects

Now, because we want to be able to play more than one note (eventually), we're going to take a part of our patch and move it to an abstraction.

Abstractions and Subpatches

Basically, abstractions and subpatches allow you to use one entire patch as an object inside another patch.

In the case of the abstraction, the patch that will be used as an object is stored in another file. If you create a patch and save it in the same folder as the patch you are currently working on, you can then invoke it by naming an object after the patch you created, without the .pd extension. If you create multiple instances of this object, saving the changes will apply them to all of the instances, naturally.

A subpatch is almost the same, but it's not stored in another file and the changes applied to one of them are not reflected in others, even if they have the same name. They are created by calling an object pd followed by an optional name.

The objects created using these methods can have inlets and outlets represented internally by inlet, inlet~, outlet and outlet~ objects. The order of inlets and outlets will be the same, left to right, as the order the objects appear inside the abstraction or subpatch.

Go to File→New (Ctrl+N). Now, in this new window, File→Save As... (Ctrl+Shift+S) and save it to the same folder as your patch with the name note.pd (you can write just note). In the near future we'll also be using another abstraction so, in the same window repeat the Save As... procedure to save it as adsr.pd. Now, you should have, in the same folder as your main patch, two empty patches named note.pd and adsr.pd. You can close this window now and go back to your main patch.

Create a note object and place it in some empty spot. To edit this subpatch, you can either right-click on it and select Open, or left-click it while in Execute Mode. Just open it. Yes, I just made you close and open the same file again, but with one difference: when you open an abstraction from a patch that contains it, every change you make to it is instantly effective to this particular instance of the abstraction. When you save it, the changes are globally applied.

To prove it, as soon as you open note for editing, insert both an inlet and outlet~ objects (we want to input control data and output signal data) with some empty space between them. As soon as you add the objects you will notice that the inlet and outlet will appear instantly in the object inside your main patch.

In the main patch, select everything from unpack to the first *~ and cut (Ctrl+X), then paste inside the abstraction (Ctrl+V). Place the note object in the empty space where the cut objects were and connect it so that it replaces that group of objects. Inside the abstraction, connect the inlet to unpack and *~ to the outlet~.

Remember to save both the abstraction and the main patch. Right now, our patch is doing the exact same thing it did before we started but, with the changes that we made, it will be a lot easier to fulfill our objectives.

The fun starts now. No, it's true.
The fun starts now. No, it's true.

As you know, the *~ inside note.pd sets the amplitude of each note depending on its velocity. Now we want something more complex than that and that's where we will insert the adsr abstraction. When we're done, this object will be responsible for changing the amplitude of our oscillator dynamically, following the envelope defined by the sliders in the main patch.

  • Inside note.pd, insert the adsr object somewhere;
  • open the adsr.pd abstraction and insert an inlet and an outlet~;
  • back in note.pd, insert a new *~ between phasor~ and the existing *~, deleting the existing connection and connecting the new *~ to both (use the left inlet);
  • connect the second outlet of unpack to adsr and then the latter to the *~ you just created.
The current state of note.pd
The current state of note.pd

With adsr properly placed and connected, most of the remaining work will be done inside adsr.pd. I'll split our next step into 3 parts so that, at the end of each part, you can test if the corresponding phase of the envelope is working as intended. At the beginning of each part, I'll introduce the needed objects.

Before starting, insert four receive objects in adsr.pd (again, using the short version: r): r a, r d, r s and r r. This is how we'll read values from the sliders in the main patch.

Attack

In this part, you need to become acquainted with select, trigger, float and line~.

select

The select object (or the short version, sel) will compare the input with its arguments. Each of its outlets will send a bang if the input is equal to the respective argument. There's an extra outlet from which the input value will come out, untouched, in case no argument is equal to it.

If there's only one argument, the value can be changed with the right inlet.

trigger

trigger (short version: t) is used when actions must be performed in a specific order. You can specify any number of arguments and there will be an outlet for each of them. The arguments will represent the type of the output for the respective outlet. The outlets will activate from right to left, so the last data type you wrote will be the first to come out.

For now, we must be aware of two types that can be used as argument to trigger: bang and float (you can use b and f, respectively, just as well).

  • bang will output a bang it does not matter what the input is;
  • float will output the input as a number.float
float

float, or f, just stores a number. When create an object and name it with just a number and nothing else, it is also a float object, but in this case it is initialized to the value you gave. It will output the stored value when it receives a bang in its left inlet.

When it receives a number, it will change its stored value. If the number is received by the left inlet, it will instantly output this new value. The right inlet will, in its turn, silently change the stored value without outputting anything. This is basically what this hot and cold inlets thing is all about. We'll get to this subject soon.

line and line~

Both objects will output a stream of numbers that will reach the target value in the specified ramp time. You can pass the ramp time to the second inlet and then pass the target to the first inlet or you can pass both values to the first inlet together. Two important things to remember:

  1. it will only start the ramp when a value is passed to its first inlet (the one in the left), also called the hot inlet. We'll talk about that soon;
  2. it will not remember the last ramp time you used, meaning that you will have to pass one every time.

If you pass a target alone, without passing a ramp time, it will jump immediately to that value.

While line~, like other signal objects, outputs with a frequency equal to your system's sample rate, the output rate of line can be set by passing it as an argument (the first argument you pass is the initial value and the second is the output rate or grain) or by passing it to the third inlet. The default is 20ms.

In my instructions, if I ask you to connect an object to another that is not in your patch yet, it means that you must create it in that moment and then make the connection. Make sure you have lots of space between inlet and outlet~ before starting.

In adsr.pd:

  • insert, just above outlet~, a line~ object and connect the latter to the former;
  • connect the inlet to a sel 0;
  • connect the right outlet of sel 0 to a t b b b (a trigger with three bangs);
  • connect the third outlet (the first from right to left) to a 0 (just a zero) and the second to a pack 1 0;
  • connect r a to the right inlet of pack 1 0;
  • connect both 0 and pack 1 0 to the left inlet of line~.
adsr.pd with Attack working, but nothing else
adsr.pd with Attack working, but nothing else

The attack is ready to be tested! Let me explain what we did.

The line~ object is the heart of this abstraction. In the end, we'll have three pack objects to group target and ramp time values and then send them to line~. Each one of the pack objects will be responsible for one phase of the envelope, so you could add a comment above the one we just inserted (Ctrl+5) and label it Attack, so you know it's function in the future.

The value coming from the inlet and entering sel 0 is the velocity of the note played. Every time you receive a note off event (velocity 0), the left outlet of sel 0 will send a bang. Since we're interested, at least for now, in the attack of the note, we connected the trigger to the right outlet of sel 0. This outlet is activated every time we get a value that is not 0, which means a key was pressed. The output of this outlet is not a bang, but the value that came in. Since our trigger only contains bangs, we basically ignored the value that came out and converted it to bangs.

The first bang from our trigger is connected to the 0, so it will immediately set the line~ value to zero. The second bang will pack the value 1 together with the value of the Attack slider. When line~ receive these values, it will start a ramp from its current value, zero, to 1 with the duration received from the Attack slider. We intentionally left an unconnected outlet in the trigger.

Decay (and Sustain)

We will now get to know the delay object and then I'll finally talk about hot and cold inlets.

delay

The delay object outputs a bang after a delay that is passed to it, in milliseconds, as argument or by its inlets. You can change the delay time by sending a value to any of the inlets, but the right inlet (cold inlet) will not trigger the delay immediately, while the left inlet (hot inlet) will. You can just send a bang to its left inlet to trigger a delay with the duration that was previously set.

Hot and cold inlets

The intended way of entering data to objects with more than one inlet is from right to left. Pure Data kind of enforces this by having only one of the inputs, the left one, to cause the object to output data. This is why we call it the hot inlet. All the other inlets are cold inlets, meaning that they don't produce output when you pass information to them. He have already seen a lot of this happening in our work, but there was no need to worry in most cases, because pd acts consistently.

Right at the beginning of our main patch, we used objects that would not work correctly if their inputs came in the wrong order, like pack and poly. The reason why they worked is that the output of the objects that we connected to them also came, conveniently, from right to left. When we use a pack to which the inputs will come from separate objects, we'll have to take care to send them in the correct order. This is the kind of situation where the trigger object shines.

In adsr.pd:

  • connect the remaining unused outlet of t b b b to a delay object;
  • connect r a to a + 1 (left inlet) and then the + 1 to the right inlet of the delay you just created;
  • connect delay to the first inlet of a pack 0 0 0 (you can put the comment Decay above it);
  • connect r d to the third inlet of the pack object and r s to the second;
  • connect pack 0 0 0 to a route 0 object;
  • finally, connect this route 0's left outlet to line~'s left inlet.
Decay and Sustain working
Decay and Sustain working

Decay and Sustain are both working and ready to be tested.

The objective of the delay object here is to wait until the Attack phase is over to kick in with the Decay. That's why we connected the Attack slider to set the delay time. The + 1 is here because without it, when the Attack value is minimal, Decay comes in too early for some reason.

There's also another hack here. We used a pack with three arguments where only two values were needed. This is because we want to avoid inputting data to the hot inlet while using our sliders. The pack object as we created it will only output something when it receives a bang from delay. If we had only two inlets in pack, r s would need to be connected to the hot inlet and this would cause undesirable output every time the slider value changed. To eliminate the unused value, we used a route 0. If you don't understand this, just read the route explanation in the first part of the tutorial again. This is not exactly the purpose of the existence of route, but it does the trick.

Release

In this last part, we also have some work to do in note.pd, but let's finish everything in adsr.pd first so we don't have to come back.

You may have noticed that, until now, we have only used the right outlet of sel 0, because this outlet shows us when a key is pressed. Now we are interested in knowing when a key is released, so I suggest that you move the r r object to the left side of the patch before following the next instructions, so it's closer to the left inlet of sel 0.

  • Connect the left outlet of sel 0 to a stop message (remember it's a message (Ctrl+2), not an object) and connect this message to the left inlet of our delay
  • also connect the left outlet of sel 0 to a new pack 0 0 object. You can put the comment Release above it;
  • connect this pack 0 0 to the left inlet of line~;
  • connect r r to the right inlet of the same pack 0 0 object.

We're done with adsr.pd.

Release not working yet
Release not working yet

The reason why Release is not working yet is that we programmed note.pd to multiply the signal by 0 when the key is released and this causes the note to silence immediately. Now we are going to make the right operand of this multiplication change only when a key is pressed and not when it is released.

In note.pd:

  • break the connection between unpack and / 127;
  • connect the right outlet of unpack to a sel 0 object;
  • connect the right inlet of this sel 0 to / 127.

Now only non-zero values will reach this division and the problem is solved.

Release working
Release working

The stop message that we used in adsr.pd is a message that delay understands as an order to interrupt its countdown, so the bang does not get triggered. We need that because the note can be released during the Attack phase, before Decay starts, and we would have a problem because this delay would trigger the Decay phase after Release had already started.

We're done with our envelope now! You can experiment with different configurations and you may be surprised by how much applying an envelope can transform the perception of a sound.

Polyphony

To add polyphony to our synthesizer will be a very easy task now, because we're using abstractions that we can easily reuse. Anyway, before we start adding stuff, we need to make a small adjustment to the sawtooth wave that we've been using.

You should remember, from the last tutorial, that phasor~ generates values from 0 to 1. This means that it only “occupies” half of the “signal space” available, that is from -1 to 1. When two signals are mixed together (two sounds played together), what happens is simply that each sample from one signal gets added to the corresponding sample of the other signal. Knowing this, it's not hard to understand that the minimum possible sample value from mixing two of those sawtooth waves is 0 (when both values are 0) and the maximum is 2 (when both values are 1). We would be not only wasting space, but also using space that is not available and therefore clipping the signal. When there are values greater than one, those values are simply considered to be 1 and this is what we call clipping.

The sum of two sawtooth waves with a 1:2 frequency ratio.
The sum of two sawtooth waves with a 1:2 frequency ratio. In the left we have a range from 0 to 1 and in the right from -0.5 to 0.5.

When the signal is clipped, the waveform changes and so do the timbre of the sound produced. Sometimes this is the desired effect, but that's not our case now, so we're going to insert a –~ 0.5 object after the phasor~ in note.pd.

phasor~ with an offset
phasor~ with an offset

Now on to the last steps, in the main patch:

  • change poly first argument to the number of voices you want, e.g., poly 4 1 for four voices;
  • give route one argument for each voice you have, e.g., route 1 2 3 4 for four voices;
  • duplicate the note object (Ctrl+D) as many times as needed, one for each voice;
  • connect each route outlet to one of the note objects, leaving the rightmost outlet alone;
  • connect every note object to the *~ object, where the first note was already connected.
Finished!
Finished!

You're done! Just save your patch and have fun playing!

Here's a picture of the finished patch with all the abstractions:

When making changes to our abstractions in the future, having multiple instances in use will not be a good idea because, as I said before, the changes you make in an abstraction are only applied to all of them when you save it, but are immediately applied to the particular instance that is currently opened. The best way to make changes to a note object is to just change poly's first argument to 1 and leave everything else intact, then open the note.pd abstraction from the first note object (right-click→Open or left-click in Execute Mode).  Your synthesizer will go back to a monophonic state while you make your changes, but you'll be able to test each change instantly. When you are pleased with the result, just save your abstraction, then change back the first argument of the poly object to the number of voices you have.

That's all for today

Now we're able to do a lot of different sounds using our envelope, but that's not enough. In the next tutorial, we will create a simple dynamic filter to finally have a subtractive synthesizer. As a bonus, I'll also show how to create a simple and clean user interface to make your synthesizer more user-friendly. I hope you're finding this tutorial series useful! Your feedback is always welcome.

Written by Eduardo Mezêncio

Comments

Thanks so much for the wonderful tutorials! It's real clear and explains a lot that I just wasn't getting. I'm trying to build a sample-based instrument engine in pd and I'm having a spot of bother around abstractions and $0. I'm trying to set the release on the samples using the [vline] object in an abstraction but I'm a bit stuck. I was wondering if there was any way you might be able to take a look? It's a bit big to go into here but I thought I'd ask anyway, Many thanks again!, Graham

Hi! I'm glad you liked the tutorial. I'll gladly help if I'm able to. I suggest that you ask your questions here: http://forum.pdpatchrepo.info/ . After posting you can even place a link here for me to take a look. I'm suggesting that because even if I'm not able to solve your problem, I'm pretty sure someone there is. It's a very nice community. And also, it's nice to remember your question can help others in the future.

Hi there are using Wordpress for your blog platform? I'm new too the blog world but I'm trying to get started and set up my own. Do youu require any html coding expertise to make your own blog? Any help would be really appreciated! my homepage: visit now (<a href="http://Youtube.com/watch?v=IlziPyuQSBI">Grazyna</a>)

Allowing leading wheel being locked in place is another protective measure ince you are aware hat an unseen pebble will nnot likely cause the stroller too lose its course. A foot brake allows yyou to lock the wheels which means that your precious twins won't roll away accidentally in order to stop on an incline. A phsical retailer just cannot offer shoppers the level of selection the world wide web can. Feel free to surf to my blog :: baby strollers - https://www.youtube.com/watch?v=S0eOdRWtHI8

Does your blog have a contact page? I'm having trouble locating it but, I'd like to shoot you an e-mail. I've got some recommendations for your blog you might be interested in hearing. Either way, great blog and I look forward to seeing it expand over time. my web-site: <a href="https://venorex.wordpress.com/">Doaa Hosny</a>

Hi! This post couldn't be written any better! Reading tbis post reminds me of my good old room mate! He always kept talking abot this. I will forward this article to him. Faitly certain he will have a good read. Many thanks for sharing! my web site ... Anja - https://Www.Pinterest.com/flextracks/

Oh my goodness! Incredible article dude! Thanks, However I am having problems with your RSS. I don't understand the reason why I am unable to subscribe to it. Is there anyone else having identical RSS issues? Anyone that knows the answer will you kindly respond? Thanx!! My homepage <a href="https://venorex.wordpress.com/">Amir Ali</a>

Please let me know if you're looking for a writer for your site. Youu have some really good posts and I believe I would be a good asset. If you ever want to take some of the load off, I'd really like to write some material for your blog in exchange for a link back to mine. Please shoot me an e-mail if interested. Thank you! Stop by my blog post Amir Ali - https://venorex.wordpress.com/

Hello it's me, I am also visiting this site regularly, this web site is in fact pleasant and the users are really sharing pleasant thoughts. Also visit my web blog :: <a href="https://alf111.blogspot.com">Sally Hussin</a>

I was suggested this blog by means of my cousin. I am now not positive whether this submit is written by means of him as nobody else recognize such designated approximately my problem. You are incredible! Thanks! Feel free to visit my web page - Hussin Ahmed - https://alf111.blogspot.com

Hello, i think that i saw you visited my site thus i came to “return the favor”.I'm attempting to find things to enhance my website!I suppose its ok to use some of your ideas!! Stop by my web page :: <a href="https://alf111.blogspot.com">Sally Hussin</a>

Thanks for a marvelous posting! I quite enjoyed reading it, you could be a great author.I will remember to bookmark your blog and will eventually come back someday. I want to encourage you to ultimately continue your great job, have a nice evening! Here is my blog post; Amir Ali - https://alf111.blogspot.com

Great site. Plenty of helpful information here. I am sending it to several buddies ans additionally sharing in delicious. And certainly, thank you on your sweat! my weblog - <a href="https://venorex.wordpress.com/">Abeer Mahmoud</a>

Aw, this was an extremely good post. Taking a few minutes and actual effort to make a really good article... but what can I say... I hesitate a whole lot and never manage to get anything done. my page :: <a href="http://xalongjiu.com/phan-mem-chinh-sua-anh-ho-tro-trong-thiet-ke/">http://xalongjiu.com/phan-mem-chinh-sua-anh-ho-tro-trong-thiet-ke/</a>

Usually I do not learn post on blogs, however I wish to say that this write-up very forced me to check out annd doo it!Your writing style has been amazed me. Thank you, very great post. Feel free to visit my page: 4 rx ( Theodore - https://www.facebook.com/4rx-Pharmacy-1991777630840550 )

Hi to every one, for the reason that I am in fact kesn of reading this blog's post to be updated on a regular basis. It carries pleasant stuff. my web-site 4 rx (<a href="https://www.facebook.com/4rx-Pharmacy-1991777630840550">Broderick</a>)

Hi, I do believe this is an excellent site. I stumbledupon it ;) I maay revisit once again since i have saved as a favorite it. Money annd freedom iis the greatest way to change, may you be rich and continue tto guide other people. my blog - 4 rx - Lonnie - https://www.facebook.com/4rx-Pharmacy-1991777630840550 ,

I constantly spent myy half an hour to read this weblog's articles everyday along with a cup off coffee. Feel free to visit my webpage - 4 rx (<a href="https://www.facebook.com/4rx-Pharmacy-1991777630840550">Leonore</a>)

Its like you read my mind! You seem to know a lot about this, like you wrote the book in it or something. I think that you could do with sme pics too drive the message home a bit, but instead off that, this is magnificent blog. A fantastiic read. Iwill definitely be back. Here is my blog post; 4 rx - https://www.facebook.com/4rx-Pharmacy-1991777630840550

What a data off un-ambiguity and preserveness of precious knowledge regarding unpredicted emotions. Also visit my blog; 4 rx (<a href="https://www.facebook.com/4rx-Pharmacy-1991777630840550">Adelaida</a>)

Hello my family member! I want too say that this article is awesome, grea writtten and come wit almost all vital infos.I wuld likke to seee more plsts like this . Here is my web page: 4 rx - Delphia - https://www.facebook.com/4rx-Pharmacy-1991777630840550 -

Wonderful website. A lot of useful information here. I'm sending it to a few buddies ans additionally shnaring in delicious. Annd naturally, thank you in your effort! my web-site - 4 rx (<a href="https://www.facebook.com/4rx-Pharmacy-1991777630840550">Bradford</a>)

This is my first time pay a quick visit at here and i am really impressed to read everthing at alone place. Herre is my blog post :: 4 rxx ( Trista - https://www.facebook.com/4rx-Pharmacy-1991777630840550 )

I just could not depart your site prior to suggesting thatt I rrally enjoyed the standard ino an individual supply too your visitors? Is gonna be again regularly to investigate cross-check new posts my blog: 4 rx, <a href="https://www.facebook.com/4rx-Pharmacy-1991777630840550">Elena</a>,

Hi would you mind letting mme know which web host you're using? I've loaded your blog inn 3 completely different browsers and I must say this blog loads a lot faster then most. Caan you suggest a good internet hosting provider att a honest price? Thanks a lot, I appreciate it! My web page 4 rx [ Reece - https://www.facebook.com/4rx-Pharmacy-1991777630840550 ]

When I initially commente I seem to have clicked the -Notify me when nnew commets arre added- checkbox and noow each time a comment is added I rwceive four emails with the same comment. Is there an easy method you are able to remove me from that service? Thak you! Here is my site 4 rx [ Audrey - https://www.facebook.com/4rx-Pharmacy-1991777630840550 ]

You really make it seem so easy with your presentation but I fijnd this topic to be realkly something which I think I would never understand. It seems too cpmplex and extremely broad forr me. I'm looking forward for your next post, I will try to get the hang of it! Also visit my website: 4 rx - <a href="https://www.facebook.com/4rx-Pharmacy-1991777630840550">Lena</a>,

Wow, this piece of writing is fastidious, my sister is analyzing these kinds of things, thus I am going tto inform her. My webpage :: <a href="http://www.hoc3dmax.edu.vn/2016/03/khoa-hoc-thiet-ke-noi-that-ngan-han.html">http://www.hoc3dmax.edu.vn/2016/03/khoa-hoc-thiet-ke-noi-that-ngan-han.html</a>

You adtually make it seem so easy with your presentation however I find this topuc to be really one thing which I thionk I would by no means understand. It kind of feels too complex and very extensive for me. I am having a lok ahead on your subsequent publish, I'll attempt to get the hasng oof it! Also visit my blog post ... 4 rx (<a href="https://www.facebook.com/4rx-Pharmacy-1991777630840550">Betsy</a>)

Greetings, Ibelieve your website may be having web browser compatibility issues. Whenever I look at your blog in Safari, it looks fine however when opening in Internet Explorer, it's got some overlapping issues. I merely wanted to provide you with a quick heads up! Aside from that, great website! my website; 4 rx (<a href="https://www.facebook.com/4rx-Pharmacy-1991777630840550">Mason</a>)

Every weekend i used to pay a quick visit this web page, for the reason that i want enjoyment, ass this thjis web site conations genuinely nice funny information too. Here is my blg post ... 4 rx ( Ina - https://www.facebook.com/4rx-Pharmacy-1991777630840550 )

Perfect work you have done, thios website is really cool with great information. Here is my site: <a href="http://www.hoc3dmax.edu.vn/2015/03/hoc-hoa-vien-kien-truc-hoc-3d-max.html">http://www.hoc3dmax.edu.vn/2015/03/hoc-hoa-vien-kien-truc-hoc-3d-max.html</a>

Thank you for the good writeup. It in fact was a musement account it. Glance advanced to more delivered agreeable from you! By the way, how can we communicate? Review my blog: 4 rx, Janell - https://www.facebook.com/4rx-Pharmacy-1991777630840550 ,

An intriguing discussion is worth comment. I do think that you need to publish more on this issue, iit may not be a taboo subject but usually people don't discuss these topics. To the next! Best wishes!! My homepage ... 4 rx [<a href="https://www.facebook.com/4rx-Pharmacy-1991777630840550">Darryl</a>]

Hi, i think that i noticed you visitedd my website so i came tto return thhe desire?.I'm trying to to find things to enhance my website!I assume its adequate to make uuse of a few of your ideas!! My web blog 4 rx ( Rocco - https://www.facebook.com/4rx-Pharmacy-1991777630840550 )

I got this web site from my pal who told me regarding this web site and at the moment this time I am browsing this web site and reading verfy informative posts at this place. Herre is my webpage: 4 rx (<a href="https://www.facebook.com/4rx-Pharmacy-1991777630840550">Nancy</a>)

If some one needs to be updated with hottest technologies then hee must bee visit thius webb page and bbe up to date daily. My blog post: <a href="http://hocthietkenoithat.org/phan-mem-thiet-ke-noi-that/">http://hocthietkenoithat.org/phan-mem-thiet-ke-noi-that/</a>

It's an amazijg piece of writing in support of all the online users; they will take benefit from itt I am sure. my webpage ... 4 rx ( Shala - https://www.facebook.com/4rx-Pharmacy-1991777630840550 )

Remarkable! Its actually awesome piece of writing, I have got much clear idea concerning from this article. Herre is my site: 4 rx - https://www.facebook.com/4rx-Pharmacy-1991777630840550

I dugg some of you post as I cerebrated they were handy handy. my web blog ... <a href="http://hoc3dmaxtphcm.weebly.com/">http://hoc3dmaxtphcm.weebly.com/</a>

Hi there!Would you mind if I share your blog with my myspace group? There's a lot of people thatt I think would really appreciate your content. Please let me know. Thanks my blog - 4 rx (<a href="https://www.facebook.com/4rx-Pharmacy-1991777630840550">Raymundo</a>)

With havin so much content and articles do you ever run into any issues of plagorism or copyright infringement? My site has a lot of uniquee content I've either written myself or outsourced but it seems a lot of it is popping it up all over the wweb without my agreement. Do yyou know any methods to help prevent content from being ripped off? I'd certainly appreciate it. My blog post 4 rx ( Carissa - https://www.facebook.com/4rx-Pharmacy-1991777630840550 )

A lot of thanks for your entire work on this web page. Kim delights in setting aside tjme forr investigation and it is obvious why. Most of us notice all concerning the dynamic method you convey powerful things by meaans of thos web blog and as well as welcome response from other ones on that matter plus our favorite daughter is actuhally becoming educated a lot of things. Take advantage of the remaining portion of the new year. Yoou are alwahs doing a superb job. Also visit my website <a href="http://hocthietkenoithat.org/hoc-thiet-ke-noi-that-chuyen-nghiep/">http://hocthietkenoithat.org/hoc-thiet-ke-noi-that-chuyen-nghiep/</a>

This paragaph is actually a fastidious one it assists new web viewers, whho are wishing in favor of blogging. Here iis my webpage - 4 rx (<a href="https://www.facebook.com/4rx-Pharmacy-1991777630840550">Clarice</a>)

I like it whenever people get together and share views. Great website, stick with it! My wsblog ... 4 rx - https://www.facebook.com/4rx-Pharmacy-1991777630840550

Hmm it seemss like your site ate my first comment (it was super long) so I guess I'll just sum it uup wnat I submitted and say, I'm thoroughly enjoying your blog. I too am an aspiring blog writer but I'm still new to the whole thing. Do yyou have any helpful hints for first-time blog writers? I'd genuinely appreciate it. Here is my web sitee ... <a href="https://doboinusunny.com/shop/tui-boc-vali/">https://doboinusunny.com/shop/tui-boc-vali/</a>

Useful information. Lucky mme I discoered your website bby chance, and I'm shocked why this coincidence didn't happened earlier! I bookmarked it. Here is my wweb blog 4 rx, John - https://www.facebook.com/4rx-Pharmacy-1991777630840550 ,

Yeah bookmaking this wasn't a high risk conclusion great post! My weblog; <a href="http://xalongjiu.com/">http://xalongjiu.com/</a>

Hi there to every one, it's genuinely a good for me to pay a quick visit this web page, it consists of valuable Information. My web site бумажные пакеты на заказ с логотипом ( 5.9.16.38 - http://5.9.16.38:8090/HostBrowser.html?path=http://www.1design.org/poligraficheskie-uslugi/ )

I just wanted to thank you once more for your amazing blog you have produced here. It ccan be full of ideas for those who are definitely interested in this subject, especially this very post. You're really all amaziingly sweet along with thoughtful of others and also reading the blog posts is a wonderful delight in my experience. And what a generous present! Dan and I will certainly have enjoyment making use of your points in what we need to ddo in a few weeks. Our checklist is a mile long so your tips might be put to great use. my page ... <a href="http://hocthietkenoithat.weebly.com/program.html">http://hocthietkenoithat.weebly.com/program.html</a>

Pages