mirror of
https://github.com/LMMS/lmms.git
synced 2026-01-26 23:38:10 -05:00
* First Preview of the X-Pressive Plugin (exprtk.hpp is not included, get it from my exprtk fork in the branch internal_data_functions) available keys: f- note's frequency. available only in the output expressions t- time in seconds. in the Waves (W1,W2,W3) it's in the range [0,1) key- the note's keyboard key. available only in the output expressions. v- the note's velocity (divided by 255.0 so it is in the range [0,1]). available only in the output expressions. rel- gives 0 while the key is holded, and 1 after the key release. available only in the output expressions. A1,A2,A3- general purpose knobs (you can control them with the automations). available only in the output expressions. W1,W2,W3- precalculated wave forms. can be also load from file. you can use them only in the output expressions available functions: cent(x)- gives pow(2,x/1200) rand()- random number generator. in range [-1,1). each call gives other value. randv(i)- random vector (with pseudo infinite integer cells). the values are in range [-1,1). it's stays consistent only across the note playback. so each note playback will get other vector (even on the same key). sinew- sine wave with period of 1. saww- saw wave with period of 1. squarew- square wave with period of 1. trianglew- triangle wave with period of 1. expw- exponent wave with period of 1. expnw- another exponent wave with period of 1. moogw- moog wave with period of 1. moogsaww- moog-saw wave with period of 1. you can use * % ^ / + - pow sin log pi etc. * Xpressive Plug-In: Added Release transition knob that control the "rel" variable. (the duration of transit from 0 to 1) Fixed some problems in the displays. (update display when changing A1,A2,A3, clear display with invalid expression. * X-Pressive Plug-In: Few more fixes Changed the callbacks in exprfront.cpp to be templated. Added help. Added ExprTk.hpp. some bug fixes (inf issues). Added integrate function. * Special version of ExprTk with modified license (BSL) for the LMMS project https://github.com/LMMS/lmms * Xpressive Plug-In- fixed some building errors. Added the "e" euler's constant. * Xpressive Plug-In - fix mingw64 issues * X-Pressive Plug-in: Added "trel" (time since release) variable. The integrate function can now have unlimited usage. Added selective interpolation per wave. Improved a little the random vector function. Some other improvements, code cleaning, etc... * Xpressive Plug-In: move clearGraph definition into Graph.cpp. fixed compilation errors. (oops..) * X-Pressive plug-in: updated presets names * X-Pressive plug-in added semitone function, added sample-rate variable * X-Pressive plug-in, code cleaning, changed the rendering function to achieve performace gain. * X-Pressive plug-in - fix the string counting function * X-Pressive plug-in - until somebody will find a better solution, exprtk.hpp is patched under the name exprtk.patched.hpp ... * X-Pressive plug-in - fix compiling errors. * X-Pressive plug-in - added patch file for exprtk.hpp, added last function that gives last calculated samples. moved ExprSynth to be with ExprFront for performance reasons. * X-Pressive plugin - moved the patched file back to the source tree, added .gitignore file.. * X-Pressive plugin - fix compilation error. (isnan isinf) * X-Pressive plugin - tried to fix embed.cpp problem, added new variable to the parser (tempo) * X-Pressive plugin - fixed cmake script * X-Pressive plugin - updated the license and the diff file. * Updates to ExprTk * Added return statement enable/disable via parser settings Added exprtk_disable_return_statement macro for disabling return statements and associated exceptions at the source code level. * X-Pressive plugin - updated CMakeLists.txt to use the correct flags on each platform. also added exprtk.hpp as a dependency for the patch command. Updated the exprtk diff file. * X-Pressive plugin - moved the enhanced features flag to the WIN64 installation. * X-Pressive plugin - another fix for CMakeLists.txt * Minor updates to ExprTk Updated multi-sub expression operator to return final sub-expression type. Updates to exprtk_disable_return_statement macro for disabling return statements and associated exceptions at the source code level. * X-Pressive plug-in - added try-block around exprtk calls and enabled the -fexceptions flag, so patch file is no longer needed. * X-Pressive plug-in - small fix in CMakeLists.txt * Update ExprTk to tip of branch. * X-Pressive plugin - added graph drawing feature.. * Updating exprtk.hpp to the latest upstream version
192 lines
3.7 KiB
C++
192 lines
3.7 KiB
C++
/*
|
|
* Graph.h - a QT widget for displaying and manipulating waveforms
|
|
*
|
|
* Copyright (c) 2006-2007 Andreas Brandmaier <andy/at/brandmaier/dot/de>
|
|
* 2008 Paul Giblock <drfaygo/at/gmail/dot/com>
|
|
*
|
|
* This file is part of LMMS - https://lmms.io
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* 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 (see COPYING); if not, write to the
|
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
* Boston, MA 02110-1301 USA.
|
|
*
|
|
*/
|
|
|
|
|
|
#ifndef GRAPH_H
|
|
#define GRAPH_H
|
|
|
|
#include <QWidget>
|
|
#include <QPixmap>
|
|
#include <QCursor>
|
|
|
|
#include "Model.h"
|
|
#include "ModelView.h"
|
|
#include "lmms_basics.h"
|
|
|
|
class graphModel;
|
|
|
|
|
|
class EXPORT Graph : public QWidget, public ModelView
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
enum graphStyle
|
|
{
|
|
NearestStyle,
|
|
LinearStyle,
|
|
LinearNonCyclicStyle,
|
|
BarStyle,
|
|
NumGraphStyles
|
|
};
|
|
|
|
Graph( QWidget * _parent, graphStyle _style = Graph::LinearStyle,
|
|
int _width = 132,
|
|
int _height = 104
|
|
);
|
|
virtual ~Graph();
|
|
|
|
void setForeground( const QPixmap & _pixmap );
|
|
|
|
|
|
void setGraphColor( const QColor );
|
|
|
|
inline graphModel * model()
|
|
{
|
|
return castModel<graphModel>();
|
|
}
|
|
|
|
inline graphStyle getGraphStyle()
|
|
{
|
|
return m_graphStyle;
|
|
}
|
|
|
|
|
|
inline void setGraphStyle( graphStyle _s )
|
|
{
|
|
m_graphStyle = _s;
|
|
update();
|
|
}
|
|
|
|
signals:
|
|
void drawn();
|
|
protected:
|
|
virtual void paintEvent( QPaintEvent * _pe );
|
|
virtual void dropEvent( QDropEvent * _de );
|
|
virtual void dragEnterEvent( QDragEnterEvent * _dee );
|
|
virtual void mousePressEvent( QMouseEvent * _me );
|
|
virtual void mouseMoveEvent( QMouseEvent * _me );
|
|
virtual void mouseReleaseEvent( QMouseEvent * _me );
|
|
|
|
protected slots:
|
|
void updateGraph( int _startPos, int _endPos );
|
|
void updateGraph();
|
|
|
|
private:
|
|
virtual void modelChanged();
|
|
|
|
void changeSampleAt( int _x, int _y );
|
|
void drawLineAt( int _x, int _y, int _lastx );
|
|
|
|
|
|
QPixmap m_foreground;
|
|
QColor m_graphColor;
|
|
|
|
graphStyle m_graphStyle;
|
|
|
|
bool m_mouseDown;
|
|
int m_lastCursorX;
|
|
|
|
} ;
|
|
|
|
|
|
class EXPORT graphModel : public Model
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
graphModel( float _min,
|
|
float _max,
|
|
int _size,
|
|
:: Model * _parent,
|
|
bool _default_constructed = false,
|
|
float _step = 0.0 );
|
|
|
|
virtual ~graphModel();
|
|
|
|
// TODO: saveSettings, loadSettings?
|
|
|
|
inline float minValue() const
|
|
{
|
|
return( m_minValue );
|
|
}
|
|
|
|
inline float maxValue() const
|
|
{
|
|
return( m_maxValue );
|
|
}
|
|
|
|
inline int length() const
|
|
{
|
|
return m_length;
|
|
}
|
|
|
|
inline const float * samples() const
|
|
{
|
|
return( m_samples.data() );
|
|
}
|
|
|
|
void convolve(const float *convolution, const int convolutionLength, const int centerOffset);
|
|
|
|
public slots:
|
|
void setRange( float _min, float _max );
|
|
|
|
void setLength( int _size );
|
|
|
|
void setSampleAt( int x, float val );
|
|
void setSamples( const float * _value );
|
|
|
|
void setWaveToSine();
|
|
void setWaveToTriangle();
|
|
void setWaveToSaw();
|
|
void setWaveToSquare();
|
|
void setWaveToNoise();
|
|
QString setWaveToUser( );
|
|
|
|
void smooth();
|
|
void smoothNonCyclic();
|
|
void normalize();
|
|
void invert();
|
|
void shiftPhase( int _deg );
|
|
void clear();
|
|
|
|
signals:
|
|
void lengthChanged();
|
|
void samplesChanged( int startPos, int endPos );
|
|
void rangeChanged();
|
|
|
|
private:
|
|
void drawSampleAt( int x, float val );
|
|
|
|
QVector<float> m_samples;
|
|
int m_length;
|
|
float m_minValue;
|
|
float m_maxValue;
|
|
float m_step;
|
|
|
|
friend class Graph;
|
|
|
|
};
|
|
|
|
#endif
|