diff options
| -rw-r--r-- | muse/ChangeLog | 2 | ||||
| -rw-r--r-- | muse/doc/man/de/installation.tex | 21 | ||||
| -rw-r--r-- | muse/muse/importmidi.cpp | 63 | ||||
| -rw-r--r-- | muse/muse/midi.cpp | 21 | ||||
| -rw-r--r-- | muse/muse/midi.h | 3 | ||||
| -rw-r--r-- | muse/muse/midievent.h | 3 | ||||
| -rw-r--r-- | muse/synti/mus/mus.cpp | 3 | 
7 files changed, 47 insertions, 69 deletions
diff --git a/muse/ChangeLog b/muse/ChangeLog index 389cff53..f6882672 100644 --- a/muse/ChangeLog +++ b/muse/ChangeLog @@ -1,3 +1,5 @@ +23.5. (ws) +      - midi import fixes  19.04 (ws)        - disable routing buttons in mixer strip when in off state        - fixed crash when removing track from mixer diff --git a/muse/doc/man/de/installation.tex b/muse/doc/man/de/installation.tex index e65751e3..4b45531c 100644 --- a/muse/doc/man/de/installation.tex +++ b/muse/doc/man/de/installation.tex @@ -15,10 +15,12 @@              echo snd-seq >> /etc/modules        \stoptyping +      (Nachtrag: im aktuellen Ubuntu 04.07 ("festy") wird das Sequencer +      Modul standardmäßig geladen)      \subsection{Realtime Clock} -      Normalen Programmen ist der Zugriff auf die Echtzeituhr  +      Normalen Programmen ist der Zugriff auf die Echtzeituhr        (RTC = "realtime clock") von Linux        verwehrt. \M\ benötigt jedoch eine genaue Uhr, um ein exaktes        Miditiming erzeugen zu können. @@ -35,7 +37,6 @@        Auflösungen einstellen.        Um dies zu Erlauben geben wir ein: -              \starttyping              sudo bash              echo 1024 > /proc/sys/dev/rtc/max-user-freq @@ -44,3 +45,19 @@        Durch den Eintrag in der Datei {\tt /etc/sysctl.conf} erfolgt diese        Einstellung nun auch nach jedem Systemstart. + +    \subsection{Realtime Rechte} + +      Um Prozesse mit Echtzeit Privilegien starten zu können ergänzen +      wir die Datei {\tt /etc/security/limits.conf} um folgende Zeilen: + +      \starttyping +      @audio - rtprio 99 +      @audio - memlock 200000 +      @audio - nice -10 +      \stoptyping + +    \subsection{Low Latency Kernel} +      \subsubsection{Interrupt Thread Prioritäten} + + diff --git a/muse/muse/importmidi.cpp b/muse/muse/importmidi.cpp index 9a9dee8c..d7b1ba7d 100644 --- a/muse/muse/importmidi.cpp +++ b/muse/muse/importmidi.cpp @@ -165,7 +165,7 @@ void MusE::importMidi(const QString &file)                    mixer1->clear();              if (mixer2)                    mixer2->clear(); -//=========================================================== +            //===========================================================              //              // close all toplevel windows              // @@ -276,8 +276,6 @@ void MusE::importMidi(const QString &file)                    track->blockSignals(false);                    }              setWindowTitle(QString("MusE: Song: ") + path); -//=========================================================== -              seqStart();              audio->msgSeek(song->cPos());              } @@ -290,7 +288,6 @@ void MusE::importMidi(const QString &file)  //---------------------------------------------------------  //   addMidiFile -//    return true on error  //---------------------------------------------------------  void MusE::addMidiFile(const QString name) @@ -315,7 +312,6 @@ void MusE::addMidiFile(const QString name)        int division           = mf.division();        MidiOutPort* outPort = 0; -//      MidiInPort* inPort = 0;        if (song->midiOutPorts()->empty()) {              outPort = new MidiOutPort(); @@ -342,25 +338,6 @@ void MusE::addMidiFile(const QString name)                          }                    } -            if (config.createDefaultMidiInput) { -#if 0 -                  inPort = new MidiInPort(); -                  inPort->setDefaultName(); -                  song->insertTrack0(inPort, -1); -                  if (config.connectToAllMidiDevices) { -                        QList<PortName> ol = midiDriver->inputPorts(); -                        for (std::list<PortName>::iterator ip = ol->begin(); ip != ol->end(); ++ip) { -                              Route src(ip->name, 0, Route::MIDIPORT); -                              inPort->inRoutes()->push_back(src); -                              } -                        } -                  else if (!config.defaultMidiInputDevice.isEmpty()) { -                        Route src(config.defaultMidiInputDevice, 0, Route::MIDIPORT); -                        inPort->inRoutes()->push_back(src); -                        } -#endif -                  } -              //              // if midi file is GM/GS/XG this overrides the preferred              // instrument setting @@ -403,9 +380,10 @@ void MusE::addMidiFile(const QString name)        //    - combine note on/off events        //    - calculate tick value for internal resolution        // -      for (iMidiFileTrack t = etl->begin(); t != etl->end(); ++t) { -            MidiEventList* el  = &((*t)->events); -            if (el->empty()) + +      foreach(const MidiFileTrack* t, *etl) { +            const MidiEventList& el = t->events; +            if (el.empty())                    continue;              //              // if we split the track, SYSEX and META events go into @@ -417,18 +395,16 @@ void MusE::addMidiFile(const QString name)                    // check if there are any events for channel in track:                    //                    iMidiEvent i; -                  for (i = el->begin(); i != el->end(); ++i) { +                  for (i = el.begin(); i != el.end(); ++i) {                          MidiEvent ev = *i; -                        if (ev.type() != ME_SYSEX -                           && ev.type() != ME_META -                           && ev.channel() == channel) +                        if (ev.type() != ME_SYSEX && ev.type() != ME_META && ev.channel() == channel)                                break;                          } -                  if (i == el->end()) +                  if (i == el.end())                          continue;                    MidiTrack* track = new MidiTrack(); -                  if ((*t)->isDrumTrack) +                  if (t->isDrumTrack)                          track->setUseDrumMap(true);  //TODOB                  track->outRoutes()->push_back(Route(outPort->channel(channel), -1, Route::TRACK));  //                  if (inPort && config.connectToAllMidiTracks) { @@ -439,7 +415,7 @@ void MusE::addMidiFile(const QString name)  //                        }                    EventList* mel = track->events(); -                  buildMidiEventList(mel, el, track, division, first); +                  buildMidiEventList(mel, &el, track, channel, division, first);                    first = false;                    for (iEvent i = mel->begin(); i != mel->end(); ++i) { @@ -453,22 +429,6 @@ void MusE::addMidiFile(const QString name)                                track->addControllerVal(ctrl, event.tick(), val);                                }                          } -                  if (channel == 9) { -                        track->setUseDrumMap(true); -                        // -                        // remap drum pitch with drumInmap -                        // -#if 0 //TODO -                        EventList* tevents = track->events(); -                        for (iEvent i = tevents->begin(); i != tevents->end(); ++i) { -                              Event ev  = i->second; -                              if (ev.isNote()) { -                                    int pitch = drumInmap[ev.pitch()]; -                                    ev.setPitch(pitch); -                                    } -                              } -#endif -                        }                    processTrack(track);                    if (track->name().isEmpty())                          track->setDefaultName(); @@ -480,9 +440,8 @@ void MusE::addMidiFile(const QString name)                    // (SYSEX or META)                    //                    MidiTrack* track = new MidiTrack(); -//                  addRoute(Route(track, -1, Route::TRACK), Route(track));                    EventList* mel = track->events(); -                  buildMidiEventList(mel, el, track, division, true); +                  buildMidiEventList(mel, &el, track, 0, division, true);                    processTrack(track);                    if (track->name().isEmpty())                          track->setDefaultName(); diff --git a/muse/muse/midi.cpp b/muse/muse/midi.cpp index 141550fc..b93bf1c9 100644 --- a/muse/muse/midi.cpp +++ b/muse/muse/midi.cpp @@ -44,30 +44,30 @@  extern void dump(const unsigned char* p, int n); -unsigned const char gmOnMsg[] = {  +unsigned const char gmOnMsg[] = {        0x7e,       // Non-Real Time header        0x7f,       // ID of target device (7f = all devices) -      0x09,  -      0x01  +      0x09, +      0x01        }; -unsigned const char gsOnMsg[] = {  +unsigned const char gsOnMsg[] = {        0x41,       // roland id        0x10,       // Id of target device (default = 10h for roland)        0x42,       // model id (42h = gs devices)        0x12,       // command id (12h = data set)        0x40,       // address & value        0x00, -      0x7f,  -      0x00,         +      0x7f, +      0x00,        0x41        // checksum?        }; -unsigned const char xgOnMsg[] = {  +unsigned const char xgOnMsg[] = {        0x43,       // yamaha id        0x10,       // device number (0)        0x4c,       // model id        0x00,       // address (high, mid, low) -      0x00,  -      0x7e,  +      0x00, +      0x7e,        0x00        // data        };  unsigned const int  gmOnMsgLen = sizeof(gmOnMsg); @@ -196,7 +196,7 @@ QString nameSysex(unsigned int len, const unsigned char* buf)  //      generally: how to handle incomplete messages?  //--------------------------------------------------------- -void buildMidiEventList(EventList* del, const MidiEventList* el, MidiTrack* track, +void buildMidiEventList(EventList* del, const MidiEventList* el, MidiTrack* track, int channel,     int div, bool addSysexMeta)        {        QString tname; @@ -208,7 +208,6 @@ void buildMidiEventList(EventList* del, const MidiEventList* el, MidiTrack* trac        int datal    = 0;        int dataType = 0;   // 0 : disabled, 0x20000 : rpn, 0x30000 : nrpn -      int channel = 0;        EventList mel;        int metaChannel = -1;        for (iMidiEvent i = el->begin(); i != el->end(); ++i) { diff --git a/muse/muse/midi.h b/muse/muse/midi.h index 13d5ddcb..09d6a1e9 100644 --- a/muse/muse/midi.h +++ b/muse/muse/midi.h @@ -55,7 +55,8 @@ class EventList;  class MidiTrack;  class MidiEventList; -extern void buildMidiEventList(EventList* mel, const MidiEventList* el, MidiTrack* track, int division, bool); +extern void buildMidiEventList(EventList* mel, const MidiEventList* el, MidiTrack* track, +   int channel, int division, bool);  #endif diff --git a/muse/muse/midievent.h b/muse/muse/midievent.h index d3dd4800..780c7ce6 100644 --- a/muse/muse/midievent.h +++ b/muse/muse/midievent.h @@ -23,7 +23,6 @@  #include <set>  #include "evdata.h" -// #include <ext/mt_allocator.h>  #include "midi.h" @@ -89,7 +88,7 @@ class MidiEvent {  // typedef std::multiset<MidiEvent, std::less<MidiEvent>,  //   __gnu_cxx::__mt_alloc<MidiEvent> > MPEL; -class MidiEventList : public std::multiset<MidiEvent, std::less<MidiEvent> >  +class MidiEventList : public std::multiset<MidiEvent, std::less<MidiEvent> >        {     public:        }; diff --git a/muse/synti/mus/mus.cpp b/muse/synti/mus/mus.cpp index 794c3c51..3100ae5c 100644 --- a/muse/synti/mus/mus.cpp +++ b/muse/synti/mus/mus.cpp @@ -50,7 +50,8 @@ static int processAudio(jack_nframes_t nFrames, void*)        int nch = mess->channels();        for (int i = 0; i < nch; ++i) {              outBuffer[i] = (float*)jack_port_get_buffer(outPorts[i], nFrames); -            memset(outBuffer[i], 0, sizeof(float) * nFrames); +            jack_midi_clear_buffer(outBuffer[i], nFrames); +            // memset(outBuffer[i], 0, sizeof(float) * nFrames);              }        while(mess->eventsPending())              mess->processEvent(mess->receiveEvent());  | 
