Did we ever get the mappings for the NuMark TotalControl merged into trunk ? Some people were asking on IRC about it.
-RJ Albert Santoni wrote: > Hi guys, > > Patch has been committed. > > Alex: Can you please send us your Numark MIDI mapping? (It should work > with trunk now, right?) > > Thanks, > Albert > > On Tue, 2008-06-17 at 14:58 +1000, Tom Care wrote: > >> Hey guys, >> >> >> Looks fine to me :) >> >> >> During my refactoring of the MIDI system I may change a few things (to >> do with generalising for other types of relative controls, as well as >> a possible general structural change), but for the moment I'm sure >> people will appreciate this! >> >> >> Thanks >> >> >> Tom >> >> >> >> On 17/06/2008, at 9:14 AM, Albert Santoni wrote: >> >> >>> Hi Tom, >>> >>> Patches are attached. >>> >>> Alex: Tom's going to review and comment on or commit your MIDI >>> patches. >>> Sorry for taking so long to get going on these, we were just too >>> close >>> to the beta3 release when you sent them to us. We have a history of >>> breaking MIDI accidentally before our releases, so I was trying to >>> minimize the chance of that happening. :) >>> >>> Thanks, >>> Albert >>> >>> From: Alex Markley <[EMAIL PROTECTED]> >>> >>> Date: 28 March 2008 9:59:31 AM >>> >>> To: mixxx-devel <[email protected]> >>> >>> Subject: [Mixxx-devel] Another MIDI Control Patch (Select Knob) >>> >>> >>> >>> >>> This patch (not to be confused with my Diff Sensitivity patch) >>> implements a MIDI track selection knob. >>> >>> On my controller, I have a track selection knob which reports a >>> signed, relative number which should be interpreted as a number of >>> clicks in a clockwise or counter-clockwise direction. (Depending on >>> the sign.) >>> >>> In order to implement a slot which behaves properly, I had to add a >>> MIDI_OPT_SELECTKNOB which should be useful in any situation where a >>> relative control's current position shouldn't be remembered from >>> event to event. >>> >>> My track selection knob also generates a button event if it is >>> pressed down. Since this button does not specify a particular >>> channel, I added a slotLoadSelectedIntoFirstStopped, which allows a >>> MIDI button to behave like double-clicking a track in the library. >>> >>> Since this patch only adds features to the codebase (instead of >>> altering older features) I don't expect it to affect anything else. >>> It _should_ be safe to commit. >>> >>> Once Mixxx HEAD has all the code necessary to write a working MIDI >>> mapping for the Numark Total Control, I'll be contributing a >>> complete MIDI mapping which can be included in the next release. :) >>> >>> ttyl >>> -- >>> Alex (Malex) Markley >>> 740.927.3588 - http://MalexMedia.Net/ - http://SermonMP3s.com/ >>> Index: src/configobject.h >>> =================================================================== >>> --- src/configobject.h (revision 1900) >>> +++ src/configobject.h (working copy) >>> @@ -44,7 +44,8 @@ >>> MIDI_OPT_BUTTON = 6, // Button Down (!=00) and Button >>> Up (00) events happen together >>> MIDI_OPT_SWITCH = 7, // Button Down (!=00) and Button >>> Up (00) events happen seperately >>> MIDI_OPT_HERC_JOG = 8, // Generic hercules wierd range >>> correction >>> - MIDI_OPT_SPREAD64 = 9 // Accelerated difference from >>> 64 >>> + MIDI_OPT_SPREAD64 = 9, // Accelerated difference from >>> 64 >>> + MIDI_OPT_SELECTKNOB = 10,// Relative knob which can be >>> turned forever and outputs a signed value. >>> } MidiOption; >>> >>> typedef QMap<char,char> MidiValueMap; >>> Index: src/configobject.cpp >>> =================================================================== >>> --- src/configobject.cpp (revision 1900) >>> +++ src/configobject.cpp (working copy) >>> @@ -179,6 +179,8 @@ >>> midioption = MIDI_OPT_HERC_JOG; >>> else if (optname == "spread64") >>> midioption = MIDI_OPT_SPREAD64; >>> + else if (optname == "selectknob") >>> + midioption = MIDI_OPT_SELECTKNOB; >>> else { >>> qWarning() << "Unknown option:" << optname; >>> midioption = MIDI_OPT_NORMAL; >>> @@ -240,6 +242,8 @@ >>> midioption = MIDI_OPT_HERC_JOG; >>> else if (option.contains("Spread64", false)) >>> midioption = MIDI_OPT_SPREAD64; >>> + else if (option.contains("SelectKnob", false)) >>> + midioption = MIDI_OPT_SELECTKNOB; >>> else >>> midioption = MIDI_OPT_NORMAL; >>> // Store string with corrected config value >>> @@ -293,6 +297,8 @@ >>> value.append(" Diff"); >>> else if (midioption == MIDI_OPT_SPREAD64) >>> value.append(" Spread64"); >>> + else if (midioption == MIDI_OPT_SELECTKNOB) >>> + value.append(" SelectKnob"); >>> >>> qDebug() << "Config value:" << value; >>> //qDebug() << "--1, midino: " << midino << ", midimask: " << >>> midimask << ", midichannel: " << midichannel; >>> @@ -361,6 +367,17 @@ >>> _newmidivalue = _prevmidivalue + _newmidivalue; >>> } >>> } >>> + else if (midioption == MIDI_OPT_SELECTKNOB) >>> + { >>> + //Interpret 7-bit signed value using two's compliment. >>> + if (_newmidivalue >= 64.) >>> + _newmidivalue = _newmidivalue - 128.; >>> + //Apply sensitivity to signed value. >>> + if(sensitivity > 0) >>> + _newmidivalue = _newmidivalue * ((double)sensitivity / >>> 50.); >>> + //Since this is a selection knob, we do not want to inherit >>> previous values. >>> + return _newmidivalue; >>> + } >>> else if (midioption == MIDI_OPT_BUTTON) >>> { >>> if (_newmidivalue != 0.) { >>> Index: src/track.h >>> =================================================================== >>> --- src/track.h (revision 1900) >>> +++ src/track.h (working copy) >>> @@ -121,9 +121,11 @@ >>> /** Slots for loading the selected track into players */ >>> void slotLoadSelectedTrackCh1(double); >>> void slotLoadSelectedTrackCh2(double); >>> + void slotLoadSelectedIntoFirstStopped(double); >>> /** Slots for moving the selection cursor in the track list */ >>> void slotSelectNextTrack(double); >>> void slotSelectPrevTrack(double); >>> + void slotSelectTrackKnob(double); >>> >>> /** Returns pointer to active playlist */ >>> TrackPlaylist *getActivePlaylist(); >>> @@ -206,7 +208,7 @@ >>> /** Pointer to ControlObject for next/prev buttons */ >>> ControlObjectThreadMain *m_pNextTrackCh1, *m_pNextTrackCh2, >>> *m_pPrevTrackCh1, *m_pPrevTrackCh2; >>> /** Pointer to ControlObject for playlist navigation/loading >>> into Players */ >>> - ControlObjectThreadMain *m_pLoadSelectedTrackCh1, >>> *m_pLoadSelectedTrackCh2, *m_pSelectNextTrack, *m_pSelectPrevTrack; >>> + ControlObjectThreadMain *m_pLoadSelectedTrackCh1, >>> *m_pLoadSelectedTrackCh2, *m_pLoadSelectedIntoFirstStopped, >>> *m_pSelectNextTrack, *m_pSelectPrevTrack, *m_pSelectTrackKnob; >>> /** Pointer to ControlObject for play position */ >>> ControlObjectThreadMain *m_pPlayPositionCh1, >>> *m_pPlayPositionCh2; >>> /** Pointer to waveform summary generator */ >>> Index: src/track.cpp >>> =================================================================== >>> --- src/track.cpp (revision 1900) >>> +++ src/track.cpp (working copy) >>> @@ -214,12 +214,16 @@ >>> // Make controls for tracklist navigation and current track >>> loading >>> m_pLoadSelectedTrackCh1 = new ControlObjectThreadMain(new >>> ControlObject(ConfigKey("[Channel1]","LoadSelectedTrack"))); >>> m_pLoadSelectedTrackCh2 = new ControlObjectThreadMain(new >>> ControlObject(ConfigKey("[Channel2]","LoadSelectedTrack"))); >>> + m_pLoadSelectedIntoFirstStopped = new >>> ControlObjectThreadMain(new >>> ControlObject(ConfigKey("[Playlist]","LoadSelectedIntoFirstStopped"))); >>> m_pSelectNextTrack = new ControlObjectThreadMain(new >>> ControlObject(ConfigKey("[Playlist]","SelectNextTrack"))); >>> m_pSelectPrevTrack = new ControlObjectThreadMain(new >>> ControlObject(ConfigKey("[Playlist]","SelectPrevTrack"))); >>> + m_pSelectTrackKnob = new ControlObjectThreadMain(new >>> ControlObject(ConfigKey("[Playlist]","SelectTrackKnob"))); >>> connect(m_pLoadSelectedTrackCh1, SIGNAL(valueChanged(double)), >>> this, SLOT(slotLoadSelectedTrackCh1(double))); >>> connect(m_pLoadSelectedTrackCh2, SIGNAL(valueChanged(double)), >>> this, SLOT(slotLoadSelectedTrackCh2(double))); >>> + connect(m_pLoadSelectedIntoFirstStopped, >>> SIGNAL(valueChanged(double)), this, >>> SLOT(slotLoadSelectedIntoFirstStopped(double))); >>> connect(m_pSelectNextTrack, SIGNAL(valueChanged(double)), this, >>> SLOT(slotSelectNextTrack(double))); >>> connect(m_pSelectPrevTrack, SIGNAL(valueChanged(double)), this, >>> SLOT(slotSelectPrevTrack(double))); >>> + connect(m_pSelectTrackKnob, SIGNAL(valueChanged(double)), this, >>> SLOT(slotSelectTrackKnob(double))); >>> >>> TrackPlaylist::setTrack(this); >>> >>> @@ -1147,11 +1151,22 @@ >>> // Fetch the currently selected track >>> index = >>> m_pView->m_pTrackTableView->m_pSearchFilter->mapToSource(m_pView->m_pTrackTableView->currentIndex()); >>> pTrack = >>> m_pView->m_pTrackTableView->m_pTable->m_pTrackPlaylist->getTrackAt(index.row()); >>> - // If there is one, load it >>> + // If there is one, load it >>> if (pTrack) slotLoadPlayer2(pTrack); >>> } >>> } >>> >>> +void Track::slotLoadSelectedIntoFirstStopped(double v) >>> +{ >>> + if (v) >>> + { >>> + if >>> (ControlObject::getControl(ConfigKey("[Channel1]","play"))->get()! >>> =1.) >>> + this->slotLoadSelectedTrackCh1(v); >>> + else if >>> (ControlObject::getControl(ConfigKey("[Channel2]","play"))->get()! >>> =1.) >>> + this->slotLoadSelectedTrackCh2(v); >>> + } >>> +} >>> + >>> void Track::slotSelectNextTrack(double v) >>> { >>> // Only move on key presses >>> @@ -1164,6 +1179,24 @@ >>> if (v) m_pView->m_pTrackTableView->selectPrevious(); >>> } >>> >>> +void Track::slotSelectTrackKnob(double v) >>> +{ >>> + int i = (int)v; >>> + while(i != 0) >>> + { >>> + if(i > 0) >>> + { >>> + m_pView->m_pTrackTableView->selectNext(); >>> + i--; >>> + } >>> + else >>> + { >>> + m_pView->m_pTrackTableView->selectPrevious(); >>> + i++; >>> + } >>> + } >>> +} >>> + >>> void Track::slotNextTrackPlayer1(double v) >>> { >>> if (v && m_pTrackPlayer1) >>> <patch_selectknob.patch.asc>------------------------------------------------------------------------- >>> Check out the new SourceForge.net Marketplace. >>> It's the best place to buy or sell services for >>> just about anything Open Source. >>> http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace >>> _______________________________________________ >>> Mixxx-devel mailing list >>> [email protected] >>> https://lists.sourceforge.net/lists/listinfo/mixxx-devel >>> >>> >>> >>> From: Alex Markley <[EMAIL PROTECTED]> >>> >>> Date: 28 March 2008 7:57:41 AM >>> >>> To: Ben Wheeler <[EMAIL PROTECTED]>, mixxx-devel >>> <[email protected]> >>> >>> Subject: Re: [Mixxx-devel] MIDI Control Patch >>> >>> >>> >>> Ben Wheeler wrote: >>> >>>> Should that last line be >>>> _newmidivalue = _prevmidivalue + _newmidivalue; >>>> ? >>>> Otherwise it seems like the formula no longer incorporates >>>> the previous value... >>>> >>> Haha, wow... Oops. :-P >>> >>> Revised patch attached. >>> >>> -- >>> Alex (Malex) Markley >>> 740.927.3588 - http://MalexMedia.Net/ - http://SermonMP3s.com/ >>> Index: src/configobject.cpp >>> =================================================================== >>> --- src/configobject.cpp (revision 1900) >>> +++ src/configobject.cpp (working copy) >>> @@ -355,11 +355,14 @@ >>> } >>> else if (midioption == MIDI_OPT_DIFF) >>> { >>> - if (_newmidivalue > 64.) { >>> - _newmidivalue = _prevmidivalue - 128. + _newmidivalue; >>> - } else { >>> - _newmidivalue = _prevmidivalue + _newmidivalue; >>> - } >>> + //Interpret 7-bit signed value using two's compliment. >>> + if (_newmidivalue >= 64.) >>> + _newmidivalue = _newmidivalue - 128.; >>> + //Apply sensitivity to signed value. >>> + if(sensitivity > 0) >>> + _newmidivalue = _newmidivalue * ((double)sensitivity / >>> 50.); >>> + //Apply new value to current value. >>> + _newmidivalue = _prevmidivalue + _newmidivalue; >>> } >>> else if (midioption == MIDI_OPT_BUTTON) >>> { >>> <patch_diffsensitivity.patch.asc>------------------------------------------------------------------------- >>> Check out the new SourceForge.net Marketplace. >>> It's the best place to buy or sell services for >>> just about anything Open Source. >>> http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace >>> _______________________________________________ >>> Mixxx-devel mailing list >>> [email protected] >>> https://lists.sourceforge.net/lists/listinfo/mixxx-devel >>> >>> >>> >> > > > ------------------------------------------------------------------------- > Sponsored by: SourceForge.net Community Choice Awards: VOTE NOW! > Studies have shown that voting for your favorite open source project, > along with a healthy diet, reduces your potential for chronic lameness > and boredom. Vote Now at http://www.sourceforge.net/community/cca08 > _______________________________________________ > Mixxx-devel mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/mixxx-devel > ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ Mixxx-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/mixxx-devel
