Project ID:
585435
Project Type:
Fixed
Budget:
$250-$750 USD
Project Description:
Dynamic MIDI Playback Component or Library
- Need component or library to control playback of Midi files with functions to seamlessly jump at any specified point (measure/beat/tick) to another point (measure/beat/tick) in the same song or another song file. The jump points would be dynamic, and could be set or changed while the song is playing. The library/component would also be able to load another Midi file in the background while a midi file is playing. Maximum of two Midi files in memory is acceptable (current file and next file).
- Smooth, professional, uninterrupted playback is essential.
- Would prefer that the library be written in Delphi 6 or later, but am open to a DLL written in Delphi or C++. Can be implemented as unit of functions and TObject descendent in Delphi as well. Must compile to Win32 code. DotNet not acceptable. If written in C++, must be able to recreate compilable environment on our end without purchasing costly development environment. C++ Builder 2009 or 2010 is acceptable. Source code must be well commented and clean.
- Would include functions to get list of available Midi Output devices, set the Midi Output device to use, change the key of the song and tempo, and retrieve song file information. Would also include options to patch alternate instruments for a given Midi channel, as well as turning certain channels on and off during playback.
- When jumping dynamically, the possibility exists that a Note On event would be triggered with no corresponding Note Off event since the jump point happened in between these events. The library or component would need to continue playing forward (but not play new notes) in the previous event list (simultaneously) until one of three conditions were met:
1) All active (orphaned) notes receive a Note Off event
2) Any active notes receive further Note On or Modifier events from the new position
3) A settable timeout (i.e. 3 seconds) is reached, at which time, "old notes" would be
issued a Note Off event.
- The following functions would need to be supported:
GetAvailableMidiOutputDevices - returns StringList or Delimited String of Device Names\
SetMidiOutputDevice - sets device by name (or index)
OpenMidiDevice - sets device by name or index, returns boolean
closeMidiDevice
LoadMidiFile - passing the path, and boolean indicating background load
GetMidiInfo - returns filename, tempo, total event count, and channel count
GetChannelInfo - returns event count for passed channel
SetMidiKeyTranspose - by Integer
SetMidiTempo - by float
SetMidiPosition - by Measure, Beat and Tick
GetMidiPosition - Returns current Measure, Beat and Tick
SetJumpPosition - At specified Measure, Beat and Tick
jump to another Measure, Beat and Tick
SetJumpBackground - At specified Measure, Beat and Tick
move background to foreground and play from Measure, Beat and Tick
MidiFadeout - Fades note volumes in Note On events and in active notes to zero
over a specified durection of milliseconds
ClearMidiNotesForChannel - Issues Note Off events for any notes that remain
active on a given channel
Additional Project Description:
01/08/2010 at 7:08 EST:
3 Additional Requirements:
- Setting or Property to ignore Midi System Events
- Setting or Property to set maximum volume of overall song and maximum volume of each channel.
- Function to set instrument patch for a given channel.
Skills required:
C Programming,
Delphi