diff options
-rw-r--r-- | muse/CMakeLists.txt | 14 | ||||
-rw-r--r-- | muse/ChangeLog | 2 | ||||
-rw-r--r-- | muse/doc/CMakeLists.txt | 24 | ||||
-rw-r--r-- | muse/doc/dimpl.odt | bin | 0 -> 37053 bytes | |||
-rw-r--r-- | muse/doc/dimpl/CMakeLists.txt | 41 | ||||
-rw-r--r-- | muse/doc/dimpl/dimpl.tex | 865 | ||||
-rw-r--r-- | muse/doc/man/de/CMakeLists.txt | 52 | ||||
-rw-r--r-- | muse/doc/man/de/automation.tex | 33 | ||||
-rw-r--r-- | muse/doc/man/de/figurepath.tex.in | 2 | ||||
-rw-r--r-- | muse/doc/man/de/installation.tex | 63 | ||||
-rw-r--r-- | muse/doc/man/de/man-de.tex | 413 | ||||
-rw-r--r-- | muse/doc/man/de/midirecording.tex | 119 | ||||
-rw-r--r-- | muse/doc/man/de/miditracks.tex | 132 | ||||
-rw-r--r-- | muse/doc/man/de/projekte.tex | 102 | ||||
-rw-r--r-- | muse/doc/man/de/struktur.tex | 43 | ||||
-rw-r--r-- | muse/doc/manual-de.odt | bin | 0 -> 50551 bytes | |||
-rw-r--r-- | muse/muse/CMakeLists.txt | 25 | ||||
-rw-r--r-- | muse/muse/arranger.cpp (renamed from muse/muse/arranger/arranger.cpp) | 4 | ||||
-rw-r--r-- | muse/muse/arranger.h (renamed from muse/muse/arranger/arranger.h) | 0 | ||||
-rw-r--r-- | muse/muse/arranger/CMakeLists.txt | 60 | ||||
-rw-r--r-- | muse/muse/canvas.cpp (renamed from muse/muse/arranger/canvas.cpp) | 0 | ||||
-rw-r--r-- | muse/muse/canvas.h (renamed from muse/muse/arranger/canvas.h) | 0 | ||||
-rw-r--r-- | muse/muse/configtrack.cpp (renamed from muse/muse/arranger/configtrack.cpp) | 0 | ||||
-rw-r--r-- | muse/muse/configtrack.h (renamed from muse/muse/arranger/configtrack.h) | 0 | ||||
-rw-r--r-- | muse/muse/configtrack.ui (renamed from muse/muse/arranger/configtrack.ui) | 0 | ||||
-rw-r--r-- | muse/muse/importmidi.cpp | 2 | ||||
-rw-r--r-- | muse/muse/jack.cpp | 25 | ||||
-rw-r--r-- | muse/muse/midiportinfo.ui (renamed from muse/muse/arranger/midiportinfo.ui) | 0 | ||||
-rw-r--r-- | muse/muse/miditrackinfo.ui (renamed from muse/muse/arranger/miditrackinfo.ui) | 0 | ||||
-rw-r--r-- | muse/muse/mstrip.cpp | 76 | ||||
-rw-r--r-- | muse/muse/mstrip.h | 3 | ||||
-rw-r--r-- | muse/muse/muse.cpp | 2 | ||||
-rw-r--r-- | muse/muse/partdrag.cpp (renamed from muse/muse/arranger/partdrag.cpp) | 0 | ||||
-rw-r--r-- | muse/muse/partdrag.h (renamed from muse/muse/arranger/partdrag.h) | 0 | ||||
-rw-r--r-- | muse/muse/preferences.cpp | 2 | ||||
-rw-r--r-- | muse/muse/selectfilter.h (renamed from muse/muse/arranger/selectfilter.h) | 0 | ||||
-rw-r--r-- | muse/muse/seqmsg.cpp | 2 | ||||
-rw-r--r-- | muse/muse/song.cpp | 21 | ||||
-rw-r--r-- | muse/muse/songfile.cpp | 2 | ||||
-rw-r--r-- | muse/muse/strip.h | 3 | ||||
-rw-r--r-- | muse/muse/tllineedit.cpp (renamed from muse/muse/arranger/tllineedit.cpp) | 0 | ||||
-rw-r--r-- | muse/muse/tllineedit.h (renamed from muse/muse/arranger/tllineedit.h) | 0 | ||||
-rw-r--r-- | muse/muse/tlswidget.cpp (renamed from muse/muse/arranger/tlswidget.cpp) | 0 | ||||
-rw-r--r-- | muse/muse/tlswidget.h (renamed from muse/muse/arranger/tlswidget.h) | 0 | ||||
-rw-r--r-- | muse/muse/tlwidget.cpp (renamed from muse/muse/arranger/tlwidget.cpp) | 0 | ||||
-rw-r--r-- | muse/muse/tlwidget.h (renamed from muse/muse/arranger/tlwidget.h) | 0 | ||||
-rw-r--r-- | muse/muse/tlwlayout.cpp (renamed from muse/muse/arranger/tlwlayout.cpp) | 0 | ||||
-rw-r--r-- | muse/muse/tlwlayout.h (renamed from muse/muse/arranger/tlwlayout.h) | 0 | ||||
-rw-r--r-- | muse/muse/trackdrag.cpp (renamed from muse/muse/arranger/trackdrag.cpp) | 0 | ||||
-rw-r--r-- | muse/muse/trackdrag.h (renamed from muse/muse/arranger/trackdrag.h) | 0 | ||||
-rw-r--r-- | muse/muse/trackinfo.cpp (renamed from muse/muse/arranger/trackinfo.cpp) | 0 | ||||
-rw-r--r-- | muse/muse/trackinfo.h (renamed from muse/muse/arranger/trackinfo.h) | 0 | ||||
-rw-r--r-- | muse/muse/trelement.h (renamed from muse/muse/arranger/trelement.h) | 5 | ||||
-rw-r--r-- | muse/muse/wave.cpp | 16 |
54 files changed, 71 insertions, 2082 deletions
diff --git a/muse/CMakeLists.txt b/muse/CMakeLists.txt index 3712f50d..2286d40b 100644 --- a/muse/CMakeLists.txt +++ b/muse/CMakeLists.txt @@ -93,16 +93,6 @@ endif (NOT QT4_FOUND) include(${QT_USE_FILE}) ## -## find texexec (ConTeXt) -## - -find_path( TEXEXEC_PATH texutil ) -if (NOT TEXEXEC_PATH) - message("texexec from ConTeXt package not found. Documentation will not be build") -endif (NOT TEXEXEC_PATH) - - -## ## find doxygen ## TODO @@ -209,6 +199,8 @@ endif (NOT JACK_INCDIR) ## ## check for dssi +## dssi >= 0.9.0 +## liblo >= 0.23 ## if (ENABLE_DSSI) @@ -339,5 +331,5 @@ IF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") INCLUDE(CPack) ENDIF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") -subdirs(al awl grepmidi plugins midiplugins muse share synti doc) +subdirs(al awl grepmidi plugins midiplugins muse share synti) diff --git a/muse/ChangeLog b/muse/ChangeLog index dc8f38a3..d02cd328 100644 --- a/muse/ChangeLog +++ b/muse/ChangeLog @@ -1,3 +1,5 @@ +5.7. (ws) + - fix midi metronome output routing 29.6. (ws) - fix sending proper note off's at stop 27.6. (ws) diff --git a/muse/doc/CMakeLists.txt b/muse/doc/CMakeLists.txt deleted file mode 100644 index 387df934..00000000 --- a/muse/doc/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -#============================================================================= -# MusE -# Linux Music Editor -# $Id:$ -# -# Copyright (C) 2002-2006 by Werner Schweer and others -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -#============================================================================= - -if (TEXEXEC_PATH) - subdirs( dimpl man ) -endif (TEXEXEC_PATH) - diff --git a/muse/doc/dimpl.odt b/muse/doc/dimpl.odt Binary files differnew file mode 100644 index 00000000..e62ccd90 --- /dev/null +++ b/muse/doc/dimpl.odt diff --git a/muse/doc/dimpl/CMakeLists.txt b/muse/doc/dimpl/CMakeLists.txt deleted file mode 100644 index 9611881e..00000000 --- a/muse/doc/dimpl/CMakeLists.txt +++ /dev/null @@ -1,41 +0,0 @@ -#============================================================================= -# MusE -# Linux Music Editor -# $Id:$ -# -# Copyright (C) 2002-2006 by Werner Schweer and others -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -#============================================================================= - -set (SRC dimpl.tex) - -add_custom_target ( - dimpl - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/dimpl.tex - COMMAND ${TEXEXEC_PATH}/texexec - ARGS --language=en --verbose --batch --pdf - --result=dimpl.pdf - ${CMAKE_CURRENT_SOURCE_DIR}/dimpl.tex - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ) - -install_files ( /share/${MusE_INSTALL_NAME}/doc/ .pdf - ${CMAKE_CURRENT_BINARY_DIR}/dimpl.pdf ) - -set (extraClean dimpl.log dimpl.tmp dimpl.tuo dimpl.tui - dimpl-mpgraph.mp mpgraph.mp ) - -set_directory_properties( PROPERTIES - ADDITIONAL_MAKE_CLEAN_FILES "${extraClean}" - ) diff --git a/muse/doc/dimpl/dimpl.tex b/muse/doc/dimpl/dimpl.tex deleted file mode 100644 index da5ea6c6..00000000 --- a/muse/doc/dimpl/dimpl.tex +++ /dev/null @@ -1,865 +0,0 @@ -%==================================================================== -% Muse -% Design & Implementation -% -% (C) 2005 Copyright: Werner Schweer and Others -%==================================================================== - -%---------------------------------------------------------- -% Setup -%---------------------------------------------------------- - -%\showframe -%\showsetups -\usemodule[chart] -\setupcolors[state=start] -\setupbodyfont[Palatino] -\language[en] -\enableregime[il1] - -\startuseMPgraphic{FunnyFrame} - picture p; numeric o; path a, b; pair c; - p := textext.rt(\MPstring{FunnyFrame}); - o := BodyFontSize; - a := unitsquare xyscaled(OverlayWidth,OverlayHeight); - p := p shifted (20, OverlayHeight-ypart center p); - drawoptions (withpen pencircle scaled 1pt withcolor .625red); - b := a superellipsed .95; - fill b withcolor .85white; draw b; - b := (boundingbox p) superellipsed .95; - fill b withcolor .85white; draw b; - draw p withcolor black; - setbounds currentpicture to a; - \stopuseMPgraphic - -\defineoverlay[FunnyFrame][\useMPgraphic{FunnyFrame}] -\defineframedtext[FunnyText][frame=off,background=FunnyFrame] -\def\StartFrame{\startFunnyText} -\def\StopFrame{\stopFunnyText} -\def\FrameTitle#1% - {\setMPtext{FunnyFrame}{\hbox spread 1em{\hss\strut#1\hss}}} -\setMPtext{FunnyFrame}{} - - -\define\M{Muse} -\define[1]\Index{{\it #1}\marginpar{#1}\index{#1}} - -\defineindenting[Cmdi][text=,separator=,width=fit,distance=1em] - -\define[1]\Cmd{ - \Cmdi - \framed[ - background=color, - width=fit, - align=right, - backgroundcolor=lightgray, - framecolor=blue] - {\tt\space #1}} - -\define[2]\CCmd{ - \Cmdi - \framed[ - background=color, - width=broad, - align=right, - backgroundcolor=lightgray, - framecolor=blue] - {\vbox{\hbox{\tt\space #1}\hbox{\tt\space #2}}}} - -%\define\startdescription{\startpacked} -\define\startdescription{} -%\define\stopdescription{\stoppacked} -\define\stopdescription{} - -\define[1]\Fig{\hbox{\externalfigure[pics/#1]}} - -\define[2]\Screen{ - \placefigure[here][fig:#1]{#2}{\externalfigure[pics/#1][scale=1600]} - } - -\definedescription[Option][ - location=left, - headstyle=bold, - width=4em, - before={\startnarrower[left]\setupblank[0pt]}, - after={\stopnarrower\setupblank}] - -\definedescription[Filetype][ - location=left, - headstyle=bold, - width=4em, - before={\startnarrower[left]\setupblank[0pt]}, - after={\stopnarrower\setupblank}] - -\definedescription[FileList][ - location=left, - headstyle=bold, - width=7em, - before={\startnarrower[left]\setupblank[0pt]}, - after={\stopnarrower\setupblank}] - -\definedescription[Input][ - location=left, - headstyle=bold, - width=9em, - before={\startnarrower[left]\setupblank[0pt]}, - after={\stopnarrower\setupblank}] - -\definedescription[InputN][ - location=left, - headstyle=bold, - width=6em, - before={\startnarrower[left]\setupblank[0pt]}, - after={\stopnarrower\setupblank}] - -\define[2]\Figure{ - \placefigure - [#1][fig:#2]{} - {\externalfigure[pics/#2]} - } - -\define[1]\Menu{ - \placefigure[right][fig:#1]{} - {\externalfigure[pics/#1][scale=2000]} - } - -\definedescription[Opt][location=hanging,headstyle=bold,width=broad] - -\setuptyping[before=\blank\startbackground, after=\stopbackground\blank] % source code with background -\setupwhitespace[medium] - -%---------------------------------------------------------- -% Body -%---------------------------------------------------------- - -\starttext - \language[en] - \mainlanguage[en] - \startstandardmakeup[doublesided=no] - \definebodyfont[10pt,11pt,12pt][rm][tfe=Regular at 48pt] - \tfe\setupinterlinespace - \hfill \color[red]{\M}\par - \hfill \color[blue]{Design \&}\par - \hfill \color[blue]{Implementation}\par - \vfill - \definebodyfont[10pt,11pt,12pt][rm][tfb=Regular at 24pt] - \tfb\setupinterlinespace - \hfill Version 1.0\par -%% \hfill April 2005\par -%% \hfill Werner Schweer - \stopstandardmakeup - - \startstandardmakeup[page=no] - \vfill - \M\ is hosted on SourceForge:\par - \type{http://lmuse.sourceforge.net/} - \blank[line] - This document was created using \pdfTeX\ and the - \ConTeXt\ macro package. - \blank[line] - \copyright 2005 Werner Schweer and Others - \stopstandardmakeup - - \completecontent - -%% -%%======================================================================= -%% File Formats -%%======================================================================= -%% - -\chapter{Process Structure} - -\chapter{Song} - \section{Multithreading} - - \section{Editing} - \subsection{Realtime Editing} - \M\ allows for realtime editing. That means that you can edit - a song while the sequencer is running. - Two threads want to access data in the main {\tt Song()} class: - the GUI thread and the realtime sequencer thread. - - This are the rules how \M\ handles {\tt Song()} data accesses: - - \startitemize[packed,broad] - \item the GUI thread can only read {\tt Song()} data - \item the GUI thread can request the sequencer thread to - modify Song data - \item the sequencer thread can modify {\tt Song()} data, but only - on request of the GUI thread - \stopitemize - - Interprocess communication is done via message passing. - Communication from the gui thread to the sequencer thread is - done in the following steps: - - \startitemize[packed,broad] - \item the GUI sends a Message to the sequencer thread - and waits for an answer - \item once the sequencer thread is running (the JACK - client {\tt process()} call) it processes the message and - sends back an answer to the GUI process. - \item the GUI process reads the answer and continues - \stopitemize - - This scheme stops the GUI process in a defined state while the - realtime process can safely manipulate the {\tt Song()} data. - - \subsection{User Transaction} - - A user transaction is a sequence of actions manipulating the - main {\tt Song()} structure. Each action involves sending a - message to the realtime thread. This means that every action - stops the GUI thread for at most one JACK cycle. - - If a transaction consists of lot of actions then this scheme - would be too slow. For such cases the sequencer thread is switched - to "idle" mode, which ensures it is not touching the {\tt Song()} - data anymore. Then safe manipulation of the data is possible. - - \subsection{Naming Conventions} - - There are several methods involved in an edit transaction; - example for adding a part: - - \startitemize[packed,broad] - \item {\tt cmdAddPart()} - This implements a complete undoable user transaction - and is called from the gui thread - \item {\tt addPart()} - This method is also called from the gui thread. It - implements part of a user transaction. It is not - surrounded by {\tt startUndo() endUndo()}. - \item the realtime part (actually removing the {\tt Part} from the - PartList) is done inline during processing of - messages in the sequencer thread. - \stopitemize - - -\chapter{File Formats} - \section{Instrument Definition Files} - - \M\ Instrument Definition Files are used to describe the - properties of external midi instruments. - - IDF-Files have the file extension \type{*.idf} \index{idf} and - they are searched in the \M\ "instruments" subdirectory (which is on - my system \type{/usr/share/muse-1.0/instruments}. - - An instrument definition file should only define one - instrument. - - An instrument\index{Instrument definition} is a property of the - midi channel \index{Midi channel}. - All found instrument definitions are presented by MusE - in the Instrument pulldown menu of the midi output port. - - Example of an instrument definition file: - \blank - -\starttyping -<?xml version="1.0"?> -<muse version="1.0"> - <MidiInstrument name="GM"> - <Init> - ...MusE event list which initializes instrument - </Init> - <PatchGroup name="Piano"> - <Patch name="Grand Piano" prog="0"/> - <Patch name="Bright Piano" prog="1"/> - ... - </PatchGroup> - <PatchGroup name="Drum Kits"> - <drummap name="PoweredStd" hbank="63" lbank="32" prog="0"> - <entry> - <name>Clave</name> - <enote>24</enote> - <anote>24</anote> - </entry> - <entry> - <name>SdBrMtSt</name> - <enote>25</enote> - <anote>25</anote> - </entry> - ... - </drummap> - </PatchGroup> - - <PatchGroup name="Bass"> - <Patch name="Acoustic Bass" prog="32"/> - <Patch name="Fingered Bass" prog="33"/> - </PatchGroup> - ... - <Controller name="Brightness" type="Control" l="74" init="64"> - ... - </MidiInstrument> - </muse> -\stoptyping - - \blank - - \subsection{Init Sequence} - The {\tt Init} section declares a list of midi events to initialize - the instrument. The section can be empty or absent. - - \subsection{Patch Groups} - Patch Groups are used to structure the list of patches. - PatchGroups\index{PatchGroups} are not mandatory; its valid to write: - - \blank -\starttyping -<MidiInstrument name="GM"> - <Patch name="Grand Piano" prog="0"/> - <Patch name="Bright Piano" prog="1"/> - <Patch name="Acoustic Bass" prog="32"/> - <Patch name="Fingered Bass" prog="33"/> - ... - </MidiInstrument> -\stoptyping - \blank - - \subsection{Patches} - - The "prog" parameter in a "Patch" is mandatory. Missing - "hbank" or "lbank" are treated as "don't care". - Missing "drum" is treated as drum="0". - - A XG-Patch looks like this: - - \blank - \starttyping -<Patch name="Electro" drum="1" hbank="127" - lbank="0" prog="24"/> - \stoptyping - \blank - - A patch can be associated with a "mode" with one of: - \blank[medium] - \Option{1} - GM\par - \Option{2} - GS\par - \Option{4} - XG\par - \blank[big] - - Example: - - \blank - \starttyping -<Patch name="Electro" mode="4" drum="1" hbank="127" - lbank="0" prog="24"/> - \stoptyping - \blank - - Mode id's can be ore'd together for patches which are valid - for more than one mode: - - \blank - \starttyping -<Patch name="Grand Piano" mode=7" hbank="0" lbank="0" prog="0"/> - \stoptyping - \blank - - example for MusE event (Sysex "XG-On"): - - \blank - \starttyping -<event tick="0" type="5" datalen="7"> - 43 10 4c 00 00 7e 00 - </event> - \stoptyping - \blank - - \type{<Init> ... </Init>} part can be omitted - - \subsection{Drum Maps} - A drum map allows to define properties for every note in a patch. - The {\tt drummap} entry looks like the {\tt Patch} entry and defines - the banks and the program number for the drummap. - - \subsection{Controller} - Controller \index{Controller} have the following properties: - - \starttabulate - \NC name:\NC - arbitrary unique (short) string describing the controller\NC\NR - \NC n:\NC - controller number, defines also the controller type:\par - values from \type{0x0 - 0x7f} are 7Bit controller\par - values from \type{0x1000 - 0x1ffff} are 14 bit controller with - MSB/LSB value pairs\par - values from \type{0x20000 - 0x2ffff} are RPN's\par - values from \type{0x30000 - 0x3ffff} are NRPN's - \NC\NR - \NC min:\NC minimum value for controller\NC\NR - \NC max:\NC maximum value for controller\NC\NR - \NC init:\NC - reset value for controller; when controller value is - undefined after instrument reset, use the ''undefined'' - value \type{0x10000} - \NC\NR - \stoptabulate - - the min/max/init values can be ommited - -%% -%%======================================================================= -%% Midi Plugins -%%======================================================================= -%% -\chapter{Plugins} - \section{Midi Plugins} - - - Midi plugins have the file extension \type{*.so} and they are - searched in the \M\ "{\tt midiplugins} subdirectory (which is on - my system \type{/usr/lib/muse-1.0/midiplugins}. - -% -%----------------------------------- -% Midi Filter -%----------------------------------- -% - \subsection{Midi Filter} - - Example for an midi plugin which does essentially nothing: - - First define your custom \type{Filter} class with \type{Mempi} - as base class. - -\starttyping -#include "../libmidiplugin/mempi.h" - -class Filter : public Mempi { - virtual void process(unsigned, unsigned, - MPEventList*, MPEventList*); - - public: - Filter(const char* name, const MempiHost*); - ~Filter() {} - virtual bool init() { return false; } - }; - -Filter::Filter(const char* name, const MempiHost* h) - : Mempi(name, h) - { - } -\stoptyping - - Now comes the main \type{Mempi} function you have to implement: - \type{process()} which has two parameters, an midi event input - list and an midi event output list. The example code simply - copies all events from the input list to the output list. - -\starttyping -void Filter::process(unsigned, unsigned, MPEventList* il, - MPEventList* ol) - { - for (iMPEvent i = il->begin(); i != il->end(); ++i) { - ol->insert(*i); - } - } -\stoptyping - - When loading the plugin, the \type{Mempi} Host looks for - the symbol \type{mempi_descriptor}. This function returns a - pointer to the plugin class description you have to fill in. - -\starttyping -static Mempi* instantiate(const char* name, const MempiHost* h) - { - return new Filter(name, h); - } - -extern "C" { - static MEMPI descriptor = { - "Filter", - "MusE Zero Filter", - "0.1", // filter version string - MEMPI_FILTER, // plugin type - MEMPI_MAJOR_VERSION, MEMPI_MINOR_VERSION, - instantiate - }; - - const MEMPI* mempi_descriptor() { return &descriptor; } - } -\stoptyping - - -% -%----------------------------------- -% GUI interface -%----------------------------------- -% -\subsection{GUI interface} - Every midi plugin can implement a native graphical user - interface (GUI). For this you have to overload five - virtual functions. - -\starttyping - virtual bool hasGui() const { return true; } -\stoptyping - This function informs the host whether there is an GUI or not. - -\starttyping - virtual bool guiVisible() const { return gui->isVisible(); } -\stoptyping - This fuction returns \type{true} if your GUI is visible. - -\starttyping - virtual void showGui(bool val) const { gui->setShown(val); } -\stoptyping - This function shows or hides the GUI. - - There are two helper functions the plugin host uses to save - and restore the GUI geometry across sessions: - -\starttyping - virtual void getGeometry(int* x, int* y, int* w, int* h) const; - virtual void setGeometry(int, int, int, int); -\stoptyping - -% -%----------------------------------- -% Persistent Parameters -%----------------------------------- -% -\subsection{Persistent Parameters} - - The plugin host can save and restore plugin parameter across - sessions. When the host saves his session status, he calls - the midi plugin function: - -\starttyping - virtual void getInitData(int* len, const unsigned char**p) const; -\stoptyping - - You can overload this function to return a pointer to your - session data and the len of the data block. - - When the session is restored, the host calls - -\starttyping - virtual void setInitData(int len, const unsigned char* p); -\stoptyping - - which you can use to restore the last plugin state. -% -%----------------------------------- -% Host Access Functions -%----------------------------------- -% - -\subsection{Host Access Functions} - - The plugin host supplies some functions which are - accessible through the \type{MempiHost*} in the - \type{Mempi} interface. - - The host supplies the following functions: - -\starttyping - int division() const; -\stoptyping - \index{division()} - returns the midi \type{division} value which gives the number - of midi ticks per midi beat, typically 384. - -\starttyping - int tempo(unsigned tick) const; -\stoptyping - \index{tempo()} - returns the midi tempo value. - -\starttyping - unsigned tick2frame(unsigned tick) const; -\stoptyping - \index{tick2frame()} - This function converts a transport position given in midi ticks - to a audio frame position. - -\starttyping - unsigned frame2tick(unsigned frame) const; -\stoptyping - \index{frame2tick()} - This function converts a transport position given in audio frames - to midi ticks. - -\starttyping - void bar(int tick, int* bar, int* beat, unsigned* rest) const; -\stoptyping - \index{bar()} - This function return bar/beat and a tick rest for a given - tick position. - -\starttyping - unsigned bar2tick(int bar, int beat, int tick) const; -\stoptyping - This is the opposite to the \type{bar} function. It converts - a time position given in bar/beat/tick into a midi tick value. - -% -%----------------------------------- -% Midi Synthesizer -%----------------------------------- -% -\subsection{Midi Synthesizer} - As an example for a midi synthesizer plugin we use a midi - metronome. - - Lets start with the class definition: - -\starttyping -#include "../libmidiplugin/mempi.h" - -//--------------------------------------------------------- -// metronom - simple midi metronom -//--------------------------------------------------------- - -class Metronom : public Mempi { - - protected: - struct InitData { - char measureNote; - char measureVelo; - char beatNote; - char beatVelo; - } data; - MetronomGui* gui; - friend class MetronomGui; - - unsigned int nextTick; - unsigned int lastTo; - - virtual void process(unsigned, unsigned, MPEventList*, - MPEventList*); - - public: - Metronom(const char* name, const MempiHost*); - ~Metronom(); - virtual bool init(); - - virtual bool hasGui() const { return true; } - virtual bool guiVisible() const { return gui->isVisible(); } - virtual void showGui(bool val) { gui->setShown(val); } - virtual void getGeometry(int* x, int* y, int* w, int* h) const; - virtual void setGeometry(int, int, int, int); - - virtual void getInitData(int*, const unsigned char**) const; - virtual void setInitData(int, const unsigned char*); - }; -\stoptyping - -% -%----------------------------------- -% MESS interface -%----------------------------------- -% -\chapter {The M.E.S.S (MusE Experimental Software Synthesizer) API} - - M.E.S.S.\index{M.E.S.S.} stands for MusE Experimental Soft Synth and is - an API/interface (like DSSI) to enable programmers to easily create their - own softsynths. - - The interface for a M.E.S.S.-synth consists of two classes, the Mess and - MessGui. In short, the framework provides the Mess (the synth) midi data - (notes, controllers and sysexes) and methods that handle the IPC between - the gui and the synth, so the programmer can focus on DSP-issues instead. - - The interface for the synth is specified in the mess.h file in the libsynti - directory. The interface for the MessGui is specified in the gui.h file. - -\starttyping -//--------------------------------------------------------- -// Mess -// MusE experimental software synth -// Instance virtual interface class -//--------------------------------------------------------- - -class Mess { - MessP* d; - - int _sampleRate; - int _channels; // 1 - mono, 2 - stereo - - public: - Mess(int channels); - virtual ~Mess(); - - int channels() const { return _channels; } - int sampleRate() const { return _sampleRate; } - void setSampleRate(int r) { _sampleRate = r; } - - virtual void process(float** data, int offset, int len) = 0; - - // the synti has to (re-)implement processEvent() or provide - // some of the next three functions: - - virtual bool processEvent(const MidiEvent&); - virtual bool setController(int, int, int) { return false; } - virtual bool playNote(int, int, int) { return false; } - virtual bool sysex(int, const unsigned char*) { return false; } - - virtual void getInitData(int*, const unsigned char**) const {} - virtual int getControllerInfo(int, const char**, int*, int*, int*) - const { return 0; } - virtual const char* getPatchName(int, int, int) - const { return "?"; } - virtual const MidiPatch* getPatchInfo(int, const MidiPatch*) - const { return 0; } - - // synthesizer -> host communication - void sendEvent(MidiEvent); // called from synti - MidiEvent receiveEvent(); // called from host - int eventsPending() const; - - // GUI interface routines - virtual bool hasGui() const { return false; } - virtual bool guiVisible() const { return false; } - virtual void showGui(bool) {} - virtual void getGeometry(int* x, int* y, int* w, int* h) const; - virtual void setGeometry(int, int, int, int) {} - }; -\stoptyping - -\section{Overview of virtual member functions} - This is a short description of the virtual functions in the Mess-class: -\subsection{process} -\starttyping -virtual void process(float** data, int offset, int len) = 0; -\stoptyping - This is where the audio processing takes place. The Mess is called with a float array, and - it's up to the programmer to fill it with data beginning at data[offset] to data[offset+len]. - -\subsection{processEvent} - There are two ways to go when it comes to how midi data is fed into the Mess. You can either - implement processEvent and manage the different event types (controllers, sysexes and notes) - or implement one or more of the setController, playNote and sysex functions. - - - Note that overriding processEvent results in setController, playNote and sysex - not being called! - -\subsection{setController, playNote, sysex} - The setController, playNote and sysex functions should return false if the event was - processed, true if the synth was busy. - -\starttyping -virtual bool setController(int channel, int ctrlNo, int value) -virtual bool playNote(int channel, int pitch, int velo) -virtual bool sysex(int length, const unsigned char* data) -\stoptyping - -\subsection{getInitData} - MusE provides an interface for storing the state of the synth in the project file. - getInitData is called when the project is saved, and provides a pointer to a data - block where you store the data which will recreate the synths current state when - the project is reopened. -\starttyping -virtual void getInitData(int* nrofchars, const unsigned char** data) - const {} -\stoptyping - -\subsection{getControllerInfo} - getControllerInfo is called when the Mess is instantiated, and this is where - you tell MusE which controllers the Mess supports. The function is called - repeteadly: just fill in the values for the controller and return the index - you want to be sent next time. Return 0 when you've given MusE information about - all controllers your Mess supports. - - As you can see, the necessary parameters are an index (used internally), a name - for the controller, an int describing the actual controller number (f.ex. 91 for - reverb), and finally min and max values for the controller. - -\starttyping -virtual int getControllerInfo(int index, - const char** name, - int* controller, - int* min, - int* max) const -\stoptyping - -\subsection{hasGui} - hasGui is called when the Mess is instantiated, and tells MusE if the synth has - a gui or not. -\starttyping -virtual bool hasGui() const; -\stoptyping - -\subsection{showGui} -showGui is called from MusE when the gui is supposed to be visible -\starttyping -virtual void showGui(bool show); -\stoptyping - -\subsection{getPatchName, getPatchInfo} - getPatchName and getPatchInfo are used to give MusE information about patches, - which can be selected in the track inspector. - - The getPatchName function specifies three parameters to be passed: channel, - program, and a third that is unused. It is the responsibility for the synth - to return the patchname for the particular channel and a program. - -\starttyping -virtual const char* SimpleSynth::getPatchName(int channel, int program, - int unused) const -\stoptyping - - getPatchInfo is called repeatedly until the synth returns 0. The synth must - send information back in a MidiPatch struct. The MidiPatch parameter sent - contains information on the last MidiPatch that was sent from the synth - (a null pointer on first call). - -\starttyping -virtual const MidiPatch* getPatchInfo(int channel, - const MidiPatch* previouspatch) - const; - -struct MidiPatch { - signed char type; // 1 - GM 2 - GS 4 - XG - signed char hbank, lbank, prog; - const char* name; - }; -\stoptyping - - -\subsection{Descriptor} - Since the synths are built as shared libraries, you need to specify a descriptor - for your MESS. They look something like this: (example taken from SimpleSynth/SimpleDrums) - -\starttyping -static Mess* instantiate(int sr, const char* name) - { - printf("SimpleSynth sampleRate %d\n", sr); - SimpleSynth* synth = new SimpleSynth(sr); - if (!synth->init(name)) { - delete synth; - synth = 0; - } - return synth; - } -extern "C" - { - static MESS descriptor = { - "SimpleSynth", - "Mathias Lundgren (lunar_shuttle@users.sf.net)", - "0.1", //Version string - MESS_MAJOR_VERSION, MESS_MINOR_VERSION, - instantiate, - }; - const MESS* mess_descriptor() { return &descriptor; } - } -\stoptyping - -\section{MessGui} - For the Gui, there's really only one method that is interesting, processEvent. - processEvent in the gui is called whenever the synth sends it a midiEvent, which - it does with send(MidiEvent ). - Since this is the only method of communicating the gui can send midimessages - to the synth via sendEvent, sendController and sendSysex calls. -\starttyping -virtual void processEvent(const MidiPlayEvent&) {}; -\stoptyping - - -\completeindex -\stoptext diff --git a/muse/doc/man/de/CMakeLists.txt b/muse/doc/man/de/CMakeLists.txt deleted file mode 100644 index ac009499..00000000 --- a/muse/doc/man/de/CMakeLists.txt +++ /dev/null @@ -1,52 +0,0 @@ -#============================================================================= -# MusE -# Linux Music Editor -# $Id:$ -# -# Copyright (C) 2002-2006 by Werner Schweer and others -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -#============================================================================= - -add_custom_target ( - manual - DEPENDS - ${CMAKE_CURRENT_SOURCE_DIR}/man-de.tex - ${CMAKE_CURRENT_SOURCE_DIR}/projekte.tex - ${CMAKE_CURRENT_SOURCE_DIR}/miditracks.tex - ${CMAKE_CURRENT_SOURCE_DIR}/struktur.tex - ${CMAKE_CURRENT_SOURCE_DIR}/midirecording.tex - ${CMAKE_CURRENT_SOURCE_DIR}/installation.tex - ${CMAKE_CURRENT_SOURCE_DIR}/automation.tex - COMMAND ${TEXEXEC_PATH}/texexec - ARGS --language=en --verbose --batch --pdf - --result=man-de.pdf - ${CMAKE_CURRENT_SOURCE_DIR}/man-de.tex - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ) - -install_files ( /share/${MusE_INSTALL_NAME}/doc/ .pdf - ${CMAKE_CURRENT_BINARY_DIR}/man-de.pdf ) - -set (extraClean man-de.log man-de.tmp man-de.tuo man-de.tui - man-de-mpgraph.mp mpgraph.mp ) - -set_directory_properties( PROPERTIES - ADDITIONAL_MAKE_CLEAN_FILES "${extraClean}" - ) - -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/figurepath.tex.in - ${CMAKE_CURRENT_BINARY_DIR}/figurepath.tex - ) - diff --git a/muse/doc/man/de/automation.tex b/muse/doc/man/de/automation.tex deleted file mode 100644 index 36e2872b..00000000 --- a/muse/doc/man/de/automation.tex +++ /dev/null @@ -1,33 +0,0 @@ - -%% \chapter{Automation} -\section{Betriebsarten} - - In \M\ gibt es vier verschiedene Automations-Betriebsarten: - - \blank[big] - \Input{Manuell:} - Im manuellen Modus kommen Controllerveränderungen nur - vom Mixer oder ChannelInfo. Die Schieber, Regler und - Eigabefelder zeigen den aktuellen Zustand der Midigeräte. - Wird z.B. der Volume Schieber bewegt, wo werden sofort - entsprechende Midi Events zu den angeschlossenen Midigeräten - geschickt. - - \Input{Read:} - Die aktuellen Controllerwerte kommen ausschließlich von den - aufgezeichneten Controller Spuren. - Schieber und Regler des Mixers und des ChannelInfo Windows - können manuell nicht verändert werden. - - \Input{Write:} - Bei Play oder Record werden alte Controllerwerte - durch die Werte der Schieber und Regler berschrieben. - - \Input{Read/Write:} - Wird ein Schieber oder Regler angeclickt, so wird die - Automation Betriebsart bis zum ''release'' von ''read'' auf ''write'' - umgeschaltet. Alle Controllerbewegungen werden aufgezeichnet - und überschreiben alte Werte. - - \blank[big] - diff --git a/muse/doc/man/de/figurepath.tex.in b/muse/doc/man/de/figurepath.tex.in deleted file mode 100644 index 0e2f7023..00000000 --- a/muse/doc/man/de/figurepath.tex.in +++ /dev/null @@ -1,2 +0,0 @@ -\setupexternalfigures[directory={@CMAKE_SOURCE_DIR@/doc/man}] - diff --git a/muse/doc/man/de/installation.tex b/muse/doc/man/de/installation.tex deleted file mode 100644 index 4b45531c..00000000 --- a/muse/doc/man/de/installation.tex +++ /dev/null @@ -1,63 +0,0 @@ -%% \chapter{Installation} - \section{Tips für Ubuntu/Kubuntu} - - \subsection{Alsa-Sequencer} - - \M\ benötigt das ALSA Sequencer Modul. Dies wird von Ubuntu leider - beim Systemstart nicht installiert. - - Wir können das aber leicht durch einen Eintrag in {\tt /etc/modules} - beheben: - - \starttyping - sudo bash - modprobe snd-seq - 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 - (RTC = "realtime clock") von Linux - verwehrt. \M\ benötigt jedoch eine genaue Uhr, um ein exaktes - Miditiming erzeugen zu können. - Zunächst wollen wir daher die RTC für alle Audioprogrammen - verfügbar machen: - - \starttyping - sudo chown -vv root:audio /dev/rtc - sudo chmod g+rw /dev/rtc - \stoptyping - - Jetzt haben alle Programme der audio Gruppe Zugriff auf die - RTC, dürfen jedoch noch nicht die hohen von \M\ benötigten - Auflösungen einstellen. - Um dies zu Erlauben geben wir ein: - - \starttyping - sudo bash - echo 1024 > /proc/sys/dev/rtc/max-user-freq - echo dev.rtc.max-user-freq=1024 >> /etc/sysctl.conf - \stoptyping - - 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/doc/man/de/man-de.tex b/muse/doc/man/de/man-de.tex deleted file mode 100644 index 2269e25a..00000000 --- a/muse/doc/man/de/man-de.tex +++ /dev/null @@ -1,413 +0,0 @@ -%==================================================================== -% MusE Manual -% dies ist das MusE Manual -% -% (C) 2006 Copyright: Werner Schweer und Andere -%==================================================================== - -%---------------------------------------------------------- -% Setup -%---------------------------------------------------------- - -%\showframe -%\showsetups -\usemodule[chart] -\setupcolors[state=start] -\setupbodyfont[Palatino] -\language[de] - -% typeset in unicode (utf8) -% \enableregime[il1] -\enableregime[utf] - -\startuseMPgraphic{FunnyFrame} - picture p; numeric o; path a, b; pair c; - p := textext.rt(\MPstring{FunnyFrame}); - o := BodyFontSize; - a := unitsquare xyscaled(OverlayWidth,OverlayHeight); - p := p shifted (20, OverlayHeight-ypart center p); - drawoptions (withpen pencircle scaled 1pt withcolor .625red); - b := a superellipsed .95; - fill b withcolor .85white; draw b; - b := (boundingbox p) superellipsed .95; - fill b withcolor .85white; draw b; - draw p withcolor black; - setbounds currentpicture to a; - \stopuseMPgraphic - -\defineoverlay[FunnyFrame][\useMPgraphic{FunnyFrame}] -\defineframedtext[FunnyText][frame=off,background=FunnyFrame] -\def\StartFrame{\startFunnyText} -\def\StopFrame{\stopFunnyText} -\def\FrameTitle#1% - {\setMPtext{FunnyFrame}{\hbox spread 1em{\hss\strut#1\hss}}} -\setMPtext{FunnyFrame}{} - - -\define\M{MusE} -\define[1]\Index{{\it #1}\marginpar{#1}\index{#1}} - -\defineindenting[Cmdi][text=,separator=,width=fit,distance=1em] - -\define[1]\Cmd{ - \Cmdi - \framed[ - background=color, - width=fit, - align=right, - backgroundcolor=lightgray, - framecolor=blue] - {\tt\space #1}} - -\define[2]\CCmd{ - \Cmdi - \framed[ - background=color, - width=broad, - align=right, - backgroundcolor=lightgray, - framecolor=blue] - {\vbox{\hbox{\tt\space #1}\hbox{\tt\space #2}}}} - -%\define\startdescription{\startpacked} -\define\startdescription{} -%\define\stopdescription{\stoppacked} -\define\stopdescription{} - -\define[1]\Fig{\blank\hbox{\externalfigure[#1]}\blank} - -\define[2]\Screen{ - \placefigure[here][fig:#1]{#2}{\externalfigure[#1][scale=1600]} - } -\definedescription[Option][ - location=left, - headstyle=bold, - width=4em, - before={\startnarrower[left]\setupblank[0pt]}, - after={\stopnarrower\setupblank}] - -\definedescription[Filetype][ - location=left, - headstyle=bold, - width=6em, - before={\startnarrower[left]\setupblank[0pt]}, - after={\stopnarrower\setupblank}] - -\definedescription[FileList][ - location=left, - headstyle=bold, - width=7em, - before={\startnarrower[left]\setupblank[0pt]}, - after={\stopnarrower\setupblank}] - -\definedescription[Input][ - location=left, - headstyle=bold, - width=9em, - before={\startnarrower[left]\setupblank[0pt]}, - after={\stopnarrower\setupblank}] - -\definedescription[InputN][ - location=left, - headstyle=bold, - width=6em, - before={\startnarrower[left]\setupblank[0pt]}, - after={\stopnarrower\setupblank}] - -\define[2]\Figure{ - \placefigure - [#1][fig:#2]{} - {\externalfigure[pics/#2]} - } - -\define[1]\Menu{ - \placefigure[right][fig:#1]{} - {\externalfigure[pics/#1][scale=2000]} - } - -\definedescription[Opt][location=hanging,headstyle=bold,width=broad] - -\setuptyping[before=\blank\startbackground, after=\stopbackground\blank] % source code with background -\setupwhitespace[medium] - -\component figurepath.tex - -%---------------------------------------------------------- -% Body -%---------------------------------------------------------- - -\starttext - \language[de] - \mainlanguage[de] - \startstandardmakeup[doublesided=no] - \definebodyfont[10pt,11pt,12pt][rm][tfe=Regular at 48pt] - \tfe\setupinterlinespace - \hfill \color[red]{\M}\par - \hfill \color[blue]{Manual}\par - \vfill - \rightaligned{\externalfigure[titlelogo]} - \vfill - \hfill \color[blue]{DE}\par - \definebodyfont[10pt,11pt,12pt][rm][tfb=Regular at 24pt] - \tfb\setupinterlinespace - \hfill Version 1.0pre1\par - \stopstandardmakeup - - \startstandardmakeup[page=no] - \vfill - \M\ wird von SourceForge gehostet:\par - \type{http://sourceforge.net/projects/lmuse} - \blank[line] - Dieses Dokument wurde mit \pdfTeX\ und dem Macro Paket - \ConTeXt\ erstellt. - \blank - \copyright 2006 Werner Schweer und Andere\par - Titelgrafik \copyright Joachim Schiele - \stopstandardmakeup - - \completecontent - -\chapter{\M\ Quickstart} - \component midirecording.tex - \section{Audio Playback} - \section{Audio Recording} - -\component projekte.tex -\component struktur.tex -\component miditracks.tex - -\chapter{Automation} - \component automation.tex - -\chapter{Funktionsreferenz} - \section{Hauptfenster} - \subsection{Menüs} - Projekt - Open Project - Open Recent - Save Project - Import Midifile - Export Midifile - Import Wavefile - Quit - Edit - Undo - Redo - Cut - Copy - Paste - Delete Parts - Delete Selected Tracks - Add Track - Add Midi Track - Add Midi Output - Add Midi Input - Add Midi Generator - Add Wave Track - Add Audio Output - Add Audio Group - Add Audio Input - Add Soft Synth - Select - Select All - Deselect All - Invert Selection - Inside Loop - Outside Loop - All Parts on Track - Pianoroll - Midi Tracker - Drums - List - Master Track - Project Properties - - View - Transport Panel - Bigtime Window - Mixer 1 - Mixer 2 - Marker - - Structure - Global Cut - Global Insert - Global Split - Copy Range - Cut Events - Midi - Edit Instrument - Reset Instr. - Init Instr. - local off - Audio - Bounce To Track - Bounce To File - Restart Audio - Settings - Configure Shortcuts - Follow Song - dont follow Song - follow page - follow continuous - Midi Sync - Midi File Export - Preferences - - Help - Manual - MusE Homepage - Report Bug - About MusE - About Qt - What's This - - \subsection{Werkzeugleisten} - Project Buttons - Open - Save - Whats This - Undo - Redo - Edit Tools - Zeiger - Stift - Radiergummi - Schere - Kleber - Linientool - Mute - Transport - Loop - Punch In - Punch Out - Gehe nach Anfang - Zurückspulen - Vorspulen - Stop - Play - Record - Panic - Arranger - Cursor - Snap - Len - Pitch - Tempo - 50% - N - 200% - Trackliste - Einstellungen - m global Mute - s global Solo - aR global AutomationRead - aW global AutomationWrite - - Info Button - Mixer Button - - \subsection{Trackliste} - Midi Input - Midi Output - Midi Track - Midi Synthesizer - Audio Track - Audio Input - Audio Output - Audio Group - Audio Synthesizer - - \subsection{Arranger} - Lineal - Marker - Locator - - - \section{Globale Editor Funktionen} - \subsection{Globaler Schnitt} - Die ''Globaler Schnitt''-Funktion enfernt auf allen Spuren den Bereich - zwischen der linken und rechten Marke. Nachfolgende Events rücken - dabei auf. Auch Markerposition und Tempoevents werden - verschoben. Lediglich stumm geschaltete Spuren werden nicht - berücksichtigt. - - \subsection{Global Einfügen} - Mit der ''Global Einfügen''-Funktion kann ein leerer Bereich eingefügt - werden. Der Bereich wird an der Position des linken Markers - eingefügt. Die Dauer des eingefügten Bereichs entspricht dem Abstand - zwischen linker und rechter Marke. Marker und Tempoevents hinter der - Einfügeposition werden entsprechend verschoben. - Stumm geschaltete Spuren werden nicht verändert. - - \subsection{Global Splitten} - Die ''Global Splitten''-Funktion entspricht der Scheren-Funktion für - einzelne Parts. Im Gegensatz zur Scheren-Funktion wird jedoch nicht - ein Part, sondern alle Parts an der aktuellen Markerposition - geschnitten. Dies gilt nicht für stummgeschaltete Spuren. - - \subsection{Bereich Kopieren} - Mit der ''Global Kopieren''-Funktion können komplette Teile eines - Songs an eine andere Stelle kopiert werden: - - \startitemize[packed] - \item stellen Sie die linke Marke an den Anfang des zu kopierenden - Bereichs - \item stellen Sie die rechte Marke an das Ende des zu kopierenden - Bereichs - \item setzen Sie den Lokator an die Einfgestelle - \item wählen Sie ''Copy Range'' aus dem ''Struktur'' Menü. - \stopitemize - - Wie bei allen anderen Strukturkommandos werden stummgeschaltete - Spuren nicht berücksichtigt. - - \section{Arranger} - \subsection{Spurtypen} - \startitemize[packed] - \item Midispur - \item Audiospur - \item Midiinput - \item Midioutput - \item Midigenerator - \item Audioinput - \item Audiooutput - \item Audiogruppe - \item Software Synthesizer - \stopitemize - - \subsection{Spur Operationen} - \startitemize[packed] - \item Spur erzeugen - \item Spur löschen - \item Spur verschieben - \item Spur kopieren - \stopitemize - - \subsection{Part Operationen} - \startitemize[packed] - \item Part erzeugen - \item Part löschen - \item Part verschieben - \item Part kopieren - \item Part clonen - \item Part declonen - \item Part nach Vorne verlängern - \item Part nach Hinten verlängern - \item Part stummschalten - \item Part einfärben - \stopitemize - - \section{Pianoroll Editor} - \section{Drum Editor} - \section{Master Editor} - -\chapter{Installation} - \component installation.tex - -\startappendices - \component ../gpl.tex - \completeindex - \stopappendices -\stoptext - diff --git a/muse/doc/man/de/midirecording.tex b/muse/doc/man/de/midirecording.tex deleted file mode 100644 index c0c0e4d6..00000000 --- a/muse/doc/man/de/midirecording.tex +++ /dev/null @@ -1,119 +0,0 @@ -\section{Midi Recording} - Auf der ersten Tour werden wir mit \M\ eine Midi Spur - mit einem externen Synthesizer, einem Yamaha S90 aufnehmen. - - \subsection{Geräte verbinden} - Für den Anschluß von Midigeräten gibt es verschiedene Möglichkeiten. - - \subsubsection{Midi} - Der serielle Midi-Anschluß eines Keyboards eignet sich nicht zum - direkten Anschluß an den PC Serienport. Bei Midi handelt es sich - um eine galvanisch per Optokoppler getrennte Stromschnittstelle, - während der PC eine RS232 Schnittstelle mit 12 Volt Pegeln bedient. - Ein einfaches Umrüsten der PC-Schnittstelle mit einem Optokoppler - funktioniert nicht, da der PC die MIDI-Taktrate nicht erzeugen kann. - - Als Lösung muß ein spezielles Midi-Interface her. Meist befindet sich - eine Midi-Schnittstelle auf der Soundkarte. Doch Vorsicht, nicht - alle Midi-Schnittstellen sind gleich gut, z.B. sind einige alte - Soundblaster Modelle duch unglückliches Hardware-Design nicht in der - Lage, die volle Midi Transferrate beim Senden von Midi Daten zu - erreichen. - - \subsubsection{USB} - Viele aktuelle Midigeräte besitzen einen USB Anschluß. USB ist schnell - und flexibel und damit die Schnittstelle der Wahl. - - \subsubsection{ToHost} - Einige ältere Midigeräte bieten einen einfachen PC Anschluß über - einen normalen Serienport (''ToHost'' Schnittstelle genannt). Es - handelt sich um einen normalen RS232 Anschluß, der die PC-üblichen - Übertragungsraten versteht. - - \subsection{Neues Projekt erzeugen} - Dann kanns losgehen. Wir starten \M\ und es erscheint das - zuletzt bearbeitete Projekt so wie wir es verlassen haben. - - Um ein neues Projekt anzulegen clicken wir auf das Projekt - Icon und der Projektdialog erscheint: - - \Fig{select_project} - - Wenn \M\ zum allererstenmal gestartet wird, erscheint der - Projektdialog natürlich sofort, da es ja kein letztes Projekt - gibt. Zum Projektdialog gelangen wir auch über den Projekmenü - Eintrag ''Öffnen'' oder wer es ganz eilig hat tippt einfach - {\tt Ctrl+O}. - - In der ''Projekt'' Eingabezeile geben wir nun einen Projektnamen - für unser erstes Projekt ein und bestätigen dann durch clicken - des ''Ok'' Buttons. - - \M\ fragt nun nach einem Template, mit dem das Projekt - initialisiert werden soll: - - \Fig{select_template} - - Wir selektieren kein Template und clicken einfach ''Ok''. - \M\ zeigt dann ein leeres Projekt: - - \Fig{main0} - - \subsection{Setup} - - \subsubsection{Spuren anlegen} - - Zunächst erzeugen wir einen ''MidiInput'' Track und checken, - ob das Keyboard richtig angeschlossen ist. - - \subsubsection{Routing} - - \subsubsection{Midi Instrument} - Im ''MidiOutPort'' Strip kann ein Midi Instrument ausgewählt werden. - Dies ermöglicht es \M\ u.A. die Instrument-Patches anstatt per Nummer - per Name anzuzeigen. Instrumente werden in einer ''{\tt *.idf}'' - (Instrument Definition File) beschrieben. Dies sind normale XML Text - Dateien, die für jedes angeschlossene Gerät individuell erstellt werden - können. In einer {\tt *.idf} Datei kann in einem ''Init'' Eintrag eine - Serien von Midi Events definiert werden, die immer dann gesendet werden, - wenn in \M\ der {\tt Midi->InitInstr} Button aktiviert wird. Wir nutzen diese - Möglichkeit, um den S90 zu initialisieren. - - \subsubsection{Local Off} - Wird ein Synthesizer ''standalone'' betrieben, dann ist die Tastatur - intern direkt mit dem Tongenerator verbunden. Am Computer angeschlossen - möchten wir jedoch Tastatur und Tongenerator als unabhängige Teile - benutzen. Note On/Off Events sollen von der Tastatur nur zum Computer - geschickt werden und nicht auch gleich zum internen Tongenerator. - Der Tongenerator soll wiederum nur auf den Midi Input Anschluß hören - und nicht auf die Tastatur. Für den S90 kann dieser ''Local Off'' - Mode durch Senden des SysEx Strings - - \starttyping - 0xf0 0x10 0x6b 0x00 0x00 0x09 0x00 - \stoptyping - - eingeschaltet werden. - - \subsubsection{Sequencer Mode} - Der S90 kenn Yamaha-Typisch verschiedene Modi. Wir benutzen den - Sequencer Mode, in dem jedem Midi Kanal ein eigenes Instrument - zugeordnet werden kann. Dieser Modus wird mit dem SysEx String - - \starttyping - 0xf0 0x43 0x10 0x6b 0x0a 0x00 0x00 0x00 - \stoptyping - - eingeschaltet. Beide SysEx Kommandos sind unter dem ''init'' Label in - der {\tt Yamaha-S90.idf} Datei eingetragen. - - \subsubsection{Midi Input Filter} - Die Tastatur des Yamaha S90 kann ''After Touch'' Events erzeugen, d.h. - nach dem Drücken einer Taste werden fortlaufend Events über den - Anpreßdruck der Taste erzeugt. Diese Informationen benötigen wir - nicht und filtern deshalb alle After Touch Events gleich bei der - Aufnahme mittels des Midi Input Filters aus. - - \Fig{midifilter} - - \subsection{Aufnehmen} diff --git a/muse/doc/man/de/miditracks.tex b/muse/doc/man/de/miditracks.tex deleted file mode 100644 index 6e3a06c2..00000000 --- a/muse/doc/man/de/miditracks.tex +++ /dev/null @@ -1,132 +0,0 @@ - \section{Midi Routing} - - \section{Midi Setup} - \subsection{Einfaches Setup} - - In einem einfachen Setup ist jeder Midi Anschluss des Rechners - jeweils mit nur einem Midi Gerät verbunden. Außerdem hat jede - Midi Spur einen eigenen Midi Kanal. - Dieses Setup ist am flexibelsten und sollte nach Möglichkeit - immer verwendet werden. - - \subsection{Erweitertes Setup} - - \index{mehrere Midi Spuren für einen Midi Kanal} - Im erweiterten Setup werden mehrere Midi Spuren auf den gleichen - Midi Kanal geroutet. Es ist zu beachten, das Midi Controller - natürlich immer für alle Spuren des Kanals gelten. Controller - können nicht individuell für jede Spur eingestellt werden. - - \subsection{Komplexes Setup} - \index{mehrere Geräte an einem Midi Anschluß} - Als komplex bezeichnen wir ein Setup, in dem an einem Midi Anschluß - mehrere Midi Geräte angeschlossen sind. - Jedes Gerät belegt einen oder mehrere der verfügbaren 16 Midi - Kanäle. Es ist darauf zu achten, das die vergebenen Kanäle nicht - überlappen. Dazu müssen die angeschlossenen Midi Geräte so - konfiguriert werden, das sie nur auf die ihnen zugewiesenen Kanäle - reagieren. - - Midi Meldungen, die nicht kanalgebunden sind (wie z.B. Sysex - Meldungen) können an bestimmte Geräte gesendet werden, indem - man jedem Gerät eine individuelle Geräte-Id gibt. Diese Geräte-Id - muß dann in die entsprechenden Meldungen als Zieladresse angegeben - werden. - - Da Midi Verbindungen nur eine sehr bescheidene \index{Midi Bandbreite} - Bandbreite besitzen, sollte nach Möglichkeit das komplexe Setup - vermieden werden. - - \section{Midi Eingänge} - Ein Midi Eingang wird im Mixer als Strip und im Arranger als - eigene Spur gezeigt. - - Ein Midi Eingang hat folgende Eigenschaften: - - \blank[big] - \Input{Alsa Port:} dies ist die Route zu einem ALSA Midi Eingangs - Port. Ein ALSA Port kann mit mehreren Midi Eingängen verbunden - werden. - \Input{Plugins:} die von ALSA gelesenen Midi Events können durch - mehrere Plugins geroutet werden. Verfügbare Plugins filtern oder - verändern die Midi Events. - \Input{Outputs:} ein Midi Eingang hat 16 Ausgänge, jeweils ein - Ausgang für jeden Midi Kanal. Jeder Midi Kanal kann individuell - zu einem oder mehreren Midi Spuren geroutet werden. - Midi Events, die von den Midi Spuren empfangen werden, haben - keine Kanal-Information mehr. - In einem einfachen Setup werden alle Kanäle aller Midi Eingänge - zu allen Midi Spuren geroutet. Dies ist die Standard Vorgabe. - \par - - \blank[big] - - \section{Midi Spur} - Die Midi Spur enthält alle Midi Note On/off Events. Sie wird im - Mixer als Strip und im Arranger als Spur dargestellt. Die - Strip Darstellung im Mixer ist nicht sehr interessant, da eine - Midi Spur kaum eigene Mixer relevante Parameter besitzt. In einem - normalen Setup sollten Midi Spuren im Mixer ausgeblendet werden. - - Midi Spur Eigenschaften: - - \blank[big] - \Input{Record:} schaltet die Spur in den Record Modus - - \Input{Monitor:} ist der Monitor Schalter eingeschaltet, werden - bei Record alle Input Events zum Ausgang weitergereicht. - Achtung: dies kann möglicherweise zu Midi Rückkopplungen - führen! - - \Input{Mute:} schaltet die Spur stumm - - \Input{Solo:} ---nocht nicht definiert--- - - \Input{Eingang:} die Spur Eingänge können zu Midi Eingängen - geroutet werden - - \Input{Ausgang:} der Spur Ausgang kann zu einem oder mehreren - Midi Kanälen geroutet werden. Midi Kanäle sind immer mit - einem Midi Port verbunden. - - \blank[big] - - \section{Midi Kanäle} - Midi Kanäle enthalten normalerweise alle Midi Controller Events. - - Midi Kanal Eigenschaften: - - \blank[big] - - \blank[big] - - \section{Midi Port} - - \index{Midi Port} Ein Midi Port representiert ein externes Midi - Gerät und hat folgende Eigenschaften: - - \blank[big] - \Input{Instrument:} \index{Midi Instrument} beschreibt die - Eigenschaften des externen - Midi Instruments. Das Instrument kann aus einer Liste verfügbarer - Instrumentbeschreibungen ausgewählt werden. - - \Input{Master Volume:} \index{Midi Master Volume} ist ein Midi - Controller, der die Lautstärke für alle Channel des Midi Ports - einstellt. - - \Input{Geräte Id:} \index{Midi Geräte Id} werden mehrere Midigeräte - an einen Midi Port - angeschlossen, so müssen alle Geräte eine eindeutige Geräte Id - besitzen. Mit dieser Id kann dann ein bestimmtes Gerät - ausgewählt werden. - - \Input{Alsa Port:} dies ist die Route zu einem ALSA Midi Port. - Ein Port Ausgang kann mit mehreren ALSA Ports verbunden werden. - - \blank[big] - - Jeder Midi Port besitzt 16 Kanäle. - - \section{Midi Synthesizer} - diff --git a/muse/doc/man/de/projekte.tex b/muse/doc/man/de/projekte.tex deleted file mode 100644 index dcaa6c9a..00000000 --- a/muse/doc/man/de/projekte.tex +++ /dev/null @@ -1,102 +0,0 @@ -\chapter{Projekte} - - \section{Projekte} - - Ein \M\ Projekt \index{Projekt} ist ein Ordner, der alle - Dateien des Projekts enthält. Dies sind im wesentlichen die - aufgenommenen Wavedateien und die Projektdatei \index{Projektdatei}. - Die Projektdatei enthält alle - Informationen über das Projekt sowie alle Midi Daten soweit - vorhanden. - - Beispiel einer Projekt Ordnerstruktur: - - \starttyping - ~/MusE - projects - song1 - song1.med - rec1.wav - rec1.wca - rec2.wav - rec2.wca - song2 - . - . - \stoptyping - - Im oberen Beispiel ist {\tt song1} der Projektordner - \index{Projektordner} und - {\tt song1.med} die Projektdatei. Die {\tt *.wav} Dateien sind - Audio Aufzeichnungen und die zugehörigen {\tt *.wca} Dateien - enthalten vorberechnete Daten zum schnellen Zeichnen der - Wellenformdarstellung auf den Bildschirm. - - Der Standard-Projektordner \index{Standard-Projektordners} - {\tt ~/MusE/projects} kann im ''Präferenzen'' Menü eingestellt - werden. - - \section{Projekt auswählen} - - Nach dem Start von \M\ muß immer zunächst ein Projekt geladen oder - ein neues Projekt erzeugt werden. - - \Screen{select_project}{Projekt auswählen} - - Normalerweise wird nach dem Start von \M\ das zuletzt bearbeitete - Projekt geladen. Wer das nicht mag kann unter ''Präferenzen'' - einstellen, ob beim Start ein Standardprojekt \index{Standardprojekt} - geladen oder immer zunächst nach einen Projekt gefragt werden soll. - - \section{Templates} - - Wird bei der Projektauswahl ein neues Projekt ausgewählt, dann - wird im nächsten Schritt ein Dialog gezeigt, in dem ein Template - aus einer Liste von verfügbaren Templates ausgewählt werden kann. - Ein Template bestimmt die Grundeinstellungen für ein neues - Projekt. Ein Template kann ein komplettes Projekt sein, welches - jedoch keine Audiodaten enthalten kann und welches in der Regel - auch keine Midi Daten enthält. - - \Screen{select_template}{Template auswählen} - - \M\ sucht Templates an zwei Orten: - im globalen \M\ Installationspfad (Factory Presets) sowie im - \M\ Verzeichnis relativ zum {\tt HOME} Verzeichnis des - Anwenders (User Presets) - - \section{Projekt sichern (Backup)} - - Es gibt keine in \M\ eingebaute Funktion zum Sichern von Projekten. - Da sich aber alle Projektdaten in einem Ordner befinden, - können Standard-Tools zum Sichern verwendet werden. - - Projekte sind immer in sich komplett und enthalten keine Verweise - auf Dateien außerhalb des Projektordners. Dies gilt nicht - für Soundfonts \index{Soundfonts}, die z.B. vom Fluid-Synthesizer - Plugin verwendet werden. - Es wird empfohlen, diese Soundfonts\index{Soundfonts} - auch als Kopie im Projektordner abzulegen. - - Projekte können auf der Platte ohne Probleme verschoben werden, - da sie keine absoluten Pfade enthalten. - - \section{Wavedateien und Samplerate} - - \index{Wavedateien}\index{Audioprojekte}\index{Midiprojekte} - \index{Samplerate} - MusE unterscheidet zwischen Midiprojekten und Audioprojekten. - Audioprojekte enthalten zusätzlich zu eventuell vorhandenen - Mididaten Wavedateien. - - Audioprojekte sind immer mit einer bestimmten Samplerate - verbunden und können nur geladen und bearbeitet werden, wenn - die Projekt Samplerate mit der aktuellen Samplerate übereinstimmt. - - Die aktuelle Samplerate wird immer vom JACK Server bestimmt und - kann von \M\ nicht verändert werden. - - Werden Wavedateien mit einer anderen Samplerate als der aktuellen - importiert, so müssen sie konvertiert (resampled\index{resample}) - werden. - diff --git a/muse/doc/man/de/struktur.tex b/muse/doc/man/de/struktur.tex deleted file mode 100644 index bd762d79..00000000 --- a/muse/doc/man/de/struktur.tex +++ /dev/null @@ -1,43 +0,0 @@ -\chapter{Struktur} - \section{Spuren} - - Ein Projekt besteht aus Spuren analog einer analogen Bandmaschine. - Die Spuren enthalten Midi- Audio- oder Controllerdaten. - Spuren werden in \M\ in zwei Formen dargestellt: - - \blank[big] - \Input{Arranger:} im Arranger werden alle Spuren vertikal in einer - Liste dargestellt - - \Input{Mixer:} der Mixer zeigt alle Spuren in einer horizontalen - Darstellung\par - - \blank[big] - - Tempo und Taktart sind interne Spuren, die nicht im Arranger oder - Mixer gezeigt werden. - - \section{Parts} - - Midi- und Audiospuren können auf der Zeitachse in Parts unterteilt - werden. Parts enthalten Midi- Audio- oder Conrollerdaten. - - Folgenden Operationen sind mit Parts möglich: - - \blank[big] - \Input{verschieben} Parts können auf der Zeitachse und in andere - Spuren des gleichen Typs verschoben werden. - \Input{kopieren} klar! - \Input{klonen} erzeugt einen Part, der sich die Midi- Audio- oder - Controllerdaten mit dem Quellpart teilt. Wird ein Event in - einem Clone-Parts verändert, so verändern sich auch alle - Clones. - - \Input{Stumm} Parts können stumm geschaltet werden. Stumme Parts - werden im Arranger grau dargestellt. - - \par - \blank[big] - - - diff --git a/muse/doc/manual-de.odt b/muse/doc/manual-de.odt Binary files differnew file mode 100644 index 00000000..1a8fb669 --- /dev/null +++ b/muse/doc/manual-de.odt diff --git a/muse/muse/CMakeLists.txt b/muse/muse/CMakeLists.txt index 000a8787..9ef460c3 100644 --- a/muse/muse/CMakeLists.txt +++ b/muse/muse/CMakeLists.txt @@ -32,7 +32,6 @@ subdirs ( instruments marker liste - arranger waveedit ) @@ -48,6 +47,9 @@ QT4_WRAP_UI (muse_ui_headers templatedialog.ui importmidi.ui routedialog.ui + configtrack.ui + midiportinfo.ui + miditrackinfo.ui ) QT4_WRAP_CPP ( muse_moc_headers @@ -85,6 +87,15 @@ QT4_WRAP_CPP ( muse_moc_headers rack.h routedialog.h strip.h + arranger.h + canvas.h + configtrack.h + partdrag.h + tllineedit.h + tlswidget.h + tlwidget.h + trackdrag.h + trackinfo.h ) QT4_ADD_RESOURCES (muse_qrc_files muse.qrc) @@ -173,6 +184,17 @@ add_executable ( muse rack.cpp routedialog.cpp strip.cpp + + arranger.cpp + canvas.cpp + configtrack.cpp + partdrag.cpp + tllineedit.cpp + tlswidget.cpp + tlwidget.cpp + tlwlayout.cpp + trackdrag.cpp + trackinfo.cpp ) set_target_properties( muse @@ -186,7 +208,6 @@ target_link_libraries(muse marker liste synti - arranger waveedit widgets al diff --git a/muse/muse/arranger/arranger.cpp b/muse/muse/arranger.cpp index 7b4be381..82c859cb 100644 --- a/muse/muse/arranger/arranger.cpp +++ b/muse/muse/arranger.cpp @@ -1226,7 +1226,7 @@ void Arranger::moveTrack(Track* src, Track* dst) //! @param e The key event //--------------------------------------------------------- -void Arranger::keyPressEvent(QKeyEvent* e) +void Arranger::keyPressEvent(QKeyEvent* /*e*/) { printf("Arranger::keyPressEvent\n"); #if 0 //TODOB @@ -1328,7 +1328,7 @@ void Arranger::keyPressEvent(QKeyEvent* e) @param t Track the selected part belongs to (null if no part selected) @param p The selected Part (null if no part selected) */ -void Arranger::kbdMovementUpdate(Track* t, Part* p) +void Arranger::kbdMovementUpdate(Track*, Part*) { printf("kbdMovementUpdate\n"); // if (t && p ) { diff --git a/muse/muse/arranger/arranger.h b/muse/muse/arranger.h index 1c9f6e38..1c9f6e38 100644 --- a/muse/muse/arranger/arranger.h +++ b/muse/muse/arranger.h diff --git a/muse/muse/arranger/CMakeLists.txt b/muse/muse/arranger/CMakeLists.txt deleted file mode 100644 index b58f6114..00000000 --- a/muse/muse/arranger/CMakeLists.txt +++ /dev/null @@ -1,60 +0,0 @@ -#============================================================================= -# MusE -# Linux Music Editor -# $Id:$ -# -# Copyright (C) 2002-2006 by Werner Schweer and others -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -#============================================================================= - -QT4_WRAP_CPP ( arranger_mocs - arranger.h - canvas.h - configtrack.h - partdrag.h - tllineedit.h - tlswidget.h - tlwidget.h - trackdrag.h - trackinfo.h - ) - -QT4_WRAP_UI ( arranger_ui_headers - configtrack.ui - midiportinfo.ui - miditrackinfo.ui - ) - -add_library ( arranger STATIC - ${arranger_ui_headers} - ${arranger_mocs} - selectfilter.h - tlwlayout.h - trelement.h - arranger.cpp - canvas.cpp - configtrack.cpp - partdrag.cpp - tllineedit.cpp - tlswidget.cpp - tlwidget.cpp - tlwlayout.cpp - trackdrag.cpp - trackinfo.cpp - ) - -set_target_properties( arranger - PROPERTIES COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all.h" - ) - diff --git a/muse/muse/arranger/canvas.cpp b/muse/muse/canvas.cpp index 614cf3e3..614cf3e3 100644 --- a/muse/muse/arranger/canvas.cpp +++ b/muse/muse/canvas.cpp diff --git a/muse/muse/arranger/canvas.h b/muse/muse/canvas.h index 911936c2..911936c2 100644 --- a/muse/muse/arranger/canvas.h +++ b/muse/muse/canvas.h diff --git a/muse/muse/arranger/configtrack.cpp b/muse/muse/configtrack.cpp index a8fee6a3..a8fee6a3 100644 --- a/muse/muse/arranger/configtrack.cpp +++ b/muse/muse/configtrack.cpp diff --git a/muse/muse/arranger/configtrack.h b/muse/muse/configtrack.h index 47dd0f4a..47dd0f4a 100644 --- a/muse/muse/arranger/configtrack.h +++ b/muse/muse/configtrack.h diff --git a/muse/muse/arranger/configtrack.ui b/muse/muse/configtrack.ui index 350b405a..350b405a 100644 --- a/muse/muse/arranger/configtrack.ui +++ b/muse/muse/configtrack.ui diff --git a/muse/muse/importmidi.cpp b/muse/muse/importmidi.cpp index c995ed67..0bd33df8 100644 --- a/muse/muse/importmidi.cpp +++ b/muse/muse/importmidi.cpp @@ -36,7 +36,7 @@ #include "templatedialog.h" #include "audio.h" #include "mixer.h" -#include "arranger/arranger.h" +#include "arranger.h" #include "midictrl.h" #include "midiinport.h" #include "midioutport.h" diff --git a/muse/muse/jack.cpp b/muse/muse/jack.cpp index ff32846e..bc372357 100644 --- a/muse/muse/jack.cpp +++ b/muse/muse/jack.cpp @@ -53,25 +53,6 @@ static void jack_thread_init (void* /*data*/) if (loadVST) fst_adopt_thread(); #endif - int policy; - if ( (policy = sched_getscheduler (0)) < 0) { - printf("cannot get current client scheduler for JACK thread: %s!\n", strerror(errno)); - } - else { - if (policy != SCHED_FIFO) - printf("JACK thread %d _NOT_ running SCHED_FIFO\n", getpid()); - else if (debugMsg) { - struct sched_param rt_param; - memset(&rt_param, 0, sizeof(sched_param)); - int type; - int rv = pthread_getschedparam(pthread_self(), &type, &rt_param); - if (rv == -1) - perror("get scheduler parameter"); - printf("JACK thread running SCHED_FIFO priority %d\n", - rt_param.sched_priority); - } - } - } //--------------------------------------------------------- @@ -816,10 +797,10 @@ void JackAudio::putEvent(Port port, const MidiEvent& e) } void* pb = jack_port_get_buffer(port.jackPort(), segmentSize); int ft = e.time() - _frameCounter; - if (ft < 0 || ft >= (int)segmentSize) { + if (ft < 0) + ft = 0; + if (ft >= (int)segmentSize) { printf("JackAudio::putEvent: time out of range %d(seg=%d)\n", ft, segmentSize); - if (ft < 0) - ft = 0; if (ft > (int)segmentSize) ft = segmentSize - 1; } diff --git a/muse/muse/arranger/midiportinfo.ui b/muse/muse/midiportinfo.ui index ad8ae201..ad8ae201 100644 --- a/muse/muse/arranger/midiportinfo.ui +++ b/muse/muse/midiportinfo.ui diff --git a/muse/muse/arranger/miditrackinfo.ui b/muse/muse/miditrackinfo.ui index c1624188..c1624188 100644 --- a/muse/muse/arranger/miditrackinfo.ui +++ b/muse/muse/miditrackinfo.ui diff --git a/muse/muse/mstrip.cpp b/muse/muse/mstrip.cpp index d4c48f5e..64b8132c 100644 --- a/muse/muse/mstrip.cpp +++ b/muse/muse/mstrip.cpp @@ -3,7 +3,7 @@ // Linux Music Editor // $Id:$ // -// Copyright (C) 2002-2006 by Werner Schweer and others +// Copyright (C) 2002-2008 by Werner Schweer and others // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2. @@ -75,7 +75,7 @@ void addMidiTracks(QMenu* menu, Track* track, int channel, bool input) // can only be added to input route lists //--------------------------------------------------------- -void addMidiInPorts(QMenu* menu, Track* dtrack, int channel) +void Strip::addMidiInPorts(QMenu* menu, Track* dtrack, int channel) { RouteList* rl = dtrack->inRoutes(); RouteNode dst(dtrack, channel, RouteNode::TRACK); @@ -84,8 +84,6 @@ void addMidiInPorts(QMenu* menu, Track* dtrack, int channel) for (iMidiInPort i = tl->begin();i != tl->end(); ++i) { MidiInPort* track = *i; QMenu* m = menu->addMenu(track->name()); - m->setSeparatorsCollapsible(false); - m->addSeparator()->setText(QT_TR_NOOP("Channels")); for (int ch = 0; ch < MIDI_CHANNELS; ++ch) { QAction* a = m->addAction(QString("Channel %1").arg(ch+1)); a->setCheckable(true); @@ -102,7 +100,7 @@ void addMidiInPorts(QMenu* menu, Track* dtrack, int channel) // can only be added to output route lists //--------------------------------------------------------- -static void addMidiOutPorts(QMenu* menu, Track* strack, int channel) +void Strip::addMidiOutPorts(QMenu* menu, Track* strack, int channel) { RouteList* rl = strack->outRoutes(); RouteNode src(strack, channel, RouteNode::TRACK); @@ -111,8 +109,6 @@ static void addMidiOutPorts(QMenu* menu, Track* strack, int channel) for (iMidiOutPort i = tl->begin();i != tl->end(); ++i) { MidiOutPort* op = *i; QMenu* m = menu->addMenu(op->name()); - m->setSeparatorsCollapsible(false); - m->addSeparator()->setText(QT_TR_NOOP("Channels")); for (int ch = 0; ch < MIDI_CHANNELS; ++ch) { QAction* a = m->addAction(QString("Channel %1").arg(ch+1)); a->setCheckable(true); @@ -138,8 +134,6 @@ static void addSyntiPorts(QMenu* menu, Track* strack, int channel) for (iSynthI i = sl->begin(); i != sl->end(); ++i) { SynthI* sy = *i; QMenu* m = menu->addMenu(sy->name()); - m->setSeparatorsCollapsible(false); - m->addSeparator()->setText(QT_TR_NOOP("Channels")); for (int ch = 0; ch < MIDI_CHANNELS; ++ch) { QAction* a = m->addAction(QString("Channel %1").arg(ch+1)); a->setCheckable(true); @@ -227,7 +221,6 @@ MidiStrip::MidiStrip(Mixer* m, MidiTrack* t, bool align) sl = new Awl::MidiVolEntry(this); sl->setId(CTRL_VOLUME); -// sl->setFont(config.fonts[1]); sl->setFixedHeight(entrySize.height()); connect(slider, SIGNAL(valueChanged(double,int)), SLOT(ctrlChanged(double, int))); @@ -287,13 +280,11 @@ MidiStrip::MidiStrip(Mixer* m, MidiTrack* t, bool align) iR = newInRouteButton(); grid->addWidget(iR, 14, 0); connect(iR->menu(), SIGNAL(aboutToShow()), SLOT(iRouteShow())); - connect(iR->menu(), SIGNAL(aboutToHide()), SLOT(iRouteHide())); connect(iR->menu(), SIGNAL(triggered(QAction*)), song, SLOT(routeChanged(QAction*))); oR = newOutRouteButton(); grid->addWidget(oR, 14, 1); connect(oR->menu(), SIGNAL(aboutToShow()), SLOT(oRouteShow())); - connect(oR->menu(), SIGNAL(aboutToHide()), SLOT(oRouteHide())); connect(oR->menu(), SIGNAL(triggered(QAction*)), song, SLOT(routeChanged(QAction*))); connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int))); @@ -311,34 +302,6 @@ MidiStrip::MidiStrip(Mixer* m, MidiTrack* t, bool align) } //--------------------------------------------------------- -// iRouteHide -//--------------------------------------------------------- - -void MidiStrip::iRouteHide() - { - // dont leave the menu if SHIFT is pressed; this allows - // for fast selecting of more than one input source - // - if (qApp->keyboardModifiers() & Qt::ShiftModifier) { - iR->menu()->show(); - } - } - -//--------------------------------------------------------- -// oRouteHide -//--------------------------------------------------------- - -void MidiStrip::oRouteHide() - { - // dont leave the menu if SHIFT is pressed; this allows - // for fast selecting of more than one input source - // - if (qApp->keyboardModifiers() & Qt::ShiftModifier) { - oR->menu()->show(); - } - } - -//--------------------------------------------------------- // songChanged //--------------------------------------------------------- @@ -508,7 +471,6 @@ void MidiStrip::iRouteShow() { QMenu* pup = iR->menu(); pup->clear(); - pup->addSeparator()->setText(tr("Tracks")); addMidiInPorts(pup, track, -1); // add midi inputs to menu } @@ -520,7 +482,6 @@ void MidiStrip::oRouteShow() { QMenu* pup = oR->menu(); pup->clear(); - pup->addSeparator()->setText(tr("OutputPorts")); addMidiOutPorts(pup, track, -1); addSyntiPorts(pup, track, -1); } @@ -783,7 +744,6 @@ void MidiOutPortStrip::iRouteShow() { QMenu* pup = iR->menu(); pup->clear(); - pup->addSeparator()->setText(tr("MidiChannel")); for (int ch = 0; ch < MIDI_CHANNELS; ++ch) { QMenu* m = pup->addMenu(QString("Channel %1").arg(ch+1)); @@ -1001,7 +961,6 @@ void MidiInPortStrip::oRouteShow() { QMenu* pup = oR->menu(); pup->clear(); - pup->addSeparator()->setText(tr("MidiChannel")); for (int ch = 0; ch < MIDI_CHANNELS; ++ch) { QMenu* m = pup->addMenu(QString("Channel %1").arg(ch+1)); @@ -1230,33 +1189,7 @@ void MidiSyntiStrip::oRouteShow() { QMenu* pup = oR->menu(); pup->clear(); - pup->addSeparator()->setText(tr("OutputPorts")); - - MidiOutPortList* mpl = song->midiOutPorts(); - int pn = 0; - for (iMidiOutPort i = mpl->begin(); i != mpl->end(); ++i, ++pn) { - MidiOutPort* op = *i; - QMenu* m = pup->addMenu(op->name()); - m->addSeparator()->setText(tr("Channel")); -#if 0 //TODO - for (int channel = 0; channel < MIDI_CHANNELS; ++channel) { - QString s; - s.setNum(channel+1); - QAction* action = m->addAction(s); - MidiChannel* mc = op->channel(channel); - Route r(mc, -1, Route::TRACK); - action->setData(QVariant::fromValue(r)); - action->setCheckable(true); - - for (iRoute ir = orl->begin(); ir != orl->end(); ++ir) { - if (r == *ir) { - action->setChecked(true); - break; - } - } - } -#endif - } + addMidiOutPorts(pup, track, -1); } //--------------------------------------------------------- @@ -1268,7 +1201,6 @@ void MidiSyntiStrip::iRouteShow() QMenu* pup = oR->menu(); pup->clear(); - pup->addSeparator()->setText(tr("Input Ports")); MidiOutPort* t = (MidiOutPort*)track; for (int ch = 0; ch < MIDI_CHANNELS; ++ch) { diff --git a/muse/muse/mstrip.h b/muse/muse/mstrip.h index 4c3269de..058884db 100644 --- a/muse/muse/mstrip.h +++ b/muse/muse/mstrip.h @@ -74,11 +74,10 @@ class MidiStrip : public Strip { void autoReadToggled(bool); void autoWriteToggled(bool); void iRouteShow(); - void iRouteHide(); void oRouteShow(); - void oRouteHide(); void recordToggled(bool); void monitorToggled(bool); + QMenu* sendMenu() const { return static_cast<QMenu*>(sender()); } public slots: virtual void songChanged(int); diff --git a/muse/muse/muse.cpp b/muse/muse/muse.cpp index 52767384..01f0d1c4 100644 --- a/muse/muse/muse.cpp +++ b/muse/muse/muse.cpp @@ -23,7 +23,7 @@ #include "muse.h" #include "transport.h" #include "widgets/bigtime.h" -#include "arranger/arranger.h" +#include "arranger.h" #include "midiedit/pianoroll.h" #include "al/al.h" #include "al/xml.h" diff --git a/muse/muse/arranger/partdrag.cpp b/muse/muse/partdrag.cpp index c47d3c11..c47d3c11 100644 --- a/muse/muse/arranger/partdrag.cpp +++ b/muse/muse/partdrag.cpp diff --git a/muse/muse/arranger/partdrag.h b/muse/muse/partdrag.h index d8c2e978..d8c2e978 100644 --- a/muse/muse/arranger/partdrag.h +++ b/muse/muse/partdrag.h diff --git a/muse/muse/preferences.cpp b/muse/muse/preferences.cpp index 6b7580d5..022a24da 100644 --- a/muse/muse/preferences.cpp +++ b/muse/muse/preferences.cpp @@ -24,7 +24,7 @@ #include "muse.h" #include "song.h" #include "event.h" -#include "arranger/arranger.h" +#include "arranger.h" #include "widgets/filedialog.h" #include "waveedit/waveedit.h" #include "globals.h" diff --git a/muse/muse/arranger/selectfilter.h b/muse/muse/selectfilter.h index a28e6947..a28e6947 100644 --- a/muse/muse/arranger/selectfilter.h +++ b/muse/muse/selectfilter.h diff --git a/muse/muse/seqmsg.cpp b/muse/muse/seqmsg.cpp index adf2a66e..cbd0d0dd 100644 --- a/muse/muse/seqmsg.cpp +++ b/muse/muse/seqmsg.cpp @@ -27,7 +27,7 @@ #include "audio.h" #include "audiodev.h" #include "audio.h" -#include "arranger/arranger.h" +#include "arranger.h" #include "plugin.h" #include "midi.h" #include "midictrl.h" diff --git a/muse/muse/song.cpp b/muse/muse/song.cpp index 79e1f563..a1f3bff0 100644 --- a/muse/muse/song.cpp +++ b/muse/muse/song.cpp @@ -1103,8 +1103,12 @@ void Song::seqSignal(int fd) strerror(errno)); return; } + bool graphChangedCalled = false; + bool seekDone = false; + +// printf("seqSignal %d\n", n); for (int i = 0; i < n; ++i) { -// printf("seqSignal to gui:<%c>\n", buffer[i]); +// printf(" seqSignal to gui:<%c>\n", buffer[i]); switch(buffer[i]) { case MSG_STOP: stopRolling(); @@ -1116,9 +1120,12 @@ void Song::seqSignal(int fd) setRecord(true); break; case MSG_SEEK: - setPos(0, audio->seqTime()->curTickPos, true, false, !seekInProgress); - seekInProgress = false; - beat(); // update controller guis + if (!seekDone) { + seekDone = true; + setPos(0, audio->seqTime()->curTickPos, true, false, !seekInProgress); + seekInProgress = false; + beat(); // update controller guis + } break; case MSG_JACK_SHUTDOWN: restartJack(); @@ -1152,7 +1159,11 @@ void Song::seqSignal(int fd) break; case MSG_GRAPH_CHANGED: - audioDriver->graphChanged(); + if (!graphChangedCalled) { + printf(" graph changed\n"); + graphChangedCalled = true; + audioDriver->graphChanged(); + } break; default: diff --git a/muse/muse/songfile.cpp b/muse/muse/songfile.cpp index 4f701bae..ff89e41e 100644 --- a/muse/muse/songfile.cpp +++ b/muse/muse/songfile.cpp @@ -20,7 +20,7 @@ #include "muse.h" #include "song.h" -#include "arranger/arranger.h" +#include "arranger.h" #include "al/al.h" #include "al/xml.h" #include "midiedit/drummap.h" diff --git a/muse/muse/strip.h b/muse/muse/strip.h index f9bc06ea..1e5f7bd4 100644 --- a/muse/muse/strip.h +++ b/muse/muse/strip.h @@ -29,7 +29,6 @@ class Meter; class SimpleButton; class Mixer; -// static const QSize buttonSize(STRIP_WIDTH/2-2, BUTTON_HEIGHT); static const QSize entrySize(STRIP_WIDTH/2-2, ENTRY_HEIGHT); //--------------------------------------------------------- @@ -55,6 +54,8 @@ class Strip : public QFrame { void recordToggled(bool); void addAutomationButtons(int row); + void addMidiInPorts(QMenu* menu, Track* dtrack, int channel); + void addMidiOutPorts(QMenu* menu, Track* strack, int channel); public slots: void resetPeaks(); diff --git a/muse/muse/arranger/tllineedit.cpp b/muse/muse/tllineedit.cpp index 0581b858..0581b858 100644 --- a/muse/muse/arranger/tllineedit.cpp +++ b/muse/muse/tllineedit.cpp diff --git a/muse/muse/arranger/tllineedit.h b/muse/muse/tllineedit.h index 56bfdd55..56bfdd55 100644 --- a/muse/muse/arranger/tllineedit.h +++ b/muse/muse/tllineedit.h diff --git a/muse/muse/arranger/tlswidget.cpp b/muse/muse/tlswidget.cpp index 23b7fbc1..23b7fbc1 100644 --- a/muse/muse/arranger/tlswidget.cpp +++ b/muse/muse/tlswidget.cpp diff --git a/muse/muse/arranger/tlswidget.h b/muse/muse/tlswidget.h index ccdfa3b8..ccdfa3b8 100644 --- a/muse/muse/arranger/tlswidget.h +++ b/muse/muse/tlswidget.h diff --git a/muse/muse/arranger/tlwidget.cpp b/muse/muse/tlwidget.cpp index fdf08d0b..fdf08d0b 100644 --- a/muse/muse/arranger/tlwidget.cpp +++ b/muse/muse/tlwidget.cpp diff --git a/muse/muse/arranger/tlwidget.h b/muse/muse/tlwidget.h index fbe428e2..fbe428e2 100644 --- a/muse/muse/arranger/tlwidget.h +++ b/muse/muse/tlwidget.h diff --git a/muse/muse/arranger/tlwlayout.cpp b/muse/muse/tlwlayout.cpp index 076f07cf..076f07cf 100644 --- a/muse/muse/arranger/tlwlayout.cpp +++ b/muse/muse/tlwlayout.cpp diff --git a/muse/muse/arranger/tlwlayout.h b/muse/muse/tlwlayout.h index 1a9cc914..1a9cc914 100644 --- a/muse/muse/arranger/tlwlayout.h +++ b/muse/muse/tlwlayout.h diff --git a/muse/muse/arranger/trackdrag.cpp b/muse/muse/trackdrag.cpp index beab87dd..beab87dd 100644 --- a/muse/muse/arranger/trackdrag.cpp +++ b/muse/muse/trackdrag.cpp diff --git a/muse/muse/arranger/trackdrag.h b/muse/muse/trackdrag.h index 083a94b3..083a94b3 100644 --- a/muse/muse/arranger/trackdrag.h +++ b/muse/muse/trackdrag.h diff --git a/muse/muse/arranger/trackinfo.cpp b/muse/muse/trackinfo.cpp index 1a62b1c0..1a62b1c0 100644 --- a/muse/muse/arranger/trackinfo.cpp +++ b/muse/muse/trackinfo.cpp diff --git a/muse/muse/arranger/trackinfo.h b/muse/muse/trackinfo.h index bea98d70..bea98d70 100644 --- a/muse/muse/arranger/trackinfo.h +++ b/muse/muse/trackinfo.h diff --git a/muse/muse/arranger/trelement.h b/muse/muse/trelement.h index 478b5e51..4c702ae2 100644 --- a/muse/muse/arranger/trelement.h +++ b/muse/muse/trelement.h @@ -37,10 +37,10 @@ enum { struct TrElement { int id; int grp; // default group - char* name; + const char* name; int trackMask; - TrElement(int i, int g, char* s, int m) + TrElement(int i, int g, const char* s, int m) : id(i), grp(g), name(s), trackMask(m) {} }; @@ -61,4 +61,3 @@ extern const int nTrElements; extern TrGroupList glist[Track::TRACK_TYPES]; #endif - diff --git a/muse/muse/wave.cpp b/muse/muse/wave.cpp index 41682d88..dca9843b 100644 --- a/muse/muse/wave.cpp +++ b/muse/muse/wave.cpp @@ -26,7 +26,7 @@ #include "wave.h" #include "muse.h" #include "widgets/filedialog.h" -#include "arranger/arranger.h" +#include "arranger.h" #include "globals.h" #include "event.h" #include "audio.h" @@ -65,9 +65,9 @@ static bool copyWaveFileToProject(const QString& path) // we cannot easily check for identity if destination // file is sample rate converted // - // for now we assume that the file has already + // for now we assume that the file has already // be imported: - // + // printf("File already exists\n"); return true; } @@ -90,7 +90,7 @@ static bool copyWaveFileToProject(const QString& path) SNDFILE* sfDst = sf_open(dstFile.fileName().toLatin1().data(), SFM_WRITE, &sfinfoDst); if (sfDst == 0) { - printf("Cannot open destination file<%s>: %s\n", + printf("Cannot open destination file<%s>: %s\n", dstFile.fileName().toLatin1().data(), strerror(errno)); return false; } @@ -119,7 +119,7 @@ static bool copyWaveFileToProject(const QString& path) bool returnValue = true; if (sfinfoSrc.samplerate != AL::sampleRate) { // TODO: convertsample rate - printf("wave file has samplerate of %d, our project has %d\n", + printf("wave file has samplerate of %d, our project has %d\n", sfinfoSrc.samplerate,AL::sampleRate); int srcType = SRC_SINC_MEDIUM_QUALITY; @@ -161,7 +161,7 @@ static bool copyWaveFileToProject(const QString& path) int rv = src_process(src, &data); if (rv > 0) { - printf("error sampe rate conversion: %s\n", + printf("error sampe rate conversion: %s\n", src_strerror(rv)); src_delete(src); returnValue = false; @@ -171,7 +171,7 @@ static bool copyWaveFileToProject(const QString& path) // write buffer sf_count_t n = sf_writef_float(sfDst, outBuffer, data.output_frames_gen); if (n != data.output_frames_gen) { - printf("sound write failed: returns %lld, should return %ld\n", + printf("sound write failed: returns %lld, should return %ld\n", n, data.output_frames_gen); returnValue = false; break; @@ -220,7 +220,7 @@ static bool copyWaveFileToProject(const QString& path) // write buffer nn = sf_writef_float(sfDst, buffer, n); if (n != nn) { - printf("sound write failed: returns %lld, should return %lld\n", + printf("sound write failed: returns %lld, should return %lld\n", nn, n); returnValue = false; break; |