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

Reply via email to