Click here to Skip to main content
15,792,217 members

Leslie Sanford - Professional Profile


    Blog RSS
Aside from dabbling in BASIC on his old Atari 1040ST years ago, Leslie's programming experience didn't really begin until he discovered the Internet in the late 90s. There he found a treasure trove of information about two of his favorite interests: MIDI and sound synthesis.

After spending a good deal of time calculating formulas he found on the Internet for creating new sounds by hand, he decided that an easier way would be to program the computer to do the work for him. This led him to learn C. He discovered that beyond using programming as a tool for synthesizing sound, he loved programming in and of itself.

Eventually he taught himself C++ and C#, and along the way he immersed himself in the ideas of object oriented programming. Like many of us, he gotten bitten by the design patterns bug and a copy of GOF is never far from his hands.

Now his primary interest is in creating a complete MIDI toolkit using the C# language. He hopes to create something that will become an indispensable tool for those wanting to write MIDI applications for the .NET framework.

Besides programming, his other interests are photography and playing his Les Paul guitars.


Weekly Data. Recent events may not appear immediately. For information on Reputation please see the FAQ.


Members need to achieve at least one of the given member levels in the given reputation categories in order to perform a given action. For example, to store personal files in your account area you will need to achieve Platinum level in either the Author or Authority category. The "If Owner" column means that owners of an item automatically have the privilege. The member types column lists member types who gain the privilege regardless of their reputation level.

ActionAuthorAuthorityDebatorEditorEnquirerOrganiserParticipantIf OwnerMember Types
Have no restrictions on voting frequencysilversilversilversilver
Bypass spam checks when posting contentsilversilversilversilversilversilvergoldSubEditor, Mentor, Protector, Editor
Store personal files in your account areaplatinumplatinumSubEditor, Editor
Have live hyperlinks in your profilebronzebronzebronzebronzebronzebronzesilverSubEditor, Protector, Editor
Have the ability to include a biography in your profilebronzebronzebronzebronzebronzebronzesilverSubEditor, Protector, Editor
Edit a Question in Q&AsilversilversilversilverYesSubEditor, Protector, Editor
Edit an Answer in Q&AsilversilversilversilverYesSubEditor, Protector, Editor
Delete a Question in Q&AYesSubEditor, Protector, Editor
Delete an Answer in Q&AYesSubEditor, Protector, Editor
Report an ArticlesilversilversilversilverSubEditor, Mentor, Protector, Editor
Approve/Disapprove a pending ArticlegoldgoldgoldgoldSubEditor, Mentor, Protector, Editor
Edit other members' articlesSubEditor, Protector, Editor
Create an article without requiring moderationplatinumSubEditor, Mentor, Protector, Editor
Approve/Disapprove a pending QuestionProtector
Approve/Disapprove a pending AnswerProtector
Report a forum messagesilversilverbronzeProtector, Editor
Approve/Disapprove a pending Forum MessageProtector
Have the ability to send direct emails to members in the forumsProtector
Create a new tagsilversilversilversilver
Modify a tagsilversilversilversilver

Actions with a green tick can be performed by this member.

GeneralApplying Generic Programming to Runtime Polymorphism Pin
Leslie Sanford22-Feb-10 11:28
Leslie Sanford22-Feb-10 11:28 
GeneralGeneric Programming [modified] Pin
Leslie Sanford19-Jul-08 6:53
Leslie Sanford19-Jul-08 6:53 
GeneralOff-topic Pin
Rajesh R Subramanian19-Jun-09 13:48
professionalRajesh R Subramanian19-Jun-09 13:48 
GeneralRe: Off-topic Pin
Leslie Sanford19-Jun-09 20:06
Leslie Sanford19-Jun-09 20:06 
GeneralEnsuring Object State [modified] Pin
Leslie Sanford27-Jun-07 9:00
Leslie Sanford27-Jun-07 9:00 
GeneralEvolution of Messaging Pin
Leslie Sanford19-Oct-06 6:15
Leslie Sanford19-Oct-06 6:15 
GeneralEnumerators as Synthesizer Components Pin
Leslie Sanford20-Sep-06 21:53
Leslie Sanford20-Sep-06 21:53 
GeneralAnonymous Methods as Glue Pin
Leslie Sanford17-Sep-06 15:30
Leslie Sanford17-Sep-06 15:30 
GeneralRefining the approach Pin
Leslie Sanford22-Jan-06 8:52
Leslie Sanford22-Jan-06 8:52 
GeneralFlowing down the Sink Pin
Leslie Sanford21-Jan-06 17:45
Leslie Sanford21-Jan-06 17:45 
Well, I've been all over the place on how to implement flow-based programming in C#. I've discovered several ways of doing it, a couple of which you can read about in my previous blog entry.

What I've settled on is an approach inspired by the System.Runtime.Remoting.Channels namespace. This namespace uses the concept of sinks and sink chains. You have a chain of objects that process messages. Well, that's very much like what I'm trying to accomplish with my MIDI toolkit!

So I've created a set of sink interfaces, one for each message type. Classes that implement these interfaces can be placed in a chain of objects which process MIDI messages. For example, take the IChannelSink from the MIDI toolkit:

public interface IChannelSink
    void ProcessMessage(ChannelMessage message);

    IChannelSink NextChannelSink

This represents the basic functionality for an object to serve in a sink chain. An example of chaining objects together:

InputDevice inDevice = new InputDevice(0);
UserSink userSink = new UserSink();    // Some user defined channel sink.
ChannelStopper stopper = new ChannelStopper();
OutputDevice outDevice = new OutputDevice(0);

inDevice.ChannelSink = userSink;

userSink.NextChannelSink = stopper;

stopper.NextChannelSink = outDevice;

// Start processing messages.

The chain begins with an InputDevice class. This class doesn't actually implement the IChannelSink interface since it is the first link in the chain. It simply receives messages and does not process them.

The second object in the chain is a hypothetical user defined sink. This sink processes messages in a user defined way.

The ChannelStopper sink keeps track of any sounding notes. When the flow of messages stop, the stopper's AllSoundsOff method can be called to stop any sounding notes so that they are not left hanging.

And finally, the output device serves as the last link in the chain. It simply sends the messages to an output device.

So after much consideration, I think I've settled on the way in which I want to implement flow-based programming in C#.

BTW, this implementation looks a lot like the Chain of Responsibility design pattern. The main difference is that this approach is about processing messages rather than handling requests, but they are very similar.
GeneralFlow-Based Programming in C# Pin
Leslie Sanford29-Dec-05 14:07
Leslie Sanford29-Dec-05 14:07 
GeneralCombining Visitor, Observer, and Iterator Pin
Leslie Sanford25-Dec-05 22:29
Leslie Sanford25-Dec-05 22:29 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.