From 94699247a8a6c8c84e4e978daadb06ba0e83b271 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 2 Jan 2008 20:40:28 +0000 Subject: [PATCH 01/87] created M/V-development branch git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms-mv@631 0778d3d1-df1d-0410-868b-ea421aaaa00d From 90f10112c01da992b715ef15fb58731723aeb002 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 2 Jan 2008 20:42:41 +0000 Subject: [PATCH 02/87] moved from trunk to branches-directory git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@632 0778d3d1-df1d-0410-868b-ea421aaaa00d From ce128add004a150cd06064a98ede528181ad9b94 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 2 Jan 2008 22:19:58 +0000 Subject: [PATCH 03/87] inital M/V-hacks, improve project-unloading speed, fix wrong signal-slot-connection which made gate-parameter of effects not working git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@634 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 99 ++++++ Makefile.am | 8 +- README | 4 +- configure.in | 4 +- include/arp_and_chords_tab_widget.h | 14 + include/automatable_button.h | 35 +- ...tomatable_object.h => automatable_model.h} | 146 ++++++-- ...plates.h => automatable_model_templates.h} | 222 +++++++----- include/automatable_slider.h | 20 +- include/bb_editor.h | 14 +- include/combobox.h | 99 ++++-- include/detuning_helper.h | 6 +- include/effect.h | 51 ++- include/envelope_and_lfo_widget.h | 29 +- include/envelope_tab_widget.h | 7 + include/export_project_dialog.h | 8 +- include/group_box.h | 24 +- include/instrument_track.h | 38 +- include/journalling_object.h | 8 +- include/knob.h | 45 +-- include/ladspa_control.h | 30 +- include/lcd_spinbox.h | 22 +- include/led_checkbox.h | 4 +- include/meter_dialog.h | 17 +- include/midi_tab_widget.h | 18 +- include/mv_base.h | 107 ++++++ include/piano_roll.h | 8 +- include/piano_widget.h | 10 +- include/pixmap_button.h | 3 +- include/rack_plugin.h | 15 +- include/sample_play_handle.h | 14 +- include/sample_track.h | 3 +- include/setup_dialog.h | 2 - include/song_editor.h | 26 +- include/surround_area.h | 87 +++-- include/tempo_sync_knob.h | 6 +- include/volume_knob.h | 3 +- src/audio/audio_alsa.cpp | 13 +- src/audio/audio_jack.cpp | 13 +- src/audio/audio_oss.cpp | 13 +- src/core/about_dialog.cpp | 4 +- src/core/arp_and_chords_tab_widget.cpp | 168 +++++---- src/core/automation_editor.cpp | 44 ++- src/core/automation_pattern.cpp | 4 +- src/core/bb_editor.cpp | 48 ++- src/core/effect.cpp | 10 +- src/core/effect_tab_widget.cpp | 10 +- src/core/envelope_and_lfo_widget.cpp | 332 ++++++++++-------- src/core/envelope_tab_widget.cpp | 97 ++--- src/core/export_project_dialog.cpp | 63 ++-- src/core/instrument.cpp | 1 + src/core/ladspa_control.cpp | 135 ++++--- src/core/meter_dialog.cpp | 70 ++-- src/core/midi_tab_widget.cpp | 160 +++++---- src/core/mv_base.cpp | 64 ++++ src/core/note.cpp | 2 +- src/core/note_play_handle.cpp | 12 +- src/core/piano_roll.cpp | 65 ++-- src/core/piano_widget.cpp | 74 +--- src/core/preset_preview_play_handle.cpp | 1 + src/core/sample_play_handle.cpp | 33 +- src/core/setup_dialog.cpp | 60 +--- src/core/song_editor.cpp | 138 ++++---- src/core/surround_area.cpp | 186 ++++------ src/core/track.cpp | 6 +- src/core/track_container.cpp | 5 +- src/tracks/instrument_track.cpp | 210 +++-------- src/tracks/sample_track.cpp | 22 +- src/widgets/automatable_button.cpp | 109 +++--- src/widgets/automatable_slider.cpp | 117 ++---- src/widgets/combobox.cpp | 156 ++++---- src/widgets/group_box.cpp | 60 ++-- src/widgets/knob.cpp | 241 ++++--------- src/widgets/lcd_spinbox.cpp | 57 +-- src/widgets/led_checkbox.cpp | 8 +- src/widgets/pixmap_button.cpp | 8 +- src/widgets/rack_plugin.cpp | 99 +++--- src/widgets/tempo_sync_knob.cpp | 74 ++-- src/widgets/volume_knob.cpp | 47 +-- 79 files changed, 2284 insertions(+), 2011 deletions(-) rename include/{automatable_object.h => automatable_model.h} (50%) rename include/{automatable_object_templates.h => automatable_model_templates.h} (54%) create mode 100644 include/mv_base.h create mode 100644 src/core/mv_base.cpp diff --git a/ChangeLog b/ChangeLog index 3a3d1ca62..dd04c8d47 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,102 @@ +2008-01-02 Tobias Doerffel + + * include/knob.h: + * include/effect.h: + * include/automatable_slider.h: + * include/lcd_spinbox.h: + * include/meter_dialog.h: + * include/midi_tab_widget.h: + * include/instrument_track.h: + * include/ladspa_control.h: + * include/piano_widget.h: + * include/detuning_helper.h: + * include/sample_play_handle.h: + * include/piano_roll.h: + * include/group_box.h: + * include/envelope_tab_widget.h: + * include/song_editor.h: + * include/automatable_button.h: + * include/tempo_sync_knob.h: + * include/journalling_object.h: + * include/setup_dialog.h: + * include/export_project_dialog.h: + * include/pixmap_button.h: + * include/sample_track.h: + * include/surround_area.h: + * include/volume_knob.h: + * include/bb_editor.h: + * include/rack_plugin.h: + * include/arp_and_chords_tab_widget.h: + * include/envelope_and_lfo_widget.h: + * include/combobox.h: + * include/led_checkbox.h: + * configure.in: + * src/audio/audio_alsa.cpp: + * src/audio/audio_oss.cpp: + * src/audio/audio_jack.cpp: + * src/widgets/rack_plugin.cpp: + * src/widgets/automatable_slider.cpp: + * src/widgets/lcd_spinbox.cpp: + * src/widgets/group_box.cpp: + * src/widgets/combobox.cpp: + * src/widgets/led_checkbox.cpp: + * src/widgets/volume_knob.cpp: + * src/widgets/pixmap_button.cpp: + * src/widgets/knob.cpp: + * src/widgets/automatable_button.cpp: + * src/widgets/tempo_sync_knob.cpp: + * src/tracks/sample_track.cpp: + * src/tracks/instrument_track.cpp: + * src/core/arp_and_chords_tab_widget.cpp: + * src/core/envelope_and_lfo_widget.cpp: + * src/core/preset_preview_play_handle.cpp: + * src/core/note_play_handle.cpp: + * src/core/midi_tab_widget.cpp: + * src/core/setup_dialog.cpp: + * src/core/sample_play_handle.cpp: + * src/core/export_project_dialog.cpp: + * src/core/effect.cpp: + * src/core/piano_roll.cpp: + * src/core/track.cpp: + * src/core/ladspa_control.cpp: + * src/core/note.cpp: + * src/core/envelope_tab_widget.cpp: + * src/core/instrument.cpp: + * src/core/piano_widget.cpp: + * src/core/surround_area.cpp: + * src/core/song_editor.cpp: + * src/core/automation_pattern.cpp: + * src/core/effect_tab_widget.cpp: + * src/core/automation_editor.cpp: + * src/core/bb_editor.cpp: + * src/core/meter_dialog.cpp: + * Makefile.am: + adaption of M/V-architecture + + * include/automatable_object_templates.h: + * include/automatable_object.h: + removed as replaced by automatable_model.h and + automatable_model_templates.h + + * include/mv_base.h: + * src/core/mv_base.cpp: + * include/automatable_model.h: + * include/automatable_model_templates.h: + added base-files for new M/V-architecture + + * src/widgets/rack_plugin.cpp: + fixed wrong signal-slot-connection which made gate-parameter of + effects not working + + * src/core/track_container.cpp: + when removing tracks start removing at the end of track-vector (i.e. + use m_trackWidgets.last() instead of m_trackWidgets.first()) - speeds + up things *a lot* + + * README: + * src/core/about_dialog.cpp: + fixed version and extended copyright from 2007 to 2008 + 2007-12-18 Tobias Doerffel * plugins/midi_import/midi_import.cpp: diff --git a/Makefile.am b/Makefile.am index 39af1179d..0032df353 100644 --- a/Makefile.am +++ b/Makefile.am @@ -77,6 +77,7 @@ lmms_MOC = \ ./led_checkbox.moc \ ./main_window.moc \ ./mixer.moc \ + ./mv_base.moc \ ./name_label.moc \ ./nstate_button.moc \ ./meter_dialog.moc \ @@ -93,7 +94,6 @@ lmms_MOC = \ ./rubberband.moc \ ./rename_dialog.moc \ ./sample_buffer.moc \ - ./sample_play_handle.moc \ ./sample_track.moc \ ./setup_dialog.moc \ ./side_bar.moc \ @@ -176,6 +176,7 @@ lmms_SOURCES = \ $(srcdir)/src/core/meter_dialog.cpp \ $(srcdir)/src/core/midi_tab_widget.cpp \ $(srcdir)/src/core/mixer.cpp \ + $(srcdir)/src/core/mv_base.cpp \ $(srcdir)/src/core/name_label.cpp \ $(srcdir)/src/core/note.cpp \ $(srcdir)/src/core/note_play_handle.cpp \ @@ -288,6 +289,9 @@ lmms_SOURCES = \ $(srcdir)/include/oscillator.h \ $(srcdir)/include/arp_and_chords_tab_widget.h \ $(srcdir)/include/export.h \ + $(srcdir)/include/mv_base.h \ + $(srcdir)/include/automatable_model.h \ + $(srcdir)/include/automatable_model_templates.h \ $(srcdir)/include/group_box.h \ $(srcdir)/include/tab_widget.h \ $(srcdir)/include/knob.h \ @@ -358,8 +362,6 @@ lmms_SOURCES = \ $(srcdir)/include/combobox.h \ $(srcdir)/include/rubberband.h \ $(srcdir)/include/base64.h \ - $(srcdir)/include/automatable_object.h \ - $(srcdir)/include/automatable_object_templates.h \ $(srcdir)/include/journalling_object.h \ $(srcdir)/include/level_object.h \ $(srcdir)/include/project_journal.h \ diff --git a/README b/README index 8b6b14b73..792f2d990 100644 --- a/README +++ b/README @@ -1,7 +1,7 @@ -Linux MultiMedia Studio 0.3.0 +Linux MultiMedia Studio 0.4.0 ============================== -Copyright (c) 2004-2007 by LMMS-developers +Copyright (c) 2004-2008 by LMMS-developers This program is free software; you can redistribute it and/or modify diff --git a/configure.in b/configure.in index 9b4e280f9..ec351903f 100644 --- a/configure.in +++ b/configure.in @@ -2,8 +2,8 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.50) -AC_INIT(lmms, 0.4.0-svn20071218, lmms-devel/at/lists/dot/sf/dot/net) -AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20071218) +AC_INIT(lmms, 0.4.0-svn20080102-mv, lmms-devel/at/lists/dot/sf/dot/net) +AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080102-mv) AM_CONFIG_HEADER(config.h) diff --git a/include/arp_and_chords_tab_widget.h b/include/arp_and_chords_tab_widget.h index 5d0b03bb5..21797cedb 100644 --- a/include/arp_and_chords_tab_widget.h +++ b/include/arp_and_chords_tab_widget.h @@ -31,6 +31,7 @@ #include "journalling_object.h" #include "types.h" +#include "automatable_model.h" class QLabel; @@ -44,6 +45,7 @@ class groupBox; class knob; class notePlayHandle; class tempoSyncKnob; +class comboBoxModel; const int MAX_CHORD_POLYPHONY = 10; @@ -101,20 +103,32 @@ private: // chord-stuff groupBox * m_chordsGroupBox; + boolModel * m_chordsEnabledModel; comboBox * m_chordsComboBox; + comboBoxModel * m_chordsModel; knob * m_chordRangeKnob; + floatModel * m_chordRangeModel; // arpeggio-stuff groupBox * m_arpGroupBox; + boolModel * m_arpEnabledModel; comboBox * m_arpComboBox; + comboBoxModel * m_arpModel; knob * m_arpRangeKnob; + floatModel * m_arpRangeModel; tempoSyncKnob * m_arpTimeKnob; + floatModel * m_arpTimeModel; knob * m_arpGateKnob; + floatModel * m_arpGateModel; + QLabel * m_arpDirectionLbl; automatableButtonGroup * m_arpDirectionBtnGrp; + intModel * m_arpDirectionModel; comboBox * m_arpModeComboBox; + comboBoxModel * m_arpModeModel; + friend class flpImport; diff --git a/include/automatable_button.h b/include/automatable_button.h index 117d4b13b..0ef28a112 100644 --- a/include/automatable_button.h +++ b/include/automatable_button.h @@ -28,37 +28,33 @@ #include -#include "automatable_object.h" +#include "automatable_model.h" class automatableButtonGroup; -class automatableButton : public QPushButton, public automatableObject +class automatableButton : public QPushButton, public boolModelView { Q_OBJECT public: - automatableButton( QWidget * _parent, const QString & _name, - track * _track ); + automatableButton( QWidget * _parent, const QString & _name ); virtual ~automatableButton(); - - virtual void setValue( const bool _on ); - inline void setCheckable( bool _on ) { QPushButton::setCheckable( _on ); - setJournalling( _on ); + model()->setJournalling( _on ); } public slots: + virtual void update( void ); virtual void toggle( void ); virtual void setChecked( bool _on ) { - // QPushButton::setChecked is called in setValue() - setValue( _on ); + // QPushButton::setChecked is called in update-slot + model()->setValue( _on ); } @@ -74,16 +70,17 @@ private: friend class automatableButtonGroup; + using QPushButton::setChecked; + using QPushButton::isChecked; } ; -class automatableButtonGroup : public QWidget, public automatableObject +class automatableButtonGroup : public QWidget, public intModelView { Q_OBJECT public: - automatableButtonGroup( QWidget * _parent, const QString & _name, - track * _track ); + automatableButtonGroup( QWidget * _parent, const QString & _name ); virtual ~automatableButtonGroup(); void addButton( automatableButton * _btn ); @@ -91,16 +88,16 @@ public: void activateButton( automatableButton * _btn ); - virtual void setValue( const int _value ); + virtual void modelChanged( void ); + + +private slots: + void updateButtons( void ); private: QList m_buttons; - -signals: - void valueChanged( int ); - } ; diff --git a/include/automatable_object.h b/include/automatable_model.h similarity index 50% rename from include/automatable_object.h rename to include/automatable_model.h index 4b7f64204..7a56e85a0 100644 --- a/include/automatable_object.h +++ b/include/automatable_model.h @@ -1,7 +1,7 @@ /* - * automatable_object.h - declaration of class automatableObject + * automatable_model.h - declaration of class automatableModel * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2007 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -23,13 +23,14 @@ */ -#ifndef _AUTOMATABLE_OBJECT_H -#define _AUTOMATABLE_OBJECT_H +#ifndef _AUTOMATABLE_MODEL_H +#define _AUTOMATABLE_MODEL_H #include #include "journalling_object.h" #include "level_object.h" +#include "mv_base.h" #include @@ -38,18 +39,47 @@ class automationPattern; class track; +// simple way to map a property of a view to a model +#define mapPropertyFromModelPtr(type,getfunc,setfunc,modelname) \ + public: \ + inline type getfunc( void ) const \ + { \ + return( modelname->value() ); \ + } \ + public slots: \ + inline void setfunc( const type _val ) \ + { \ + modelname->setValue( _val ); \ + } + +#define mapPropertyFromModel(type,getfunc,setfunc,modelname) \ + public: \ + inline type getfunc( void ) const \ + { \ + return( modelname.value() ); \ + } \ + public slots: \ + inline void setfunc( const type _val ) \ + { \ + modelname.setValue( _val ); \ + } + template -class automatableObject : public journallingObject, public levelObject +class automatableModel : public model, public journallingObject, + public levelObject { public: - typedef automatableObject autoObj; + typedef automatableModel autoModel; - automatableObject( track * _track = NULL, const T _val = 0, - const T _min = 0, const T _max = 0, - const T _step = defaultRelStep() ); + automatableModel( const T _val = 0, + const T _min = 0, + const T _max = 0, + const T _step = defaultRelStep(), + ::model * _parent = NULL, + bool _default_constructed = FALSE ); - virtual ~automatableObject(); + virtual ~automatableModel(); static inline T minRelStep( void ) { @@ -72,6 +102,11 @@ public: return( m_value ); } + inline virtual T initValue( void ) const + { + return( m_initValue ); + } + inline virtual T minValue( void ) const { return( m_minValue ); @@ -94,14 +129,14 @@ public: inline T fittedValue( T _value ) const; - T value( int _level ) const + inline T value( int _level ) const { return( fittedValue( _level * m_step ) ); } virtual void setInitValue( const T _value ); - inline virtual void setValue( const T _value ); + virtual void setValue( const T _value ); inline virtual void incValue( int _steps ) { @@ -111,11 +146,11 @@ public: virtual void setRange( const T _min, const T _max, const T _step = defaultRelStep() ); - inline virtual void setStep( const T _step ); + virtual void setStep( const T _step ); - static void linkObjects( autoObj * _object1, autoObj * _object2 ); + static void linkModels( autoModel * _model1, autoModel * _model2 ); - static void unlinkObjects( autoObj * _object1, autoObj * _object2 ); + static void unlinkModels( autoModel * _model1, autoModel * _model2 ); virtual void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _this, @@ -126,11 +161,16 @@ public: virtual QString nodeName( void ) const { - return( "automatableobject" ); + return( "automatablemodel" ); } inline automationPattern * getAutomationPattern( void ); + inline void setTrack( track * _track ) + { + m_track = _track; + } + inline bool nullTrack( void ) { return( m_track == NULL ); @@ -138,43 +178,44 @@ public: void initAutomationPattern( void ) { - m_automation_pattern = new automationPattern( NULL, this ); + m_automationPattern = new automationPattern( NULL, this ); } + void prepareJournalEntryFromOldVal( void ); + + void addJournalEntryFromOldToCurVal( void ); + protected: virtual void redoStep( journalEntry & _je ); virtual void undoStep( journalEntry & _je ); - void prepareJournalEntryFromOldVal( void ); - - void addJournalEntryFromOldToCurVal( void ); - inline void setFirstValue( void ); private: T m_value; + T m_initValue; T m_minValue; T m_maxValue; T m_step; int m_curLevel; - QPointer m_automation_pattern; + QPointer m_automationPattern; track * m_track; // most objects will need this temporarily T m_oldValue; bool m_journalEntryReady; - typedef QVector autoObjVector; - autoObjVector m_linkedObjects; + typedef QVector autoModelVector; + autoModelVector m_linkedModels; - inline void linkObject( autoObj * _object ); + inline void linkModel( autoModel * _model ); - inline void unlinkObject( autoObj * _object ); + inline void unlinkModel( autoModel * _model ); - static inline T attributeValue( QString _value ); + inline static T attributeValue( QString _value ); inline void syncAutomationPattern( void ); @@ -199,6 +240,57 @@ private: +template +class automatableModelView : public modelView +{ +public: + typedef automatableModel autoModel; + typedef automatableModelView autoModelView; + + automatableModelView( void ) : modelView() + { + } + + // some basic functions for convenience + autoModel * model( void ) + { + return( castModel() ); + } + + const autoModel * model( void ) const + { + return( castModel() ); + } + + inline virtual T value( void ) const + { + return( model() ? model()->value() : 0 ); + } + + inline virtual void setValue( const T _value ) + { + if( model() ) + { + model()->setValue( _value ); + } + } + +} ; + + +//#include "automatable_model_templates.h" + + +#define generateModelPrimitive(type,type2) \ + typedef automatableModel type##Model; \ + typedef automatableModelView type##ModelView; \ + +// some model-primitives + +generateModelPrimitive(bool,signed char); +generateModelPrimitive(float,float); +generateModelPrimitive(int,int); + #endif diff --git a/include/automatable_object_templates.h b/include/automatable_model_templates.h similarity index 54% rename from include/automatable_object_templates.h rename to include/automatable_model_templates.h index 9328351ef..e8b9769ae 100644 --- a/include/automatable_object_templates.h +++ b/include/automatable_model_templates.h @@ -1,7 +1,7 @@ /* - * automatable_object_templates.h - definition of automatableObject templates + * automatable_model_templates.h - definition of automatableModel templates * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2007 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -23,12 +23,12 @@ */ -#ifndef _AUTOMATABLE_OBJECT_TEMPLATES_H -#define _AUTOMATABLE_OBJECT_TEMPLATES_H +#ifndef _AUTOMATABLE_MODEL_TEMPLATES_H +#define _AUTOMATABLE_MODEL_TEMPLATES_H #include -#include "automatable_object.h" +#include "automatable_model.h" #include "automation_editor.h" #include "automation_pattern.h" #include "engine.h" @@ -37,15 +37,21 @@ template -automatableObject::automatableObject( track * _track, - const T _val, const T _min, - const T _max, const T _step ) : +automatableModel::automatableModel( + const T _val, + const T _min, + const T _max, + const T _step, + ::model * _parent, + bool _default_constructed ) : + model( _parent, _default_constructed ), m_value( _val ), + m_initValue( _val ), m_minValue( _min ), m_maxValue( _max ), m_step( _step ), - m_automation_pattern( NULL ), - m_track( _track ), + m_automationPattern( NULL ), + m_track( NULL ), m_journalEntryReady( FALSE ) { m_curLevel = level( _val ); @@ -57,13 +63,13 @@ automatableObject::automatableObject( track * _track, template -automatableObject::~automatableObject() +automatableModel::~automatableModel() { - delete m_automation_pattern; - while( m_linkedObjects.empty() == FALSE ) + delete m_automationPattern; + while( m_linkedModels.empty() == FALSE ) { - m_linkedObjects.last()->unlinkObject( this ); - m_linkedObjects.erase( m_linkedObjects.end() - 1 ); + m_linkedModels.last()->unlinkModel( this ); + m_linkedModels.erase( m_linkedModels.end() - 1 ); } } @@ -71,7 +77,7 @@ automatableObject::~automatableObject() template -T automatableObject::fittedValue( T _value ) const +T automatableModel::fittedValue( T _value ) const { _value = tLimit( _value, minValue(), maxValue() ); @@ -104,11 +110,12 @@ T automatableObject::fittedValue( T _value ) const template -void automatableObject::setInitValue( const T _value ) +void automatableModel::setInitValue( const T _value ) { + m_initValue = _value; bool journalling = testAndSetJournalling( FALSE ); setValue( _value ); - if( m_automation_pattern ) + if( m_automationPattern ) { setFirstValue(); } @@ -119,7 +126,7 @@ void automatableObject::setInitValue( const T _value ) template -void automatableObject::setValue( const T _value ) +void automatableModel::setValue( const T _value ) { const T old_val = m_value; @@ -133,15 +140,15 @@ void automatableObject::setValue( const T _value ) static_cast( m_value ) - static_cast( old_val ) ) ); - // notify linked objects + // notify linked models // doesn't work because of implicit typename T - // for( autoObjVector::iterator it = - // m_linkedObjects.begin(); - // it != m_linkedObjects.end(); ++it ) - for( int i = 0; i < m_linkedObjects.size(); ++i ) + // for( autoModelVector::iterator it = + // m_linkedModels.begin(); + // it != m_linkedModels.end(); ++it ) + for( int i = 0; i < m_linkedModels.size(); ++i ) { - autoObj * it = m_linkedObjects[i]; + autoModel * it = m_linkedModels[i]; if( value() != it->value() && it->fittedValue( value() ) != it->value() ) { @@ -151,6 +158,8 @@ void automatableObject::setValue( const T _value ) it->setJournalling( journalling ); } } + setFirstValue(); + emit dataChanged(); } } @@ -158,25 +167,30 @@ void automatableObject::setValue( const T _value ) template -void automatableObject::setRange( const T _min, const T _max, +void automatableModel::setRange( const T _min, const T _max, const T _step ) { - m_minValue = _min; - m_maxValue = _max; - if( m_minValue > m_maxValue ) + if( ( m_maxValue != _max ) || ( m_minValue != _min ) ) { - qSwap( m_minValue, m_maxValue ); + m_minValue = _min; + m_maxValue = _max; + if( m_minValue > m_maxValue ) + { + qSwap( m_minValue, m_maxValue ); + } + setStep( _step ); + // re-adjust value + autoModel::setInitValue( value() ); + + emit propertiesChanged(); } - setStep( _step ); - // re-adjust value - autoObj::setInitValue( value() ); } template -void automatableObject::setStep( const T _step ) +void automatableModel::setStep( const T _step ) { /* const T intv = maxValue() - minValue(); @@ -201,26 +215,32 @@ void automatableObject::setStep( const T _step ) m_step = minRelStep() * intv; } }*/ - m_step = _step; - m_curLevel = level( m_value ); - m_minLevel = level( m_minValue ); - m_maxLevel = level( m_maxValue ); + if( m_step != _step ) + { + m_step = _step; + m_curLevel = level( m_value ); + m_minLevel = level( m_minValue ); + m_maxLevel = level( m_maxValue ); + + emit propertiesChanged(); + } } -template -void automatableObject::linkObjects( autoObj * _object1, - autoObj * _object2 ) -{ - _object1->linkObject( _object2 ); - _object2->linkObject( _object1 ); - if( _object1->m_automation_pattern != _object2->m_automation_pattern ) +template +void automatableModel::linkModels( autoModel * _model1, + autoModel * _model2 ) +{ + _model1->linkModel( _model2 ); + _model2->linkModel( _model1 ); + + if( _model1->m_automationPattern != _model2->m_automationPattern ) { - delete _object2->m_automation_pattern; - _object2->m_automation_pattern = _object1->m_automation_pattern; + delete _model2->m_automationPattern; + _model2->m_automationPattern = _model1->m_automationPattern; } } @@ -228,17 +248,17 @@ void automatableObject::linkObjects( autoObj * _object1, template -void automatableObject::unlinkObjects( autoObj * _object1, - autoObj * _object2 ) +void automatableModel::unlinkModels( autoModel * _model1, + autoModel * _model2 ) { - _object1->unlinkObject( _object2 ); - _object2->unlinkObject( _object1 ); + _model1->unlinkModel( _model2 ); + _model2->unlinkModel( _model1 ); - if( _object1->m_automation_pattern && _object1->m_automation_pattern - == _object2->m_automation_pattern ) + if( _model1->m_automationPattern && _model1->m_automationPattern + == _model2->m_automationPattern ) { - _object2->m_automation_pattern = new automationPattern( - *_object1->m_automation_pattern, _object2 ); + _model2->m_automationPattern = new automationPattern( + *_model1->m_automationPattern, _model2 ); } } @@ -246,11 +266,11 @@ void automatableObject::unlinkObjects( autoObj * _object1, template -void automatableObject::saveSettings( QDomDocument & _doc, +void automatableModel::saveSettings( QDomDocument & _doc, QDomElement & _this, const QString & _name ) { - if( m_automation_pattern && m_automation_pattern->getTimeMap().size() + if( m_automationPattern && m_automationPattern->getTimeMap().size() > 1 ) { QDomElement pattern_element; @@ -267,7 +287,7 @@ void automatableObject::saveSettings( QDomDocument & _doc, _this.appendChild( pattern_element ); } QDomElement element = _doc.createElement( _name ); - m_automation_pattern->saveSettings( _doc, element ); + m_automationPattern->saveSettings( _doc, element ); pattern_element.appendChild( element ); } else @@ -280,7 +300,7 @@ void automatableObject::saveSettings( QDomDocument & _doc, template -void automatableObject::loadSettings( +void automatableModel::loadSettings( const QDomElement & _this, const QString & _name ) { @@ -290,8 +310,8 @@ void automatableObject::loadSettings( node = node.namedItem( _name ); if( node.isElement() ) { - m_automation_pattern->loadSettings( node.toElement() ); - setLevel( m_automation_pattern->valueAt( 0 ) ); + m_automationPattern->loadSettings( node.toElement() ); + setLevel( m_automationPattern->valueAt( 0 ) ); return; } } @@ -303,22 +323,22 @@ void automatableObject::loadSettings( template -automationPattern * automatableObject::getAutomationPattern( +automationPattern * automatableModel::getAutomationPattern( void ) { - if( !m_automation_pattern ) + if( !m_automationPattern ) { - m_automation_pattern = new automationPattern( m_track, this ); + m_automationPattern = new automationPattern( m_track, this ); syncAutomationPattern(); } - return( m_automation_pattern ); + return( m_automationPattern ); } template -void automatableObject::redoStep( journalEntry & _je ) +void automatableModel::redoStep( journalEntry & _je ) { bool journalling = testAndSetJournalling( FALSE ); setValue( static_cast( value() + static_cast( @@ -330,7 +350,7 @@ void automatableObject::redoStep( journalEntry & _je ) template -void automatableObject::undoStep( journalEntry & _je ) +void automatableModel::undoStep( journalEntry & _je ) { journalEntry je( _je.actionID(), static_cast( -_je.data().toDouble() ) ); @@ -341,7 +361,7 @@ void automatableObject::undoStep( journalEntry & _je ) template -void automatableObject::prepareJournalEntryFromOldVal( void ) +void automatableModel::prepareJournalEntryFromOldVal( void ) { m_oldValue = value(); saveJournallingState( FALSE ); @@ -352,7 +372,7 @@ void automatableObject::prepareJournalEntryFromOldVal( void ) template -void automatableObject::addJournalEntryFromOldToCurVal( +void automatableModel::addJournalEntryFromOldToCurVal( void ) { if( m_journalEntryReady ) @@ -371,14 +391,14 @@ void automatableObject::addJournalEntryFromOldToCurVal( template -void automatableObject::setFirstValue( void ) +void automatableModel::setFirstValue( void ) { - if( m_automation_pattern && m_automation_pattern->updateFirst() ) + if( m_automationPattern && m_automationPattern->updateFirst() ) { - m_automation_pattern->putValue( 0, m_curLevel, FALSE ); + m_automationPattern->putValue( 0, m_curLevel, FALSE ); if( engine::getAutomationEditor() && engine::getAutomationEditor()->currentPattern() - == m_automation_pattern ) + == m_automationPattern ) { engine::getAutomationEditor()->update(); } @@ -389,12 +409,12 @@ void automatableObject::setFirstValue( void ) template -void automatableObject::linkObject( autoObj * _object ) +void automatableModel::linkModel( autoModel * _model ) { - if( qFind( m_linkedObjects.begin(), m_linkedObjects.end(), _object ) - == m_linkedObjects.end() ) + if( qFind( m_linkedModels.begin(), m_linkedModels.end(), _model ) + == m_linkedModels.end() ) { - m_linkedObjects.push_back( _object ); + m_linkedModels.push_back( _model ); } } @@ -402,14 +422,14 @@ void automatableObject::linkObject( autoObj * _object ) template -void automatableObject::unlinkObject( autoObj * _object ) +void automatableModel::unlinkModel( autoModel * _model ) { - if( qFind( m_linkedObjects.begin(), m_linkedObjects.end(), _object ) - != m_linkedObjects.end() ) + if( qFind( m_linkedModels.begin(), m_linkedModels.end(), _model ) + != m_linkedModels.end() ) { - m_linkedObjects.erase( qFind( m_linkedObjects.begin(), - m_linkedObjects.end(), - _object ) ); + m_linkedModels.erase( qFind( m_linkedModels.begin(), + m_linkedModels.end(), + _model ) ); } } @@ -417,14 +437,14 @@ void automatableObject::unlinkObject( autoObj * _object ) template -void automatableObject::syncAutomationPattern( void ) +void automatableModel::syncAutomationPattern( void ) { - for( int i = 0; i < m_linkedObjects.size(); ++i ) + for( int i = 0; i < m_linkedModels.size(); ++i ) { - autoObj * it = m_linkedObjects[i]; - if( m_automation_pattern != it->m_automation_pattern ) + autoModel * it = m_linkedModels[i]; + if( m_automationPattern != it->m_automationPattern ) { - it->m_automation_pattern = m_automation_pattern; + it->m_automationPattern = m_automationPattern; } } } @@ -433,16 +453,16 @@ void automatableObject::syncAutomationPattern( void ) template -void automatableObject::setLevel( int _level ) +void automatableModel::setLevel( int _level ) { if( m_curLevel == _level ) { return; } bool journalling = testAndSetJournalling( FALSE ); - m_automation_pattern->setUpdateFirst( FALSE ); + m_automationPattern->setUpdateFirst( FALSE ); setValue( _level * m_step ); - m_automation_pattern->setUpdateFirst( TRUE ); + m_automationPattern->setUpdateFirst( TRUE ); setJournalling( journalling ); } @@ -450,7 +470,7 @@ void automatableObject::setLevel( int _level ) template<> -inline float automatableObject::minRelStep( void ) +inline float automatableModel::minRelStep( void ) { return( 1.0e-10 ); } @@ -459,7 +479,7 @@ inline float automatableObject::minRelStep( void ) template<> -inline float automatableObject::defaultRelStep( void ) +inline float automatableModel::defaultRelStep( void ) { return( 1.0e-2 ); } @@ -468,7 +488,7 @@ inline float automatableObject::defaultRelStep( void ) template<> -inline float automatableObject::minEps( void ) +inline float automatableModel::minEps( void ) { return( 1.0e-10 ); } @@ -477,7 +497,7 @@ inline float automatableObject::minEps( void ) template<> -inline float automatableObject::attributeValue( QString _value ) +inline float automatableModel::attributeValue( QString _value ) { return( _value.toFloat() ); } @@ -486,7 +506,7 @@ inline float automatableObject::attributeValue( QString _value ) template<> -inline int automatableObject::attributeValue( QString _value ) +inline int automatableModel::attributeValue( QString _value ) { return( _value.toInt() ); } @@ -495,7 +515,15 @@ inline int automatableObject::attributeValue( QString _value ) template<> -inline bool automatableObject::attributeValue( +inline bool automatableModel::attributeValue( QString _value ) +{ + return( static_cast( _value.toInt() ) ); +} + + + +template<> +inline bool automatableModel::attributeValue( QString _value ) { return( static_cast( _value.toInt() ) ); diff --git a/include/automatable_slider.h b/include/automatable_slider.h index cdd6a67c9..2d719d17c 100644 --- a/include/automatable_slider.h +++ b/include/automatable_slider.h @@ -30,18 +30,18 @@ #include -class knob; +#include "automatable_model.h" -class automatableSlider : public QSlider + +class automatableSlider : public QSlider, public automatableModelView { Q_OBJECT public: - automatableSlider( QWidget * _parent, const QString & _name, - class track * _track ); + automatableSlider( QWidget * _parent, const QString & _name ); virtual ~automatableSlider(); - virtual void setRange( int _min, int _max ); +/* virtual void setRange( int _min, int _max ); virtual void setValue( int _value ); virtual void setInitValue( int _value ); @@ -51,11 +51,11 @@ public: const QString & _name ); int logicValue( void ); - void clearAutomationValues( void ); + void clearAutomationValues( void );*/ bool showStatus( void ) { - return( m_show_status ); + return( m_showStatus ); } @@ -70,10 +70,11 @@ protected: virtual void mouseReleaseEvent( QMouseEvent * _me ); virtual void wheelEvent( QWheelEvent * _me ); + virtual void modelChanged( void ); + private: - knob * m_knob; - bool m_show_status; + bool m_showStatus; private slots: @@ -84,6 +85,7 @@ private slots: } ; +typedef automatableSlider::autoModel sliderModel; #endif diff --git a/include/bb_editor.h b/include/bb_editor.h index 05e7b58c4..e9df4580f 100644 --- a/include/bb_editor.h +++ b/include/bb_editor.h @@ -27,17 +27,18 @@ #define _BB_EDITOR_H #include "track_container.h" +#include "combobox.h" class QPixmap; -class comboBox; class toolButton; class bbEditor : public trackContainer { Q_OBJECT + mapPropertyFromModelPtr(int,currentBB,setCurrentBB,m_bbComboBoxModel); public: virtual bool FASTCALL play( midiTime _start, const fpp_t _frames, const f_cnt_t _frame_base, @@ -58,11 +59,6 @@ public: return( TRUE ); } - int currentBB( void ) const - { - return( m_currentBB ); - } - tact FASTCALL lengthOfBB( const int _bb ); inline tact lengthOfCurrentBB( void ) { @@ -80,7 +76,7 @@ public slots: void play( void ); void stop( void ); void updateComboBox( void ); - void setCurrentBB( int _bb ); + void currentBBChanged( void ); protected: @@ -95,15 +91,13 @@ private: void FASTCALL createTCOsForBB( const int _bb ); - int m_currentBB; - QWidget * m_toolBar; toolButton * m_playButton; toolButton * m_stopButton; comboBox * m_bbComboBox; - + comboBoxModel * m_bbComboBoxModel; friend class engine; diff --git a/include/combobox.h b/include/combobox.h index d15e9fbf8..7a7316462 100644 --- a/include/combobox.h +++ b/include/combobox.h @@ -29,41 +29,93 @@ #include #include #include -#include #include -#include "automatable_object.h" +#include "automatable_model.h" +#include "automatable_model_templates.h" -class QAction; - - -class comboBox : public QWidget, public automatableObject +class comboBoxModel : public intModel { Q_OBJECT public: - comboBox( QWidget * _parent, const QString & _name, track * _track ); - virtual ~comboBox(); - - void addItem( const QString & _item, const QPixmap & _pixmap = - QPixmap() ); - - inline void clear( void ) + comboBoxModel( ::model * _parent = NULL ) : + automatableModel( 0, 0, 0, defaultRelStep(), _parent ) { - setRange( 0, 0 ); - m_items.clear(); - m_menu.clear(); - update(); } + void addItem( const QString & _item, QPixmap * _data = NULL ); + + void clear( void ); + int findText( const QString & _txt ) const; - QString currentText( void ) const + inline const QString & currentText( void ) const { return( m_items[value()].first ); } - void setValue( const int _idx ); + inline const QPixmap * currentData( void ) const + { + return( m_items[value()].second ); + } + + inline const QString & itemText( int _i ) const + { + return( m_items[tLimit( _i, minValue(), maxValue() )]. + first ); + } + + inline const QPixmap * itemPixmap( int _i ) const + { + return( m_items[tLimit( _i, minValue(), maxValue() )]. + second ); + } + + inline int size( void ) const + { + return( m_items.size() ); + } + +private: + typedef QPair item; + + QVector m_items; + + +signals: + void itemPixmapRemoved( QPixmap * _item ); + +} ; + + + +class comboBox : public QWidget, public intModelView +{ + Q_OBJECT +public: + comboBox( QWidget * _parent, const QString & _name = QString::null ); + virtual ~comboBox(); + + comboBoxModel * model( void ) + { + return( castModel() ); + } + + const comboBoxModel * model( void ) const + { + return( castModel() ); + } + + + virtual void modelChanged( void ) + { + if( model() != NULL ) + { + connect( model(), SIGNAL( itemPixmapRemoved( QPixmap * ) ), + this, SLOT( deletePixmap( QPixmap * ) ) ); + } + } protected: @@ -79,20 +131,17 @@ private: QMenu m_menu; - typedef QPair item; - - QVector m_items; - bool m_pressed; private slots: + void deletePixmap( QPixmap * _pixmap ); void setItem( QAction * _item ); - +/* signals: void activated( const QString & ); - void valueChanged( int ); + void valueChanged( int );*/ } ; diff --git a/include/detuning_helper.h b/include/detuning_helper.h index 1fd174d9b..21fb79104 100644 --- a/include/detuning_helper.h +++ b/include/detuning_helper.h @@ -27,14 +27,16 @@ #define _DETUNING_HELPER_H +#include "automatable_model.h" #include "shared_object.h" +#include "automation_editor.h" -class detuningHelper : public automatableObject, public sharedObject +class detuningHelper : public floatModel, public sharedObject { public: detuningHelper( void ) : - autoObj( NULL ) + autoModel( NULL ) { } diff --git a/include/effect.h b/include/effect.h index a07cafa65..a44655a4a 100644 --- a/include/effect.h +++ b/include/effect.h @@ -34,11 +34,14 @@ #include #include "plugin.h" +#include "engine.h" #include "mixer.h" +#include "automatable_model.h" class effectControlDialog; class track; +class rackPlugin; class effect : public plugin @@ -88,14 +91,9 @@ public: m_running = FALSE; } - inline bool isBypassed( void ) + inline bool enabled( void ) { - return( m_bypass ); - } - - inline void setBypass( bool _mode ) - { - m_bypass = _mode; + return( m_enabledModel.value() ); } inline Uint32 getTimeout( void ) @@ -110,45 +108,41 @@ public: inline float getWetLevel( void ) { - return( m_wetDry ); + return( m_wetDryModel.value() ); } inline float getDryLevel( void ) { - return( 1.0f - m_wetDry ); + return( 1.0f - m_wetDryModel.value() ); } - inline void setWetLevel( float _wet ) - { - m_wetDry = _wet; - } inline float getGate( void ) { - return( m_gate ); + const float level = m_gateModel.value(); + return( level*level * m_processors * + engine::getMixer()->framesPerPeriod() ); } - - void setGate( float _level ); - + inline Uint32 getBufferCount( void ) { return( m_bufferCount ); } - + inline void resetBufferCount( void ) { m_bufferCount = 0; } - + inline void incrementBufferCount( void ) { m_bufferCount++; } - + inline bool dontRun( void ) { return( m_noRun ); } - + inline void setDontRun( bool _state ) { m_noRun = _state; @@ -169,17 +163,20 @@ private: descriptor::subPluginFeatures::key m_key; ch_cnt_t m_processors; - + bool m_okay; bool m_noRun; bool m_running; - bool m_bypass; - + boolModel m_enabledModel; + Uint32 m_bufferCount; Uint32 m_silenceTimeout; - - float m_wetDry; - float m_gate; + + floatModel m_wetDryModel; + floatModel m_gateModel; + + + friend class rackPlugin; } ; diff --git a/include/envelope_and_lfo_widget.h b/include/envelope_and_lfo_widget.h index 4edd51795..a2e501141 100644 --- a/include/envelope_and_lfo_widget.h +++ b/include/envelope_and_lfo_widget.h @@ -33,6 +33,7 @@ #include "journalling_object.h" +#include "automatable_model.h" #include "sample_buffer.h" #include "types.h" @@ -102,10 +103,7 @@ protected: protected slots: - void updateAfterKnobChange( float ); - void lfoWaveCh( int ); - void lfoUserWaveCh( bool ); - void x100Toggled( bool ); + void lfoUserWaveChanged( void ); private: @@ -126,6 +124,15 @@ private: knob * m_releaseKnob; knob * m_amountKnob; + // models + floatModel m_predelayModel; + floatModel m_attackModel; + floatModel m_holdModel; + floatModel m_decayModel; + floatModel m_sustainModel; + floatModel m_releaseModel; + floatModel m_amountModel; + float m_sustainLevel; float m_amount; float m_valueForZeroAmount; @@ -135,6 +142,7 @@ private: sample_t * m_pahdEnv; sample_t * m_rEnv; + // LFO-stuff knob * m_lfoPredelayKnob; knob * m_lfoAttackKnob; @@ -146,6 +154,17 @@ private: ledCheckBox * m_x100Cb; ledCheckBox * m_controlEnvAmountCb; + // models + floatModel m_lfoPredelayModel; + floatModel m_lfoAttackModel; + floatModel m_lfoSpeedModel; + floatModel m_lfoAmountModel; + intModel m_lfoWaveModel; + + boolModel m_x100Model; + boolModel m_controlEnvAmountModel; + + f_cnt_t m_lfoPredelayFrames; f_cnt_t m_lfoAttackFrames; f_cnt_t m_lfoOscillationFrames; @@ -163,7 +182,7 @@ private: SAW, SQUARE, USER - } m_lfoShape; + } ; sample_t lfoShapeSample( fpp_t _frame_offset ); void updateLFOShapeData( void ); diff --git a/include/envelope_tab_widget.h b/include/envelope_tab_widget.h index 2599c1994..65f92cd7e 100644 --- a/include/envelope_tab_widget.h +++ b/include/envelope_tab_widget.h @@ -31,10 +31,12 @@ #include #include "mixer.h" +#include "automatable_model.h" class QLabel; +class comboBoxModel; class instrumentTrack; class comboBox; class envelopeAndLFOWidget; @@ -92,6 +94,11 @@ private: knob * m_filterCutKnob; knob * m_filterResKnob; + boolModel * m_filterEnabledModel; + comboBoxModel * m_filterModel; + floatModel * m_filterCutModel; + floatModel * m_filterResModel; + friend class flpImport; } ; diff --git a/include/export_project_dialog.h b/include/export_project_dialog.h index c51366930..61be5eb96 100644 --- a/include/export_project_dialog.h +++ b/include/export_project_dialog.h @@ -30,6 +30,7 @@ #include #include "export.h" +#include "automatable_model.h" class QLabel; @@ -37,6 +38,7 @@ class QPushButton; class QProgressBar; class comboBox; +class comboBoxModel; class ledCheckBox; class pixmapButton; @@ -71,18 +73,22 @@ private: static Sint16 s_availableBitrates[]; - QString m_fileName; QLabel * m_typeLbl; comboBox * m_typeCombo; + comboBoxModel * m_typeModel; QLabel * m_kbpsLbl; comboBox * m_kbpsCombo; + comboBoxModel * m_kbpsModel; ledCheckBox * m_vbrCb; + boolModel * m_vbrEnabledModel; ledCheckBox * m_hqmCb; + boolModel * m_hqmEnabledModel; QLabel * m_hourglassLbl; QPushButton * m_exportBtn; QPushButton * m_cancelBtn; QProgressBar * m_exportProgressBar; + QString m_fileName; fileTypes m_fileType; bool m_deleteFile; diff --git a/include/group_box.h b/include/group_box.h index 379dbc1e5..54fed76bd 100644 --- a/include/group_box.h +++ b/include/group_box.h @@ -28,38 +28,28 @@ #include +#include "automatable_model.h" #include "pixmap_button.h" class QPixmap; -class groupBox : public QWidget +class groupBox : public QWidget, public boolModelView { Q_OBJECT public: - groupBox( const QString & _caption, QWidget * _parent, track * _track ); + groupBox( const QString & _caption, QWidget * _parent ); virtual ~groupBox(); - bool isActive( void ) const - { - return( m_led->isChecked() ); - } - - void saveSettings( QDomDocument & _doc, QDomElement & _this, - const QString & _name ); - void loadSettings( const QDomElement & _this, const QString & _name ); + virtual void modelChanged( void ); public slots: - void setState( bool _on, bool _anim = FALSE ); +// void setState( bool _on, bool _anim = FALSE ); void animate( void ); -signals: - void toggled( bool _state ); - - protected: virtual void resizeEvent( QResizeEvent * _re ); virtual void mousePressEvent( QMouseEvent * _me ); @@ -78,4 +68,8 @@ private: } ; + +typedef groupBox::autoModel groupBoxModel; + + #endif diff --git a/include/instrument_track.h b/include/instrument_track.h index 6f3dd9e29..7f2f9dd43 100644 --- a/include/instrument_track.h +++ b/include/instrument_track.h @@ -30,8 +30,11 @@ #include #include +#include "automatable_model.h" +#include "lcd_spinbox.h" #include "midi_event_processor.h" #include "mixer.h" +#include "surround_area.h" #include "tab_widget.h" #include "track.h" @@ -56,6 +59,7 @@ class volumeKnob; class instrumentTrack : public QWidget, public track, public midiEventProcessor { Q_OBJECT + mapPropertyFromModel(int,getVolume,setVolume,m_volumeModel); public: instrumentTrack( trackContainer * _tc ); virtual ~instrumentTrack(); @@ -100,13 +104,12 @@ public: void FASTCALL setName( const QString & _new_name ); // volume & surround-position-stuff - void FASTCALL setVolume( volume _new_volume ); - volume getVolume( void ) const; - void FASTCALL setSurroundAreaPos( const QPoint & _p ); +/* void FASTCALL setVolume( volume _new_volume ); + volume getVolume( void ) const;*/ - void FASTCALL setBaseNote( Uint32 _new_note, bool _modified = TRUE ); +// void FASTCALL setBaseNote( Uint32 _new_note, bool _modified = TRUE ); - inline tones baseTone( void ) const +/* inline tones baseTone( void ) const { return( m_baseTone ); } @@ -114,7 +117,7 @@ public: inline octaves baseOctave( void ) const { return( m_baseOctave ); - } + }*/ int FASTCALL masterKey( notePlayHandle * _n ) const; @@ -158,9 +161,13 @@ public: return( m_audioPort ); } + intModel * baseNoteModel( void ) + { + return( &m_baseNoteModel ); + } + public slots: - void surroundAreaPosChanged( const QPoint & _new_p ); void textChanged( const QString & _new_name ); void toggledInstrumentTrackButton( bool _on ); @@ -192,6 +199,8 @@ protected slots: void midiOutSelected( void ); void midiConfigChanged( bool ); + void updateBaseNote( void ); + private: trackTypes m_trackType; @@ -204,13 +213,12 @@ private: notePlayHandle * m_notes[NOTES_PER_OCTAVE * OCTAVES]; - tones m_baseTone; - octaves m_baseOctave; + intModel m_baseNoteModel; QList m_processHandles; - // widgets on the top of a instrument-track-window + // widgets on the top of an instrument-track-window tabWidget * m_generalSettingsWidget; QLineEdit * m_instrumentNameLE; volumeKnob * m_volumeKnob; @@ -218,7 +226,11 @@ private: lcdSpinBox * m_effectChannelNumber; QPushButton * m_saveSettingsBtn; - + floatModel m_volumeModel; + surroundAreaModel m_surroundAreaModel; + lcdSpinBoxModel m_effectChannelModel; + + // tab-widget with all children tabWidget * m_tabWidget; instrument * m_instrument; @@ -245,9 +257,9 @@ private: friend class presetPreviewPlayHandle; friend class flpImport; - // base-tone stuff +/* // base-tone stuff void FASTCALL setBaseTone( tones _new_tone ); - void FASTCALL setBaseOctave( octaves _new_octave ); + void FASTCALL setBaseOctave( octaves _new_octave );*/ } ; diff --git a/include/journalling_object.h b/include/journalling_object.h index 48b1763ec..7c8d91842 100644 --- a/include/journalling_object.h +++ b/include/journalling_object.h @@ -147,10 +147,6 @@ public: // to be implemented by actual object virtual QString nodeName( void ) const = 0; - -protected: - void addJournalEntry( const journalEntry & _je ); - inline bool isJournalling( void ) const { return( m_journalling ); @@ -169,6 +165,10 @@ protected: } + +protected: + void addJournalEntry( const journalEntry & _je ); + // to be implemented by sub-objects virtual void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _this ) diff --git a/include/knob.h b/include/knob.h index f614550eb..d075698e8 100644 --- a/include/knob.h +++ b/include/knob.h @@ -32,7 +32,8 @@ #include #include -#include "automatable_object.h" +#include "automatable_model.h" +#include "templates.h" class QPixmap; @@ -46,32 +47,20 @@ enum knobTypes -class knob : public QWidget, public automatableObject +class knob : public QWidget, public floatModelView { Q_OBJECT public: - knob( int _knob_num, QWidget * _parent, const QString & _name, - track * _track ); + knob( int _knob_num, QWidget * _parent, const QString & _name ); virtual ~knob(); - + void setHintText( const QString & _txt_before, const QString & _txt_after ); void setLabel( const QString & _txt ); void setTotalAngle( float _angle ); - inline virtual void setInitValue( const float _val ) - { - m_initValue = _val; - autoObj::setInitValue( _val ); - } - - virtual void setValue( const float _x ); - - virtual void setRange( const float _min, const float _max, - const float _step = 0.0 ); - public slots: void reset( void ); @@ -83,8 +72,8 @@ public slots: signals: - void valueChanged( float value ); - void valueChanged( void ); +// void valueChanged( float value ); +// void valueChanged( void ); void sliderPressed( void ); void sliderReleased( void ); void sliderMoved( float value ); @@ -102,8 +91,6 @@ protected: QString m_hintTextBeforeValue; QString m_hintTextAfterValue; - float m_initValue; - virtual void contextMenuEvent( QContextMenuEvent * _me ); virtual void dragEnterEvent( QDragEnterEvent * _dee ); virtual void dropEvent( QDropEvent * _de ); @@ -112,7 +99,6 @@ protected: virtual void mouseMoveEvent( QMouseEvent * _me ); virtual void mouseDoubleClickEvent( QMouseEvent * _me ); virtual void paintEvent( QPaintEvent * _me ); - virtual void resizeEvent( QResizeEvent * _me ); virtual void wheelEvent( QWheelEvent * _me ); void drawKnob( QPainter * _p ); @@ -122,16 +108,16 @@ protected: private: - void layoutKnob( bool _update = TRUE ); - void recalcAngle( void ); - - void valueChange( void ); - void rangeChange( void ); + inline float pageSize( void ) const + { + return( tMax( ( model()->maxValue() - + model()->minValue() ) / 100.0f, + model()->step() ) ); + } + void valueChange( void ); void buttonReleased( void ); - float m_pageSize; - float m_angle; float m_totalAngle; int m_knobNum; @@ -139,4 +125,7 @@ private: } ; + +typedef knob::autoModel knobModel; + #endif diff --git a/include/ladspa_control.h b/include/ladspa_control.h index 66ce7efe5..9cafb0a8a 100644 --- a/include/ladspa_control.h +++ b/include/ladspa_control.h @@ -39,10 +39,10 @@ #endif -#include "journalling_object.h" +#include "automatable_model.h" +#include "knob.h" -class knob; class ledCheckBox; class track; @@ -65,14 +65,14 @@ public: void FASTCALL linkControls( ladspaControl * _control ); void FASTCALL unlinkControls( ladspaControl * _control ); - inline ledCheckBox * getToggle( void ) + inline boolModel * getToggledModel( void ) { - return( m_toggle ); + return( &m_toggledModel ); } - inline knob * getKnob( void ) + inline knobModel * getKnobModel( void ) { - return( m_knob ); + return( &m_knobModel ); } inline port_desc_t * getPort( void ) @@ -89,15 +89,18 @@ public: return( "port" ); } + signals: void changed( Uint16 _port, LADSPA_Data _value ); void linkChanged( Uint16 _port, bool _state ); + protected slots: - void ledChange( bool _state ); - void knobChange( float _value ); - void portLink( bool _state ); - + void ledChanged( void ); + void knobChanged( void ); + void linkStateChanged( void ); + + private: port_desc_t * m_port; track * m_track; @@ -105,6 +108,11 @@ private: ledCheckBox * m_link; ledCheckBox * m_toggle; knob * m_knob; -}; + + boolModel m_linkEnabledModel; + boolModel m_toggledModel; + knobModel m_knobModel; + +} ; #endif diff --git a/include/lcd_spinbox.h b/include/lcd_spinbox.h index 8f788a36c..6c4c86a1a 100644 --- a/include/lcd_spinbox.h +++ b/include/lcd_spinbox.h @@ -29,33 +29,38 @@ #include #include -#include "automatable_object.h" +#include "automatable_model.h" class QLabel; -class lcdSpinBox : public QWidget, public automatableObject +class lcdSpinBox : public QWidget, public automatableModelView { Q_OBJECT public: - lcdSpinBox( int _min, int _max, int _num_digits, QWidget * _parent, - const QString & _name, track * _track ); + lcdSpinBox( int _num_digits, QWidget * _parent, const QString & _name = + QString::null ); virtual ~lcdSpinBox(); - virtual void setStep( const int _step ); - void setLabel( const QString & _txt ); inline void addTextForValue( int _val, const QString & _text ) { m_textForValue[_val] = _text; + update(); + } + + virtual void modelChanged( void ) + { + modelView::modelChanged(); + update(); } public slots: - virtual void setValue( const int _value ); virtual void setEnabled( bool _on ); + virtual void update( void ); protected: @@ -76,9 +81,10 @@ private: signals: - void valueChanged( int ); void manualChange( void ); } ; +typedef lcdSpinBox::autoModel lcdSpinBoxModel; + #endif diff --git a/include/led_checkbox.h b/include/led_checkbox.h index 17529c653..6f0958117 100644 --- a/include/led_checkbox.h +++ b/include/led_checkbox.h @@ -42,8 +42,8 @@ public: } ; ledCheckBox( const QString & _txt, QWidget * _parent, - const QString & _name, track * _track, - ledColors _color = YELLOW ); + const QString & _name = QString::null, + ledColors _color = YELLOW ); virtual ~ledCheckBox(); diff --git a/include/meter_dialog.h b/include/meter_dialog.h index de446843f..5fdba0d3d 100644 --- a/include/meter_dialog.h +++ b/include/meter_dialog.h @@ -44,21 +44,26 @@ public: inline int getNumerator( void ) { - return( m_numerator->value() ); + return( m_numeratorModel->value() ); } inline int getDenominator( void ) { - return( m_denominator->value() ); + return( m_denominatorModel->value() ); } - + + private: lcdSpinBox * m_numerator; lcdSpinBox * m_denominator; + lcdSpinBoxModel * m_numeratorModel; + lcdSpinBoxModel * m_denominatorModel; + signals: - void numeratorChanged( int ); - void denominatorChanged( int ); -}; + void numeratorChanged( void ); + void denominatorChanged( void ); + +} ; #endif diff --git a/include/midi_tab_widget.h b/include/midi_tab_widget.h index 775dcd790..3a042f097 100644 --- a/include/midi_tab_widget.h +++ b/include/midi_tab_widget.h @@ -29,7 +29,7 @@ #include -#include "journalling_object.h" +#include "automatable_model.h" class QMenu; @@ -61,14 +61,14 @@ public: public slots: - void midiPortModeToggled( bool = FALSE ); + void midiPortModeChanged( void ); protected slots: - void inputChannelChanged( int ); - void outputChannelChanged( int ); - void defaultVelInChanged( bool ); - void defaultVelOutChanged( bool ); + void inputChannelChanged( void ); + void outputChannelChanged( void ); + void defaultVelInChanged( void ); + void defaultVelOutChanged( void ); void readablePortsChanged( void ); void writeablePortsChanged( void ); void activatedReadablePort( QAction * _item ); @@ -85,6 +85,12 @@ private: ledCheckBox * m_sendCheckBox; ledCheckBox * m_defaultVelocityInCheckBox; ledCheckBox * m_defaultVelocityOutCheckBox; + intModel m_inputChannelModel; + intModel m_outputChannelModel; + boolModel m_receiveEnabledModel; + boolModel m_sendEnabledModel; + boolModel m_defaultVelocityInEnabledModel; + boolModel m_defaultVelocityOutEnabledModel; QMenu * m_readablePorts; QMenu * m_writeablePorts; diff --git a/include/mv_base.h b/include/mv_base.h new file mode 100644 index 000000000..d0c990c5d --- /dev/null +++ b/include/mv_base.h @@ -0,0 +1,107 @@ +/* + * mv_base.h - base for M/V-architecture of LMMS + * + * Copyright (c) 2007 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _MV_BASE_H +#define _MV_BASE_H + +#include + + +class model : public QObject +{ + Q_OBJECT +public: + model( model * _parent, bool _default_constructed = FALSE ) : + QObject( _parent ), + m_defaultConstructed( _default_constructed ) + { + } + + virtual ~model() + { + } + + inline bool defaultConstructed( void ) + { + return( m_defaultConstructed ); + } + + +private: + bool m_defaultConstructed; + + +signals: + // emitted if actual data of the model (e.g. values) have changed + void dataChanged( void ); + + // emitted if properties of the model (e.g. ranges) have changed + void propertiesChanged( void ); + +} ; + + + + +class modelView +{ +public: + modelView() : + m_model( NULL ) + { + } + + virtual ~modelView() + { + } + + void setModel( model * _model, bool _old_model_valid = TRUE ); + + // sub-classes can re-implement this to track model-changes + virtual void modelChanged( void ) + { + } + + template + T * castModel( void ) + { + return( dynamic_cast( m_model ) ); + } + + template + const T * castModel( void ) const + { + return( dynamic_cast( m_model ) ); + } + + +private: + model * m_model; + +} ; + + +#endif + diff --git a/include/piano_roll.h b/include/piano_roll.h index 567020ec8..b10d6543b 100644 --- a/include/piano_roll.h +++ b/include/piano_roll.h @@ -39,6 +39,7 @@ class QPixmap; class QScrollBar; class comboBox; +class comboBoxModel; class notePlayHandle; class pattern; class timeLine; @@ -125,7 +126,7 @@ protected slots: void updatePosition( const midiTime & _t ); - void zoomingChanged( const QString & _zfac ); + void zoomingChanged( void ); private: @@ -196,6 +197,11 @@ private: comboBox * m_quantizeComboBox; comboBox * m_noteLenComboBox; + comboBoxModel * m_zoomingModel; + comboBoxModel * m_quantizeModel; + comboBoxModel * m_noteLenModel; + + pattern * m_pattern; QScrollBar * m_leftRightScroll; diff --git a/include/piano_widget.h b/include/piano_widget.h index a5611979b..9f6668db2 100644 --- a/include/piano_widget.h +++ b/include/piano_widget.h @@ -33,6 +33,7 @@ #include "note.h" +#include "automatable_model.h" class instrumentTrack; @@ -56,11 +57,6 @@ public: void setKeyState( int _key, bool _on = FALSE ); - virtual void saveSettings( QDomDocument & _doc, QDomElement & _this, - const QString & _name ); - virtual void loadSettings( const QDomElement & _this, - const QString & _name ); - virtual void keyPressEvent( QKeyEvent * ke ); virtual void keyReleaseEvent( QKeyEvent * ke ); #ifndef BUILD_WIN32 @@ -95,14 +91,12 @@ private: octaves m_startOctave; int m_lastKey; - unsigned int m_keycode; + unsigned int m_keyCode; - knob * m_noteKnob; private slots: void pianoScrolled( int _new_pos ); - void updateBaseNote( void ); } ; diff --git a/include/pixmap_button.h b/include/pixmap_button.h index 4af5a91dd..065c47c6d 100644 --- a/include/pixmap_button.h +++ b/include/pixmap_button.h @@ -35,8 +35,7 @@ class pixmapButton : public automatableButton { Q_OBJECT public: - pixmapButton( QWidget * _parent, const QString & _name, - track * _track ); + pixmapButton( QWidget * _parent, const QString & _name ); virtual ~pixmapButton(); void setActiveGraphic( const QPixmap & _pm ); diff --git a/include/rack_plugin.h b/include/rack_plugin.h index 5d29809d3..7334a3482 100644 --- a/include/rack_plugin.h +++ b/include/rack_plugin.h @@ -22,12 +22,13 @@ * Boston, MA 02110-1301 USA. * */ + #ifndef _RACK_PLUGIN_H #define _RACK_PLUGIN_H #include -#include "journalling_object.h" +#include "automatable_model.h" class QGroupBox; @@ -68,10 +69,10 @@ public: public slots: void editControls( void ); - void bypassed( bool _state ); - void setWetDry( float _value ); - void setAutoQuit( float _value ); - void setGate( float _value ); + void updateAutoQuit( void ); +/* void bypassChanged( void ); + void updateWetDry( void ); + void updateGate( void );*/ void moveUp( void ); void moveDown( void ); void deletePlugin( void ); @@ -87,6 +88,8 @@ protected: void contextMenuEvent( QContextMenuEvent * _me ); private: + floatModel m_autoQuitModel; + ledCheckBox * m_bypass; knob * m_wetDry; tempoSyncKnob * m_autoQuit; @@ -95,7 +98,7 @@ private: QGroupBox * m_controls; QLabel * m_label; QPushButton * m_editButton; - QMdiSubWindow *m_subWindow; + QMdiSubWindow * m_subWindow; effect * m_effect; effectControlDialog * m_controlView; track * m_track; diff --git a/include/sample_play_handle.h b/include/sample_play_handle.h index eb409ad1d..03106a2f6 100644 --- a/include/sample_play_handle.h +++ b/include/sample_play_handle.h @@ -30,6 +30,7 @@ #include "play_handle.h" #include "sample_buffer.h" +#include "automatable_model.h" class bbTrack; class pattern; @@ -38,9 +39,8 @@ class track; class audioPort; -class samplePlayHandle : public QObject, public playHandle +class samplePlayHandle : public playHandle { - Q_OBJECT public: samplePlayHandle( const QString & _sample_file ); samplePlayHandle( sampleBuffer * _sample_buffer ); @@ -68,9 +68,10 @@ public: m_bbTrack = _bb_track; } - -public slots: - void setVolume( float _new_volume ); + void setVolumeModel( floatModel * _model ) + { + m_volumeModel = _model; + } private: @@ -83,7 +84,8 @@ private: audioPort * m_audioPort; const bool m_ownAudioPort; - float m_volume; + floatModel m_defaultVolumeModel; + floatModel * m_volumeModel; track * m_track; bbTrack * m_bbTrack; diff --git a/include/sample_track.h b/include/sample_track.h index b3e3bb10f..e430f9627 100644 --- a/include/sample_track.h +++ b/include/sample_track.h @@ -30,12 +30,12 @@ #include #include "track.h" +#include "volume_knob.h" class QLabel; class audioPort; class effectLabel; class sampleBuffer; -class volumeKnob; //class sampleTCOSettingsDialog; @@ -147,6 +147,7 @@ private: audioPort * m_audioPort; volumeKnob * m_volumeKnob; + knobModel m_volumeModel; } ; diff --git a/include/setup_dialog.h b/include/setup_dialog.h index 9e3716b17..0be11647d 100644 --- a/include/setup_dialog.h +++ b/include/setup_dialog.h @@ -99,7 +99,6 @@ private slots: void toggleDisableChActInd( bool _disabled ); void toggleManualChPiano( bool _enabled ); - void setParallelizingLevel( int _level ); private: @@ -138,7 +137,6 @@ private: bool m_disableChActInd; bool m_manualChPiano; - int m_parLevel; typedef QMap aswMap; typedef QMap mswMap; diff --git a/include/song_editor.h b/include/song_editor.h index 93901e5f4..592cd82e6 100644 --- a/include/song_editor.h +++ b/include/song_editor.h @@ -28,14 +28,14 @@ #define _SONG_EDITOR_H #include "track_container.h" +#include "lcd_spinbox.h" +#include "automatable_slider.h" class QLabel; class QScrollBar; -class automatableSlider; class comboBox; -class lcdSpinBox; class pattern; class textFloat; class timeLine; @@ -51,6 +51,8 @@ const Uint16 MAX_SONG_LENGTH = 9999; class songEditor : public trackContainer { Q_OBJECT + mapPropertyFromModel(int,masterPitch,setMasterPitch,m_masterPitchModel); + mapPropertyFromModel(int,masterVolume,setMasterVolume,m_masterVolumeModel); public: enum playModes { @@ -154,8 +156,6 @@ public: return( FALSE ); } - int masterPitch( void ) const; - public slots: void play( void ); @@ -172,10 +172,6 @@ public slots: void startExport( void ); void stopExport( void ); - // set tempo in BPM (beats per minute) - void setTempo( int _new_bpm = DEFAULT_BPM ); - void setMasterVolume( volume _vol ); - void setMasterPitch( int _master_pitch ); void setModified( void ); @@ -198,6 +194,8 @@ protected slots: void scrolled( int _new_pos ); void updateTimeLinePosition( void ); + void setTempo( void ); + void masterVolumeChanged( int _new_val ); void masterVolumePressed( void ); void masterVolumeMoved( int _new_val ); @@ -209,7 +207,7 @@ protected slots: void updatePosition( const midiTime & _t ); - void zoomingChanged( const QString & _zfac ); + void zoomingChanged( void ); void doActions( void ); @@ -235,16 +233,22 @@ private: + track * m_automationTrack; + QScrollBar * m_leftRightScroll; QWidget * m_toolBar; toolButton * m_playButton; toolButton * m_stopButton; - lcdSpinBox * m_bpmSpinBox; + lcdSpinBox * m_tempoSpinBox; + lcdSpinBoxModel m_tempoModel; automatableSlider * m_masterVolumeSlider; automatableSlider * m_masterPitchSlider; + sliderModel m_masterVolumeModel; + sliderModel m_masterPitchModel; + textFloat * m_mvsStatus; textFloat * m_mpsStatus; @@ -275,8 +279,6 @@ private: bool m_scrollBack; - track * m_automation_track; - enum ACTIONS diff --git a/include/surround_area.h b/include/surround_area.h index 2147c9d62..c7b40d178 100644 --- a/include/surround_area.h +++ b/include/surround_area.h @@ -30,6 +30,7 @@ #include +#include "automatable_model.h" #include "mixer.h" @@ -41,24 +42,70 @@ class track; const int SURROUND_AREA_SIZE = 1024; -class surroundArea : public QWidget +class surroundAreaModel : public model +{ + Q_OBJECT + mapPropertyFromModel(int,x,setX,m_posX); + mapPropertyFromModel(int,y,setY,m_posY); +public: + surroundAreaModel( ::model * _parent, track * _track = NULL, + bool _default_constructed = FALSE ); + + volumeVector getVolumeVector( float _v_scale ) const; + + void saveSettings( QDomDocument & _doc, QDomElement & _this, + const QString & _name = "surpos" ); + void loadSettings( const QDomElement & _this, + const QString & _name = "surpos" ); + + inline void prepareJournalEntryFromOldVal( void ) + { + m_posX.prepareJournalEntryFromOldVal(); + m_posY.prepareJournalEntryFromOldVal(); + } + + inline void addJournalEntryFromOldToCurVal( void ) + { + m_posX.addJournalEntryFromOldToCurVal(); + m_posY.addJournalEntryFromOldToCurVal(); + } + + automationPattern * automationPatternX( void ) + { + return( m_posX.getAutomationPattern() ); + } + + automationPattern * automationPatternY( void ) + { + return( m_posY.getAutomationPattern() ); + } + + +private: + intModel m_posX; + intModel m_posY; + +} ; + + + +class surroundArea : public QWidget, public modelView { Q_OBJECT public: - surroundArea( QWidget * _parent, const QString & _name, - track * _track ); + surroundArea( QWidget * _parent, const QString & _name ); virtual ~surroundArea(); - volumeVector getVolumeVector( float _v_scale ) const; - inline const QPoint & value( void ) const - { - return( m_sndSrcPos ); - } - void FASTCALL setValue( const QPoint & _p ); - void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _this, - const QString & _name = "surpos" ); - void FASTCALL loadSettings( const QDomElement & _this, - const QString & _name = "surpos" ); + + surroundAreaModel * model( void ) + { + return( castModel() ); + } + + const surroundAreaModel * model( void ) const + { + return( castModel() ); + } protected: @@ -69,23 +116,9 @@ protected: virtual void mouseReleaseEvent( QMouseEvent * _me ); -signals: - void valueChanged( const QPoint & _p ); - - private: - QPoint m_sndSrcPos; - static QPixmap * s_backgroundArtwork; - knob * m_position_x; - knob * m_position_y; - - -private slots: - void updatePositionX( void ); - void updatePositionY( void ); - } ; diff --git a/include/tempo_sync_knob.h b/include/tempo_sync_knob.h index dc3f2bc3c..af56eb5af 100644 --- a/include/tempo_sync_knob.h +++ b/include/tempo_sync_knob.h @@ -54,7 +54,7 @@ public: tempoSyncKnob( int _knob_num, QWidget * _parent, const QString & _name, - track * _track, float _scale = 1.0f ); + float _scale = 1.0f ); virtual ~tempoSyncKnob(); virtual void FASTCALL saveSettings( QDomDocument & _doc, @@ -95,7 +95,7 @@ protected: protected slots: void calculateTempoSyncTime( bpm_t _bpm ); - void updateCustom( int ); + void updateCustom( void ); void showCustom( void ); private: @@ -103,7 +103,7 @@ private: float m_scale; QPixmap m_tempoSyncIcon; QString m_tempoSyncDescription; - + tempoSyncMode m_tempoLastSyncMode; QPointer m_custom; diff --git a/include/volume_knob.h b/include/volume_knob.h index dc838e3f2..35204b38a 100644 --- a/include/volume_knob.h +++ b/include/volume_knob.h @@ -34,8 +34,7 @@ class volumeKnob : public knob { Q_OBJECT public: - volumeKnob( int _knob_num, QWidget * _parent, const QString & _name, - track * _track ); + volumeKnob( int _knob_num, QWidget * _parent, const QString & _name ); virtual ~volumeKnob(); diff --git a/src/audio/audio_alsa.cpp b/src/audio/audio_alsa.cpp index 0189e4199..4574ae090 100644 --- a/src/audio/audio_alsa.cpp +++ b/src/audio/audio_alsa.cpp @@ -465,12 +465,15 @@ audioALSA::setupWidget::setupWidget( QWidget * _parent ) : dev_lbl->setFont( pointSize<6>( dev_lbl->font() ) ); dev_lbl->setGeometry( 10, 40, 160, 10 ); - m_channels = new lcdSpinBox( DEFAULT_CHANNELS, SURROUND_CHANNELS, 1, - this, NULL, NULL ); - m_channels->setStep( 2 ); - m_channels->setLabel( tr( "CHANNELS" ) ); - m_channels->setValue( configManager::inst()->value( "audioalsa", + lcdSpinBoxModel * m = new lcdSpinBoxModel( /* this */ ); + m->setRange( DEFAULT_CHANNELS, SURROUND_CHANNELS ); + m->setStep( 2 ); + m->setValue( configManager::inst()->value( "audioalsa", "channels" ).toInt() ); + + m_channels = new lcdSpinBox( 1, this ); + m_channels->setModel( m ); + m_channels->setLabel( tr( "CHANNELS" ) ); m_channels->move( 180, 20 ); } diff --git a/src/audio/audio_jack.cpp b/src/audio/audio_jack.cpp index 7012ea845..5f0b1de4c 100644 --- a/src/audio/audio_jack.cpp +++ b/src/audio/audio_jack.cpp @@ -424,12 +424,15 @@ audioJACK::setupWidget::setupWidget( QWidget * _parent ) : cn_lbl->setFont( pointSize<6>( cn_lbl->font() ) ); cn_lbl->setGeometry( 10, 40, 160, 10 ); - m_channels = new lcdSpinBox( DEFAULT_CHANNELS, SURROUND_CHANNELS, 1, - this, NULL, NULL ); - m_channels->setStep( 2 ); - m_channels->setLabel( tr( "CHANNELS" ) ); - m_channels->setValue( configManager::inst()->value( "audiojack", + lcdSpinBoxModel * m = new lcdSpinBoxModel( /* this */ ); + m->setRange( DEFAULT_CHANNELS, SURROUND_CHANNELS ); + m->setStep( 2 ); + m->setValue( configManager::inst()->value( "audiojack", "channels" ).toInt() ); + + m_channels = new lcdSpinBox( 1, this ); + m_channels->setModel( m ); + m_channels->setLabel( tr( "CHANNELS" ) ); m_channels->move( 180, 20 ); } diff --git a/src/audio/audio_oss.cpp b/src/audio/audio_oss.cpp index 654926532..5ce44c706 100644 --- a/src/audio/audio_oss.cpp +++ b/src/audio/audio_oss.cpp @@ -325,12 +325,15 @@ audioOSS::setupWidget::setupWidget( QWidget * _parent ) : dev_lbl->setFont( pointSize<6>( dev_lbl->font() ) ); dev_lbl->setGeometry( 10, 40, 160, 10 ); - m_channels = new lcdSpinBox( DEFAULT_CHANNELS, SURROUND_CHANNELS, 1, - this, NULL, NULL ); - m_channels->setStep( 2 ); - m_channels->setLabel( tr( "CHANNELS" ) ); - m_channels->setValue( configManager::inst()->value( "audiooss", + lcdSpinBoxModel * m = new lcdSpinBoxModel( /* this */ ); + m->setRange( DEFAULT_CHANNELS, SURROUND_CHANNELS ); + m->setStep( 2 ); + m->setValue( configManager::inst()->value( "audiooss", "channels" ).toInt() ); + + m_channels = new lcdSpinBox( 1, this ); + m_channels->setModel( m ); + m_channels->setLabel( tr( "CHANNELS" ) ); m_channels->move( 180, 20 ); } diff --git a/src/core/about_dialog.cpp b/src/core/about_dialog.cpp index 5a069bbf9..684f4fe30 100644 --- a/src/core/about_dialog.cpp +++ b/src/core/about_dialog.cpp @@ -3,7 +3,7 @@ /* * about_dialog.cpp - implementation of about-dialog * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -60,7 +60,7 @@ aboutDialog::aboutDialog() : QLabel * about_lbl = new QLabel( tr( "LMMS - A powerful " "synthesizer-studio\n\n" - "Copyright (c) 2004-2007 " + "Copyright (c) 2004-2008 " "LMMS-Developers\n\n" "http://lmms.sourceforge.net" ) ); diff --git a/src/core/arp_and_chords_tab_widget.cpp b/src/core/arp_and_chords_tab_widget.cpp index 249a5f66d..b4a3fca04 100644 --- a/src/core/arp_and_chords_tab_widget.cpp +++ b/src/core/arp_and_chords_tab_widget.cpp @@ -180,30 +180,48 @@ const int ARP_GROUPBOX_HEIGHT = 240 - ARP_GROUPBOX_Y; arpAndChordsTabWidget::arpAndChordsTabWidget( instrumentTrack * _instrument_track ) : - QWidget( _instrument_track->tabWidgetParent() ) + QWidget( _instrument_track->tabWidgetParent() ), + m_chordsEnabledModel( new boolModel( /* this */ ) ), + m_chordsModel( new comboBoxModel( /* this */ ) ), + m_chordRangeModel( new floatModel( 1.0f, 1.0f, 9.0f, 1.0f + /* this */ ) ), + m_arpEnabledModel( new boolModel( /* this */ ) ), + m_arpModel( new comboBoxModel( /* this */ ) ), + m_arpRangeModel( new floatModel( 1.0f, 1.0f, 9.0f, 1.0f + /* this */ ) ), + m_arpTimeModel( new floatModel( 100.0f, 25.0f, 2000.0f, 1.0f + /* this */ ) ), + m_arpGateModel( new floatModel( 100.0f, 1.0f, 200.0f, 1.0f + /* this */ ) ), + m_arpDirectionModel( new intModel( /* this */ ) ), + m_arpModeModel( new comboBoxModel( /* this */ ) ) { - m_chordsGroupBox = new groupBox( tr( "CHORDS" ), this, - _instrument_track ); + m_chordsEnabledModel->setTrack( _instrument_track ); + m_chordsGroupBox = new groupBox( tr( "CHORDS" ), this ); m_chordsGroupBox->setGeometry( CHORDS_GROUPBOX_X, CHORDS_GROUPBOX_Y, CHORDS_GROUPBOX_WIDTH, CHORDS_GROUPBOX_HEIGHT ); + m_chordsGroupBox->setModel( m_chordsEnabledModel ); - m_chordsComboBox = new comboBox( m_chordsGroupBox, tr( "Chord type" ), - _instrument_track ); + + m_chordsModel->setTrack( _instrument_track ); + m_chordsComboBox = new comboBox( m_chordsGroupBox, tr( "Chord type" ) ); m_chordsComboBox->setGeometry( 10, 25, 140, 22 ); for( int i = 0; s_chords[i].interval[0] != -1; ++i ) { - m_chordsComboBox->addItem( tr( s_chords[i].name - .toAscii().constData() ) ); + m_chordsModel->addItem( tr( s_chords[i].name.toAscii(). + constData() ) ); } + m_chordsComboBox->setModel( m_chordsModel ); + + m_chordRangeModel->setTrack( _instrument_track ); + m_chordRangeModel->setInitValue( 1.0f ); m_chordRangeKnob = new knob( knobBright_26, m_chordsGroupBox, - tr( "Chord range" ), - _instrument_track ); + tr( "Chord range" ) ); + m_chordRangeKnob->setModel( m_chordRangeModel ); m_chordRangeKnob->setLabel( tr( "RANGE" ) ); - m_chordRangeKnob->setRange( 1.0f, 9.0f, 1.0f ); - m_chordRangeKnob->setInitValue( 1.0f ); m_chordRangeKnob->move( 164, 24 ); m_chordRangeKnob->setHintText( tr( "Chord range:" ) + " ", " " + tr( "octave(s)" ) ); @@ -214,9 +232,9 @@ arpAndChordsTabWidget::arpAndChordsTabWidget( - - m_arpGroupBox = new groupBox( tr( "ARPEGGIO" ), this, - _instrument_track ); + m_arpEnabledModel->setTrack( _instrument_track ); + m_arpGroupBox = new groupBox( tr( "ARPEGGIO" ), this ); + m_arpGroupBox->setModel( m_arpEnabledModel ); m_arpGroupBox->setGeometry( ARP_GROUPBOX_X, ARP_GROUPBOX_Y, ARP_GROUPBOX_WIDTH, ARP_GROUPBOX_HEIGHT ); @@ -230,23 +248,26 @@ arpAndChordsTabWidget::arpAndChordsTabWidget( "not played at the same time. Typical arpeggios are " "major or minor triads. But there're a lot of other " "possible chords, you can select." ) ); - m_arpComboBox = new comboBox( m_arpGroupBox, tr( "Arpeggio type" ), - _instrument_track ); + + + m_arpModel->setTrack( _instrument_track ); + m_arpComboBox = new comboBox( m_arpGroupBox, tr( "Arpeggio type" ) ); m_arpComboBox->setGeometry( 10, 25, 140, 22 ); for( int i = 0; s_chords[i].interval[0] != -1; ++i ) { - m_arpComboBox->addItem( tr( s_chords[i].name - .toAscii().constData() ) ); + m_arpModel->addItem( tr( s_chords[i].name.toAscii(). + constData() ) ); } + m_arpComboBox->setModel( m_arpModel ); + m_arpRangeModel->setTrack( _instrument_track ); + m_arpRangeModel->setInitValue( 1.0f ); m_arpRangeKnob = new knob( knobBright_26, m_arpGroupBox, - tr( "Arpeggio range" ), - _instrument_track ); + tr( "Arpeggio range" ) ); + m_arpRangeKnob->setModel( m_arpRangeModel ); m_arpRangeKnob->setLabel( tr( "RANGE" ) ); - m_arpRangeKnob->setRange( 1.0f, 9.0f, 1.0f ); - m_arpRangeKnob->setInitValue( 1.0f ); m_arpRangeKnob->move( 164, 24 ); m_arpRangeKnob->setHintText( tr( "Arpeggio range:" ) + " ", " " + tr( "octave(s)" ) ); @@ -255,12 +276,13 @@ arpAndChordsTabWidget::arpAndChordsTabWidget( "The selected arpeggio will be played within specified " "amount of octaves." ) ); + + m_arpTimeModel->setTrack( _instrument_track ); + m_arpTimeModel->setInitValue( 100.0f ); m_arpTimeKnob = new tempoSyncKnob( knobBright_26, m_arpGroupBox, - tr( "Arpeggio time" ), - _instrument_track ); + tr( "Arpeggio time" ) ); + m_arpTimeKnob->setModel( m_arpTimeModel ); m_arpTimeKnob->setLabel( tr( "TIME" ) ); - m_arpTimeKnob->setRange( 25.0f, 2000.0f, 1.0f ); - m_arpTimeKnob->setInitValue( 100.0f ); m_arpTimeKnob->move( 164, 70 ); m_arpTimeKnob->setHintText( tr( "Arpeggio time:" ) + " ", " " + tr( "ms" ) ); @@ -269,12 +291,13 @@ arpAndChordsTabWidget::arpAndChordsTabWidget( "milliseconds. The arpeggio time specifies how long " "each arpeggio-tone should be played." ) ); + + m_arpGateModel->setTrack( _instrument_track ); + m_arpGateModel->setInitValue( 100.0f ); m_arpGateKnob = new knob( knobBright_26, m_arpGroupBox, - tr( "Arpeggio gate" ), - _instrument_track ); + tr( "Arpeggio gate" ) ); + m_arpGateKnob->setModel( m_arpGateModel ); m_arpGateKnob->setLabel( tr( "GATE" ) ); - m_arpGateKnob->setRange( 1.0f, 200.0f, 1.0f ); - m_arpGateKnob->setInitValue( 100.0f ); m_arpGateKnob->move( 204, 70 ); m_arpGateKnob->setHintText( tr( "Arpeggio gate:" ) + " ", tr( "%" ) ); m_arpGateKnob->setWhatsThis( @@ -289,16 +312,14 @@ arpAndChordsTabWidget::arpAndChordsTabWidget( - pixmapButton * arp_up_btn = new pixmapButton( m_arpGroupBox, NULL, - NULL ); + pixmapButton * arp_up_btn = new pixmapButton( m_arpGroupBox, NULL ); arp_up_btn->move( 10, 74 ); arp_up_btn->setActiveGraphic( embed::getIconPixmap( "arp_up_on" ) ); arp_up_btn->setInactiveGraphic( embed::getIconPixmap( "arp_up_off" ) ); toolTip::add( arp_up_btn, tr( "arpeggio direction = up" ) ); - pixmapButton * arp_down_btn = new pixmapButton( m_arpGroupBox, NULL, - NULL ); + pixmapButton * arp_down_btn = new pixmapButton( m_arpGroupBox, NULL ); arp_down_btn->move( 30, 74 ); arp_down_btn->setActiveGraphic( embed::getIconPixmap( "arp_down_on" ) ); arp_down_btn->setInactiveGraphic( embed::getIconPixmap( @@ -307,7 +328,7 @@ arpAndChordsTabWidget::arpAndChordsTabWidget( pixmapButton * arp_up_and_down_btn = new pixmapButton( m_arpGroupBox, - NULL, NULL ); + NULL ); arp_up_and_down_btn->move( 50, 74 ); arp_up_and_down_btn->setActiveGraphic( embed::getIconPixmap( "arp_up_and_down_on" ) ); @@ -317,8 +338,7 @@ arpAndChordsTabWidget::arpAndChordsTabWidget( tr( "arpeggio direction = up and down" ) ); - pixmapButton * arp_random_btn = new pixmapButton( m_arpGroupBox, NULL, - NULL ); + pixmapButton * arp_random_btn = new pixmapButton( m_arpGroupBox, NULL ); arp_random_btn->move( 70, 74 ); arp_random_btn->setActiveGraphic( embed::getIconPixmap( "arp_random_on" ) ); @@ -327,31 +347,33 @@ arpAndChordsTabWidget::arpAndChordsTabWidget( toolTip::add( arp_random_btn, tr( "arpeggio direction = random" ) ); m_arpDirectionBtnGrp = new automatableButtonGroup( this, - tr( "Arpeggio direction" ), - _instrument_track ); + tr( "Arpeggio direction" ) ); + m_arpDirectionBtnGrp->setModel( m_arpDirectionModel ); m_arpDirectionBtnGrp->addButton( arp_up_btn ); m_arpDirectionBtnGrp->addButton( arp_down_btn ); m_arpDirectionBtnGrp->addButton( arp_up_and_down_btn ); m_arpDirectionBtnGrp->addButton( arp_random_btn ); - m_arpDirectionBtnGrp->setInitValue( UP ); + m_arpDirectionModel->setTrack( _instrument_track ); + m_arpDirectionModel->setInitValue( UP ); QLabel * mode_lbl = new QLabel( tr( "Mode:" ), m_arpGroupBox ); mode_lbl->setGeometry( 10, 104, 64, 10 ); mode_lbl->setFont( pointSize<7>( mode_lbl->font() ) ); - m_arpModeComboBox = new comboBox( m_arpGroupBox, tr( "Arpeggio mode" ), - _instrument_track ); + m_arpModeComboBox = new comboBox( m_arpGroupBox, + tr( "Arpeggio mode" ) ); m_arpModeComboBox->setGeometry( 10, 118, 128, 22 ); - m_arpModeComboBox->addItem( tr( "Free" ), - embed::getIconPixmap( "arp_free" ) ); - m_arpModeComboBox->addItem( tr( "Sort" ), - embed::getIconPixmap( "arp_sort" ) ); - m_arpModeComboBox->addItem( tr( "Sync" ), - embed::getIconPixmap( "arp_sync" ) ); - //m_arpModeComboBox->setValue( 0 ); + m_arpModeModel->setTrack( _instrument_track ); + m_arpModeModel->addItem( tr( "Free" ), new QPixmap( + embed::getIconPixmap( "arp_free" ) ) ); + m_arpModeModel->addItem( tr( "Sort" ), new QPixmap( + embed::getIconPixmap( "arp_sort" ) ) ); + m_arpModeModel->addItem( tr( "Sync" ), new QPixmap( + embed::getIconPixmap( "arp_sync" ) ) ); + m_arpModeComboBox->setModel( m_arpModeModel ); } @@ -372,10 +394,10 @@ void arpAndChordsTabWidget::processNote( notePlayHandle * _n ) // at the same time we only add sub-notes if nothing of the note was // played yet, because otherwise we would add chord-subnotes every // time an audio-buffer is rendered... - if( ( ( _n->baseNote() && m_arpGroupBox->isActive() == FALSE ) || + if( ( ( _n->baseNote() && m_arpEnabledModel->value() == FALSE ) || _n->arpNote() ) && - _n->totalFramesPlayed() == 0 && - m_chordsGroupBox->isActive() == TRUE ) + _n->totalFramesPlayed() == 0 && + m_chordsEnabledModel->value() == TRUE ) { // then insert sub-notes for chord const int selected_chord = m_chordsComboBox->value(); @@ -426,7 +448,7 @@ void arpAndChordsTabWidget::processNote( notePlayHandle * _n ) // now follows code for arpeggio if( _n->baseNote() == FALSE || - !m_arpGroupBox->isActive() || + !m_arpEnabledModel->value() || ( _n->released() && _n->releaseFramesDone() >= _n->actualReleaseFramesToDo() ) ) { @@ -593,18 +615,18 @@ void arpAndChordsTabWidget::processNote( notePlayHandle * _n ) void arpAndChordsTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) { - m_chordsGroupBox->saveSettings( _doc, _this, "chord-enabled" ); - m_chordsComboBox->saveSettings( _doc, _this, "chord" ); - m_chordRangeKnob->saveSettings( _doc, _this, "chordrange" ); + m_chordsEnabledModel->saveSettings( _doc, _this, "chord-enabled" ); + m_chordsModel->saveSettings( _doc, _this, "chord" ); + m_chordRangeModel->saveSettings( _doc, _this, "chordrange" ); - m_arpGroupBox->saveSettings( _doc, _this, "arp-enabled" ); - m_arpComboBox->saveSettings( _doc, _this, "arp" ); - m_arpRangeKnob->saveSettings( _doc, _this, "arprange" ); - m_arpTimeKnob->saveSettings( _doc, _this, "arptime" ); - m_arpGateKnob->saveSettings( _doc, _this, "arpgate" ); - m_arpDirectionBtnGrp->saveSettings( _doc, _this, "arpdir" ); + m_arpEnabledModel->saveSettings( _doc, _this, "arp-enabled" ); + m_arpModel->saveSettings( _doc, _this, "arp" ); + m_arpRangeModel->saveSettings( _doc, _this, "arprange" ); + m_arpTimeModel->saveSettings( _doc, _this, "arptime" ); + m_arpGateModel->saveSettings( _doc, _this, "arpgate" ); + m_arpDirectionModel->saveSettings( _doc, _this, "arpdir" ); - m_arpModeComboBox->saveSettings( _doc, _this, "arpmode" ); + m_arpModeModel->saveSettings( _doc, _this, "arpmode" ); } @@ -612,16 +634,16 @@ void arpAndChordsTabWidget::saveSettings( QDomDocument & _doc, void arpAndChordsTabWidget::loadSettings( const QDomElement & _this ) { - m_chordsGroupBox->loadSettings( _this, "chord-enabled" ); - m_chordsComboBox->loadSettings( _this, "chord" ); - m_chordRangeKnob->loadSettings( _this, "chordrange" ); + m_chordsEnabledModel->loadSettings( _this, "chord-enabled" ); + m_chordsModel->loadSettings( _this, "chord" ); + m_chordRangeModel->loadSettings( _this, "chordrange" ); - m_arpGroupBox->loadSettings( _this, "arp-enabled" ); - m_arpComboBox->loadSettings( _this, "arp" ); - m_arpRangeKnob->loadSettings( _this, "arprange" ); - m_arpTimeKnob->loadSettings( _this, "arptime" ); - m_arpGateKnob->loadSettings( _this, "arpgate" ); - m_arpDirectionBtnGrp->loadSettings( _this, "arpdir" ); + m_arpEnabledModel->loadSettings( _this, "arp-enabled" ); + m_arpModel->loadSettings( _this, "arp" ); + m_arpRangeModel->loadSettings( _this, "arprange" ); + m_arpTimeModel->loadSettings( _this, "arptime" ); + m_arpGateModel->loadSettings( _this, "arpgate" ); + m_arpDirectionModel->loadSettings( _this, "arpdir" ); // Keep compatibility with version 0.2.1 file format if( _this.hasAttribute( "arpsyncmode" ) ) @@ -631,7 +653,7 @@ void arpAndChordsTabWidget::loadSettings( const QDomElement & _this ) "arpsyncmode" ).toInt() ); } - m_arpModeComboBox->loadSettings( _this, "arpmode" ); + m_arpModeModel->loadSettings( _this, "arpmode" ); } diff --git a/src/core/automation_editor.cpp b/src/core/automation_editor.cpp index c4763753e..719c6ad85 100644 --- a/src/core/automation_editor.cpp +++ b/src/core/automation_editor.cpp @@ -261,13 +261,18 @@ automationEditor::automationEditor( void ) : QLabel * zoom_x_lbl = new QLabel( m_toolBar ); zoom_x_lbl->setPixmap( embed::getIconPixmap( "zoom_x" ) ); - m_zoomingXComboBox = new comboBox( m_toolBar, NULL, NULL ); + m_zoomingXComboBox = new comboBox( m_toolBar ); m_zoomingXComboBox->setFixedSize( 80, 22 ); + + comboBoxModel * zoom_x_model = new comboBoxModel( /* this */ ); for( int i = 0; i < 6; ++i ) { - m_zoomingXComboBox->addItem( QString::number( 25 << i ) + "%" ); + zoom_x_model->addItem( QString::number( 25 << i ) + "%" ); } - m_zoomingXComboBox->setValue( m_zoomingXComboBox->findText( "100%" ) ); + zoom_x_model->setValue( zoom_x_model->findText( "100%" ) ); + + m_zoomingXComboBox->setModel( zoom_x_model ); + connect( m_zoomingXComboBox, SIGNAL( activated( const QString & ) ), this, SLOT( zoomingXChanged( const QString & ) ) ); @@ -275,14 +280,19 @@ automationEditor::automationEditor( void ) : QLabel * zoom_y_lbl = new QLabel( m_toolBar ); zoom_y_lbl->setPixmap( embed::getIconPixmap( "zoom_y" ) ); - m_zoomingYComboBox = new comboBox( m_toolBar, NULL, NULL ); + m_zoomingYComboBox = new comboBox( m_toolBar ); m_zoomingYComboBox->setFixedSize( 80, 22 ); - m_zoomingYComboBox->addItem( "Auto" ); + + comboBoxModel * zoom_y_model = new comboBoxModel( /* this */ ); + zoom_y_model->addItem( "Auto" ); for( int i = 0; i < 6; ++i ) { - m_zoomingYComboBox->addItem( QString::number( 25 << i ) + "%" ); + zoom_y_model->addItem( QString::number( 25 << i ) + "%" ); } - m_zoomingYComboBox->setValue( m_zoomingYComboBox->findText( "Auto" ) ); + zoom_y_model->setValue( zoom_y_model->findText( "Auto" ) ); + + m_zoomingYComboBox->setModel( zoom_y_model ); + connect( m_zoomingYComboBox, SIGNAL( activated( const QString & ) ), this, SLOT( zoomingYChanged( const QString & ) ) ); @@ -291,14 +301,18 @@ automationEditor::automationEditor( void ) : QLabel * quantize_lbl = new QLabel( m_toolBar ); quantize_lbl->setPixmap( embed::getIconPixmap( "quantize" ) ); - m_quantizeComboBox = new comboBox( m_toolBar, NULL, NULL ); + m_quantizeComboBox = new comboBox( m_toolBar ); m_quantizeComboBox->setFixedSize( 60, 22 ); + + comboBoxModel * quantize_model = new comboBoxModel( /* this */ ); for( int i = 0; i < 7; ++i ) { - m_quantizeComboBox->addItem( "1/" + QString::number( 1 << i ) ); + quantize_model->addItem( "1/" + QString::number( 1 << i ) ); } - m_quantizeComboBox->setValue( m_quantizeComboBox->findText( - "1/16" ) ); + quantize_model->setValue( quantize_model->findText( "1/16" ) ); + + m_quantizeComboBox->setModel( quantize_model ); + tb_layout->addSpacing( 5 ); tb_layout->addWidget( m_playButton ); @@ -1548,8 +1562,8 @@ void automationEditor::wheelEvent( QWheelEvent * _we ) m_ppt /= 2; } // update combobox with zooming-factor - m_zoomingXComboBox->setValue( - m_zoomingXComboBox->findText( QString::number( + m_zoomingXComboBox->model()->setValue( + m_zoomingXComboBox->model()->findText( QString::number( static_cast( m_ppt * 100 / DEFAULT_PPT ) ) +"%" ) ); // update timeline @@ -2015,8 +2029,8 @@ void automationEditor::zoomingYChanged( const QString & _zfac ) int automationEditor::quantization( void ) const { - return( 64 / m_quantizeComboBox->currentText().right( - m_quantizeComboBox->currentText().length() - + return( 64 / m_quantizeComboBox->model()->currentText().right( + m_quantizeComboBox->model()->currentText().length() - 2 ).toInt() ); } diff --git a/src/core/automation_pattern.cpp b/src/core/automation_pattern.cpp index 2b54997ba..3ec6033e5 100644 --- a/src/core/automation_pattern.cpp +++ b/src/core/automation_pattern.cpp @@ -261,8 +261,8 @@ const QString automationPattern::name( void ) { if( m_track ) { - QString widget_name = dynamic_cast( m_object ) - ->accessibleName(); + QString widget_name = m_object->displayName(); +/* dynamic_cast( m_object )->accessibleName();*/ return( m_track->name() + " - " + widget_name ); } else diff --git a/src/core/bb_editor.cpp b/src/core/bb_editor.cpp index 7958d9f77..9db7425f3 100644 --- a/src/core/bb_editor.cpp +++ b/src/core/bb_editor.cpp @@ -50,7 +50,7 @@ bbEditor::bbEditor( void ) : - m_currentBB( -1 ) + trackContainer() { // create toolbar m_toolBar = new QWidget; @@ -100,10 +100,13 @@ bbEditor::bbEditor( void ) : QLabel * l = new QLabel( m_toolBar ); l->setPixmap( embed::getIconPixmap( "drum" ) ); - m_bbComboBox = new comboBox( m_toolBar, NULL, NULL ); + m_bbComboBox = new comboBox( m_toolBar ); m_bbComboBox->setFixedSize( 200, 22 ); - connect( m_bbComboBox, SIGNAL( valueChanged( int ) ), - this, SLOT( setCurrentBB( int ) ) ); + + m_bbComboBoxModel = new comboBoxModel( /* this */ ); + m_bbComboBox->setModel( m_bbComboBoxModel ); + connect( m_bbComboBoxModel, SIGNAL( dataChanged() ), + this, SLOT( currentBBChanged() ) ); tb_layout->addSpacing( 5 ); tb_layout->addWidget( m_playButton ); @@ -149,17 +152,10 @@ bbEditor::~bbEditor() -void bbEditor::setCurrentBB( int _bb ) +void bbEditor::currentBBChanged( void ) { - m_currentBB = _bb; - - if( m_bbComboBox->value() != _bb ) - { - m_bbComboBox->setValue( _bb ); - } - // first make sure, all channels have a TCO at current BB - createTCOsForBB( _bb ); + createTCOsForBB( currentBB() ); realignTracks(); @@ -240,9 +236,9 @@ void bbEditor::removeBB( int _bb ) tl[i]->removeTCO( _bb ); tl[i]->getTrackContentWidget()->removeTact( _bb * 64 ); } - if( _bb <= m_currentBB ) + if( _bb <= currentBB() ) { - setCurrentBB( tMax( m_currentBB - 1, 0 ) ); + setCurrentBB( tMax( currentBB() - 1, 0 ) ); } } @@ -262,21 +258,17 @@ void bbEditor::updateBBTrack( trackContentObject * _tco ) void bbEditor::updateComboBox( void ) { - disconnect( m_bbComboBox, SIGNAL( valueChanged( int ) ), - this, SLOT( setCurrentBB( int ) ) ); + const int cur_bb = currentBB(); - m_bbComboBox->clear(); + m_bbComboBoxModel->clear(); for( int i = 0; i < numOfBBs(); ++i ) { bbTrack * bbt = bbTrack::findBBTrack( i ); - m_bbComboBox->addItem( bbt->trackLabel()->text(), - bbt->trackLabel()->pixmap() ); + m_bbComboBoxModel->addItem( bbt->trackLabel()->text(), + new QPixmap( bbt->trackLabel()->pixmap() ) ); } - m_bbComboBox->setValue( m_currentBB ); - - connect( m_bbComboBox, SIGNAL( valueChanged( int ) ), - this, SLOT( setCurrentBB( int ) ) ); + setCurrentBB( cur_bb ); } @@ -297,16 +289,16 @@ void bbEditor::keyPressEvent( QKeyEvent * _ke ) } else if ( _ke->key() == Qt::Key_Plus ) { - if( m_currentBB + 1 < numOfBBs() ) + if( currentBB()+ 1 < numOfBBs() ) { - setCurrentBB( m_currentBB + 1 ); + setCurrentBB( currentBB() + 1 ); } } else if ( _ke->key() == Qt::Key_Minus ) { - if( m_currentBB > 0 ) + if( currentBB() > 0 ) { - setCurrentBB( m_currentBB - 1 ); + setCurrentBB( currentBB() - 1 ); } } else diff --git a/src/core/effect.cpp b/src/core/effect.cpp index 1a091b204..16a150137 100644 --- a/src/core/effect.cpp +++ b/src/core/effect.cpp @@ -39,11 +39,11 @@ effect::effect( const plugin::descriptor * _desc, m_okay( TRUE ), m_noRun( FALSE ), m_running( FALSE ), - m_bypass( FALSE ), + m_enabledModel( FALSE, FALSE, TRUE ), m_bufferCount( 0 ), m_silenceTimeout( 10 ), - m_wetDry( 1.0f ), - m_gate( 0.0f ) + m_wetDryModel( 1.0f, 0.0f, 1.0f, 0.01f ), + m_gateModel( 0.0f, 0.0f, 1.0f, 0.01f ) { } @@ -65,13 +65,13 @@ bool FASTCALL effect::processAudioBuffer( surroundSampleFrame * _buf, - +/* void FASTCALL effect::setGate( float _level ) { m_gate = _level * _level * m_processors * engine::getMixer()->framesPerPeriod(); } - +*/ effect * effect::instantiate( const QString & _plugin_name, descriptor::subPluginFeatures::key * _key ) diff --git a/src/core/effect_tab_widget.cpp b/src/core/effect_tab_widget.cpp index 776a8911d..32bd7bc85 100644 --- a/src/core/effect_tab_widget.cpp +++ b/src/core/effect_tab_widget.cpp @@ -42,6 +42,7 @@ #include "rack_view.h" #include "sample_track.h" #include "tooltip.h" +#include "automatable_model_templates.h" @@ -79,8 +80,8 @@ effectTabWidget::~effectTabWidget() void effectTabWidget::setupWidget( void ) { - m_effectsGroupBox = new groupBox( tr( "EFFECTS CHAIN" ), this, - m_track ); + m_effectsGroupBox = new groupBox( tr( "EFFECTS CHAIN" ), this ); + m_effectsGroupBox->model()->setTrack( m_track ); connect( m_effectsGroupBox, SIGNAL( toggled( bool ) ), this, SLOT( setBypass( bool ) ) ); m_effectsGroupBox->setGeometry( 2, 2, 242, 244 ); @@ -100,7 +101,8 @@ void effectTabWidget::setupWidget( void ) void effectTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) { - _this.setAttribute( "fxdisabled", !m_effectsGroupBox->isActive() ); + _this.setAttribute( "fxdisabled", + !m_effectsGroupBox->model()->value() ); m_rack->saveState( _doc, _this ); } @@ -110,7 +112,7 @@ void effectTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) void effectTabWidget::loadSettings( const QDomElement & _this ) { - m_effectsGroupBox->setState( + m_effectsGroupBox->model()->setValue( !_this.attribute( "fxdisabled" ).toInt() ); QDomNode node = _this.firstChild(); diff --git a/src/core/envelope_and_lfo_widget.cpp b/src/core/envelope_and_lfo_widget.cpp index c76972115..c088aa3d6 100644 --- a/src/core/envelope_and_lfo_widget.cpp +++ b/src/core/envelope_and_lfo_widget.cpp @@ -48,6 +48,7 @@ #include "tempo_sync_knob.h" #include "text_float.h" #include "tooltip.h" +#include "automatable_model_templates.h" @@ -97,13 +98,26 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount, track * _track ) : QWidget( _parent ), m_used( FALSE ), + m_predelayModel(), + m_attackModel(), + m_holdModel(), + m_decayModel(), + m_sustainModel(), + m_releaseModel(), + m_amountModel(), + m_lfoPredelayModel(), + m_lfoAttackModel(), + m_lfoSpeedModel(), + m_lfoAmountModel(), + m_lfoWaveModel(), + m_x100Model( FALSE, FALSE, TRUE ), + m_controlEnvAmountModel( FALSE, FALSE, TRUE ), m_valueForZeroAmount( _value_for_zero_amount ), m_pahdEnv( NULL ), m_rEnv( NULL ), m_lfoFrame( 0 ), m_lfoAmountIsZero( FALSE ), - m_lfoShapeData( NULL ), - m_lfoShape( SIN ) + m_lfoShapeData( NULL ) { if( s_envGraph == NULL ) { @@ -117,26 +131,28 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount, s_EaLWidgets.push_back( this ); - - m_predelayKnob = new knob( knobBright_26, this, tr( "Predelay-time" ), - _track ); + m_predelayModel.setTrack( _track ); + m_predelayModel.setRange( 0.0, 1.0, 0.001 ); + m_predelayModel.setInitValue( 0.0 ); + m_predelayKnob = new knob( knobBright_26, this, tr( "Predelay-time" ) ); + m_predelayKnob->setModel( &m_predelayModel ); m_predelayKnob->setLabel( tr( "DEL" ) ); - m_predelayKnob->setRange( 0.0, 1.0, 0.001 ); - m_predelayKnob->setInitValue( 0.0 ); m_predelayKnob->move( PREDELAY_KNOB_X, ENV_KNOBS_Y ); m_predelayKnob->setHintText( tr( "Predelay:" ) + " ", "" ); m_predelayKnob->setWhatsThis( tr( "Use this knob for setting predelay of the current " "envelope. The bigger this value the longer the time " "before start of actual envelope." ) ); - connect( m_predelayKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( updateAfterKnobChange( float ) ) ); + connect( &m_predelayModel, SIGNAL( dataChanged() ), + this, SLOT( updateSampleVars() ) ); - m_attackKnob = new knob( knobBright_26, this, tr( "Attack-time" ), - _track ); + + m_attackModel.setTrack( _track ); + m_attackModel.setRange( 0.0, 1.0, 0.001 ); + m_attackModel.setInitValue( 0.0 ); + m_attackKnob = new knob( knobBright_26, this, tr( "Attack-time" ) ); + m_attackKnob->setModel( &m_attackModel ); m_attackKnob->setLabel( tr( "ATT" ) ); - m_attackKnob->setRange( 0.0, 1.0, 0.001 ); - m_attackKnob->setInitValue( 0.0 ); m_attackKnob->move( ATTACK_KNOB_X, ENV_KNOBS_Y ); m_attackKnob->setHintText( tr( "Attack:" )+" ", "" ); m_attackKnob->setWhatsThis( @@ -145,13 +161,15 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount, "envelope needs to increase to attack-level. " "Choose a small value for instruments like pianos " "and a big value for strings." ) ); - connect( m_attackKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( updateAfterKnobChange( float ) ) ); + connect( &m_attackModel, SIGNAL( dataChanged() ), + this, SLOT( updateSampleVars() ) ); - m_holdKnob = new knob( knobBright_26, this, tr( "Hold-time" ), _track ); + m_holdModel.setTrack( _track ); + m_holdModel.setRange( 0.0, 1.0, 0.001 ); + m_holdModel.setInitValue( 0.5 ); + m_holdKnob = new knob( knobBright_26, this, tr( "Hold-time" ) ); + m_holdKnob->setModel( &m_holdModel ); m_holdKnob->setLabel( tr( "HOLD" ) ); - m_holdKnob->setRange( 0.0, 1.0, 0.001 ); - m_holdKnob->setInitValue( 0.5 ); m_holdKnob->move( HOLD_KNOB_X, ENV_KNOBS_Y ); m_holdKnob->setHintText( tr( "Hold:" ) + " ", "" ); m_holdKnob->setWhatsThis( @@ -159,14 +177,16 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount, "envelope. The bigger this value the longer the " "envelope holds attack-level before it begins to " "decrease to sustain-level." ) ); - connect( m_holdKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( updateAfterKnobChange( float ) ) ); + connect( &m_holdModel, SIGNAL( dataChanged() ), + this, SLOT( updateSampleVars() ) ); - m_decayKnob = new knob( knobBright_26, this, tr( "Decay-time" ), - _track ); + + m_decayModel.setTrack( _track ); + m_decayModel.setRange( 0.0, 1.0, 0.001 ); + m_decayModel.setInitValue( 0.5 ); + m_decayKnob = new knob( knobBright_26, this, tr( "Decay-time" ) ); + m_decayKnob->setModel( &m_decayModel ); m_decayKnob->setLabel( tr( "DEC" ) ); - m_decayKnob->setRange( 0.0, 1.0, 0.001 ); - m_decayKnob->setInitValue( 0.5 ); m_decayKnob->move( DECAY_KNOB_X, ENV_KNOBS_Y ); m_decayKnob->setHintText( tr( "Decay:" ) + " ", "" ); m_decayKnob->setWhatsThis( @@ -175,14 +195,16 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount, "envelope needs to decrease from attack-level to " "sustain-level. Choose a small value for instruments " "like pianos." ) ); - connect( m_decayKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( updateAfterKnobChange( float ) ) ); + connect( &m_decayModel, SIGNAL( dataChanged() ), + this, SLOT( updateSampleVars() ) ); - m_sustainKnob = new knob( knobBright_26, this, tr( "Sustain-level" ), - _track ); + + m_sustainModel.setTrack( _track ); + m_sustainModel.setRange( 0.0, 1.0, 0.001 ); + m_sustainModel.setInitValue( 0.5 ); + m_sustainKnob = new knob( knobBright_26, this, tr( "Sustain-level" ) ); + m_sustainKnob->setModel( &m_sustainModel ); m_sustainKnob->setLabel( tr( "SUST" ) ); - m_sustainKnob->setRange( 0.0, 1.0, 0.001 ); - m_sustainKnob->setInitValue( 0.5 ); m_sustainKnob->move( SUSTAIN_KNOB_X, ENV_KNOBS_Y ); m_sustainKnob->setHintText( tr( "Sustain:" ) + " ", "" ); m_sustainKnob->setWhatsThis( @@ -190,14 +212,17 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount, "envelope. The bigger this value the higher the level " "on which the envelope stays before going down to " "zero." ) ); - connect( m_sustainKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( updateAfterKnobChange( float ) ) ); + connect( &m_sustainModel, SIGNAL( dataChanged() ), + this, SLOT( updateSampleVars() ) ); - m_releaseKnob = new knob( knobBright_26, this, tr( "Release-time" ), - _track ); + + + m_releaseModel.setTrack( _track ); + m_releaseModel.setRange( 0.0, 1.0, 0.001 ); + m_releaseModel.setInitValue( 0.1 ); + m_releaseKnob = new knob( knobBright_26, this, tr( "Release-time" ) ); + m_releaseKnob->setModel( &m_releaseModel ); m_releaseKnob->setLabel( tr( "REL" ) ); - m_releaseKnob->setRange( 0.0, 1.0, 0.001 ); - m_releaseKnob->setInitValue( 0.1 ); m_releaseKnob->move( RELEASE_KNOB_X, ENV_KNOBS_Y ); m_releaseKnob->setHintText( tr( "Release:" ) + " ", "" ); m_releaseKnob->setWhatsThis( @@ -206,15 +231,17 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount, "envelope needs to decrease from sustain-level to " "zero. Choose a big value for soft instruments like " "strings." ) ); - connect( m_releaseKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( updateAfterKnobChange( float ) ) ); + connect( &m_releaseModel, SIGNAL( dataChanged() ), + this, SLOT( updateSampleVars() ) ); + + m_amountModel.setTrack( _track ); + m_amountModel.setRange( -1.0, 1.0, 0.005 ); + m_amountModel.setInitValue( 0.0 ); m_amountKnob = new knob( knobBright_26, this, - tr( "Modulation amount" ), - _track ); + tr( "Modulation amount" ) ); + m_amountKnob->setModel( &m_amountModel ); m_amountKnob->setLabel( tr( "AMT" ) ); - m_amountKnob->setRange( -1.0, 1.0, 0.005 ); - m_amountKnob->setInitValue( 0.0 ); m_amountKnob->move( AMOUNT_KNOB_X, ENV_GRAPH_Y ); m_amountKnob->setHintText( tr( "Modulation amount:" ) + " ", "" ); m_amountKnob->setWhatsThis( @@ -222,62 +249,70 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount, "current envelope. The bigger this value the more the " "according size (e.g. volume or cutoff-frequency) " "will be influenced by this envelope." ) ); - connect( m_amountKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( updateAfterKnobChange( float ) ) ); + connect( &m_amountModel, SIGNAL( dataChanged() ), + this, SLOT( updateSampleVars() ) ); + + m_lfoPredelayModel.setTrack( _track ); + m_lfoPredelayModel.setRange( 0.0, 1.0, 0.001 ); + m_lfoPredelayModel.setInitValue( 0.0 ); m_lfoPredelayKnob = new knob( knobBright_26, this, - tr( "LFO-predelay-time" ), - _track ); + tr( "LFO-predelay-time" ) ); + m_lfoPredelayKnob->setModel( &m_lfoPredelayModel ); m_lfoPredelayKnob->setLabel( tr( "DEL" ) ); - m_lfoPredelayKnob->setRange( 0.0, 1.0, 0.001 ); - m_lfoPredelayKnob->setInitValue( 0.0 ); m_lfoPredelayKnob->move( LFO_PREDELAY_KNOB_X, LFO_KNOB_Y ); m_lfoPredelayKnob->setHintText( tr( "LFO-predelay:" ) + " ", "" ); m_lfoPredelayKnob->setWhatsThis( tr( "Use this knob for setting predelay-time of the current " "LFO. The bigger this value the the time until the " "LFO starts to oscillate." ) ); - connect( m_lfoPredelayKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( updateAfterKnobChange( float ) ) ); + connect( &m_lfoPredelayModel, SIGNAL( dataChanged() ), + this, SLOT( updateSampleVars() ) ); + + m_lfoAttackModel.setTrack( _track ); + m_lfoAttackModel.setRange( 0.0, 1.0, 0.001 ); + m_lfoAttackModel.setInitValue( 0.0 ); m_lfoAttackKnob = new knob( knobBright_26, this, - tr( "LFO-attack-time" ), - _track ); + tr( "LFO-attack-time" ) ); + m_lfoAttackKnob->setModel( &m_lfoAttackModel ); m_lfoAttackKnob->setLabel( tr( "ATT" ) ); - m_lfoAttackKnob->setRange( 0.0, 1.0, 0.001 ); - m_lfoAttackKnob->setInitValue( 0.0 ); m_lfoAttackKnob->move( LFO_ATTACK_KNOB_X, LFO_KNOB_Y ); m_lfoAttackKnob->setHintText( tr( "LFO-attack:" ) + " ", "" ); m_lfoAttackKnob->setWhatsThis( tr( "Use this knob for setting attack-time of the current LFO. " "The bigger this value the longer the LFO needs to " "increase its amplitude to maximum." ) ); - connect( m_lfoAttackKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( updateAfterKnobChange( float ) ) ); + connect( &m_lfoAttackModel, SIGNAL( dataChanged() ), + this, SLOT( updateSampleVars() ) ); + + m_lfoSpeedModel.setTrack( _track ); + m_lfoSpeedModel.setRange( 0.01, 1.0, 0.0001 ); + m_lfoSpeedModel.setInitValue( 0.1 ); m_lfoSpeedKnob = new tempoSyncKnob( knobBright_26, this, - tr( "LFO-speed" ), - _track, 20000.0 ); + tr( "LFO-speed" ), 20000.0 ); + m_lfoSpeedKnob->setModel( &m_lfoSpeedModel ); m_lfoSpeedKnob->setLabel( tr( "SPD" ) ); - m_lfoSpeedKnob->setRange( 0.01, 1.0, 0.0001 ); - m_lfoSpeedKnob->setInitValue( 0.1 ); m_lfoSpeedKnob->move( LFO_SPEED_KNOB_X, LFO_KNOB_Y ); m_lfoSpeedKnob->setHintText( tr( "LFO-speed:" ) + " ", "" ); m_lfoSpeedKnob->setWhatsThis( tr( "Use this knob for setting speed of the current LFO. The " "bigger this value the faster the LFO oscillates and " "the faster will be your effect." ) ); - connect( m_lfoSpeedKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( updateAfterKnobChange( float ) ) ); + connect( &m_lfoSpeedModel, SIGNAL( dataChanged() ), + this, SLOT( updateSampleVars() ) ); + + m_lfoAmountModel.setTrack( _track ); + m_lfoAmountModel.setRange( -1.0, 1.0, 0.005 ); + m_lfoAmountModel.setInitValue( 0.0 ); m_lfoAmountKnob = new knob( knobBright_26, this, - tr( "LFO-modulation-amount" ), - _track ); + tr( "LFO-modulation-amount" ) ); + m_lfoAmountKnob->setModel( &m_lfoAmountModel ); m_lfoAmountKnob->setLabel( tr( "AMT" ) ); - m_lfoAmountKnob->setRange( -1.0, 1.0, 0.005 ); - m_lfoAmountKnob->setInitValue( 0.0 ); m_lfoAmountKnob->move( LFO_AMOUNT_KNOB_X, LFO_KNOB_Y ); m_lfoAmountKnob->setHintText( tr( "Modulation amount:" ) + " ", "" ); m_lfoAmountKnob->setWhatsThis( @@ -285,11 +320,11 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount, "current LFO. The bigger this value the more the " "selected size (e.g. volume or cutoff-frequency) will " "be influenced by this LFO." ) ); - connect( m_lfoAmountKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( updateAfterKnobChange( float ) ) ); + connect( &m_lfoAmountModel, SIGNAL( dataChanged() ), + this, SLOT( updateSampleVars() ) ); - pixmapButton * sin_lfo_btn = new pixmapButton( this, NULL, NULL ); + pixmapButton * sin_lfo_btn = new pixmapButton( this, NULL ); sin_lfo_btn->move( LFO_SHAPES_X, LFO_SHAPES_Y ); sin_lfo_btn->setActiveGraphic( embed::getIconPixmap( "sin_wave_active" ) ); @@ -299,7 +334,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount, tr( "Click here if you want a sine-wave for current " "oscillator." ) ); - pixmapButton * triangle_lfo_btn = new pixmapButton( this, NULL, NULL ); + pixmapButton * triangle_lfo_btn = new pixmapButton( this, NULL ); triangle_lfo_btn->move( LFO_SHAPES_X+15, LFO_SHAPES_Y ); triangle_lfo_btn->setActiveGraphic( embed::getIconPixmap( "triangle_wave_active" ) ); @@ -309,7 +344,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount, tr( "Click here if you want a triangle-wave for current " "oscillator." ) ); - pixmapButton * saw_lfo_btn = new pixmapButton( this, NULL, NULL ); + pixmapButton * saw_lfo_btn = new pixmapButton( this, NULL ); saw_lfo_btn->move( LFO_SHAPES_X+30, LFO_SHAPES_Y ); saw_lfo_btn->setActiveGraphic( embed::getIconPixmap( "saw_wave_active" ) ); @@ -319,7 +354,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount, tr( "Click here if you want a saw-wave for current " "oscillator." ) ); - pixmapButton * sqr_lfo_btn = new pixmapButton( this, NULL, NULL ); + pixmapButton * sqr_lfo_btn = new pixmapButton( this, NULL ); sqr_lfo_btn->move( LFO_SHAPES_X+45, LFO_SHAPES_Y ); sqr_lfo_btn->setActiveGraphic( embed::getIconPixmap( "square_wave_active" ) ); @@ -329,7 +364,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount, tr( "Click here if you want a square-wave for current " "oscillator." ) ); - m_userLfoBtn = new pixmapButton( this, NULL, NULL ); + m_userLfoBtn = new pixmapButton( this, NULL ); m_userLfoBtn->move( LFO_SHAPES_X+60, LFO_SHAPES_Y ); m_userLfoBtn->setActiveGraphic( embed::getIconPixmap( "usr_wave_active" ) ); @@ -340,37 +375,42 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount, "oscillator. Afterwards drag an according sample-" "file into LFO-graph." ) ); - connect( m_userLfoBtn, SIGNAL( toggled( bool ) ), this, - SLOT( lfoUserWaveCh( bool ) ) ); + connect( m_userLfoBtn, SIGNAL( toggled( bool ) ), + this, SLOT( lfoUserWaveChanged() ) ); m_lfoWaveBtnGrp = new automatableButtonGroup( this, - tr( "LFO wave shape" ), - _track ); + tr( "LFO wave shape" ) ); + m_lfoWaveBtnGrp->setModel( &m_lfoWaveModel ); m_lfoWaveBtnGrp->addButton( sin_lfo_btn ); m_lfoWaveBtnGrp->addButton( triangle_lfo_btn ); m_lfoWaveBtnGrp->addButton( saw_lfo_btn ); m_lfoWaveBtnGrp->addButton( sqr_lfo_btn ); m_lfoWaveBtnGrp->addButton( m_userLfoBtn ); - m_lfoWaveBtnGrp->setInitValue( SIN ); - connect( m_lfoWaveBtnGrp, SIGNAL( valueChanged( int ) ), - SLOT( lfoWaveCh( int ) ) ); + m_lfoWaveModel.setTrack( _track ); + m_lfoWaveModel.setInitValue( SIN ); + connect( &m_lfoWaveModel, SIGNAL( dataChanged() ), + this, SLOT( updateSampleVars() ) ); + + m_x100Model.setTrack( _track ); m_x100Cb = new ledCheckBox( tr( "FREQ x 100" ), this, - tr( "Freq x 100" ), _track ); + tr( "Freq x 100" ) ); + m_x100Cb->setModel( &m_x100Model ); m_x100Cb->setFont( pointSize<6>( m_x100Cb->font() ) ); m_x100Cb->move( LFO_PREDELAY_KNOB_X, LFO_GRAPH_Y + 36 ); m_x100Cb->setWhatsThis( tr( "Click here if the frequency of this LFO should be " "multiplied with 100." ) ); toolTip::add( m_x100Cb, tr( "multiply LFO-frequency with 100" ) ); - connect( m_x100Cb, SIGNAL( toggled( bool ) ), this, - SLOT( x100Toggled( bool ) ) ); + connect( &m_x100Model, SIGNAL( dataChanged() ), + this, SLOT( updateSampleVars() ) ); + m_controlEnvAmountModel.setTrack( _track ); m_controlEnvAmountCb = new ledCheckBox( tr( "MODULATE ENV-AMOUNT" ), - this, tr( "Modulate Env-Amount" ), - _track ); + this, tr( "Modulate Env-Amount" ) ); + m_controlEnvAmountCb->setModel( &m_controlEnvAmountModel ); m_controlEnvAmountCb->move( LFO_PREDELAY_KNOB_X, LFO_GRAPH_Y + 54 ); m_controlEnvAmountCb->setFont( pointSize<6>( m_controlEnvAmountCb->font() ) ); @@ -396,6 +436,20 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount, envelopeAndLFOWidget::~envelopeAndLFOWidget() { + m_predelayModel.disconnect( this ); + m_attackModel.disconnect( this ); + m_holdModel.disconnect( this ); + m_decayModel.disconnect( this ); + m_sustainModel.disconnect( this ); + m_releaseModel.disconnect( this ); + m_amountModel.disconnect( this ); + m_lfoPredelayModel.disconnect( this ); + m_lfoAttackModel.disconnect( this ); + m_lfoSpeedModel.disconnect( this ); + m_lfoAmountModel.disconnect( this ); + m_lfoWaveModel.disconnect( this ); + m_x100Model.disconnect( this ); + delete[] m_pahdEnv; delete[] m_rEnv; delete[] m_lfoShapeData; @@ -405,6 +459,8 @@ envelopeAndLFOWidget::~envelopeAndLFOWidget() { v.erase( qFind( v.begin(), v.end(), this ) ); } + + delete m_lfoWaveBtnGrp; } @@ -416,7 +472,7 @@ inline sample_t envelopeAndLFOWidget::lfoShapeSample( fpp_t _frame_offset ) const float phase = frame / static_cast( m_lfoOscillationFrames ); sample_t shape_sample; - switch( m_lfoShape ) + switch( m_lfoWaveModel.value() ) { case TRIANGLE: shape_sample = oscillator::triangleSample( phase ); @@ -549,7 +605,7 @@ void FASTCALL envelopeAndLFOWidget::fillLevel( float * _buf, f_cnt_t _frame, } // at this point, *_buf is LFO level - *_buf = m_controlEnvAmountCb->isChecked() ? + *_buf = m_controlEnvAmountModel.value() ? env_level * ( 0.5f + *_buf ) : env_level + *_buf; } @@ -561,20 +617,20 @@ void FASTCALL envelopeAndLFOWidget::fillLevel( float * _buf, f_cnt_t _frame, void envelopeAndLFOWidget::saveSettings( QDomDocument & _doc, QDomElement & _parent ) { - m_predelayKnob->saveSettings( _doc, _parent, "pdel" ); - m_attackKnob->saveSettings( _doc, _parent, "att" ); - m_holdKnob->saveSettings( _doc, _parent, "hold" ); - m_decayKnob->saveSettings( _doc, _parent, "dec" ); - m_sustainKnob->saveSettings( _doc, _parent, "sus" ); - m_releaseKnob->saveSettings( _doc, _parent, "rel" ); - m_amountKnob->saveSettings( _doc, _parent, "amt" ); - m_lfoWaveBtnGrp->saveSettings( _doc, _parent, "lshp" ); - m_lfoPredelayKnob->saveSettings( _doc, _parent, "lpdel" ); - m_lfoAttackKnob->saveSettings( _doc, _parent, "latt" ); - m_lfoSpeedKnob->saveSettings( _doc, _parent, "lspd" ); - m_lfoAmountKnob->saveSettings( _doc, _parent, "lamt" ); - m_x100Cb->saveSettings( _doc, _parent, "x100" ); - m_controlEnvAmountCb->saveSettings( _doc, _parent, "ctlenvamt" ); + m_predelayModel.saveSettings( _doc, _parent, "pdel" ); + m_attackModel.saveSettings( _doc, _parent, "att" ); + m_holdModel.saveSettings( _doc, _parent, "hold" ); + m_decayModel.saveSettings( _doc, _parent, "dec" ); + m_sustainModel.saveSettings( _doc, _parent, "sus" ); + m_releaseModel.saveSettings( _doc, _parent, "rel" ); + m_amountModel.saveSettings( _doc, _parent, "amt" ); + m_lfoWaveModel.saveSettings( _doc, _parent, "lshp" ); + m_lfoPredelayModel.saveSettings( _doc, _parent, "lpdel" ); + m_lfoAttackModel.saveSettings( _doc, _parent, "latt" ); + m_lfoSpeedModel.saveSettings( _doc, _parent, "lspd" ); + m_lfoAmountModel.saveSettings( _doc, _parent, "lamt" ); + m_x100Model.saveSettings( _doc, _parent, "x100" ); + m_controlEnvAmountModel.saveSettings( _doc, _parent, "ctlenvamt" ); _parent.setAttribute( "userwavefile", m_userWave.audioFile() ); } @@ -583,20 +639,20 @@ void envelopeAndLFOWidget::saveSettings( QDomDocument & _doc, void envelopeAndLFOWidget::loadSettings( const QDomElement & _this ) { - m_predelayKnob->loadSettings( _this, "pdel" ); - m_attackKnob->loadSettings( _this, "att" ); - m_holdKnob->loadSettings( _this, "hold" ); - m_decayKnob->loadSettings( _this, "dec" ); - m_sustainKnob->loadSettings( _this, "sus" ); - m_releaseKnob->loadSettings( _this, "rel" ); - m_amountKnob->loadSettings( _this, "amt" ); - m_lfoWaveBtnGrp->loadSettings( _this, "lshp" ); - m_lfoPredelayKnob->loadSettings( _this, "lpdel" ); - m_lfoAttackKnob->loadSettings( _this, "latt" ); - m_lfoSpeedKnob->loadSettings( _this, "lspd" ); - m_lfoAmountKnob->loadSettings( _this, "lamt" ); - m_x100Cb->loadSettings( _this, "x100" ); - m_controlEnvAmountCb->loadSettings( _this, "ctlenvamt" ); + m_predelayModel.loadSettings( _this, "pdel" ); + m_attackModel.loadSettings( _this, "att" ); + m_holdModel.loadSettings( _this, "hold" ); + m_decayModel.loadSettings( _this, "dec" ); + m_sustainModel.loadSettings( _this, "sus" ); + m_releaseModel.loadSettings( _this, "rel" ); + m_amountModel.loadSettings( _this, "amt" ); + m_lfoWaveModel.loadSettings( _this, "lshp" ); + m_lfoPredelayModel.loadSettings( _this, "lpdel" ); + m_lfoAttackModel.loadSettings( _this, "latt" ); + m_lfoSpeedModel.loadSettings( _this, "lspd" ); + m_lfoAmountModel.loadSettings( _this, "lamt" ); + m_x100Model.loadSettings( _this, "x100" ); + m_controlEnvAmountModel.loadSettings( _this, "ctlenvamt" ); // Keep compatibility with version 2.1 file format if( _this.hasAttribute( "lfosyncmode" ) ) @@ -669,8 +725,7 @@ void envelopeAndLFOWidget::dropEvent( QDropEvent * _de ) if( type == "samplefile" ) { m_userWave.setAudioFile( stringPairDrag::decodeValue( _de ) ); - m_userLfoBtn->setChecked( TRUE ); - lfoUserWaveCh( TRUE ); + m_userLfoBtn->model()->setValue( TRUE ); _de->accept(); } else if( type == QString( "tco_%1" ).arg( track::SAMPLE_TRACK ) ) @@ -678,8 +733,7 @@ void envelopeAndLFOWidget::dropEvent( QDropEvent * _de ) multimediaProject mmp( value, FALSE ); m_userWave.setAudioFile( mmp.content().firstChild().toElement(). attribute( "src" ) ); - m_userLfoBtn->setChecked( TRUE ); - lfoUserWaveCh( TRUE ); + m_userLfoBtn->model()->setValue( TRUE ); _de->accept(); } } @@ -778,7 +832,7 @@ void envelopeAndLFOWidget::paintEvent( QPaintEvent * ) float osc_frames = m_lfoOscillationFrames; - if( m_x100Cb->isChecked() ) + if( m_x100Model.value() ) { osc_frames *= 100.0f; } @@ -792,7 +846,7 @@ void envelopeAndLFOWidget::paintEvent( QPaintEvent * ) { float phase = ( cur_sample -= m_lfoPredelayFrames ) / osc_frames; - switch( m_lfoShape ) + switch( m_lfoWaveModel.value() ) { case SIN: val = oscillator::sinSample( phase ); @@ -935,7 +989,7 @@ void envelopeAndLFOWidget::updateSampleVars( void ) m_lfoOscillationFrames = static_cast( frames_per_lfo_oscillation * m_lfoSpeedKnob->value() ); - if( m_x100Cb->isChecked() ) + if( m_x100Model.value() ) { m_lfoOscillationFrames /= 100; } @@ -965,35 +1019,9 @@ void envelopeAndLFOWidget::updateSampleVars( void ) -void envelopeAndLFOWidget::x100Toggled( bool ) +void envelopeAndLFOWidget::lfoUserWaveChanged( void ) { - engine::getSongEditor()->setModified(); - updateSampleVars(); -} - - - - -void envelopeAndLFOWidget::updateAfterKnobChange( float ) -{ - updateSampleVars(); -} - - - - -void envelopeAndLFOWidget::lfoWaveCh( int _val ) -{ - m_lfoShape = static_cast( _val ); - updateSampleVars(); -} - - - - -void envelopeAndLFOWidget::lfoUserWaveCh( bool _on ) -{ - if( _on && m_lfoShape != USER ) + if( m_lfoWaveModel.value() == USER ) { if( m_userWave.frames() <= 1 ) { @@ -1002,11 +1030,7 @@ void envelopeAndLFOWidget::lfoUserWaveCh( bool _on ) "it in this window." ), embed::getIconPixmap( "hint" ), 3000 ); } - m_lfoShape = USER; } - engine::getSongEditor()->setModified(); - - updateSampleVars(); } diff --git a/src/core/envelope_tab_widget.cpp b/src/core/envelope_tab_widget.cpp index ba5dc5665..8444baa60 100644 --- a/src/core/envelope_tab_widget.cpp +++ b/src/core/envelope_tab_widget.cpp @@ -73,9 +73,12 @@ static const QString targetNames[envelopeTabWidget::TARGET_COUNT][2] = envelopeTabWidget::envelopeTabWidget( instrumentTrack * _instrument_track ) : QWidget( _instrument_track->tabWidgetParent() ), - m_instrumentTrack( _instrument_track ) + m_instrumentTrack( _instrument_track ), + m_filterEnabledModel( new boolModel( /* this */ ) ), + m_filterModel( new comboBoxModel( /* this */ ) ), + m_filterCutModel( new floatModel( /* this */ ) ), + m_filterResModel( new floatModel( /* this */ ) ) { - m_targetsTabWidget = new tabWidget( tr( "TARGET" ), this ); m_targetsTabWidget->setGeometry( TARGETS_TABWIDGET_X, TARGETS_TABWIDGET_Y, @@ -111,50 +114,54 @@ envelopeTabWidget::envelopeTabWidget( instrumentTrack * _instrument_track ) : tr( targetNames[i][0] .toAscii().constData() ) ); } - - - m_filterGroupBox = new groupBox( tr( "FILTER" ), this, - _instrument_track ); + + + m_filterEnabledModel->setTrack( _instrument_track ); + m_filterGroupBox = new groupBox( tr( "FILTER" ), this ); + m_filterGroupBox->setModel( m_filterEnabledModel ); m_filterGroupBox->setGeometry( FILTER_GROUPBOX_X, FILTER_GROUPBOX_Y, FILTER_GROUPBOX_WIDTH, FILTER_GROUPBOX_HEIGHT ); - m_filterComboBox = new comboBox( m_filterGroupBox, tr( "Filter type" ), - _instrument_track ); + + m_filterModel->addItem( tr( "LowPass" ), new QPixmap( + embed::getIconPixmap( "filter_lp" ) ) ); + m_filterModel->addItem( tr( "HiPass" ), new QPixmap( + embed::getIconPixmap( "filter_hp" ) ) ); + m_filterModel->addItem( tr( "BandPass csg" ), new QPixmap( + embed::getIconPixmap( "filter_bp" ) ) ); + m_filterModel->addItem( tr( "BandPass czpg" ), new QPixmap( + embed::getIconPixmap( "filter_bp" ) ) ); + m_filterModel->addItem( tr( "Notch" ), new QPixmap( + embed::getIconPixmap( "filter_notch" ) ) ); + m_filterModel->addItem( tr( "Allpass" ), new QPixmap( + embed::getIconPixmap( "filter_ap" ) ) ); + m_filterModel->addItem( tr( "Moog" ), new QPixmap( + embed::getIconPixmap( "filter_lp" ) ) ); + m_filterModel->addItem( tr( "2x LowPass" ), new QPixmap( + embed::getIconPixmap( "filter_2lp" ) ) ); + + m_filterModel->setTrack( _instrument_track ); + m_filterComboBox = new comboBox( m_filterGroupBox, tr( "Filter type" ) ); + m_filterComboBox->setModel( m_filterModel ); m_filterComboBox->setGeometry( 14, 22, 120, 22 ); m_filterComboBox->setFont( pointSize<8>( m_filterComboBox->font() ) ); - - m_filterComboBox->addItem( tr( "LowPass" ), - embed::getIconPixmap( "filter_lp" ) ); - m_filterComboBox->addItem( tr( "HiPass" ), - embed::getIconPixmap( "filter_hp" ) ); - m_filterComboBox->addItem( tr( "BandPass csg" ), - embed::getIconPixmap( "filter_bp" ) ); - m_filterComboBox->addItem( tr( "BandPass czpg" ), - embed::getIconPixmap( "filter_bp" ) ); - m_filterComboBox->addItem( tr( "Notch" ), - embed::getIconPixmap( "filter_notch" ) ); - m_filterComboBox->addItem( tr( "Allpass" ), - embed::getIconPixmap( "filter_ap" ) ); - m_filterComboBox->addItem( tr( "Moog" ), - embed::getIconPixmap( "filter_lp" ) ); - m_filterComboBox->addItem( tr( "2x LowPass" ), - embed::getIconPixmap( "filter_2lp" ) ); - m_filterComboBox->setWhatsThis( tr( "Here you can select the built-in filter you want to use " "for this instrument-track. Filters are very important " "for changing the characteristics of a sound." ) ); + m_filterCutModel->setTrack( _instrument_track ); + m_filterCutModel->setRange( 0.0, 14000.0, 1.0 ); + m_filterCutModel->setInitValue( 16000.0 ); + m_filterCutKnob = new knob( knobBright_26, m_filterGroupBox, - tr( "cutoff-frequency" ), - _instrument_track ); + tr( "cutoff-frequency" ) ); + m_filterCutKnob->setModel( m_filterCutModel ); m_filterCutKnob->setLabel( tr( "CUTOFF" ) ); - m_filterCutKnob->setRange( 0.0, 14000.0, 1.0 ); m_filterCutKnob->move( 140, 18 ); - m_filterCutKnob->setInitValue( 16000.0 ); m_filterCutKnob->setHintText( tr( "cutoff-frequency:" ) + " ", " " + tr( "Hz" ) ); m_filterCutKnob->setWhatsThis( @@ -165,13 +172,17 @@ envelopeTabWidget::envelopeTabWidget( instrumentTrack * _instrument_track ) : "the cutoff-frequency. A highpass-filter cuts all " "frequencies below cutoff-frequency and so on..." ) ); + + + m_filterResModel->setTrack( _instrument_track ); + m_filterResModel->setRange( basicFilters<>::minQ(), 10.0, 0.01 ); + m_filterResModel->setInitValue( 0.5 ); + m_filterResKnob = new knob( knobBright_26, m_filterGroupBox, - tr( "Q/Resonance" ), - _instrument_track ); + tr( "Q/Resonance" ) ); + m_filterResKnob->setModel( m_filterResModel ); m_filterResKnob->setLabel( tr( "Q/RESO" ) ); - m_filterResKnob->setRange( basicFilters<>::minQ(), 10.0, 0.01 ); m_filterResKnob->move( 190, 18 ); - m_filterResKnob->setInitValue( 0.5 ); m_filterResKnob->setHintText( tr( "Q/Resonance:" ) + " ", "" ); m_filterResKnob->setWhatsThis( tr( "Use this knob for setting Q/Resonance for the selected " @@ -233,7 +244,7 @@ void envelopeTabWidget::processAudioBuffer( sampleFrame * _ab, // only use filter, if it is really needed - if( m_filterGroupBox->isActive() ) + if( m_filterEnabledModel->value() ) { int old_filter_cut = 0; int old_filter_res = 0; @@ -429,10 +440,10 @@ f_cnt_t envelopeTabWidget::releaseFrames( const bool _only_vol ) void envelopeTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) { - m_filterComboBox->saveSettings( _doc, _this, "ftype" ); - m_filterCutKnob->saveSettings( _doc, _this, "fcut" ); - m_filterResKnob->saveSettings( _doc, _this, "fres" ); - m_filterGroupBox->saveSettings( _doc, _this, "fwet" ); + m_filterModel->saveSettings( _doc, _this, "ftype" ); + m_filterCutModel->saveSettings( _doc, _this, "fcut" ); + m_filterResModel->saveSettings( _doc, _this, "fres" ); + m_filterEnabledModel->saveSettings( _doc, _this, "fwet" ); for( int i = 0; i < TARGET_COUNT; ++i ) { @@ -447,10 +458,10 @@ void envelopeTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) void envelopeTabWidget::loadSettings( const QDomElement & _this ) { - m_filterComboBox->loadSettings( _this, "ftype" ); - m_filterCutKnob->loadSettings( _this, "fcut" ); - m_filterResKnob->loadSettings( _this, "fres" ); - m_filterGroupBox->loadSettings( _this, "fwet" ); + m_filterModel->loadSettings( _this, "ftype" ); + m_filterCutModel->loadSettings( _this, "fcut" ); + m_filterResModel->loadSettings( _this, "fres" ); + m_filterEnabledModel->loadSettings( _this, "fwet" ); QDomNode node = _this.firstChild(); while( !node.isNull() ) diff --git a/src/core/export_project_dialog.cpp b/src/core/export_project_dialog.cpp index f09cfc2b3..02e7f460b 100644 --- a/src/core/export_project_dialog.cpp +++ b/src/core/export_project_dialog.cpp @@ -117,8 +117,11 @@ Sint16 exportProjectDialog::s_availableBitrates[] = exportProjectDialog::exportProjectDialog( const QString & _file_name, QWidget * _parent ) : QDialog( _parent ), + m_typeModel( new comboBoxModel( /* this */ ) ), + m_kbpsModel( new comboBoxModel( /* this */ ) ), + m_vbrEnabledModel( new boolModel( /* this */ ) ), + m_hqmEnabledModel( new boolModel( /* this */ ) ), m_fileName( _file_name ), - m_hourglassLbl( NULL ), m_deleteFile( FALSE ) { m_fileType = getFileTypeFromExtension( "." + @@ -132,53 +135,57 @@ exportProjectDialog::exportProjectDialog( const QString & _file_name, m_typeLbl->setGeometry( LABEL_X, TYPE_STUFF_Y, LABEL_WIDTH, TYPE_HEIGHT ); - m_typeCombo = new comboBox( this, NULL, NULL ); - m_typeCombo->setGeometry( LABEL_X + LABEL_WIDTH+LABEL_MARGIN, - TYPE_STUFF_Y, TYPE_COMBO_WIDTH, - TYPE_HEIGHT ); - connect( m_typeCombo, SIGNAL( activated( const QString & ) ), this, - SLOT( changedType( const QString & ) ) ); - Uint8 idx = 0; while( fileEncodeDevices[idx].m_fileType != NULL_FILE ) { - m_typeCombo->addItem( + m_typeModel->addItem( tr( fileEncodeDevices[idx].m_description ) ); ++idx; } - m_typeCombo->setValue( m_typeCombo->findText( tr( + m_typeModel->setValue( m_typeModel->findText( tr( fileEncodeDevices[m_fileType].m_description ) ) ); + m_typeCombo = new comboBox( this ); + m_typeCombo->setGeometry( LABEL_X + LABEL_WIDTH+LABEL_MARGIN, + TYPE_STUFF_Y, TYPE_COMBO_WIDTH, + TYPE_HEIGHT ); + m_typeCombo->setModel( m_typeModel ); +/* connect( m_typeCombo, SIGNAL( activated( const QString & ) ), this, + SLOT( changedType( const QString & ) ) );*/ + // kbps-ui-stuff m_kbpsLbl = new QLabel( tr( "kbps:" ), this ); m_kbpsLbl->setGeometry( LABEL_X, KBPS_STUFF_Y, LABEL_WIDTH, KBPS_HEIGHT ); - m_kbpsCombo = new comboBox( this, NULL, NULL ); + idx = 0; + while( s_availableBitrates[idx] != -1 ) + { + m_kbpsModel->addItem( QString::number( + s_availableBitrates[idx] ) ); + ++idx; + } + m_kbpsModel->setValue( m_kbpsModel->findText( + QString::number( 128 ) ) ); + + m_kbpsCombo = new comboBox( this ); + m_kbpsCombo->setModel( m_kbpsModel ); m_kbpsCombo->setGeometry( LABEL_X + LABEL_WIDTH + LABEL_MARGIN, KBPS_STUFF_Y, KBPS_COMBO_WIDTH, KBPS_HEIGHT ); - idx = 0; - while( s_availableBitrates[idx] != -1 ) - { - m_kbpsCombo->addItem( QString::number( - s_availableBitrates[idx] ) ); - ++idx; - } - m_typeCombo->setValue( m_typeCombo->findText( - QString::number( 128 ) ) ); - - m_vbrCb = new ledCheckBox( tr( "variable bitrate" ), this, NULL, NULL ); + m_vbrCb = new ledCheckBox( tr( "variable bitrate" ), this ); + m_vbrCb->setModel( m_vbrEnabledModel ); m_vbrCb->setGeometry( LABEL_X + LABEL_WIDTH + 3 * LABEL_MARGIN + KBPS_COMBO_WIDTH, KBPS_STUFF_Y + 3, 190, 20 ); m_vbrCb->setChecked( TRUE ); m_hqmCb = new ledCheckBox( tr( "use high-quality-mode (recommened)" ), - this, NULL, NULL ); + this ); + m_hqmCb->setModel( m_hqmEnabledModel ); m_hqmCb->setGeometry( LABEL_X, HQ_MODE_CB_Y + 3, HQ_MODE_CB_WIDTH, HQ_MODE_CB_HEIGHT ); m_hqmCb->setChecked( TRUE ); @@ -306,10 +313,10 @@ void exportProjectDialog::exportBtnClicked( void ) DEFAULT_CHANNELS, success_ful, m_fileName, - m_vbrCb->isChecked(), - m_kbpsCombo->currentText().toInt(), - m_kbpsCombo->currentText().toInt() - 64, - m_kbpsCombo->currentText().toInt() + 64, + m_vbrCb->model()->value(), + m_kbpsModel->currentText().toInt(), + m_kbpsModel->currentText().toInt() - 64, + m_kbpsModel->currentText().toInt() + 64, engine::getMixer() ); if( success_ful == FALSE ) { @@ -351,7 +358,7 @@ void exportProjectDialog::exportBtnClicked( void ) - engine::getMixer()->setAudioDevice( dev, m_hqmCb->isChecked() ); + engine::getMixer()->setAudioDevice( dev, m_hqmCb->model()->value() ); engine::getSongEditor()->startExport(); delete m_hqmCb; diff --git a/src/core/instrument.cpp b/src/core/instrument.cpp index 4acce7022..a26cd4c8e 100644 --- a/src/core/instrument.cpp +++ b/src/core/instrument.cpp @@ -26,6 +26,7 @@ #include "instrument.h" +#include "automatable_model_templates.h" #include "instrument_track.h" #include "dummy_instrument.h" #include "note_play_handle.h" diff --git a/src/core/ladspa_control.cpp b/src/core/ladspa_control.cpp index 70573d08e..9ba2016af 100644 --- a/src/core/ladspa_control.cpp +++ b/src/core/ladspa_control.cpp @@ -26,7 +26,7 @@ #include #include "ladspa_control.h" -#include "automatable_object_templates.h" +#include "automatable_model_templates.h" #include "ladspa_base.h" #include "led_checkbox.h" #include "tempo_sync_knob.h" @@ -42,31 +42,41 @@ ladspaControl::ladspaControl( QWidget * _parent, m_track( _track ), m_link( NULL ), m_toggle( NULL ), - m_knob( NULL ) + m_knob( NULL ), + m_linkEnabledModel( FALSE, FALSE, TRUE ), + m_toggledModel( FALSE, FALSE, TRUE ), + m_knobModel() { m_layout = new QHBoxLayout( this ); if( _link ) { - m_link = new ledCheckBox( "", this, NULL, NULL ); - m_link->setChecked( FALSE ); - connect( m_link, SIGNAL( toggled( bool ) ), - this, SLOT( portLink( bool ) ) ); - m_layout->addWidget( m_link ); + m_link = new ledCheckBox( "", this ); toolTip::add( m_link, tr( "Link channels" ) ); + + m_linkEnabledModel.setValue( FALSE ); + m_linkEnabledModel.setTrack( _track ); + m_link->setModel( &m_linkEnabledModel ); + connect( &m_linkEnabledModel, SIGNAL( dataChanged() ), + this, SLOT( linkStateChanged() ) ); + + m_layout->addWidget( m_link ); } switch( m_port->data_type ) { case TOGGLED: - m_toggle = new ledCheckBox( m_port->name, this, "", - m_track, ledCheckBox::GREEN ); - connect( m_toggle, SIGNAL( toggled( bool ) ), - this, SLOT( ledChange( bool ) ) ); + m_toggledModel.setTrack( m_track ); + m_toggle = new ledCheckBox( m_port->name, this, + QString::null, + ledCheckBox::GREEN ); + m_toggle->setModel( &m_toggledModel ); + connect( &m_toggledModel, SIGNAL( dataChanged() ), + this, SLOT( ledChanged() ) ); setFixedSize( m_toggle->width(), m_toggle->height() ); if( m_port->def == 1.0f ) { - m_toggle->setChecked( TRUE ); + m_toggledModel.setValue( TRUE ); } if( _link ) { @@ -77,17 +87,19 @@ ladspaControl::ladspaControl( QWidget * _parent, } break; case INTEGER: - m_knob = new knob( knobBright_26, this, m_port->name, - m_track ); - connect( m_knob, SIGNAL( valueChanged( float ) ), - this, SLOT( knobChange( float ) ) ); - m_knob->setLabel( m_port->name ); - m_knob->setRange( static_cast( m_port->max ), + m_knobModel.setTrack( m_track ); + m_knobModel.setRange( static_cast( m_port->max ), static_cast( m_port->min ), 1 + static_cast( m_port->max - m_port->min ) / 400 ); - m_knob->setInitValue( + m_knobModel.setInitValue( static_cast( m_port->def ) ); + m_knob = new knob( knobBright_26, this, m_port->name ); + m_knob->setModel( &m_knobModel ); + connect( &m_knobModel, SIGNAL( dataChanged() ), + this, SLOT( knobChanged() ) ); + + m_knob->setLabel( m_port->name ); setFixedSize( m_knob->width(), m_knob->height() ); m_knob->setHintText( tr( "Value:" ) + " ", "" ); m_knob->setWhatsThis( @@ -101,17 +113,18 @@ ladspaControl::ladspaControl( QWidget * _parent, } break; case FLOAT: - m_knob = new knob( knobBright_26, this, m_port->name, - m_track ); - connect( m_knob, SIGNAL( valueChanged( float ) ), - this, SLOT( knobChange( float ) ) ); - m_knob->setLabel( m_port->name ); - m_knob->setRange( m_port->min, m_port->max, + m_knobModel.setTrack( m_track ); + m_knobModel.setRange( m_port->min, m_port->max, ( m_port->max - m_port->min ) / ( m_port->name.toUpper() == "GAIN" && m_port->max == 10.0f ? 4000.0f : 400.0f ) ); - m_knob->setInitValue( m_port->def ); + m_knobModel.setInitValue( m_port->def ); + m_knob = new knob( knobBright_26, this, m_port->name ); + m_knob->setModel( &m_knobModel ); + connect( &m_knobModel, SIGNAL( dataChanged() ), + this, SLOT( knobChanged() ) ); + m_knob->setLabel( m_port->name ); m_knob->setHintText( tr( "Value:" ) + " ", "" ); m_knob->setWhatsThis( tr( "Sorry, no help available." ) ); @@ -125,15 +138,17 @@ ladspaControl::ladspaControl( QWidget * _parent, } break; case TIME: - m_knob = new tempoSyncKnob( knobBright_26, this, - m_port->name, m_track ); - connect( m_knob, SIGNAL( valueChanged( float ) ), - this, SLOT( knobChange( float ) ) ); - m_knob->setLabel( m_port->name ); - m_knob->setRange( m_port->min, m_port->max, + m_knobModel.setTrack( m_track ); + m_knobModel.setRange( m_port->min, m_port->max, ( m_port->max - m_port->min ) / 400.0f ); - m_knob->setInitValue( m_port->def ); + m_knobModel.setInitValue( m_port->def ); + m_knob = new tempoSyncKnob( knobBright_26, this, + m_port->name ); + m_knob->setModel( &m_knobModel ); + connect( &m_knobModel, SIGNAL( dataChanged() ), + this, SLOT( knobChanged() ) ); + m_knob->setLabel( m_port->name ); m_knob->setHintText( tr( "Value:" ) + " ", "" ); m_knob->setWhatsThis( tr( "Sorry, no help available." ) ); @@ -169,12 +184,13 @@ LADSPA_Data ladspaControl::getValue( void ) { case TOGGLED: value = static_cast( - m_toggle->isChecked() ); + m_toggledModel.value() ); break; case INTEGER: case FLOAT: case TIME: - value = static_cast( m_knob->value() ); + value = static_cast( + m_knobModel.value() ); break; default: printf( "ladspaControl::getValue BAD BAD BAD\n" ); @@ -192,14 +208,14 @@ void ladspaControl::setValue( LADSPA_Data _value ) switch( m_port->data_type ) { case TOGGLED: - m_toggle->setChecked( static_cast( _value ) ); + m_toggledModel.setValue( static_cast( _value ) ); break; case INTEGER: - m_knob->setValue( static_cast( _value ) ); + m_knobModel.setValue( static_cast( _value ) ); break; case FLOAT: case TIME: - m_knob->setValue( static_cast( _value ) ); + m_knobModel.setValue( static_cast( _value ) ); break; default: printf("ladspaControl::setValue BAD BAD BAD\n"); @@ -216,17 +232,17 @@ void FASTCALL ladspaControl::saveSettings( QDomDocument & _doc, { if( m_link != NULL ) { - m_link->saveSettings( _doc, _this, _name + "link" ); + m_linkEnabledModel.saveSettings( _doc, _this, _name + "link" ); } switch( m_port->data_type ) { case TOGGLED: - m_toggle->saveSettings( _doc, _this, _name ); + m_toggledModel.saveSettings( _doc, _this, _name ); break; case INTEGER: case FLOAT: case TIME: - m_knob->saveSettings( _doc, _this, _name ); + m_knobModel.saveSettings( _doc, _this, _name ); break; default: printf("ladspaControl::saveSettings BAD BAD BAD\n"); @@ -241,17 +257,17 @@ void FASTCALL ladspaControl::loadSettings( const QDomElement & _this, { if( m_link != NULL ) { - m_link->loadSettings( _this, _name + "link" ); + m_linkEnabledModel.loadSettings( _this, _name + "link" ); } switch( m_port->data_type ) { case TOGGLED: - m_toggle->loadSettings( _this, _name ); + m_toggledModel.loadSettings( _this, _name ); break; case INTEGER: case FLOAT: case TIME: - m_knob->loadSettings( _this, _name ); + m_knobModel.loadSettings( _this, _name ); break; default: printf("ladspaControl::loadSettings BAD BAD BAD\n"); @@ -267,12 +283,14 @@ void FASTCALL ladspaControl::linkControls( ladspaControl * _control ) switch( m_port->data_type ) { case TOGGLED: - ledCheckBox::linkObjects( m_toggle, _control->getToggle() ); + boolModel::linkModels( &m_toggledModel, + _control->getToggledModel() ); break; case INTEGER: case FLOAT: case TIME: - knob::linkObjects( m_knob, _control->getKnob() ); + knobModel::linkModels( &m_knobModel, + _control->getKnobModel() ); break; default: break; @@ -282,17 +300,19 @@ void FASTCALL ladspaControl::linkControls( ladspaControl * _control ) -void ladspaControl::ledChange( bool _state ) +void ladspaControl::ledChanged( void ) { - emit( changed( m_port->port_id, static_cast( _state ) ) ); + emit( changed( m_port->port_id, static_cast( + m_toggledModel.value() ) ) ); } -void ladspaControl::knobChange( float _value ) +void ladspaControl::knobChanged( void ) { - emit( changed( m_port->port_id, static_cast( _value ) ) ); + emit( changed( m_port->port_id, static_cast( + m_knobModel.value() ) ) ); } @@ -303,12 +323,14 @@ void FASTCALL ladspaControl::unlinkControls( ladspaControl * _control ) switch( m_port->data_type ) { case TOGGLED: - ledCheckBox::unlinkObjects( m_toggle, _control->getToggle() ); + boolModel::unlinkModels( &m_toggledModel, + _control->getToggledModel() ); break; case INTEGER: case FLOAT: case TIME: - knob::unlinkObjects( m_knob, _control->getKnob() ); + knobModel::unlinkModels( &m_knobModel, + _control->getKnobModel() ); break; default: break; @@ -318,9 +340,9 @@ void FASTCALL ladspaControl::unlinkControls( ladspaControl * _control ) -void ladspaControl::portLink( bool _state ) +void ladspaControl::linkStateChanged( void ) { - emit( linkChanged( m_port->control_id, _state ) ); + emit( linkChanged( m_port->control_id, m_linkEnabledModel.value() ) ); } @@ -328,10 +350,7 @@ void ladspaControl::portLink( bool _state ) void FASTCALL ladspaControl::setLink( bool _state ) { - if( m_link != NULL ) - { - m_link->setChecked( _state ); - } + m_linkEnabledModel.setValue( _state ); } diff --git a/src/core/meter_dialog.cpp b/src/core/meter_dialog.cpp index 8f462d3b0..3a0af7c0a 100644 --- a/src/core/meter_dialog.cpp +++ b/src/core/meter_dialog.cpp @@ -34,47 +34,63 @@ meterDialog::meterDialog( QWidget * _parent, track * _track ): - QWidget( _parent ) + QWidget( _parent ), + m_numeratorModel( new lcdSpinBoxModel( /* this */ ) ), + m_denominatorModel( new lcdSpinBoxModel( /* this */ ) ) { QVBoxLayout * vlayout = new QVBoxLayout( this ); vlayout->setSpacing( 5 ); vlayout->setMargin( 5 ); + QWidget * num = new QWidget( this ); QHBoxLayout * num_layout = new QHBoxLayout( num ); num_layout->setSpacing( 10 ); - m_numerator = new lcdSpinBox( 1, 32, 2, num, tr( "Meter Numerator" ), - _track ); - connect( m_numerator, SIGNAL( valueChanged( int ) ), - this, SIGNAL( numeratorChanged( int ) ) ); - m_numerator->setValue( 4 ); + + + m_numeratorModel->setTrack( _track ); + m_numeratorModel->setRange( 1, 32 ); + m_numeratorModel->setValue( 4 ); + connect( m_numeratorModel, SIGNAL( dataChanged() ), + this, SIGNAL( numeratorChanged() ) ); + + m_numerator = new lcdSpinBox( 2, num, tr( "Meter Numerator" ) ); + m_numerator->setModel( m_numeratorModel ); + num_layout->addWidget( m_numerator ); + QLabel * num_label = new QLabel( num ); num_label->setText( tr( "Meter Numerator" ) ); QFont f = num_label->font(); num_label->setFont( pointSize<7>( f ) ); num_layout->addWidget( num_label ); + - QWidget * dem = new QWidget( this ); - QHBoxLayout * dem_layout = new QHBoxLayout( dem ); - dem_layout->setSpacing( 10 ); - m_denominator = new lcdSpinBox( 1, 32, 2, dem, - tr( "Meter Denominator" ), - _track ); - connect( m_denominator, SIGNAL( valueChanged( int ) ), - this, SIGNAL( denominatorChanged( int ) ) ); - m_denominator->setValue( 4 ); - dem_layout->addWidget( m_denominator ); - QLabel * dem_label = new QLabel( dem ); - f = dem_label->font(); - dem_label->setFont( pointSize<7>( f ) ); - dem_label->setText( tr( "Meter Denominator" ) ); - dem_layout->addWidget( dem_label ); + QWidget * den = new QWidget( this ); + QHBoxLayout * den_layout = new QHBoxLayout( den ); + den_layout->setSpacing( 10 ); + + m_denominatorModel->setTrack( _track ); + m_denominatorModel->setRange( 1, 32 ); + m_denominatorModel->setValue( 4 ); + connect( m_denominatorModel, SIGNAL( dataChanged() ), + this, SIGNAL( denominatorChanged() ) ); + + m_denominator = new lcdSpinBox( 2, den, tr( "Meter Denominator" ) ); + m_denominator->setModel( m_denominatorModel ); + + den_layout->addWidget( m_denominator ); + + QLabel * den_label = new QLabel( den ); + f = den_label->font(); + den_label->setFont( pointSize<7>( f ) ); + den_label->setText( tr( "Meter Denominator" ) ); + den_layout->addWidget( den_label ); vlayout->addWidget( num ); - vlayout->addWidget( dem ); + vlayout->addWidget( den ); - setFixedSize( dem_label->width() + m_denominator->width() + 10, + setFixedSize( den_label->width() + m_denominator->width() + 10, m_numerator->height() + m_denominator->height() + 15 ); } @@ -91,8 +107,8 @@ meterDialog::~meterDialog() void meterDialog::saveSettings( QDomDocument & _doc, QDomElement & _this, const QString & _name ) { - m_numerator->saveSettings( _doc, _this, _name + "_numerator" ); - m_denominator->saveSettings( _doc, _this, _name + "_denominator" ); + m_numeratorModel->saveSettings( _doc, _this, _name + "_numerator" ); + m_denominatorModel->saveSettings( _doc, _this, _name + "_denominator" ); } @@ -101,8 +117,8 @@ void meterDialog::saveSettings( QDomDocument & _doc, QDomElement & _this, void meterDialog::loadSettings( const QDomElement & _this, const QString & _name ) { - m_numerator->loadSettings( _this, _name + "_numerator" ); - m_denominator->loadSettings( _this, _name + "_denominator" ); + m_numeratorModel->loadSettings( _this, _name + "_numerator" ); + m_denominatorModel->loadSettings( _this, _name + "_denominator" ); } diff --git a/src/core/midi_tab_widget.cpp b/src/core/midi_tab_widget.cpp index 66c341684..c620a0848 100644 --- a/src/core/midi_tab_widget.cpp +++ b/src/core/midi_tab_widget.cpp @@ -43,6 +43,7 @@ #include "song_editor.h" #include "tab_widget.h" #include "tooltip.h" +#include "automatable_model_templates.h" @@ -51,6 +52,12 @@ midiTabWidget::midiTabWidget( instrumentTrack * _instrument_track, QWidget( _instrument_track->tabWidgetParent() ), m_instrumentTrack( _instrument_track ), m_midiPort( _port ), + m_inputChannelModel(), + m_outputChannelModel(), + m_receiveEnabledModel( FALSE, FALSE, TRUE ), + m_sendEnabledModel( FALSE, FALSE, TRUE ), + m_defaultVelocityInEnabledModel( FALSE, FALSE, TRUE ), + m_defaultVelocityOutEnabledModel( FALSE, FALSE, TRUE ), m_readablePorts( NULL ), m_writeablePorts( NULL ) { @@ -58,78 +65,91 @@ midiTabWidget::midiTabWidget( instrumentTrack * _instrument_track, this ); m_setupTabWidget->setGeometry( 4, 5, 238, 200 ); + m_inputChannelModel.setTrack( m_instrumentTrack ); + m_inputChannelModel.setRange( 0, MIDI_CHANNEL_COUNT ); + m_inputChannelModel.setValue( m_midiPort->inputChannel() + 1 ); + connect( &m_inputChannelModel, SIGNAL( dataChanged() ), + this, SLOT( inputChannelChanged() ) ); - m_inputChannelSpinBox = new lcdSpinBox( 0, MIDI_CHANNEL_COUNT, 3, - m_setupTabWidget, - tr( "Input channel" ), - _instrument_track ); + m_inputChannelSpinBox = new lcdSpinBox( 3, m_setupTabWidget, + tr( "Input channel" ) ); + m_inputChannelSpinBox->setModel( &m_inputChannelModel ); m_inputChannelSpinBox->addTextForValue( 0, "---" ); - m_inputChannelSpinBox->setValue( m_midiPort->inputChannel() + 1 ); m_inputChannelSpinBox->setLabel( tr( "CHANNEL" ) ); m_inputChannelSpinBox->move( 28, 52 ); m_inputChannelSpinBox->setEnabled( FALSE ); - connect( m_inputChannelSpinBox, SIGNAL( valueChanged( int ) ), - this, SLOT( inputChannelChanged( int ) ) ); - inputChannelChanged( m_inputChannelSpinBox->value() ); + inputChannelChanged(); - m_outputChannelSpinBox = new lcdSpinBox( 1, MIDI_CHANNEL_COUNT, 3, - m_setupTabWidget, - tr( "Output channel" ), - _instrument_track ); - m_outputChannelSpinBox->setValue( m_midiPort->outputChannel() + 1 ); - //m_outputChannelSpinBox->addTextForValue( 0, "---" ); + + + m_outputChannelModel.setTrack( m_instrumentTrack ); + m_outputChannelModel.setRange( 1, MIDI_CHANNEL_COUNT ); + m_outputChannelModel.setValue( m_midiPort->outputChannel() + 1 ); + connect( &m_outputChannelModel, SIGNAL( dataChanged() ), + this, SLOT( outputChannelChanged() ) ); + + m_outputChannelSpinBox = new lcdSpinBox( 3, m_setupTabWidget, + tr( "Output channel" ) ); m_outputChannelSpinBox->setLabel( tr( "CHANNEL" ) ); m_outputChannelSpinBox->move( 28, 132 ); m_outputChannelSpinBox->setEnabled( FALSE ); - connect( m_outputChannelSpinBox, SIGNAL( valueChanged( int ) ), - this, SLOT( outputChannelChanged( int ) ) ); - outputChannelChanged( m_outputChannelSpinBox->value() ); + outputChannelChanged(); + m_receiveEnabledModel.setTrack( m_instrumentTrack ); m_receiveCheckBox = new ledCheckBox( tr( "Receive MIDI-events" ), m_setupTabWidget, - tr( "Receive MIDI-events" ), - _instrument_track ); + tr( "Receive MIDI-events" ) ); + m_receiveCheckBox->setModel( &m_receiveEnabledModel ); m_receiveCheckBox->move( 10, 34 ); - connect( m_receiveCheckBox, SIGNAL( toggled( bool ) ), - this, SLOT( midiPortModeToggled( bool ) ) ); + // enabling/disabling widgets is UI-stuff thus we do not use model here connect( m_receiveCheckBox, SIGNAL( toggled( bool ) ), m_inputChannelSpinBox, SLOT( setEnabled( bool ) ) ); + connect( &m_receiveEnabledModel, SIGNAL( dataChanged() ), + this, SLOT( midiPortModeChanged() ) ); + + m_defaultVelocityInEnabledModel.setTrack( m_instrumentTrack ); m_defaultVelocityInCheckBox = new ledCheckBox( tr( "Default velocity " "for all input-events" ), m_setupTabWidget, - tr( "Default input velocity" ), - _instrument_track ); + tr( "Default input velocity" ) ); + m_defaultVelocityInCheckBox->setModel( + &m_defaultVelocityInEnabledModel ); m_defaultVelocityInCheckBox->move( 28, 84 ); - connect( m_defaultVelocityInCheckBox, SIGNAL( toggled( bool ) ), - this, SLOT( defaultVelInChanged( bool ) ) ); + connect( &m_defaultVelocityInEnabledModel, SIGNAL( dataChanged() ), + this, SLOT( defaultVelInChanged() ) ); + m_sendEnabledModel.setTrack( m_instrumentTrack ); m_sendCheckBox = new ledCheckBox( tr( "Send MIDI-events" ), m_setupTabWidget, - tr( "Send MIDI-events" ), - _instrument_track ); + tr( "Send MIDI-events" ) ); + m_sendCheckBox->setModel( &m_sendEnabledModel ); m_sendCheckBox->move( 10, 114 ); - connect( m_sendCheckBox, SIGNAL( toggled( bool ) ), - this, SLOT( midiPortModeToggled( bool ) ) ); connect( m_sendCheckBox, SIGNAL( toggled( bool ) ), m_outputChannelSpinBox, SLOT( setEnabled( bool ) ) ); + connect( &m_sendEnabledModel, SIGNAL( dataChanged() ), + this, SLOT( midiPortModeChanged() ) ); + + m_defaultVelocityOutEnabledModel.setTrack( m_instrumentTrack ); m_defaultVelocityOutCheckBox = new ledCheckBox( tr( "Default velocity " "for all output-events" ), m_setupTabWidget, - tr( "Default output velocity" ), - _instrument_track ); + tr( "Default output velocity" ) ); + m_defaultVelocityOutCheckBox->setModel( + &m_defaultVelocityOutEnabledModel ); m_defaultVelocityOutCheckBox->move( 28, 164 ); - connect( m_defaultVelocityOutCheckBox, SIGNAL( toggled( bool ) ), - this, SLOT( defaultVelOutChanged( bool ) ) ); + connect( &m_defaultVelocityOutEnabledModel, SIGNAL( dataChanged() ), + this, SLOT( defaultVelOutChanged() ) ); + const midiPort::modes m = m_midiPort->mode(); - m_receiveCheckBox->setChecked( m == midiPort::INPUT || + m_receiveEnabledModel.setValue( m == midiPort::INPUT || m == midiPort::DUPLEX ); - m_sendCheckBox->setChecked( m == midiPort::OUTPUT || + m_sendEnabledModel.setValue( m == midiPort::OUTPUT || m == midiPort::DUPLEX ); // when using with non-raw-clients we can provide buttons showing @@ -173,7 +193,6 @@ midiTabWidget::midiTabWidget( instrumentTrack * _instrument_track, mc->connectRPChanged( this, SLOT( readablePortsChanged() ) ); mc->connectWPChanged( this, SLOT( writeablePortsChanged() ) ); } - } @@ -188,15 +207,16 @@ midiTabWidget::~midiTabWidget() void midiTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) { - m_inputChannelSpinBox->saveSettings( _doc, _this, "inputchannel" ); - m_outputChannelSpinBox->saveSettings( _doc, _this, "outputchannel" ); - m_receiveCheckBox->saveSettings( _doc, _this, "receive" ); - m_sendCheckBox->saveSettings( _doc, _this, "send" ); - m_defaultVelocityInCheckBox->saveSettings( _doc, _this, "defvelin" ); - m_defaultVelocityOutCheckBox->saveSettings( _doc, _this, "defvelout" ); + m_inputChannelModel.saveSettings( _doc, _this, "inputchannel" ); + m_outputChannelModel.saveSettings( _doc, _this, "outputchannel" ); + m_receiveEnabledModel.saveSettings( _doc, _this, "receive" ); + m_sendEnabledModel.saveSettings( _doc, _this, "send" ); + m_defaultVelocityInEnabledModel.saveSettings( _doc, _this, "defvelin" ); + m_defaultVelocityOutEnabledModel.saveSettings( _doc, _this, "defvelout" ); - if( m_readablePorts != NULL && m_receiveCheckBox->isChecked() == TRUE ) + if( m_readablePorts != NULL && m_receiveEnabledModel.value() == TRUE ) { + // TODO: M/V-split! QString rp; QList actions = m_readablePorts->actions(); for( QList::iterator it = actions.begin(); @@ -215,8 +235,9 @@ void midiTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "inports", rp ); } - if( m_writeablePorts != NULL && m_sendCheckBox->isChecked() == TRUE ) + if( m_writeablePorts != NULL && m_sendEnabledModel.value() == TRUE ) { + // TODO: M/V-split! QString wp; QList actions = m_writeablePorts->actions(); for( QList::iterator it = actions.begin(); @@ -241,17 +262,18 @@ void midiTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) void midiTabWidget::loadSettings( const QDomElement & _this ) { - m_inputChannelSpinBox->loadSettings( _this, "inputchannel" ); - m_outputChannelSpinBox->loadSettings( _this, "outputchannel" ); - m_receiveCheckBox->loadSettings( _this, "receive" ); - m_sendCheckBox->loadSettings( _this, "send" ); - m_defaultVelocityInCheckBox->loadSettings( _this, "defvelin" ); - m_defaultVelocityOutCheckBox->loadSettings( _this, "defvelout" ); + m_inputChannelModel.loadSettings( _this, "inputchannel" ); + m_outputChannelModel.loadSettings( _this, "outputchannel" ); + m_receiveEnabledModel.loadSettings( _this, "receive" ); + m_sendEnabledModel.loadSettings( _this, "send" ); + m_defaultVelocityInEnabledModel.loadSettings( _this, "defvelin" ); + m_defaultVelocityOutEnabledModel.loadSettings( _this, "defvelout" ); // restore connections - if( m_readablePorts != NULL && m_receiveCheckBox->isChecked() == TRUE ) + if( m_readablePorts != NULL && m_receiveEnabledModel.value() == TRUE ) { + // TODO: M/V-split! QStringList rp = _this.attribute( "inports" ).split( ',' ); QList actions = m_readablePorts->actions(); for( QList::iterator it = actions.begin(); @@ -266,8 +288,9 @@ void midiTabWidget::loadSettings( const QDomElement & _this ) } } - if( m_writeablePorts != NULL && m_sendCheckBox->isChecked() == TRUE ) + if( m_writeablePorts != NULL && m_sendEnabledModel.value() == TRUE ) { + // TODO: M/V-split! QStringList wp = _this.attribute( "outports" ).split( ',' ); QList actions = m_writeablePorts->actions(); for( QList::iterator it = actions.begin(); @@ -286,41 +309,43 @@ void midiTabWidget::loadSettings( const QDomElement & _this ) -void midiTabWidget::inputChannelChanged( int _new_chnl ) +void midiTabWidget::inputChannelChanged( void ) { - m_midiPort->setInputChannel( _new_chnl - 1 ); + m_midiPort->setInputChannel( m_inputChannelModel.value() - 1 ); engine::getSongEditor()->setModified(); } -void midiTabWidget::outputChannelChanged( int _new_chnl ) +void midiTabWidget::outputChannelChanged( void ) { - m_midiPort->setOutputChannel( _new_chnl - 1 ); + m_midiPort->setOutputChannel( m_outputChannelModel.value() - 1 ); engine::getSongEditor()->setModified(); } -void midiTabWidget::defaultVelInChanged( bool _on ) +void midiTabWidget::defaultVelInChanged( void ) { - m_midiPort->enableDefaultVelocityForInEvents( _on ); + m_midiPort->enableDefaultVelocityForInEvents( + m_defaultVelocityInEnabledModel.value() ); } -void midiTabWidget::defaultVelOutChanged( bool _on ) +void midiTabWidget::defaultVelOutChanged( void ) { - m_midiPort->enableDefaultVelocityForOutEvents( _on ); + m_midiPort->enableDefaultVelocityForOutEvents( + m_defaultVelocityOutEnabledModel.value() ); } -void midiTabWidget::midiPortModeToggled( bool ) +void midiTabWidget::midiPortModeChanged( void ) { // this small lookup-table makes everything easier static const midiPort::modes modeTable[2][2] = @@ -328,11 +353,11 @@ void midiTabWidget::midiPortModeToggled( bool ) { midiPort::DUMMY, midiPort::OUTPUT }, { midiPort::INPUT, midiPort::DUPLEX } } ; - m_midiPort->setMode( modeTable[m_receiveCheckBox->isChecked()] - [m_sendCheckBox->isChecked()] ); + m_midiPort->setMode( modeTable[m_receiveEnabledModel.value()] + [m_sendEnabledModel.value()] ); // check whether we have to dis-check items in connection-menu - if( m_readablePorts != NULL && m_receiveCheckBox->isChecked() == FALSE ) + if( m_readablePorts != NULL && m_receiveEnabledModel.value() == FALSE ) { QList actions = m_readablePorts->actions(); for( QList::iterator it = actions.begin(); @@ -345,7 +370,8 @@ void midiTabWidget::midiPortModeToggled( bool ) } } } - if( m_writeablePorts != NULL && m_sendCheckBox->isChecked() == FALSE ) + + if( m_writeablePorts != NULL && m_sendEnabledModel.value() == FALSE ) { QList actions = m_writeablePorts->actions(); for( QList::iterator it = actions.begin(); @@ -435,7 +461,7 @@ void midiTabWidget::activatedReadablePort( QAction * _item ) m_midiPort->mode() != midiPort::INPUT && m_midiPort->mode() != midiPort::DUPLEX ) { - m_receiveCheckBox->setChecked( TRUE ); + m_receiveEnabledModel.setValue( TRUE ); } engine::getMixer()->getMIDIClient()->subscribeReadablePort( m_midiPort, _item->text(), !_item->isChecked() ); @@ -451,7 +477,7 @@ void midiTabWidget::activatedWriteablePort( QAction * _item ) m_midiPort->mode() != midiPort::OUTPUT && m_midiPort->mode() != midiPort::DUPLEX ) { - m_sendCheckBox->setChecked( TRUE ); + m_sendEnabledModel.setValue( TRUE ); } engine::getMixer()->getMIDIClient()->subscribeWriteablePort( m_midiPort, _item->text(), !_item->isChecked() ); diff --git a/src/core/mv_base.cpp b/src/core/mv_base.cpp new file mode 100644 index 000000000..3eb7ded89 --- /dev/null +++ b/src/core/mv_base.cpp @@ -0,0 +1,64 @@ +/* + * mv_base.cpp - base for M/V-architecture of LMMS + * + * Copyright (c) 2007 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include + +#include + + +#include "mv_base.h" + + +void modelView::setModel( model * _model, bool _old_model_valid ) +{ + QWidget * w = dynamic_cast( this ); + assert( w != NULL ); + + if( _old_model_valid && m_model != NULL ) + { + if( m_model->defaultConstructed() ) + { + delete m_model; + } + else + { + m_model->disconnect( w ); + } + } + + m_model = _model; + QObject::connect( _model, SIGNAL( dataChanged() ), + w, SLOT( update() ) ); + QObject::connect( _model, SIGNAL( propertiesChanged() ), + w, SLOT( update() ) ); + + w->update(); + + modelChanged(); +} + + + +#include "mv_base.moc" + diff --git a/src/core/note.cpp b/src/core/note.cpp index 84dea4cc2..a2bdd9e6c 100644 --- a/src/core/note.cpp +++ b/src/core/note.cpp @@ -30,7 +30,7 @@ #include #include "note.h" -#include "automatable_object_templates.h" +#include "automatable_model_templates.h" #include "detuning_helper.h" #include "templates.h" diff --git a/src/core/note_play_handle.cpp b/src/core/note_play_handle.cpp index 0aaed5906..c8af5a3cb 100644 --- a/src/core/note_play_handle.cpp +++ b/src/core/note_play_handle.cpp @@ -27,7 +27,7 @@ #include "note_play_handle.h" -#include "automatable_object_templates.h" +#include "automatable_model_templates.h" #include "config_mgr.h" #include "detuning_helper.h" #include "envelope_tab_widget.h" @@ -436,10 +436,14 @@ bool notePlayHandle::operator==( const notePlayHandle & _nph ) const void notePlayHandle::updateFrequency( void ) { - float pitch = (float)( tone() - m_instrumentTrack->baseTone() + + const int base_tone = m_instrumentTrack->baseNoteModel()->value() % + NOTES_PER_OCTAVE; + const int base_octave = m_instrumentTrack->baseNoteModel()->value() / + NOTES_PER_OCTAVE; + const float pitch = (float)( tone() - base_tone + engine::getSongEditor()->masterPitch() ) / 12.0f + - (float)( octave() - m_instrumentTrack->baseOctave() ) - + m_base_detuning->value() / 12.0f; + (float)( octave() - base_octave ) + + m_base_detuning->value() / 12.0f; m_frequency = BASE_FREQ * powf( 2.0f, pitch ); for( notePlayHandleVector::iterator it = m_subNotes.begin(); diff --git a/src/core/piano_roll.cpp b/src/core/piano_roll.cpp index 19c73fe78..da0e136d6 100644 --- a/src/core/piano_roll.cpp +++ b/src/core/piano_roll.cpp @@ -48,7 +48,6 @@ #include -#include "automatable_object_templates.h" #include "clipboard.h" #include "combobox.h" #include "debug.h" @@ -127,6 +126,9 @@ const int DEFAULT_PR_PPT = KEY_LINE_HEIGHT * DEFAULT_STEPS_PER_TACT; pianoRoll::pianoRoll( void ) : + m_zoomingModel( new comboBoxModel( /* this */ ) ), + m_quantizeModel( new comboBoxModel( /* this */ ) ), + m_noteLenModel( new comboBoxModel( /* this */ ) ), m_pattern( NULL ), m_currentPosition(), m_recording( FALSE ), @@ -344,49 +346,51 @@ pianoRoll::pianoRoll( void ) : zoom_lbl->setPixmap( embed::getIconPixmap( "zoom" ) ); // setup zooming-stuff - m_zoomingComboBox = new comboBox( m_toolBar, NULL, NULL ); - m_zoomingComboBox->setFixedSize( 80, 22 ); for( int i = 0; i < 6; ++i ) { - m_zoomingComboBox->addItem( QString::number( 25 << i ) + "%" ); + m_zoomingModel->addItem( QString::number( 25 << i ) + "%" ); } - m_zoomingComboBox->setValue( m_zoomingComboBox->findText( - "100%" ) ); - connect( m_zoomingComboBox, SIGNAL( activated( const QString & ) ), - this, SLOT( zoomingChanged( const QString & ) ) ); + m_zoomingModel->setValue( m_zoomingModel->findText( "100%" ) ); + connect( m_zoomingModel, SIGNAL( dataChanged() ), + this, SLOT( zoomingChanged() ) ); + m_zoomingComboBox = new comboBox( m_toolBar ); + m_zoomingComboBox->setModel( m_zoomingModel ); + m_zoomingComboBox->setFixedSize( 80, 22 ); // setup quantize-stuff QLabel * quantize_lbl = new QLabel( m_toolBar ); quantize_lbl->setPixmap( embed::getIconPixmap( "quantize" ) ); - m_quantizeComboBox = new comboBox( m_toolBar, NULL, NULL ); - m_quantizeComboBox->setFixedSize( 60, 22 ); for( int i = 0; i < 7; ++i ) { - m_quantizeComboBox->addItem( "1/" + QString::number( 1 << i ) ); + m_quantizeModel->addItem( "1/" + QString::number( 1 << i ) ); } - m_quantizeComboBox->setValue( m_quantizeComboBox->findText( - "1/16" ) ); + m_quantizeModel->setValue( m_quantizeModel->findText( "1/16" ) ); + m_quantizeComboBox = new comboBox( m_toolBar ); + m_quantizeComboBox->setModel( m_quantizeModel ); + m_quantizeComboBox->setFixedSize( 60, 22 ); + // setup note-len-stuff QLabel * note_len_lbl = new QLabel( m_toolBar ); note_len_lbl->setPixmap( embed::getIconPixmap( "note" ) ); - m_noteLenComboBox = new comboBox( m_toolBar, NULL, NULL ); - m_noteLenComboBox->setFixedSize( 120, 22 ); - m_noteLenComboBox->addItem( tr( "Last note" ), - embed::getIconPixmap( "edit_draw" ) ); + m_noteLenModel->addItem( tr( "Last note" ), new QPixmap( + embed::getIconPixmap( "edit_draw" ) ) ); const QString pixmaps[] = { "whole", "half", "quarter", "eighth", "sixteenth", "thirtysecond" } ; for( int i = 0; i < 6; ++i ) { - m_noteLenComboBox->addItem( "1/" + QString::number( 1 << i ), - embed::getIconPixmap( + m_noteLenModel->addItem( "1/" + QString::number( 1 << i ), + new QPixmap( embed::getIconPixmap( QString( "note_" + pixmaps[i] ). - toAscii().constData() ) ); + toAscii().constData() ) ) ); } - m_noteLenComboBox->setValue( 0 ); + m_noteLenModel->setValue( 0 ); + m_noteLenComboBox = new comboBox( m_toolBar ); + m_noteLenComboBox->setModel( m_noteLenModel ); + m_noteLenComboBox->setFixedSize( 120, 22 ); tb_layout->addSpacing( 5 ); @@ -1994,8 +1998,8 @@ void pianoRoll::wheelEvent( QWheelEvent * _we ) m_ppt /= 2; } // update combobox with zooming-factor - m_zoomingComboBox->setValue( - m_zoomingComboBox->findText( QString::number( + m_zoomingModel->setValue( + m_zoomingModel->findText( QString::number( static_cast( m_ppt * 100 / DEFAULT_PR_PPT ) ) +"%" ) ); // update timeline @@ -2459,9 +2463,10 @@ void pianoRoll::updatePosition( const midiTime & _t ) -void pianoRoll::zoomingChanged( const QString & _zfac ) +void pianoRoll::zoomingChanged( void ) { - m_ppt = _zfac.left( _zfac.length() - 1 ).toInt() * DEFAULT_PR_PPT / 100; + const QString & zfac = m_zoomingModel->currentText(); + m_ppt = zfac.left( zfac.length() - 1 ).toInt() * DEFAULT_PR_PPT / 100; #ifdef LMMS_DEBUG assert( m_ppt > 0 ); #endif @@ -2475,8 +2480,8 @@ void pianoRoll::zoomingChanged( const QString & _zfac ) int pianoRoll::quantization( void ) const { - return( 64 / m_quantizeComboBox->currentText().right( - m_quantizeComboBox->currentText().length() - + return( 64 / m_quantizeModel->currentText().right( + m_quantizeModel->currentText().length() - 2 ).toInt() ); } @@ -2485,12 +2490,12 @@ int pianoRoll::quantization( void ) const midiTime pianoRoll::newNoteLen( void ) const { - if( m_noteLenComboBox->value() == 0 ) + if( m_noteLenModel->value() == 0 ) { return( m_lenOfNewNotes ); } - return( 64 / m_noteLenComboBox->currentText().right( - m_noteLenComboBox->currentText().length() - + return( 64 / m_noteLenModel->currentText().right( + m_noteLenModel->currentText().length() - 2 ).toInt() ); } diff --git a/src/core/piano_widget.cpp b/src/core/piano_widget.cpp index 683e8dd13..0511c0f27 100644 --- a/src/core/piano_widget.cpp +++ b/src/core/piano_widget.cpp @@ -35,8 +35,8 @@ #include -#include "automatable_object_templates.h" #include "caption_menu.h" +#include "automatable_model_templates.h" #include "embed.h" #include "gui_templates.h" #include "instrument_track.h" @@ -86,8 +86,13 @@ pianoWidget::pianoWidget( instrumentTrack * _parent ) : m_instrumentTrack( _parent ), m_startTone( C ), m_startOctave( OCTAVE_3 ), - m_lastKey( -1 ) + m_lastKey( -1 ), + m_keyCode( 0 ) { + connect( m_instrumentTrack->baseNoteModel(), SIGNAL( dataChanged() ), + this, SLOT( update( void ) ) ); + + setFocusPolicy( Qt::StrongFocus ); if( s_whiteKeyPm == NULL ) @@ -128,13 +133,6 @@ pianoWidget::pianoWidget( instrumentTrack * _parent ) : connect( m_pianoScroll, SIGNAL( valueChanged( int ) ), this, SLOT( pianoScrolled( int ) ) ); - - m_noteKnob = new knob( knobDark_28, NULL, tr( "Base note" ), _parent ); - m_noteKnob->setRange( 0, NOTES_PER_OCTAVE * OCTAVES - 1, 1.0f ); - m_noteKnob->setInitValue( DEFAULT_OCTAVE * NOTES_PER_OCTAVE + A ); - - connect( m_noteKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( updateBaseNote( void ) ) ); } @@ -142,7 +140,6 @@ pianoWidget::pianoWidget( instrumentTrack * _parent ) : pianoWidget::~pianoWidget() { - delete m_noteKnob; } @@ -218,10 +215,10 @@ void pianoWidget::contextMenuEvent( QContextMenuEvent * _me ) return; } - captionMenu contextMenu( m_noteKnob->accessibleName() ); + captionMenu contextMenu( tr( "Base note" ) ); contextMenu.addAction( embed::getIconPixmap( "automation" ), tr( "&Open in automation editor" ), - m_noteKnob->getAutomationPattern(), + m_instrumentTrack->baseNoteModel()->getAutomationPattern(), SLOT( openInAutomationEditor() ) ); contextMenu.exec( QCursor::pos() ); } @@ -265,8 +262,8 @@ void pianoWidget::mousePressEvent( QMouseEvent * _me ) } else { - m_noteKnob->setInitValue( key_num ); - m_instrumentTrack->setBaseNote( key_num ); + m_instrumentTrack->baseNoteModel()-> + setInitValue( key_num ); } // and let the user see that he pressed a key... :) @@ -343,8 +340,8 @@ void pianoWidget::mouseMoveEvent( QMouseEvent * _me ) } else { - m_noteKnob->setInitValue( key_num ); - m_instrumentTrack->setBaseNote( key_num ); + m_instrumentTrack->baseNoteModel()-> + setInitValue( key_num ); } } // and let the user see that he pressed a key... :) @@ -364,7 +361,7 @@ void pianoWidget::mouseMoveEvent( QMouseEvent * _me ) int pianoWidget::getKeyFromKeyboard( int _k ) const { - switch( m_keycode ) + switch( m_keyCode ) { case 52: return( 0 ); // Y case 39: return( 1 ); // S @@ -547,8 +544,7 @@ void pianoWidget::paintEvent( QPaintEvent * ) p.setPen( QColor ( 0xFF, 0xFF, 0xFF ) ); - int base_key = m_instrumentTrack->baseTone() + - m_instrumentTrack->baseOctave() * NOTES_PER_OCTAVE; + int base_key = m_instrumentTrack->baseNoteModel()->value(); if( KEY_ORDER[base_key % NOTES_PER_OCTAVE] == WHITE_KEY ) { p.fillRect( QRect( getKeyX( base_key ), 1, PW_WHITE_KEY_WIDTH-1, @@ -656,44 +652,6 @@ void pianoWidget::paintEvent( QPaintEvent * ) -void pianoWidget::updateBaseNote( void ) -{ - m_instrumentTrack->setBaseNote( (int)roundf( m_noteKnob->value() ), - FALSE ); - update(); -} - - - - -void pianoWidget::saveSettings( QDomDocument & _doc, QDomElement & _this, - const QString & _name ) -{ - m_noteKnob->saveSettings( _doc, _this, _name ); -} - - - - -void pianoWidget::loadSettings( const QDomElement & _this, - const QString & _name ) -{ - if( _this.hasAttribute( "baseoct" ) ) - { - m_noteKnob->setInitValue( _this.attribute( "baseoct" ).toInt() - * NOTES_PER_OCTAVE - + _this.attribute( "basetone" ).toInt() ); - } - else - { - m_noteKnob->loadSettings( _this, _name ); - } - updateBaseNote(); -} - - - - #ifdef BUILD_LINUX bool pianoWidget::x11Event( XEvent * _xe ) { @@ -701,7 +659,7 @@ bool pianoWidget::x11Event( XEvent * _xe ) { case KeyPress: case KeyRelease: - m_keycode = _xe->xkey.keycode; + m_keyCode = _xe->xkey.keycode; } return( FALSE ); } diff --git a/src/core/preset_preview_play_handle.cpp b/src/core/preset_preview_play_handle.cpp index a03a88105..0c07224cd 100644 --- a/src/core/preset_preview_play_handle.cpp +++ b/src/core/preset_preview_play_handle.cpp @@ -30,6 +30,7 @@ #include #include "preset_preview_play_handle.h" +#include "automatable_model_templates.h" #include "debug.h" #include "engine.h" #include "instrument_track.h" diff --git a/src/core/sample_play_handle.cpp b/src/core/sample_play_handle.cpp index fa1a4eb8d..a1b3aa820 100644 --- a/src/core/sample_play_handle.cpp +++ b/src/core/sample_play_handle.cpp @@ -26,6 +26,7 @@ #include "sample_play_handle.h" +#include "automatable_model_templates.h" #include "audio_port.h" #include "bb_track.h" #include "engine.h" @@ -43,7 +44,8 @@ samplePlayHandle::samplePlayHandle( const QString & _sample_file ) : m_frame( 0 ), m_audioPort( new audioPort( "samplePlayHandle" ) ), m_ownAudioPort( TRUE ), - m_volume( 1.0f ), + m_defaultVolumeModel( 1.0f, 0.0f, 4.0f, 0.001f/* this*/ ), + m_volumeModel( &m_defaultVolumeModel ), m_track( NULL ), m_bbTrack( NULL ) { @@ -59,7 +61,8 @@ samplePlayHandle::samplePlayHandle( sampleBuffer * _sample_buffer ) : m_frame( 0 ), m_audioPort( new audioPort( "samplePlayHandle" ) ), m_ownAudioPort( TRUE ), - m_volume( 1.0f ), + m_defaultVolumeModel( 1.0f, 0.0f, 4.0f, 0.001f/* this*/ ), + m_volumeModel( &m_defaultVolumeModel ), m_track( NULL ), m_bbTrack( NULL ) { @@ -75,7 +78,8 @@ samplePlayHandle::samplePlayHandle( sampleTCO * _tco ) : m_frame( 0 ), m_audioPort( ( (sampleTrack *)_tco->getTrack() )->getAudioPort() ), m_ownAudioPort( FALSE ), - m_volume( 1.0f ), + m_defaultVolumeModel( 1.0f, 0.0f, 4.0f, 0.001f/* this*/ ), + m_volumeModel( &m_defaultVolumeModel ), m_track( _tco->getTrack() ), m_bbTrack( NULL ) { @@ -91,7 +95,8 @@ samplePlayHandle::samplePlayHandle( pattern * _pattern ) : m_frame( 0 ), m_audioPort( _pattern->getInstrumentTrack()->getAudioPort() ), m_ownAudioPort( FALSE ), - m_volume( 1.0f ), + m_defaultVolumeModel( 1.0f, 0.0f, 4.0f, 0.001f/* this*/ ), + m_volumeModel( &m_defaultVolumeModel ), m_track( _pattern->getInstrumentTrack() ), m_bbTrack( NULL ) { @@ -125,9 +130,11 @@ void samplePlayHandle::play( bool /* _try_parallelizing */ ) && !( m_bbTrack && m_bbTrack->muted() ) ) { sampleFrame * buf = new sampleFrame[frames]; - volumeVector v = { { m_volume, m_volume + volumeVector v = { { m_volumeModel->value(), + m_volumeModel->value() #ifndef DISABLE_SURROUND - , m_volume, m_volume + , m_volumeModel->value(), + m_volumeModel->value() #endif } } ; m_sampleBuffer->play( buf, &m_state, frames ); @@ -169,18 +176,4 @@ f_cnt_t samplePlayHandle::totalFrames( void ) const -void samplePlayHandle::setVolume( float _new_volume ) -{ - if( _new_volume <= MAX_VOLUME ) - { - m_volume = _new_volume / 100.0f; - } -} - - - - -#include "sample_play_handle.moc" - - #endif diff --git a/src/core/setup_dialog.cpp b/src/core/setup_dialog.cpp index 776f38e48..271070c4b 100644 --- a/src/core/setup_dialog.cpp +++ b/src/core/setup_dialog.cpp @@ -109,10 +109,7 @@ setupDialog::setupDialog( configTabs _tab_to_open ) : m_disableChActInd( configManager::inst()->value( "ui", "disablechannelactivityindicators" ).toInt() ), m_manualChPiano( configManager::inst()->value( "ui", - "manualchannelpiano" ).toInt() ), - m_parLevel( configManager::inst()->value( "mixer", - "parallelizinglevel" ).toInt() ) - + "manualchannelpiano" ).toInt() ) { setWindowIcon( embed::getIconPixmap( "setup_general" ) ); setWindowTitle( tr( "Setup LMMS" ) ); @@ -182,7 +179,7 @@ setupDialog::setupDialog( configTabs _tab_to_open ) : ledCheckBox * enable_tooltips = new ledCheckBox( tr( "Enable tooltips" ), - misc_tw, NULL, NULL ); + misc_tw ); enable_tooltips->move( 10, 18 ); enable_tooltips->setChecked( m_toolTips ); connect( enable_tooltips, SIGNAL( toggled( bool ) ), @@ -192,8 +189,7 @@ setupDialog::setupDialog( configTabs _tab_to_open ) : ledCheckBox * classical_knob_usability = new ledCheckBox( tr( "Classical knob usability (move " "cursor around knob to change " - "value)" ), - misc_tw, NULL, NULL ); + "value)" ), misc_tw ); classical_knob_usability->move( 10, 36 ); classical_knob_usability->setChecked( m_classicalKnobUsability ); connect( classical_knob_usability, SIGNAL( toggled( bool ) ), @@ -202,7 +198,7 @@ setupDialog::setupDialog( configTabs _tab_to_open ) : ledCheckBox * mdi_windows = new ledCheckBox( tr( "Multiple Document Interface" ), - misc_tw, NULL, NULL ); + misc_tw ); mdi_windows->move( 10, 54 ); mdi_windows->setChecked( m_MDI ); connect( mdi_windows, SIGNAL( toggled( bool ) ), @@ -211,7 +207,7 @@ setupDialog::setupDialog( configTabs _tab_to_open ) : ledCheckBox * wizard = new ledCheckBox( tr( "Show wizard after up-/downgrade" ), - misc_tw, NULL, NULL ); + misc_tw ); wizard->move( 10, 72 ); wizard->setChecked( m_wizard ); connect( wizard, SIGNAL( toggled( bool ) ), @@ -220,7 +216,7 @@ setupDialog::setupDialog( configTabs _tab_to_open ) : ledCheckBox * restart_msg = new ledCheckBox( tr( "Show restart warning after changing settings" ), - misc_tw, NULL, NULL ); + misc_tw ); restart_msg->move( 10, 90 ); restart_msg->setChecked( m_warnAfterSetup ); connect( restart_msg, SIGNAL( toggled( bool ) ), @@ -228,7 +224,7 @@ setupDialog::setupDialog( configTabs _tab_to_open ) : ledCheckBox * dbv = new ledCheckBox( tr( "Display volume as dBV " ), - misc_tw, NULL, NULL ); + misc_tw ); dbv->move( 10, 108 ); dbv->setChecked( m_displaydBV ); connect( dbv, SIGNAL( toggled( bool ) ), @@ -237,7 +233,7 @@ setupDialog::setupDialog( configTabs _tab_to_open ) : ledCheckBox * mmpz = new ledCheckBox( tr( "Compress project files per default" ), - misc_tw, NULL, NULL ); + misc_tw ); mmpz->move( 10, 126 ); mmpz->setChecked( m_MMPZ ); connect( mmpz, SIGNAL( toggled( bool ) ), @@ -411,7 +407,7 @@ setupDialog::setupDialog( configTabs _tab_to_open ) : ledCheckBox * disable_ch_act_ind = new ledCheckBox( tr( "Disable channel activity indicators" ), - ui_fx_tw, NULL, NULL ); + ui_fx_tw ); disable_ch_act_ind->move( 10, 20 ); disable_ch_act_ind->setChecked( m_disableChActInd ); connect( disable_ch_act_ind, SIGNAL( toggled( bool ) ), @@ -420,7 +416,7 @@ setupDialog::setupDialog( configTabs _tab_to_open ) : ledCheckBox * manual_ch_piano = new ledCheckBox( tr( "Only press keys on channel-piano manually" ), - ui_fx_tw, NULL, NULL ); + ui_fx_tw ); manual_ch_piano->move( 10, 40 ); manual_ch_piano->setChecked( m_manualChPiano ); connect( manual_ch_piano, SIGNAL( toggled( bool ) ), @@ -432,34 +428,6 @@ setupDialog::setupDialog( configTabs _tab_to_open ) : performance ); smp_supp_tw->setFixedHeight( 200 ); - QLabel * par_level_lbl = new QLabel( tr( "Parallelizing level" ), - smp_supp_tw ); - par_level_lbl->move( 10, 15 ); - par_level_lbl->setFixedSize( 120, 16 ); - lcdSpinBox * par_level = new lcdSpinBox( 1, 16, 2, smp_supp_tw, NULL, - NULL ); - par_level->setValue( m_parLevel ); - connect( par_level, SIGNAL( valueChanged( int ) ), - this, SLOT( setParallelizingLevel( int ) ) ); - - par_level->move( 140, 20 ); - - QLabel * smp_help = new QLabel( - tr( "If you have a machine with more then one processor " - "(e.g. dual-core systems) you should use a " - "parallelizing-level above 1 which means that LMMS " - "will try to split up sound-processing into several " - "threads which should should be run on several cores " - "by the underlaying operating-system.\n" - "Please note that in some cases parallelizing won't " - "work with small buffer-sizes. If you experience " - "problems (i.e. lot of xruns), try to increase buffer-" - "size." ), smp_supp_tw ); - smp_help->setFixedSize( performance->width() - 20, 140 ); - smp_help->setWordWrap( TRUE ); - smp_help->move( 10, 55 ); - - perf_layout->addWidget( ui_fx_tw ); perf_layout->addSpacing( 15 ); perf_layout->addWidget( smp_supp_tw ); @@ -715,8 +683,6 @@ void setupDialog::accept( void ) QString::number( m_disableChActInd ) ); configManager::inst()->setValue( "ui", "manualchannelpiano", QString::number( m_manualChPiano ) ); - configManager::inst()->setValue( "mixer", "parallelizinglevel", - QString::number( m_parLevel ) ); configManager::inst()->setWorkingDir( m_workingDir ); configManager::inst()->setVSTDir( m_vstDir ); @@ -883,12 +849,6 @@ void setupDialog::toggleManualChPiano( bool _enabled ) -void setupDialog::setParallelizingLevel( int _level ) -{ - m_parLevel = _level; -} - - void setupDialog::openWorkingDir( void ) diff --git a/src/core/song_editor.cpp b/src/core/song_editor.cpp index 4b5561b2e..5b359348e 100644 --- a/src/core/song_editor.cpp +++ b/src/core/song_editor.cpp @@ -49,7 +49,6 @@ #include -#include "automatable_object_templates.h" #include "automatable_slider.h" #include "bb_editor.h" #include "bb_track.h" @@ -82,6 +81,10 @@ songEditor::songEditor( void ) : + m_automationTrack( track::create( track::AUTOMATION_TRACK, this ) ), + m_tempoModel( DEFAULT_BPM, MIN_BPM, MAX_BPM ), + m_masterVolumeModel( 100, 0, 200, 1 ), + m_masterPitchModel( 0, -12, 12, 1 ), m_fileName( "" ), m_oldFileName( "" ), m_exporting( FALSE ), @@ -111,23 +114,24 @@ songEditor::songEditor( void ) : connect( tl, SIGNAL( positionChanged( const midiTime & ) ), this, SLOT( updatePosition( const midiTime & ) ) ); - m_automation_track = track::create( track::AUTOMATION_TRACK, this ); // add some essential widgets to global tool-bar QWidget * tb = engine::getMainWindow()->toolBar(); engine::getMainWindow()->addSpacingToToolBar( 10 ); - m_bpmSpinBox = new lcdSpinBox( MIN_BPM, MAX_BPM, 3, tb, tr( "Tempo" ), - m_automation_track ); - m_bpmSpinBox->setLabel( tr( "TEMPO/BPM" ) ); - connect( m_bpmSpinBox, SIGNAL( valueChanged( int ) ), this, - SLOT( setTempo( int ) ) ); - connect( m_bpmSpinBox, SIGNAL( manualChange() ), this, - SLOT( setModified() ) ); - toolTip::add( m_bpmSpinBox, tr( "tempo of song" ) ); + m_tempoModel.setTrack( m_automationTrack ); + m_tempoSpinBox = new lcdSpinBox( 3, tb, tr( "Tempo" ) ); + m_tempoSpinBox->setModel( &m_tempoModel ); + m_tempoSpinBox->setLabel( tr( "TEMPO/BPM" ) ); + toolTip::add( m_tempoSpinBox, tr( "tempo of song" ) ); - m_bpmSpinBox->setWhatsThis( + connect( &m_tempoModel, SIGNAL( dataChanged() ), + this, SLOT( setTempo() ) ); + connect( m_tempoSpinBox, SIGNAL( manualChange() ), this, + SLOT( setModified() ) ); + + m_tempoSpinBox->setWhatsThis( tr( "The tempo of a song is specified in beats per minute " "(BPM). If you want to change the tempo of your " "song, change this value. Every tact has four beats, " @@ -135,7 +139,7 @@ songEditor::songEditor( void ) : "should be played within a minute (or how many tacts " "should be played within four minutes)." ) ); - int col = engine::getMainWindow()->addWidgetToToolBar( m_bpmSpinBox, + int col = engine::getMainWindow()->addWidgetToToolBar( m_tempoSpinBox, 0 ); @@ -169,12 +173,11 @@ songEditor::songEditor( void ) : QLabel * master_vol_lbl = new QLabel( tb ); master_vol_lbl->setPixmap( embed::getIconPixmap( "master_volume" ) ); - m_masterVolumeSlider = new automatableSlider( tb, tr( "Master volume" ), - m_automation_track ); + m_masterVolumeModel.setTrack( m_automationTrack ); + m_masterVolumeSlider = new automatableSlider( tb, tr( "Master volume" ) ); + m_masterVolumeSlider->setModel( &m_masterVolumeModel ); m_masterVolumeSlider->setOrientation( Qt::Vertical ); - m_masterVolumeSlider->setRange( 0, 200 ); m_masterVolumeSlider->setPageStep( 1 ); - m_masterVolumeSlider->setInitValue( 100 ); m_masterVolumeSlider->setTickPosition( QSlider::TicksLeft ); m_masterVolumeSlider->setFixedSize( 26, 60 ); m_masterVolumeSlider->setTickInterval( 50 ); @@ -199,16 +202,16 @@ songEditor::songEditor( void ) : engine::getMainWindow()->addSpacingToToolBar( 10 ); + QLabel * master_pitch_lbl = new QLabel( tb ); master_pitch_lbl->setPixmap( embed::getIconPixmap( "master_pitch" ) ); master_pitch_lbl->setFixedHeight( 64 ); - m_masterPitchSlider = new automatableSlider( tb, tr( "Master pitch" ), - m_automation_track ); + m_masterPitchModel.setTrack( m_automationTrack ); + m_masterPitchSlider = new automatableSlider( tb, tr( "Master pitch" ) ); + m_masterPitchSlider->setModel( &m_masterPitchModel ); m_masterPitchSlider->setOrientation( Qt::Vertical ); - m_masterPitchSlider->setRange( -12, 12 ); m_masterPitchSlider->setPageStep( 1 ); - m_masterPitchSlider->setInitValue( 0 ); m_masterPitchSlider->setTickPosition( QSlider::TicksLeft ); m_masterPitchSlider->setFixedSize( 26, 60 ); m_masterPitchSlider->setTickInterval( 12 ); @@ -330,17 +333,18 @@ songEditor::songEditor( void ) : zoom_lbl->setPixmap( embed::getIconPixmap( "zoom" ) ); // setup zooming-stuff - m_zoomingComboBox = new comboBox( m_toolBar, NULL, NULL ); + m_zoomingComboBox = new comboBox( m_toolBar ); m_zoomingComboBox->setFixedSize( 80, 22 ); m_zoomingComboBox->move( 580, 4 ); for( int i = 0; i < 7; ++i ) { - m_zoomingComboBox->addItem( QString::number( 25 << i ) + "%" ); + m_zoomingComboBox->model()->addItem( + QString::number( 25 << i ) + "%" ); } - m_zoomingComboBox->setInitValue( m_zoomingComboBox->findText( - "100%" ) ); - connect( m_zoomingComboBox, SIGNAL( activated( const QString & ) ), - this, SLOT( zoomingChanged( const QString & ) ) ); + m_zoomingComboBox->model()->setInitValue( + m_zoomingComboBox->model()->findText( "100%" ) ); + connect( m_zoomingComboBox->model(), SIGNAL( dataChanged() ), + this, SLOT( zoomingChanged( void ) ) ); tb_layout->addSpacing( 5 ); @@ -399,7 +403,7 @@ songEditor::songEditor( void ) : songEditor::~songEditor() { m_playing = FALSE; - delete m_automation_track; + delete m_automationTrack; } @@ -496,10 +500,12 @@ void songEditor::wheelEvent( QWheelEvent * _we ) setPixelsPerTact( (int) pixelsPerTact() / 2 ); } // update combobox with zooming-factor - m_zoomingComboBox->setValue( - m_zoomingComboBox->findText( QString::number( + m_zoomingComboBox->model()->setValue( + m_zoomingComboBox->model()->findText( + QString::number( static_cast( pixelsPerTact() * - 100 / DEFAULT_PIXELS_PER_TACT ) ) + "%" ) ); + 100 / DEFAULT_PIXELS_PER_TACT ) ) + + "%" ) ); // update timeline m_playPos[PLAY_SONG].m_timeLine->setPixelsPerTact( pixelsPerTact() ); @@ -549,7 +555,7 @@ void songEditor::masterVolumePressed( void ) QPoint( 0, 0 ) ) + QPoint( m_masterVolumeSlider->width() + 2, -2 ) ); m_mvsStatus->show(); - masterVolumeMoved( m_masterVolumeSlider->logicValue() ); + masterVolumeMoved( m_masterVolumeModel.value() ); } @@ -597,7 +603,7 @@ void songEditor::masterPitchPressed( void ) QPoint( 0, 0 ) ) + QPoint( m_masterPitchSlider->width() + 2, -2 ) ); m_mpsStatus->show(); - masterPitchMoved( m_masterPitchSlider->logicValue() ); + masterPitchMoved( m_masterPitchModel.value() ); } @@ -644,9 +650,10 @@ void songEditor::updatePosition( const midiTime & _t ) -void songEditor::zoomingChanged( const QString & _zfac ) +void songEditor::zoomingChanged( void ) { - setPixelsPerTact( _zfac.left( _zfac.length() - 1 ).toInt() * + const QString & zfac = m_zoomingComboBox->model()->currentText(); + setPixelsPerTact( zfac.left( zfac.length() - 1 ).toInt() * DEFAULT_PIXELS_PER_TACT / 100 ); m_playPos[PLAY_SONG].m_timeLine->setPixelsPerTact( pixelsPerTact() ); realignTracks(); @@ -655,8 +662,9 @@ void songEditor::zoomingChanged( const QString & _zfac ) -void songEditor::setTempo( int _new_bpm ) +void songEditor::setTempo( void ) { + const bpm_t tempo = m_tempoModel.value(); playHandleVector & phv = engine::getMixer()->playHandles(); for( playHandleVector::iterator it = phv.begin(); it != phv.end(); ++it ) @@ -664,37 +672,13 @@ void songEditor::setTempo( int _new_bpm ) notePlayHandle * nph = dynamic_cast( *it ); if( nph && !nph->released() ) { - nph->resize( _new_bpm ); + nph->resize( tempo ); } } - m_bpmSpinBox->setInitValue( _new_bpm ); +// m_bpmSpinBox->setInitValue( _new_bpm ); engine::updateFramesPerTact64th(); - emit tempoChanged( _new_bpm ); -} - - - - -void songEditor::setMasterVolume( volume _vol ) -{ - m_masterVolumeSlider->setInitValue( _vol ); -} - - - - -void songEditor::setMasterPitch( int _master_pitch ) -{ - m_masterPitchSlider->setInitValue( _master_pitch ); -} - - - - -int songEditor::masterPitch( void ) const -{ - return( m_masterPitchSlider->logicValue() ); + emit tempoChanged( tempo ); } @@ -985,7 +969,7 @@ void songEditor::processNextBuffer( void ) { if( m_playMode == PLAY_SONG ) { - m_automation_track->play( m_playPos[m_playMode], + m_automationTrack->play( m_playPos[m_playMode], played_frames, total_frames_played, tco_num ); } @@ -1236,7 +1220,7 @@ void songEditor::addSampleTrack( void ) bpm_t songEditor::getTempo( void ) { - return( m_bpmSpinBox->value() ); + return( m_tempoModel.value() ); } @@ -1244,7 +1228,7 @@ bpm_t songEditor::getTempo( void ) automationPattern * songEditor::tempoAutomationPattern( void ) { - return( m_bpmSpinBox->getAutomationPattern() ); + return( m_tempoModel.getAutomationPattern() ); } @@ -1263,9 +1247,9 @@ void songEditor::clearProject( void ) clearAllTracks(); engine::getAutomationEditor()->setCurrentPattern( NULL ); - m_bpmSpinBox->getAutomationPattern()->clear(); - m_masterVolumeSlider->clearAutomationValues(); - m_masterPitchSlider->clearAutomationValues(); + m_tempoModel.getAutomationPattern()->clear(); + m_masterVolumeModel.getAutomationPattern()->clear(); + m_masterPitchModel.getAutomationPattern()->clear(); engine::getBBEditor()->clearAllTracks(); engine::getMixer()->unlock(); @@ -1321,9 +1305,9 @@ void songEditor::createNewProject( void ) "tripleoscillator" ); track::create( track::BB_TRACK, this ); - m_bpmSpinBox->setInitValue( DEFAULT_BPM ); - m_masterVolumeSlider->setInitValue( 100 ); - m_masterPitchSlider->setInitValue( 0 ); + m_tempoModel.setInitValue( DEFAULT_BPM ); + m_masterVolumeModel.setInitValue( 100 ); + m_masterPitchModel.setInitValue( 0 ); engine::getProjectJournal()->setJournalling( TRUE ); @@ -1369,9 +1353,9 @@ void FASTCALL songEditor::loadProject( const QString & _file_name ) engine::getMainWindow()->resetWindowTitle(); // get the header information from the DOM - m_bpmSpinBox->loadSettings( mmp.head(), "bpm" ); - m_masterVolumeSlider->loadSettings( mmp.head(), "mastervol" ); - m_masterPitchSlider->loadSettings( mmp.head(), "masterpitch" ); + m_tempoModel.loadSettings( mmp.head(), "bpm" ); + m_masterVolumeModel.loadSettings( mmp.head(), "mastervol" ); + m_masterPitchModel.loadSettings( mmp.head(), "masterpitch" ); // reset loop-point-state m_playPos[PLAY_SONG].m_timeLine->toggleLoopPoints( 0 ); @@ -1432,9 +1416,9 @@ bool songEditor::saveProject( void ) { multimediaProject mmp( multimediaProject::SONG_PROJECT ); - m_bpmSpinBox->saveSettings( mmp, mmp.head(), "bpm" ); - m_masterVolumeSlider->saveSettings( mmp, mmp.head(), "mastervol" ); - m_masterPitchSlider->saveSettings( mmp, mmp.head(), "masterpitch" ); + m_tempoModel.saveSettings( mmp, mmp.head(), "bpm" ); + m_masterVolumeModel.saveSettings( mmp, mmp.head(), "mastervol" ); + m_masterPitchModel.saveSettings( mmp, mmp.head(), "masterpitch" ); ( (journallingObject *)( this ) )->saveState( mmp, mmp.content() ); diff --git a/src/core/surround_area.cpp b/src/core/surround_area.cpp index 2314821e3..b44ae48c5 100644 --- a/src/core/surround_area.cpp +++ b/src/core/surround_area.cpp @@ -34,10 +34,9 @@ #include -#include "automatable_object_templates.h" +#include "automatable_model_templates.h" #include "caption_menu.h" #include "embed.h" -#include "knob.h" #include "templates.h" #include "tooltip.h" @@ -49,25 +48,11 @@ QPixmap * surroundArea::s_backgroundArtwork = NULL; -surroundArea::surroundArea( QWidget * _parent, const QString & _name, - track * _track ) : +surroundArea::surroundArea( QWidget * _parent, const QString & _name ) : QWidget( _parent ), - m_sndSrcPos( QPoint() ) + modelView() { - m_position_x = new knob( knobDark_28, NULL, tr ( "Surround area X" ), - _track ); - m_position_x->setRange( -SURROUND_AREA_SIZE, SURROUND_AREA_SIZE, 1.0f ); - m_position_x->setInitValue( 0.0f ); - - m_position_y = new knob( knobDark_28, NULL, tr ( "Surround area Y" ), - _track ); - m_position_y->setRange( -SURROUND_AREA_SIZE, SURROUND_AREA_SIZE, 1.0f ); - m_position_y->setInitValue( 0.0f ); - - connect( m_position_x, SIGNAL( valueChanged( float ) ), this, - SLOT( updatePositionX( void ) ) ); - connect( m_position_y, SIGNAL( valueChanged( float ) ), this, - SLOT( updatePositionY( void ) ) ); + setModel( new surroundAreaModel( NULL, NULL, TRUE ) ); if( s_backgroundArtwork == NULL ) { @@ -87,71 +72,11 @@ surroundArea::surroundArea( QWidget * _parent, const QString & _name, surroundArea::~surroundArea() { - delete m_position_x; - delete m_position_y; } -volumeVector surroundArea::getVolumeVector( float _v_scale ) const -{ - volumeVector v = { { _v_scale, _v_scale -#ifndef DISABLE_SURROUND - , _v_scale, _v_scale -#endif - } } ; - - if( m_sndSrcPos.x() >= 0 ) - { - v.vol[0] *= 1.0f - m_sndSrcPos.x() / (float)SURROUND_AREA_SIZE; -#ifndef DISABLE_SURROUND - v.vol[2] *= 1.0f - m_sndSrcPos.x() / (float)SURROUND_AREA_SIZE; -#endif - } - else - { - v.vol[1] *= 1.0f + m_sndSrcPos.x() / (float)SURROUND_AREA_SIZE; -#ifndef DISABLE_SURROUND - v.vol[3] *= 1.0f + m_sndSrcPos.x() / (float)SURROUND_AREA_SIZE; -#endif - } - - if( m_sndSrcPos.y() >= 0 ) - { - v.vol[0] *= 1.0f - m_sndSrcPos.y() / (float)SURROUND_AREA_SIZE; - v.vol[1] *= 1.0f - m_sndSrcPos.y() / (float)SURROUND_AREA_SIZE; - } -#ifndef DISABLE_SURROUND - else - { - v.vol[2] *= 1.0f + m_sndSrcPos.y() / (float)SURROUND_AREA_SIZE; - v.vol[3] *= 1.0f + m_sndSrcPos.y() / (float)SURROUND_AREA_SIZE; - } -#endif - - return( v ); -} - - - - -void surroundArea::setValue( const QPoint & _p ) -{ - if( tLimit( _p.x(), -SURROUND_AREA_SIZE, SURROUND_AREA_SIZE ) != - _p.x() || - tLimit( _p.y(), -SURROUND_AREA_SIZE, SURROUND_AREA_SIZE ) != _p.y() ) - { - m_sndSrcPos = QPoint( 0, 0 ); - } - else - { - m_sndSrcPos = _p; - } - update(); -} - - void surroundArea::contextMenuEvent( QContextMenuEvent * ) @@ -165,11 +90,11 @@ void surroundArea::contextMenuEvent( QContextMenuEvent * ) captionMenu contextMenu( accessibleName() ); contextMenu.addAction( embed::getIconPixmap( "automation" ), tr( "Open &X in automation editor" ), - m_position_x->getAutomationPattern(), + model()->automationPatternX(), SLOT( openInAutomationEditor() ) ); contextMenu.addAction( embed::getIconPixmap( "automation" ), tr( "Open &Y in automation editor" ), - m_position_y->getAutomationPattern(), + model()->automationPatternY(), SLOT( openInAutomationEditor() ) ); contextMenu.exec( QCursor::pos() ); } @@ -191,9 +116,9 @@ void surroundArea::paintEvent( QPaintEvent * ) Qt::IgnoreAspectRatio, Qt::SmoothTransformation ) ); } - const int x = ( width() + m_sndSrcPos.x() * ( width() - 4 ) / + const int x = ( width() + model()->x() * ( width() - 4 ) / SURROUND_AREA_SIZE ) / 2; - const int y = ( height() + m_sndSrcPos.y() * ( height() - 4 ) / + const int y = ( height() + model()->y() * ( height() - 4 ) / SURROUND_AREA_SIZE ) / 2; p.setPen( QColor( 64, 255, 64 ) ); p.drawPoint( x, y - 1 ); @@ -213,15 +138,17 @@ void surroundArea::mousePressEvent( QMouseEvent * _me ) return; } + model()->prepareJournalEntryFromOldVal(); + const int w = width();//s_backgroundArtwork->width(); const int h = height();//s_backgroundArtwork->height(); if( _me->x() > 1 && _me->x() < w-1 && _me->y() > 1 && _me->y() < h-1 ) { - m_sndSrcPos.setX( ( _me->x() * 2 - w ) * SURROUND_AREA_SIZE / + model()->setX( ( _me->x() * 2 - w ) * SURROUND_AREA_SIZE / ( w - 4 ) ); - m_sndSrcPos.setY( ( _me->y() * 2 - h ) * SURROUND_AREA_SIZE / + model()->setY( ( _me->y() * 2 - h ) * SURROUND_AREA_SIZE / ( h - 4 ) ); - update(); + //update(); if( _me->button() != Qt::NoButton ) { QApplication::setOverrideCursor( Qt::BlankCursor ); @@ -233,11 +160,6 @@ void surroundArea::mousePressEvent( QMouseEvent * _me ) int y = tLimit( _me->y(), 2, h - 2 ); QCursor::setPos( mapToGlobal( QPoint( x, y ) ) ); } - - m_position_x->setValue( m_sndSrcPos.x() ); - m_position_y->setValue( m_sndSrcPos.y() ); - - emit valueChanged( m_sndSrcPos ); } @@ -253,62 +175,108 @@ void surroundArea::mouseMoveEvent( QMouseEvent * _me ) void surroundArea::mouseReleaseEvent( QMouseEvent * ) { + model()->addJournalEntryFromOldToCurVal(); QApplication::restoreOverrideCursor(); } -void surroundArea::updatePositionX( void ) + + + + +surroundAreaModel::surroundAreaModel( ::model * _parent, track * _track, + bool _default_constructed ) : + model( _parent, _default_constructed ), + m_posX( 0, -SURROUND_AREA_SIZE, SURROUND_AREA_SIZE, 1, _parent ), + m_posY( 0, -SURROUND_AREA_SIZE, SURROUND_AREA_SIZE, 1, _parent ) { - m_sndSrcPos.setX( (int)roundf( m_position_x->value() ) ); - update(); + m_posX.setTrack( _track ); + m_posY.setTrack( _track ); + connect( &m_posX, SIGNAL( dataChanged() ), + this, SIGNAL( dataChanged() ) ); + connect( &m_posY, SIGNAL( dataChanged() ), + this, SIGNAL( dataChanged() ) ); } -void surroundArea::updatePositionY( void ) +volumeVector surroundAreaModel::getVolumeVector( float _v_scale ) const { - m_sndSrcPos.setY( (int)roundf( m_position_y->value() ) ); - update(); + volumeVector v = { { _v_scale, _v_scale +#ifndef DISABLE_SURROUND + , _v_scale, _v_scale +#endif + } } ; + + if( x() >= 0 ) + { + v.vol[0] *= 1.0f - x() / (float)SURROUND_AREA_SIZE; +#ifndef DISABLE_SURROUND + v.vol[2] *= 1.0f - x() / (float)SURROUND_AREA_SIZE; +#endif + } + else + { + v.vol[1] *= 1.0f + x() / (float)SURROUND_AREA_SIZE; +#ifndef DISABLE_SURROUND + v.vol[3] *= 1.0f + x() / (float)SURROUND_AREA_SIZE; +#endif + } + + if( y() >= 0 ) + { + v.vol[0] *= 1.0f - y() / (float)SURROUND_AREA_SIZE; + v.vol[1] *= 1.0f - y() / (float)SURROUND_AREA_SIZE; + } +#ifndef DISABLE_SURROUND + else + { + v.vol[2] *= 1.0f + y() / (float)SURROUND_AREA_SIZE; + v.vol[3] *= 1.0f + y() / (float)SURROUND_AREA_SIZE; + } +#endif + + return( v ); } - -void FASTCALL surroundArea::saveSettings( QDomDocument & _doc, +void surroundAreaModel::saveSettings( QDomDocument & _doc, QDomElement & _this, const QString & _name ) { - m_position_x->saveSettings( _doc, _this, _name + "-x" ); - m_position_y->saveSettings( _doc, _this, _name + "-y" ); + m_posX.saveSettings( _doc, _this, _name + "-x" ); + m_posY.saveSettings( _doc, _this, _name + "-y" ); } -void FASTCALL surroundArea::loadSettings( const QDomElement & _this, +void surroundAreaModel::loadSettings( const QDomElement & _this, const QString & _name ) { if( _this.hasAttribute( _name ) ) { - int i = _this.attribute( _name ).toInt(); - setValue( QPoint( ( i & 0xFFFF ) - 2 * SURROUND_AREA_SIZE, - ( i >> 16 ) - 2 * SURROUND_AREA_SIZE) ); - m_position_x->setValue( m_sndSrcPos.x() ); - m_position_y->setValue( m_sndSrcPos.y() ); + const int i = _this.attribute( _name ).toInt(); + m_posX.setValue( ( i & 0xFFFF ) - 2 * SURROUND_AREA_SIZE ); + m_posY.setValue( ( i >> 16 ) - 2 * SURROUND_AREA_SIZE ); } else { - m_position_x->loadSettings( _this, _name + "-x" ); - m_position_y->loadSettings( _this, _name + "-y" ); + m_posX.loadSettings( _this, _name + "-x" ); + m_posY.loadSettings( _this, _name + "-y" ); } } + + + #include "surround_area.moc" diff --git a/src/core/track.cpp b/src/core/track.cpp index 0f8a19c78..7d4d91616 100644 --- a/src/core/track.cpp +++ b/src/core/track.cpp @@ -966,8 +966,8 @@ trackOperationsWidget::trackOperationsWidget( trackWidget * _parent ) : toolTip::add( m_trackOps, tr( "Actions for this track" ) ); - m_muteBtn = new pixmapButton( this, tr( "Mute" ), - m_trackWidget->getTrack() ); + m_muteBtn = new pixmapButton( this, tr( "Mute" ) ); + m_muteBtn->model()->setTrack( m_trackWidget->getTrack() ); m_muteBtn->setActiveGraphic( *s_muteOnEnabled ); m_muteBtn->setInactiveGraphic( *s_muteOffEnabled ); m_muteBtn->setCheckable( TRUE ); @@ -1009,7 +1009,7 @@ trackOperationsWidget::~trackOperationsWidget() bool trackOperationsWidget::muted( void ) const { - return( m_muteBtn->isChecked() ); + return( m_muteBtn->model()->value() ); } diff --git a/src/core/track_container.cpp b/src/core/track_container.cpp index 6e8ca2ef4..e55177f8f 100644 --- a/src/core/track_container.cpp +++ b/src/core/track_container.cpp @@ -36,6 +36,7 @@ #include +#include "automatable_model_templates.h" #include "bb_track.h" #include "config_mgr.h" #include "debug.h" @@ -87,7 +88,7 @@ trackContainer::~trackContainer() { while( !m_tracks.empty() ) { - delete m_tracks.takeFirst(); + delete m_tracks.takeLast(); } } @@ -281,7 +282,7 @@ void trackContainer::clearAllTracks( void ) { while( !m_tracks.empty() ) { - removeTrack( m_tracks.front() ); + removeTrack( m_tracks.last() ); } } diff --git a/src/tracks/instrument_track.cpp b/src/tracks/instrument_track.cpp index bc9636830..f9296a4c2 100644 --- a/src/tracks/instrument_track.cpp +++ b/src/tracks/instrument_track.cpp @@ -44,6 +44,7 @@ #include "arp_and_chords_tab_widget.h" #include "audio_port.h" +#include "automatable_model_templates.h" #include "automation_pattern.h" #include "config_mgr.h" #include "debug.h" @@ -56,7 +57,6 @@ #include "fade_button.h" #include "gui_templates.h" #include "instrument.h" -#include "lcd_spinbox.h" #include "led_checkbox.h" #include "main_window.h" #include "midi_client.h" @@ -69,7 +69,6 @@ #include "sample_play_handle.h" #include "song_editor.h" #include "string_pair_drag.h" -#include "surround_area.h" #include "tab_widget.h" #include "tooltip.h" #include "volume_knob.h" @@ -103,12 +102,26 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : tr( "unnamed_channel" ) ) ), m_audioPort( new audioPort( tr( "unnamed_channel" ) ) ), m_notes(), - m_baseTone( A ), - m_baseOctave( OCTAVE_4 ), + m_baseNoteModel( 0, 0, NOTES_PER_OCTAVE * OCTAVES - 1, 1/* this */ ), + m_volumeModel( DEFAULT_VOLUME, MIN_VOLUME, MAX_VOLUME, + 1.0f /* this */ ), + m_surroundAreaModel( NULL /* this */, this ), + m_effectChannelModel( DEFAULT_EFFECT_CHANNEL, + MIN_EFFECT_CHANNEL, MAX_EFFECT_CHANNEL + /* this */ ), m_instrument( NULL ), m_midiInputAction( NULL ), m_midiOutputAction( NULL ) { + m_baseNoteModel.setTrack( this ); + m_baseNoteModel.setInitValue( DEFAULT_OCTAVE * NOTES_PER_OCTAVE + A ); + connect( &m_baseNoteModel, SIGNAL( dataChanged() ), + this, SLOT( updateBaseNote() ) ); + + m_volumeModel.setTrack( this ); + m_effectChannelModel.setTrack( this ); + + for( int i = 0; i < NOTES; ++i ) { m_notes[i] = NULL; @@ -122,15 +135,12 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : // creation of widgets for track-settings-widget m_tswVolumeKnob = new volumeKnob( knobSmall_17, getTrackSettingsWidget(), - tr( "Channel volume" ), this ); - m_tswVolumeKnob->setRange( MIN_VOLUME, MAX_VOLUME, 1.0f ); - m_tswVolumeKnob->setInitValue( DEFAULT_VOLUME ); + tr( "Channel volume" ) ); + m_tswVolumeKnob->setModel( &m_volumeModel ); m_tswVolumeKnob->setHintText( tr( "Channel volume:" ) + " ", "%" ); m_tswVolumeKnob->move( 4, 4 ); m_tswVolumeKnob->setLabel( tr( "VOL" ) ); m_tswVolumeKnob->show(); -/* connect( m_tswVolumeKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( volValueChanged( float ) ) );*/ m_tswVolumeKnob->setWhatsThis( tr( volume_help ) ); QPushButton * tsw_midi = new QPushButton( @@ -184,39 +194,28 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : // setup volume-knob m_volumeKnob = new volumeKnob( knobBright_26, m_generalSettingsWidget, - tr( "Channel volume" ), this ); + tr( "Channel volume" ) ); + m_volumeKnob->setModel( &m_volumeModel ); m_volumeKnob->move( 10, 44 ); - m_volumeKnob->setRange( MIN_VOLUME, MAX_VOLUME, 1.0f ); - m_volumeKnob->setInitValue( DEFAULT_VOLUME ); m_volumeKnob->setHintText( tr( "Channel volume:" ) + " ", "%" ); m_volumeKnob->setLabel( tr( "VOLUME" ) ); m_volumeKnob->setWhatsThis( tr( volume_help ) ); -/* connect( m_volumeKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( volValueChanged( float ) ) );*/ - volumeKnob::linkObjects( m_tswVolumeKnob, m_volumeKnob ); + //volumeKnob::linkObjects( m_tswVolumeKnob, m_volumeKnob ); // setup surround-area m_surroundArea = new surroundArea( m_generalSettingsWidget, - tr( "Surround area" ), this ); + tr( "Surround area" ) ); + m_surroundArea->setModel( &m_surroundAreaModel ); m_surroundArea->move( 20 + m_volumeKnob->width(), 38 ); m_surroundArea->show(); m_surroundArea->setWhatsThis( tr( surroundarea_help ) ); - connect( m_surroundArea, SIGNAL( valueChanged( const QPoint & ) ), - this, - SLOT( surroundAreaPosChanged( const QPoint & ) ) ); - - // setup spinbox for selecting FX-channel - m_effectChannelNumber = new lcdSpinBox( MIN_EFFECT_CHANNEL, - MAX_EFFECT_CHANNEL, 2, - m_generalSettingsWidget, - tr( "FX channel" ), - this ); - m_effectChannelNumber->setInitValue( DEFAULT_EFFECT_CHANNEL ); + m_effectChannelNumber = new lcdSpinBox( 2, m_generalSettingsWidget, + tr( "FX channel" ) ); m_effectChannelNumber->setLabel( tr( "FX CHNL" ) ); m_effectChannelNumber->move( m_surroundArea->x() + m_surroundArea->width() + 16, 40 ); @@ -238,8 +237,6 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : "double-clicking it in the preset-browser." ) ); - setVolume( DEFAULT_VOLUME ); - setSurroundAreaPos( QPoint() ); setName( tr( "Default" ) ); @@ -416,9 +413,9 @@ void instrumentTrack::midiOutSelected( void ) void instrumentTrack::midiConfigChanged( bool ) { m_midiInputAction->setChecked( - m_midiWidget->m_receiveCheckBox->isChecked() ); + m_midiWidget->m_receiveCheckBox->model()->value() ); m_midiOutputAction->setChecked( - m_midiWidget->m_sendCheckBox->isChecked() ); + m_midiWidget->m_sendCheckBox->model()->value() ); } @@ -462,44 +459,12 @@ void instrumentTrack::processAudioBuffer( sampleFrame * _buf, { m_envWidget->processAudioBuffer( _buf, _frames, _n ); v_scale *= ( (float) _n->getVolume() / DEFAULT_VOLUME ); -/* const fpp_t ENV_FRAMES = 10; - if( _n->totalFramesPlayed() == 0 ) - { - // very basic envelope for not having clicks at the - // beginning - const fpp_t frames = tMin( _frames, - ENV_FRAMES ); - for( fpp_t i = 0; i < frames; ++i ) - { - for( ch_cnt_t ch = 0; ch < DEFAULT_CHANNELS; - ++ch ) - { - _buf[i][ch] *= (float) i / frames; - } - } - } - - // last time we're called for current note? - if( _n->willFinishThisPeriod() ) - { - // then do a soft fade-out at the end to avoid clicks - for( fpp_t i = ( _frames >= ENV_FRAMES ) ? - _frames - ENV_FRAMES : 0; - i < _frames; ++i ) - { - for( ch_cnt_t ch = 0; ch < DEFAULT_CHANNELS; - ++ch ) - { - _buf[i][ch] *= (float) ( _frames-i-1 ) / - ENV_FRAMES; - } - } - }*/ } - volumeVector v = m_surroundArea->getVolumeVector( v_scale ); + volumeVector v = m_surroundArea->model()->getVolumeVector( v_scale ); engine::getMixer()->bufferToPort( _buf, - ( _n != NULL ) ? tMin( _n->framesLeftForCurrentPeriod(), _frames ) : _frames, + ( _n != NULL ) ? tMin( _n->framesLeftForCurrentPeriod(), _frames ) : + _frames, ( _n != NULL ) ? _n->offset() : 0, v, m_audioPort ); } @@ -683,8 +648,6 @@ void instrumentTrack::playNote( notePlayHandle * _n, bool _try_parallelizing ) { processInEvent( midiEvent( NOTE_OFF, 0, _n->key(), 0 ), midiTime() ); - //printf("%d\n",( *youngest_note )->offset()+m_instrument->desiredTransitionFrames()); - //_n->noteOff( ( *youngest_note )->offset()+m_instrument->desiredTransitionFrames() ); if( ( *youngest_note )->offset() > _n->offset() ) { @@ -792,80 +755,22 @@ void instrumentTrack::setName( const QString & _new_name ) -void instrumentTrack::setVolume( volume _new_volume ) -{ - if( _new_volume <= MAX_VOLUME ) - { - m_volumeKnob->setValue( _new_volume ); - //m_tswVolumeKnob->setValue( _new_volume ); - } -} - - -volume instrumentTrack::getVolume( void ) const -{ - return( static_cast( m_volumeKnob->value() ) ); -} - - - - -void instrumentTrack::setSurroundAreaPos( const QPoint & _p ) -{ - if( m_surroundArea->value() != _p ) - { - m_surroundArea->setValue( _p ); - } -/* if( m_tswSurroundArea->value() != _p ) - { - m_tswSurroundArea->setValue( _p ); - }*/ -} - - - - -void instrumentTrack::setBaseNote( Uint32 _new_note, bool _modified ) +void instrumentTrack::updateBaseNote( /* bool _modified*/ void ) { engine::getMixer()->lock(); - setBaseTone( (tones)( _new_note % NOTES_PER_OCTAVE ) ); - setBaseOctave( (octaves)( _new_note / NOTES_PER_OCTAVE ) ); - for( QList::iterator it = m_processHandles.begin(); it != m_processHandles.end(); ++it ) { ( *it )->updateFrequency(); } engine::getMixer()->unlock(); - +/* if( _modified ) { engine::getSongEditor()->setModified(); - } -} - - - - -void instrumentTrack::setBaseTone( tones _new_tone ) -{ - if( _new_tone >= C && _new_tone <= H ) - { - m_baseTone = _new_tone; - } -} - - - - -void instrumentTrack::setBaseOctave( octaves _new_octave ) -{ - if( _new_octave >= MIN_OCTAVE && _new_octave <= MAX_OCTAVE ) - { - m_baseOctave = _new_octave; - } + }*/ } @@ -873,7 +778,7 @@ void instrumentTrack::setBaseOctave( octaves _new_octave ) int instrumentTrack::masterKey( notePlayHandle * _n ) const { - int key = baseTone() + baseOctave() * NOTES_PER_OCTAVE + + int key = m_baseNoteModel.value() + engine::getSongEditor()->masterPitch(); return( tLimit( _n->key() - ( key - A - DEFAULT_OCTAVE * NOTES_PER_OCTAVE ), 0, NOTES ) ); @@ -1047,12 +952,12 @@ void instrumentTrack::saveTrackSpecificSettings( QDomDocument & _doc, QDomElement & _this ) { _this.setAttribute( "name", name() ); - m_volumeKnob->saveSettings( _doc, _this, "vol" ); + m_volumeModel.saveSettings( _doc, _this, "vol" ); - m_surroundArea->saveSettings( _doc, _this, "surpos" ); + m_surroundAreaModel.saveSettings( _doc, _this, "surpos" ); - m_effectChannelNumber->saveSettings( _doc, _this, "fxch" ); - m_pianoWidget->saveSettings( _doc, _this, "basenote" ); + m_effectChannelModel.saveSettings( _doc, _this, "fxch" ); + m_baseNoteModel.saveSettings( _doc, _this, "basenote" ); _this.setAttribute( "tab", m_tabWidget->activeTab() ); mainWindow::saveWidgetState( this, _this ); @@ -1076,12 +981,24 @@ void instrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) engine::getMixer()->lock(); setName( _this.attribute( "name" ) ); - m_volumeKnob->loadSettings( _this, "vol" ); + m_volumeModel.loadSettings( _this, "vol" ); - m_surroundArea->loadSettings( _this, "surpos" ); + m_surroundAreaModel.loadSettings( _this, "surpos" ); + + m_effectChannelModel.loadSettings( _this, "fxch" ); + + if( _this.hasAttribute( "baseoct" ) ) + { + // TODO: move this compat code to mmp.cpp -> upgrade() + m_baseNoteModel.setInitValue( _this.attribute( "baseoct" ).toInt() + * NOTES_PER_OCTAVE + + _this.attribute( "basetone" ).toInt() ); + } + else + { + m_baseNoteModel.loadSettings( _this, "basenote" ); + } - m_effectChannelNumber->loadSettings( _this, "fxch" ); - m_pianoWidget->loadSettings( _this, "basenote" ); int tab = _this.attribute( "tab" ).toInt(); bool had_fx = FALSE; @@ -1169,23 +1086,6 @@ instrument * instrumentTrack::loadInstrument( const QString & _plugin_name ) -/*void instrumentTrack::volValueChanged( float _new_value ) -{ - setVolume( (volume) _new_value ); -}*/ - - - - -void instrumentTrack::surroundAreaPosChanged( const QPoint & _p ) -{ - setSurroundAreaPos( _p ); - engine::getSongEditor()->setModified(); -} - - - - void instrumentTrack::textChanged( const QString & _new_name ) { setName( _new_name ); diff --git a/src/tracks/sample_track.cpp b/src/tracks/sample_track.cpp index c138005b5..41f2606e6 100644 --- a/src/tracks/sample_track.cpp +++ b/src/tracks/sample_track.cpp @@ -330,8 +330,11 @@ void sampleTCOSettingsDialog::setSampleFile( const QString & _f ) sampleTrack::sampleTrack( trackContainer * _tc ) : track( _tc ), - m_audioPort( new audioPort( tr( "Sample track" ) ) ) + m_audioPort( new audioPort( tr( "Sample track" ) ) ), + m_volumeModel( DEFAULT_VOLUME, MIN_VOLUME, MAX_VOLUME, 1/*, this*/ ) { + m_volumeModel.setTrack( this ); + getTrackWidget()->setFixedHeight( 32 ); m_trackLabel = new effectLabel( tr( "Sample track" ), @@ -345,9 +348,8 @@ sampleTrack::sampleTrack( trackContainer * _tc ) : m_trackLabel->show(); m_volumeKnob = new volumeKnob( knobSmall_17, getTrackSettingsWidget(), - tr( "Channel volume" ), this ); - m_volumeKnob->setRange( MIN_VOLUME, MAX_VOLUME, 1.0f ); - m_volumeKnob->setInitValue( DEFAULT_VOLUME ); + tr( "Channel volume" ) ); + m_volumeKnob->setModel( &m_volumeModel ); m_volumeKnob->setHintText( tr( "Channel volume:" ) + " ", "%" ); m_volumeKnob->move( 4, 4 ); m_volumeKnob->setLabel( tr( "VOL" ) ); @@ -405,11 +407,9 @@ bool FASTCALL sampleTrack::play( const midiTime & _start, if( !st->muted() ) { samplePlayHandle * handle = new samplePlayHandle( st ); - connect( m_volumeKnob, SIGNAL( valueChanged( float ) ), - handle, SLOT( setVolume( float ) ) ); - handle->setVolume( m_volumeKnob->value() ); -//TODO: do we need sample tracks in BB editor? -// handle->setBBTrack( bb_track ); + handle->setVolumeModel( &m_volumeModel ); +//TODO: check whether this works +// handle->setBBTrack( _tco_num ); handle->setOffset( _offset ); // send it to the mixer engine::getMixer()->addPlayHandle( handle ); @@ -440,7 +440,7 @@ void sampleTrack::saveTrackSpecificSettings( QDomDocument & _doc, #if 0 _this.setAttribute( "icon", m_trackLabel->pixmapFile() ); #endif - m_volumeKnob->saveSettings( _doc, _this, "vol" ); + m_volumeModel.saveSettings( _doc, _this, "vol" ); } @@ -467,7 +467,7 @@ void sampleTrack::loadTrackSpecificSettings( const QDomElement & _this ) m_trackLabel->setPixmapFile( _this.attribute( "icon" ) ); } #endif - m_volumeKnob->loadSettings( _this, "vol" ); + m_volumeModel.loadSettings( _this, "vol" ); } diff --git a/src/widgets/automatable_button.cpp b/src/widgets/automatable_button.cpp index a8181ae51..98c77816c 100644 --- a/src/widgets/automatable_button.cpp +++ b/src/widgets/automatable_button.cpp @@ -31,24 +31,20 @@ #include #include -#include "automatable_object_templates.h" +#include "automatable_model_templates.h" #include "caption_menu.h" #include "embed.h" -automatableButton::automatableButton( QWidget * _parent, const QString & _name, - track * _track ) : +automatableButton::automatableButton( QWidget * _parent, + const QString & _name ) : QPushButton( _parent ), - autoObj( _track, FALSE, FALSE, TRUE ), + autoModelView(), m_group( NULL ) { - if( _track != NULL ) - { - getAutomationPattern(); - } - setInitValue( FALSE ); + setModel( new autoModel( FALSE, FALSE, TRUE, 1, NULL, TRUE ) ); setAccessibleName( _name ); } @@ -66,9 +62,22 @@ automatableButton::~automatableButton() +void automatableButton::update( void ) +{ + if( QPushButton::isChecked() != model()->value() ) + { + QPushButton::setChecked( model()->value() ); + } + QPushButton::update(); +} + + + + void automatableButton::contextMenuEvent( QContextMenuEvent * _me ) { - if( nullTrack() && ( m_group == NULL || m_group->nullTrack() ) ) + if( model()->nullTrack() && + ( m_group == NULL || m_group->model()->nullTrack() ) ) { QPushButton::contextMenuEvent( _me ); return; @@ -85,12 +94,12 @@ void automatableButton::contextMenuEvent( QContextMenuEvent * _me ) if ( m_group != NULL ) { target = m_group; - pattern = m_group->getAutomationPattern(); + pattern = m_group->model()->getAutomationPattern(); } else { target = this; - pattern = getAutomationPattern(); + pattern = model()->getAutomationPattern(); } captionMenu contextMenu( target->accessibleName() ); @@ -135,30 +144,14 @@ void automatableButton::toggle( void ) { if( isCheckable() && m_group != NULL ) { - if( value() == FALSE ) + if( model()->value() == FALSE ) { m_group->activateButton( this ); } } else { - setValue( !value() ); - update(); - } -} - - - - -void automatableButton::setValue( const bool _on ) -{ - if( _on != value() ) - { - autoObj::setValue( _on ); - setFirstValue(); - QPushButton::setChecked( _on ); - update(); - emit( toggled( value() ) ); + model()->setValue( !model()->value() ); } } @@ -170,17 +163,12 @@ void automatableButton::setValue( const bool _on ) automatableButtonGroup::automatableButtonGroup( QWidget * _parent, - const QString & _name, - track * _track ) : + const QString & _name ) : QWidget( _parent ), - automatableObject( _track ) + autoModelView() { + setModel( new autoModel( 0, 0, 0, 1, NULL, TRUE ) ); hide(); - if( _track != NULL ) - { - getAutomationPattern(); - } - setInitValue( 0 ); setAccessibleName( _name ); } @@ -202,13 +190,14 @@ void automatableButtonGroup::addButton( automatableButton * _btn ) { _btn->m_group = this; _btn->setCheckable( TRUE ); - _btn->setChecked( FALSE ); - // disable step-recording as we're recording changes of states of + _btn->model()->setValue( FALSE ); + // disable journalling as we're recording changes of states of // button-group members on our own - _btn->setJournalling( FALSE ); + _btn->model()->setJournalling( FALSE ); m_buttons.push_back( _btn ); - setRange( 0, m_buttons.size() - 1 ); + model()->setRange( 0, m_buttons.size() - 1 ); + updateButtons(); } @@ -219,7 +208,7 @@ void automatableButtonGroup::removeButton( automatableButton * _btn ) m_buttons.erase( qFind( m_buttons.begin(), m_buttons.end(), _btn ) ); _btn->m_group = NULL; - setRange( 0, m_buttons.size() - 1 ); + model()->setRange( 0, m_buttons.size() - 1 ); } @@ -227,30 +216,34 @@ void automatableButtonGroup::removeButton( automatableButton * _btn ) void automatableButtonGroup::activateButton( automatableButton * _btn ) { - if( _btn != m_buttons[value()] && m_buttons.indexOf( _btn ) != -1 ) + if( _btn != m_buttons[model()->value()] && + m_buttons.indexOf( _btn ) != -1 ) { - setValue( m_buttons.indexOf( _btn ) ); + model()->setValue( m_buttons.indexOf( _btn ) ); } } -void automatableButtonGroup::setValue( const int _value ) +void automatableButtonGroup::modelChanged( void ) { - if( m_buttons.empty() == FALSE ) - { - // range not updated yet? - if( value() == fittedValue( value() ) ) - { - m_buttons[value()]->setChecked( FALSE ); - } - automatableObject::setValue( _value ); - setFirstValue(); - m_buttons[value()]->setChecked( TRUE ); - } + connect( model(), SIGNAL( dataChanged() ), + this, SLOT( updateButtons() ) ); + autoModelView::modelChanged(); +} - emit valueChanged( value() ); + + + +void automatableButtonGroup::updateButtons( void ) +{ + int i = 0; + foreach( automatableButton * btn, m_buttons ) + { + btn->setValue( i == value() ); + ++i; + } } diff --git a/src/widgets/automatable_slider.cpp b/src/widgets/automatable_slider.cpp index 660b9ee6d..e17bcb072 100644 --- a/src/widgets/automatable_slider.cpp +++ b/src/widgets/automatable_slider.cpp @@ -4,6 +4,7 @@ * automatable_slider.cpp - implementation of class automatableSlider * * Copyright (c) 2006-2007 Javier Serrano Polo + * Copyright (c) 2007 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -30,7 +31,7 @@ #include #include -#include "automatable_object_templates.h" +#include "automatable_model_templates.h" #include "caption_menu.h" #include "embed.h" #include "knob.h" @@ -38,21 +39,18 @@ -automatableSlider::automatableSlider( QWidget * _parent, const QString & _name, - class track * _track ) : +automatableSlider::automatableSlider( QWidget * _parent, const QString & _name ) : QSlider( _parent ), - m_show_status( FALSE ) + autoModelView(), + m_showStatus( FALSE ) { - m_knob = new knob( knobDark_28, NULL, _name, _track ); - + setModel( new autoModel( 0, 0, 0, 1, NULL, TRUE ) ); setAccessibleName( _name ); - connect( m_knob, SIGNAL( valueChanged( float ) ), this, - SLOT( updateSlider( void ) ) ); - connect( this, SIGNAL( valueChanged( int ) ), this, - SLOT( changeValue( int ) ) ); - connect( this, SIGNAL( sliderMoved( int ) ), this, - SLOT( moveSlider( int ) ) ); + connect( this, SIGNAL( valueChanged( int ) ), + this, SLOT( changeValue( int ) ) ); + connect( this, SIGNAL( sliderMoved( int ) ), + this, SLOT( moveSlider( int ) ) ); } @@ -60,34 +58,6 @@ automatableSlider::automatableSlider( QWidget * _parent, const QString & _name, automatableSlider::~automatableSlider() { - delete m_knob; -} - - - - -void automatableSlider::setRange( int _min, int _max ) -{ - QSlider::setRange( _min, _max ); - m_knob->setRange( _min, _max, 1.0f ); -} - - - - -void automatableSlider::setValue( int _value ) -{ - QSlider::setValue( _value ); - m_knob->setValue( _value ); -} - - - - -void automatableSlider::setInitValue( int _value ) -{ - m_knob->setInitValue( _value ); - QSlider::setValue( _value ); } @@ -98,7 +68,7 @@ void automatableSlider::contextMenuEvent( QContextMenuEvent * _me ) captionMenu contextMenu( accessibleName() ); contextMenu.addAction( embed::getIconPixmap( "automation" ), tr( "&Open in automation editor" ), - m_knob->getAutomationPattern(), + model()->getAutomationPattern(), SLOT( openInAutomationEditor() ) ); contextMenu.exec( QCursor::pos() ); } @@ -108,7 +78,7 @@ void automatableSlider::contextMenuEvent( QContextMenuEvent * _me ) void automatableSlider::mousePressEvent( QMouseEvent * _me ) { - m_show_status = TRUE; + m_showStatus = TRUE; QSlider::mousePressEvent( _me ); } @@ -117,7 +87,7 @@ void automatableSlider::mousePressEvent( QMouseEvent * _me ) void automatableSlider::mouseReleaseEvent( QMouseEvent * _me ) { - m_show_status = FALSE; + m_showStatus = FALSE; QSlider::mouseReleaseEvent( _me ); } @@ -126,10 +96,21 @@ void automatableSlider::mouseReleaseEvent( QMouseEvent * _me ) void automatableSlider::wheelEvent( QWheelEvent * _me ) { - bool old_status = m_show_status; - m_show_status = TRUE; + bool old_status = m_showStatus; + m_showStatus = TRUE; QSlider::wheelEvent( _me ); - m_show_status = old_status; + m_showStatus = old_status; +} + + + + +void automatableSlider::modelChanged( void ) +{ + QSlider::setRange( model()->minValue(), model()->maxValue() ); + updateSlider(); + connect( model(), SIGNAL( dataChanged() ), + this, SLOT( updateSlider() ) ); } @@ -137,8 +118,8 @@ void automatableSlider::wheelEvent( QWheelEvent * _me ) void automatableSlider::changeValue( int _value ) { - setValue( _value ); - emit logicValueChanged( logicValue() ); + model()->setValue( _value ); + emit logicValueChanged( model()->value() ); } @@ -146,8 +127,8 @@ void automatableSlider::changeValue( int _value ) void automatableSlider::moveSlider( int _value ) { - setValue( _value ); - emit logicSliderMoved( logicValue() ); + model()->setValue( _value ); + emit logicSliderMoved( model()->value() ); } @@ -155,41 +136,7 @@ void automatableSlider::moveSlider( int _value ) void automatableSlider::updateSlider( void ) { - QSlider::setValue( logicValue() ); -} - - - - -void automatableSlider::saveSettings( QDomDocument & _doc, QDomElement & _this, - const QString & _name ) -{ - m_knob->saveSettings( _doc, _this, _name ); -} - - - - -void automatableSlider::loadSettings( const QDomElement & _this, - const QString & _name ) -{ - m_knob->loadSettings( _this, _name ); -} - - - - -int automatableSlider::logicValue( void ) -{ - return( (int)roundf( m_knob->value() ) ); -} - - - - -void automatableSlider::clearAutomationValues( void ) -{ - m_knob->getAutomationPattern()->clear(); + QSlider::setValue( model()->value() ); } diff --git a/src/widgets/combobox.cpp b/src/widgets/combobox.cpp index edfb51ffd..3400d3641 100644 --- a/src/widgets/combobox.cpp +++ b/src/widgets/combobox.cpp @@ -34,7 +34,6 @@ #include #include -#include "automatable_object_templates.h" #include "caption_menu.h" #include "embed.h" #include "gui_templates.h" @@ -46,12 +45,13 @@ QPixmap * comboBox::s_arrow = NULL; const int CB_ARROW_BTN_WIDTH = 20; -comboBox::comboBox( QWidget * _parent, const QString & _name, track * _track ) : +comboBox::comboBox( QWidget * _parent, const QString & _name ) : QWidget( _parent ), - automatableObject( _track ), + autoModelView(), m_menu( this ), m_pressed( FALSE ) { + setModel( new comboBoxModel ); if( s_background == NULL ) { s_background = new QPixmap( embed::getIconPixmap( @@ -70,11 +70,6 @@ comboBox::comboBox( QWidget * _parent, const QString & _name, track * _track ) : connect( &m_menu, SIGNAL( triggered( QAction * ) ), this, SLOT( setItem( QAction * ) ) ); - if( _track != NULL ) - { - getAutomationPattern(); - } - setInitValue( 0 ); setAccessibleName( _name ); } @@ -88,59 +83,9 @@ comboBox::~comboBox() -void comboBox::addItem( const QString & _item, const QPixmap & _pixmap ) -{ - QPixmap pm = _pixmap; - if( pm.height() > 16 ) - { - pm = pm.scaledToHeight( 16, Qt::SmoothTransformation ); - } - m_items.push_back( qMakePair( _item, pm ) ); - m_menu.clear(); - for( QVector::iterator it = m_items.begin(); - it != m_items.end(); ++it ) - { - m_menu.addAction( ( *it ).second, ( *it ).first ); - } - setRange( 0, m_items.size() - 1 ); -} - - - - -int comboBox::findText( const QString & _txt ) const -{ - for( QVector::const_iterator it = m_items.begin(); - it != m_items.end(); ++it ) - { - if( ( *it ).first == _txt ) - { - return( it - m_items.begin() ); - } - } - return( -1 ); -} - - - - -void comboBox::setValue( const int _idx ) -{ - automatableObject::setValue( _idx ); -/* m_value = tLimit( _idx, 0, ( m_items.size() > 0 ) ? - m_items.size() - 1 : 0 );*/ - emit( valueChanged( value() ) ); - emit( activated( ( m_items.size() > 0 ) ? - m_items[value()].first : "" ) ); - update(); -} - - - - void comboBox::contextMenuEvent( QContextMenuEvent * _me ) { - if( nullTrack() || _me->x() <= width() - CB_ARROW_BTN_WIDTH ) + if( model()->nullTrack() || _me->x() <= width() - CB_ARROW_BTN_WIDTH ) { QWidget::contextMenuEvent( _me ); return; @@ -149,7 +94,7 @@ void comboBox::contextMenuEvent( QContextMenuEvent * _me ) captionMenu contextMenu( accessibleName() ); contextMenu.addAction( embed::getIconPixmap( "automation" ), tr( "&Open in automation editor" ), - getAutomationPattern(), + model()->getAutomationPattern(), SLOT( openInAutomationEditor() ) ); contextMenu.exec( QCursor::pos() ); } @@ -169,6 +114,15 @@ void comboBox::mousePressEvent( QMouseEvent * _me ) m_pressed = TRUE; update(); + m_menu.clear(); + for( int i = 0; i < model()->size(); ++i ) + { + m_menu.addAction( model()->itemPixmap( i ) ? + *model()->itemPixmap( i ) : + QPixmap(), + model()->itemText( i ) ); + } + QPoint gpos = mapToGlobal( QPoint( 0, height() ) ); if( gpos.y() + m_menu.sizeHint().height() < qApp->desktop()->height() ) @@ -184,11 +138,11 @@ void comboBox::mousePressEvent( QMouseEvent * _me ) } else if( _me->button() == Qt::LeftButton ) { - setInitValue( value() + 1 ); + model()->setInitValue( model()->value() + 1 ); } else if( _me->button() == Qt::RightButton ) { - setInitValue( value() - 1 ); + model()->setInitValue( model()->value() - 1 ); } } @@ -230,24 +184,30 @@ void comboBox::paintEvent( QPaintEvent * _pe ) p.drawPixmap( width() - CB_ARROW_BTN_WIDTH + 4 + dxy, 4 + dxy, *s_arrow ); - if( m_items.size() > 0 ) + if( model()->size() > 0 ) { p.setFont( font() ); p.setClipRect( QRect( 5, 2, width() - CB_ARROW_BTN_WIDTH - 8, height() - 2 ) ); - const QPixmap & item_pm = m_items[value()].second; + const QPixmap * item_pm = model()->currentData(); int tx = 4; - if( item_pm.isNull() == FALSE ) + if( item_pm != NULL ) { - p.drawPixmap( tx, 3, item_pm ); - tx += item_pm.width() + 2; + QPixmap pm = *item_pm; + if( pm.height() > 16 ) + { + pm = pm.scaledToHeight( 16, + Qt::SmoothTransformation ); + } + p.drawPixmap( tx, 3, pm ); + tx += pm.width() + 2; } p.setPen( QColor( 64, 64, 64 ) ); p.drawText( tx+1, p.fontMetrics().height()-1, - m_items[value()].first ); + model()->currentText() ); p.setPen( QColor( 224, 224, 224 ) ); p.drawText( tx, p.fontMetrics().height()-2, - m_items[value()].first ); + model()->currentText() ); } } @@ -256,15 +216,69 @@ void comboBox::paintEvent( QPaintEvent * _pe ) void comboBox::wheelEvent( QWheelEvent * _we ) { - setInitValue( value() + ( ( _we->delta() < 0 ) ? 1 : -1 ) ); + model()->setInitValue( model()->value() + + ( ( _we->delta() < 0 ) ? 1 : -1 ) ); _we->accept(); } + +void comboBox::deletePixmap( QPixmap * _pixmap ) +{ + delete _pixmap; +} + + + + void comboBox::setItem( QAction * _item ) { - setInitValue( findText( _item->text() ) ); + model()->setInitValue( model()->findText( _item->text() ) ); +} + + + + + + + + + +void comboBoxModel::addItem( const QString & _item, QPixmap * _pixmap ) +{ + m_items.push_back( qMakePair( _item, _pixmap ) ); + setRange( 0, m_items.size() - 1 ); +} + + + + +void comboBoxModel::clear( void ) +{ + setRange( 0, 0 ); + foreach( const item & _i, m_items ) + { + emit itemPixmapRemoved( _i.second ); + } + m_items.clear(); + emit propertiesChanged(); +} + + + + +int comboBoxModel::findText( const QString & _txt ) const +{ + for( QVector::const_iterator it = m_items.begin(); + it != m_items.end(); ++it ) + { + if( ( *it ).first == _txt ) + { + return( it - m_items.begin() ); + } + } + return( -1 ); } diff --git a/src/widgets/group_box.cpp b/src/widgets/group_box.cpp index fbec80267..472849d1b 100644 --- a/src/widgets/group_box.cpp +++ b/src/widgets/group_box.cpp @@ -47,15 +47,13 @@ QPixmap * groupBox::s_ledBg = NULL; -groupBox::groupBox( const QString & _caption, QWidget * _parent, - track * _track ) : +groupBox::groupBox( const QString & _caption, QWidget * _parent ) : QWidget( _parent ), + autoModelView(), m_caption( _caption ), m_origHeight( height() ), m_animating( FALSE ) { - setAutoFillBackground( TRUE ); - if( s_ledBg == NULL ) { s_ledBg = new QPixmap( embed::getIconPixmap( @@ -64,13 +62,15 @@ groupBox::groupBox( const QString & _caption, QWidget * _parent, updatePixmap(); - m_led = new pixmapButton( this, _caption, _track ); + m_led = new pixmapButton( this, _caption ); m_led->setCheckable( TRUE ); m_led->move( 2, 3 ); m_led->setActiveGraphic( embed::getIconPixmap( "led_green" ) ); m_led->setInactiveGraphic( embed::getIconPixmap( "led_off" ) ); - connect( m_led, SIGNAL( toggled( bool ) ), - this, SLOT( setState( bool ) ) ); + + setModel( new autoModel( FALSE, FALSE, TRUE, 1, NULL, FALSE ) ); + setAutoFillBackground( TRUE ); + } @@ -83,6 +83,13 @@ groupBox::~groupBox() +void groupBox::modelChanged( void ) +{ + m_led->setModel( model(), FALSE ); +} + + + void groupBox::resizeEvent( QResizeEvent * ) { updatePixmap(); @@ -99,25 +106,25 @@ void groupBox::mousePressEvent( QMouseEvent * _me ) { if( _me->y() > 1 && _me->y() < 13 ) { - setState( !isActive(), TRUE ); + //setState( !isActive(), TRUE ); + if( ( model()->value() == TRUE && height() < m_origHeight ) && + m_animating == FALSE ) + { + m_animating = TRUE; + animate(); + } } } - +/* void groupBox::setState( bool _on, bool _anim ) { m_led->setChecked( _on ); - if( ( _anim == TRUE || ( _on == TRUE && height() < m_origHeight ) ) && - m_animating == FALSE ) - { - m_animating = TRUE; - animate(); - } emit( toggled( _on ) ); } - +*/ @@ -126,10 +133,10 @@ void groupBox::animate( void ) float state = (float)( m_origHeight - height() ) / (float)( m_origHeight - 19 ); int dy = static_cast( 3 - 2 * cosf( state * 2 * M_PI ) ); - if( isActive() && height() < m_origHeight ) + if( model()->value() && height() < m_origHeight ) { } - else if( !isActive() && height() > 19 ) + else if( !model()->value() && height() > 19 ) { dy = -dy; } @@ -219,23 +226,6 @@ void groupBox::updatePixmap( void ) -void groupBox::saveSettings( QDomDocument & _doc, QDomElement & _this, - const QString & _name ) -{ - m_led->saveSettings( _doc, _this, _name ); -} - - - - -void groupBox::loadSettings( const QDomElement & _this, const QString & _name ) -{ - m_led->loadSettings( _this, _name ); -} - - - - #include "group_box.moc" diff --git a/src/widgets/knob.cpp b/src/widgets/knob.cpp index 1f319690f..88b6046a1 100644 --- a/src/widgets/knob.cpp +++ b/src/widgets/knob.cpp @@ -44,7 +44,7 @@ #endif #include -#include "automatable_object_templates.h" +#include "automatable_model_templates.h" #include "caption_menu.h" #include "config_mgr.h" #include "embed.h" @@ -63,19 +63,18 @@ textFloat * knob::s_textFloat = NULL; -knob::knob( int _knob_num, QWidget * _parent, const QString & _name, - track * _track ) : +knob::knob( int _knob_num, QWidget * _parent, const QString & _name ) : QWidget( _parent ), - autoObj( _track ), + autoModelView(), m_mouseOffset( 0.0f ), m_buttonPressed( FALSE ), m_hintTextBeforeValue( "" ), m_hintTextAfterValue( "" ), - m_initValue( 0.0f ), - m_angle( 0.0f ), m_knobNum( _knob_num ), m_label( "" ) { + setModel( new autoModel( 0, 0, 0, 1, NULL, TRUE ) ); + if( s_textFloat == NULL ) { s_textFloat = new textFloat( this ); @@ -87,31 +86,18 @@ knob::knob( int _knob_num, QWidget * _parent, const QString & _name, m_knobPixmap = new QPixmap( embed::getIconPixmap( QString( "knob0" + QString::number( m_knobNum + 1 ) ).toAscii().constData() ) ); - if( _track != NULL ) - { - getAutomationPattern(); - } - - setRange( 0.0f, 100.0f, 1.0f ); + //setRange( 0.0f, 100.0f, 1.0f ); setFixedSize( m_knobPixmap->width(), m_knobPixmap->height() ); setTotalAngle( 270.0f ); - recalcAngle(); } -// Destructor knob::~knob() { delete m_knobPixmap; -/* // make sure pointer to this knob isn't used anymore in active - // midi-device-class - if( engine::getMixer()->getMIDIClient()->pitchBendKnob() == this ) - { - engine::getMixer()->getMIDIClient()->setPitchBendKnob( NULL ); - }*/ } @@ -151,7 +137,7 @@ void knob::setTotalAngle( float _angle ) m_totalAngle = _angle; } - layoutKnob(); + update(); } @@ -159,11 +145,21 @@ void knob::setTotalAngle( float _angle ) void knob::drawKnob( QPainter * _p ) { + float angle = 0.0f; + if( model()->maxValue() != model()->minValue() ) + { + angle = ( model()->value() - 0.5 * ( model()->minValue() + + model()->maxValue() ) ) / + ( model()->maxValue() - model()->minValue() ) * + m_totalAngle; + angle = static_cast( angle ) % 360; + } + const float radius = m_knobPixmap->width() / 2.0f - 1; const float xm = m_knobPixmap->width() / 2.0f;//radius + 1; const float ym = m_knobPixmap->height() / 2.0f;//radius+1; - const float rarc = m_angle * M_PI / 180.0; + const float rarc = angle * M_PI / 180.0; const float ca = cos( rarc ); const float sa = -sin( rarc ); @@ -214,17 +210,6 @@ void knob::drawKnob( QPainter * _p ) -void knob::valueChange( void ) -{ - recalcAngle(); - update(); - emit valueChanged( value() ); - emit valueChanged(); -} - - - - float knob::getValue( const QPoint & _p ) { if( configManager::inst()->value( "knobs", "classicalusability" @@ -237,13 +222,16 @@ float knob::getValue( const QPoint & _p ) const float arc = atan2( -dx, dy ) * 180.0 / M_PI; - float new_value = 0.5 * ( minValue() + maxValue() ) + - arc * ( maxValue() - minValue() ) / + float new_value = 0.5 * ( model()->minValue() + + model()->maxValue() ) + + arc * ( model()->maxValue() - + model()->minValue() ) / m_totalAngle; - const float oneTurn = tAbs( maxValue() - minValue() ) * + const float oneTurn = tAbs( model()->maxValue() - + model()->minValue() ) * 360.0 / m_totalAngle; - const float eqValue = value() + m_mouseOffset; + const float eqValue = model()->value() + m_mouseOffset; if( tAbs( new_value - eqValue ) > 0.5 * oneTurn ) { @@ -260,52 +248,9 @@ float knob::getValue( const QPoint & _p ) } if( engine::getMainWindow()->isShiftPressed() ) { - return( ( _p.y() - m_origMousePos.y() ) * step() ); - } - return( ( _p.y() - m_origMousePos.y() ) * m_pageSize ); -} - - - - -void knob::rangeChange() -{ - layoutKnob(); - recalcAngle(); -} - - - - -// Recalculate the slider's geometry and layout based on -// the current rect and fonts. -void knob::layoutKnob( bool _update_geometry ) -{ - if( _update_geometry ) - { - updateGeometry(); - update(); - } -} - - - - -void knob::recalcAngle( void ) -{ - // - // calculate the angle corresponding to the value - // - if( maxValue() == minValue() ) - { - m_angle = 0; - } - else - { - m_angle = ( value() - 0.5 * ( minValue() + maxValue() ) ) / - ( maxValue() - minValue() ) * m_totalAngle; - m_angle = static_cast( m_angle ) % 360; + return( ( _p.y() - m_origMousePos.y() ) * model()->step() ); } + return( ( _p.y() - m_origMousePos.y() ) * pageSize() ); } @@ -321,13 +266,15 @@ void knob::contextMenuEvent( QContextMenuEvent * ) captionMenu contextMenu( accessibleName() ); contextMenu.addAction( embed::getIconPixmap( "reload" ), - tr( "&Reset (%1%2)" ).arg( m_initValue ).arg( - m_hintTextAfterValue ), + tr( "&Reset (%1%2)" ). + arg( model()->initValue() ). + arg( m_hintTextAfterValue ), this, SLOT( reset() ) ); contextMenu.addSeparator(); contextMenu.addAction( embed::getIconPixmap( "edit_copy" ), - tr( "&Copy value (%1%2)" ).arg( value() ).arg( - m_hintTextAfterValue ), + tr( "&Copy value (%1%2)" ). + arg( model()->value() ). + arg( m_hintTextAfterValue ), this, SLOT( copyValue() ) ); contextMenu.addAction( embed::getIconPixmap( "edit_paste" ), tr( "&Paste value (%1%2)" @@ -335,16 +282,16 @@ void knob::contextMenuEvent( QContextMenuEvent * ) m_hintTextAfterValue ), this, SLOT( pasteValue() ) ); contextMenu.addSeparator(); - if( !nullTrack() ) + if( !model()->nullTrack() ) { contextMenu.addAction( embed::getIconPixmap( "automation" ), tr( "&Open in automation editor" ), - getAutomationPattern(), + model()->getAutomationPattern(), SLOT( openInAutomationEditor() ) ); contextMenu.addSeparator(); } - contextMenu.addAction( tr( "Connect to MIDI-device" ), this, - SLOT( connectToMidiDevice() ) ); +/* contextMenu.addAction( tr( "Connect to MIDI-device" ), this, + SLOT( connectToMidiDevice() ) );*/ contextMenu.addSeparator(); contextMenu.addAction( embed::getIconPixmap( "help" ), tr( "&Help" ), this, SLOT( displayHelp() ) ); @@ -369,30 +316,27 @@ void knob::dropEvent( QDropEvent * _de ) QString val = stringPairDrag::decodeValue( _de ); if( type == "float_value" ) { - //printf("set val\n"); - setValue( val.toFloat() ); + model()->setValue( val.toFloat() ); _de->accept(); } else if( type == "link_object" ) { - //printf("link!\n"); - knob * obj = (knob *)( val.toULong() ); - linkObjects( this, obj ); - obj->setValue( value() ); + knobModel * mod = (knobModel *)( val.toULong() ); + autoModel::linkModels( model(), mod ); + mod->setValue( model()->value() ); } } -//! Mouse press event handler void knob::mousePressEvent( QMouseEvent * _me ) { if( _me->button() == Qt::LeftButton && engine::getMainWindow()->isCtrlPressed() == FALSE && engine::getMainWindow()->isShiftPressed() == FALSE ) { - prepareJournalEntryFromOldVal(); + model()->prepareJournalEntryFromOldVal(); const QPoint & p = _me->pos(); m_origMousePos = p; @@ -400,7 +344,7 @@ void knob::mousePressEvent( QMouseEvent * _me ) if( configManager::inst()->value( "knobs", "classicalusability").toInt() ) { - m_mouseOffset = getValue( p ) - value(); + m_mouseOffset = getValue( p ) - model()->value(); } emit sliderPressed(); @@ -411,7 +355,8 @@ void knob::mousePressEvent( QMouseEvent * _me ) } s_textFloat->reparent( this ); s_textFloat->setText( m_hintTextBeforeValue + - QString::number( value() ) + + QString::number( + model()->value() ) + m_hintTextAfterValue ); s_textFloat->move( mapTo( topLevelWidget(), QPoint( 0, 0 ) ) + QPoint( m_knobPixmap->width() + 2, 0 ) ); @@ -422,7 +367,8 @@ void knob::mousePressEvent( QMouseEvent * _me ) engine::getMainWindow()->isCtrlPressed() == TRUE/* && engine::getMainWindow()->isShiftPressed() == FALSE*/ ) { - new stringPairDrag( "float_value", QString::number( value() ), + new stringPairDrag( "float_value", + QString::number( model()->value() ), QPixmap(), this ); } else if( _me->button() == Qt::LeftButton && @@ -432,7 +378,7 @@ void knob::mousePressEvent( QMouseEvent * _me ) /* this pointer was casted to uint, * compile time error on 64 bit systems */ new stringPairDrag( "link_object", - QString::number( (ulong) this ), + QString::number( (ulong) model() ), QPixmap(), this ); } else if( _me->button() == Qt::MidButton ) @@ -444,14 +390,13 @@ void knob::mousePressEvent( QMouseEvent * _me ) -//! Mouse Move Event handler void knob::mouseMoveEvent( QMouseEvent * _me ) { if( m_buttonPressed == TRUE ) { setPosition( _me->pos() ); - emit sliderMoved( value() ); - emit valueChanged(); + emit sliderMoved( model()->value() ); +// emit valueChanged(); if( !configManager::inst()->value( "knobs", "classicalusability").toInt() ) { @@ -460,17 +405,16 @@ void knob::mouseMoveEvent( QMouseEvent * _me ) } s_textFloat->setText( m_hintTextBeforeValue + - QString::number( value() ) + - m_hintTextAfterValue ); + QString::number( model()->value() ) + + m_hintTextAfterValue ); } -//! Mouse Release Event handler void knob::mouseReleaseEvent( QMouseEvent * /* _me*/ ) { - addJournalEntryFromOldToCurVal(); + model()->addJournalEntryFromOldToCurVal(); if( m_buttonPressed ) { @@ -526,32 +470,23 @@ void knob::paintEvent( QPaintEvent * _me ) -void knob::resizeEvent( QResizeEvent * ) -{ - layoutKnob( FALSE ); -} - - - - -//! Qt wheel event void knob::wheelEvent( QWheelEvent * _we ) { _we->accept(); const int inc = ( _we->delta() > 0 ) ? 1 : -1; - incValue( inc ); + model()->incValue( inc ); s_textFloat->reparent( this ); s_textFloat->setText( m_hintTextBeforeValue + - QString::number( value() ) + + QString::number( model()->value() ) + m_hintTextAfterValue ); s_textFloat->move( mapTo( topLevelWidget(), QPoint( 0, 0 ) ) + QPoint( m_knobPixmap->width() + 2, 0 ) ); s_textFloat->setVisibilityTimeOut( 1000 ); - emit sliderMoved( value() ); - emit valueChanged(); + emit sliderMoved( model()->value() ); +// emit valueChanged(); } @@ -559,8 +494,8 @@ void knob::wheelEvent( QWheelEvent * _we ) void knob::buttonReleased( void ) { - emit valueChanged( value() ); - emit valueChanged(); +// emit valueChanged( model()->value() ); +// emit valueChanged(); } @@ -571,56 +506,27 @@ void knob::setPosition( const QPoint & _p ) if( configManager::inst()->value( "knobs", "classicalusability" ).toInt() ) { - setValue( getValue( _p ) - m_mouseOffset ); + model()->setValue( getValue( _p ) - m_mouseOffset ); } else { - setValue( value() - getValue( _p ) ); + model()->setValue( model()->value() - getValue( _p ) ); } } -void knob::setValue( const float _x ) -{ - const float prev_value = value(); - autoObj::setValue( _x ); - setFirstValue(); - if( prev_value != value() ) - { - valueChange(); - } -} - - - - -void knob::setRange( const float _min, const float _max, const float _step ) -{ - bool rchg = ( ( maxValue() != _max ) || ( minValue() != _min ) ); - autoObj::setRange( _min, _max, _step ); - - m_pageSize = tMax( ( maxValue() - minValue() ) / 100.0f, - step() ); - - // call notifier after the step width has been adjusted. - if( rchg ) - { - rangeChange(); - } -} - void knob::reset( void ) { - setValue( m_initValue ); + model()->setValue( model()->initValue() ); s_textFloat->reparent( this ); s_textFloat->setText( m_hintTextBeforeValue + - QString::number( value() ) + - m_hintTextAfterValue ); + QString::number( model()->value() ) + + m_hintTextAfterValue ); s_textFloat->move( mapTo( topLevelWidget(), QPoint( 0, 0 ) ) + QPoint( m_knobPixmap->width() + 2, 0 ) ); s_textFloat->setVisibilityTimeOut( 1000 ); @@ -631,7 +537,7 @@ void knob::reset( void ) void knob::copyValue( void ) { - s_copiedValue = value(); + s_copiedValue = model()->value(); } @@ -639,11 +545,11 @@ void knob::copyValue( void ) void knob::pasteValue( void ) { - setValue( s_copiedValue ); + model()->setValue( s_copiedValue ); s_textFloat->reparent( this ); s_textFloat->setText( m_hintTextBeforeValue + - QString::number( value() ) + - m_hintTextAfterValue ); + QString::number( model()->value() ) + + m_hintTextAfterValue ); s_textFloat->move( mapTo( topLevelWidget(), QPoint( 0, 0 ) ) + QPoint( m_knobPixmap->width() + 2, 0 ) ); s_textFloat->setVisibilityTimeOut( 1000 ); @@ -659,13 +565,16 @@ void knob::enterValue( void ) this, accessibleName(), tr( "Please enter a new value between " - "%1 and %2:" ).arg( - minValue() ).arg( maxValue() ), - value(), minValue(), maxValue(), + "%1 and %2:" ). + arg( model()->minValue() ). + arg( model()->maxValue() ), + model()->value(), + model()->minValue(), + model()->maxValue(), 4, &ok ); if( ok ) { - setValue( new_val ); + model()->setValue( new_val ); } } diff --git a/src/widgets/lcd_spinbox.cpp b/src/widgets/lcd_spinbox.cpp index 0167469fc..1fbd43446 100644 --- a/src/widgets/lcd_spinbox.cpp +++ b/src/widgets/lcd_spinbox.cpp @@ -31,26 +31,27 @@ #include #include -#include "automatable_object_templates.h" +#include "automatable_model_templates.h" #include "caption_menu.h" #include "embed.h" #include "gui_templates.h" #include "templates.h" -lcdSpinBox::lcdSpinBox( int _min, int _max, int _num_digits, QWidget * _parent, - const QString & _name, - track * _track ) : +lcdSpinBox::lcdSpinBox( int _num_digits, QWidget * _parent, + const QString & _name ) : QWidget( _parent ), - autoObj( _track, 0, _min, _max ), + autoModelView(), + m_number( new QLCDNumber( _num_digits, this ) ), m_label( NULL ), m_origMousePos() { - m_number = new QLCDNumber( _num_digits, this ); m_number->setFrameShape( QFrame::Panel ); m_number->setFrameShadow( QFrame::Sunken ); m_number->setSegmentStyle( QLCDNumber::Flat ); + setModel( new autoModel( 0, 0, 0, 1, NULL, TRUE ) ); + QPalette pal; pal.setColor( QPalette::Light, Qt::gray ); pal.setColor( QPalette::Mid, Qt::darkGray ); @@ -61,14 +62,6 @@ lcdSpinBox::lcdSpinBox( int _min, int _max, int _num_digits, QWidget * _parent, setEnabled( TRUE ); - if( _track != NULL ) - { - getAutomationPattern(); - } - - // value is automatically limited to given range - setInitValue( 0 ); - setAccessibleName( _name ); m_number->setFixedSize( m_number->sizeHint() * 0.9 ); @@ -85,33 +78,19 @@ lcdSpinBox::~lcdSpinBox() -void lcdSpinBox::setStep( const int _step ) +void lcdSpinBox::update( void ) { - autoObj::setStep( tMax( _step, 1 ) ); -} - - - - -void lcdSpinBox::setValue( const int _value ) -{ - const int prev_value = value(); - autoObj::setValue( _value ); - QString s = m_textForValue[value()]; + QString s = m_textForValue[model()->value()]; if( s == "" ) { - s = QString::number( value() ); + s = QString::number( model()->value() ); while( (int) s.length() < m_number->numDigits() ) { s = "0" + s; } } m_number->display( s ); - - if( prev_value != value() ) - { - emit valueChanged( value() ); - } + QWidget::update(); } @@ -159,7 +138,7 @@ void lcdSpinBox::contextMenuEvent( QContextMenuEvent * _me ) { m_origMousePos = _me->globalPos(); - if( nullTrack() ) + if( model()->nullTrack() ) { QWidget::contextMenuEvent( _me ); return; @@ -174,7 +153,7 @@ void lcdSpinBox::contextMenuEvent( QContextMenuEvent * _me ) captionMenu contextMenu( accessibleName() ); contextMenu.addAction( embed::getIconPixmap( "automation" ), tr( "&Open in automation editor" ), - getAutomationPattern(), + model()->getAutomationPattern(), SLOT( openInAutomationEditor() ) ); contextMenu.exec( QCursor::pos() ); } @@ -188,7 +167,7 @@ void lcdSpinBox::mousePressEvent( QMouseEvent * _me ) { m_origMousePos = _me->globalPos(); QApplication::setOverrideCursor( Qt::BlankCursor ); - prepareJournalEntryFromOldVal(); + model()->prepareJournalEntryFromOldVal(); } } @@ -202,7 +181,8 @@ void lcdSpinBox::mouseMoveEvent( QMouseEvent * _me ) int dy = _me->globalY() - m_origMousePos.y(); if( dy > 1 || dy < -1 ) { - setInitValue( value() - dy / 2 * step() ); + model()->setInitValue( model()->value() - + dy / 2 * model()->step() ); emit manualChange(); QCursor::setPos( m_origMousePos ); } @@ -214,7 +194,7 @@ void lcdSpinBox::mouseMoveEvent( QMouseEvent * _me ) void lcdSpinBox::mouseReleaseEvent( QMouseEvent * _me ) { - addJournalEntryFromOldToCurVal(); + model()->addJournalEntryFromOldToCurVal(); QCursor::setPos( m_origMousePos ); QApplication::restoreOverrideCursor(); @@ -226,7 +206,8 @@ void lcdSpinBox::mouseReleaseEvent( QMouseEvent * _me ) void lcdSpinBox::wheelEvent( QWheelEvent * _we ) { _we->accept(); - setInitValue( value() + ( ( _we->delta() > 0 ) ? 1 : -1 ) * step() ); + model()->setInitValue( model()->value() + + ( ( _we->delta() > 0 ) ? 1 : -1 ) * model()->step() ); emit manualChange(); } diff --git a/src/widgets/led_checkbox.cpp b/src/widgets/led_checkbox.cpp index 07f42a61c..320273c9e 100644 --- a/src/widgets/led_checkbox.cpp +++ b/src/widgets/led_checkbox.cpp @@ -31,7 +31,6 @@ #include #include -#include "automatable_object_templates.h" #include "embed.h" #include "gui_templates.h" @@ -44,9 +43,8 @@ static const QString names[ledCheckBox::TOTAL_COLORS] = ledCheckBox::ledCheckBox( const QString & _text, QWidget * _parent, - const QString & _name, track * _track, - ledColors _color ) : - automatableButton( _parent, _name, _track ), + const QString & _name, ledColors _color ) : + automatableButton( _parent, _name ), m_text( _text ) { setCheckable( TRUE ); @@ -82,7 +80,7 @@ void ledCheckBox::paintEvent( QPaintEvent * ) QPainter p( this ); p.setFont( pointSize<7>( font() ) ); - if( isChecked() == TRUE ) + if( model()->value() == TRUE ) { p.drawPixmap( 0, 0, *m_ledOnPixmap ); } diff --git a/src/widgets/pixmap_button.cpp b/src/widgets/pixmap_button.cpp index 17ee9b534..980a87534 100644 --- a/src/widgets/pixmap_button.cpp +++ b/src/widgets/pixmap_button.cpp @@ -30,14 +30,12 @@ #include #include "pixmap_button.h" -#include "automatable_object_templates.h" #include "embed.h" -pixmapButton::pixmapButton( QWidget * _parent, const QString & _name, - track * _track ) : - automatableButton( _parent, _name, _track ), +pixmapButton::pixmapButton( QWidget * _parent, const QString & _name ) : + automatableButton( _parent, _name ), m_activePixmap(), m_inactivePixmap() { @@ -59,7 +57,7 @@ void pixmapButton::paintEvent( QPaintEvent * ) { QPainter p( this ); - if( isChecked() ) + if( model()->value() ) { if( !m_activePixmap.isNull() ) { diff --git a/src/widgets/rack_plugin.cpp b/src/widgets/rack_plugin.cpp index 315c54fbb..ab7ad8c4f 100644 --- a/src/widgets/rack_plugin.cpp +++ b/src/widgets/rack_plugin.cpp @@ -51,6 +51,7 @@ rackPlugin::rackPlugin( QWidget * _parent, track * _track, audioPort * _port ) : QWidget( _parent ), + m_autoQuitModel( 1.0f, 1.0f, 8000.0f, 100.0f /* this */ ), m_effect( _eff ), m_track( _track ), m_port( _port ), @@ -65,35 +66,33 @@ rackPlugin::rackPlugin( QWidget * _parent, pal.setBrush( backgroundRole(), bg ); setPalette( pal ); - m_bypass = new ledCheckBox( "", this, tr( "Turn the effect off" ), - m_track ); - connect( m_bypass, SIGNAL( toggled( bool ) ), - this, SLOT( bypassed( bool ) ) ); - toolTip::add( m_bypass, tr( "On/Off" ) ); - m_bypass->setChecked( TRUE ); + m_effect->m_enabledModel.setTrack( m_track ); + m_effect->m_enabledModel.setValue( TRUE ); + m_bypass = new ledCheckBox( "", this, tr( "Turn the effect off" ) ); + m_bypass->setModel( &m_effect->m_enabledModel ); m_bypass->move( 3, 3 ); m_bypass->setWhatsThis( tr( "Toggles the effect on or off." ) ); + toolTip::add( m_bypass, tr( "On/Off" ) ); - m_wetDry = new knob( knobBright_26, this, tr( "Wet/Dry mix" ), - m_track ); - connect( m_wetDry, SIGNAL( valueChanged( float ) ), - this, SLOT( setWetDry( float ) ) ); + + m_effect->m_wetDryModel.setTrack( m_track ); + m_wetDry = new knob( knobBright_26, this, tr( "Wet/Dry mix" ) ); + m_wetDry->setModel( &m_effect->m_wetDryModel ); m_wetDry->setLabel( tr( "W/D" ) ); - m_wetDry->setRange( 0.0f, 1.0f, 0.01f ); - m_wetDry->setInitValue( 1.0f ); m_wetDry->move( 27, 5 ); m_wetDry->setHintText( tr( "Wet Level:" ) + " ", "" ); m_wetDry->setWhatsThis( tr( "The Wet/Dry knob sets the ratio between " "the input signal and the effect that " "shows up in the output." ) ); - m_autoQuit = new tempoSyncKnob( knobBright_26, this, tr( "Decay" ), - m_track ); - connect( m_autoQuit, SIGNAL( valueChanged( float ) ), - this, SLOT( setAutoQuit( float ) ) ); + + m_autoQuitModel.setTrack( m_track ); + m_autoQuitModel.setInitValue( 1.0f ); + connect( &m_autoQuitModel, SIGNAL( dataChanged( void ) ), + this, SLOT( updateAutoQuit( void ) ) ); + m_autoQuit = new tempoSyncKnob( knobBright_26, this, tr( "Decay" ) ); + m_autoQuit->setModel( &m_autoQuitModel ); m_autoQuit->setLabel( tr( "Decay" ) ); - m_autoQuit->setRange( 1.0f, 8000.0f, 100.0f ); - m_autoQuit->setInitValue( 1 ); m_autoQuit->move( 60, 5 ); m_autoQuit->setHintText( tr( "Time:" ) + " ", "ms" ); m_autoQuit->setWhatsThis( tr( @@ -101,18 +100,18 @@ rackPlugin::rackPlugin( QWidget * _parent, "plugin stops processing. Smaller values will reduce the CPU overhead but " "run the risk of clipping the tail on delay effects." ) ); - m_gate = new knob( knobBright_26, this, tr( "Gate" ), m_track ); - connect( m_wetDry, SIGNAL( valueChanged( float ) ), - this, SLOT( setGate( float ) ) ); + + m_effect->m_gateModel.setTrack( m_track ); + m_gate = new knob( knobBright_26, this, tr( "Gate" ) ); + m_gate->setModel( &m_effect->m_gateModel ); m_gate->setLabel( tr( "Gate" ) ); - m_gate->setRange( 0.0f, 1.0f, 0.01f ); - m_gate->setInitValue( 0.0f ); m_gate->move( 93, 5 ); m_gate->setHintText( tr( "Gate:" ) + " ", "" ); m_gate->setWhatsThis( tr( "The Gate knob controls the signal level that is considered to be 'silence' " "while deciding when to stop processing signals." ) ); + m_editButton = new QPushButton( tr( "Controls" ), this ); QFont f = m_editButton->font(); m_editButton->setFont( pointSize<7>( f ) ); @@ -133,17 +132,18 @@ rackPlugin::rackPlugin( QWidget * _parent, m_label->setPalette( pal ); m_controlView = m_effect->createControlDialog( m_track ); - m_subWindow = engine::getMainWindow()->workspace()->addSubWindow( m_controlView ); + m_subWindow = engine::getMainWindow()->workspace()->addSubWindow( + m_controlView ); connect( m_controlView, SIGNAL( closed() ), this, SLOT( closeEffects() ) ); - m_subWindow->hide(); - + m_subWindow->hide(); + if( m_controlView->getControlCount() == 0 ) { m_editButton->hide(); } - + setWhatsThis( tr( "Effect plugins function as a chained series of effects where the signal will " "be processed from top to bottom.\n\n" @@ -178,6 +178,7 @@ rackPlugin::rackPlugin( QWidget * _parent, + rackPlugin::~rackPlugin() { m_port->getEffects()->removeEffect( m_effect ); @@ -187,6 +188,7 @@ rackPlugin::~rackPlugin() + void rackPlugin::editControls( void ) { if( m_show ) @@ -205,24 +207,10 @@ void rackPlugin::editControls( void ) -void rackPlugin::bypassed( bool _state ) +void rackPlugin::updateAutoQuit( void ) { - m_effect->setBypass( !_state ); -} - - - - -void rackPlugin::setWetDry( float _value ) -{ - m_effect->setWetLevel( _value ); -} - - - -void rackPlugin::setAutoQuit( float _value ) -{ - float samples = engine::getMixer()->sampleRate() * _value / 1000.0f; + float samples = engine::getMixer()->sampleRate() * + m_autoQuitModel.value() / 1000.0f; Uint32 buffers = 1 + ( static_cast( samples ) / engine::getMixer()->framesPerPeriod() ); m_effect->setTimeout( buffers ); @@ -230,13 +218,6 @@ void rackPlugin::setAutoQuit( float _value ) -void rackPlugin::setGate( float _value ) -{ - m_effect->setGate( _value ); -} - - - void rackPlugin::contextMenuEvent( QContextMenuEvent * ) { @@ -298,10 +279,10 @@ void rackPlugin::displayHelp( void ) void FASTCALL rackPlugin::saveSettings( QDomDocument & _doc, QDomElement & _this ) { - _this.setAttribute( "on", m_bypass->isChecked() ); - _this.setAttribute( "wet", m_wetDry->value() ); - _this.setAttribute( "autoquit", m_autoQuit->value() ); - _this.setAttribute( "gate", m_gate->value() ); + _this.setAttribute( "on", m_effect->m_enabledModel.value() ); + _this.setAttribute( "wet", m_effect->m_wetDryModel.value() ); + _this.setAttribute( "autoquit", m_autoQuitModel.value() ); + _this.setAttribute( "gate", m_effect->m_gateModel.value() ); m_controlView->saveState( _doc, _this ); } @@ -310,10 +291,10 @@ void FASTCALL rackPlugin::saveSettings( QDomDocument & _doc, void FASTCALL rackPlugin::loadSettings( const QDomElement & _this ) { - m_bypass->setChecked( _this.attribute( "on" ).toInt() ); - m_wetDry->setValue( _this.attribute( "wet" ).toFloat() ); - m_autoQuit->setValue( _this.attribute( "autoquit" ).toFloat() ); - m_gate->setValue( _this.attribute( "gate" ).toFloat() ); + m_effect->m_enabledModel.setValue( _this.attribute( "on" ).toInt() ); + m_effect->m_wetDryModel.setValue( _this.attribute( "wet" ).toFloat() ); + m_autoQuitModel.setValue( _this.attribute( "autoquit" ).toFloat() ); + m_effect->m_gateModel.setValue( _this.attribute( "gate" ).toFloat() ); QDomNode node = _this.firstChild(); while( !node.isNull() ) diff --git a/src/widgets/tempo_sync_knob.cpp b/src/widgets/tempo_sync_knob.cpp index 2c3ab665d..2173b68d9 100644 --- a/src/widgets/tempo_sync_knob.cpp +++ b/src/widgets/tempo_sync_knob.cpp @@ -31,7 +31,8 @@ #include #include -#include "automatable_object_templates.h" +#include "automatable_model_templates.h" +#include "engine.h" #include "caption_menu.h" #include "embed.h" #include "main_window.h" @@ -41,9 +42,8 @@ tempoSyncKnob::tempoSyncKnob( int _knob_num, QWidget * _parent, const QString & _name, - track * _track, float _scale ) : - knob( _knob_num, _parent, _name, _track ), + knob( _knob_num, _parent, _name ), m_tempoSyncMode( NO_SYNC ), m_scale( _scale ), m_tempoSyncIcon( embed::getIconPixmap( "tempo_sync" ) ), @@ -53,7 +53,7 @@ tempoSyncKnob::tempoSyncKnob( int _knob_num, QWidget * _parent, connect( engine::getSongEditor(), SIGNAL( tempoChanged( bpm_t ) ), this, SLOT( calculateTempoSyncTime( bpm_t ) ) ); m_custom = new meterDialog( engine::getMainWindow()->workspace(), - _track ); + NULL ); m_custom->hide(); m_custom->setWindowTitle( "Meter" ); } @@ -76,19 +76,21 @@ void tempoSyncKnob::contextMenuEvent( QContextMenuEvent * ) { captionMenu contextMenu( accessibleName() ); contextMenu.addAction( embed::getIconPixmap( "reload" ), - tr( "&Reset (%1%2)" ).arg( m_initValue ).arg( - m_hintTextAfterValue ), - this, SLOT( reset() ) ); + tr( "&Reset (%1%2)" ). + arg( model()->initValue() ). + arg( m_hintTextAfterValue ), + this, SLOT( reset() ) ); contextMenu.addSeparator(); contextMenu.addAction( embed::getIconPixmap( "edit_copy" ), - tr( "&Copy value (%1%2)" ).arg( value() ).arg( - m_hintTextAfterValue ), - this, SLOT( copyValue() ) ); + tr( "&Copy value (%1%2)" ). + arg( value() ). + arg( m_hintTextAfterValue ), + this, SLOT( copyValue() ) ); contextMenu.addAction( embed::getIconPixmap( "edit_paste" ), - tr( "&Paste value (%1%2)" - ).arg( s_copiedValue ).arg( - m_hintTextAfterValue ), - this, SLOT( pasteValue() ) ); + tr( "&Paste value (%1%2)" ). + arg( s_copiedValue ). + arg( m_hintTextAfterValue ), + this, SLOT( pasteValue() ) ); contextMenu.addSeparator(); float limit = 60000.0f / ( engine::getSongEditor()->getTempo() * @@ -96,43 +98,44 @@ void tempoSyncKnob::contextMenuEvent( QContextMenuEvent * ) QMenu * syncMenu = contextMenu.addMenu( m_tempoSyncIcon, m_tempoSyncDescription ); - if( limit / 8.0f <= maxValue() ) + if( limit / 8.0f <= model()->maxValue() ) { + connect( syncMenu, SIGNAL( triggered( QAction * ) ), this, SLOT( setTempoSync( QAction * ) ) ); syncMenu->addAction( embed::getIconPixmap( "note_none" ), tr( "No Sync" ) )->setData( (int) NO_SYNC ); - if( limit / 0.125f <= maxValue() ) + if( limit / 0.125f <= model()->maxValue() ) { syncMenu->addAction( embed::getIconPixmap( "note_double_whole" ), tr( "Eight beats" ) )->setData( (int) DOUBLE_WHOLE_NOTE ); } - if( limit / 0.25f <= maxValue() ) + if( limit / 0.25f <= model()->maxValue() ) { syncMenu->addAction( embed::getIconPixmap( "note_whole" ), tr( "Whole note" ) )->setData( (int) WHOLE_NOTE ); } - if( limit / 0.5f <= maxValue() ) + if( limit / 0.5f <= model()->maxValue() ) { syncMenu->addAction( embed::getIconPixmap( "note_half" ), tr( "Half note" ) )->setData( (int) HALF_NOTE ); } - if( limit <= maxValue() ) + if( limit <= model()->maxValue() ) { syncMenu->addAction( embed::getIconPixmap( "note_quarter" ), tr( "Quarter note" ) )->setData( (int) QUARTER_NOTE ); } - if( limit / 2.0f <= maxValue() ) + if( limit / 2.0f <= model()->maxValue() ) { syncMenu->addAction( embed::getIconPixmap( "note_eighth" ), tr( "8th note" ) )->setData( (int) EIGHTH_NOTE ); } - if( limit / 4.0f <= maxValue() ) + if( limit / 4.0f <= model()->maxValue() ) { syncMenu->addAction( embed::getIconPixmap( "note_sixteenth" ), tr( "16th note" ) )->setData( @@ -146,11 +149,12 @@ void tempoSyncKnob::contextMenuEvent( QContextMenuEvent * ) this, SLOT( showCustom( void ) ) )->setData( (int) CUSTOM ); contextMenu.addSeparator(); + } - + contextMenu.addAction( embed::getIconPixmap( "automation" ), tr( "&Open in automation editor" ), - getAutomationPattern(), + model()->getAutomationPattern(), SLOT( openInAutomationEditor() ) ); contextMenu.addSeparator(); contextMenu.addAction( tr( "Connect to MIDI-device" ), this, @@ -193,6 +197,7 @@ void tempoSyncKnob::setTempoSync( QAction * _item ) + void tempoSyncKnob::setTempoSync( int _note_type ) { setSyncMode( ( tempoSyncMode ) _note_type ); @@ -258,9 +263,10 @@ void tempoSyncKnob::calculateTempoSyncTime( bpm_t _bpm ) break; default: ; } - bool journalling = testAndSetJournalling( FALSE ); - setValue( 60000.0 / ( _bpm * conversionFactor * m_scale ) ); - setJournalling( journalling ); + bool journalling = model()->testAndSetJournalling( FALSE ); + model()->setValue( 60000.0 / + ( _bpm * conversionFactor * m_scale ) ); + model()->setJournalling( journalling ); } else { @@ -328,7 +334,7 @@ void tempoSyncKnob::saveSettings( QDomDocument & _doc, QDomElement & _this, const QString & _name ) { _this.setAttribute( "syncmode", ( int ) getSyncMode() ); - automatableObject::saveSettings( _doc, _this, _name ); + model()->saveSettings( _doc, _this, _name ); m_custom->saveSettings( _doc, _this, _name ); } @@ -340,7 +346,7 @@ void tempoSyncKnob::loadSettings( const QDomElement & _this, { setSyncMode( ( tempoSyncMode ) _this.attribute( "syncmode" ).toInt() ); - automatableObject::loadSettings( _this, _name ); + model()->loadSettings( _this, _name ); m_custom->loadSettings( _this, _name ); } @@ -362,16 +368,16 @@ void tempoSyncKnob::setSyncMode( tempoSyncMode _new_mode ) m_tempoSyncMode = _new_mode; if( _new_mode == CUSTOM ) { - connect( m_custom, SIGNAL( numeratorChanged( int ) ), - this, SLOT( updateCustom( int ) ) ); - connect( m_custom, SIGNAL( denominatorChanged( int ) ), - this, SLOT( updateCustom( int ) ) ); + connect( m_custom, SIGNAL( numeratorChanged() ), + this, SLOT( updateCustom() ) ); + connect( m_custom, SIGNAL( denominatorChanged() ), + this, SLOT( updateCustom() ) ); } else { m_custom->hide(); disconnect( m_custom, 0, - this, SLOT( updateCustom( int ) ) ); + this, SLOT( updateCustom() ) ); } } calculateTempoSyncTime( engine::getSongEditor()->getTempo() ); @@ -432,7 +438,7 @@ void tempoSyncKnob::setSyncIcon( const QPixmap & _new_icon ) -void tempoSyncKnob::updateCustom( int ) +void tempoSyncKnob::updateCustom( void ) { setSyncMode( CUSTOM ); } diff --git a/src/widgets/volume_knob.cpp b/src/widgets/volume_knob.cpp index af8dd1420..2e35f0555 100644 --- a/src/widgets/volume_knob.cpp +++ b/src/widgets/volume_knob.cpp @@ -33,7 +33,7 @@ #include #include "volume_knob.h" -#include "automatable_object_templates.h" +#include "automatable_model_templates.h" #include "main_window.h" #include "config_mgr.h" #include "engine.h" @@ -42,9 +42,9 @@ -volumeKnob::volumeKnob( int _knob_num, QWidget * _parent, const QString & _name, - track * _track ) : - knob( _knob_num, _parent, _name, _track ) +volumeKnob::volumeKnob( int _knob_num, QWidget * _parent, + const QString & _name ) : + knob( _knob_num, _parent, _name ) { } @@ -64,7 +64,7 @@ void volumeKnob::mousePressEvent( QMouseEvent * _me ) if( _me->button() == Qt::LeftButton && engine::getMainWindow()->isCtrlPressed() == FALSE ) { - prepareJournalEntryFromOldVal(); + model()->prepareJournalEntryFromOldVal(); const QPoint & p = _me->pos(); m_origMousePos = p; @@ -116,14 +116,14 @@ void volumeKnob::mousePressEvent( QMouseEvent * _me ) -//! Mouse Move Event handler void volumeKnob::mouseMoveEvent( QMouseEvent * _me ) { + // TODO: merge code with knob::mouseMoveEvent if( m_buttonPressed == TRUE ) { setPosition( _me->pos() ); - emit sliderMoved( value() ); - emit valueChanged(); + emit sliderMoved( model()->value() ); +// emit valueChanged(); if( !configManager::inst()->value( "knobs", "classicalusability").toInt() ) { @@ -135,12 +135,12 @@ void volumeKnob::mouseMoveEvent( QMouseEvent * _me ) if( configManager::inst()->value( "app", "displaydbv" ).toInt() ) { val = QString( " %1 dBV" ).arg( - 20.0 * log10( value() / 100.0 ), + 20.0 * log10( model()->value() / 100.0 ), 3, 'f', 2 ); } else { - val = QString( " %1%" ).arg( value(), 3, 'f', 0 ); + val = QString( " %1%" ).arg( model()->value(), 3, 'f', 0 ); } s_textFloat->setText( m_hintTextBeforeValue + val ); } @@ -150,9 +150,10 @@ void volumeKnob::mouseMoveEvent( QMouseEvent * _me ) void volumeKnob::wheelEvent( QWheelEvent * _we ) { + // TODO: merge code with knob::mouseMoveEvent _we->accept(); const int inc = ( _we->delta() > 0 ) ? 1 : -1; - incValue( inc ); + model()->incValue( inc ); s_textFloat->reparent( this ); @@ -161,12 +162,12 @@ void volumeKnob::wheelEvent( QWheelEvent * _we ) if( configManager::inst()->value( "app", "displaydbv" ).toInt() ) { val = QString( " %1 dBV" ).arg( - 20.0 * log10( value() / 100.0 ), + 20.0 * log10( model()->value() / 100.0 ), 3, 'f', 2 ); } else { - val = QString( " %1%" ).arg( value(), 3, 'f', 0 ); + val = QString( " %1%" ).arg( model()->value(), 3, 'f', 0 ); } s_textFloat->setText( m_hintTextBeforeValue + val ); @@ -174,8 +175,8 @@ void volumeKnob::wheelEvent( QWheelEvent * _we ) QPoint( m_knobPixmap->width() + 2, 0 ) ); s_textFloat->setVisibilityTimeOut( 1000 ); - emit sliderMoved( value() ); - emit valueChanged(); + emit sliderMoved( model()->value() ); +// emit valueChanged(); } @@ -191,7 +192,7 @@ void volumeKnob::enterValue( void ) this, accessibleName(), tr( "Please enter a new value between " "-96.0 dBV and 6.0 dBV:" ), - 20.0 * log10( value() / 100.0 ), + 20.0 * log10( model()->value() / 100.0 ), -96.0, 6.0, 4, &ok ); if( new_val <= -96.0 ) { @@ -207,15 +208,17 @@ void volumeKnob::enterValue( void ) new_val = QInputDialog::getDouble( this, accessibleName(), tr( "Please enter a new value between " - "%1 and %2:" ).arg( - minValue() ).arg( maxValue() ), - value(), minValue(), maxValue(), - 4, &ok ); + "%1 and %2:" ). + arg( model()->minValue() ). + arg( model()->maxValue() ), + model()->value(), + model()->minValue(), + model()->maxValue(), 4, &ok ); } - + if( ok ) { - setValue( new_val ); + model()->setValue( new_val ); } } From e07c7fccee6d5c550f22d5b12c339928a1509989 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Thu, 3 Jan 2008 00:55:21 +0000 Subject: [PATCH 04/87] make dummyEffect really work in case we need it git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@637 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 6 ++++++ include/dummy_effect.h | 28 +++++++++++++++++++++++++--- src/core/effect.cpp | 4 ++-- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index dd04c8d47..e54b56753 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-01-02 Tobias Doerffel + + * include/dummy_effect.h: + * src/core/effect.cpp: + make dummyEffect really work in case we need it + 2008-01-02 Tobias Doerffel * include/knob.h: diff --git a/include/dummy_effect.h b/include/dummy_effect.h index 274c179e3..435b4ae00 100644 --- a/include/dummy_effect.h +++ b/include/dummy_effect.h @@ -1,7 +1,7 @@ /* * dummy_effect.h - effect used as fallback if an effect couldn't be loaded * - * Copyright (c) 2006 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -27,6 +27,29 @@ #define _DUMMY_EFFECT_H #include "effect.h" +#include "effect_control_dialog.h" + + +class dummyEffectControlDialog : public effectControlDialog +{ +public: + dummyEffectControlDialog( effect * _eff ) : + effectControlDialog( NULL, _eff ) + { + } + + virtual ch_cnt_t getControlCount( void ) + { + return( 0 ); + } + + inline virtual QString nodeName( void ) const + { + return( "dummycontrols" ); + } + +} ; + class dummyEffect : public effect @@ -57,8 +80,7 @@ public: inline virtual effectControlDialog * createControlDialog( track * ) { - // TODO: setup a dummy control-dialog for not crashing LMMS - return( NULL ); + return( new dummyEffectControlDialog( this ) ); } } ; diff --git a/src/core/effect.cpp b/src/core/effect.cpp index 16a150137..57dd9b1ea 100644 --- a/src/core/effect.cpp +++ b/src/core/effect.cpp @@ -4,7 +4,7 @@ * effect.cpp - base-class for effects * * Copyright (c) 2006-2007 Danny McRae - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -35,7 +35,7 @@ effect::effect( const plugin::descriptor * _desc, const descriptor::subPluginFeatures::key * _key ) : plugin( _desc ), - m_key( *_key ), + m_key( _key ? *_key : descriptor::subPluginFeatures::key() ), m_okay( TRUE ), m_noRun( FALSE ), m_running( FALSE ), From ea467f92b762a021db36b36b2de266da87c3923e Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Thu, 3 Jan 2008 00:57:51 +0000 Subject: [PATCH 05/87] M/V-split for instrument-tracks git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@638 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 13 +++ include/dummy_instrument.h | 10 +- include/instrument.h | 52 ++++++++-- include/mv_base.h | 16 ++-- plugins/kicker/kicker.cpp | 162 ++++++++++++++++++-------------- plugins/kicker/kicker.h | 32 ++++++- src/core/instrument.cpp | 55 ++++++++++- src/tracks/instrument_track.cpp | 8 +- 8 files changed, 254 insertions(+), 94 deletions(-) diff --git a/ChangeLog b/ChangeLog index e54b56753..293c38528 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2008-01-02 Tobias Doerffel + + * plugins/kicker/kicker.cpp: + * plugins/kicker/kicker.h: + make plugin work with M/V-architecture + + * include/instrument.h: + * include/dummy_instrument.h: + * include/mv_base.h: + * src/tracks/instrument_track.cpp: + * src/core/instrument.cpp: + M/V-split for instrument-tracks + 2008-01-02 Tobias Doerffel * include/dummy_effect.h: diff --git a/include/dummy_instrument.h b/include/dummy_instrument.h index dd9fa4212..736d4ee56 100644 --- a/include/dummy_instrument.h +++ b/include/dummy_instrument.h @@ -2,7 +2,7 @@ * dummy_instrument.h - instrument used as fallback if an instrument couldn't * be loaded * - * Copyright (c) 2005-2006 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -33,8 +33,8 @@ class dummyInstrument : public instrument { public: - inline dummyInstrument( instrumentTrack * _channel_track ) : - instrument( _channel_track, NULL ) + inline dummyInstrument( instrumentTrack * _instrument_track ) : + instrument( _instrument_track, NULL ) { } @@ -56,6 +56,10 @@ public: return( "dummyinstrument" ); } + virtual instrumentView * createView( QWidget * _parent ) + { + return( new instrumentView( this, _parent ) ); + } } ; diff --git a/include/instrument.h b/include/instrument.h index a9a8035c5..55f823cbc 100644 --- a/include/instrument.h +++ b/include/instrument.h @@ -2,7 +2,7 @@ * instrument.h - declaration of class instrument, which provides a * standard interface for all instrument plugins * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -27,29 +27,33 @@ #ifndef _INSTRUMENT_H #define _INSTRUMENT_H - #include -#include #include "plugin.h" #include "mixer.h" +#include "mv_base.h" // forward-declarations class instrumentTrack; -class notePlayHandle; +class instrumentView; class midiEvent; class midiTime; +class notePlayHandle; class track; -class instrument : public QWidget, public plugin +class instrument : public plugin, public model { public: - instrument( instrumentTrack * _channel_track, + instrument( instrumentTrack * _instrument_track, const descriptor * _descriptor ); virtual ~instrument(); + // -------------------------------------------------------------------- + // functions that can/should be re-implemented: + // -------------------------------------------------------------------- + // if the plugin doesn't play each note, it can create an instrument- // play-handle and re-implement this method, so that it mixes it's // output buffer only once per mixer-period @@ -101,13 +105,20 @@ public: return( FALSE ); } + + // -------------------------------------------------------------------- + // provided functions: + // -------------------------------------------------------------------- + // instantiate instrument-plugin with given name or return NULL // on failure static instrument * FASTCALL instantiate( const QString & _plugin_name, - instrumentTrack * _channel_track ); + instrumentTrack * _instrument_track ); virtual bool isFromTrack( const track * _track ) const; + instrumentView * createEditor( QWidget * _parent ); + protected: inline instrumentTrack * getInstrumentTrack( void ) const @@ -120,6 +131,10 @@ protected: // desiredReleaseFrames() frames are left void applyRelease( sampleFrame * buf, const notePlayHandle * _n ); + // instruments have to implement this to create an according view for + // themselves + virtual instrumentView * createView( QWidget * _parent ) = 0; + private: instrumentTrack * m_instrumentTrack; @@ -127,4 +142,27 @@ private: } ; + +class instrumentView : public QWidget, public modelView +{ +public: + instrumentView( instrument * _instrument, QWidget * _parent ); + virtual ~instrumentView(); + + instrument * model( void ) + { + return( castModel() ); + } + + const instrument * model( void ) const + { + return( castModel() ); + } + + virtual void setModel( ::model * _model, bool = FALSE ); + +} ; + + + #endif diff --git a/include/mv_base.h b/include/mv_base.h index d0c990c5d..dab64b2c0 100644 --- a/include/mv_base.h +++ b/include/mv_base.h @@ -1,7 +1,7 @@ /* * mv_base.h - base for M/V-architecture of LMMS * - * Copyright (c) 2007 Tobias Doerffel + * Copyright (c) 2007-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -77,12 +77,7 @@ public: { } - void setModel( model * _model, bool _old_model_valid = TRUE ); - - // sub-classes can re-implement this to track model-changes - virtual void modelChanged( void ) - { - } + virtual void setModel( model * _model, bool _old_model_valid = TRUE ); template T * castModel( void ) @@ -97,6 +92,13 @@ public: } +protected: + // sub-classes can re-implement this to track model-changes + virtual void modelChanged( void ) + { + } + + private: model * m_model; diff --git a/plugins/kicker/kicker.cpp b/plugins/kicker/kicker.cpp index d2e738a8c..1e2a498b5 100644 --- a/plugins/kicker/kicker.cpp +++ b/plugins/kicker/kicker.cpp @@ -1,7 +1,7 @@ /* * kicker.cpp - bassdrum-synthesizer * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -32,6 +32,7 @@ #include "knob.h" #include "note_play_handle.h" #include "sweep_oscillator.h" +#include "automatable_model_templates.h" #undef SINGLE_SOURCE_COMPILE #include "embed.cpp" @@ -57,58 +58,13 @@ plugin::descriptor kicker_plugin_descriptor = kickerInstrument::kickerInstrument( instrumentTrack * _instrument_track ) : - instrument( _instrument_track, &kicker_plugin_descriptor ) + instrument( _instrument_track, &kicker_plugin_descriptor ), + m_startFreqModel( 150.0f, 5.0f, 1000.0f, 1.0f, this ), + m_endFreqModel( 40.0f, 5.0f, 1000.0f, 1.0f, this ), + m_decayModel( 120.0f, 5.0f, 1000.0f, 1.0f, this ), + m_distModel( 0.8f, 0.0f, 100.0f, 0.1f, this ), + m_gainModel( 1.0f, 0.1f, 5.0f, 0.05f, this ) { - QVBoxLayout * vl = new QVBoxLayout( this ); - QHBoxLayout * hl = new QHBoxLayout; - m_startFreqKnob = new knob( knobDark_28, this, tr( "Start frequency" ), - _instrument_track ); - m_startFreqKnob->setRange( 5.0f, 1000.0f, 1.0f ); - m_startFreqKnob->setInitValue( 150.0f ); - m_startFreqKnob->setLabel( tr( "START" ) ); - m_startFreqKnob->setHintText( tr( "Start frequency:" ) + " ", "Hz" ); - - m_endFreqKnob = new knob( knobDark_28, this, tr( "End frequency" ), - _instrument_track ); - m_endFreqKnob->setRange( 5.0f, 1000.0f, 1.0f ); - m_endFreqKnob->setInitValue( 40.0f ); - m_endFreqKnob->setLabel( tr( "END" ) ); - m_endFreqKnob->setHintText( tr( "End frequency:" ) + " ", "Hz" ); - - m_decayKnob = new knob( knobDark_28, this, tr( "Decay" ), - _instrument_track ); - m_decayKnob->setRange( 5.0f, 1000.0f, 1.0f ); - m_decayKnob->setInitValue( 120.0f ); - m_decayKnob->setLabel( tr( "DECAY" ) ); - m_decayKnob->setHintText( tr( "Decay:" ) + " ", "ms" ); - - m_distKnob = new knob( knobDark_28, this, tr( "Distortion" ), - _instrument_track ); - m_distKnob->setRange( 0.0f, 100.0f, 0.1f ); - m_distKnob->setInitValue( 0.8f ); - m_distKnob->setLabel( tr( "DIST" ) ); - m_distKnob->setHintText( tr( "Distortion:" ) + " ", "" ); - - m_gainKnob = new knob( knobDark_28, this, tr( "Gain" ), - _instrument_track ); - m_gainKnob->setRange( 0.1f, 5.0f, 0.05f ); - m_gainKnob->setInitValue( 1.0f ); - m_gainKnob->setLabel( tr( "GAIN" ) ); - m_gainKnob->setHintText( tr( "Gain:" ) + " ", "" ); - - hl->addWidget( m_startFreqKnob ); - hl->addWidget( m_endFreqKnob ); - hl->addWidget( m_decayKnob ); - hl->addWidget( m_distKnob ); - hl->addWidget( m_gainKnob ); - - vl->addLayout( hl ); - - setAutoFillBackground( TRUE ); - QPalette pal; - pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( - "artwork" ) ); - setPalette( pal ); } @@ -124,11 +80,11 @@ kickerInstrument::~kickerInstrument() void kickerInstrument::saveSettings( QDomDocument & _doc, QDomElement & _this ) { - m_startFreqKnob->saveSettings( _doc, _this, "startfreq" ); - m_endFreqKnob->saveSettings( _doc, _this, "endfreq" ); - m_decayKnob->saveSettings( _doc, _this, "decay" ); - m_distKnob->saveSettings( _doc, _this, "dist" ); - m_gainKnob->saveSettings( _doc, _this, "gain" ); + m_startFreqModel.saveSettings( _doc, _this, "startfreq" ); + m_endFreqModel.saveSettings( _doc, _this, "endfreq" ); + m_decayModel.saveSettings( _doc, _this, "decay" ); + m_distModel.saveSettings( _doc, _this, "dist" ); + m_gainModel.saveSettings( _doc, _this, "gain" ); } @@ -136,11 +92,11 @@ void kickerInstrument::saveSettings( QDomDocument & _doc, void kickerInstrument::loadSettings( const QDomElement & _this ) { - m_startFreqKnob->loadSettings( _this, "startfreq" ); - m_endFreqKnob->loadSettings( _this, "endfreq" ); - m_decayKnob->loadSettings( _this, "decay" ); - m_distKnob->loadSettings( _this, "dist" ); - m_gainKnob->loadSettings( _this, "gain" ); + m_startFreqModel.loadSettings( _this, "startfreq" ); + m_endFreqModel.loadSettings( _this, "endfreq" ); + m_decayModel.loadSettings( _this, "decay" ); + m_distModel.loadSettings( _this, "dist" ); + m_gainModel.loadSettings( _this, "gain" ); } @@ -160,15 +116,15 @@ typedef sweepOscillator > sweepOsc; void kickerInstrument::playNote( notePlayHandle * _n, bool ) { - const float decfr = m_decayKnob->value() * + const float decfr = m_decayModel.value() * engine::getMixer()->sampleRate() / 1000.0f; const f_cnt_t tfp = _n->totalFramesPlayed(); if ( tfp == 0 ) { _n->m_pluginData = new sweepOsc( - distFX( m_distKnob->value(), - m_gainKnob->value() ) ); + distFX( m_distModel.value(), + m_gainModel.value() ) ); } else if( tfp > decfr && !_n->released() ) { @@ -176,7 +132,7 @@ void kickerInstrument::playNote( notePlayHandle * _n, bool ) } //const float freq = getInstrumentTrack()->frequency( _n ) / 2; - const float fdiff = m_endFreqKnob->value() - m_startFreqKnob->value(); + const float fdiff = m_endFreqModel.value() - m_startFreqModel.value(); /* const fpp_t frames = _n->released() ? tMax( tMin( desiredReleaseFrames() - _n->releaseFramesDone(), @@ -184,8 +140,8 @@ void kickerInstrument::playNote( notePlayHandle * _n, bool ) : engine::getMixer()->framesPerAudioBuffer();*/ const fpp_t frames = _n->framesLeftForCurrentPeriod(); - const float f1 = m_startFreqKnob->value() + tfp * fdiff / decfr; - const float f2 = m_startFreqKnob->value() + (frames+tfp-1)*fdiff/decfr; + const float f1 = m_startFreqModel.value() + tfp * fdiff / decfr; + const float f2 = m_startFreqModel.value() + (frames+tfp-1)*fdiff/decfr; sampleFrame * buf = new sampleFrame[frames]; @@ -222,6 +178,76 @@ void kickerInstrument::deleteNotePluginData( notePlayHandle * _n ) +instrumentView * kickerInstrument::createView( QWidget * _parent ) +{ + return( new kickerInstrumentView( this, _parent ) ); +} + + + + +kickerInstrumentView::kickerInstrumentView( instrument * _instrument, + QWidget * _parent ) : + instrumentView( _instrument, _parent ) +{ + QVBoxLayout * vl = new QVBoxLayout( this ); + QHBoxLayout * hl = new QHBoxLayout; + m_startFreqKnob = new knob( knobDark_28, this, tr( "Start frequency" ) ); + m_startFreqKnob->setLabel( tr( "START" ) ); + m_startFreqKnob->setHintText( tr( "Start frequency:" ) + " ", "Hz" ); + + m_endFreqKnob = new knob( knobDark_28, this, tr( "End frequency" ) ); + m_endFreqKnob->setLabel( tr( "END" ) ); + m_endFreqKnob->setHintText( tr( "End frequency:" ) + " ", "Hz" ); + + m_decayKnob = new knob( knobDark_28, this, tr( "Decay" ) ); + m_decayKnob->setLabel( tr( "DECAY" ) ); + m_decayKnob->setHintText( tr( "Decay:" ) + " ", "ms" ); + + m_distKnob = new knob( knobDark_28, this, tr( "Distortion" ) ); + m_distKnob->setLabel( tr( "DIST" ) ); + m_distKnob->setHintText( tr( "Distortion:" ) + " ", "" ); + + m_gainKnob = new knob( knobDark_28, this, tr( "Gain" ) ); + m_gainKnob->setLabel( tr( "GAIN" ) ); + m_gainKnob->setHintText( tr( "Gain:" ) + " ", "" ); + + hl->addWidget( m_startFreqKnob ); + hl->addWidget( m_endFreqKnob ); + hl->addWidget( m_decayKnob ); + hl->addWidget( m_distKnob ); + hl->addWidget( m_gainKnob ); + + vl->addLayout( hl ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( + "artwork" ) ); + setPalette( pal ); +} + + + + +kickerInstrumentView::~kickerInstrumentView() +{ +} + + + + +void kickerInstrumentView::modelChanged( void ) +{ + kickerInstrument * k = castModel(); + m_startFreqKnob->setModel( &k->m_startFreqModel ); + m_endFreqKnob->setModel( &k->m_endFreqModel ); + m_decayKnob->setModel( &k->m_decayModel ); + m_distKnob->setModel( &k->m_distModel ); + m_gainKnob->setModel( &k->m_gainModel ); +} + + diff --git a/plugins/kicker/kicker.h b/plugins/kicker/kicker.h index 2d9782f2d..152a5c746 100644 --- a/plugins/kicker/kicker.h +++ b/plugins/kicker/kicker.h @@ -1,7 +1,7 @@ /* * kicker.h - bassdrum-synthesizer * - * Copyright (c) 2006 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -27,10 +27,11 @@ #define _KICKER_H #include "instrument.h" +#include "knob.h" +class kickerInstrumentView; class notePlayHandle; -class knob; class kickerInstrument : public instrument @@ -55,13 +56,40 @@ public: return( 512 ); } + virtual instrumentView * createView( QWidget * _parent ); + + private: + knobModel m_startFreqModel; + knobModel m_endFreqModel; + knobModel m_decayModel; + knobModel m_distModel; + knobModel m_gainModel; + + friend class kickerInstrumentView; + +} ; + + + +class kickerInstrumentView : public instrumentView +{ +public: + kickerInstrumentView( instrument * _instrument, + QWidget * _parent ); + virtual ~kickerInstrumentView(); + +private: + virtual void modelChanged( void ); + knob * m_startFreqKnob; knob * m_endFreqKnob; knob * m_decayKnob; knob * m_distKnob; knob * m_gainKnob; + } ; + #endif diff --git a/src/core/instrument.cpp b/src/core/instrument.cpp index a26cd4c8e..48c0312eb 100644 --- a/src/core/instrument.cpp +++ b/src/core/instrument.cpp @@ -3,7 +3,7 @@ /* * instrument.cpp - base-class for all instrument-plugins (synths, samplers etc) * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -34,12 +34,10 @@ instrument::instrument( instrumentTrack * _instrument_track, const descriptor * _descriptor ) : - QWidget( _instrument_track->tabWidgetParent() ), plugin( _descriptor ), + model( /* _instrument_track */ NULL ), m_instrumentTrack( _instrument_track ) { - setFixedSize( 250, 250 ); - m_instrumentTrack->setWindowIcon( *getDescriptor()->logo ); } @@ -107,6 +105,16 @@ bool instrument::isFromTrack( const track * _track ) const +instrumentView * instrument::createEditor( QWidget * _parent ) +{ + instrumentView * i = createView( _parent ); + i->setModel( this ); + return( i ); +} + + + + void instrument::applyRelease( sampleFrame * buf, const notePlayHandle * _n ) { const fpp_t frames = _n->framesLeftForCurrentPeriod(); @@ -128,4 +136,43 @@ void instrument::applyRelease( sampleFrame * buf, const notePlayHandle * _n ) } } + + + + + + + +instrumentView::instrumentView( instrument * _instrument, QWidget * _parent ) : + QWidget( _parent ), + modelView() +{ + setModel( _instrument ); + setFixedSize( 250, 250 ); +} + + + + +instrumentView::~instrumentView() +{ +} + + + +void instrumentView::setModel( ::model * _model, bool ) +{ + if( dynamic_cast( _model ) != NULL ) + { + modelView::setModel( _model ); + if( dynamic_cast( parentWidget() ) != NULL ) + { + dynamic_cast( parentWidget() )-> + setWindowIcon( *( model()-> + getDescriptor()->logo ) ); + } + } +} + + #endif diff --git a/src/tracks/instrument_track.cpp b/src/tracks/instrument_track.cpp index f9296a4c2..ca5a1344e 100644 --- a/src/tracks/instrument_track.cpp +++ b/src/tracks/instrument_track.cpp @@ -4,7 +4,7 @@ * instrument_track.cpp - implementation of instrument-track-class * (window + data-structures) * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -1040,7 +1040,8 @@ void instrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) m_instrument->restoreState( node.toElement() ); } - m_tabWidget->addTab( m_instrument, + m_tabWidget->addTab( m_instrument-> + createEditor( m_tabWidget ), tr( "PLUGIN" ), 0 ); } } @@ -1075,7 +1076,8 @@ instrument * instrumentTrack::loadInstrument( const QString & _plugin_name ) m_instrument = instrument::instantiate( _plugin_name, this ); engine::getMixer()->unlock(); - m_tabWidget->addTab( m_instrument, tr( "PLUGIN" ), 0 ); + m_tabWidget->addTab( m_instrument->createEditor( m_tabWidget ), + tr( "PLUGIN" ), 0 ); m_tabWidget->setActiveTab( 0 ); m_tswInstrumentTrackButton->update(); From 8c1715cc26e4c6abd7feb105bb3ecb8b94d6a808 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Fri, 4 Jan 2008 00:18:14 +0000 Subject: [PATCH 06/87] made AudioFileProcessor work with M/V-architecture git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@639 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 13 +- include/engine.h | 10 +- include/plugin.h | 3 +- .../audio_file_processor.cpp | 526 ++++++++++-------- .../audio_file_processor.h | 66 ++- src/core/engine.cpp | 12 +- 6 files changed, 355 insertions(+), 275 deletions(-) diff --git a/ChangeLog b/ChangeLog index 293c38528..e13faa50b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,19 @@ +2008-01-04 Tobias Doerffel + + * plugins/audio_file_processor/audio_file_processor.cpp: + * plugins/audio_file_processor/audio_file_processor.h: + made plugin work with M/V-architecture + + * include/engine.h: + * include/plugin.h: + * src/core/engine.cpp: + fixes regarding coding style guidelines + 2008-01-02 Tobias Doerffel * plugins/kicker/kicker.cpp: * plugins/kicker/kicker.h: - make plugin work with M/V-architecture + made plugin work with M/V-architecture * include/instrument.h: * include/dummy_instrument.h: diff --git a/include/engine.h b/include/engine.h index ab9decf3d..601c70536 100644 --- a/include/engine.h +++ b/include/engine.h @@ -101,19 +101,19 @@ public: static float framesPerTact64th( void ) { - return( s_frames_per_tact64th ); + return( s_framesPerTact64th ); } static void updateFramesPerTact64th( void ); static const QMap & sampleExtensions( void ) { - return( s_sample_extensions ); + return( s_sampleExtensions ); } private: static bool s_hasGUI; - static float s_frames_per_tact64th; + static float s_framesPerTact64th; static mixer * s_mixer; static mainWindow * s_mainWindow; @@ -125,9 +125,9 @@ private: static projectJournal * s_projectJournal; static ladspa2LMMS * s_ladspaManager; - static QMap s_sample_extensions; + static QMap s_sampleExtensions; - static void load_extensions( void ); + static void loadExtensions( void ); } ; diff --git a/include/plugin.h b/include/plugin.h index 791808690..5cea2a568 100644 --- a/include/plugin.h +++ b/include/plugin.h @@ -91,7 +91,8 @@ public: desc( NULL ) { const QList l = - base64::decode( _dump_data, QVariant::List ). + base64::decode( _dump_data, + QVariant::List ). toList(); if( l.empty() ) { diff --git a/plugins/audio_file_processor/audio_file_processor.cpp b/plugins/audio_file_processor/audio_file_processor.cpp index 0c061c3d4..b8c519d05 100644 --- a/plugins/audio_file_processor/audio_file_processor.cpp +++ b/plugins/audio_file_processor/audio_file_processor.cpp @@ -31,18 +31,16 @@ #include "audio_file_processor.h" +#include "automatable_model_templates.h" #include "engine.h" #include "song_editor.h" #include "instrument_track.h" #include "note_play_handle.h" #include "interpolation.h" #include "gui_templates.h" -#include "pixmap_button.h" -#include "knob.h" #include "tooltip.h" #include "string_pair_drag.h" #include "mmp.h" -#include "volume_knob.h" #undef SINGLE_SOURCE_COMPILE @@ -70,120 +68,31 @@ plugin::descriptor audiofileprocessor_plugin_descriptor = } -QPixmap * audioFileProcessor::s_artwork = NULL; -audioFileProcessor::audioFileProcessor( instrumentTrack * _channel_track ) : - instrument( _channel_track, &audiofileprocessor_plugin_descriptor ) +audioFileProcessor::audioFileProcessor( instrumentTrack * _instrument_track ) : + instrument( _instrument_track, &audiofileprocessor_plugin_descriptor ), + m_sampleBuffer(), + m_ampModel( 100, 0, 500, 1, this ), + m_startPointModel( 0, 0, 1, 0.0000001f, this ), + m_endPointModel( 1, 0, 1, 0.0000001f, this ), + m_reverseModel( FALSE, FALSE, TRUE, boolModel::defaultRelStep(), this ), + m_loopModel( FALSE, FALSE, TRUE, boolModel::defaultRelStep(), this ) { - connect( &m_sampleBuffer, SIGNAL( sampleUpdated() ), this, - SLOT( sampleUpdated() ) ); - - if( s_artwork == NULL ) - { - s_artwork = new QPixmap( PLUGIN_NAME::getIconPixmap( - "artwork" ) ); - } - - - m_openAudioFileButton = new pixmapButton( this, NULL, NULL ); - m_openAudioFileButton->setCursor( QCursor( Qt::PointingHandCursor ) ); - m_openAudioFileButton->move( 200, 90 ); - m_openAudioFileButton->setActiveGraphic( embed::getIconPixmap( - "project_open_down" ) ); - m_openAudioFileButton->setInactiveGraphic( embed::getIconPixmap( - "project_open" ) ); - connect( m_openAudioFileButton, SIGNAL( clicked() ), this, - SLOT( openAudioFile() ) ); - toolTip::add( m_openAudioFileButton, tr( "Open other sample" ) ); - - m_openAudioFileButton->setWhatsThis( - tr( "Click here, if you want to open another audio-file. After " - "clicking on this button, a file-open-dialog appears " - "and you can select your file. Settings like Looping-" - "Mode, start- and end-point, amplify-value and so on " - "are not reset, so please don't wonder if your sample " - "doesn't sound like the original one..." ) ); - - m_reverseButton = new pixmapButton( this, NULL, NULL ); - m_reverseButton->setCheckable( TRUE ); - m_reverseButton->move( 160, 124 ); - m_reverseButton->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "reverse_on" ) ); - m_reverseButton->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "reverse_off" ) ); - connect( m_reverseButton, SIGNAL( toggled( bool ) ), this, - SLOT( reverseBtnToggled( bool ) ) ); - toolTip::add( m_reverseButton, tr( "Reverse sample" ) ); - m_reverseButton->setWhatsThis( - tr( "If you enable this button, the whole sample is reversed. " - "This is useful for cool effects, e.g. a reversed " - "crash." ) ); - - m_loopButton = new pixmapButton( this, tr( "Loop" ), _channel_track ); - m_loopButton->setCheckable( TRUE ); - m_loopButton->move( 180, 124 ); - m_loopButton->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "loop_on" ) ); - m_loopButton->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "loop_off" ) ); - toolTip::add( m_loopButton, - tr( "Loop sample at start- and end-point" ) ); - m_loopButton->setWhatsThis( - tr( "Here you can set, whether Looping-Mode is enabled. If " - "enabled, AudioFileProcessor loops between start- and " - "end-point of a sample until the whole note is played. " - "This is useful for things like string- and choir-" - "samples." ) ); - - m_ampKnob = new volumeKnob( knobDark_28, this, tr( "Amplify" ), NULL ); - m_ampKnob->setRange( 0, 500, 1.0f ); - m_ampKnob->move( 6, 114 ); - m_ampKnob->setInitValue( 100.0f ); - m_ampKnob->setHintText( tr( "Amplify:" )+" ", "%" ); - m_ampKnob->setLabel( tr( "AMP" ) ); - connect( m_ampKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( ampKnobChanged( float ) ) ); - m_ampKnob->setWhatsThis( - tr( "With this knob you can set the amplify-ratio. When you " - "set a value of 100% your sample isn't changed. " - "Otherwise it will be amplified up or down (your " - "actual sample-file isn't touched!)" ) ); - - m_startKnob = new knob( knobDark_28, this, tr( "Start of sample" ), - _channel_track ); - m_startKnob->setRange( 0.0f, 1.0f, 0.00001f ); - m_startKnob->move( 46, 114 ); - m_startKnob->setInitValue( 0.0f ); - m_startKnob->setHintText( tr( "Startpoint:" )+" ", "" ); - m_startKnob->setLabel( tr( "START" ) ); - connect( m_startKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( startKnobChanged( float ) ) ); - m_startKnob->setWhatsThis( - tr( "With this knob you can set the point where " - "AudioFileProcessor should begin playing your sample. " - "If you enable Looping-Mode, this is the point to " - "which AudioFileProcessor returns if a note is longer " - "than the sample between start- and end-point." ) ); - - m_endKnob = new knob( knobDark_28, this, tr( "End of sample" ), - _channel_track ); - m_endKnob->setRange( 0.0f, 1.0f, 0.00001f ); - m_endKnob->move( 84, 114 ); - m_endKnob->setInitValue( 1.0f ); - m_endKnob->setHintText( tr( "Endpoint:" )+" ", "" ); - m_endKnob->setLabel( tr( "END" ) ); - connect( m_endKnob, SIGNAL( valueChanged( float ) ), this, - SLOT( endKnobChanged( float ) ) ); - m_endKnob->setWhatsThis( - tr( "With this knob you can set the point where " - "AudioFileProcessor should stop playing your sample. " - "If you enable Looping-Mode, this is the point where " - "AudioFileProcessor returns if a note is longer than " - "the sample between start- and end-point." ) ); - - setAcceptDrops( TRUE ); + connect( &m_reverseModel, SIGNAL( dataChanged() ), + this, SLOT( reverseModelChanged() ) ); + connect( &m_ampModel, SIGNAL( dataChanged() ), + this, SLOT( ampModelChanged() ) ); + connect( &m_startPointModel, SIGNAL( dataChanged() ), + this, SLOT( startPointModelChanged() ) ); + connect( &m_endPointModel, SIGNAL( dataChanged() ), + this, SLOT( endPointModelChanged() ) ); + m_ampModel.setTrack( _instrument_track ); + m_startPointModel.setTrack( _instrument_track ); + m_endPointModel.setTrack( _instrument_track ); + m_reverseModel.setTrack( _instrument_track ); + m_loopModel.setTrack( _instrument_track ); } @@ -196,6 +105,37 @@ audioFileProcessor::~audioFileProcessor() +void audioFileProcessor::playNote( notePlayHandle * _n, bool ) +{ + const fpp_t frames = _n->framesLeftForCurrentPeriod(); + sampleFrame * buf = new sampleFrame[frames]; + + if( !_n->m_pluginData ) + { + _n->m_pluginData = new handleState( _n->hasDetuningInfo() ); + } + + if( m_sampleBuffer.play( buf, (handleState *)_n->m_pluginData, + frames, _n->frequency(), + m_loopModel.value() ) == TRUE ) + { + applyRelease( buf, _n ); + getInstrumentTrack()->processAudioBuffer( buf, frames, _n ); + } + delete[] buf; +} + + + + +void audioFileProcessor::deleteNotePluginData( notePlayHandle * _n ) +{ + delete (handleState *)_n->m_pluginData; +} + + + + void audioFileProcessor::saveSettings( QDomDocument & _doc, QDomElement & _this ) { @@ -203,13 +143,14 @@ void audioFileProcessor::saveSettings( QDomDocument & _doc, if( m_sampleBuffer.audioFile() == "" ) { QString s; - _this.setAttribute( "sampledata", m_sampleBuffer.toBase64( s ) ); + _this.setAttribute( "sampledata", + m_sampleBuffer.toBase64( s ) ); } - m_reverseButton->saveSettings( _doc, _this, "reversed" ); - m_loopButton->saveSettings( _doc, _this, "looped" ); - m_ampKnob->saveSettings( _doc, _this, "amp" ); - m_startKnob->saveSettings( _doc, _this, "sframe" ); - m_endKnob->saveSettings( _doc, _this, "eframe" ); + m_reverseModel.saveSettings( _doc, _this, "reversed" ); + m_loopModel.saveSettings( _doc, _this, "looped" ); + m_ampModel.saveSettings( _doc, _this, "amp" ); + m_startPointModel.saveSettings( _doc, _this, "sframe" ); + m_endPointModel.saveSettings( _doc, _this, "eframe" ); } @@ -225,14 +166,14 @@ void audioFileProcessor::loadSettings( const QDomElement & _this ) { m_sampleBuffer.loadFromBase64( _this.attribute( "srcdata" ) ); } - m_reverseButton->loadSettings( _this, "reversed" ); - m_loopButton->loadSettings( _this, "looped" ); - m_ampKnob->loadSettings( _this, "amp" ); - m_startKnob->loadSettings( _this, "sframe" ); - m_endKnob->loadSettings( _this, "eframe" ); + m_reverseModel.loadSettings( _this, "reversed" ); + m_loopModel.loadSettings( _this, "looped" ); + m_ampModel.loadSettings( _this, "amp" ); + m_startPointModel.loadSettings( _this, "sframe" ); + m_endPointModel.loadSettings( _this, "eframe" ); - startKnobChanged( m_startKnob->value() ); - endKnobChanged( m_endKnob->value() ); + startPointModelChanged(); + endPointModelChanged(); } @@ -275,7 +216,16 @@ Uint32 audioFileProcessor::getBeatLen( notePlayHandle * _n ) const -void audioFileProcessor::setAudioFile( const QString & _audio_file, bool _rename ) +instrumentView * audioFileProcessor::createView( QWidget * _parent ) +{ + return( new audioFileProcessorView( this, _parent ) ); +} + + + + +void audioFileProcessor::setAudioFile( const QString & _audio_file, + bool _rename ) { // is current channel-name equal to previous-filename?? if( _rename && @@ -287,49 +237,210 @@ void audioFileProcessor::setAudioFile( const QString & _audio_file, bool _rename getInstrumentTrack()->setName( QFileInfo( _audio_file ).fileName() ); } - // else we don't touch the channel-name, because the user named it self + // else we don't touch the track-name, because the user named it self m_sampleBuffer.setAudioFile( _audio_file ); - startKnobChanged( m_startKnob->value() ); - endKnobChanged( m_endKnob->value() ); + startPointModelChanged(); + endPointModelChanged(); +} + + + + +void audioFileProcessor::reverseModelChanged( void ) +{ + m_sampleBuffer.setReversed( m_reverseModel.value() ); +} + + + + +void audioFileProcessor::ampModelChanged( void ) +{ + m_sampleBuffer.setAmplification( m_ampModel.value() / 100.0f ); +} + + + + +void audioFileProcessor::startPointModelChanged( void ) +{ + if( m_startPointModel.value() < m_endPointModel.value() ) + { + m_sampleBuffer.setStartFrame( static_cast( + m_startPointModel.value() * + m_sampleBuffer.frames() ) ); + } + else + { + m_startPointModel.setValue( m_endPointModel.value() - 0.01f ); + } + emit dataChanged(); +} + + + + +void audioFileProcessor::endPointModelChanged( void ) +{ + if( m_endPointModel.value() > m_startPointModel.value() ) + { + if( m_endPointModel.value() * m_sampleBuffer.frames() >= 1.0f ) + { + m_sampleBuffer.setEndFrame( static_cast( + m_endPointModel.value() * + m_sampleBuffer.frames() ) - 1 ); + } + else + { + m_sampleBuffer.setEndFrame( 0 ); + } + } + else + { + m_endPointModel.setValue( m_startPointModel.value() + 0.01f ); + } + emit dataChanged(); } -void audioFileProcessor::playNote( notePlayHandle * _n, bool ) -{ - const fpp_t frames = _n->framesLeftForCurrentPeriod(); - sampleFrame * buf = new sampleFrame[frames]; - if( !_n->m_pluginData ) + + +audioFileProcessor::subPluginFeatures::subPluginFeatures( + plugin::pluginTypes _type ) : + plugin::descriptor::subPluginFeatures( _type ) +{ +} + + + + +const QStringList & audioFileProcessor::subPluginFeatures::supportedExtensions( + void ) +{ + static QStringList extensions = QStringList() + << "wav" << "ogg" << "ds" << "spx" << "au" + << "voc" << "aif" << "aiff" << "flac" << "raw"; + return( extensions ); +} + + + + + + + +QPixmap * audioFileProcessorView::s_artwork = NULL; + + +audioFileProcessorView::audioFileProcessorView( instrument * _instrument, + QWidget * _parent ) : + instrumentView( _instrument, _parent ) +{ + if( s_artwork == NULL ) { - _n->m_pluginData = new handleState( _n->hasDetuningInfo() ); + s_artwork = new QPixmap( PLUGIN_NAME::getIconPixmap( + "artwork" ) ); } - if( m_sampleBuffer.play( buf, (handleState *)_n->m_pluginData, - frames, _n->frequency(), - m_loopButton->isChecked() ) == TRUE ) - { - applyRelease( buf, _n ); - getInstrumentTrack()->processAudioBuffer( buf, frames, _n ); - } - delete[] buf; + m_openAudioFileButton = new pixmapButton( this, NULL ); + m_openAudioFileButton->setCursor( QCursor( Qt::PointingHandCursor ) ); + m_openAudioFileButton->move( 200, 90 ); + m_openAudioFileButton->setActiveGraphic( embed::getIconPixmap( + "project_open_down" ) ); + m_openAudioFileButton->setInactiveGraphic( embed::getIconPixmap( + "project_open" ) ); + connect( m_openAudioFileButton, SIGNAL( clicked() ), + this, SLOT( openAudioFile() ) ); + toolTip::add( m_openAudioFileButton, tr( "Open other sample" ) ); + + m_openAudioFileButton->setWhatsThis( + tr( "Click here, if you want to open another audio-file. After " + "clicking on this button, a file-open-dialog appears " + "and you can select your file. Settings like Looping-" + "Mode, start- and end-point, amplify-value and so on " + "are not reset, so please don't wonder if your sample " + "doesn't sound like the original one..." ) ); + + m_reverseButton = new pixmapButton( this, NULL ); + m_reverseButton->setCheckable( TRUE ); + m_reverseButton->move( 160, 124 ); + m_reverseButton->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "reverse_on" ) ); + m_reverseButton->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "reverse_off" ) ); + toolTip::add( m_reverseButton, tr( "Reverse sample" ) ); + m_reverseButton->setWhatsThis( + tr( "If you enable this button, the whole sample is reversed. " + "This is useful for cool effects, e.g. a reversed " + "crash." ) ); + + m_loopButton = new pixmapButton( this, tr( "Loop" ) ); + m_loopButton->setCheckable( TRUE ); + m_loopButton->move( 180, 124 ); + m_loopButton->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "loop_on" ) ); + m_loopButton->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "loop_off" ) ); + toolTip::add( m_loopButton, + tr( "Loop sample at start- and end-point" ) ); + m_loopButton->setWhatsThis( + tr( "Here you can set, whether Looping-Mode is enabled. If " + "enabled, AudioFileProcessor loops between start- and " + "end-point of a sample until the whole note is played. " + "This is useful for things like string- and choir-" + "samples." ) ); + + m_ampKnob = new volumeKnob( knobDark_28, this, tr( "Amplify" ) ); + m_ampKnob->move( 6, 114 ); + m_ampKnob->setHintText( tr( "Amplify:" )+" ", "%" ); + m_ampKnob->setLabel( tr( "AMP" ) ); + m_ampKnob->setWhatsThis( + tr( "With this knob you can set the amplify-ratio. When you " + "set a value of 100% your sample isn't changed. " + "Otherwise it will be amplified up or down (your " + "actual sample-file isn't touched!)" ) ); + + m_startKnob = new knob( knobDark_28, this, tr( "Start of sample" ) ); + m_startKnob->move( 46, 114 ); + m_startKnob->setHintText( tr( "Startpoint:" )+" ", "" ); + m_startKnob->setLabel( tr( "START" ) ); + m_startKnob->setWhatsThis( + tr( "With this knob you can set the point where " + "AudioFileProcessor should begin playing your sample. " + "If you enable Looping-Mode, this is the point to " + "which AudioFileProcessor returns if a note is longer " + "than the sample between start- and end-point." ) ); + + m_endKnob = new knob( knobDark_28, this, tr( "End of sample" ) ); + m_endKnob->move( 84, 114 ); + m_endKnob->setHintText( tr( "Endpoint:" )+" ", "" ); + m_endKnob->setLabel( tr( "END" ) ); + m_endKnob->setWhatsThis( + tr( "With this knob you can set the point where " + "AudioFileProcessor should stop playing your sample. " + "If you enable Looping-Mode, this is the point where " + "AudioFileProcessor returns if a note is longer than " + "the sample between start- and end-point." ) ); + + setAcceptDrops( TRUE ); } -void audioFileProcessor::deleteNotePluginData( notePlayHandle * _n ) +audioFileProcessorView::~audioFileProcessorView() { - delete (handleState *)_n->m_pluginData; } -void audioFileProcessor::dragEnterEvent( QDragEnterEvent * _dee ) +void audioFileProcessorView::dragEnterEvent( QDragEnterEvent * _dee ) { if( _dee->mimeData()->hasFormat( stringPairDrag::mimeType() ) ) { @@ -358,21 +469,21 @@ void audioFileProcessor::dragEnterEvent( QDragEnterEvent * _dee ) -void audioFileProcessor::dropEvent( QDropEvent * _de ) +void audioFileProcessorView::dropEvent( QDropEvent * _de ) { QString type = stringPairDrag::decodeKey( _de ); QString value = stringPairDrag::decodeValue( _de ); if( type == "samplefile" ) { - setAudioFile( value ); + castModel()->setAudioFile( value ); _de->accept(); return; } else if( type == QString( "tco_%1" ).arg( track::SAMPLE_TRACK ) ) { multimediaProject mmp( value, FALSE ); - setAudioFile( mmp.content().firstChild().toElement(). - attribute( "src" ) ); + castModel()->setAudioFile( mmp.content(). + firstChild().toElement().attribute( "src" ) ); _de->accept(); return; } @@ -383,15 +494,16 @@ void audioFileProcessor::dropEvent( QDropEvent * _de ) -void audioFileProcessor::paintEvent( QPaintEvent * ) +void audioFileProcessorView::paintEvent( QPaintEvent * ) { QPainter p( this ); p.drawPixmap( 0, 0, *s_artwork ); + audioFileProcessor * a = castModel(); QString file_name = ""; - Uint16 idx = m_sampleBuffer.audioFile().length(); + Uint16 idx = a->m_sampleBuffer.audioFile().length(); p.setFont( pointSize<8>( font() ) ); @@ -402,7 +514,7 @@ void audioFileProcessor::paintEvent( QPaintEvent * ) while( idx > 0 && fm.size( Qt::TextSingleLine, file_name + "..." ).width() < 210 ) { - file_name = m_sampleBuffer.audioFile()[--idx] + file_name; + file_name = a->m_sampleBuffer.audioFile()[--idx] + file_name; } if( idx > 0 ) @@ -418,11 +530,11 @@ void audioFileProcessor::paintEvent( QPaintEvent * ) p.setPen( QColor( 0xFF, 0xAA, 0x00 ) ); const QRect graph_rect( 4, 174, 241, 70 ); - const f_cnt_t frames = tMax( m_sampleBuffer.frames(), + const f_cnt_t frames = tMax( a->m_sampleBuffer.frames(), static_cast( 1 ) ); - const Uint16 start_frame_x = m_sampleBuffer.startFrame() * + const Uint16 start_frame_x = a->m_sampleBuffer.startFrame() * graph_rect.width() / frames; - const Uint16 end_frame_x = m_sampleBuffer.endFrame() * + const Uint16 end_frame_x = a->m_sampleBuffer.endFrame() * ( graph_rect.width() - 1 ) / frames; p.drawLine( start_frame_x + graph_rect.x(), graph_rect.y(), @@ -437,13 +549,14 @@ void audioFileProcessor::paintEvent( QPaintEvent * ) -void audioFileProcessor::sampleUpdated( void ) +void audioFileProcessorView::sampleUpdated( void ) { m_graph = QPixmap( 245, 75 ); m_graph.fill( Qt::transparent ); QPainter p( &m_graph ); p.setPen( QColor( 64, 255, 160 ) ); - m_sampleBuffer.visualize( p, QRect( 2, 2, m_graph.width() - 4, + castModel()->m_sampleBuffer. + visualize( p, QRect( 2, 2, m_graph.width() - 4, m_graph.height() - 4 ) ); update(); } @@ -451,71 +564,14 @@ void audioFileProcessor::sampleUpdated( void ) -void audioFileProcessor::reverseBtnToggled( bool _on ) + +void audioFileProcessorView::openAudioFile( void ) { - m_sampleBuffer.setReversed( _on ); - engine::getSongEditor()->setModified(); -} - - - - -void audioFileProcessor::ampKnobChanged( float _val ) -{ - m_sampleBuffer.setAmplification( _val / 100.0f ); -} - - - - -void audioFileProcessor::startKnobChanged( float _new_value ) -{ - if( _new_value < m_endKnob->value() ) - { - m_sampleBuffer.setStartFrame( static_cast( _new_value * - m_sampleBuffer.frames() ) ); - } - else - { - m_startKnob->setValue( m_endKnob->value() - 0.01f ); - } - update(); -} - - - - -void audioFileProcessor::endKnobChanged( float _new_value ) -{ - if( _new_value > m_startKnob->value() ) - { - if( _new_value * m_sampleBuffer.frames() >= 1.0f ) - { - m_sampleBuffer.setEndFrame( static_cast( - _new_value * - m_sampleBuffer.frames() ) - 1 ); - } - else - { - m_sampleBuffer.setEndFrame( 0 ); - } - } - else - { - m_endKnob->setValue( m_startKnob->value() + 0.01f ); - } - update(); -} - - - - -void audioFileProcessor::openAudioFile( void ) -{ - QString af = m_sampleBuffer.openAudioFile(); + QString af = castModel()->m_sampleBuffer. + openAudioFile(); if( af != "" ) { - setAudioFile( af ); + castModel()->setAudioFile( af ); engine::getSongEditor()->setModified(); } } @@ -523,30 +579,22 @@ void audioFileProcessor::openAudioFile( void ) - - - - -audioFileProcessor::subPluginFeatures::subPluginFeatures( - plugin::pluginTypes _type ) : - plugin::descriptor::subPluginFeatures( _type ) +void audioFileProcessorView::modelChanged( void ) { + audioFileProcessor * a = castModel(); + connect( &a->m_sampleBuffer, SIGNAL( sampleUpdated() ), + this, SLOT( sampleUpdated() ) ); + m_ampKnob->setModel( &a->m_ampModel ); + m_startKnob->setModel( &a->m_startPointModel ); + m_endKnob->setModel( &a->m_endPointModel ); + m_reverseButton->setModel( &a->m_reverseModel ); + m_loopButton->setModel( &a->m_loopModel ); + sampleUpdated(); } -const QStringList & audioFileProcessor::subPluginFeatures::supported_extensions( - void ) -{ - static QStringList extensions = QStringList() - << "wav" << "ogg" << "ds" << "spx" << "au" - << "voc" << "aif" << "aiff" << "flac" << "raw"; - return( extensions ); -} - - - extern "C" { diff --git a/plugins/audio_file_processor/audio_file_processor.h b/plugins/audio_file_processor/audio_file_processor.h index 196721184..39c982226 100644 --- a/plugins/audio_file_processor/audio_file_processor.h +++ b/plugins/audio_file_processor/audio_file_processor.h @@ -31,12 +31,10 @@ #include "instrument.h" #include "sample_buffer.h" +#include "volume_knob.h" +#include "pixmap_button.h" -class knob; -class pixmapButton; -class volumeKnob; - class audioFileProcessor : public instrument { @@ -47,17 +45,12 @@ public: public: subPluginFeatures( plugin::pluginTypes _type ); - virtual const QStringList & supportedExtensions( void ) - { - return( supported_extensions() ); - } - - static const QStringList & supported_extensions( void ); + virtual const QStringList & supportedExtensions( void ); } ; - audioFileProcessor( instrumentTrack * _channel_track ); + audioFileProcessor( instrumentTrack * _instrument_track ); virtual ~audioFileProcessor(); virtual void FASTCALL playNote( notePlayHandle * _n, @@ -80,18 +73,49 @@ public: return( 128 ); } + virtual instrumentView * createView( QWidget * _parent ); + public slots: void setAudioFile( const QString & _audio_file, bool _rename = TRUE ); +private slots: + void reverseModelChanged( void ); + void ampModelChanged( void ); + void startPointModelChanged( void ); + void endPointModelChanged( void ); + + +private: + typedef sampleBuffer::handleState handleState; + + sampleBuffer m_sampleBuffer; + + knobModel m_ampModel; + knobModel m_startPointModel; + knobModel m_endPointModel; + boolModel m_reverseModel; + boolModel m_loopModel; + + + friend class audioFileProcessorView; + +} ; + + + +class audioFileProcessorView : public instrumentView +{ + Q_OBJECT +public: + audioFileProcessorView( instrument * _instrument, QWidget * _parent ); + virtual ~audioFileProcessorView(); + + protected slots: - void openAudioFile( void ); - void reverseBtnToggled( bool _on ); - void ampKnobChanged( float _new_value ); - void startKnobChanged( float _new_value ); - void endKnobChanged( float _new_value ); void sampleUpdated( void ); + void openAudioFile( void ); protected: @@ -101,13 +125,10 @@ protected: private: - typedef sampleBuffer::handleState handleState; + virtual void modelChanged( void ); static QPixmap * s_artwork; - - sampleBuffer m_sampleBuffer; - QPixmap m_graph; volumeKnob * m_ampKnob; knob * m_startKnob; @@ -116,10 +137,9 @@ private: pixmapButton * m_reverseButton; pixmapButton * m_loopButton; - - void updateSample( void ); - } ; + + #endif diff --git a/src/core/engine.cpp b/src/core/engine.cpp index 103e8ec9c..13f121d04 100644 --- a/src/core/engine.cpp +++ b/src/core/engine.cpp @@ -41,7 +41,7 @@ bool engine::s_hasGUI = TRUE; -float engine::s_frames_per_tact64th; +float engine::s_framesPerTact64th; mixer * engine::s_mixer; mainWindow * engine::s_mainWindow; songEditor * engine::s_songEditor; @@ -51,7 +51,7 @@ pianoRoll * engine::s_pianoRoll; projectNotes * engine::s_projectNotes; projectJournal * engine::s_projectJournal; ladspa2LMMS * engine::s_ladspaManager; -QMap engine::s_sample_extensions; +QMap engine::s_sampleExtensions; @@ -60,7 +60,7 @@ void engine::init( const bool _has_gui ) { s_hasGUI = _has_gui; - load_extensions(); + loadExtensions(); s_projectJournal = new projectJournal; s_mainWindow = new mainWindow; @@ -119,14 +119,14 @@ void engine::destroy( void ) void engine::updateFramesPerTact64th( void ) { - s_frames_per_tact64th = s_mixer->sampleRate() * 60.0f * BEATS_PER_TACT + s_framesPerTact64th = s_mixer->sampleRate() * 60.0f * BEATS_PER_TACT / 64.0f / s_songEditor->getTempo(); } -void engine::load_extensions( void ) +void engine::loadExtensions( void ) { QVector pluginDescriptors; plugin::getDescriptorsOfAvailPlugins( pluginDescriptors ); @@ -145,7 +145,7 @@ void engine::load_extensions( void ) ext.begin(); itExt != ext.end(); ++itExt ) { - s_sample_extensions[*itExt] = it->name; + s_sampleExtensions[*itExt] = it->name; } } } From 53d39ae4b86882e800d476a420a7e334b4492f7b Mon Sep 17 00:00:00 2001 From: Danny McRae Date: Fri, 4 Jan 2008 03:05:56 +0000 Subject: [PATCH 07/87] changed mallets plugin for M/V-architecture git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@640 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 5 + plugins/stk/mallets/mallets.cpp | 693 +++++++++++++++++--------------- plugins/stk/mallets/mallets.h | 105 +++-- 3 files changed, 435 insertions(+), 368 deletions(-) diff --git a/ChangeLog b/ChangeLog index e13faa50b..ca816bbb5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-01-03 Danny McRae + * plugins/stk/mallets/mallets.h: + * plugins/stk/mallets/mallets.cpp: + made plugin work with M/V-architecture + 2008-01-04 Tobias Doerffel * plugins/audio_file_processor/audio_file_processor.cpp: diff --git a/plugins/stk/mallets/mallets.cpp b/plugins/stk/mallets/mallets.cpp index 2c6a1649c..b72d27dfe 100644 --- a/plugins/stk/mallets/mallets.cpp +++ b/plugins/stk/mallets/mallets.cpp @@ -34,9 +34,6 @@ #include "engine.h" #include "gui_templates.h" -#include "instrument_track.h" -#include "knob.h" -#include "note_play_handle.h" #undef SINGLE_SOURCE_COMPILE #include "embed.cpp" @@ -61,17 +58,270 @@ plugin::descriptor malletsstk_plugin_descriptor = } -mallets::mallets( instrumentTrack * _instrument_track ) : - instrument( _instrument_track, &malletsstk_plugin_descriptor ), - m_filesMissing( TRUE ) +malletsInstrument::malletsInstrument( instrumentTrack * _channel_track ): + instrument( _channel_track, &malletsstk_plugin_descriptor ), + m_hardnessModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_positionModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_vibratoGainModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_vibratoFreqModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_stickModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_modulatorModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_crossfadeModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_lfoSpeedModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_lfoDepthModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_adsrModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_pressureModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_motionModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_velocityModel(64.0f, 0.0f, 128.0f, 0.1f, this), + m_strike(NULL), + m_presetsModel(this), + m_spreadModel(0, 0, 255, 1, this) { - m_filesMissing = + m_hardnessModel.setTrack( _channel_track ); + m_positionModel.setTrack( _channel_track ); + m_vibratoGainModel.setTrack( _channel_track ); + m_vibratoFreqModel.setTrack( _channel_track ); + m_stickModel.setTrack( _channel_track ); + m_modulatorModel.setTrack( _channel_track ); + m_crossfadeModel.setTrack( _channel_track ); + m_lfoSpeedModel.setTrack( _channel_track ); + m_lfoDepthModel.setTrack( _channel_track ); + m_adsrModel.setTrack( _channel_track ); + m_pressureModel.setTrack( _channel_track ); + m_motionModel.setTrack( _channel_track ); + m_velocityModel.setTrack( _channel_track ); + m_spreadModel.setTrack( _channel_track ); + + // ModalBar + m_presetsModel.addItem( tr( "Marimba" ) ); + m_scalers.append( 4.0 ); + m_presetsModel.addItem( tr( "Vibraphone" ) ); + m_scalers.append( 4.0 ); + m_presetsModel.addItem( tr( "Agogo" ) ); + m_scalers.append( 5.0 ); + m_presetsModel.addItem( tr( "Wood1" ) ); + m_scalers.append( 4.0 ); + m_presetsModel.addItem( tr( "Reso" ) ); + m_scalers.append( 2.5 ); + m_presetsModel.addItem( tr( "Wood2" ) ); + m_scalers.append( 5.0 ); + m_presetsModel.addItem( tr( "Beats" ) ); + m_scalers.append( 20.0 ); + m_presetsModel.addItem( tr( "Two Fixed" ) ); + m_scalers.append( 5.0 ); + m_presetsModel.addItem( tr( "Clump" ) ); + m_scalers.append( 4.0 ); + + // TubeBell + m_presetsModel.addItem( tr( "Tubular Bells" ) ); + m_scalers.append( 1.8 ); + + // BandedWG + m_presetsModel.addItem( tr( "Uniform Bar" ) ); + m_scalers.append( 25.0 ); + m_presetsModel.addItem( tr( "Tuned Bar" ) ); + m_scalers.append( 10.0 ); + m_presetsModel.addItem( tr( "Glass" ) ); + m_scalers.append( 16.0 ); + m_presetsModel.addItem( tr( "Tibetan Bowl" ) ); + m_scalers.append( 7.0 ); + + m_buffer = new sampleFrame[engine::getMixer()->framesPerPeriod()]; +} + + + + +malletsInstrument::~malletsInstrument() +{ + delete[] m_buffer; +} + + + + +void malletsInstrument::saveSettings( QDomDocument & _doc, QDomElement & _this ) +{ + // ModalBar + m_hardnessModel.saveSettings( _doc, _this, "hardness" ); + m_positionModel.saveSettings( _doc, _this, "position" ); + m_vibratoGainModel.saveSettings( _doc, _this, "vib_gain" ); + m_vibratoFreqModel.saveSettings( _doc, _this, "vib_freq" ); + m_stickModel.saveSettings( _doc, _this, "stick_mix" ); + + // TubeBell + m_modulatorModel.saveSettings( _doc, _this, "modulator" ); + m_crossfadeModel.saveSettings( _doc, _this, "crossfade" ); + m_lfoSpeedModel.saveSettings( _doc, _this, "lfo_speed" ); + m_lfoDepthModel.saveSettings( _doc, _this, "lfo_depth" ); + m_adsrModel.saveSettings( _doc, _this, "adsr" ); + + // BandedWG + m_pressureModel.saveSettings( _doc, _this, "pressure" ); + m_motionModel.saveSettings( _doc, _this, "motion" ); + m_vibratoModel.saveSettings( _doc, _this, "vibrato" ); + m_velocityModel.saveSettings( _doc, _this, "velocity" ); + if( m_strike != NULL ) + { + m_strike->model()->saveSettings( _doc, _this, "strike" ); + } + + m_presetsModel.saveSettings( _doc, _this, "preset" ); + m_spreadModel.saveSettings( _doc, _this, "spread" ); +} + + + + +void malletsInstrument::loadSettings( const QDomElement & _this ) +{ + // ModalBar + m_hardnessModel.loadSettings( _this, "hardness" ); + m_positionModel.loadSettings( _this, "position" ); + m_vibratoGainModel.loadSettings( _this, "vib_gain" ); + m_vibratoFreqModel.loadSettings( _this, "vib_freq" ); + m_stickModel.loadSettings( _this, "stick_mix" ); + + // TubeBell + m_modulatorModel.loadSettings( _this, "modulator" ); + m_crossfadeModel.loadSettings( _this, "crossfade" ); + m_lfoSpeedModel.loadSettings( _this, "lfo_speed" ); + m_lfoDepthModel.loadSettings( _this, "lfo_depth" ); + m_adsrModel.loadSettings( _this, "adsr" ); + + // BandedWG + m_pressureModel.loadSettings( _this, "pressure" ); + m_motionModel.loadSettings( _this, "motion" ); + m_vibratoModel.loadSettings( _this, "vibrato" ); + m_velocityModel.loadSettings( _this, "velocity" ); + if( m_strike != NULL ) + { + m_strike->model()->loadSettings( _this, "strike" ); + } + + m_presetsModel.loadSettings( _this, "preset" ); + m_spreadModel.loadSettings( _this, "spread" ); +} + + + + +QString malletsInstrument::nodeName( void ) const +{ + return( malletsstk_plugin_descriptor.name ); +} + + + + +void malletsInstrument::playNote( notePlayHandle * _n, bool ) +{ + if( m_filesMissing ) + { + return; + } + + int p = m_presetsModel.value(); + + const float freq = _n->frequency(); + if ( _n->totalFramesPlayed() == 0 ) + { + float vel = static_cast( _n->getVolume() ) / 100.0f; + + if( p < 9 ) + { + _n->m_pluginData = new malletsSynth( freq, + vel, + m_vibratoGainModel.value(), + m_hardnessModel.value(), + m_positionModel.value(), + m_stickModel.value(), + m_vibratoFreqModel.value(), + p, + (Uint8) m_spreadModel.value(), + engine::getMixer()->sampleRate() ); + } + else if( p == 9 ) + { + _n->m_pluginData = new malletsSynth( freq, + vel, + p, + m_lfoDepthModel.value(), + m_modulatorModel.value(), + m_crossfadeModel.value(), + m_lfoSpeedModel.value(), + m_adsrModel.value(), + (Uint8) m_spreadModel.value(), + engine::getMixer()->sampleRate() ); + } + else + { + _n->m_pluginData = new malletsSynth( freq, + vel, + m_pressureModel.value(), + m_motionModel.value(), + m_vibratoModel.value(), + p - 10, + m_strike->value() * 128.0, + m_velocityModel.value(), + (Uint8) m_spreadModel.value(), + engine::getMixer()->sampleRate() ); + } + } + + const fpp_t frames = _n->framesLeftForCurrentPeriod(); + + malletsSynth * ps = static_cast( _n->m_pluginData ); + sample_t add_scale = 0.0f; + if( p == 10 ) + { + add_scale = static_cast( m_strike->value() ) * freq * 2.5f; + } + for( fpp_t frame = 0; frame < frames; ++frame ) + { + const sample_t left = ps->nextSampleLeft() * + ( m_scalers[m_presetsModel.value()] + add_scale ); + const sample_t right = ps->nextSampleRight() * + ( m_scalers[m_presetsModel.value()] + add_scale ); + for( Uint8 chnl = 0; chnl < DEFAULT_CHANNELS / 2; ++chnl ) + { + m_buffer[frame][chnl * DEFAULT_CHANNELS / 2] = left; + m_buffer[frame][( chnl + 1 ) * DEFAULT_CHANNELS / 2] = right; + } + } + + getInstrumentTrack()->processAudioBuffer( m_buffer, frames, _n ); +} + + + + +void malletsInstrument::deleteNotePluginData( notePlayHandle * _n ) +{ + delete static_cast( _n->m_pluginData ); +} + + + + +instrumentView * malletsInstrument::createView( QWidget * _parent ) +{ + return( new malletsInstrumentView( this, _parent ) ); +} + + + + +malletsInstrumentView::malletsInstrumentView( malletsInstrument * _instrument, QWidget * _parent ) : + instrumentView( _instrument, _parent ) +{ + _instrument->m_filesMissing = !QDir( configManager::inst()->stkDir() ).exists() || !QFileInfo( configManager::inst()->stkDir() + QDir::separator() + "sinewave.raw" ).exists(); // for some reason this crashes...??? - if( m_filesMissing ) + if( _instrument->m_filesMissing ) { QMessageBox::information( 0, tr( "Missing files" ), tr( "Your Stk-installation seems to be " @@ -80,42 +330,40 @@ mallets::mallets( instrumentTrack * _instrument_track ) : QMessageBox::Ok ); } - m_modalBarWidget = setupModalBarControls( this, _instrument_track ); + m_modalBarWidget = setupModalBarControls( this ); setWidgetBackground( m_modalBarWidget, "artwork" ); - m_tubeBellWidget = setupTubeBellControls( this, _instrument_track ); + m_tubeBellWidget = setupTubeBellControls( this ); setWidgetBackground( m_tubeBellWidget, "artwork" ); m_tubeBellWidget->hide(); - m_bandedWGWidget = setupBandedWGControls( this, _instrument_track ); + m_bandedWGWidget = setupBandedWGControls( this ); setWidgetBackground( m_bandedWGWidget, "artwork" ); m_bandedWGWidget->hide(); - m_presets = setupPresets( this, _instrument_track ); + m_presetsCombo = new comboBox( this, tr( "Instrument" ) ); + m_presetsCombo->setGeometry( 64, 157, 99, 22 ); + m_presetsCombo->setFont( pointSize<8>( m_presetsCombo->font() ) ); - m_spread = new knob( knobBright_26, this, tr( "Spread" ), - _instrument_track ); - m_spread->setLabel( tr( "Spread" ) ); - m_spread->setRange( 0, 255, 1 ); - m_spread->setInitValue( 0 ); - m_spread->move( 178, 173 ); - m_spread->setHintText( tr( "Spread:" ) + " ", "" ); - - m_buffer = new sampleFrame[engine::getMixer()->framesPerPeriod()]; + connect( &_instrument->m_presetsModel, SIGNAL( dataChanged() ), + this, SLOT( changePreset() ) ); + + m_spreadKnob = new knob( knobBright_26, this, tr( "Spread" ) ); + m_spreadKnob->setLabel( tr( "Spread" ) ); + m_spreadKnob->move( 178, 173 ); + m_spreadKnob->setHintText( tr( "Spread:" ) + " ", "" ); } -mallets::~mallets() +malletsInstrumentView::~malletsInstrumentView() { - delete[] m_buffer; } - -void mallets::setWidgetBackground( QWidget * _widget, const QString & _pic ) +void malletsInstrumentView::setWidgetBackground( QWidget * _widget, const QString & _pic ) { _widget->setAutoFillBackground( TRUE ); QPalette pal; @@ -127,50 +375,35 @@ void mallets::setWidgetBackground( QWidget * _widget, const QString & _pic ) -QWidget * mallets::setupModalBarControls( QWidget * _parent, track * _track ) +QWidget * malletsInstrumentView::setupModalBarControls( QWidget * _parent ) { QWidget * widget = new QWidget( _parent ); widget->setFixedSize( 250, 250 ); - m_hardness = new knob( knobBright_26, widget, tr( "Hardness" ), - _track ); - m_hardness->setLabel( tr( "Hardness" ) ); - m_hardness->setRange( 0.0, 128.0, 0.1 ); - m_hardness->setInitValue( 64.0 ); - m_hardness->move( 145, 24 ); - m_hardness->setHintText( tr( "Hardness:" ) + " ", "" ); + m_hardnessKnob = new knob( knobBright_26, widget, tr( "Hardness" ) ); + m_hardnessKnob->setLabel( tr( "Hardness" ) ); + m_hardnessKnob->move( 145, 24 ); + m_hardnessKnob->setHintText( tr( "Hardness:" ) + " ", "" ); - m_position = new knob( knobBright_26, widget, tr( "Position" ), - _track ); - m_position->setLabel( tr( "Position" ) ); - m_position->setRange( 0.0, 128.0, 0.1 ); - m_position->setInitValue( 64.0 ); - m_position->move( 195, 24 ); - m_position->setHintText( tr( "Position:" ) + " ", "" ); + m_positionKnob = new knob( knobBright_26, widget, tr( "Position" ) ); + m_positionKnob->setLabel( tr( "Position" ) ); + m_positionKnob->move( 195, 24 ); + m_positionKnob->setHintText( tr( "Position:" ) + " ", "" ); - m_vibratoGain = new knob( knobBright_26, widget, tr( "Vibrato Gain" ), - _track ); - m_vibratoGain->setLabel( tr( "Vib Gain" ) ); - m_vibratoGain->setRange( 0.0, 128.0, 0.1 ); - m_vibratoGain->setInitValue( 64.0 ); - m_vibratoGain->move( 56, 86 ); - m_vibratoGain->setHintText( tr( "Vib Gain:" ) + " ", "" ); + m_vibratoGainKnob = new knob( knobBright_26, widget, tr( "Vibrato Gain" ) ); + m_vibratoGainKnob->setLabel( tr( "Vib Gain" ) ); + m_vibratoGainKnob->move( 56, 86 ); + m_vibratoGainKnob->setHintText( tr( "Vib Gain:" ) + " ", "" ); - m_vibratoFreq = new knob( knobBright_26, widget, tr( "Vibrato Freq" ), - _track ); - m_vibratoFreq->setLabel( tr( "Vib Freq" ) ); - m_vibratoFreq->setRange( 0.0, 128.0, 0.1 ); - m_vibratoFreq->setInitValue( 64.0 ); - m_vibratoFreq->move( 117, 86 ); - m_vibratoFreq->setHintText( tr( "Vib Freq:" ) + " ", "" ); + m_vibratoFreqKnob = new knob( knobBright_26, widget, tr( "Vibrato Freq" ) ); + m_vibratoFreqKnob->setLabel( tr( "Vib Freq" ) ); + m_vibratoFreqKnob->move( 117, 86 ); + m_vibratoFreqKnob->setHintText( tr( "Vib Freq:" ) + " ", "" ); - m_stick = new knob( knobBright_26, widget, tr( "Stick Mix" ), - _track ); - m_stick->setLabel( tr( "Stick Mix" ) ); - m_stick->setRange( 0.0, 128.0, 0.1 ); - m_stick->setInitValue( 64.0 ); - m_stick->move( 178, 86 ); - m_stick->setHintText( tr( "Stick Mix:" ) + " ", "" ); + m_stickKnob = new knob( knobBright_26, widget, tr( "Stick Mix" ) ); + m_stickKnob->setLabel( tr( "Stick Mix" ) ); + m_stickKnob->move( 178, 86 ); + m_stickKnob->setHintText( tr( "Stick Mix:" ) + " ", "" ); return( widget ); } @@ -178,49 +411,35 @@ QWidget * mallets::setupModalBarControls( QWidget * _parent, track * _track ) -QWidget * mallets::setupTubeBellControls( QWidget * _parent, track * _track ) +QWidget * malletsInstrumentView::setupTubeBellControls( QWidget * _parent ) { QWidget * widget = new QWidget( _parent ); widget->setFixedSize( 250, 250 ); - m_modulator = new knob( knobBright_26, widget, tr( "Modulator" ), - _track ); - m_modulator->setLabel( tr( "Modulator" ) ); - m_modulator->setRange( 0.0, 128.0, 0.1 ); - m_modulator->setInitValue( 100.0 ); - m_modulator->move( 145, 24 ); - m_modulator->setHintText( tr( "Modulator:" ) + " ", "" ); + m_modulatorKnob = new knob( knobBright_26, widget, tr( "Modulator" ) ); + m_modulatorKnob->setLabel( tr( "Modulator" ) ); + m_modulatorKnob->move( 145, 24 ); + m_modulatorKnob->setHintText( tr( "Modulator:" ) + " ", "" ); - m_crossfade = new knob( knobBright_26, widget, tr( "Crossfade" ), - _track ); - m_crossfade->setLabel( tr( "Crossfade" ) ); - m_crossfade->setRange( 0.0, 128.0, 0.1 ); - m_crossfade->setInitValue( 0.0 ); - m_crossfade->move( 195, 24 ); - m_crossfade->setHintText( tr( "Crossfade:" ) + " ", "" ); + m_crossfadeKnob = new knob( knobBright_26, widget, tr( "Crossfade" ) ); + m_crossfadeKnob->setLabel( tr( "Crossfade" ) ); + m_crossfadeKnob->move( 195, 24 ); + m_crossfadeKnob->setHintText( tr( "Crossfade:" ) + " ", "" ); - m_lfoSpeed = new knob( knobBright_26, widget, tr( "LFO Speed" ), - _track ); - m_lfoSpeed->setLabel( tr( "LFO Speed" ) ); - m_lfoSpeed->setRange( 0.0, 128.0, 0.1 ); - m_lfoSpeed->setInitValue( 20.0 ); - m_lfoSpeed->move( 56, 86 ); - m_lfoSpeed->setHintText( tr( "LFO Speed:" ) + " ", "" ); + m_lfoSpeedKnob = new knob( knobBright_26, widget, tr( "LFO Speed" ) ); + m_lfoSpeedKnob->setLabel( tr( "LFO Speed" ) ); + m_lfoSpeedKnob->move( 56, 86 ); + m_lfoSpeedKnob->setHintText( tr( "LFO Speed:" ) + " ", "" ); - m_lfoDepth = new knob( knobBright_26, widget, tr( "LFO Depth" ), - _track ); - m_lfoDepth->setLabel( tr( "LFO Depth" ) ); - m_lfoDepth->setRange( 0.0, 128.0, 0.1 ); - m_lfoDepth->setInitValue( 10.0 ); - m_lfoDepth->move( 117, 86 ); - m_lfoDepth->setHintText( tr( "LFO Depth:" ) + " ", "" ); + m_lfoDepthKnob = new knob( knobBright_26, widget, tr( "LFO Depth" ) ); + m_lfoDepthKnob->setLabel( tr( "LFO Depth" ) ); + m_lfoDepthKnob->move( 117, 86 ); + m_lfoDepthKnob->setHintText( tr( "LFO Depth:" ) + " ", "" ); - m_adsr = new knob( knobBright_26, widget, tr( "ADSR" ), _track ); - m_adsr->setLabel( tr( "ADSR" ) ); - m_adsr->setRange( 0.0, 128.0, 0.1 ); - m_adsr->setInitValue( 0.0 ); - m_adsr->move( 178, 86 ); - m_adsr->setHintText( tr( "ADSR:" ) + " ", "" ); + m_adsrKnob = new knob( knobBright_26, widget, tr( "ADSR" ) ); + m_adsrKnob->setLabel( tr( "ADSR" ) ); + m_adsrKnob->move( 178, 86 ); + m_adsrKnob->setHintText( tr( "ADSR:" ) + " ", "" ); return( widget ); } @@ -228,44 +447,36 @@ QWidget * mallets::setupTubeBellControls( QWidget * _parent, track * _track ) -QWidget * mallets::setupBandedWGControls( QWidget * _parent, track * _track ) +QWidget * malletsInstrumentView::setupBandedWGControls( QWidget * _parent ) { // BandedWG QWidget * widget = new QWidget( _parent ); widget->setFixedSize( 250, 250 ); - m_strike = new ledCheckBox( tr( "Bowed" ), widget, tr( "Bowed" ), - _track ); - m_strike->move( 165, 30 ); + m_strikeLED = new ledCheckBox( tr( "Bowed" ), widget, tr( "Bowed" ) ); + m_strikeLED->move( 165, 30 ); + m_strikeLED->model()->setTrack( castModel()->getInstrumentTrack() ); + castModel()->m_strike = m_strikeLED; - m_pressure = new knob( knobBright_26, widget, tr( "Pressure" ), - _track ); - m_pressure->setLabel( tr( "Pressure" ) ); - m_pressure->setRange( 0.0, 128.0, 0.1 ); - m_pressure->setInitValue( 64.0 ); - m_pressure->move( 56, 86 ); - m_pressure->setHintText( tr( "Pressure:" ) + " ", "" ); + m_pressureKnob = new knob( knobBright_26, widget, tr( "Pressure" ) ); + m_pressureKnob->setLabel( tr( "Pressure" ) ); + m_pressureKnob->move( 56, 86 ); + m_pressureKnob->setHintText( tr( "Pressure:" ) + " ", "" ); - m_motion = new knob( knobBright_26, widget, tr( "Motion" ), _track ); - m_motion->setLabel( tr( "Motion" ) ); - m_motion->setRange( 0.0, 128.0, 0.1 ); - m_motion->setInitValue( 64.0 ); - m_motion->move( 117, 86 ); - m_motion->setHintText( tr( "Motion:" ) + " ", "" ); + m_motionKnob = new knob( knobBright_26, widget, tr( "Motion" ) ); + m_motionKnob->setLabel( tr( "Motion" ) ); + m_motionKnob->move( 117, 86 ); + m_motionKnob->setHintText( tr( "Motion:" ) + " ", "" ); - m_velocity = new knob( knobBright_26, widget, tr( "Speed" ), _track ); - m_velocity->setLabel( tr( "Speed" ) ); - m_velocity->setRange( 0.0, 128.0, 0.1 ); - m_velocity->setInitValue( 74.5 ); - m_velocity->move( 178, 86 ); - m_velocity->setHintText( tr( "Speed:" ) + " ", "" ); + m_velocityKnob = new knob( knobBright_26, widget, tr( "Speed" ) ); + m_velocityKnob->setLabel( tr( "Speed" ) ); + m_velocityKnob->move( 178, 86 ); + m_velocityKnob->setHintText( tr( "Speed:" ) + " ", "" ); - m_vibrato = new knob( knobBright_26, widget, tr( "Vibrato" ), _track ); - m_vibrato->setLabel( tr( "Vibrato" ) ); - m_vibrato->setRange( 0.0, 128.0, 0.1 ); - m_vibrato->setInitValue( 64.0 ); - m_vibrato->move( 178, 129 ); - m_vibrato->setHintText( tr( "Vibrato:" ) + " ", "" ); + m_vibratoKnob = new knob( knobBright_26, widget, tr( "Vibrato" ) ); + m_vibratoKnob->setLabel( tr( "Vibrato" ) ); + m_vibratoKnob->move( 178, 129 ); + m_vibratoKnob->setHintText( tr( "Vibrato:" ) + " ", "" ); return( widget ); } @@ -273,221 +484,37 @@ QWidget * mallets::setupBandedWGControls( QWidget * _parent, track * _track ) -comboBox * mallets::setupPresets( QWidget * _parent, track * _track ) +void malletsInstrumentView::modelChanged( void ) { - comboBox * presets = new comboBox( _parent, tr( "Instrument" ), - _track ); - presets->setGeometry( 64, 157, 99, 22 ); - presets->setFont( pointSize<8>( presets->font() ) ); - - connect( presets, SIGNAL( valueChanged( int ) ), - _parent, SLOT( changePreset( int ) ) ); - - // ModalBar - presets->addItem( tr( "Marimba" ) ); - m_scalers.append( 4.0 ); - presets->addItem( tr( "Vibraphone" ) ); - m_scalers.append( 4.0 ); - presets->addItem( tr( "Agogo" ) ); - m_scalers.append( 5.0 ); - presets->addItem( tr( "Wood1" ) ); - m_scalers.append( 4.0 ); - presets->addItem( tr( "Reso" ) ); - m_scalers.append( 2.5 ); - presets->addItem( tr( "Wood2" ) ); - m_scalers.append( 5.0 ); - presets->addItem( tr( "Beats" ) ); - m_scalers.append( 20.0 ); - presets->addItem( tr( "Two Fixed" ) ); - m_scalers.append( 5.0 ); - presets->addItem( tr( "Clump" ) ); - m_scalers.append( 4.0 ); - - // TubeBell - presets->addItem( tr( "Tubular Bells" ) ); - m_scalers.append( 1.8 ); - - // BandedWG - presets->addItem( tr( "Uniform Bar" ) ); - m_scalers.append( 25.0 ); - presets->addItem( tr( "Tuned Bar" ) ); - m_scalers.append( 10.0 ); - presets->addItem( tr( "Glass" ) ); - m_scalers.append( 16.0 ); - presets->addItem( tr( "Tibetan Bowl" ) ); - m_scalers.append( 7.0 ); - - return( presets ); + malletsInstrument * inst = castModel(); + m_hardnessKnob->setModel( &inst->m_hardnessModel ); + m_positionKnob->setModel( &inst->m_positionModel ); + m_vibratoGainKnob->setModel( &inst->m_vibratoGainModel ); + m_vibratoFreqKnob->setModel( &inst->m_vibratoFreqModel ); + m_stickKnob->setModel( &inst->m_stickModel ); + m_modulatorKnob->setModel( &inst->m_modulatorModel ); + m_crossfadeKnob->setModel( &inst->m_crossfadeModel ); + m_lfoSpeedKnob->setModel( &inst->m_lfoSpeedModel ); + m_lfoDepthKnob->setModel( &inst->m_lfoDepthModel ); + m_adsrKnob->setModel( &inst->m_adsrModel ); + m_pressureKnob->setModel( &inst->m_pressureModel ); + m_motionKnob->setModel( &inst->m_motionModel ); + m_vibratoKnob->setModel( &inst->m_vibratoModel ); + m_velocityKnob->setModel( &inst->m_velocityModel ); + //m_strikeLED->setModel( &inst->m_strikeModel ); + m_presetsCombo->setModel( &inst->m_presetsModel ); + m_spreadKnob->setModel( &inst->m_spreadModel ); } -void mallets::saveSettings( QDomDocument & _doc, QDomElement & _this ) +void malletsInstrumentView::changePreset() { - // ModalBar - m_hardness->saveSettings( _doc, _this, "hardness" ); - m_position->saveSettings( _doc, _this, "position" ); - m_vibratoGain->saveSettings( _doc, _this, "vib_gain" ); - m_vibratoFreq->saveSettings( _doc, _this, "vib_freq" ); - m_stick->saveSettings( _doc, _this, "stick_mix" ); - - // TubeBell - m_modulator->saveSettings( _doc, _this, "modulator" ); - m_crossfade->saveSettings( _doc, _this, "crossfade" ); - m_lfoSpeed->saveSettings( _doc, _this, "lfo_speed" ); - m_lfoDepth->saveSettings( _doc, _this, "lfo_depth" ); - m_adsr->saveSettings( _doc, _this, "adsr" ); + malletsInstrument * inst = castModel(); + int _preset = inst->m_presetsModel.value(); - // BandedWG - m_pressure->saveSettings( _doc, _this, "pressure" ); - m_motion->saveSettings( _doc, _this, "motion" ); - m_vibrato->saveSettings( _doc, _this, "vibrato" ); - m_velocity->saveSettings( _doc, _this, "velocity" ); - m_strike->saveSettings( _doc, _this, "strike" ); - - m_presets->saveSettings( _doc, _this, "preset" ); - m_spread->saveSettings( _doc, _this, "spread" ); -} - - - - -void mallets::loadSettings( const QDomElement & _this ) -{ - // ModalBar - m_hardness->loadSettings( _this, "hardness" ); - m_position->loadSettings( _this, "position" ); - m_vibratoGain->loadSettings( _this, "vib_gain" ); - m_vibratoFreq->loadSettings( _this, "vib_freq" ); - m_stick->loadSettings( _this, "stick_mix" ); - - // TubeBell - m_modulator->loadSettings( _this, "modulator" ); - m_crossfade->loadSettings( _this, "crossfade" ); - m_lfoSpeed->loadSettings( _this, "lfo_speed" ); - m_lfoDepth->loadSettings( _this, "lfo_depth" ); - m_adsr->loadSettings( _this, "adsr" ); - - // BandedWG - m_pressure->loadSettings( _this, "pressure" ); - m_motion->loadSettings( _this, "motion" ); - m_vibrato->loadSettings( _this, "vibrato" ); - m_velocity->loadSettings( _this, "velocity" ); - m_strike->loadSettings( _this, "strike" ); - - m_presets->loadSettings( _this, "preset" ); - m_spread->loadSettings( _this, "spread" ); -} - - - - -QString mallets::nodeName( void ) const -{ - return( malletsstk_plugin_descriptor.name ); -} - - - - -void mallets::playNote( notePlayHandle * _n, bool ) -{ - if( m_filesMissing ) - { - return; - } - - int p = m_presets->value(); - - const float freq = _n->frequency(); - if ( _n->totalFramesPlayed() == 0 ) - { - float vel = static_cast( _n->getVolume() ) / 100.0f; - - if( p < 9 ) - { - _n->m_pluginData = new malletsSynth( - freq, - vel, - m_vibratoGain->value(), - m_hardness->value(), - m_position->value(), - m_stick->value(), - m_vibratoFreq->value(), - p, - (Uint8) m_spread->value(), - engine::getMixer()->sampleRate() ); - } - else if( p == 9 ) - { - _n->m_pluginData = new malletsSynth( - freq, - vel, - p, - m_lfoDepth->value(), - m_modulator->value(), - m_crossfade->value(), - m_lfoSpeed->value(), - m_adsr->value(), - (Uint8) m_spread->value(), - engine::getMixer()->sampleRate() ); - } - else - { - _n->m_pluginData = new malletsSynth( - freq, - vel, - m_pressure->value(), - m_motion->value(), - m_vibrato->value(), - p - 10, - m_strike->value() * 128.0, - m_velocity->value(), - (Uint8) m_spread->value(), - engine::getMixer()->sampleRate() ); - } - } - - const fpp_t frames = _n->framesLeftForCurrentPeriod(); - - malletsSynth * ps = static_cast( _n->m_pluginData ); - sample_t add_scale = 0.0f; - if( p == 10 ) - { - add_scale = - static_cast( m_strike->value() ) * freq * 2.5f; - } - for( fpp_t frame = 0; frame < frames; ++frame ) - { - const sample_t left = ps->nextSampleLeft() * - ( m_scalers[m_presets->value()] + add_scale ); - const sample_t right = ps->nextSampleRight() * - ( m_scalers[m_presets->value()] + add_scale ); - for( Uint8 chnl = 0; chnl < DEFAULT_CHANNELS / 2; ++chnl ) - { - m_buffer[frame][chnl * DEFAULT_CHANNELS / 2] = left; - m_buffer[frame][( chnl + 1 ) * DEFAULT_CHANNELS / 2] = - right; - } - } - - getInstrumentTrack()->processAudioBuffer( m_buffer, frames, _n ); -} - - - - -void mallets::deleteNotePluginData( notePlayHandle * _n ) -{ - delete static_cast( _n->m_pluginData ); -} - - - - -void mallets::changePreset( int _preset ) -{ + printf("malletsInstrumentView %d\n", _preset); if( _preset < 9 ) { m_tubeBellWidget->hide(); @@ -655,7 +682,7 @@ extern "C" // neccessary for getting instance out of shared lib plugin * lmms_plugin_main( void * _data ) { - return( new mallets( static_cast( _data ) ) ); + return( new malletsInstrument( static_cast( _data ) ) ); } diff --git a/plugins/stk/mallets/mallets.h b/plugins/stk/mallets/mallets.h index 8bdc56d5b..3ad500da8 100644 --- a/plugins/stk/mallets/mallets.h +++ b/plugins/stk/mallets/mallets.h @@ -31,11 +31,9 @@ #include "combobox.h" #include "instrument.h" +#include "knob.h" +#include "note_play_handle.h" #include "led_checkbox.h" -#include "mixer.h" - -class knob; -class notePlayHandle; class malletsSynth @@ -118,12 +116,11 @@ protected: -class mallets : public instrument +class malletsInstrument : public instrument { - Q_OBJECT public: - mallets( instrumentTrack * _channel_track ); - virtual ~mallets(); + malletsInstrument( instrumentTrack * _channel_track ); + virtual ~malletsInstrument( void ); virtual void FASTCALL playNote( notePlayHandle * _n, bool _try_parallelizing ); @@ -136,45 +133,83 @@ public: virtual QString nodeName( void ) const; -public slots: - void changePreset( int _preset ); + virtual instrumentView * createView( QWidget * _parent ); private: - void setWidgetBackground( QWidget * _widget, const QString & _pic ); - QWidget * setupModalBarControls( QWidget * _parent, track * _track ); - QWidget * setupTubeBellControls( QWidget * _parent, track * _track ); - QWidget * setupBandedWGControls( QWidget * _parent, track * _track ); - comboBox * setupPresets( QWidget * _parent, track * _track ); + knobModel m_hardnessModel; + knobModel m_positionModel; + knobModel m_vibratoGainModel; + knobModel m_vibratoFreqModel; + knobModel m_stickModel; - QWidget * m_modalBarWidget; - knob * m_hardness; - knob * m_position; - knob * m_vibratoGain; - knob * m_vibratoFreq; - knob * m_stick; + knobModel m_modulatorModel; + knobModel m_crossfadeModel; + knobModel m_lfoSpeedModel; + knobModel m_lfoDepthModel; + knobModel m_adsrModel; - QWidget * m_tubeBellWidget; - knob * m_modulator; - knob * m_crossfade; - knob * m_lfoSpeed; - knob * m_lfoDepth; - knob * m_adsr; + knobModel m_pressureModel; + knobModel m_motionModel; + knobModel m_vibratoModel; + knobModel m_velocityModel; - QWidget * m_bandedWGWidget; - knob * m_pressure; - knob * m_motion; - knob * m_vibrato; - knob * m_velocity; + // FIXME: Can't change the model of a ledCheckBox. ledCheckBox * m_strike; - comboBox * m_presets; - knob * m_spread; + comboBoxModel m_presetsModel; + knobModel m_spreadModel; QVector m_scalers; sampleFrame * m_buffer; + bool m_filesMissing; - + + friend class malletsInstrumentView; } ; +class malletsInstrumentView: public instrumentView +{ + Q_OBJECT +public: + malletsInstrumentView( malletsInstrument * _instrument, + QWidget * _parent ); + virtual ~malletsInstrumentView( void ); + +public slots: + void changePreset( void ); + +private: + virtual void modelChanged( void ); + + void setWidgetBackground( QWidget * _widget, const QString & _pic ); + QWidget * setupModalBarControls( QWidget * _parent ); + QWidget * setupTubeBellControls( QWidget * _parent ); + QWidget * setupBandedWGControls( QWidget * _parent ); + + QWidget * m_modalBarWidget; + knob * m_hardnessKnob; + knob * m_positionKnob; + knob * m_vibratoGainKnob; + knob * m_vibratoFreqKnob; + knob * m_stickKnob; + + QWidget * m_tubeBellWidget; + knob * m_modulatorKnob; + knob * m_crossfadeKnob; + knob * m_lfoSpeedKnob; + knob * m_lfoDepthKnob; + knob * m_adsrKnob; + + QWidget * m_bandedWGWidget; + knob * m_pressureKnob; + knob * m_motionKnob; + knob * m_vibratoKnob; + knob * m_velocityKnob; + ledCheckBox * m_strikeLED; + + comboBox * m_presetsCombo; + knob * m_spreadKnob; +}; + #endif From 764adeceff5c4a19d52fa218c44c65cfddea8768 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Fri, 4 Jan 2008 11:04:46 +0000 Subject: [PATCH 08/87] ChangeLog formatting git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@641 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index ca816bbb5..d5190262e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,10 @@ 2008-01-03 Danny McRae + * plugins/stk/mallets/mallets.h: * plugins/stk/mallets/mallets.cpp: made plugin work with M/V-architecture -2008-01-04 Tobias Doerffel +2008-01-03 Tobias Doerffel * plugins/audio_file_processor/audio_file_processor.cpp: * plugins/audio_file_processor/audio_file_processor.h: From 6d25a97b9e7784bd1d4d43b8f439c159bc37c6c8 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Fri, 4 Jan 2008 18:12:44 +0000 Subject: [PATCH 09/87] removed animation-functionality of groupBox as it's useless, fixed boolModel-initializations - makes filter, arpeggio and chords work again git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@642 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 11 ++++ include/group_box.h | 10 +-- src/core/arp_and_chords_tab_widget.cpp | 4 +- src/core/envelope_tab_widget.cpp | 2 +- src/widgets/group_box.cpp | 88 +++----------------------- 5 files changed, 23 insertions(+), 92 deletions(-) diff --git a/ChangeLog b/ChangeLog index d5190262e..bc0fc051c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2008-01-04 Tobias Doerffel + + * include/group_box.h: + * src/widgets/group_box.cpp: + removed animation-functionality as it's useless + + * src/core/arp_and_chords_tab_widget.cpp: + * src/core/envelope_tab_widget.cpp: + fixed boolModel-initializations - makes filter, arpeggio and chords + work again + 2008-01-03 Danny McRae * plugins/stk/mallets/mallets.h: diff --git a/include/group_box.h b/include/group_box.h index 54fed76bd..cc3534105 100644 --- a/include/group_box.h +++ b/include/group_box.h @@ -45,14 +45,9 @@ public: virtual void modelChanged( void ); -public slots: -// void setState( bool _on, bool _anim = FALSE ); - void animate( void ); - - protected: - virtual void resizeEvent( QResizeEvent * _re ); virtual void mousePressEvent( QMouseEvent * _me ); + virtual void resizeEvent( QResizeEvent * _re ); private: @@ -63,9 +58,6 @@ private: pixmapButton * m_led; QString m_caption; - int m_origHeight; - bool m_animating; - } ; diff --git a/src/core/arp_and_chords_tab_widget.cpp b/src/core/arp_and_chords_tab_widget.cpp index b4a3fca04..519993a1f 100644 --- a/src/core/arp_and_chords_tab_widget.cpp +++ b/src/core/arp_and_chords_tab_widget.cpp @@ -181,11 +181,11 @@ const int ARP_GROUPBOX_HEIGHT = 240 - ARP_GROUPBOX_Y; arpAndChordsTabWidget::arpAndChordsTabWidget( instrumentTrack * _instrument_track ) : QWidget( _instrument_track->tabWidgetParent() ), - m_chordsEnabledModel( new boolModel( /* this */ ) ), + m_chordsEnabledModel( new boolModel( FALSE, FALSE, TRUE, 1 /* this */ ) ), m_chordsModel( new comboBoxModel( /* this */ ) ), m_chordRangeModel( new floatModel( 1.0f, 1.0f, 9.0f, 1.0f /* this */ ) ), - m_arpEnabledModel( new boolModel( /* this */ ) ), + m_arpEnabledModel( new boolModel( FALSE, FALSE, TRUE, 1/* this */ ) ), m_arpModel( new comboBoxModel( /* this */ ) ), m_arpRangeModel( new floatModel( 1.0f, 1.0f, 9.0f, 1.0f /* this */ ) ), diff --git a/src/core/envelope_tab_widget.cpp b/src/core/envelope_tab_widget.cpp index 8444baa60..bf973a8cf 100644 --- a/src/core/envelope_tab_widget.cpp +++ b/src/core/envelope_tab_widget.cpp @@ -74,7 +74,7 @@ static const QString targetNames[envelopeTabWidget::TARGET_COUNT][2] = envelopeTabWidget::envelopeTabWidget( instrumentTrack * _instrument_track ) : QWidget( _instrument_track->tabWidgetParent() ), m_instrumentTrack( _instrument_track ), - m_filterEnabledModel( new boolModel( /* this */ ) ), + m_filterEnabledModel( new boolModel( FALSE, FALSE, TRUE, 1 /* this */ ) ), m_filterModel( new comboBoxModel( /* this */ ) ), m_filterCutModel( new floatModel( /* this */ ) ), m_filterResModel( new floatModel( /* this */ ) ) diff --git a/src/widgets/group_box.cpp b/src/widgets/group_box.cpp index 472849d1b..55e44d0bd 100644 --- a/src/widgets/group_box.cpp +++ b/src/widgets/group_box.cpp @@ -50,9 +50,7 @@ QPixmap * groupBox::s_ledBg = NULL; groupBox::groupBox( const QString & _caption, QWidget * _parent ) : QWidget( _parent ), autoModelView(), - m_caption( _caption ), - m_origHeight( height() ), - m_animating( FALSE ) + m_caption( _caption ) { if( s_ledBg == NULL ) { @@ -68,9 +66,9 @@ groupBox::groupBox( const QString & _caption, QWidget * _parent ) : m_led->setActiveGraphic( embed::getIconPixmap( "led_green" ) ); m_led->setInactiveGraphic( embed::getIconPixmap( "led_off" ) ); - setModel( new autoModel( FALSE, FALSE, TRUE, 1, NULL, FALSE ) ); + setModel( new autoModel( FALSE, FALSE, TRUE, + autoModel::defaultRelStep(), NULL, FALSE ) ); setAutoFillBackground( TRUE ); - } @@ -90,93 +88,23 @@ void groupBox::modelChanged( void ) -void groupBox::resizeEvent( QResizeEvent * ) -{ - updatePixmap(); - if( m_animating == FALSE ) - { - m_origHeight = height(); - } -} - - - void groupBox::mousePressEvent( QMouseEvent * _me ) { if( _me->y() > 1 && _me->y() < 13 ) { - //setState( !isActive(), TRUE ); - if( ( model()->value() == TRUE && height() < m_origHeight ) && - m_animating == FALSE ) - { - m_animating = TRUE; - animate(); - } + model()->setValue( !model()->value() ); } } -/* -void groupBox::setState( bool _on, bool _anim ) + +void groupBox::resizeEvent( QResizeEvent * _ev ) { - m_led->setChecked( _on ); - emit( toggled( _on ) ); + updatePixmap(); + QWidget::resizeEvent( _ev ); } -*/ - - - -void groupBox::animate( void ) -{ - float state = (float)( m_origHeight - height() ) / - (float)( m_origHeight - 19 ); - int dy = static_cast( 3 - 2 * cosf( state * 2 * M_PI ) ); - if( model()->value() && height() < m_origHeight ) - { - } - else if( !model()->value() && height() > 19 ) - { - dy = -dy; - } - else - { - m_animating = FALSE; - return; - } - resize( width(), height() + dy ); - QTimer::singleShot( 10, this, SLOT( animate() ) ); - QObjectList ch = parent()->children(); - for( int i = 0; i < ch.count(); ++i ) - { - QWidget * w = dynamic_cast( ch.at( i ) ); - if( w == NULL || w->y() < y() + height() ) - { - continue; - } - w->move( w->x(), w->y() + dy ); - } - ch = children(); - for( int i = 0; i < ch.count(); ++i ) - { - QWidget * w = dynamic_cast( ch.at( i ) ); - if( w == NULL || w == m_led ) - { - continue; - } - w->move( w->x(), w->y() + dy ); - if( w->y() < 14) - { - w->hide(); - } - else if( w->isHidden() == TRUE ) - { - w->show(); - } - } -} - From eccc259bf292377d9f1a530938b9346bc116aed9 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Fri, 4 Jan 2008 23:11:12 +0000 Subject: [PATCH 10/87] fixed outstanding issues with LED-checkbox and its model git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@643 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 6 ++++++ plugins/stk/mallets/mallets.cpp | 29 +++++++++++---------------- plugins/stk/mallets/mallets.h | 35 +++++++++++++++++---------------- 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/ChangeLog b/ChangeLog index bc0fc051c..352fe582f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-01-04 Tobias Doerffel + + * plugins/stk/mallets/mallets.h: + * plugins/stk/mallets/mallets.cpp: + fixed outstanding issues with LED-checkbox and its model + 2008-01-04 Tobias Doerffel * include/group_box.h: diff --git a/plugins/stk/mallets/mallets.cpp b/plugins/stk/mallets/mallets.cpp index b72d27dfe..4d1fb4419 100644 --- a/plugins/stk/mallets/mallets.cpp +++ b/plugins/stk/mallets/mallets.cpp @@ -1,7 +1,7 @@ /* * mallets.cpp - tuned instruments that one would bang upon * - * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2006-2008 Danny McRae * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -73,7 +73,7 @@ malletsInstrument::malletsInstrument( instrumentTrack * _channel_track ): m_pressureModel(64.0f, 0.0f, 128.0f, 0.1f, this), m_motionModel(64.0f, 0.0f, 128.0f, 0.1f, this), m_velocityModel(64.0f, 0.0f, 128.0f, 0.1f, this), - m_strike(NULL), + m_strikeModel( FALSE, FALSE, TRUE, boolModel::defaultRelStep(), this ), m_presetsModel(this), m_spreadModel(0, 0, 255, 1, this) { @@ -90,6 +90,7 @@ malletsInstrument::malletsInstrument( instrumentTrack * _channel_track ): m_pressureModel.setTrack( _channel_track ); m_motionModel.setTrack( _channel_track ); m_velocityModel.setTrack( _channel_track ); + m_strikeModel.setTrack( _channel_track ); m_spreadModel.setTrack( _channel_track ); // ModalBar @@ -161,11 +162,8 @@ void malletsInstrument::saveSettings( QDomDocument & _doc, QDomElement & _this ) m_motionModel.saveSettings( _doc, _this, "motion" ); m_vibratoModel.saveSettings( _doc, _this, "vibrato" ); m_velocityModel.saveSettings( _doc, _this, "velocity" ); - if( m_strike != NULL ) - { - m_strike->model()->saveSettings( _doc, _this, "strike" ); - } - + m_strikeModel.saveSettings( _doc, _this, "strike" ); + m_presetsModel.saveSettings( _doc, _this, "preset" ); m_spreadModel.saveSettings( _doc, _this, "spread" ); } @@ -194,11 +192,8 @@ void malletsInstrument::loadSettings( const QDomElement & _this ) m_motionModel.loadSettings( _this, "motion" ); m_vibratoModel.loadSettings( _this, "vibrato" ); m_velocityModel.loadSettings( _this, "velocity" ); - if( m_strike != NULL ) - { - m_strike->model()->loadSettings( _this, "strike" ); - } - + m_strikeModel.loadSettings( _this, "strike" ); + m_presetsModel.loadSettings( _this, "preset" ); m_spreadModel.loadSettings( _this, "spread" ); } @@ -262,7 +257,7 @@ void malletsInstrument::playNote( notePlayHandle * _n, bool ) m_motionModel.value(), m_vibratoModel.value(), p - 10, - m_strike->value() * 128.0, + m_strikeModel.value() * 128.0, m_velocityModel.value(), (Uint8) m_spreadModel.value(), engine::getMixer()->sampleRate() ); @@ -275,7 +270,7 @@ void malletsInstrument::playNote( notePlayHandle * _n, bool ) sample_t add_scale = 0.0f; if( p == 10 ) { - add_scale = static_cast( m_strike->value() ) * freq * 2.5f; + add_scale = static_cast( m_strikeModel.value() ) * freq * 2.5f; } for( fpp_t frame = 0; frame < frames; ++frame ) { @@ -455,9 +450,7 @@ QWidget * malletsInstrumentView::setupBandedWGControls( QWidget * _parent ) m_strikeLED = new ledCheckBox( tr( "Bowed" ), widget, tr( "Bowed" ) ); m_strikeLED->move( 165, 30 ); - m_strikeLED->model()->setTrack( castModel()->getInstrumentTrack() ); - castModel()->m_strike = m_strikeLED; - + m_pressureKnob = new knob( knobBright_26, widget, tr( "Pressure" ) ); m_pressureKnob->setLabel( tr( "Pressure" ) ); m_pressureKnob->move( 56, 86 ); @@ -501,7 +494,7 @@ void malletsInstrumentView::modelChanged( void ) m_motionKnob->setModel( &inst->m_motionModel ); m_vibratoKnob->setModel( &inst->m_vibratoModel ); m_velocityKnob->setModel( &inst->m_velocityModel ); - //m_strikeLED->setModel( &inst->m_strikeModel ); + m_strikeLED->setModel( &inst->m_strikeModel ); m_presetsCombo->setModel( &inst->m_presetsModel ); m_spreadKnob->setModel( &inst->m_spreadModel ); } diff --git a/plugins/stk/mallets/mallets.h b/plugins/stk/mallets/mallets.h index 3ad500da8..31a396642 100644 --- a/plugins/stk/mallets/mallets.h +++ b/plugins/stk/mallets/mallets.h @@ -1,7 +1,7 @@ /* * mallets.h - tuned instruments that one would bang upon * - * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2006-2008 Danny McRae * * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net @@ -107,7 +107,7 @@ public: protected: Instrmnt * m_voice; - + StkFloat * m_delay; Uint8 m_delayRead; Uint8 m_delayWrite; @@ -141,30 +141,31 @@ private: knobModel m_vibratoGainModel; knobModel m_vibratoFreqModel; knobModel m_stickModel; - + knobModel m_modulatorModel; knobModel m_crossfadeModel; knobModel m_lfoSpeedModel; knobModel m_lfoDepthModel; knobModel m_adsrModel; - + knobModel m_pressureModel; knobModel m_motionModel; knobModel m_vibratoModel; knobModel m_velocityModel; - - // FIXME: Can't change the model of a ledCheckBox. - ledCheckBox * m_strike; - + + boolModel m_strikeModel; + comboBoxModel m_presetsModel; knobModel m_spreadModel; - + QVector m_scalers; sampleFrame * m_buffer; - + bool m_filesMissing; - + + friend class malletsInstrumentView; + } ; @@ -175,39 +176,39 @@ public: malletsInstrumentView( malletsInstrument * _instrument, QWidget * _parent ); virtual ~malletsInstrumentView( void ); - + public slots: void changePreset( void ); private: virtual void modelChanged( void ); - + void setWidgetBackground( QWidget * _widget, const QString & _pic ); QWidget * setupModalBarControls( QWidget * _parent ); QWidget * setupTubeBellControls( QWidget * _parent ); QWidget * setupBandedWGControls( QWidget * _parent ); - + QWidget * m_modalBarWidget; knob * m_hardnessKnob; knob * m_positionKnob; knob * m_vibratoGainKnob; knob * m_vibratoFreqKnob; knob * m_stickKnob; - + QWidget * m_tubeBellWidget; knob * m_modulatorKnob; knob * m_crossfadeKnob; knob * m_lfoSpeedKnob; knob * m_lfoDepthKnob; knob * m_adsrKnob; - + QWidget * m_bandedWGWidget; knob * m_pressureKnob; knob * m_motionKnob; knob * m_vibratoKnob; knob * m_velocityKnob; ledCheckBox * m_strikeLED; - + comboBox * m_presetsCombo; knob * m_spreadKnob; }; From aaa410a70c76d2b981e3148ea520291e1661e095 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Fri, 4 Jan 2008 23:29:40 +0000 Subject: [PATCH 11/87] added dataUnchanged()-signal which should be emitted in case new data was not set for the model because it's been equal to old data git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@644 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/automatable_model_templates.h | 4 ++++ include/mv_base.h | 3 +++ 2 files changed, 7 insertions(+) diff --git a/include/automatable_model_templates.h b/include/automatable_model_templates.h index e8b9769ae..1bf06a31a 100644 --- a/include/automatable_model_templates.h +++ b/include/automatable_model_templates.h @@ -161,6 +161,10 @@ void automatableModel::setValue( const T _value ) setFirstValue(); emit dataChanged(); } + else + { + emit dataUnchanged(); + } } diff --git a/include/mv_base.h b/include/mv_base.h index dab64b2c0..281b3fef3 100644 --- a/include/mv_base.h +++ b/include/mv_base.h @@ -57,6 +57,9 @@ signals: // emitted if actual data of the model (e.g. values) have changed void dataChanged( void ); + // emitted in case new data was not set as it's been equal to old data + void dataUnchanged( void ); + // emitted if properties of the model (e.g. ranges) have changed void propertiesChanged( void ); From 00d2d4a5d3a9ab591f8a25178bc02f0c4cad4cdf Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Fri, 4 Jan 2008 23:29:57 +0000 Subject: [PATCH 12/87] fix missing pattern in new projects by also tracking dataUnchanged()-signals of bbComboBoxModel git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@645 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 11 +++++++++++ src/core/bb_editor.cpp | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/ChangeLog b/ChangeLog index 352fe582f..64bd9c502 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2008-01-04 Tobias Doerffel + + * src/core/bb_editor.cpp: + fix missing pattern in new projects by also tracking + dataUnchanged()-signals of bbComboBoxModel + + * include/automatable_model_templates.h: + * include/mv_base.h: + added dataUnchanged()-signal which should be emitted in case new data + was not set for the model because it's been equal to old data + 2008-01-04 Tobias Doerffel * plugins/stk/mallets/mallets.h: diff --git a/src/core/bb_editor.cpp b/src/core/bb_editor.cpp index 9db7425f3..3075cee8c 100644 --- a/src/core/bb_editor.cpp +++ b/src/core/bb_editor.cpp @@ -107,6 +107,10 @@ bbEditor::bbEditor( void ) : m_bbComboBox->setModel( m_bbComboBoxModel ); connect( m_bbComboBoxModel, SIGNAL( dataChanged() ), this, SLOT( currentBBChanged() ) ); + // we *always* want to receive updates even in case BB actually did + // not change upon setCurrentBB()-call + connect( m_bbComboBoxModel, SIGNAL( dataUnchanged() ), + this, SLOT( currentBBChanged() ) ); tb_layout->addSpacing( 5 ); tb_layout->addWidget( m_playButton ); From 7e67f12f169c85141b28daa29e09ea1ccf96f6c9 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 5 Jan 2008 00:16:49 +0000 Subject: [PATCH 13/87] several fixes regarding effects and their integration into M/V-architecture git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@646 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 25 +++++++++++++++++++ configure.in | 4 +-- include/automatable_model_templates.h | 2 +- include/effect.h | 22 ++++++++-------- include/effect_chain.h | 21 ++++++++-------- include/effect_tab_widget.h | 3 +-- include/engine.h | 2 +- include/plugin.h | 2 +- .../ladspa_effect/ladspa_control_dialog.cpp | 18 ++++++------- plugins/ladspa_effect/ladspa_control_dialog.h | 4 +-- plugins/ladspa_effect/ladspa_effect.cpp | 4 +-- src/core/arp_and_chords_tab_widget.cpp | 2 +- src/core/bb_editor.cpp | 2 +- src/core/effect_chain.cpp | 20 +++++++-------- src/core/effect_tab_widget.cpp | 24 ++++++------------ src/core/engine.cpp | 2 +- src/core/envelope_tab_widget.cpp | 2 +- src/lib/mmp.cpp | 16 +++++++++++- src/widgets/group_box.cpp | 2 +- 19 files changed, 104 insertions(+), 73 deletions(-) diff --git a/ChangeLog b/ChangeLog index 64bd9c502..20ce2b7a2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +2008-01-04 Tobias Doerffel + + * plugins/ladspa_effect/ladspa_effect.cpp: + * plugins/ladspa_effect/ladspa_control_dialog.cpp: + * plugins/ladspa_effect/ladspa_control_dialog.h: + minor fixes in order to compile again with lately changed effect-API + + * src/core/effect_tab_widget.cpp: + * src/lib/mmp.cpp: + renabled XML-attribute "fxdisabled" to "fxenabled" + + * src/core/effect_tab_widget.cpp: + * include/effect_tab_widget.h: + made effects working again by using effect-chain's m_enabledModel as + model for effect-groupbox + + * include/effect_chain.h: + * src/core/effect_chain.cpp: + * src/core/effect_tab_widget.cpp: + removed bypassed-property and introduced m_enabledModel + + * include/effect.h: + - made lot of methods const + - renamed enabled() to isEnabled() + 2008-01-04 Tobias Doerffel * src/core/bb_editor.cpp: diff --git a/configure.in b/configure.in index ec351903f..deb308d9c 100644 --- a/configure.in +++ b/configure.in @@ -2,8 +2,8 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.50) -AC_INIT(lmms, 0.4.0-svn20080102-mv, lmms-devel/at/lists/dot/sf/dot/net) -AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080102-mv) +AC_INIT(lmms, 0.4.0-svn20080104-mv, lmms-devel/at/lists/dot/sf/dot/net) +AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080104-mv) AM_CONFIG_HEADER(config.h) diff --git a/include/automatable_model_templates.h b/include/automatable_model_templates.h index 1bf06a31a..ab5bb2add 100644 --- a/include/automatable_model_templates.h +++ b/include/automatable_model_templates.h @@ -1,7 +1,7 @@ /* * automatable_model_templates.h - definition of automatableModel templates * - * Copyright (c) 2007 Tobias Doerffel + * Copyright (c) 2007-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * diff --git a/include/effect.h b/include/effect.h index a44655a4a..d5e55618c 100644 --- a/include/effect.h +++ b/include/effect.h @@ -54,7 +54,7 @@ public: virtual bool FASTCALL processAudioBuffer( surroundSampleFrame * _buf, const fpp_t _frames ); - inline ch_cnt_t getProcessorCount( void ) + inline ch_cnt_t getProcessorCount( void ) const { return( m_processors ); } @@ -64,7 +64,7 @@ public: m_processors = _processors; } - inline bool isOkay( void ) + inline bool isOkay( void ) const { return( m_okay ); } @@ -75,7 +75,7 @@ public: } - inline bool isRunning( void ) + inline bool isRunning( void ) const { return( m_running ); } @@ -91,12 +91,12 @@ public: m_running = FALSE; } - inline bool enabled( void ) + inline bool isEnabled( void ) const { return( m_enabledModel.value() ); } - inline Uint32 getTimeout( void ) + inline Uint32 getTimeout( void ) const { return( m_silenceTimeout ); } @@ -106,24 +106,24 @@ public: m_silenceTimeout = _time_out; } - inline float getWetLevel( void ) + inline float getWetLevel( void ) const { return( m_wetDryModel.value() ); } - inline float getDryLevel( void ) + inline float getDryLevel( void ) const { return( 1.0f - m_wetDryModel.value() ); } - inline float getGate( void ) + inline float getGate( void ) const { const float level = m_gateModel.value(); return( level*level * m_processors * engine::getMixer()->framesPerPeriod() ); } - inline Uint32 getBufferCount( void ) + inline Uint32 getBufferCount( void ) const { return( m_bufferCount ); } @@ -138,7 +138,7 @@ public: m_bufferCount++; } - inline bool dontRun( void ) + inline bool dontRun( void ) const { return( m_noRun ); } @@ -148,7 +148,7 @@ public: m_noRun = _state; } - inline const descriptor::subPluginFeatures::key & getKey( void ) + inline const descriptor::subPluginFeatures::key & getKey( void ) const { return( m_key ); } diff --git a/include/effect_chain.h b/include/effect_chain.h index 1b6011035..c0acf4155 100644 --- a/include/effect_chain.h +++ b/include/effect_chain.h @@ -1,7 +1,7 @@ /* * effect_chain.h - class for processing and effects chain * - * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2006-2008 Danny McRae * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -27,8 +27,10 @@ #include "effect.h" + typedef QVector effect_list_t; + class effectChain { public: @@ -43,21 +45,20 @@ public: const fpp_t _frames ); void startRunning( void ); bool isRunning( void ); - - inline void setBypass( bool _mode ) - { - m_bypassed = _mode; - } - + inline const effect_list_t & getEffects( void ) { return( m_effects ); } - + + private: effect_list_t m_effects; - - bool m_bypassed; + + boolModel m_enabledModel; + + + friend class effectTabWidget; } ; diff --git a/include/effect_tab_widget.h b/include/effect_tab_widget.h index f2198bcd3..a64a454c0 100644 --- a/include/effect_tab_widget.h +++ b/include/effect_tab_widget.h @@ -2,7 +2,7 @@ * effect_tab_widget.h - tab-widget in channel-track-window for setting up * effects * - * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2006-2008 Danny McRae * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -70,7 +70,6 @@ public: private slots: void addEffect( void ); - void setBypass( bool _state ); private: diff --git a/include/engine.h b/include/engine.h index 601c70536..3750f4179 100644 --- a/include/engine.h +++ b/include/engine.h @@ -1,7 +1,7 @@ /* * engine.h - engine-system of LMMS * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * diff --git a/include/plugin.h b/include/plugin.h index 5cea2a568..385589c47 100644 --- a/include/plugin.h +++ b/include/plugin.h @@ -1,7 +1,7 @@ /* * plugin.h - class plugin, the base-class and generic interface for all plugins * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * diff --git a/plugins/ladspa_effect/ladspa_control_dialog.cpp b/plugins/ladspa_effect/ladspa_control_dialog.cpp index 713888036..d6321d5a3 100644 --- a/plugins/ladspa_effect/ladspa_control_dialog.cpp +++ b/plugins/ladspa_effect/ladspa_control_dialog.cpp @@ -2,7 +2,7 @@ * ladspa_control_dialog.cpp - dialog for displaying and editing control port * values for LADSPA plugins * - * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2006-2008 Danny McRae * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -132,10 +132,9 @@ ladspaControlDialog::ladspaControlDialog( QWidget * _parent, m_mainLay->addSpacing( 3 ); QHBoxLayout * center = new QHBoxLayout(); m_mainLay->addLayout( center ); - m_stereoLink = new ledCheckBox( tr( "Link Channels" ), this, - NULL, NULL ); - connect( m_stereoLink, SIGNAL( toggled( bool ) ), - this, SLOT( link( bool ) ) ); + m_stereoLink = new ledCheckBox( tr( "Link Channels" ), this ); + connect( m_stereoLink, SIGNAL( dataChanged() ), + this, SLOT( updateChannelLinkState() ) ); m_stereoLink->setChecked( TRUE ); center->addWidget( m_stereoLink ); } @@ -161,7 +160,7 @@ void FASTCALL ladspaControlDialog::saveSettings( QDomDocument & _doc, { if( m_processors > 1 ) { - _this.setAttribute( "link", m_stereoLink->isChecked() ); + _this.setAttribute( "link", m_stereoLink->model()->value() ); } multi_proc_t controls = m_effect->getControls(); @@ -182,7 +181,8 @@ void FASTCALL ladspaControlDialog::loadSettings( const QDomElement & _this ) { if( m_processors > 1 ) { - m_stereoLink->setChecked( _this.attribute( "link" ).toInt() ); + m_stereoLink->model()->setValue( + _this.attribute( "link" ).toInt() ); } multi_proc_t controls = m_effect->getControls(); @@ -221,9 +221,9 @@ void ladspaControlDialog::linkPort( Uint16 _port, bool _state ) -void ladspaControlDialog::link( bool _state ) +void ladspaControlDialog::updateChannelLinkState( void ) { - if( _state ) + if( m_stereoLink->model()->value() ) { for( Uint16 port = 0; port < m_controlCount / m_processors; diff --git a/plugins/ladspa_effect/ladspa_control_dialog.h b/plugins/ladspa_effect/ladspa_control_dialog.h index 5013e6810..f0d1da242 100644 --- a/plugins/ladspa_effect/ladspa_control_dialog.h +++ b/plugins/ladspa_effect/ladspa_control_dialog.h @@ -2,7 +2,7 @@ * ladspa_control_dialog.h - dialog for displaying and editing control port * values for LADSPA plugins * - * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2006-2008 Danny McRae * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -62,7 +62,7 @@ public: protected slots: - void link( bool _state ); + void updateChannelLinkState( void ); void linkPort( Uint16 _port, bool _state ); diff --git a/plugins/ladspa_effect/ladspa_effect.cpp b/plugins/ladspa_effect/ladspa_effect.cpp index 4cc297183..200235393 100644 --- a/plugins/ladspa_effect/ladspa_effect.cpp +++ b/plugins/ladspa_effect/ladspa_effect.cpp @@ -1,7 +1,7 @@ /* * ladspa_effect.cpp - class for processing LADSPA effects * - * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2006-2008 Danny McRae * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -326,7 +326,7 @@ ladspaEffect::~ladspaEffect() bool FASTCALL ladspaEffect::processAudioBuffer( surroundSampleFrame * _buf, const fpp_t _frames ) { - if( !isOkay() || dontRun() || !isRunning() || isBypassed() ) + if( !isOkay() || dontRun() || !isRunning() || !isEnabled() ) { return( FALSE ); } diff --git a/src/core/arp_and_chords_tab_widget.cpp b/src/core/arp_and_chords_tab_widget.cpp index 519993a1f..086c7cbeb 100644 --- a/src/core/arp_and_chords_tab_widget.cpp +++ b/src/core/arp_and_chords_tab_widget.cpp @@ -4,7 +4,7 @@ * arp_and_chords_tab_widget.cpp - widget for use in arp/chord-tab of * instrument-track-window * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * diff --git a/src/core/bb_editor.cpp b/src/core/bb_editor.cpp index 3075cee8c..5f758358e 100644 --- a/src/core/bb_editor.cpp +++ b/src/core/bb_editor.cpp @@ -3,7 +3,7 @@ /* * bb_editor.cpp - basic main-window for editing of beats and basslines * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * diff --git a/src/core/effect_chain.cpp b/src/core/effect_chain.cpp index f7b0311c1..0ea0f4261 100644 --- a/src/core/effect_chain.cpp +++ b/src/core/effect_chain.cpp @@ -3,7 +3,7 @@ /* * effect_chain.cpp - class for processing and effects chain * - * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2006-2008 Danny McRae * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -32,7 +32,7 @@ effectChain::effectChain( void ) : - m_bypassed( TRUE ) + m_enabledModel( FALSE, FALSE, TRUE ) { } @@ -78,7 +78,7 @@ void FASTCALL effectChain::moveDown( effect * _effect ) for( effect_list_t::iterator it = m_effects.begin(); it != m_effects.end(); it++, i++ ) { - if( (*it) == _effect ) + if( *it == _effect ) { break; } @@ -101,7 +101,7 @@ void FASTCALL effectChain::moveUp( effect * _effect ) for( effect_list_t::iterator it = m_effects.begin(); it != m_effects.end(); it++, i++ ) { - if( (*it) == _effect ) + if( *it == _effect ) { break; } @@ -119,7 +119,7 @@ void FASTCALL effectChain::moveUp( effect * _effect ) bool FASTCALL effectChain::processAudioBuffer( surroundSampleFrame * _buf, const fpp_t _frames ) { - if( m_bypassed ) + if( m_enabledModel.value() == FALSE ) { return( FALSE ); } @@ -127,7 +127,7 @@ bool FASTCALL effectChain::processAudioBuffer( surroundSampleFrame * _buf, for( effect_list_t::iterator it = m_effects.begin(); it != m_effects.end(); it++ ) { - more_effects |= (*it)->processAudioBuffer( _buf, _frames ); + more_effects |= ( *it )->processAudioBuffer( _buf, _frames ); } return( more_effects ); } @@ -137,7 +137,7 @@ bool FASTCALL effectChain::processAudioBuffer( surroundSampleFrame * _buf, void effectChain::startRunning( void ) { - if( m_bypassed ) + if( m_enabledModel.value() == FALSE ) { return; } @@ -145,7 +145,7 @@ void effectChain::startRunning( void ) for( effect_list_t::iterator it = m_effects.begin(); it != m_effects.end(); it++ ) { - (*it)->startRunning(); + ( *it )->startRunning(); } } @@ -154,7 +154,7 @@ void effectChain::startRunning( void ) bool effectChain::isRunning( void ) { - if( m_bypassed ) + if( m_enabledModel.value() == FALSE ) { return( FALSE ); } @@ -164,7 +164,7 @@ bool effectChain::isRunning( void ) for( effect_list_t::iterator it = m_effects.begin(); it != m_effects.end() || !running; it++ ) { - running = (*it)->isRunning() && running; + running = ( *it )->isRunning() && running; } return( running ); } diff --git a/src/core/effect_tab_widget.cpp b/src/core/effect_tab_widget.cpp index 32bd7bc85..f6ef459d7 100644 --- a/src/core/effect_tab_widget.cpp +++ b/src/core/effect_tab_widget.cpp @@ -4,7 +4,7 @@ * effect_tab_widget.cpp - tab-widget in channel-track-window for setting up * effects * - * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2006-2008 Danny McRae * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -52,6 +52,7 @@ effectTabWidget::effectTabWidget( instrumentTrack * _track, m_track( dynamic_cast( _track ) ), m_port( _port ) { + m_port->getEffects()->m_enabledModel.setTrack( m_track ); setupWidget(); } @@ -65,6 +66,7 @@ effectTabWidget::effectTabWidget( QWidget * _parent, m_track( dynamic_cast( _track ) ), m_port( _port ) { + m_port->getEffects()->m_enabledModel.setTrack( m_track ); setupWidget(); } @@ -81,9 +83,7 @@ effectTabWidget::~effectTabWidget() void effectTabWidget::setupWidget( void ) { m_effectsGroupBox = new groupBox( tr( "EFFECTS CHAIN" ), this ); - m_effectsGroupBox->model()->setTrack( m_track ); - connect( m_effectsGroupBox, SIGNAL( toggled( bool ) ), - this, SLOT( setBypass( bool ) ) ); + m_effectsGroupBox->setModel( &m_port->getEffects()->m_enabledModel ); m_effectsGroupBox->setGeometry( 2, 2, 242, 244 ); m_rack = new rackView( m_effectsGroupBox, m_track, m_port ); @@ -101,8 +101,8 @@ void effectTabWidget::setupWidget( void ) void effectTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) { - _this.setAttribute( "fxdisabled", - !m_effectsGroupBox->model()->value() ); + _this.setAttribute( "fxenabled", + m_port->getEffects()->m_enabledModel.value() ); m_rack->saveState( _doc, _this ); } @@ -112,8 +112,8 @@ void effectTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) void effectTabWidget::loadSettings( const QDomElement & _this ) { - m_effectsGroupBox->model()->setValue( - !_this.attribute( "fxdisabled" ).toInt() ); + m_port->getEffects()->m_enabledModel.setValue( + _this.attribute( "fxenabled" ).toInt() ); QDomNode node = _this.firstChild(); while( !node.isNull() ) @@ -149,14 +149,6 @@ void effectTabWidget::addEffect( void ) -void effectTabWidget::setBypass( bool _state ) -{ - m_port->getEffects()->setBypass( !_state ); -} - - - - #include "effect_tab_widget.moc" #endif diff --git a/src/core/engine.cpp b/src/core/engine.cpp index 13f121d04..919571e89 100644 --- a/src/core/engine.cpp +++ b/src/core/engine.cpp @@ -3,7 +3,7 @@ /* * engine.cpp - implementation of LMMS' engine-system * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * diff --git a/src/core/envelope_tab_widget.cpp b/src/core/envelope_tab_widget.cpp index bf973a8cf..2ec337dd8 100644 --- a/src/core/envelope_tab_widget.cpp +++ b/src/core/envelope_tab_widget.cpp @@ -4,7 +4,7 @@ * envelope_tab_widget.cpp - widget for use in envelope/lfo/filter-tab of * instrument-track-window * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * diff --git a/src/lib/mmp.cpp b/src/lib/mmp.cpp index 0b764b7d5..b41aa4f40 100644 --- a/src/lib/mmp.cpp +++ b/src/lib/mmp.cpp @@ -3,7 +3,7 @@ /* * mmp.cpp - implementation of class multimediaProject * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -571,6 +571,20 @@ void multimediaProject::upgrade( void ) } } + if( version < "0.4.0-svn20080104" ) + { + QDomNodeList list = elementsByTagName( "fx" ); + for( int i = 0; !list.item( i ).isNull(); ++i ) + { + QDomElement el = list.item( i ).toElement(); + if( el.hasAttribute( "fxdisabled" ) && + el.attribute( "fxdisabled" ).toInt() == 0 ) + { + el.setAttribute( "fxenabled", 1 ); + } + } + } + if( !m_head.hasAttribute( "mastervol" ) ) { m_head.setAttribute( "mastervol", 100 ); diff --git a/src/widgets/group_box.cpp b/src/widgets/group_box.cpp index 55e44d0bd..25c3a1e42 100644 --- a/src/widgets/group_box.cpp +++ b/src/widgets/group_box.cpp @@ -3,7 +3,7 @@ /* * group_box.cpp - groupbox for LMMS * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * From 53cf8a675c722b20e5a5a778468b38cc4f9976e0 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 5 Jan 2008 16:12:17 +0000 Subject: [PATCH 14/87] miscellanous fixes git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@649 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 12 ++++++++++++ plugins/bit_invader/bit_invader.cpp | 2 +- plugins/organic/organic.cpp | 2 +- plugins/stk/mallets/mallets.cpp | 2 +- plugins/triple_oscillator/triple_oscillator.cpp | 2 +- plugins/vibed/vibed.cpp | 2 +- src/core/envelope_and_lfo_widget.cpp | 5 +++++ 7 files changed, 22 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 20ce2b7a2..3f09c1959 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2008-01-05 Tobias Doerffel + + * plugins/organic/organic.cpp: + * plugins/bit_invader/bit_invader.cpp: + * plugins/vibed/vibed.cpp: + * plugins/triple_oscillator/triple_oscillator.cpp: + * plugins/stk/mallets/mallets.cpp: + make sure, pluginData-pointer is always initialized in playNote() + + * src/core/envelope_and_lfo_widget.cpp: + simple range-checking + 2008-01-04 Tobias Doerffel * plugins/ladspa_effect/ladspa_effect.cpp: diff --git a/plugins/bit_invader/bit_invader.cpp b/plugins/bit_invader/bit_invader.cpp index f6112d172..dd817073c 100644 --- a/plugins/bit_invader/bit_invader.cpp +++ b/plugins/bit_invader/bit_invader.cpp @@ -535,7 +535,7 @@ void bitInvader::smoothClicked( void ) void bitInvader::playNote( notePlayHandle * _n, bool ) { - if ( _n->totalFramesPlayed() == 0 ) + if ( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) { float factor; diff --git a/plugins/organic/organic.cpp b/plugins/organic/organic.cpp index 3241a12ef..f6d54c677 100644 --- a/plugins/organic/organic.cpp +++ b/plugins/organic/organic.cpp @@ -261,7 +261,7 @@ QString organicInstrument::nodeName( void ) const void organicInstrument::playNote( notePlayHandle * _n, bool ) { - if( _n->totalFramesPlayed() == 0 ) + if( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) { oscillator * oscs_l[m_num_oscillators]; oscillator * oscs_r[m_num_oscillators]; diff --git a/plugins/stk/mallets/mallets.cpp b/plugins/stk/mallets/mallets.cpp index 4d1fb4419..662fdd956 100644 --- a/plugins/stk/mallets/mallets.cpp +++ b/plugins/stk/mallets/mallets.cpp @@ -219,7 +219,7 @@ void malletsInstrument::playNote( notePlayHandle * _n, bool ) int p = m_presetsModel.value(); const float freq = _n->frequency(); - if ( _n->totalFramesPlayed() == 0 ) + if ( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) { float vel = static_cast( _n->getVolume() ) / 100.0f; diff --git a/plugins/triple_oscillator/triple_oscillator.cpp b/plugins/triple_oscillator/triple_oscillator.cpp index 700587383..1faef3e27 100644 --- a/plugins/triple_oscillator/triple_oscillator.cpp +++ b/plugins/triple_oscillator/triple_oscillator.cpp @@ -577,7 +577,7 @@ QString tripleOscillator::nodeName( void ) const void tripleOscillator::playNote( notePlayHandle * _n, bool ) { - if( _n->totalFramesPlayed() == 0 ) + if( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) { oscillator * oscs_l[NUM_OF_OSCILLATORS]; oscillator * oscs_r[NUM_OF_OSCILLATORS]; diff --git a/plugins/vibed/vibed.cpp b/plugins/vibed/vibed.cpp index 3f1d5526c..6ff6e204a 100644 --- a/plugins/vibed/vibed.cpp +++ b/plugins/vibed/vibed.cpp @@ -468,7 +468,7 @@ QString vibed::nodeName( void ) const void vibed::playNote( notePlayHandle * _n, bool ) { - if ( _n->totalFramesPlayed() == 0 ) + if ( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) { _n->m_pluginData = new stringContainer( _n->frequency(), engine::getMixer()->sampleRate(), diff --git a/src/core/envelope_and_lfo_widget.cpp b/src/core/envelope_and_lfo_widget.cpp index c088aa3d6..202b9c9bc 100644 --- a/src/core/envelope_and_lfo_widget.cpp +++ b/src/core/envelope_and_lfo_widget.cpp @@ -577,6 +577,11 @@ void FASTCALL envelopeAndLFOWidget::fillLevel( float * _buf, f_cnt_t _frame, const f_cnt_t _release_begin, const fpp_t _frames ) { + if( _frame < 0 || _release_begin < 0 ) + { + return; + } + fillLFOLevel( _buf, _frame, _frames ); for( fpp_t offset = 0; offset < _frames; ++offset, ++_buf, ++_frame ) From 0511a6e18e4b83d2f744fa5a22172f01721083b2 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 5 Jan 2008 16:38:15 +0000 Subject: [PATCH 15/87] renamed rack-plugin-header to match model/view-convention git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@650 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/{rack_plugin.h => effect_view.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename include/{rack_plugin.h => effect_view.h} (100%) diff --git a/include/rack_plugin.h b/include/effect_view.h similarity index 100% rename from include/rack_plugin.h rename to include/effect_view.h From e9e3e6e8aef613440914346ae2eee0fa368199df Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 5 Jan 2008 16:46:00 +0000 Subject: [PATCH 16/87] renamed to effect_view.cpp to match model/view-convention git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@651 0778d3d1-df1d-0410-868b-ea421aaaa00d --- src/widgets/{rack_plugin.cpp => effect_view.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/widgets/{rack_plugin.cpp => effect_view.cpp} (100%) diff --git a/src/widgets/rack_plugin.cpp b/src/widgets/effect_view.cpp similarity index 100% rename from src/widgets/rack_plugin.cpp rename to src/widgets/effect_view.cpp From 17d96ab45ad8a77818bac065cd77854f4c9cd93c Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 5 Jan 2008 16:55:19 +0000 Subject: [PATCH 17/87] renamed to effect_rack_view.h to match model/view-convention git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@652 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/{rack_view.h => effect_rack_view.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename include/{rack_view.h => effect_rack_view.h} (100%) diff --git a/include/rack_view.h b/include/effect_rack_view.h similarity index 100% rename from include/rack_view.h rename to include/effect_rack_view.h From 784a7991d63c759f922912fcff0f4e3589f1ce18 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 5 Jan 2008 16:56:49 +0000 Subject: [PATCH 18/87] renamed to effect_rack_view.cpp to match model/view-convention git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@653 0778d3d1-df1d-0410-868b-ea421aaaa00d --- src/widgets/{rack_view.cpp => effect_rack_view.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/widgets/{rack_view.cpp => effect_rack_view.cpp} (100%) diff --git a/src/widgets/rack_view.cpp b/src/widgets/effect_rack_view.cpp similarity index 100% rename from src/widgets/rack_view.cpp rename to src/widgets/effect_rack_view.cpp From dc5d949af4ae8d80076928f30d1f2ed5de738638 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 6 Jan 2008 12:47:21 +0000 Subject: [PATCH 19/87] rewrote effect-framework, changes in plugin-instantiation git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@656 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 73 +++++ Makefile.am | 17 +- configure.in | 4 +- include/audio_port.h | 14 +- include/automatable_model.h | 5 +- include/dummy_effect.h | 4 +- include/dummy_instrument.h | 2 +- include/dummy_plugin.h | 11 +- include/effect.h | 73 +++-- include/effect_chain.h | 42 ++- include/effect_control_dialog.h | 7 +- include/effect_label.h | 29 +- include/effect_rack_view.h | 77 +++-- include/effect_select_dialog.h | 10 +- include/effect_tab_widget.h | 86 ------ include/effect_view.h | 56 ++-- include/instrument.h | 33 +- include/instrument_track.h | 18 +- include/main_window.h | 6 +- include/mv_base.h | 6 +- include/plugin.h | 22 +- include/sample_track.h | 8 +- include/tab_widget.h | 7 +- include/tool.h | 18 +- .../audio_file_processor.cpp | 4 +- .../audio_file_processor.h | 3 +- plugins/bass_booster/bass_booster.cpp | 10 +- plugins/bass_booster/bass_booster.h | 3 +- plugins/kicker/kicker.cpp | 4 +- plugins/kicker/kicker.h | 3 +- plugins/ladspa_browser/ladspa_browser.cpp | 43 ++- plugins/ladspa_browser/ladspa_browser.h | 26 +- plugins/ladspa_effect/ladspa_effect.cpp | 11 +- plugins/ladspa_effect/ladspa_effect.h | 7 +- plugins/stk/mallets/mallets.cpp | 41 +-- plugins/stk/mallets/mallets.h | 3 +- plugins/vst_effect/vst_effect.cpp | 2 +- src/audio/audio_port.cpp | 7 +- src/core/effect.cpp | 73 ++++- src/core/effect_chain.cpp | 105 ++++++- src/core/effect_control_dialog.cpp | 1 + src/core/effect_select_dialog.cpp | 17 +- src/core/effect_tab_widget.cpp | 154 --------- src/core/import_filter.cpp | 4 +- src/core/instrument.cpp | 20 +- src/core/main_window.cpp | 24 +- src/core/plugin.cpp | 21 +- src/core/sample_play_handle.cpp | 4 +- src/core/surround_area.cpp | 6 +- src/core/tool.cpp | 47 +-- src/tracks/instrument_track.cpp | 48 +-- src/tracks/sample_track.cpp | 13 +- src/widgets/automatable_button.cpp | 7 +- src/widgets/automatable_slider.cpp | 5 +- src/widgets/combobox.cpp | 3 +- src/widgets/effect_label.cpp | 58 +--- src/widgets/effect_rack_view.cpp | 292 ++++++++++-------- src/widgets/effect_view.cpp | 117 ++----- src/widgets/group_box.cpp | 2 +- src/widgets/knob.cpp | 4 +- src/widgets/lcd_spinbox.cpp | 4 +- 61 files changed, 886 insertions(+), 938 deletions(-) delete mode 100644 include/effect_tab_widget.h delete mode 100644 src/core/effect_tab_widget.cpp diff --git a/ChangeLog b/ChangeLog index 3f09c1959..97ec31bc2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,76 @@ +2008-01-06 Tobias Doerffel + + * plugins/ladspa_effect/ladspa_effect.cpp: + * plugins/ladspa_effect/ladspa_effect.h: + * plugins/bass_booster/bass_booster.cpp: + * plugins/bass_booster/bass_booster.h: + * plugins/vst_effect/vst_effect.cpp: + changes for making effects work again with new effect-framework + + * plugins/audio_file_processor/audio_file_processor.cpp: + * plugins/audio_file_processor/audio_file_processor.h: + * plugins/stk/mallets/mallets.cpp: + * plugins/stk/mallets/mallets.h: + * plugins/ladspa_browser/ladspa_browser.cpp: + * plugins/ladspa_browser/ladspa_browser.h: + * plugins/kicker/kicker.cpp: + * plugins/kicker/kicker.h: + * include/dummy_plugin.h: + * include/instrument.h: + * include/plugin.h: + * include/tool.h: + * include/main_window.h: + * include/mv_base.h: + * include/dummy_instrument.h: + * src/core/plugin.cpp: + * src/core/tool.cpp: + * src/core/import_filter.cpp: + * src/core/instrument.cpp: + * src/core/surround_area.cpp: + * src/core/main_window.cpp: + moved createView()-functionality from instrument- to plugin-class + + * include/tab_widget.h: + code-formatting stuff + + * include/audio_port.h: + * include/instrument_track.h: + * include/sample_track.h: + * src/audio/audio_port.cpp: + * src/core/sample_play_handle.cpp: + * src/tracks/instrument_track.cpp: + * src/tracks/sample_track.cpp: + integrated new effect-framework + + * Makefile.am: + * include/dummy_effect.h: + * include/effect.h: + * include/effect_chain.h: + * include/effect_control_dialog.h: + * include/effect_label.h: + * include/effect_rack_view.h: + * include/effect_select_dialog.h: + * include/effect_tab_widget.h: + * include/effect_view.h: + * src/core/effect.cpp: + * src/core/effect_chain.cpp: + * src/core/effect_control_dialog.cpp: + * src/core/effect_select_dialog.cpp: + * src/core/effect_tab_widget.cpp: + * src/widgets/effect_label.cpp: + * src/widgets/effect_view.cpp: + * src/widgets/effect_rack_view.cpp: + rewrote view-component of effect-framework and removed effectTabWidget + + * include/automatable_model.h: + * src/widgets/automatable_slider.cpp: + * src/widgets/group_box.cpp: + * src/widgets/lcd_spinbox.cpp: + * src/widgets/combobox.cpp: + * src/widgets/knob.cpp: + * src/widgets/automatable_button.cpp: + pass model-pointer to modelView-constructor + 2008-01-05 Tobias Doerffel * plugins/organic/organic.cpp: diff --git a/Makefile.am b/Makefile.am index 0032df353..02a96d0aa 100644 --- a/Makefile.am +++ b/Makefile.am @@ -63,7 +63,6 @@ lmms_MOC = \ ./effect_control_dialog.moc \ ./effect_label.moc \ ./effect_select_dialog.moc \ - ./effect_tab_widget.moc \ ./envelope_and_lfo_widget.moc \ ./envelope_tab_widget.moc \ ./export_project_dialog.moc \ @@ -89,8 +88,8 @@ lmms_MOC = \ ./pixmap_button.moc \ ./plugin_browser.moc \ ./project_notes.moc \ - ./rack_plugin.moc \ - ./rack_view.moc \ + ./effect_view.moc \ + ./effect_rack_view.moc \ ./rubberband.moc \ ./rename_dialog.moc \ ./sample_buffer.moc \ @@ -159,7 +158,6 @@ lmms_SOURCES = \ $(srcdir)/src/core/effect_chain.cpp \ $(srcdir)/src/core/effect_control_dialog.cpp \ $(srcdir)/src/core/effect_select_dialog.cpp \ - $(srcdir)/src/core/effect_tab_widget.cpp \ $(srcdir)/src/core/effect.cpp \ $(srcdir)/src/core/engine.cpp \ $(srcdir)/src/core/envelope_and_lfo_widget.cpp \ @@ -221,6 +219,8 @@ lmms_SOURCES = \ $(srcdir)/src/widgets/combobox.cpp \ $(srcdir)/src/widgets/cpuload_widget.cpp \ $(srcdir)/src/widgets/effect_label.cpp \ + $(srcdir)/src/widgets/effect_rack_view.cpp \ + $(srcdir)/src/widgets/effect_view.cpp \ $(srcdir)/src/widgets/fade_button.cpp \ $(srcdir)/src/widgets/group_box.cpp \ $(srcdir)/src/widgets/kmultitabbar.cpp \ @@ -230,8 +230,6 @@ lmms_SOURCES = \ $(srcdir)/src/widgets/nstate_button.cpp \ $(srcdir)/src/widgets/pixmap_button.cpp \ $(srcdir)/src/widgets/project_notes.cpp \ - $(srcdir)/src/widgets/rack_plugin.cpp \ - $(srcdir)/src/widgets/rack_view.cpp \ $(srcdir)/src/widgets/rubberband.cpp \ $(srcdir)/src/widgets/rename_dialog.cpp \ $(srcdir)/src/widgets/side_bar_widget.cpp \ @@ -273,7 +271,9 @@ lmms_SOURCES = \ $(srcdir)/include/panning.h \ $(srcdir)/include/song_editor.h \ $(srcdir)/include/plugin.h \ + $(srcdir)/include/plugin_view.h \ $(srcdir)/include/instrument.h \ + $(srcdir)/include/instrument_view.h \ $(srcdir)/include/bb_editor.h \ $(srcdir)/include/piano_widget.h \ $(srcdir)/include/effect_board.h \ @@ -372,10 +372,9 @@ lmms_SOURCES = \ $(srcdir)/include/effect_chain.h \ $(srcdir)/include/effect_control_dialog.h \ $(srcdir)/include/effect_label.h \ - $(srcdir)/include/effect_tab_widget.h \ - $(srcdir)/include/rack_plugin.h \ - $(srcdir)/include/rack_view.h \ + $(srcdir)/include/effect_rack_view.h \ $(srcdir)/include/effect_select_dialog.h \ + $(srcdir)/include/effect_view.h \ $(srcdir)/include/dummy_effect.h \ $(srcdir)/include/ladspa-1.1.h \ $(srcdir)/include/sweep_oscillator.h \ diff --git a/configure.in b/configure.in index deb308d9c..e47c8f508 100644 --- a/configure.in +++ b/configure.in @@ -2,8 +2,8 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.50) -AC_INIT(lmms, 0.4.0-svn20080104-mv, lmms-devel/at/lists/dot/sf/dot/net) -AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080104-mv) +AC_INIT(lmms, 0.4.0-svn20080106-mv, lmms-devel/at/lists/dot/sf/dot/net) +AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080106-mv) AM_CONFIG_HEADER(config.h) diff --git a/include/audio_port.h b/include/audio_port.h index 2fdad2a98..a7177772d 100644 --- a/include/audio_port.h +++ b/include/audio_port.h @@ -1,7 +1,7 @@ /* * audio_port.h - base-class for objects providing sound at a port * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -34,7 +34,7 @@ class audioPort { public: - audioPort( const QString & _name ); + audioPort( const QString & _name, track * _track ); ~audioPort(); inline surroundSampleFrame * firstBuffer( void ) @@ -66,7 +66,7 @@ public: inline effectChain * getEffects( void ) { - return( m_effects ); + return( &m_effects ); } void setNextFxChannel( const fx_ch_t _chnl ) @@ -88,7 +88,11 @@ public: NONE, FIRST, BOTH } m_bufferUsage; - inline bool processEffects( void ) { return( m_effects->processAudioBuffer( m_firstBuffer, m_frames ) ); }; + inline bool processEffects( void ) + { + return( m_effects.processAudioBuffer( m_firstBuffer, + m_frames ) ); + } private: surroundSampleFrame * m_firstBuffer; @@ -98,7 +102,7 @@ private: QString m_name; - effectChain * m_effects; + effectChain m_effects; fpp_t m_frames; } ; diff --git a/include/automatable_model.h b/include/automatable_model.h index 7a56e85a0..88249c7cc 100644 --- a/include/automatable_model.h +++ b/include/automatable_model.h @@ -1,7 +1,7 @@ /* * automatable_model.h - declaration of class automatableModel * - * Copyright (c) 2007 Tobias Doerffel + * Copyright (c) 2007-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -247,7 +247,8 @@ public: typedef automatableModel autoModel; typedef automatableModelView autoModelView; - automatableModelView( void ) : modelView() + automatableModelView( ::model * _model ) : + modelView( _model ) { } diff --git a/include/dummy_effect.h b/include/dummy_effect.h index 435b4ae00..3e37ab955 100644 --- a/include/dummy_effect.h +++ b/include/dummy_effect.h @@ -55,8 +55,8 @@ public: class dummyEffect : public effect { public: - inline dummyEffect( void ) : - effect( NULL, NULL ) + inline dummyEffect( model * _parent ) : + effect( NULL, _parent, NULL ) { } diff --git a/include/dummy_instrument.h b/include/dummy_instrument.h index 736d4ee56..b2bb5f8db 100644 --- a/include/dummy_instrument.h +++ b/include/dummy_instrument.h @@ -56,7 +56,7 @@ public: return( "dummyinstrument" ); } - virtual instrumentView * createView( QWidget * _parent ) + virtual pluginView * instantiateView( QWidget * _parent ) { return( new instrumentView( this, _parent ) ); } diff --git a/include/dummy_plugin.h b/include/dummy_plugin.h index 6dcc413d0..1bdc58967 100644 --- a/include/dummy_plugin.h +++ b/include/dummy_plugin.h @@ -2,7 +2,7 @@ * dummy_plugin.h - empty plugin which is used as fallback if a plugin couldn't * be found * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -28,13 +28,14 @@ #define _DUMMY_PLUGIN_H #include "plugin.h" +#include "plugin_view.h" class dummyPlugin : public plugin { public: inline dummyPlugin( void ) : - plugin( NULL ) + plugin( NULL, NULL ) { } @@ -56,6 +57,12 @@ public: return( "dummyplugin" ); } +protected: + virtual pluginView * instantiateView( QWidget * _parent ) + { + return( new pluginView( this, _parent ) ); + } + } ; diff --git a/include/effect.h b/include/effect.h index d5e55618c..e7c51aa88 100644 --- a/include/effect.h +++ b/include/effect.h @@ -2,7 +2,7 @@ * effect.h - base class for effects * * Copyright (c) 2006-2007 Danny McRae - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -39,83 +39,91 @@ #include "automatable_model.h" +class effectChain; class effectControlDialog; class track; -class rackPlugin; class effect : public plugin { public: effect( const plugin::descriptor * _desc, + model * _parent, const descriptor::subPluginFeatures::key * _key ); virtual ~effect(); + + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); + + inline virtual QString nodeName( void ) const + { + return( "effect" ); + } + - virtual bool FASTCALL processAudioBuffer( + virtual bool processAudioBuffer( surroundSampleFrame * _buf, const fpp_t _frames ); - + inline ch_cnt_t getProcessorCount( void ) const { return( m_processors ); } - + inline void setProcessorCount( ch_cnt_t _processors ) { m_processors = _processors; } - + inline bool isOkay( void ) const { return( m_okay ); } - + inline void setOkay( bool _state ) { m_okay = _state; } - - + + inline bool isRunning( void ) const { return( m_running ); } - + inline void startRunning( void ) { m_bufferCount = 0; m_running = TRUE; } - + inline void stopRunning( void ) { m_running = FALSE; } - + inline bool isEnabled( void ) const { return( m_enabledModel.value() ); } - - inline Uint32 getTimeout( void ) const + + inline f_cnt_t getTimeout( void ) const { - return( m_silenceTimeout ); + const float samples = engine::getMixer()->sampleRate() * + m_autoQuitModel.value() / 1000.0f; + return( 1 + ( static_cast( samples ) / + engine::getMixer()->framesPerPeriod() ) ); } - - inline void setTimeout( Uint32 _time_out ) - { - m_silenceTimeout = _time_out; - } - + inline float getWetLevel( void ) const { return( m_wetDryModel.value() ); } - + inline float getDryLevel( void ) const { return( 1.0f - m_wetDryModel.value() ); } - + inline float getGate( void ) const { const float level = m_gateModel.value(); @@ -123,7 +131,7 @@ public: engine::getMixer()->framesPerPeriod() ); } - inline Uint32 getBufferCount( void ) const + inline f_cnt_t getBufferCount( void ) const { return( m_bufferCount ); } @@ -135,7 +143,7 @@ public: inline void incrementBufferCount( void ) { - m_bufferCount++; + ++m_bufferCount; } inline bool dontRun( void ) const @@ -156,9 +164,14 @@ public: virtual effectControlDialog * createControlDialog( track * _track ) = 0; static effect * instantiate( const QString & _plugin_name, + model * _parent, descriptor::subPluginFeatures::key * _key ); +protected: + virtual pluginView * instantiateView( QWidget * ); + + private: descriptor::subPluginFeatures::key m_key; @@ -167,16 +180,16 @@ private: bool m_okay; bool m_noRun; bool m_running; + f_cnt_t m_bufferCount; + boolModel m_enabledModel; - - Uint32 m_bufferCount; - Uint32 m_silenceTimeout; - floatModel m_wetDryModel; floatModel m_gateModel; + floatModel m_autoQuitModel; - friend class rackPlugin; + friend class effectView; + friend class effectChain; } ; diff --git a/include/effect_chain.h b/include/effect_chain.h index c0acf4155..0c88d8104 100644 --- a/include/effect_chain.h +++ b/include/effect_chain.h @@ -2,6 +2,7 @@ * effect_chain.h - class for processing and effects chain * * Copyright (c) 2006-2008 Danny McRae + * Copyright (c) 2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -28,37 +29,48 @@ #include "effect.h" -typedef QVector effect_list_t; - - -class effectChain +class effectChain : public journallingObject, public model { public: - effectChain( void ); + effectChain( audioPort * _port, track * _track ); virtual ~effectChain(); - - void FASTCALL appendEffect( effect * _effect ); - void FASTCALL removeEffect( effect * _effect ); - void FASTCALL moveDown( effect * _effect ); - void FASTCALL moveUp( effect * _effect ); - bool FASTCALL processAudioBuffer( surroundSampleFrame * _buf, + + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); + + inline virtual QString nodeName( void ) const + { + return( "fxchain" ); + } + + void appendEffect( effect * _effect ); + void removeEffect( effect * _effect ); + void moveDown( effect * _effect ); + void moveUp( effect * _effect ); + bool processAudioBuffer( surroundSampleFrame * _buf, const fpp_t _frames ); void startRunning( void ); bool isRunning( void ); - inline const effect_list_t & getEffects( void ) +/* inline const effect_list_t & getEffects( void ) { return( m_effects ); - } + }*/ + + void deleteAllPlugins( void ); private: - effect_list_t m_effects; + typedef QVector effectList; + effectList m_effects; + + audioPort * m_port; + track * m_track; boolModel m_enabledModel; - friend class effectTabWidget; + friend class effectRackView; } ; diff --git a/include/effect_control_dialog.h b/include/effect_control_dialog.h index 9e3746584..1d95eb488 100644 --- a/include/effect_control_dialog.h +++ b/include/effect_control_dialog.h @@ -2,7 +2,7 @@ * effect_control_dialog.h - base-class for effect-dialogs for displaying and * editing control port values * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -28,14 +28,15 @@ #include -#include "journalling_object.h" +#include "mv_base.h" +#include "types.h" class effect; class track; -class effectControlDialog : public QWidget, public journallingObject +class effectControlDialog : public QWidget, public modelView { Q_OBJECT public: diff --git a/include/effect_label.h b/include/effect_label.h index 1403e9e16..6b8c8121e 100644 --- a/include/effect_label.h +++ b/include/effect_label.h @@ -3,6 +3,7 @@ * offers access to an effect rack * * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -28,18 +29,15 @@ #include -#include "journalling_object.h" - class QLabel; class QPushButton; -class effectTabWidget; +class effectRackView; class sampleTrack; -class tabWidget; -class effectLabel: public QWidget, public journallingObject +class effectLabel: public QWidget { Q_OBJECT public: @@ -48,22 +46,14 @@ public: virtual ~effectLabel(); QString text( void ) const; - void FASTCALL setText( const QString & _text ); - - virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _parent ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); - inline virtual QString nodeName( void ) const - { - return( "sample_track" ); - } + void setText( const QString & _text ); + - public slots: void showEffects( void ); void rename( void ); - + signals: void clicked( void ); void nameChanged( void ); @@ -78,13 +68,12 @@ protected: private: sampleTrack * m_track; - + QLabel * m_label; QPushButton * m_effectBtn; - tabWidget * m_tabWidget; - effectTabWidget * m_effWidget; QWidget * m_effWindow; + effectRackView * m_effectRack; -}; +} ; #endif diff --git a/include/effect_rack_view.h b/include/effect_rack_view.h index c83fea3ab..ea98a68c4 100644 --- a/include/effect_rack_view.h +++ b/include/effect_rack_view.h @@ -1,7 +1,8 @@ /* - * right_frame.h - provides the display for the rackInsert instances + * effect_rack_view.h - view for effectChain-model * * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -22,63 +23,61 @@ * */ -#ifndef _RACK_VIEW_H -#define _RACK_VIEW_H +#ifndef _EFFECT_RACK_VIEW_H +#define _EFFECT_RACK_VIEW_H #include -#include -#include -#include - +#include "effect_chain.h" #include "types.h" -#include "journalling_object.h" + +class QPushButton; +class QScrollArea; +class QVBoxLayout; + +class effectView; +class groupBox; -class audioPort; -class effect; -class rackPlugin; -class track; - - -class rackView: public QWidget, public journallingObject +class effectRackView : public QWidget, public modelView { Q_OBJECT - public: - rackView( QWidget * _parent, track * _track, audioPort * _port ); - ~rackView(); - - void addEffect( effect * _e ); - - virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _parent ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); - inline virtual QString nodeName( void ) const - { - return( "rack" ); - } - - void deleteAllPlugins( void ); + effectRackView( effectChain * _model, QWidget * _parent ); + virtual ~effectRackView(); public slots: - void moveUp( rackPlugin * _plugin ); - void moveDown( rackPlugin * _plugin ); - void deletePlugin( rackPlugin * _plugin ); + void moveUp( effectView * _view ); + void moveDown( effectView * _view ); + void deletePlugin( effectView * _view ); + + +private slots: + void updateView( void ); + void addEffect( void ); private: - void redraw(); + virtual void modelChanged( void ); + + inline effectChain * fxChain( void ) + { + return( castModel() ); + } + + inline const effectChain * fxChain( void ) const + { + return( castModel() ); + } - QVector m_rackInserts; - + QVector m_effectViews; + QVBoxLayout * m_mainLayout; + groupBox * m_effectsGroupBox; QScrollArea * m_scrollArea; - - track * m_track; - audioPort * m_port; + QPushButton * m_addButton; Uint32 m_lastY; diff --git a/include/effect_select_dialog.h b/include/effect_select_dialog.h index 87bbd08f3..acad866a7 100644 --- a/include/effect_select_dialog.h +++ b/include/effect_select_dialog.h @@ -29,7 +29,7 @@ #include #include -#include "effect.h" +#include "effect_chain.h" class effectSelectDialog : public QDialog @@ -39,7 +39,7 @@ public: effectSelectDialog( QWidget * _parent ); virtual ~effectSelectDialog(); - effect * instantiateSelectedPlugin( void ); + effect * instantiateSelectedPlugin( effectChain * _parent ); public slots: void showPorts( void ); @@ -53,13 +53,13 @@ private: -class effectList : public QWidget +class effectListWidget : public QWidget { Q_OBJECT public: - effectList( QWidget * _parent ); + effectListWidget( QWidget * _parent ); - virtual ~effectList(); + virtual ~effectListWidget(); inline effectKey getSelected( void ) { diff --git a/include/effect_tab_widget.h b/include/effect_tab_widget.h deleted file mode 100644 index a64a454c0..000000000 --- a/include/effect_tab_widget.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * effect_tab_widget.h - tab-widget in channel-track-window for setting up - * effects - * - * Copyright (c) 2006-2008 Danny McRae - * - * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net - * - * 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 _EFFECT_TAB_WIDGET_H -#define _EFFECT_TAB_WIDGET_H - -#include - -#include "journalling_object.h" -#include "rack_view.h" - - -class QPushButton; - -class audioPort; -class groupBox; -class instrumentTrack; -class sampleTrack; -class track; - - -class effectTabWidget : public QWidget, public journallingObject -{ - Q_OBJECT -public: - effectTabWidget( instrumentTrack * _track, audioPort * _port ); - effectTabWidget( QWidget * _parent, sampleTrack * _track, - audioPort * _port ); - virtual ~effectTabWidget(); - - - virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _parent ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); - inline virtual QString nodeName( void ) const - { - return( "fx" ); - } - - void setupWidget( void ); - - inline void deleteAllEffects( void ) - { - m_rack->deleteAllPlugins(); - } - - -private slots: - void addEffect( void ); - - -private: - track * m_track; - audioPort * m_port; - - groupBox * m_effectsGroupBox; - QPushButton * m_addButton; - - rackView * m_rack; - -} ; - -#endif diff --git a/include/effect_view.h b/include/effect_view.h index 7334a3482..58d3d6ddb 100644 --- a/include/effect_view.h +++ b/include/effect_view.h @@ -1,8 +1,8 @@ /* - * rack_plugin.h - tab-widget in channel-track-window for setting up - * effects + * effect_view.h - view-component for an effect * * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2007-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -23,13 +23,11 @@ * */ -#ifndef _RACK_PLUGIN_H -#define _RACK_PLUGIN_H - -#include +#ifndef _EFFECT_VIEW_H +#define _EFFECT_VIEW_H #include "automatable_model.h" - +#include "plugin_view.h" class QGroupBox; class QLabel; @@ -45,51 +43,44 @@ class tempoSyncKnob; class track; -class rackPlugin: public QWidget, public journallingObject +class effectView : public pluginView { Q_OBJECT - public: - rackPlugin( QWidget * _parent, effect * _eff, track * _track, - audioPort * _port ); - virtual ~rackPlugin(); + effectView( effect * _model, QWidget * _parent ); + virtual ~effectView(); - inline effect * getEffect() + inline effect * getEffect( void ) { - return( m_effect ); + return( castModel() ); + } + inline const effect * getEffect( void ) const + { + return( castModel() ); } - virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _parent ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); - inline virtual QString nodeName( void ) const - { - return( "effect" ); - } public slots: void editControls( void ); - void updateAutoQuit( void ); -/* void bypassChanged( void ); - void updateWetDry( void ); - void updateGate( void );*/ void moveUp( void ); void moveDown( void ); void deletePlugin( void ); void displayHelp( void ); void closeEffects( void ); + signals: - void moveUp( rackPlugin * _plugin ); - void moveDown( rackPlugin * _plugin ); - void deletePlugin( rackPlugin * _plugin ); + void moveUp( effectView * _plugin ); + void moveDown( effectView * _plugin ); + void deletePlugin( effectView * _plugin ); + protected: void contextMenuEvent( QContextMenuEvent * _me ); - -private: - floatModel m_autoQuitModel; + virtual void modelChanged( void ); + +private: ledCheckBox * m_bypass; knob * m_wetDry; tempoSyncKnob * m_autoQuit; @@ -99,10 +90,7 @@ private: QLabel * m_label; QPushButton * m_editButton; QMdiSubWindow * m_subWindow; - effect * m_effect; effectControlDialog * m_controlView; - track * m_track; - audioPort * m_port; bool m_show; } ; diff --git a/include/instrument.h b/include/instrument.h index 55f823cbc..a17226499 100644 --- a/include/instrument.h +++ b/include/instrument.h @@ -31,7 +31,6 @@ #include "plugin.h" #include "mixer.h" -#include "mv_base.h" // forward-declarations @@ -43,7 +42,7 @@ class notePlayHandle; class track; -class instrument : public plugin, public model +class instrument : public plugin { public: instrument( instrumentTrack * _instrument_track, @@ -117,8 +116,6 @@ public: virtual bool isFromTrack( const track * _track ) const; - instrumentView * createEditor( QWidget * _parent ); - protected: inline instrumentTrack * getInstrumentTrack( void ) const @@ -131,38 +128,10 @@ protected: // desiredReleaseFrames() frames are left void applyRelease( sampleFrame * buf, const notePlayHandle * _n ); - // instruments have to implement this to create an according view for - // themselves - virtual instrumentView * createView( QWidget * _parent ) = 0; - - private: instrumentTrack * m_instrumentTrack; } ; - -class instrumentView : public QWidget, public modelView -{ -public: - instrumentView( instrument * _instrument, QWidget * _parent ); - virtual ~instrumentView(); - - instrument * model( void ) - { - return( castModel() ); - } - - const instrument * model( void ) const - { - return( castModel() ); - } - - virtual void setModel( ::model * _model, bool = FALSE ); - -} ; - - - #endif diff --git a/include/instrument_track.h b/include/instrument_track.h index 7f2f9dd43..3bf047f23 100644 --- a/include/instrument_track.h +++ b/include/instrument_track.h @@ -2,7 +2,7 @@ * instrument_track.h - declaration of class instrumentTrack, a track + window * which holds an instrument-plugin * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -30,18 +30,20 @@ #include #include +#include "audio_port.h" #include "automatable_model.h" #include "lcd_spinbox.h" #include "midi_event_processor.h" #include "mixer.h" +#include "effect_chain.h" #include "surround_area.h" #include "tab_widget.h" #include "track.h" + class QLineEdit; class arpAndChordsTabWidget; -class audioPort; -class effectTabWidget; +class effectRackView; class envelopeTabWidget; class fadeButton; class instrument; @@ -158,7 +160,7 @@ public: inline audioPort * getAudioPort( void ) { - return( m_audioPort ); + return( &m_audioPort ); } intModel * baseNoteModel( void ) @@ -207,7 +209,7 @@ private: midiPort * m_midiPort; - audioPort * m_audioPort; + audioPort m_audioPort; notePlayHandle * m_notes[NOTES_PER_OCTAVE * OCTAVES]; @@ -237,7 +239,11 @@ private: envelopeTabWidget * m_envWidget; arpAndChordsTabWidget * m_arpWidget; midiTabWidget * m_midiWidget; - effectTabWidget * m_effWidget; + + pluginView * m_instrumentView; + effectRackView * m_effectRack; + +// effectChain m_effects; // test-piano at the bottom of every instrument-settings-window pianoWidget * m_pianoWidget; diff --git a/include/main_window.h b/include/main_window.h index 4c906c9b7..a9550e584 100644 --- a/include/main_window.h +++ b/include/main_window.h @@ -37,7 +37,7 @@ class QMdiArea; class QSplashScreen; class configManager; -class tool; +class pluginView; class toolButton; @@ -155,8 +155,8 @@ private: bool m_alt; } m_keyMods; - QMenu * m_tools_menu; - QList m_tools; + QMenu * m_toolsMenu; + QList m_tools; bool m_modified; diff --git a/include/mv_base.h b/include/mv_base.h index 281b3fef3..7e38aa73e 100644 --- a/include/mv_base.h +++ b/include/mv_base.h @@ -28,6 +28,8 @@ #include +class modelView; + class model : public QObject { @@ -71,8 +73,8 @@ signals: class modelView { public: - modelView() : - m_model( NULL ) + modelView( model * _model ) : + m_model( _model ) { } diff --git a/include/plugin.h b/include/plugin.h index 385589c47..e92ef9fdf 100644 --- a/include/plugin.h +++ b/include/plugin.h @@ -32,6 +32,7 @@ #include #include "journalling_object.h" +#include "mv_base.h" #include "base64.h" @@ -42,8 +43,10 @@ class QPixmap; class QWidget; +class pluginView; -class plugin : public journallingObject + +class plugin : public journallingObject, public model { public: enum pluginTypes @@ -150,7 +153,7 @@ public: } ; // contructor of a plugin - plugin( const descriptor * _descriptor ); + plugin( const descriptor * _descriptor, model * _parent ); virtual ~plugin(); // returns public-name out of descriptor @@ -184,6 +187,7 @@ public: // returns an instance of a plugin whose name matches to given one // if specified plugin couldn't be loaded, it creates a dummy-plugin static plugin * FASTCALL instantiate( const QString & _plugin_name, + model * _parent, void * _data ); // some plugins run external programs for doing their actual work @@ -194,21 +198,29 @@ public: // of course isn't that efficient virtual bool supportsParallelizing( void ) const; - // plugins supporting parallelizing, should re-implement that as the + // plugins supporting parallelization, should re-implement that as the // mixer will call this at the end of processing according chain // of plugins virtual void waitForWorkerThread( void ); - // fills given vector with descriptors of all available plugins static void FASTCALL getDescriptorsOfAvailPlugins( QVector & _plugin_descs ); + // create a view for the model + pluginView * createView( QWidget * _parent ); + + +protected: + // create a view for the model + virtual pluginView * instantiateView( QWidget * ) = 0; + + private: const descriptor * m_descriptor; // pointer to instantiation-function in plugin - typedef plugin * ( * instantiationHook )( void * ); + typedef plugin * ( * instantiationHook )( model *, void * ); } ; diff --git a/include/sample_track.h b/include/sample_track.h index e430f9627..507f5e332 100644 --- a/include/sample_track.h +++ b/include/sample_track.h @@ -2,7 +2,7 @@ * sample_track.h - class sampleTrack, a track which provides arrangement of * samples * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -29,11 +29,11 @@ #include +#include "audio_port.h" #include "track.h" #include "volume_knob.h" class QLabel; -class audioPort; class effectLabel; class sampleBuffer; @@ -133,7 +133,7 @@ public: inline audioPort * getAudioPort( void ) { - return( m_audioPort ); + return( &m_audioPort ); } virtual QString nodeName( void ) const @@ -144,7 +144,7 @@ public: private: effectLabel * m_trackLabel; - audioPort * m_audioPort; + audioPort m_audioPort; volumeKnob * m_volumeKnob; knobModel m_volumeModel; diff --git a/include/tab_widget.h b/include/tab_widget.h index cb3b67e16..c06756d0a 100644 --- a/include/tab_widget.h +++ b/include/tab_widget.h @@ -1,7 +1,7 @@ /* * tab_widget.h - LMMS-tabwidget * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -35,10 +35,9 @@ class tabWidget : public QWidget Q_OBJECT public: tabWidget( const QString & _caption, QWidget * _parent ); - ~tabWidget(); + virtual ~tabWidget(); - void addTab( QWidget * _w, const QString & _name, - int _idx = -1 ); + void addTab( QWidget * _w, const QString & _name, int _idx = -1 ); void setActiveTab( int _idx ); diff --git a/include/tool.h b/include/tool.h index 7baa2cfab..e4c0d5e9b 100644 --- a/include/tool.h +++ b/include/tool.h @@ -2,6 +2,7 @@ * tool.h - declaration of class tool, standard interface for all tool plugins * * Copyright (c) 2006-2007 Javier Serrano Polo + * Copyright (c) 2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -26,24 +27,31 @@ #ifndef _TOOL_H #define _TOOL_H -#include - #include "plugin.h" +#include "plugin_view.h" -class tool : public QWidget, public plugin +class tool : public plugin { public: - tool( const descriptor * _descriptor ); + tool( const descriptor * _descriptor, model * _parent ); virtual ~tool(); // instantiate tool-plugin with given name or return NULL // on failure - static tool * FASTCALL instantiate( const QString & _plugin_name ); + static tool * FASTCALL instantiate( const QString & _plugin_name, + model * _parent ); } ; +class toolView : public pluginView +{ +public: + toolView( tool * _tool, QWidget * _parent ); + +} ; + #endif diff --git a/plugins/audio_file_processor/audio_file_processor.cpp b/plugins/audio_file_processor/audio_file_processor.cpp index b8c519d05..d66d55dee 100644 --- a/plugins/audio_file_processor/audio_file_processor.cpp +++ b/plugins/audio_file_processor/audio_file_processor.cpp @@ -216,7 +216,7 @@ Uint32 audioFileProcessor::getBeatLen( notePlayHandle * _n ) const -instrumentView * audioFileProcessor::createView( QWidget * _parent ) +pluginView * audioFileProcessor::instantiateView( QWidget * _parent ) { return( new audioFileProcessorView( this, _parent ) ); } @@ -600,7 +600,7 @@ extern "C" { // neccessary for getting instance out of shared lib -plugin * lmms_plugin_main( void * _data ) +plugin * lmms_plugin_main( model *, void * _data ) { return( new audioFileProcessor( static_cast( _data ) ) ); diff --git a/plugins/audio_file_processor/audio_file_processor.h b/plugins/audio_file_processor/audio_file_processor.h index 39c982226..ce6b6f2eb 100644 --- a/plugins/audio_file_processor/audio_file_processor.h +++ b/plugins/audio_file_processor/audio_file_processor.h @@ -30,6 +30,7 @@ #include #include "instrument.h" +#include "instrument_view.h" #include "sample_buffer.h" #include "volume_knob.h" #include "pixmap_button.h" @@ -73,7 +74,7 @@ public: return( 128 ); } - virtual instrumentView * createView( QWidget * _parent ); + virtual pluginView * instantiateView( QWidget * _parent ); public slots: diff --git a/plugins/bass_booster/bass_booster.cpp b/plugins/bass_booster/bass_booster.cpp index 59cbf0472..e8c9f4bce 100644 --- a/plugins/bass_booster/bass_booster.cpp +++ b/plugins/bass_booster/bass_booster.cpp @@ -51,9 +51,9 @@ plugin::descriptor bassbooster_plugin_descriptor = -bassBoosterEffect::bassBoosterEffect( +bassBoosterEffect::bassBoosterEffect( model * _parent, const descriptor::subPluginFeatures::key * _key ) : - effect( &bassbooster_plugin_descriptor, _key ), + effect( &bassbooster_plugin_descriptor, _parent, _key ), m_bbFX( effectLib::fastBassBoost<>( 70.0f, 1.0f, 2.8f ) ) { } @@ -71,7 +71,7 @@ bassBoosterEffect::~bassBoosterEffect() bool FASTCALL bassBoosterEffect::processAudioBuffer( surroundSampleFrame * _buf, const fpp_t _frames ) { - if( isBypassed() || !isRunning () ) + if( !isEnabled() || !isRunning () ) { return( FALSE ); } @@ -114,9 +114,9 @@ extern "C" { // neccessary for getting instance out of shared lib -plugin * lmms_plugin_main( void * _data ) +plugin * lmms_plugin_main( model * _parent, void * _data ) { - return( new bassBoosterEffect( + return( new bassBoosterEffect( _parent, static_cast( _data ) ) ); } diff --git a/plugins/bass_booster/bass_booster.h b/plugins/bass_booster/bass_booster.h index e520cccc1..108db8fa1 100644 --- a/plugins/bass_booster/bass_booster.h +++ b/plugins/bass_booster/bass_booster.h @@ -40,7 +40,8 @@ class bassBoosterEffect : public effect { public: - bassBoosterEffect( const descriptor::subPluginFeatures::key * _key ); + bassBoosterEffect( model * _parent, + const descriptor::subPluginFeatures::key * _key ); virtual ~bassBoosterEffect(); virtual bool FASTCALL processAudioBuffer( surroundSampleFrame * _buf, const fpp_t _frames ); diff --git a/plugins/kicker/kicker.cpp b/plugins/kicker/kicker.cpp index 1e2a498b5..27904b3e9 100644 --- a/plugins/kicker/kicker.cpp +++ b/plugins/kicker/kicker.cpp @@ -178,7 +178,7 @@ void kickerInstrument::deleteNotePluginData( notePlayHandle * _n ) -instrumentView * kickerInstrument::createView( QWidget * _parent ) +pluginView * kickerInstrument::instantiateView( QWidget * _parent ) { return( new kickerInstrumentView( this, _parent ) ); } @@ -255,7 +255,7 @@ extern "C" { // neccessary for getting instance out of shared lib -plugin * lmms_plugin_main( void * _data ) +plugin * lmms_plugin_main( model *, void * _data ) { return( new kickerInstrument( static_cast( _data ) ) ); diff --git a/plugins/kicker/kicker.h b/plugins/kicker/kicker.h index 152a5c746..0338ffca2 100644 --- a/plugins/kicker/kicker.h +++ b/plugins/kicker/kicker.h @@ -27,6 +27,7 @@ #define _KICKER_H #include "instrument.h" +#include "instrument_view.h" #include "knob.h" @@ -56,7 +57,7 @@ public: return( 512 ); } - virtual instrumentView * createView( QWidget * _parent ); + virtual pluginView * instantiateView( QWidget * _parent ); private: diff --git a/plugins/ladspa_browser/ladspa_browser.cpp b/plugins/ladspa_browser/ladspa_browser.cpp index e71baef46..4ce460ed0 100644 --- a/plugins/ladspa_browser/ladspa_browser.cpp +++ b/plugins/ladspa_browser/ladspa_browser.cpp @@ -2,7 +2,7 @@ * ladspa_browser.cpp - dialog to display information about installed LADSPA * plugins * - * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2006-2008 Danny McRae * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -73,7 +73,32 @@ plugin * lmms_plugin_main( void * _data ) ladspaBrowser::ladspaBrowser( void ) : - tool( &ladspa_browser_plugin_descriptor ) + tool( &ladspa_browser_plugin_descriptor, NULL ) +{ +} + + + + +ladspaBrowser::~ladspaBrowser() +{ +} + + + + +QString ladspaBrowser::nodeName( void ) const +{ + return( ladspa_browser_plugin_descriptor.name ); +} + + + + + + +ladspaBrowserView::ladspaBrowserView( tool * _tool, QWidget * _parent ) : + toolView( _tool, _parent ) { QHBoxLayout * hlayout = new QHBoxLayout( this ); hlayout->setSpacing( 0 ); @@ -160,22 +185,14 @@ ladspaBrowser::ladspaBrowser( void ) : -ladspaBrowser::~ladspaBrowser() +ladspaBrowserView::~ladspaBrowserView() { } -QString ladspaBrowser::nodeName( void ) const -{ - return( ladspa_browser_plugin_descriptor.name ); -} - - - - -QWidget * ladspaBrowser::createTab( QWidget * _parent, const QString & _txt, +QWidget * ladspaBrowserView::createTab( QWidget * _parent, const QString & _txt, ladspaPluginType _type ) { QWidget * tab = new QWidget( _parent ); @@ -205,7 +222,7 @@ QWidget * ladspaBrowser::createTab( QWidget * _parent, const QString & _txt, -void ladspaBrowser::showPorts( const ladspa_key_t & _key ) +void ladspaBrowserView::showPorts( const ladspa_key_t & _key ) { ladspaPortDialog ports( _key ); ports.exec(); diff --git a/plugins/ladspa_browser/ladspa_browser.h b/plugins/ladspa_browser/ladspa_browser.h index 0f357ce92..db27616ce 100644 --- a/plugins/ladspa_browser/ladspa_browser.h +++ b/plugins/ladspa_browser/ladspa_browser.h @@ -2,7 +2,7 @@ * ladspa_browser.h - dialog to display information about installed LADSPA * plugins * - * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2006-2008 Danny McRae * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -35,14 +35,12 @@ class tabBar; -class ladspaBrowser : public tool +class ladspaBrowserView : public toolView { Q_OBJECT public: - ladspaBrowser( void ); - virtual ~ladspaBrowser(); - - virtual QString nodeName( void ) const; + ladspaBrowserView( tool * _tool, QWidget * _parent ); + virtual ~ladspaBrowserView(); public slots: @@ -59,4 +57,20 @@ private: } ; +class ladspaBrowser : public tool +{ +public: + ladspaBrowser( void ); + virtual ~ladspaBrowser(); + + virtual pluginView * instantiateView( QWidget * _parent ) + { + return( new ladspaBrowserView( this, _parent ) ); + } + + virtual QString nodeName( void ) const; + +} ; + + #endif diff --git a/plugins/ladspa_effect/ladspa_effect.cpp b/plugins/ladspa_effect/ladspa_effect.cpp index 200235393..152e96e10 100644 --- a/plugins/ladspa_effect/ladspa_effect.cpp +++ b/plugins/ladspa_effect/ladspa_effect.cpp @@ -59,8 +59,9 @@ plugin::descriptor ladspaeffect_plugin_descriptor = } -ladspaEffect::ladspaEffect( const descriptor::subPluginFeatures::key * _key ) : - effect( &ladspaeffect_plugin_descriptor, _key ), +ladspaEffect::ladspaEffect( model * _parent, + const descriptor::subPluginFeatures::key * _key ) : + effect( &ladspaeffect_plugin_descriptor, _parent, _key ), m_effName( "none" ), m_key( ladspaSubPluginFeatures::subPluginKeyToLadspaKey( _key ) /* ladspa_key_t( _cdata->settings.attribute( "label" ), @@ -464,15 +465,13 @@ void FASTCALL ladspaEffect::setControl( Uint16 _control, LADSPA_Data _value ) } -#undef indexOf - extern "C" { // neccessary for getting instance out of shared lib -plugin * lmms_plugin_main( void * _data ) +plugin * lmms_plugin_main( model * _parent, void * _data ) { - return( new ladspaEffect( + return( new ladspaEffect( _parent, static_cast( _data ) ) ); } diff --git a/plugins/ladspa_effect/ladspa_effect.h b/plugins/ladspa_effect/ladspa_effect.h index 2cdb0aaf4..610813a1f 100644 --- a/plugins/ladspa_effect/ladspa_effect.h +++ b/plugins/ladspa_effect/ladspa_effect.h @@ -1,7 +1,7 @@ /* * ladspa_effect.h - class for handling LADSPA effect plugins * - * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2006-2008 Danny McRae * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -41,7 +41,8 @@ typedef QVector multi_proc_t; class ladspaEffect : public effect { public: - ladspaEffect( const descriptor::subPluginFeatures::key * _key ); + ladspaEffect( model * _parent, + const descriptor::subPluginFeatures::key * _key ); virtual ~ladspaEffect(); virtual bool FASTCALL processAudioBuffer( surroundSampleFrame * _buf, @@ -84,7 +85,7 @@ private: Uint16 m_effectChannels; Uint16 m_portCount; fpp_t m_bufferSize; - + const LADSPA_Descriptor * m_descriptor; QVector m_handles; diff --git a/plugins/stk/mallets/mallets.cpp b/plugins/stk/mallets/mallets.cpp index 662fdd956..a58665b6a 100644 --- a/plugins/stk/mallets/mallets.cpp +++ b/plugins/stk/mallets/mallets.cpp @@ -58,8 +58,8 @@ plugin::descriptor malletsstk_plugin_descriptor = } -malletsInstrument::malletsInstrument( instrumentTrack * _channel_track ): - instrument( _channel_track, &malletsstk_plugin_descriptor ), +malletsInstrument::malletsInstrument( instrumentTrack * _instrument_track ): + instrument( _instrument_track, &malletsstk_plugin_descriptor ), m_hardnessModel(64.0f, 0.0f, 128.0f, 0.1f, this), m_positionModel(64.0f, 0.0f, 128.0f, 0.1f, this), m_vibratoGainModel(64.0f, 0.0f, 128.0f, 0.1f, this), @@ -77,21 +77,21 @@ malletsInstrument::malletsInstrument( instrumentTrack * _channel_track ): m_presetsModel(this), m_spreadModel(0, 0, 255, 1, this) { - m_hardnessModel.setTrack( _channel_track ); - m_positionModel.setTrack( _channel_track ); - m_vibratoGainModel.setTrack( _channel_track ); - m_vibratoFreqModel.setTrack( _channel_track ); - m_stickModel.setTrack( _channel_track ); - m_modulatorModel.setTrack( _channel_track ); - m_crossfadeModel.setTrack( _channel_track ); - m_lfoSpeedModel.setTrack( _channel_track ); - m_lfoDepthModel.setTrack( _channel_track ); - m_adsrModel.setTrack( _channel_track ); - m_pressureModel.setTrack( _channel_track ); - m_motionModel.setTrack( _channel_track ); - m_velocityModel.setTrack( _channel_track ); - m_strikeModel.setTrack( _channel_track ); - m_spreadModel.setTrack( _channel_track ); + m_hardnessModel.setTrack( _instrument_track ); + m_positionModel.setTrack( _instrument_track ); + m_vibratoGainModel.setTrack( _instrument_track ); + m_vibratoFreqModel.setTrack( _instrument_track ); + m_stickModel.setTrack( _instrument_track ); + m_modulatorModel.setTrack( _instrument_track ); + m_crossfadeModel.setTrack( _instrument_track ); + m_lfoSpeedModel.setTrack( _instrument_track ); + m_lfoDepthModel.setTrack( _instrument_track ); + m_adsrModel.setTrack( _instrument_track ); + m_pressureModel.setTrack( _instrument_track ); + m_motionModel.setTrack( _instrument_track ); + m_velocityModel.setTrack( _instrument_track ); + m_strikeModel.setTrack( _instrument_track ); + m_spreadModel.setTrack( _instrument_track ); // ModalBar m_presetsModel.addItem( tr( "Marimba" ) ); @@ -299,7 +299,7 @@ void malletsInstrument::deleteNotePluginData( notePlayHandle * _n ) -instrumentView * malletsInstrument::createView( QWidget * _parent ) +pluginView * malletsInstrument::instantiateView( QWidget * _parent ) { return( new malletsInstrumentView( this, _parent ) ); } @@ -307,7 +307,8 @@ instrumentView * malletsInstrument::createView( QWidget * _parent ) -malletsInstrumentView::malletsInstrumentView( malletsInstrument * _instrument, QWidget * _parent ) : +malletsInstrumentView::malletsInstrumentView( malletsInstrument * _instrument, + QWidget * _parent ) : instrumentView( _instrument, _parent ) { _instrument->m_filesMissing = @@ -673,7 +674,7 @@ extern "C" { // neccessary for getting instance out of shared lib -plugin * lmms_plugin_main( void * _data ) +plugin * lmms_plugin_main( model *, void * _data ) { return( new malletsInstrument( static_cast( _data ) ) ); } diff --git a/plugins/stk/mallets/mallets.h b/plugins/stk/mallets/mallets.h index 31a396642..f0f18a32e 100644 --- a/plugins/stk/mallets/mallets.h +++ b/plugins/stk/mallets/mallets.h @@ -31,6 +31,7 @@ #include "combobox.h" #include "instrument.h" +#include "instrument_view.h" #include "knob.h" #include "note_play_handle.h" #include "led_checkbox.h" @@ -133,7 +134,7 @@ public: virtual QString nodeName( void ) const; - virtual instrumentView * createView( QWidget * _parent ); + virtual pluginView * instantiateView( QWidget * _parent ); private: knobModel m_hardnessModel; diff --git a/plugins/vst_effect/vst_effect.cpp b/plugins/vst_effect/vst_effect.cpp index 31f5d09d3..22b3f46d6 100644 --- a/plugins/vst_effect/vst_effect.cpp +++ b/plugins/vst_effect/vst_effect.cpp @@ -82,7 +82,7 @@ vstEffect::~vstEffect() bool FASTCALL vstEffect::processAudioBuffer( surroundSampleFrame * _buf, const fpp_t _frames ) { - if( isBypassed() || !isRunning () ) + if( !isEnabled() || !isRunning () ) { return( FALSE ); } diff --git a/src/audio/audio_port.cpp b/src/audio/audio_port.cpp index faa1b31f6..d4cc53c84 100644 --- a/src/audio/audio_port.cpp +++ b/src/audio/audio_port.cpp @@ -3,7 +3,7 @@ /* * audio_port.cpp - base-class for objects providing sound at a port * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -33,7 +33,7 @@ #include "engine.h" -audioPort::audioPort( const QString & _name ) : +audioPort::audioPort( const QString & _name, track * _track ) : m_bufferUsage( NONE ), m_firstBuffer( new surroundSampleFrame[ engine::getMixer()->framesPerPeriod()] ), @@ -42,7 +42,7 @@ audioPort::audioPort( const QString & _name ) : m_extOutputEnabled( FALSE ), m_nextFxChannel( -1 ), m_name( "unnamed port" ), - m_effects( new effectChain ), + m_effects( this, _track ), m_frames( engine::getMixer()->framesPerPeriod() ) { engine::getMixer()->clearAudioBuffer( m_firstBuffer, @@ -62,7 +62,6 @@ audioPort::~audioPort() engine::getMixer()->removeAudioPort( this ); delete[] m_firstBuffer; delete[] m_secondBuffer; - delete m_effects; } diff --git a/src/core/effect.cpp b/src/core/effect.cpp index 57dd9b1ea..522414c6e 100644 --- a/src/core/effect.cpp +++ b/src/core/effect.cpp @@ -25,25 +25,27 @@ * */ -#include #include "effect.h" #include "engine.h" #include "dummy_effect.h" +#include "effect_chain.h" +#include "effect_view.h" effect::effect( const plugin::descriptor * _desc, + model * _parent, const descriptor::subPluginFeatures::key * _key ) : - plugin( _desc ), + plugin( _desc, _parent ), m_key( _key ? *_key : descriptor::subPluginFeatures::key() ), m_okay( TRUE ), m_noRun( FALSE ), m_running( FALSE ), - m_enabledModel( FALSE, FALSE, TRUE ), m_bufferCount( 0 ), - m_silenceTimeout( 10 ), - m_wetDryModel( 1.0f, 0.0f, 1.0f, 0.01f ), - m_gateModel( 0.0f, 0.0f, 1.0f, 0.01f ) + m_enabledModel( TRUE, FALSE, TRUE, boolModel::defaultRelStep(), this ), + m_wetDryModel( 1.0f, 0.0f, 1.0f, 0.01f, this ), + m_gateModel( 0.0f, 0.0f, 1.0f, 0.01f, this ), + m_autoQuitModel( 1.0f, 1.0f, 8000.0f, 100.0f, this ) { } @@ -57,7 +59,45 @@ effect::~effect() -bool FASTCALL effect::processAudioBuffer( surroundSampleFrame * _buf, +void effect::saveSettings( QDomDocument & _doc, QDomElement & _this ) +{ + _this.setAttribute( "on", m_enabledModel.value() ); + _this.setAttribute( "wet", m_wetDryModel.value() ); + _this.setAttribute( "autoquit", m_autoQuitModel.value() ); + _this.setAttribute( "gate", m_gateModel.value() ); +// m_controlView->saveState( _doc, _this ); +} + + + + +void effect::loadSettings( const QDomElement & _this ) +{ + m_enabledModel.setValue( _this.attribute( "on" ).toInt() ); + m_wetDryModel.setValue( _this.attribute( "wet" ).toFloat() ); + m_autoQuitModel.setValue( _this.attribute( "autoquit" ).toFloat() ); + m_gateModel.setValue( _this.attribute( "gate" ).toFloat() ); +/* + QDomNode node = _this.firstChild(); + while( !node.isNull() ) + { + if( node.isElement() ) + { + if( m_controlView->nodeName() == node.nodeName() ) + { + m_controlView->restoreState( + node.toElement() ); + } + } + node = node.nextSibling(); + }*/ +} + + + + + +bool effect::processAudioBuffer( surroundSampleFrame * _buf, const fpp_t _frames ) { return( FALSE ); @@ -65,18 +105,12 @@ bool FASTCALL effect::processAudioBuffer( surroundSampleFrame * _buf, -/* -void FASTCALL effect::setGate( float _level ) -{ - m_gate = _level * _level * m_processors * - engine::getMixer()->framesPerPeriod(); -} -*/ effect * effect::instantiate( const QString & _plugin_name, + model * _parent, descriptor::subPluginFeatures::key * _key ) { - plugin * p = plugin::instantiate( _plugin_name, _key ); + plugin * p = plugin::instantiate( _plugin_name, _parent, _key ); // check whether instantiated plugin is an instrument if( dynamic_cast( p ) != NULL ) { @@ -86,9 +120,16 @@ effect * effect::instantiate( const QString & _plugin_name, // not quite... so delete plugin and return dummy instrument delete p; - return( new dummyEffect() ); + return( new dummyEffect( _parent ) ); } + +pluginView * effect::instantiateView( QWidget * _parent ) +{ + return( new effectView( this, _parent ) ); +} + + #endif diff --git a/src/core/effect_chain.cpp b/src/core/effect_chain.cpp index 0ea0f4261..085dab678 100644 --- a/src/core/effect_chain.cpp +++ b/src/core/effect_chain.cpp @@ -4,6 +4,7 @@ * effect_chain.cpp - class for processing and effects chain * * Copyright (c) 2006-2008 Danny McRae + * Copyright (c) 2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -31,7 +32,10 @@ -effectChain::effectChain( void ) : +effectChain::effectChain( audioPort * _port, track * _track ) : + model( /*_track*/ NULL ), + m_port( _port ), + m_track( _track ), m_enabledModel( FALSE, FALSE, TRUE ) { } @@ -41,26 +45,89 @@ effectChain::effectChain( void ) : effectChain::~effectChain() { - for( effect_list_t::size_type eff = 0; eff < m_effects.count(); eff++ ) + deleteAllPlugins(); +} + + + + +void effectChain::saveSettings( QDomDocument & _doc, QDomElement & _this ) +{ + _this.setAttribute( "fxenabled", m_enabledModel.value() ); + _this.setAttribute( "numofeffects", m_effects.count() ); + for( effectList::iterator it = m_effects.begin(); + it != m_effects.end(); it++ ) { - delete m_effects[eff]; + QDomElement ef = ( *it )->saveState( _doc, _this ); + ef.setAttribute( "name", ( *it )->getDescriptor()->name ); + ef.setAttribute( "key", ( *it )->getKey().dumpBase64() ); + } +} + + + + +void effectChain::loadSettings( const QDomElement & _this ) +{ +// deleteAllPlugins(); + for( int i = 0; i < m_effects.count(); ++i ) + { + delete m_effects[i]; } m_effects.clear(); + + m_enabledModel.setValue( _this.attribute( "fxenabled" ).toInt() ); + + const int plugin_cnt = _this.attribute( "numofeffects" ).toInt(); + + QDomNode node = _this.firstChild(); + for( int i = 0; i < plugin_cnt; i++ ) + { + if( node.isElement() && node.nodeName() == "effect" ) + { + QDomElement cn = node.toElement(); + const QString name = cn.attribute( "name" ); + // we have this really convenient key-ctor + // which takes a QString and decodes the + // base64-data inside :-) + effectKey key( cn.attribute( "key" ) ); + effect * e = effect::instantiate( name, this, &key ); + m_effects.push_back( e ); + // TODO: somehow detect if effect is sub-plugin-capable + // but couldn't load sub-plugin with requsted key + if( node.isElement() ) + { + if( e->nodeName() == node.nodeName() ) + { + e->restoreState( node.toElement() ); + } + } + } + node = node.nextSibling(); + } + + emit dataChanged(); } -void FASTCALL effectChain::appendEffect( effect * _effect ) + +void effectChain::appendEffect( effect * _effect ) { engine::getMixer()->lock(); + _effect->m_enabledModel.setTrack( m_track ); + _effect->m_wetDryModel.setTrack( m_track ); + _effect->m_gateModel.setTrack( m_track ); + _effect->m_autoQuitModel.setTrack( m_track ); m_effects.append( _effect ); engine::getMixer()->unlock(); + emit dataChanged(); } -void FASTCALL effectChain::removeEffect( effect * _effect ) +void effectChain::removeEffect( effect * _effect ) { engine::getMixer()->lock(); m_effects.erase( qFind( m_effects.begin(), m_effects.end(), _effect ) ); @@ -70,12 +137,12 @@ void FASTCALL effectChain::removeEffect( effect * _effect ) -void FASTCALL effectChain::moveDown( effect * _effect ) +void effectChain::moveDown( effect * _effect ) { if( _effect != m_effects.last() ) { int i = 0; - for( effect_list_t::iterator it = m_effects.begin(); + for( effectList::iterator it = m_effects.begin(); it != m_effects.end(); it++, i++ ) { if( *it == _effect ) @@ -93,12 +160,12 @@ void FASTCALL effectChain::moveDown( effect * _effect ) -void FASTCALL effectChain::moveUp( effect * _effect ) +void effectChain::moveUp( effect * _effect ) { if( _effect != m_effects.first() ) { int i = 0; - for( effect_list_t::iterator it = m_effects.begin(); + for( effectList::iterator it = m_effects.begin(); it != m_effects.end(); it++, i++ ) { if( *it == _effect ) @@ -116,7 +183,7 @@ void FASTCALL effectChain::moveUp( effect * _effect ) -bool FASTCALL effectChain::processAudioBuffer( surroundSampleFrame * _buf, +bool effectChain::processAudioBuffer( surroundSampleFrame * _buf, const fpp_t _frames ) { if( m_enabledModel.value() == FALSE ) @@ -124,7 +191,7 @@ bool FASTCALL effectChain::processAudioBuffer( surroundSampleFrame * _buf, return( FALSE ); } bool more_effects = FALSE; - for( effect_list_t::iterator it = m_effects.begin(); + for( effectList::iterator it = m_effects.begin(); it != m_effects.end(); it++ ) { more_effects |= ( *it )->processAudioBuffer( _buf, _frames ); @@ -142,7 +209,7 @@ void effectChain::startRunning( void ) return; } - for( effect_list_t::iterator it = m_effects.begin(); + for( effectList::iterator it = m_effects.begin(); it != m_effects.end(); it++ ) { ( *it )->startRunning(); @@ -161,7 +228,7 @@ bool effectChain::isRunning( void ) bool running = FALSE; - for( effect_list_t::iterator it = m_effects.begin(); + for( effectList::iterator it = m_effects.begin(); it != m_effects.end() || !running; it++ ) { running = ( *it )->isRunning() && running; @@ -170,4 +237,16 @@ bool effectChain::isRunning( void ) } + + +void effectChain::deleteAllPlugins( void ) +{ + for( int i = 0; i < m_effects.count(); ++i ) + { + delete m_effects[i]; + } + m_effects.clear(); +} + + #endif diff --git a/src/core/effect_control_dialog.cpp b/src/core/effect_control_dialog.cpp index 42f17f664..175844ee4 100644 --- a/src/core/effect_control_dialog.cpp +++ b/src/core/effect_control_dialog.cpp @@ -35,6 +35,7 @@ effectControlDialog::effectControlDialog( QWidget * _parent, effect * _eff ) : QWidget( _parent ), + modelView( _eff ), m_effect( _eff ) { setWindowTitle( m_effect->publicName() ); diff --git a/src/core/effect_select_dialog.cpp b/src/core/effect_select_dialog.cpp index 3c058fee6..5d716d2b0 100644 --- a/src/core/effect_select_dialog.cpp +++ b/src/core/effect_select_dialog.cpp @@ -47,7 +47,7 @@ effectSelectDialog::effectSelectDialog( QWidget * _parent ) : vlayout->setSpacing( 10 ); vlayout->setMargin( 10 ); - effectList * elist = new effectList( this ); + effectListWidget * elist = new effectListWidget( this ); elist->setMinimumSize( 500, 400 ); connect( elist, SIGNAL( doubleClicked( const effectKey & ) ), this, SLOT( selectPlugin() ) ); @@ -107,11 +107,12 @@ effectSelectDialog::~effectSelectDialog() -effect * effectSelectDialog::instantiateSelectedPlugin( void ) +effect * effectSelectDialog::instantiateSelectedPlugin( effectChain * _parent ) { if( !m_currentSelection.name.isEmpty() && m_currentSelection.desc ) { return( effect::instantiate( m_currentSelection.desc->name, + _parent, &m_currentSelection ) ); } return( NULL ); @@ -148,7 +149,7 @@ void effectSelectDialog::selectPlugin( void ) -effectList::effectList( QWidget * _parent ) : +effectListWidget::effectListWidget( QWidget * _parent ) : QWidget( _parent ), m_descriptionWidget( NULL ) { @@ -226,14 +227,14 @@ effectList::effectList( QWidget * _parent ) : -effectList::~effectList() +effectListWidget::~effectListWidget() { } -void effectList::rowChanged( int _pluginIndex ) +void effectListWidget::rowChanged( int _pluginIndex ) { delete m_descriptionWidget; m_descriptionWidget = NULL; @@ -268,7 +269,7 @@ void effectList::rowChanged( int _pluginIndex ) -void effectList::onDoubleClicked( QListWidgetItem * _item ) +void effectListWidget::onDoubleClicked( QListWidgetItem * _item ) { emit( doubleClicked( m_currentSelection ) ); } @@ -276,7 +277,7 @@ void effectList::onDoubleClicked( QListWidgetItem * _item ) -void effectList::onAddButtonReleased() +void effectListWidget::onAddButtonReleased() { emit( addPlugin( m_currentSelection ) ); } @@ -284,7 +285,7 @@ void effectList::onAddButtonReleased() -void effectList::resizeEvent( QResizeEvent * ) +void effectListWidget::resizeEvent( QResizeEvent * ) { //m_descriptionWidget->setFixedWidth( width() - 40 ); } diff --git a/src/core/effect_tab_widget.cpp b/src/core/effect_tab_widget.cpp deleted file mode 100644 index f6ef459d7..000000000 --- a/src/core/effect_tab_widget.cpp +++ /dev/null @@ -1,154 +0,0 @@ -#ifndef SINGLE_SOURCE_COMPILE - -/* - * effect_tab_widget.cpp - tab-widget in channel-track-window for setting up - * effects - * - * Copyright (c) 2006-2008 Danny McRae - * - * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net - * - * 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. - * - */ - - -#include "effect_tab_widget.h" - - -#include -#include - - -#include "audio_port.h" -#include "effect_select_dialog.h" -#include "embed.h" -#include "group_box.h" -#include "instrument_track.h" -#include "rack_plugin.h" -#include "rack_view.h" -#include "sample_track.h" -#include "tooltip.h" -#include "automatable_model_templates.h" - - - -effectTabWidget::effectTabWidget( instrumentTrack * _track, - audioPort * _port ) : - QWidget( _track->tabWidgetParent() ), - m_track( dynamic_cast( _track ) ), - m_port( _port ) -{ - m_port->getEffects()->m_enabledModel.setTrack( m_track ); - setupWidget(); -} - - - - -effectTabWidget::effectTabWidget( QWidget * _parent, - sampleTrack * _track, - audioPort * _port ) : - QWidget( _parent ), - m_track( dynamic_cast( _track ) ), - m_port( _port ) -{ - m_port->getEffects()->m_enabledModel.setTrack( m_track ); - setupWidget(); -} - - - - -effectTabWidget::~effectTabWidget() -{ -} - - - - -void effectTabWidget::setupWidget( void ) -{ - m_effectsGroupBox = new groupBox( tr( "EFFECTS CHAIN" ), this ); - m_effectsGroupBox->setModel( &m_port->getEffects()->m_enabledModel ); - m_effectsGroupBox->setGeometry( 2, 2, 242, 244 ); - - m_rack = new rackView( m_effectsGroupBox, m_track, m_port ); - m_rack->move( 6, 22 ); - - m_addButton = new QPushButton( m_effectsGroupBox/*, "Add Effect"*/ ); - m_addButton->setText( tr( "Add" ) ); - m_addButton->move( 75, 210 ); - connect( m_addButton, SIGNAL( clicked( void ) ), - this, SLOT( addEffect( void ) ) ); -} - - - - -void effectTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) -{ - _this.setAttribute( "fxenabled", - m_port->getEffects()->m_enabledModel.value() ); - m_rack->saveState( _doc, _this ); - -} - - - - -void effectTabWidget::loadSettings( const QDomElement & _this ) -{ - m_port->getEffects()->m_enabledModel.setValue( - _this.attribute( "fxenabled" ).toInt() ); - - QDomNode node = _this.firstChild(); - while( !node.isNull() ) - { - if( node.isElement() ) - { - if( m_rack->nodeName() == node.nodeName() ) - { - m_rack->restoreState( node.toElement() ); - } - } - node = node.nextSibling(); - } -} - - - - -void effectTabWidget::addEffect( void ) -{ - effectSelectDialog esd( this ); - esd.exec(); - - if( esd.result() == QDialog::Rejected ) - { - return; - } - - effect * e = esd.instantiateSelectedPlugin(); - m_rack->addEffect( e ); -} - - - - -#include "effect_tab_widget.moc" - -#endif diff --git a/src/core/import_filter.cpp b/src/core/import_filter.cpp index c97c9b853..ed23273ca 100644 --- a/src/core/import_filter.cpp +++ b/src/core/import_filter.cpp @@ -36,7 +36,7 @@ importFilter::importFilter( const QString & _file_name, const descriptor * _descriptor ) : - plugin( _descriptor ), + plugin( _descriptor, NULL ), m_file( _file_name ) { } @@ -70,7 +70,7 @@ void importFilter::import( const QString & _file_to_import, { if( it->type == plugin::ImportFilter ) { - plugin * p = plugin::instantiate( it->name, s ); + plugin * p = plugin::instantiate( it->name, NULL, s ); if( dynamic_cast( p ) != NULL && dynamic_cast( p )->tryImport( _tc ) == TRUE ) diff --git a/src/core/instrument.cpp b/src/core/instrument.cpp index 48c0312eb..aedb4fb9d 100644 --- a/src/core/instrument.cpp +++ b/src/core/instrument.cpp @@ -26,6 +26,7 @@ #include "instrument.h" +#include "instrument_view.h" #include "automatable_model_templates.h" #include "instrument_track.h" #include "dummy_instrument.h" @@ -34,8 +35,7 @@ instrument::instrument( instrumentTrack * _instrument_track, const descriptor * _descriptor ) : - plugin( _descriptor ), - model( /* _instrument_track */ NULL ), + plugin( _descriptor, NULL/* _instrument_track*/ ), m_instrumentTrack( _instrument_track ) { } @@ -82,7 +82,8 @@ f_cnt_t instrument::beatLen( notePlayHandle * ) const instrument * instrument::instantiate( const QString & _plugin_name, instrumentTrack * _instrument_track ) { - plugin * p = plugin::instantiate( _plugin_name, _instrument_track ); + plugin * p = plugin::instantiate( _plugin_name, /*_instrument_track*/ NULL, + _instrument_track ); // check whether instantiated plugin is an instrument if( dynamic_cast( p ) != NULL ) { @@ -105,16 +106,6 @@ bool instrument::isFromTrack( const track * _track ) const -instrumentView * instrument::createEditor( QWidget * _parent ) -{ - instrumentView * i = createView( _parent ); - i->setModel( this ); - return( i ); -} - - - - void instrument::applyRelease( sampleFrame * buf, const notePlayHandle * _n ) { const fpp_t frames = _n->framesLeftForCurrentPeriod(); @@ -144,8 +135,7 @@ void instrument::applyRelease( sampleFrame * buf, const notePlayHandle * _n ) instrumentView::instrumentView( instrument * _instrument, QWidget * _parent ) : - QWidget( _parent ), - modelView() + pluginView( _instrument, _parent ) { setModel( _instrument ); setFixedSize( 250, 250 ); diff --git a/src/core/main_window.cpp b/src/core/main_window.cpp index f8ce51b99..443a34823 100644 --- a/src/core/main_window.cpp +++ b/src/core/main_window.cpp @@ -57,6 +57,7 @@ #include "side_bar.h" #include "config_mgr.h" #include "mixer.h" +#include "plugin_view.h" #include "project_notes.h" #include "setup_dialog.h" #include "audio_dummy.h" @@ -76,7 +77,7 @@ mainWindow::mainWindow( void ) : m_workspace( NULL ), m_templatesMenu( NULL ), m_recentlyOpenedProjectsMenu( NULL ), - m_tools_menu( NULL ), + m_toolsMenu( NULL ), m_modified( FALSE ) { setAttribute( Qt::WA_DeleteOnClose ); @@ -421,7 +422,7 @@ void mainWindow::finalize( void ) configManager::inst(), SLOT( exec() ) ); - m_tools_menu = new QMenu( this ); + m_toolsMenu = new QMenu( this ); QVector pluginDescriptors; plugin::getDescriptorsOfAvailPlugins( pluginDescriptors ); for( QVector::iterator it = @@ -430,14 +431,15 @@ void mainWindow::finalize( void ) { if( it->type == plugin::Tool ) { - m_tools_menu->addAction( *it->logo, it->public_name ); - m_tools.push_back( tool::instantiate( it->name ) ); + m_toolsMenu->addAction( *it->logo, it->public_name ); + m_tools.push_back( tool::instantiate( it->name, + /*this*/NULL )->createView( this ) ); } } - if( !m_tools_menu->isEmpty() ) + if( !m_toolsMenu->isEmpty() ) { - menuBar()->addMenu( m_tools_menu )->setText( tr( "&Tools" ) ); - connect( m_tools_menu, SIGNAL( triggered( QAction * ) ), + menuBar()->addMenu( m_toolsMenu )->setText( tr( "&Tools" ) ); + connect( m_toolsMenu, SIGNAL( triggered( QAction * ) ), this, SLOT( showTool( QAction * ) ) ); } @@ -954,13 +956,13 @@ void mainWindow::fillTemplatesMenu( void ) void mainWindow::showTool( QAction * _idx ) { - tool * t = m_tools[m_tools_menu->actions().indexOf( _idx )]; - t->show(); + pluginView * p = m_tools[m_toolsMenu->actions().indexOf( _idx )]; + p->show(); if( m_workspace ) { - t->parentWidget()->show(); + p->parentWidget()->show(); } - t->setFocus(); + p->setFocus(); } diff --git a/src/core/plugin.cpp b/src/core/plugin.cpp index ad4a863ff..aa8070432 100644 --- a/src/core/plugin.cpp +++ b/src/core/plugin.cpp @@ -53,7 +53,9 @@ static plugin::descriptor dummy_plugin_descriptor = -plugin::plugin( const descriptor * _descriptor ) : +plugin::plugin( const descriptor * _descriptor, model * _parent ) : + journallingObject(), + model( _parent ), m_descriptor( _descriptor ) { if( dummy_plugin_descriptor.logo == NULL ) @@ -92,7 +94,8 @@ QString plugin::getParameter( const QString & ) -plugin * plugin::instantiate( const QString & _plugin_name, void * _data ) +plugin * plugin::instantiate( const QString & _plugin_name, model * _parent, + void * _data ) { QLibrary plugin_lib( configManager::inst()->pluginDir() + _plugin_name ); @@ -118,7 +121,7 @@ plugin * plugin::instantiate( const QString & _plugin_name, void * _data ) QMessageBox::Default ); return( new dummyPlugin() ); } - plugin * inst = inst_hook( _data ); + plugin * inst = inst_hook( _parent, _data ); return( inst ); } @@ -175,5 +178,17 @@ void plugin::getDescriptorsOfAvailPlugins( QVector & _plugin_descs ) +pluginView * plugin::createView( QWidget * _parent ) +{ + pluginView * pv = instantiateView( _parent ); + if( pv != NULL ) + { + pv->setModel( this ); + } + return( pv ); +} + + + #endif diff --git a/src/core/sample_play_handle.cpp b/src/core/sample_play_handle.cpp index a1b3aa820..6e5bbdd8d 100644 --- a/src/core/sample_play_handle.cpp +++ b/src/core/sample_play_handle.cpp @@ -42,7 +42,7 @@ samplePlayHandle::samplePlayHandle( const QString & _sample_file ) : m_sampleBuffer( new sampleBuffer( _sample_file ) ), m_doneMayReturnTrue( TRUE ), m_frame( 0 ), - m_audioPort( new audioPort( "samplePlayHandle" ) ), + m_audioPort( new audioPort( "samplePlayHandle", NULL ) ), m_ownAudioPort( TRUE ), m_defaultVolumeModel( 1.0f, 0.0f, 4.0f, 0.001f/* this*/ ), m_volumeModel( &m_defaultVolumeModel ), @@ -59,7 +59,7 @@ samplePlayHandle::samplePlayHandle( sampleBuffer * _sample_buffer ) : m_sampleBuffer( sharedObject::ref( _sample_buffer ) ), m_doneMayReturnTrue( TRUE ), m_frame( 0 ), - m_audioPort( new audioPort( "samplePlayHandle" ) ), + m_audioPort( new audioPort( "samplePlayHandle", NULL ) ), m_ownAudioPort( TRUE ), m_defaultVolumeModel( 1.0f, 0.0f, 4.0f, 0.001f/* this*/ ), m_volumeModel( &m_defaultVolumeModel ), diff --git a/src/core/surround_area.cpp b/src/core/surround_area.cpp index b44ae48c5..303a4bf28 100644 --- a/src/core/surround_area.cpp +++ b/src/core/surround_area.cpp @@ -4,7 +4,7 @@ * surround_area.cpp - a widget for setting position of a channel + * calculation of volume for each speaker * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -50,10 +50,8 @@ QPixmap * surroundArea::s_backgroundArtwork = NULL; surroundArea::surroundArea( QWidget * _parent, const QString & _name ) : QWidget( _parent ), - modelView() + modelView( new surroundAreaModel( NULL, NULL, TRUE ) ) { - setModel( new surroundAreaModel( NULL, NULL, TRUE ) ); - if( s_backgroundArtwork == NULL ) { s_backgroundArtwork = new QPixmap( embed::getIconPixmap( diff --git a/src/core/tool.cpp b/src/core/tool.cpp index c755a75f6..eaf6ce80a 100644 --- a/src/core/tool.cpp +++ b/src/core/tool.cpp @@ -36,23 +36,9 @@ -tool::tool( const descriptor * _descriptor ) : - plugin( _descriptor ) +tool::tool( const descriptor * _descriptor, model * _parent ) : + plugin( _descriptor, _parent ) { - QWidget * window; - if( engine::getMainWindow()->workspace() ) - { - engine::getMainWindow()->workspace()->addSubWindow( this ); - window = parentWidget(); - window->setAttribute( Qt::WA_DeleteOnClose, FALSE ); - } - else - { - window = this; - } - - window->setWindowTitle( _descriptor->public_name ); - window->setWindowIcon( *_descriptor->logo ); } @@ -65,11 +51,11 @@ tool::~tool() -tool * tool::instantiate( const QString & _plugin_name ) +tool * tool::instantiate( const QString & _plugin_name, model * _parent ) { - plugin * p = plugin::instantiate( _plugin_name, NULL ); - // check whether instantiated plugin is an instrument - if( dynamic_cast( p ) != NULL ) + plugin * p = plugin::instantiate( _plugin_name, _parent, NULL ); + // check whether instantiated plugin is a tool + if( p->type() == Tool ) { // everything ok, so return pointer return( dynamic_cast( p ) ); @@ -83,4 +69,25 @@ tool * tool::instantiate( const QString & _plugin_name ) + +toolView::toolView( tool * _tool, QWidget * _parent ) : + pluginView( _tool, _parent ) +{ + QWidget * window; + if( engine::getMainWindow()->workspace() ) + { + engine::getMainWindow()->workspace()->addSubWindow( this ); + window = parentWidget(); + window->setAttribute( Qt::WA_DeleteOnClose, FALSE ); + } + else + { + window = this; + } + + window->setWindowTitle( _tool->publicName() ); + window->setWindowIcon( *_tool->getDescriptor()->logo ); +} + + #endif diff --git a/src/tracks/instrument_track.cpp b/src/tracks/instrument_track.cpp index ca5a1344e..d2bb1c1f6 100644 --- a/src/tracks/instrument_track.cpp +++ b/src/tracks/instrument_track.cpp @@ -50,7 +50,7 @@ #include "debug.h" #include "effect_board.h" #include "effect_chain.h" -#include "effect_tab_widget.h" +#include "effect_rack_view.h" #include "embed.h" #include "engine.h" #include "envelope_tab_widget.h" @@ -66,6 +66,7 @@ #include "note_play_handle.h" #include "pattern.h" #include "piano_widget.h" +#include "plugin_view.h" #include "sample_play_handle.h" #include "song_editor.h" #include "string_pair_drag.h" @@ -100,7 +101,7 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : m_trackType( INSTRUMENT_TRACK ), m_midiPort( engine::getMixer()->getMIDIClient()->addPort( this, tr( "unnamed_channel" ) ) ), - m_audioPort( new audioPort( tr( "unnamed_channel" ) ) ), + m_audioPort( tr( "unnamed_channel" ), this ), m_notes(), m_baseNoteModel( 0, 0, NOTES_PER_OCTAVE * OCTAVES - 1, 1/* this */ ), m_volumeModel( DEFAULT_VOLUME, MIN_VOLUME, MAX_VOLUME, @@ -109,7 +110,9 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : m_effectChannelModel( DEFAULT_EFFECT_CHANNEL, MIN_EFFECT_CHANNEL, MAX_EFFECT_CHANNEL /* this */ ), +// m_effects( /* this */ NULL ), m_instrument( NULL ), + m_instrumentView( NULL ), m_midiInputAction( NULL ), m_midiOutputAction( NULL ) { @@ -248,10 +251,11 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : m_envWidget = new envelopeTabWidget( this ); m_arpWidget = new arpAndChordsTabWidget( this ); m_midiWidget = new midiTabWidget( this, m_midiPort ); - m_effWidget = new effectTabWidget( this, m_audioPort ); + m_effectRack = new effectRackView( m_audioPort.getEffects(), + m_tabWidget ); m_tabWidget->addTab( m_envWidget, tr( "ENV/LFO/FILTER" ), 1 ); m_tabWidget->addTab( m_arpWidget, tr( "ARP/CHORD" ), 2 ); - m_tabWidget->addTab( m_effWidget, tr( "FX" ), 3 ); + m_tabWidget->addTab( m_effectRack, tr( "FX" ), 3 ); m_tabWidget->addTab( m_midiWidget, tr( "MIDI" ), 4 ); // setup piano-widget @@ -323,8 +327,7 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : instrumentTrack::~instrumentTrack() { engine::getMixer()->removePlayHandles( this ); - delete m_effWidget; - delete m_audioPort; + delete m_effectRack; engine::getMixer()->getMIDIClient()->removePort( m_midiPort ); if( engine::getMainWindow()->workspace() ) @@ -450,7 +453,7 @@ void instrumentTrack::processAudioBuffer( sampleFrame * _buf, } float v_scale = (float) getVolume() / DEFAULT_VOLUME; - m_audioPort->getEffects()->startRunning(); + m_audioPort.getEffects()->startRunning(); // instruments using instrument-play-handles will call this method // without any knowledge about notes, so they pass NULL for _n, which @@ -465,7 +468,7 @@ void instrumentTrack::processAudioBuffer( sampleFrame * _buf, engine::getMixer()->bufferToPort( _buf, ( _n != NULL ) ? tMin( _n->framesLeftForCurrentPeriod(), _frames ) : _frames, - ( _n != NULL ) ? _n->offset() : 0, v, m_audioPort ); + ( _n != NULL ) ? _n->offset() : 0, v, &m_audioPort ); } @@ -664,7 +667,7 @@ void instrumentTrack::playNote( notePlayHandle * _n, bool _try_parallelizing ) // in last period and have // to clear parts of it _n->noteOff(); - engine::getMixer()->clearAudioBuffer( m_audioPort->firstBuffer(), + engine::getMixer()->clearAudioBuffer( m_audioPort.firstBuffer(), engine::getMixer()->framesPerPeriod() - ( *youngest_note )->offset(), ( *youngest_note )->offset() ); @@ -749,7 +752,7 @@ void instrumentTrack::setName( const QString & _new_name ) #endif m_tswInstrumentTrackButton->setText( m_name ); m_midiPort->setName( m_name ); - m_audioPort->setName( m_name ); + m_audioPort.setName( m_name ); } @@ -969,7 +972,7 @@ void instrumentTrack::saveTrackSpecificSettings( QDomDocument & _doc, m_envWidget->saveState( _doc, _this ); m_arpWidget->saveState( _doc, _this ); m_midiWidget->saveState( _doc, _this ); - m_effWidget->saveState( _doc, _this ); + m_audioPort.getEffects()->saveState( _doc, _this ); } @@ -990,7 +993,8 @@ void instrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) if( _this.hasAttribute( "baseoct" ) ) { // TODO: move this compat code to mmp.cpp -> upgrade() - m_baseNoteModel.setInitValue( _this.attribute( "baseoct" ).toInt() + m_baseNoteModel.setInitValue( _this. + attribute( "baseoct" ).toInt() * NOTES_PER_OCTAVE + _this.attribute( "basetone" ).toInt() ); } @@ -1020,9 +1024,11 @@ void instrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) { m_midiWidget->restoreState( node.toElement() ); } - else if( m_effWidget->nodeName() == node.nodeName() ) + else if( m_audioPort.getEffects()->nodeName() == + node.nodeName() ) { - m_effWidget->restoreState( node.toElement() ); + m_audioPort.getEffects()->restoreState( + node.toElement() ); had_fx = TRUE; } else if( automationPattern::classNodeName() @@ -1031,6 +1037,7 @@ void instrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) // if node-name doesn't match any known one, // we assume that it is an instrument-plugin // which we'll try to load + delete m_instrumentView; delete m_instrument; m_instrument = instrument::instantiate( node.nodeName(), this ); @@ -1040,16 +1047,18 @@ void instrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) m_instrument->restoreState( node.toElement() ); } - m_tabWidget->addTab( m_instrument-> - createEditor( m_tabWidget ), + m_instrumentView = m_instrument-> + createView( m_tabWidget ); + m_tabWidget->addTab( m_instrumentView, tr( "PLUGIN" ), 0 ); } } node = node.nextSibling(); } + // TODO: why not move above without any condition?? if( !had_fx ) { - m_effWidget->deleteAllEffects(); + m_audioPort.getEffects()->deleteAllPlugins(); } engine::getMixer()->unlock(); @@ -1072,12 +1081,13 @@ instrument * instrumentTrack::loadInstrument( const QString & _plugin_name ) invalidateAllMyNPH(); engine::getMixer()->lock(); + delete m_instrumentView; delete m_instrument; m_instrument = instrument::instantiate( _plugin_name, this ); engine::getMixer()->unlock(); - m_tabWidget->addTab( m_instrument->createEditor( m_tabWidget ), - tr( "PLUGIN" ), 0 ); + m_instrumentView = m_instrument->createView( m_tabWidget ); + m_tabWidget->addTab( m_instrumentView, tr( "PLUGIN" ), 0 ); m_tabWidget->setActiveTab( 0 ); m_tswInstrumentTrackButton->update(); diff --git a/src/tracks/sample_track.cpp b/src/tracks/sample_track.cpp index 41f2606e6..204c99f4f 100644 --- a/src/tracks/sample_track.cpp +++ b/src/tracks/sample_track.cpp @@ -330,7 +330,7 @@ void sampleTCOSettingsDialog::setSampleFile( const QString & _f ) sampleTrack::sampleTrack( trackContainer * _tc ) : track( _tc ), - m_audioPort( new audioPort( tr( "Sample track" ) ) ), + m_audioPort( tr( "Sample track" ), this ), m_volumeModel( DEFAULT_VOLUME, MIN_VOLUME, MAX_VOLUME, 1/*, this*/ ) { m_volumeModel.setTrack( this ); @@ -372,7 +372,6 @@ sampleTrack::~sampleTrack() } engine::getMixer()->removePlayHandles( this ); - delete m_audioPort; } @@ -393,7 +392,7 @@ bool FASTCALL sampleTrack::play( const midiTime & _start, { sendMidiTime( _start ); - m_audioPort->getEffects()->startRunning(); + m_audioPort.getEffects()->startRunning(); bool played_a_note = FALSE; // will be return variable for( int i = 0; i < numOfTCOs(); ++i ) @@ -436,7 +435,7 @@ void sampleTrack::saveTrackSpecificSettings( QDomDocument & _doc, QDomElement & _this ) { _this.setAttribute( "name", m_trackLabel->text() ); - m_trackLabel->saveState( _doc, _this ); + m_audioPort.getEffects()->saveState( _doc, _this ); #if 0 _this.setAttribute( "icon", m_trackLabel->pixmapFile() ); #endif @@ -454,9 +453,11 @@ void sampleTrack::loadTrackSpecificSettings( const QDomElement & _this ) { if( node.isElement() ) { - if( m_trackLabel->nodeName() == node.nodeName() ) + if( m_audioPort.getEffects()->nodeName() == + node.nodeName() ) { - m_trackLabel->restoreState( node.toElement() ); + m_audioPort.getEffects()->restoreState( + node.toElement() ); } } node = node.nextSibling(); diff --git a/src/widgets/automatable_button.cpp b/src/widgets/automatable_button.cpp index 98c77816c..7b04d089d 100644 --- a/src/widgets/automatable_button.cpp +++ b/src/widgets/automatable_button.cpp @@ -41,10 +41,10 @@ automatableButton::automatableButton( QWidget * _parent, const QString & _name ) : QPushButton( _parent ), - autoModelView(), + autoModelView( new autoModel( FALSE, FALSE, TRUE, + autoModel::defaultRelStep(), NULL, TRUE ) ), m_group( NULL ) { - setModel( new autoModel( FALSE, FALSE, TRUE, 1, NULL, TRUE ) ); setAccessibleName( _name ); } @@ -165,9 +165,8 @@ void automatableButton::toggle( void ) automatableButtonGroup::automatableButtonGroup( QWidget * _parent, const QString & _name ) : QWidget( _parent ), - autoModelView() + autoModelView( new autoModel( 0, 0, 0, 1, NULL, TRUE ) ) { - setModel( new autoModel( 0, 0, 0, 1, NULL, TRUE ) ); hide(); setAccessibleName( _name ); } diff --git a/src/widgets/automatable_slider.cpp b/src/widgets/automatable_slider.cpp index e17bcb072..b98dfcf8d 100644 --- a/src/widgets/automatable_slider.cpp +++ b/src/widgets/automatable_slider.cpp @@ -4,7 +4,7 @@ * automatable_slider.cpp - implementation of class automatableSlider * * Copyright (c) 2006-2007 Javier Serrano Polo - * Copyright (c) 2007 Tobias Doerffel + * Copyright (c) 2007-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -41,10 +41,9 @@ automatableSlider::automatableSlider( QWidget * _parent, const QString & _name ) : QSlider( _parent ), - autoModelView(), + autoModelView( new autoModel( 0, 0, 0, 1, NULL, TRUE ) ), m_showStatus( FALSE ) { - setModel( new autoModel( 0, 0, 0, 1, NULL, TRUE ) ); setAccessibleName( _name ); connect( this, SIGNAL( valueChanged( int ) ), diff --git a/src/widgets/combobox.cpp b/src/widgets/combobox.cpp index 3400d3641..dadf702de 100644 --- a/src/widgets/combobox.cpp +++ b/src/widgets/combobox.cpp @@ -47,11 +47,10 @@ const int CB_ARROW_BTN_WIDTH = 20; comboBox::comboBox( QWidget * _parent, const QString & _name ) : QWidget( _parent ), - autoModelView(), + autoModelView( new comboBoxModel ), m_menu( this ), m_pressed( FALSE ) { - setModel( new comboBoxModel ); if( s_background == NULL ) { s_background = new QPixmap( embed::getIconPixmap( diff --git a/src/widgets/effect_label.cpp b/src/widgets/effect_label.cpp index ce7a19e03..17d574b2e 100644 --- a/src/widgets/effect_label.cpp +++ b/src/widgets/effect_label.cpp @@ -5,6 +5,7 @@ * offers access to an effect rack * * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -29,12 +30,13 @@ #include "effect_label.h" #include +#include #include #include #include #include -#include "effect_tab_widget.h" +#include "effect_rack_view.h" #include "embed.h" #include "engine.h" #include "gui_templates.h" @@ -55,33 +57,33 @@ effectLabel::effectLabel( const QString & _initial_name, QWidget * _parent, m_effectBtn->setGeometry( 6, 1, 28, 28 ); connect( m_effectBtn, SIGNAL( clicked() ), this, SLOT( showEffects() ) ); - + m_label = new QLabel( this ); m_label->setText( _initial_name ); QFont f = m_label->font(); m_label->setFont( pointSize<8>( f ) ); m_label->setGeometry( 38, 1, 200, 28 ); - - m_effWidget = new effectTabWidget( engine::getMainWindow()->workspace(), - m_track, - m_track->getAudioPort() ); + + m_effectRack = new effectRackView( + m_track->getAudioPort()->getEffects(), + engine::getMainWindow()->workspace() ); if( engine::getMainWindow()->workspace() ) { engine::getMainWindow()->workspace()->addSubWindow( - m_effWidget ); - m_effWindow = m_effWidget->parentWidget(); + m_effectRack ); + m_effWindow = m_effectRack->parentWidget(); m_effWindow->setAttribute( Qt::WA_DeleteOnClose, FALSE ); m_effWindow->layout()->setSizeConstraint( QLayout::SetFixedSize ); } else { - m_effWindow = m_effWidget; + m_effWindow = m_effectRack; } m_effWindow->setWindowTitle( _initial_name ); - m_effWidget->setFixedSize( 240, 242 ); + m_effectRack->setFixedSize( 240, 242 ); m_effWindow->hide(); } @@ -104,7 +106,7 @@ QString effectLabel::text( void ) const -void FASTCALL effectLabel::setText( const QString & _text ) +void effectLabel::setText( const QString & _text ) { m_label->setText( _text ); m_effWindow->setWindowTitle( _text ); @@ -117,8 +119,8 @@ void effectLabel::showEffects( void ) { if( m_effWindow->isHidden() ) { - m_effWidget->show(); - if( m_effWindow != m_effWidget ) + m_effectRack->show(); + if( m_effWindow != m_effectRack ) { m_effWindow->show(); } @@ -133,36 +135,6 @@ void effectLabel::showEffects( void ) -void effectLabel::saveSettings( QDomDocument & _doc, QDomElement & _this ) -{ -// _this.setAttribute( "name", m_label->text() ); - m_effWidget->saveState( _doc, _this ); - -} - - - - -void effectLabel::loadSettings( const QDomElement & _this ) -{ -// m_label->setText( _this.attribute( "name" ) ); - - QDomNode node = _this.firstChild(); - while( !node.isNull() ) - { - if( node.isElement() ) - { - if( m_effWidget->nodeName() == node.nodeName() ) - { - m_effWidget->restoreState( node.toElement() ); - } - } - node = node.nextSibling(); - } -} - - - void effectLabel::rename( void ) { diff --git a/src/widgets/effect_rack_view.cpp b/src/widgets/effect_rack_view.cpp index 39ab64f7e..bbf4d6feb 100644 --- a/src/widgets/effect_rack_view.cpp +++ b/src/widgets/effect_rack_view.cpp @@ -1,9 +1,10 @@ #ifndef SINGLE_SOURCE_COMPILE /* - * rack_view.cpp - provides the display for the rackInsert instances + * effect_rack_view.cpp - view for effectChain-model * * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -26,218 +27,239 @@ #include +#include +#include +#include +#include -#include "rack_view.h" -#include "audio_port.h" -#include "rack_plugin.h" +#include "effect_rack_view.h" +#include "effect_select_dialog.h" +#include "effect_view.h" +#include "group_box.h" -rackView::rackView( QWidget * _parent, track * _track, audioPort * _port ) : +effectRackView::effectRackView( effectChain * _model, QWidget * _parent ) : QWidget( _parent ), - m_track( _track ), - m_port( _port ) + modelView( NULL ) { setFixedSize( 230, 184 ); - m_mainLayout = new QVBoxLayout( this ); +/* m_mainLayout = new QVBoxLayout( this ); m_mainLayout->setMargin( 0 ); - m_mainLayout->setSpacing( 0 ); - m_scrollArea = new QScrollArea( this ); + m_mainLayout->setSpacing( 0 );*/ + + m_effectsGroupBox = new groupBox( tr( "EFFECTS CHAIN" ), this ); + m_effectsGroupBox->setGeometry( 2, 2, 242, 244 ); + + m_scrollArea = new QScrollArea( m_effectsGroupBox ); m_scrollArea->setFixedSize( 230, 184 ); m_scrollArea->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOn ); m_scrollArea->setPalette( QApplication::palette( m_scrollArea ) ); + m_scrollArea->move( 6, 22 ); + + m_addButton = new QPushButton( m_effectsGroupBox/*, "Add Effect"*/ ); + m_addButton->setText( tr( "Add" ) ); + m_addButton->move( 75, 210 ); + connect( m_addButton, SIGNAL( clicked( void ) ), + this, SLOT( addEffect( void ) ) ); - m_mainLayout->addWidget( m_scrollArea ); + //m_mainLayout->addWidget( m_scrollArea ); + + QWidget * w = new QWidget; + m_scrollArea->setWidget( w ); + w->show(); m_lastY = 0; + + setModel( _model ); } -rackView::~rackView() +effectRackView::~effectRackView() { - deleteAllPlugins(); + //deleteAllPlugins(); } -void rackView::addEffect( effect * _e ) +/* +void effectRackView::deleteAllPlugins( void ) { - if( !m_scrollArea->widget() ) - { - QWidget * w = new QWidget; - m_scrollArea->setWidget( w ); - w->show(); - } - QWidget * w = m_scrollArea->widget(); - rackPlugin * plugin = new rackPlugin( w, _e, m_track, m_port ); - connect( plugin, SIGNAL( moveUp( rackPlugin * ) ), - this, SLOT( moveUp( rackPlugin * ) ) ); - connect( plugin, SIGNAL( moveDown( rackPlugin * ) ), - this, SLOT( moveDown( rackPlugin * ) ) ); - connect( plugin, SIGNAL( deletePlugin( rackPlugin * ) ), - this, SLOT( deletePlugin( rackPlugin * ) ) ); - plugin->move( 0, m_lastY ); - plugin->show(); - m_lastY += plugin->height(); - m_scrollArea->widget()->setFixedSize( 210, m_lastY ); - m_rackInserts.append( plugin ); -} - - - - -void FASTCALL rackView::saveSettings( QDomDocument & _doc, - QDomElement & _this ) -{ - _this.setAttribute( "numofeffects", m_rackInserts.count() ); - for( QVector::iterator it = m_rackInserts.begin(); - it != m_rackInserts.end(); it++ ) - { - QDomElement ef = ( *it )->saveState( _doc, _this ); - ef.setAttribute( "name", - ( *it )->getEffect()->getDescriptor()->name ); - ef.setAttribute( "key", - ( *it )->getEffect()->getKey().dumpBase64() ); - } -} - - - - -void FASTCALL rackView::loadSettings( const QDomElement & _this ) -{ - deleteAllPlugins(); - - const int plugin_cnt = _this.attribute( "numofeffects" ).toInt(); - - QDomNode node = _this.firstChild(); - for( int i = 0; i < plugin_cnt; i++ ) - { - if( node.isElement() && node.nodeName() == "effect" ) - { - QDomElement cn = node.toElement(); - const QString name = cn.attribute( "name" ); - // we have this really convenient key-ctor - // which takes a QString and decodes the - // base64-data inside :-) - effectKey key( cn.attribute( "key" ) ); - addEffect( effect::instantiate( name, &key ) ); - // TODO: somehow detect if effect is sub-plugin-capable - // but couldn't load sub-plugin with requsted key - if( node.isElement() ) - { - if( m_rackInserts.last()->nodeName() == - node.nodeName() ) - { - m_rackInserts.last()->restoreState( - node.toElement() ); - } - } - } - node = node.nextSibling(); - } - -} - - - - -void rackView::deleteAllPlugins( void ) -{ - for( QVector::iterator it = m_rackInserts.begin(); - it != m_rackInserts.end(); ++it ) + for( QVector::iterator it = m_effectViews.begin(); + it != m_effectViews.end(); ++it ) { delete *it; } - m_rackInserts.clear(); + m_effectViews.clear(); } +*/ - -void rackView::moveUp( rackPlugin * _plugin ) +void effectRackView::moveUp( effectView * _view ) { - if( _plugin != m_rackInserts.first() ) + fxChain()->moveUp( _view->getEffect() ); + if( _view != m_effectViews.first() ) { int i = 0; - for( QVector::iterator it = - m_rackInserts.begin(); - it != m_rackInserts.end(); it++, i++ ) + for( QVector::iterator it = + m_effectViews.begin(); + it != m_effectViews.end(); it++, i++ ) { - if( *it == _plugin ) + if( *it == _view ) { break; } } - rackPlugin * temp = m_rackInserts[ i - 1 ]; + effectView * temp = m_effectViews[ i - 1 ]; - m_rackInserts[i - 1] = _plugin; - m_rackInserts[i] = temp; + m_effectViews[i - 1] = _view; + m_effectViews[i] = temp; - redraw(); + updateView(); } } -void rackView::moveDown( rackPlugin * _plugin ) +void effectRackView::moveDown( effectView * _view ) { - m_port->getEffects()->moveDown( _plugin->getEffect() ); - if( _plugin != m_rackInserts.last() ) + if( _view != m_effectViews.last() ) + { + // moving next effect up is the same + moveUp( *( qFind( m_effectViews.begin(), m_effectViews.end(), + _view ) + 1 ) ); + } +/* + fxChain()->moveDown( _view->getEffect() ); + if( _view != m_effectViews.last() ) { int i = 0; - for( QVector::iterator it = - m_rackInserts.begin(); - it != m_rackInserts.end(); it++, i++ ) + for( QVector::iterator it = + m_effectViews.begin(); + it != m_effectViews.end(); it++, i++ ) { - if( *it == _plugin ) + if( *it == _view ) { break; } } - rackPlugin * temp = m_rackInserts.at( i + 1 ); + effectView * temp = m_effectViews.at( i + 1 ); - m_rackInserts[i + 1] = _plugin; - m_rackInserts[i] = temp; + m_effectViews[i + 1] = _view; + m_effectViews[i] = temp; redraw(); - } + }*/ } -void rackView::deletePlugin( rackPlugin * _plugin ) +void effectRackView::deletePlugin( effectView * _view ) { - m_rackInserts.erase( qFind( m_rackInserts.begin(), m_rackInserts.end(), - _plugin ) ); - delete _plugin; - redraw(); + effect * e = _view->getEffect(); + m_effectViews.erase( qFind( m_effectViews.begin(), m_effectViews.end(), + _view ) ); + delete _view; + fxChain()->m_effects.erase( qFind( fxChain()->m_effects.begin(), + fxChain()->m_effects.end(), + e ) ); + delete e; + updateView(); } -void rackView::redraw() +void effectRackView::updateView( void ) { - m_lastY = 0; - for( QVector::iterator it = m_rackInserts.begin(); - it != m_rackInserts.end(); it++ ) + QWidget * w = m_scrollArea->widget(); + QVector view_map( fxChain()->m_effects.size(), FALSE ); + + for( QVector::iterator it = fxChain()->m_effects.begin(); + it != fxChain()->m_effects.end(); ++it ) { - ( *it )->move( 0, m_lastY ); - m_lastY += ( *it )->height(); + int i = 0; + for( QVector::iterator vit = + m_effectViews.begin(); + vit != m_effectViews.end(); ++vit, ++i ) + { + if( ( *vit )->getEffect() == *it ) + { + view_map[i] = TRUE; + break; + } + } + if( i >= m_effectViews.size() ) + { + effectView * view = new effectView( *it, w ); + connect( view, SIGNAL( moveUp( effectView * ) ), + this, SLOT( moveUp( effectView * ) ) ); + connect( view, SIGNAL( moveDown( effectView * ) ), + this, SLOT( moveDown( effectView * ) ) ); + connect( view, SIGNAL( deletePlugin( effectView * ) ), + this, SLOT( deletePlugin( effectView * ) ) ); + view->show(); + m_effectViews.append( view ); + view_map[i] = TRUE; + + } } - m_scrollArea->widget()->setFixedSize( 210, m_lastY ); -} + + int i = m_lastY = 0; + for( QVector::iterator it = m_effectViews.begin(); + it != m_effectViews.end(); ) + { + if( i < view_map.size() && view_map[i] == FALSE ) + { + delete m_effectViews[i]; + m_effectViews.erase( it ); + } + else + { + ( *it )->move( 0, m_lastY ); + m_lastY += ( *it )->height(); + ++it; + ++i; + } + } + w->setFixedSize( 210, m_lastY ); +} -#include "rack_view.moc" +void effectRackView::addEffect( void ) +{ + effectSelectDialog esd( this ); + esd.exec(); + + if( esd.result() == QDialog::Rejected ) + { + return; + } + + fxChain()->appendEffect( esd.instantiateSelectedPlugin( fxChain() ) ); + updateView(); +} + + + + +void effectRackView::modelChanged( void ) +{ + m_effectsGroupBox->setModel( &fxChain()->m_enabledModel ); + updateView(); +} + + + +#include "effect_rack_view.moc" #endif diff --git a/src/widgets/effect_view.cpp b/src/widgets/effect_view.cpp index ab7ad8c4f..50977e600 100644 --- a/src/widgets/effect_view.cpp +++ b/src/widgets/effect_view.cpp @@ -1,10 +1,10 @@ #ifndef SINGLE_SOURCE_COMPILE /* - * effect_tab_widget.cpp - tab-widget in channel-track-window for setting up - * effects + * effect_view.cpp - view-component for an effect * * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2007-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -26,7 +26,7 @@ */ -#include "rack_plugin.h" +#include "effect_view.h" #include #include @@ -46,15 +46,8 @@ #include "tooltip.h" -rackPlugin::rackPlugin( QWidget * _parent, - effect * _eff, - track * _track, - audioPort * _port ) : - QWidget( _parent ), - m_autoQuitModel( 1.0f, 1.0f, 8000.0f, 100.0f /* this */ ), - m_effect( _eff ), - m_track( _track ), - m_port( _port ), +effectView::effectView( effect * _model, QWidget * _parent ) : + pluginView( _model, _parent ), m_show( TRUE ) { setFixedSize( 210, 60 ); @@ -66,18 +59,13 @@ rackPlugin::rackPlugin( QWidget * _parent, pal.setBrush( backgroundRole(), bg ); setPalette( pal ); - m_effect->m_enabledModel.setTrack( m_track ); - m_effect->m_enabledModel.setValue( TRUE ); m_bypass = new ledCheckBox( "", this, tr( "Turn the effect off" ) ); - m_bypass->setModel( &m_effect->m_enabledModel ); m_bypass->move( 3, 3 ); m_bypass->setWhatsThis( tr( "Toggles the effect on or off." ) ); toolTip::add( m_bypass, tr( "On/Off" ) ); - m_effect->m_wetDryModel.setTrack( m_track ); m_wetDry = new knob( knobBright_26, this, tr( "Wet/Dry mix" ) ); - m_wetDry->setModel( &m_effect->m_wetDryModel ); m_wetDry->setLabel( tr( "W/D" ) ); m_wetDry->move( 27, 5 ); m_wetDry->setHintText( tr( "Wet Level:" ) + " ", "" ); @@ -86,12 +74,7 @@ rackPlugin::rackPlugin( QWidget * _parent, "shows up in the output." ) ); - m_autoQuitModel.setTrack( m_track ); - m_autoQuitModel.setInitValue( 1.0f ); - connect( &m_autoQuitModel, SIGNAL( dataChanged( void ) ), - this, SLOT( updateAutoQuit( void ) ) ); m_autoQuit = new tempoSyncKnob( knobBright_26, this, tr( "Decay" ) ); - m_autoQuit->setModel( &m_autoQuitModel ); m_autoQuit->setLabel( tr( "Decay" ) ); m_autoQuit->move( 60, 5 ); m_autoQuit->setHintText( tr( "Time:" ) + " ", "ms" ); @@ -101,9 +84,7 @@ rackPlugin::rackPlugin( QWidget * _parent, "run the risk of clipping the tail on delay effects." ) ); - m_effect->m_gateModel.setTrack( m_track ); m_gate = new knob( knobBright_26, this, tr( "Gate" ) ); - m_gate->setModel( &m_effect->m_gateModel ); m_gate->setLabel( tr( "Gate" ) ); m_gate->move( 93, 5 ); m_gate->setHintText( tr( "Gate:" ) + " ", "" ); @@ -120,7 +101,7 @@ rackPlugin::rackPlugin( QWidget * _parent, this, SLOT( editControls() ) ); m_label = new QLabel( this ); - m_label->setText( m_effect->publicName() ); + m_label->setText( getEffect()->publicName() ); f = m_label->font(); f.setBold( TRUE ); m_label->setFont( pointSize<7>( f ) ); @@ -131,7 +112,7 @@ rackPlugin::rackPlugin( QWidget * _parent, bg.toImage().copy( 5, 44, 195, 10 ) ) ); m_label->setPalette( pal ); - m_controlView = m_effect->createControlDialog( m_track ); + m_controlView = getEffect()->createControlDialog( NULL ); m_subWindow = engine::getMainWindow()->workspace()->addSubWindow( m_controlView ); connect( m_controlView, SIGNAL( closed() ), @@ -173,23 +154,24 @@ rackPlugin::rackPlugin( QWidget * _parent, "Right clicking will bring up a context menu where you can change the order " "in which the effects are processed or delete an effect altogether." ) ); - m_port->getEffects()->appendEffect( m_effect ); +// m_port->getEffects()->appendEffect( m_effect ); + setModel( _model ); } -rackPlugin::~rackPlugin() +effectView::~effectView() { - m_port->getEffects()->removeEffect( m_effect ); - delete m_effect; +// m_port->getEffects()->removeEffect( m_effect ); +// delete m_effect; m_controlView->deleteLater(); } -void rackPlugin::editControls( void ) +void effectView::editControls( void ) { if( m_show ) { @@ -207,22 +189,10 @@ void rackPlugin::editControls( void ) -void rackPlugin::updateAutoQuit( void ) -{ - float samples = engine::getMixer()->sampleRate() * - m_autoQuitModel.value() / 1000.0f; - Uint32 buffers = 1 + ( static_cast( samples ) / - engine::getMixer()->framesPerPeriod() ); - m_effect->setTimeout( buffers ); -} - - - - -void rackPlugin::contextMenuEvent( QContextMenuEvent * ) +void effectView::contextMenuEvent( QContextMenuEvent * ) { QPointer contextMenu = new captionMenu( - m_effect->publicName() ); + getEffect()->publicName() ); contextMenu->addAction( embed::getIconPixmap( "arp_up_on" ), tr( "Move &up" ), this, SLOT( moveUp() ) ); @@ -244,7 +214,7 @@ void rackPlugin::contextMenuEvent( QContextMenuEvent * ) -void rackPlugin::moveUp() +void effectView::moveUp() { emit( moveUp( this ) ); } @@ -252,14 +222,14 @@ void rackPlugin::moveUp() -void rackPlugin::moveDown() +void effectView::moveDown() { emit( moveDown( this ) ); } -void rackPlugin::deletePlugin() +void effectView::deletePlugin() { emit( deletePlugin( this ) ); } @@ -267,7 +237,7 @@ void rackPlugin::deletePlugin() -void rackPlugin::displayHelp( void ) +void effectView::displayHelp( void ) { QWhatsThis::showText( mapToGlobal( rect().bottomRight() ), whatsThis() ); @@ -276,53 +246,22 @@ void rackPlugin::displayHelp( void ) -void FASTCALL rackPlugin::saveSettings( QDomDocument & _doc, - QDomElement & _this ) -{ - _this.setAttribute( "on", m_effect->m_enabledModel.value() ); - _this.setAttribute( "wet", m_effect->m_wetDryModel.value() ); - _this.setAttribute( "autoquit", m_autoQuitModel.value() ); - _this.setAttribute( "gate", m_effect->m_gateModel.value() ); - m_controlView->saveState( _doc, _this ); -} - - - - -void FASTCALL rackPlugin::loadSettings( const QDomElement & _this ) -{ - m_effect->m_enabledModel.setValue( _this.attribute( "on" ).toInt() ); - m_effect->m_wetDryModel.setValue( _this.attribute( "wet" ).toFloat() ); - m_autoQuitModel.setValue( _this.attribute( "autoquit" ).toFloat() ); - m_effect->m_gateModel.setValue( _this.attribute( "gate" ).toFloat() ); - - QDomNode node = _this.firstChild(); - while( !node.isNull() ) - { - if( node.isElement() ) - { - if( m_controlView->nodeName() == node.nodeName() ) - { - m_controlView->restoreState( - node.toElement() ); - } - } - node = node.nextSibling(); - } -} - - - - -void rackPlugin::closeEffects( void ) +void effectView::closeEffects( void ) { m_subWindow->hide(); m_show = TRUE; } +void effectView::modelChanged( void ) +{ + m_bypass->setModel( &getEffect()->m_enabledModel ); + m_wetDry->setModel( &getEffect()->m_wetDryModel ); + m_autoQuit->setModel( &getEffect()->m_autoQuitModel ); + m_gate->setModel( &getEffect()->m_gateModel ); +} -#include "rack_plugin.moc" +#include "effect_view.moc" #endif diff --git a/src/widgets/group_box.cpp b/src/widgets/group_box.cpp index 25c3a1e42..76c825490 100644 --- a/src/widgets/group_box.cpp +++ b/src/widgets/group_box.cpp @@ -49,7 +49,7 @@ QPixmap * groupBox::s_ledBg = NULL; groupBox::groupBox( const QString & _caption, QWidget * _parent ) : QWidget( _parent ), - autoModelView(), + autoModelView( NULL ), m_caption( _caption ) { if( s_ledBg == NULL ) diff --git a/src/widgets/knob.cpp b/src/widgets/knob.cpp index 88b6046a1..569a2145e 100644 --- a/src/widgets/knob.cpp +++ b/src/widgets/knob.cpp @@ -65,7 +65,7 @@ textFloat * knob::s_textFloat = NULL; knob::knob( int _knob_num, QWidget * _parent, const QString & _name ) : QWidget( _parent ), - autoModelView(), + autoModelView( new autoModel( 0, 0, 0, 1, NULL, TRUE ) ), m_mouseOffset( 0.0f ), m_buttonPressed( FALSE ), m_hintTextBeforeValue( "" ), @@ -73,8 +73,6 @@ knob::knob( int _knob_num, QWidget * _parent, const QString & _name ) : m_knobNum( _knob_num ), m_label( "" ) { - setModel( new autoModel( 0, 0, 0, 1, NULL, TRUE ) ); - if( s_textFloat == NULL ) { s_textFloat = new textFloat( this ); diff --git a/src/widgets/lcd_spinbox.cpp b/src/widgets/lcd_spinbox.cpp index 1fbd43446..6a8105909 100644 --- a/src/widgets/lcd_spinbox.cpp +++ b/src/widgets/lcd_spinbox.cpp @@ -41,7 +41,7 @@ lcdSpinBox::lcdSpinBox( int _num_digits, QWidget * _parent, const QString & _name ) : QWidget( _parent ), - autoModelView(), + autoModelView( new autoModel( 0, 0, 0, 1, NULL, TRUE ) ), m_number( new QLCDNumber( _num_digits, this ) ), m_label( NULL ), m_origMousePos() @@ -50,8 +50,6 @@ lcdSpinBox::lcdSpinBox( int _num_digits, QWidget * _parent, m_number->setFrameShadow( QFrame::Sunken ); m_number->setSegmentStyle( QLCDNumber::Flat ); - setModel( new autoModel( 0, 0, 0, 1, NULL, TRUE ) ); - QPalette pal; pal.setColor( QPalette::Light, Qt::gray ); pal.setColor( QPalette::Mid, Qt::darkGray ); From 8d62b9d303b715873fdc414192d795aa2fa694dc Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 9 Jan 2008 15:16:04 +0000 Subject: [PATCH 20/87] added missing headers git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@657 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/instrument_view.h | 54 +++++++++++++++++++++++++++++++++++++++ include/plugin_view.h | 46 +++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 include/instrument_view.h create mode 100644 include/plugin_view.h diff --git a/include/instrument_view.h b/include/instrument_view.h new file mode 100644 index 000000000..b771a1ec5 --- /dev/null +++ b/include/instrument_view.h @@ -0,0 +1,54 @@ +/* + * instrument_view.h - definition of instrumentView-class + * + * Copyright (c) 2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _INSTRUMENT_VIEW_H +#define _INSTRUMENT_VIEW_H + +#include "instrument.h" +#include "plugin_view.h" + + +class instrumentView : public pluginView +{ +public: + instrumentView( instrument * _instrument, QWidget * _parent ); + virtual ~instrumentView(); + + instrument * model( void ) + { + return( castModel() ); + } + + const instrument * model( void ) const + { + return( castModel() ); + } + + virtual void setModel( ::model * _model, bool = FALSE ); + +} ; + + +#endif diff --git a/include/plugin_view.h b/include/plugin_view.h new file mode 100644 index 000000000..21e1d251e --- /dev/null +++ b/include/plugin_view.h @@ -0,0 +1,46 @@ +/* + * plugin_view.h - definition of pluginView-class + * + * Copyright (c) 2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _PLUGIN_VIEW_H +#define _PLUGIN_VIEW_H + +#include + +#include "plugin.h" + + +class pluginView : public QWidget, public modelView +{ +public: + pluginView( plugin * _plugin, QWidget * _parent ) : + QWidget( _parent ), + modelView( _plugin ) + { + } + +} ; + + +#endif From 5828c4866f208311721270cc98e0746932691485 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 14 Jan 2008 07:09:37 +0000 Subject: [PATCH 21/87] merged in changes in trunk git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@659 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 5 ++ acinclude.m4 | 147 +++++++++++++++++++++++++++++---------------------- 2 files changed, 89 insertions(+), 63 deletions(-) diff --git a/ChangeLog b/ChangeLog index 97ec31bc2..8d56c6f9a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-01-09 Paul Giblock + + * acinclude.m4: + use pkg-config for more accurate Qt directory detection + 2008-01-06 Tobias Doerffel * plugins/ladspa_effect/ladspa_effect.cpp: diff --git a/acinclude.m4 b/acinclude.m4 index 1eeb3e7ad..db2170812 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -4,43 +4,47 @@ AC_DEFUN([gw_CHECK_QT], AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([AC_PATH_X]) -AC_MSG_CHECKING([QTDIR]) -AC_ARG_WITH([qtdir], [ --with-qtdir=DIR Qt installation directory [default=$QTDIR]], QTDIR=$withval) -# Check that QTDIR is defined or that --with-qtdir given -if test x"$QTDIR" = x ; then - # some usual Qt-locations - QT_SEARCH="/usr /usr/lib/qt4 /usr/share/qt4 /usr/local/Trolltech/Qt-4.3.0 /usr/local/Trolltech/Qt-4.3.1 /usr/local/Trolltech/Qt-4.3.2 /usr/local/Trolltech/Qt-4.1.0" -else - QT_SEARCH=$QTDIR - QTDIR="" -fi -for i in $QT_SEARCH ; do - QT_INCLUDE_SEARCH="include/qt4 include" - for j in $QT_INCLUDE_SEARCH ; do - if test -f $i/$j/Qt/qglobal.h -a x$QTDIR = x ; then - QTDIR=$i - QT_INCLUDES=$i/$j - fi +AC_PATH_PROG([PKGCONFIG], [pkg-config]) + +# Only search manually if no pkgconfig +if test -z "$PKGCONFIG" ; then + AC_MSG_CHECKING([QTDIR]) + AC_ARG_WITH([qtdir], [ --with-qtdir=DIR Qt installation directory [default=$QTDIR]], QTDIR=$withval) + # Check that QTDIR is defined or that --with-qtdir given + if test x"$QTDIR" = x ; then + # some usual Qt-locations + QT_SEARCH="/usr /usr/lib/qt4 /usr/share/qt4 /usr/local/Trolltech/Qt-4.3.0 /usr/local/Trolltech/Qt-4.3.1 /usr/local/Trolltech/Qt-4.3.2 /usr/local/Trolltech/Qt-4.1.0" + else + QT_SEARCH=$QTDIR + QTDIR="" + fi + for i in $QT_SEARCH ; do + QT_INCLUDE_SEARCH="include/qt4 include" + for j in $QT_INCLUDE_SEARCH ; do + if test -f $i/$j/Qt/qglobal.h -a x$QTDIR = x ; then + QTDIR=$i + QT_INCLUDES=$i/$j + fi + done done -done -if test x"$QTDIR" = x ; then - AC_MSG_ERROR([*** QTDIR must be defined, or --with-qtdir option given]) + if test x"$QTDIR" = x ; then + AC_MSG_ERROR([*** QTDIR must be defined, or --with-qtdir option given]) + fi + AC_MSG_RESULT([$QTDIR]) + + # Change backslashes in QTDIR to forward slashes to prevent escaping + # problems later on in the build process, mainly for Cygwin build + # environment using MSVC as the compiler + # TODO: Use sed instead of perl + QTDIR=`echo $QTDIR | perl -p -e 's/\\\\/\\//g'` + + AC_MSG_CHECKING([Qt includes]) + # Check where includes are located + if test x"$QT_INCLUDES" = x ; then + AC_MSG_ERROR([*** could not find Qt-includes! Make sure you have the Qt-devel-files installed!]) + fi + AC_MSG_RESULT([$QT_INCLUDES]) fi -AC_MSG_RESULT([$QTDIR]) - -# Change backslashes in QTDIR to forward slashes to prevent escaping -# problems later on in the build process, mainly for Cygwin build -# environment using MSVC as the compiler -# TODO: Use sed instead of perl -QTDIR=`echo $QTDIR | perl -p -e 's/\\\\/\\//g'` - -AC_MSG_CHECKING([Qt includes]) -# Check where includes are located -if test x"$QT_INCLUDES" = x ; then - AC_MSG_ERROR([*** could not find Qt-includes! Make sure you have the Qt-devel-files installed!]) -fi -AC_MSG_RESULT([$QT_INCLUDES]) - # Search for available Qt translations AH_TEMPLATE(QT_TRANSLATIONS_DIR, [Define to Qt translations directory]) @@ -57,6 +61,11 @@ fi AC_DEFINE_UNQUOTED(QT_TRANSLATIONS_DIR, "$QT_TRANSLATIONS") AC_MSG_RESULT([$QT_TRANSLATIONS]) +# First try to set QTHOSTDIR according to pkg-config +# +if test -n "$PKGCONFIG" ; then + QTHOSTDIR=$(pkg-config QtCore --variable=prefix) +fi if test -z "$QTHOSTDIR" ; then case "${prefix}" in @@ -120,7 +129,13 @@ if test x$LRELEASE = x ; then fi # construct CXXFLAGS -QT_CXXFLAGS="-I$QT_INCLUDES -I$QT_INCLUDES/Qt -D_REENTRANT -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_XML_LIB -DQT_THREAD_SUPPORT" +if test -n "$PKGCONFIG" ; then + QT_CXXFLAGS=$(pkg-config --cflags QtCore QtGui QtXml) +fi + +if test -z "$QT_CXXFLAGS" ; then + QT_CXXFLAGS="-I$QT_INCLUDES -I$QT_INCLUDES/Qt -D_REENTRANT -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_XML_LIB -DQT_THREAD_SUPPORT" +fi AC_MSG_CHECKING([QT_CXXFLAGS]) AC_MSG_RESULT([$QT_CXXFLAGS]) @@ -129,33 +144,39 @@ AC_MSG_RESULT([$QT_CXXFLAGS]) # check libraries AC_MSG_CHECKING([Qt4 libraries]) -case "${host}" in - *mingw32) - QT_LIBS=`ls $QTDIR/lib/libQt*.a 2> /dev/null` - if test "x$QT_LIBS" = x; then - AC_MSG_ERROR([*** Couldn't find any Qt4 libraries]) - fi - QT_LIB="-L$QTDIR/bin -lQtCore4 -lQtXml4 -lQtNetwork4 -lQtGui4 -lws2_32" - # Check that windres is in path - AC_PATH_PROGS([WINDRES],[i586-mingw32-windres windres],,[${prefix}/bin:$PATH]) - if test x$WINDRES = x ; then - AC_MSG_ERROR([*** not found! Make sure you have mingw32 binutils installed!]) - fi - ;; - *) - QT_LIBS=`ls $QTDIR/lib64/libQt*.so 2> /dev/null` - if test "x$QT_LIBS" = x; then - QT_LIBS=`ls $QTDIR/lib/libQt*.so 2> /dev/null` - if test "x$QT_LIBS" = x; then - AC_MSG_ERROR([*** Couldn't find any Qt4 libraries]) - fi - QT_LIB="-L$QTDIR/lib -L$QTDIR/lib/qt4" - else - QT_LIB="-L$QTDIR/lib64 -L$QTDIR/lib64/qt4" - fi - QT_LIB="$QT_LIB -lQtCore -lQtXml -lQtNetwork -lQtGui" - ;; -esac +if test -n "$PKGCONFIG" ; then + QT_LIB=$(pkg-config --libs QtCore QtGui QtXml) +fi + +if test -z "$QT_LIB" ; then + case "${host}" in + *mingw32) + QT_LIBS=`ls $QTDIR/lib/libQt*.a 2> /dev/null` + if test "x$QT_LIBS" = x; then + AC_MSG_ERROR([*** Couldn't find any Qt4 libraries]) + fi + QT_LIB="-L$QTDIR/bin -lQtCore4 -lQtXml4 -lQtNetwork4 -lQtGui4 -lws2_32" + # Check that windres is in path + AC_PATH_PROGS([WINDRES],[i586-mingw32-windres windres],,[${prefix}/bin:$PATH]) + if test x$WINDRES = x ; then + AC_MSG_ERROR([*** not found! Make sure you have mingw32 binutils installed!]) + fi + ;; + *) + QT_LIBS=`ls $QTDIR/lib64/libQt*.so 2> /dev/null` + if test "x$QT_LIBS" = x; then + QT_LIBS=`ls $QTDIR/lib/libQt*.so 2> /dev/null` + if test "x$QT_LIBS" = x; then + AC_MSG_ERROR([*** Couldn't find any Qt4 libraries]) + fi + QT_LIB="-L$QTDIR/lib -L$QTDIR/lib/qt4" + else + QT_LIB="-L$QTDIR/lib64 -L$QTDIR/lib64/qt4" + fi + QT_LIB="$QT_LIB -lQtCore -lQtXml -lQtNetwork -lQtGui" + ;; + esac +fi AC_MSG_RESULT([found: $QT_LIB]) QT_LDADD="$QT_LIB" From 1f882f9300549d026c9782ca8f45176e7d41f079 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 14 Jan 2008 07:44:08 +0000 Subject: [PATCH 22/87] updated German localization git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@661 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 6 + data/locale/de.qm | Bin 172627 -> 174627 bytes data/locale/de.ts | 2394 +++++++++++++++++++++++++-------------------- 3 files changed, 1361 insertions(+), 1039 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8d56c6f9a..4e94565ef 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-01-14 Tobias Doerffel + + * data/locale/de.ts: + * data/locale/de.qm: + updated German localization + 2008-01-09 Paul Giblock * acinclude.m4: diff --git a/data/locale/de.qm b/data/locale/de.qm index b9d637de8c9da418231b5601bf10fa147dfc78d2..bbb7e386dc8c6446c810eeb21f1ea9fc2a51e405 100644 GIT binary patch delta 11013 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 A9smFU diff --git a/data/locale/de.ts b/data/locale/de.ts index 84876b7ec..c123d0b27 100644 --- a/data/locale/de.ts +++ b/data/locale/de.ts @@ -1,6 +1,5 @@ - QObject @@ -12,57 +11,57 @@ QWidget - + Name: Name: - + Maker: Hersteller: - + Copyright: Copyright: - + Requires Real Time: Benötigt Echtzeit: - + Yes Ja - + No - + Real Time Capable: Echtzeitfähig: - + In Place Broken: - + Channels In: Eingangs-Kanäle: - + Channels Out: Ausgangs-Kanäle: - + File: Datei: @@ -70,37 +69,37 @@ aboutDialog - + About LMMS... Über LMMS... - + About Über - + Authors Autoren - + License Lizenz - + Close Schließen - + Translation Übersetzung - + Current language not translated. If you're interested in translating LMMS in another language or want to improve existing translations, you're welcome to help us! Just contact the maintainer! @@ -109,7 +108,7 @@ If you're interested in translating LMMS in another language or want to imp Wenn Sie an der Übersetzung von LMMS in eine andere Sprache interessiert sind oder existierende Übersetzungen verbessern wollen, sind Sie herzlich willkommen, uns zu helfen! Kontaktieren Sie einfach den Maintainer! - + Linux MultiMedia Studio %1 Linux MultiMedia Studio %1 @@ -133,622 +132,635 @@ http://lmms.sourceforge.net Copyright (c) 2004-2007 LMMS-Developers http://lmms.sourceforge.net - LMMS - Ein leistungsfähiges Synthesizer-Studio + LMMS - Ein leistungsfähiges Synthesizer-Studio Copyright (c) 2004-2007 LMMS-Entwickler +http://lmms.sourceforge.net + + + + LMMS - A powerful synthesizer-studio + +Copyright (c) 2004-2008 LMMS-Developers + +http://lmms.sourceforge.net + LMMS - Ein leistungsfähiges Synthesizer-Studio + +Copyright (c) 2004-2008 LMMS-Entwickler + http://lmms.sourceforge.net arpAndChordsTabWidget - + octave Oktave - + Major Dur - + Majb5 Durb5 - + minor moll - + minb5 mollb5 - + sus2 sus2 - + sus4 sus4 - + aug aug - + augsus4 augsus4 - + tri tri - + 6 6 - + 6sus4 6sus4 - + 6add9 madd9 - + m6 m6 - + m6add9 m6add9 - + 7 7 - + 7sus4 7sus4 - + 7#5 7#5 - + 7b5 7b5 - + 7#9 7#9 - + 7b9 7b9 - + 7#5#9 7#5#9 - + 7#5b9 7#5b9 - + 7b5b9 7b5b9 - + 7add11 7add11 - + 7add13 7add13 - + 7#11 7#11 - + Maj7 Maj7 - + Maj7b5 Maj7b5 - + Maj7#5 Maj7#5 - + Maj7#11 Maj7#11 - + Maj7add13 Maj7add13 - + m7 m7 - + m7b5 m7b5 - + m7b9 m7b9 - + m7add11 m7add11 - + m7add13 m7add13 - + m-Maj7 m-Maj7 - + m-Maj7add11 m-Maj7add11 - + m-Maj7add13 m-Maj7add13 - + 9 9 - + 9sus4 9sus4 - + add9 add9 - + 9#5 9#5 - + 9b5 9b5 - + 9#11 9#11 - + 9b13 9b13 - + Maj9 Maj9 - + Maj9sus4 Maj9sus4 - + Maj9#5 Maj9#5 - + Maj9#11 Maj9#11 - + m9 m9 - + madd9 madd9 - + m9b5 m9b5 - + m9-Maj7 m9-Maj7 - + 11 11 - + 11b9 11b9 - + Maj11 Maj11 - + m11 m11 - + m-Maj11 m-Maj11 - + 13 13 - + 13#9 13#9 - + 13b9 13b9 - + 13b5b9 13b5b9 - + Maj13 Maj13 - + m13 m13 - + m-Maj13 m-Maj13 - + Chord range: Akkord-Bereich: - + octave(s) Oktave(n) - + Use this knob for setting the chord range in octaves. The selected chord will be played within specified amount of octaves. Benutzen Sie diesen Knopf, um den Akkord-Bereich in Oktaven zu setzen. Der gewähle Akkord wird innerhalb der angegebenen Anzahl von Oktaven abgespielt. - + An arpeggio is a type of playing (especially plucked) instruments, which makes the music much livelier. The strings of such instruments (e.g. harps) are plucked like chords, the only difference is, that this is done in a sequential order, so the notes are not played at the same time. Typical arpeggios are major or minor triads. But there're a lot of other possible chords, you can select. Ein Arpeggio ist eine Art, (vorallem gezupfte) Instrumente zu spielen, die die Musik viel lebendiger macht. Die Seiten von solchen Instrumenten (z.B. Harfen) werden wie Akkorde gezupft, der einzige Unterschied ist, dass das nacheinander in einer bestimmten Reihenfolge geschieht. Die Noten werden also nicht zur gleichen Zeit gespielt. Typische Arpeggios sind Dur- oder Moll-Dreiklänge. Aber es sind noch viele andere Akkorde möglich, die Sie auswählen können. - + Arpeggio range: Arpeggio-Bereich: - + Use this knob for setting the arpeggio range in octaves. The selected arpeggio will be played within specified amount of octaves. Benutzen Sie diesen Knopf, um den Arpeggio-Bereich in Oktaven zu setzen. Das gewähle Arpeggio wird innerhalb der angegebenen Anzahl von Oktaven abgespielt. - + Arpeggio time: Arpeggio-Zeit: - + ms ms - + Use this knob for setting the arpeggio time in milliseconds. The arpeggio time specifies how long each arpeggio-tone should be played. Benutzen Sie diesen Knopf, um die Arpeggio-Zeit in Millisekunden zu setzen. Die Arpeggio-Zeit gibt an, wie lange jeder einzelne Arpeggio-Ton gespielt werden soll. - + Arpeggio gate: Arpeggio-Gate: - + % % - + Use this knob for setting the arpeggio gate. The arpeggio gate specifies the percent of a whole arpeggio-tone that should be played. With this you can make cool staccato-arpeggios. Benutzen Sie diesen Knopf, um das Arpeggio-Gate zu setzen. Das Arpeggio-Gate gibt an, wie viel Prozent eines ganzen Arpeggio-Tons gespielt werden sollen. Damit können Sie coole Staccato-Arpeggios erstellen. - + arpeggio direction = up Arpeggio-Richtung = hoch - + arpeggio direction = down Arpeggio-Richtung = runter - + arpeggio direction = up and down Arpeggio-Richtung = hoch und runter - + arpeggio direction = random Arpeggio-Richtung = zufällig - + Chord range Akkord-Bereich - + Arpeggio range Arpeggio-Bereich - + Arpeggio time Arpeggio-Zeit - + Arpeggio gate Arpeggio-Gate - + Harmonic minor Harmonisches Moll - + Melodic minor Melodisches Moll - + Whole tone Ganze Töne - + Major pentatonic Pentatonisches Dur - + Minor pentatonic Pentatonisches Moll - + Jap in sen - + Major bebop Dur Bebop - + Dominant bebop Dominanter Bebop - + Blues Blues - + Arabic Arabisch - + Enigmatic Enigmatisch - + Neopolitan Neopolitanisch - + Neopolitan minor Neopolitanisches Moll - + Hungarian minor Zigeunermoll - + Dorian Dorisch - + Phrygolydian Phrygisch - + Lydian Lydisch - + Mixolydian Mixolydisch - + Aeolian Äolisch - + Locrian Locrisch - + Diminished Vermindert - + CHORDS AKKORDE - + RANGE BEREICH - + ARPEGGIO ARPEGGIO - + TIME ZEIT - + GATE GATE - + Direction: Richtung: - + Mode: Modus: - + Free Frei - + Sort Sortiert - + Sync Synchron - + Chord type Akkordtyp - + Arpeggio type Arpeggiotyp - + Arpeggio direction Arpeggio-Richtung - + Arpeggio mode Arpeggio-Modus @@ -756,17 +768,17 @@ http://lmms.sourceforge.net audioDevice - + DEVICE GERÄT - + CHANNELS KANÄLE - + CLIENT-NAME CLIENT-NAME @@ -774,112 +786,107 @@ http://lmms.sourceforge.net audioFileProcessor - + Amplify: Verstärkung: - + With this knob you can set the amplify-ratio. When you set a value of 100% your sample isn't changed. Otherwise it will be amplified up or down (your actual sample-file isn't touched!) Mit diesem Knopf können Sie die Verstärkungsrate festlegen. Wenn Sie einen Wert von 100% setzen, wird das Sample nicht geändert. Ansonsten wird es hoch oder runter verstärkt (Ihre Audio-Datei wird dabei nicht verändert!) - + Startpoint: Startpunkt: - + With this knob you can set the point where AudioFileProcessor should begin playing your sample. If you enable Looping-Mode, this is the point to which AudioFileProcessor returns if a note is longer than the sample between start- and end-point. Mit diesem Knopf können Sie festlegen, wo AudioFileProcessor anfangen soll, Ihr Sample zu spielen. Wenn Sie den Looping-Modus aktivieren, ist das der Punkt, wohin AudioFileProcessor zurückkehrt, wenn eine Note länger als das Sample zwischen Start- und Endpunkt ist. - + Endpoint: Endpunkt: - + With this knob you can set the point where AudioFileProcessor should stop playing your sample. If you enable Looping-Mode, this is the point where AudioFileProcessor returns if a note is longer than the sample between start- and end-point. Mit diesem Knopf können Sie festlegen, wo AudioFileProcessor aufhören soll, Ihr Sample zu spielen. Wenn Sie den Looping-Modus aktivieren, ist das der Punkt, an dem AudioFileProcessor zum Startpunkt zurückkehrt, wenn eine Note länger als das Sample zwischen Start- und Endpunkt ist. - + Click here, if you want to open another audio-file. After clicking on this button, a file-open-dialog appears and you can select your file. Settings like Looping-Mode, start- and end-point, amplify-value and so on are not reset, so please don't wonder if your sample doesn't sound like the original one... Klicken Sie hier, wenn Sie eine andere Audio-Datei öffnen wollen. Nachdem Sie auf diesen Button geklickt haben, erscheint ein Datei-öffnen-Dialog, in dem Sie Ihre Datei wählen können. Einstellungen wie Looping-Modus, Start- und Endpunkt, Verstärkungs-Wert usw. werden nicht zurückgesetzt. Wundern Sie sich also bitte nicht, wenn das Sample auf einmal anders als das Original klingt... - + Here you can set, whether Looping-Mode is enabled. If enabled, AudioFileProcessor loops between start- and end-point of a sample until the whole note is played. This is useful for things like string- and choir-samples. Hier können Sie festlegen, ob der Looping-Modus aktiviert sein soll. Wenn er aktiviert ist, wiederholt AudioFileProcessor das Sample zwischen Start- und Endpunkt solange, bis die gesamte Note gespielt ist. Das ist vorallem für String- und Chor-Samples nützlich. Activate this button, if your sample should be drawn with connected lines. This doesn't change the sound itself. It just gives you another view to your sample. - Aktivieren Sie diesen Button, wenn Ihr Sample mit verbundenen Linien gezeichnet werden soll. Diese Einstellung verändert nichts am Sound. Es zeigt Ihnen Ihr Sample nur in einer anderen Ansicht. + Aktivieren Sie diesen Button, wenn Ihr Sample mit verbundenen Linien gezeichnet werden soll. Diese Einstellung verändert nichts am Sound. Es zeigt Ihnen Ihr Sample nur in einer anderen Ansicht. Activate this button, if your sample should be drawn with dots. This doesn't change the sound itself. It just gives you another view to your sample. - Aktivieren Sie diesen Button, wenn Ihr Sample mit Punkten gezeichnet werden soll. Diese Einstellung verändert nichts am Sound. Es zeigt Ihnen Ihr Sample nur in einer anderen Ansicht. + Aktivieren Sie diesen Button, wenn Ihr Sample mit Punkten gezeichnet werden soll. Diese Einstellung verändert nichts am Sound. Es zeigt Ihnen Ihr Sample nur in einer anderen Ansicht. - + Amplify Verstärkung - + Start of sample Sample-Anfang - + End of sample Sample-Ende - - - - - - + If you enable this button, the whole sample is reversed. This is useful for cool effects, e.g. a reversed crash. Wenn Sie diesen Button aktivieren, wird das gesamte Sample umgekehrt. Das kann nützlich für coole Effekte sein, wie z.B. eine umgekehrte Crash. - + Open other sample Anderes Sample öffnen - + Reverse sample Sample umkehren - + Loop sample at start- and end-point Sample an Start- und Endpunkt wiederholen - + AMP AMP - + START START - + END ENDE - + Loop Wiederholen @@ -887,7 +894,7 @@ http://lmms.sourceforge.net automatableButton - + &Open in automation editor Im Aut&omation-Editor öffnen @@ -895,7 +902,7 @@ http://lmms.sourceforge.net automatableSlider - + &Open in automation editor Im Aut&omation-Editor öffnen @@ -903,22 +910,22 @@ http://lmms.sourceforge.net automationEditor - + Play/pause current pattern (Space) Aktuellen Pattern abspielen/pausieren (Leertaste) - + Stop playing of current pattern (Space) Abspielen des aktuellen Patterns stoppen (Leertaste) - + Click here, if you want to play the current pattern. This is useful while editing it. The pattern is automatically looped when its end is reached. Klicken Sie hier, wenn Sie den aktuellen Pattern spielen wollen. Das ist nützlich beim Bearbeiten. Der Pattern wird automatisch wiederholt, wenn sein Ende erreicht ist. - + Click here, if you want to stop playing of current pattern. Klicken Sie hier, wenn Sie das Abspielen des aktuellen Patterns stoppen wollen. @@ -963,102 +970,102 @@ http://lmms.sourceforge.net Wenn Sie hier klicken, wird der Verschiebe-Modus aktiviert. In diesem Modus können Sie die markierten Werte verschieben. Sie können auch 'M' auf Ihrer Tastatur drücken, um diesen Modus zu aktivieren. - + Cut selected values (Ctrl+X) Ausgewählte Werte ausschneiden (Strg+X) - + Copy selected values (Ctrl+C) Ausgewählte Werte kopieren (Strg+C) - + Paste values from clipboard (Ctrl+V) Werte aus Zwischenablage einfügen (Strg+V) - + If you click here, selected values will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste-button. Wenn Sie hier klicken, werden die markierten Werte in die Zwischenablage ausgeschnitten. Sie können sie überall, auch in einem anderen Pattern, wieder einfügen, indem Sie auf den Einfügen-Button klicken. - + If you click here, selected values will be copied into the clipboard. You can paste them anywhere in any pattern by clicking on the paste-button. Wenn Sie hier klicken, werden die markierten Werte in die Zwischenablage kopiert. Sie können sie überall, auch in einem anderen Pattern, wieder einfügen, indem Sie auf den Einfügen-Button klicken. - + If you click here, the values from the clipboard will be pasted at the first visible tact. Wenn Sie hier klicken, werden die Werte in der Zwischenablage im ersten sichtbaren Takt eingefügt. - + Automation Editor - no pattern Automation-Editor - Kein Pattern - + Automation Editor - %1 Automation-Editor - %1 - + Please open an automation pattern with the context menu of a control! Bitte öffnen Sie einen Automation-Pattern mit Hilfe des Kontextmenüs eines Steuerelements! - + Values copied Werte kopiert - + All selected values were copied to the clipboard. Alle ausgewählten Werte wurden in die Zwischenablage kopiert. - + Draw mode (Shift+D) Zeichnen-Modus (Umschalt+D) - + Erase mode (Shift+E) Radier-Modus (Umschalt+E) - + Select mode (Shift+S) Auswahl-Modus (Umschalt+S) - + Move selection mode (Shift+M) Auswahl-Verschieben-Modus (Umschalt+M) - + If you click here, draw-mode will be activated. In this mode you can add and move single values. This is the default-mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. Wenn Sie hier klicken, wird der Zeichnen-Modus aktiviert. In diesem Modus können Sie einzelne Werte hinzufügen und verschieben. Das ist der Standard-Modus, der meistens benutzt wird. Sie können auch 'Umschalt+D' auf Ihrer Tastatur drücken, um in diesen Modus zu gelangen. - + If you click here, erase-mode will be activated. In this mode you can erase single values. You can also press 'Shift+E' on your keyboard to activate this mode. Wenn Sie hier klicken, wird der Radier-Modus aktiviert. In diesem Modus können Sie einzelne Werte löschen. Sie können auch 'Umschalt+E' auf Ihrer Tastatur drücken, um diesen Modus zu aktivieren. - + If you click here, select-mode will be activated. In this mode you can select values. This is neccessary if you want to cut, copy, paste, delete or move values. You can also press 'Shift+S' on your keyboard to activate this mode. Wenn Sie hier klicken, wird der Auswahl-Modus aktiviert. In diesem Modus können Sie Werte markieren. Das ist nötig, wenn Sie (mehrere) Werte ausschneiden, kopieren, einfügen, löschen oder verschieben wollen. Sie können auch 'Umschalt+S' auf Ihrer Tastatur drücken, um diesen Modus zu aktivieren. - + If you click here, move-mode will be activated. In this mode you can move the values you selected in select-mode. You can also press 'Shift+M' on your keyboard to activate this mode. Wenn Sie hier klicken, wird der Auswahl-Verschieben-Modus aktiviert. In diesem Modus können Sie die markierten Werte verschieben. Sie können auch 'Umschalt+M' auf Ihrer Tastatur drücken, um diesen Modus zu aktivieren. - + Note detuning Noten-Verstimmung @@ -1066,47 +1073,47 @@ http://lmms.sourceforge.net bassBoosterControlDialog - + Frequency Frequenz - + FREQ FREQ - + Frequency: Frequenz: - + Gain Gain - + GAIN GAIN - + Gain: Gain: - + Ratio Rate - + RATIO RATE - + Ratio: Rate: @@ -1114,32 +1121,32 @@ http://lmms.sourceforge.net bbEditor - + Play/pause current beat/bassline (Space) Aktuellen Beat/Bassline abspielen/pausieren (Leertaste) - + Stop playing of current beat/bassline (Space) Abspielen des aktuellen Beats/Bassline stoppen (Leertaste) - + Click here, if you want to play the current beat/bassline. The beat/bassline is automatically looped when its end is reached. Klicken Sie hier, wenn Sie den aktuelle Beat/Bassline abspielen wollen. Der Beat/Bassline wird automatisch wiederholt, wenn sein Ende erreicht ist. - + Click here, if you want to stop playing of current beat/bassline. Klicken Sie hier, wenn Sie das Abspielen des aktuellen Beats/Bassline stoppen wollen. - + Beat+Baseline Editor Beat+Baseline Editor - + Add beat/bassline Beat/Bassline hinzufügen @@ -1147,22 +1154,22 @@ http://lmms.sourceforge.net bbTCO - + Change name Name ändern - + Reset name Name zurücksetzen - + Change color Farbe ändern - + Open in Beat+Baseline-Editor Im Beat+Baseline-Editor öffnen @@ -1170,7 +1177,7 @@ http://lmms.sourceforge.net bbTrack - + Beat/Baseline %1 Beat/Baseline %1 @@ -1178,97 +1185,97 @@ http://lmms.sourceforge.net bitInvader - + Samplelength Sample-Länge - + Sample Length Sample-Länge - + Click here if you want a sine-wave for current oscillator. Klicken Sie hier, wenn Sie eine Sinus-Schwingung für den aktuellen Oszillator haben wollen. - + Click here if you want a triangle-wave for current oscillator. Klicken Sie hier, wenn Sie eine Dreiecks-Schwingung für den aktuellen Oszillator haben wollen. - + Click here if you want a saw-wave for current oscillator. Klicken Sie hier, wenn Sie eine Sägezahn-Schwingung für den aktuellen Oszillator haben wollen. - + Click here if you want a square-wave for current oscillator. Klicken Sie hier, wenn Sie eine Rechteck-Schwingung für den aktuellen Oszillator haben wollen. - + Click here if you want a white-noise for current oscillator. Klicken Sie hier, wenn Sie weißes Rauschen für den aktuellen Oszillator haben wollen. - + Click here if you want a user-defined wave-shape for current oscillator. Klicken Sie hier, wenn Sie eine selbst definierte Wellenform für den aktuellen Oszillator haben wollen. - + Click here to smooth waveform. Klicken Sie hier, um die Wellenform zu glätten. - + Draw your own waveform hereby dragging your mouse onto this graph Zeichnen Sie eigene Wellenformen, indem Sie die Maus über den Graph ziehen - + Interpolation Interpolation - + Normalize Normalisieren - + Sine wave Sinus-Welle - + Triangle wave Dreiecks-Welle - + Saw wave Sägezahn-Welle - + Square wave Rechtecks-Welle - + White noise wave Weißes Rauschen - + User defined wave Benutzerdefinierte Welle - + Smooth Glätten @@ -1384,7 +1391,7 @@ http://lmms.sourceforge.net comboBox - + &Open in automation editor Im Aut&omation-Editor öffnen @@ -1392,12 +1399,12 @@ http://lmms.sourceforge.net configManager - + Setup LMMS Einrichtung von LMMS - + LMMS needs to be setup in order to run properly. This wizard will help you to setup your personal LMMS-installation. If you're unsure what to do at a step, just click on 'Next'. LMMS will automatically select the best options for you. @@ -1412,7 +1419,7 @@ Wenn Sie bei irgendeinem Schritt unsicher sind, was zu tun ist, klicken Sie einf Klicken Sie nun auf "Weiter", um zur nächsten Seite zu gelangen. - + When working with LMMS there needs to be a working-directory. This directory is used for storing your projects, presets, samples etc. @@ -1458,12 +1465,12 @@ Kopierte Dateien können Sie ändern, aber gleichzeitig belegen diese auch zusä Demo Projekte: - + Welcome to LMMS Willkommen bei LMMS - + Select working directory Arbeitsverzeichnis auswählen @@ -1473,51 +1480,51 @@ Kopierte Dateien können Sie ändern, aber gleichzeitig belegen diese auch zusä Dateien kopieren oder verknüpfen - + Directory not existing Verzeichnis existiert nicht - + Error in configuration-file Fehler in Konfigurationsdatei - + Error while parsing configuration-file %1. The setup-wizard will be shown for reconfiguring LMMS. Fehler beim Auswerten der Konfigurationsdatei %1. Der Einrichtungs-Assisten wird angezeigt, um LMMS neu zu konfigurieren. - + The directory you specified does not exist. Create it? Das angegebene Verzeichnis existiert nicht. Soll es erstellt werden? - + < &Back < &Zurück - + &Finish &Abschließen - + Could not save config-file Konnte Konfigurationsdatei nicht speichern - + Could not save configuration file %1. You probably are not permitted to write to this file. Please make sure you have write-access to the file and try again. Die Konfigurationsdatei %1 konnte nicht gespeichert werden. Sie sind möglicherweise nicht berechtigt, diese Datei zu schreiben. Bitte stellen Sie sicher, dass Sie Schreibrechte auf diese Datei besitzen und versuchen es erneut. - + Version mismatches Versionsunterschiede @@ -1528,32 +1535,40 @@ to have run a different (probably older) version of LMMS before. It is recommended to run the setup-wizard again to ensure that the latest samples, presets, demo-projects etc. are installed in your LMMS-working-directory. Run the setup-wizard now? - Entsprechend der Informationen in Ihrer LMMS-Konfigurationsdatei scheinen Sie vorher + Entsprechend der Informationen in Ihrer LMMS-Konfigurationsdatei scheinen Sie vorher eine unterschiedliche (wahrscheinlich ältere) Version von LMMS ausgeführt zu haben. Es wird empfohlen, den Einrichtungsassistenten zu starten, um sicherzustellen, dass die neuesten Samples, Presets, Demo-Projekte usw. in Ihrem LMMS-Arbeitsverzeichnis installiert sind. Soll der Einrichtungsassistent jetzt gestartet werden? - + &Cancel Abbre&chen - + &Next > &Weiter > - + Choose LMMS working directory LMMS-Arbeitsverzeichnis wählen + + + Accordingly to the information in your LMMS-configuration-file you seem to have run a different (probably older) version of LMMS before. +It is recommended to run the setup-wizard again to ensure that the latest samples, presets, demo-projects etc. are installed in your LMMS-working-directory. +Run the setup-wizard now? + Entsprechend der Informationen in Ihrer LMMS-Konfigurationsdatei scheinen Sie vorher eine unterschiedliche (wahrscheinlich ältere) Version von LMMS ausgeführt zu haben. Es wird empfohlen, den Einrichtungsassistenten zu starten, um sicherzustellen, dass die neuesten Samples, Presets, Demo-Projekte usw. in Ihrem LMMS-Arbeitsverzeichnis installiert sind. +Soll der Einrichtungsassistent jetzt gestartet werden? + effectList - + Description Beschreibung @@ -1561,17 +1576,17 @@ installiert sind. Soll der Einrichtungsassistent jetzt gestartet werden? effectSelectDialog - + Effects Selector Effektauswähler - + Add Hinzufügen - + Cancel Abbrechen @@ -1579,12 +1594,12 @@ installiert sind. Soll der Einrichtungsassistent jetzt gestartet werden? effectTabWidget - + EFFECTS CHAIN EFFEKT-KETTE - + Add Hinzufügen @@ -1592,287 +1607,287 @@ installiert sind. Soll der Einrichtungsassistent jetzt gestartet werden? envelopeAndLFOWidget - + Predelay: Verzögerung (predelay): - + Use this knob for setting predelay of the current envelope. The bigger this value the longer the time before start of actual envelope. Benutzen Sie diesen Knopf, um die Verzögerung (predelay) für die aktuelle Hüllkurven einzustellen. Je größer dieser Wert, desto länger dauert es, bis die eigentliche Hüllkurve beginnt. - + Attack: Anschwellzeit (attack): - + Use this knob for setting attack-time of the current envelope. The bigger this value the longer the envelope needs to increase to attack-level. Choose a small value for instruments like pianos and a big value for strings. Benutzen Sie diesen Knopf, um die Anschwellzeit (attack) für die aktuelle Hüllkurve einzustellen. Je größer dieser Wert, desto länger braucht die Hüllkurve, um bis zum Anschwellpegel (attack-level) zu steigen. Wählen Sie einen kleinen Wert für Instrumente wie Klavier und einen großen Wert für Streichinstrumente. - + Hold: Haltezeit (hold): - + Use this knob for setting hold-time of the current envelope. The bigger this value the longer the envelope holds attack-level before it begins to decrease to sustain-level. Benutzen Sie diesen Knopf, um die Haltezeit (hold) der aktuellen Hüllkurve zu setzen. Je größer der Wert, desto länger hält die Hüllkurve den Anschwellpegel, bevor sie zum Dauerpegel (sustain-level) abfällt. - + Decay: Abfallzeit (decay): - + Use this knob for setting decay-time of the current envelope. The bigger this value the longer the envelope needs to decrease from attack-level to sustain-level. Choose a small value for instruments like pianos. Benutzen Sie diesen Knopf, um die Abfallzeit (decay) für die aktuelle Hüllkurve einzustellen. Je größer dieser Wert, desto länger braucht die Hüllkurve, um vom Anschwellpegel (attack-level) zum Dauerpegel (sustain-level) abzufallen. Wählen Sie einen kleinen Wert für Instrumente wie Klavier. - + Sustain: Dauerpegel (sustain): - + Use this knob for setting sustain-level of the current envelope. The bigger this value the higher the level on which the envelope stays before going down to zero. Benutzen Sie diesen Knopf, um den Dauerpegel (sustain-level) für die aktuelle Hüllkurve einzustellen. Je größer dieser Wert, desto höher der Pegel, den die Hüllkurve hält, bevor sie auf Null abfällt. - + Release: Ausklingzeit (release): - + Modulation amount: Modulationsintensität: - + LFO-predelay: LFO-Verzögerung: - + Use this knob for setting predelay-time of the current LFO. The bigger this value the the time until the LFO starts to oscillate. Benutzen Sie diesen Knopf, um die Verzögerungszeit für den aktuellen LFO einzustellen. Je größer dieser Wert, desto länger die Zeit, bis der LFO anfängt zu schwingen. - + LFO-attack: LFO-Anschwellzeit (LFO-attack): - + Use this knob for setting attack-time of the current LFO. The bigger this value the longer the LFO needs to increase its amplitude to maximum. Benutzen Sie diesen Knopf, um die Anschwellzeit für den aktuellen LFO einzustellen. Je größer dieser Wert, desto länger dauert es, bis die Amplitude des LFOs bis zum Maximum angestiegen ist. - + LFO-speed: LFO-Geschwindigkeit: - + Use this knob for setting speed of the current LFO. The bigger this value the faster the LFO oscillates and the faster will be your effect. Benutzen Sie diesen Knopf, um die Geschwindigkeit für den aktuellen LFO einzustellen. Je größer der Wert, desto schneller schwingt der LFO und desto schneller ist der entsprechende Effekt. - + Use this knob for setting modulation amount of the current LFO. The bigger this value the more the selected size (e.g. volume or cutoff-frequency) will be influenced by this LFO. Benutzen Sie diesen Knopf, um die Modulationsintensität des aktuellen LFOs einzustellen. Je größer der Wert, desto mehr wird die gewählte Größe (z.B. Lautstärke oder Cuttoff-Frequenz) von diesem LFO beeinflusst. - + Click here if you want a sine-wave for current oscillator. Klicken Sie hier, wenn Sie eine Sinus-Schwingung für den aktuellen Oszillator haben wollen. - + Click here if you want a triangle-wave for current oscillator. Klicken Sie hier, wenn Sie eine Dreiecks-Schwingung für den aktuellen Oszillator haben wollen. - + Click here if you want a saw-wave for current oscillator. Klicken Sie hier, wenn Sie eine Sägezahn-Schwingung für den aktuellen Oszillator haben wollen. - + Click here if you want a square-wave for current oscillator. Klicken Sie hier, wenn Sie eine Rechteck-Schwingung für den aktuellen Oszillator haben wollen. - + ms/LFO: ms/LFO: - + Predelay-time Vor-Verzögerung - + Attack-time Anschwellzeit - + Hold-time Haltezeit - + Decay-time Abfallzeit - + Sustain-level Dauerpegel - + Release-time Ausklingzeit - + Modulation amount Modulationsintensität - + LFO-predelay-time LFO-Verzögerung - + LFO-attack-time LFO-Anschwellzeit - + LFO-speed LFO-Geschwindigkeit - + LFO-modulation-amount LFO-Modulationsintensität - + Use this knob for setting release-time of the current envelope. The bigger this value the longer the envelope needs to decrease from sustain-level to zero. Choose a big value for soft instruments like strings. Benutzen Sie diesen Knopf, um die Ausklingzeit der aktuellen Hüllkurve einzustellen. Je größer der Wert, desto länger braucht die Hüllkurve um vom Dauerpegel (sustain-level) auf Null abzufallen. Wählen Sie einen großen Wert für weiche Instrumente, wie z.B. Streicher. - + Use this knob for setting modulation amount of the current envelope. The bigger this value the more the according size (e.g. volume or cutoff-frequency) will be influenced by this envelope. Benutzen Sie diesen Knopf, um die Modulationsintensität für die aktuelle Hüllkurve einzustellen. Je größer dieser Wert, desto mehr wird die gewählte Größe (z.B. Lautstärke oder Cutoff-Frequenz) von der Hüllkurve beeinflusst. - + Click here if the frequency of this LFO should be multiplied with 100. Klicken Sie hier, wenn die Frequenz von diesem LFO mit 100 multipliziert werden soll. - + multiply LFO-frequency with 100 LFO-Frequenz mit 100 multiplizieren - + Click here to make the envelope-amount controlled by this LFO. Klicken Sie hier, um die Hüllkurvenintensität durch diesen LFO kontrollieren zu lassen. - + control envelope-amount by this LFO Hüllkurvenintensität durch diesen LFO kontrollieren - + HOLD HOLD - + DEL DEL - + ATT ATT - + DEC DEC - + SUST SUST - + REL REL - + AMT AMT - + SPD SPD - + FREQ x 100 FREQ x 100 - + MODULATE ENV-AMOUNT HÜLLK. MODULIEREN - + Click here if you want a user-defined wave for current oscillator. Afterwards drag an according sample-file into LFO-graph. Klicken Sie hier, wenn Sie eine benutzerdefinierte Wellenform für den aktuellen Oszillator wollen. Danach können Sie einfach entsprechende Sample-Dateien in den LFO-Graph ziehen. - + Hint Tipp - + Drag a sample from somewhere and drop it in this window. Ziehen Sie ein Sample von irgendwo und lassen es in diesem Fenster fallen. - + LFO wave shape LFO-Wellenform - + Freq x 100 Freq x 100 - + Modulate Env-Amount HK.Intens. modulieren @@ -1880,37 +1895,37 @@ installiert sind. Soll der Einrichtungsassistent jetzt gestartet werden? envelopeTabWidget - + LowPass Tiefpass - + HiPass Hochpass - + BandPass csg Bandpass csg - + BandPass czpg Bandpass czpg - + Notch Notch - + Allpass Allpass - + Moog Moog @@ -1920,82 +1935,82 @@ installiert sind. Soll der Einrichtungsassistent jetzt gestartet werden?Hier können Sie den eingebauten Filter wählen, den Sie in diesem Kanal verwenden wollen. Filter sind sehr wichtig, um den Charakter eines Klangs zu ändern. - + Hz Hz - + Q/Resonance: Q/Resonanz: - + Use this knob for setting Q/Resonance for the selected filter. Q/Resonance tells the filter, how much it should amplify frequencies near Cutoff-frequency. Benutzen Sie diesen Knopf, um Q/die Resonanz für den gewählten Filter einzustellen. Q/Resonanz teilt dem Filter mit, wie stark er die Frequenzen in der Nähe der Cutoff-Frequenz verstärken soll. - + Q/Resonance Q/Resonanz - + 2x LowPass 2x Tiefpass - + These tabs contain envelopes. They're very important for modifying a sound, for not saying that they're almost always neccessary for substractive synthesis. For example if you have a volume-envelope, you can set when the sound should have which volume-level. Maybe you want to create some soft strings. Then your sound has to fade in and out very softly. This can be done by setting a large attack- and release-time. It's the same for other envelope-targets like panning, cutoff-frequency of used filter and so on. Just monkey around with it! You can really make cool sounds out of a saw-wave with just some envelopes...! Diese Tabs enthalten Hüllkurven. Sie sind sehr wichtig, um einen Sound zu verändern, um nicht zu sagen, dass sie für die substraktive Synthese fast immer nötig sind. Wenn Sie zum Beispiel eine Lautstärke-Hüllkurve haben, können Sie festlegen, wann der Sound welchen Lautstärke-Pegel haben soll. Vielleicht wollen Sie ein weiches Streichinstrument erstellen. Dann muss ihr Sound sehr sanft ein- und ausgeblendet werden. Das kann ganz einfach erreichen, indem man eine große Anschwell(attack)- und Ausklingzeit (release) einstellt. Mit anderen Hüllkurven, wie Balance, Kennfrequenz des benutzten Filters usw., ist es genau das Gleiche. Probieren Sie einfach ein bisschen herum! Mit ein paar Hüllkurven kann man aus einer Sägezahn-Welle wirklich coole Sounds machen...! - + cutoff-frequency Kennfrequenz - + cutoff-frequency: Kennfrequenz: - + Use this knob for setting the cutoff-frequency for the selected filter. The cutoff-frequency specifies the frequency for cutting the signal by a filter. For example a lowpass-filter cuts all frequencies above the cutoff-frequency. A highpass-filter cuts all frequencies below cutoff-frequency and so on... Benutzen Sie diesen Knopf, um die Kennfrequenz (cutoff-frequency) für den gewählten Filter einzustellen. Die Kennfrequenz wird vom Filter zum Beschneiden des Signals verwendet. Zum Beispiel filtert ein Tiefpass-Filter alle Frequenzen oberhalb der Kennfrequenz heraus. Ein Hochpass-Filter filtert alle Frequenzen unterhalb der Kennfrequenz heraus usw... - + VOLUME LAUTSTÄRKE - + CUTOFF KENNFREQ - + Q/RESO Q/RESO - + FILTER FILTER - + TARGET ZIEL - + Here you can select the built-in filter you want to use for this instrument-track. Filters are very important for changing the characteristics of a sound. Hier können Sie den eingebauten Filter wählen, den Sie in dieser Instrument-Spur nutzen wollen. Filter sind sehr wichtig, um die Charakteristik eines Klangs zu verändern. - + Filter type Filtertyp @@ -2003,81 +2018,81 @@ installiert sind. Soll der Einrichtungsassistent jetzt gestartet werden? exportProjectDialog - + Could not open file Konnte Datei nicht öffnen - + Could not open file %1 for writing. Please make sure you have write-permission to the file and the directory containing the file and try again! Die Datei %1 konnte nicht zum Schreiben geöffnet werden. Bitte stellen Sie sicher, dass Sie Schreibrechte auf diese Datei und das Verzeichnis, das diese Datei enthält, besitzen und versuchen es erneut! - + Uncompressed Wave-File (*.wav) Unkomprimierte Wave-Datei (*.wav) - + Compressed OGG-File (*.ogg) Komprimierte OGG-Datei (*.ogg) - + Type: Typ: - + kbps: kbps: - + variable bitrate Variable Bitrate - + use high-quality-mode (recommened) Benutze High-Quality-Modus (empfohlen) - + Export Exportieren - + Cancel Abbrechen - + Export failed Export fehlgeschlagen - + Rendering: Rendere: - + Export project to %1 Projekt nach %1 exportieren - + The project-export failed, because the output-file/-device could not be opened. Make sure, you have write access to the selected file/device! Der Projekt-Export ist fehlgeschlagen, da die Ausgabedatei bzw. das Ausgabegerät nicht geöffnet werden konnte. Stellen Sie sicher, dass Sie Schreibzugriff auf die gewählte Datei/Gerät haben! - + Exporting project to %1 Exportiere Projekt nach %1 @@ -2085,12 +2100,12 @@ Stellen Sie sicher, dass Sie Schreibzugriff auf die gewählte Datei/Gerät haben fileBrowser - + Browser Browser - + Reload (F5) Neu laden (F5) @@ -2112,118 +2127,118 @@ Stellen Sie sicher, dass Sie Schreibzugriff auf die gewählte Datei/Gerät haben Send to active instrument-track - An aktive Instrument-Spur senden + An aktive Instrument-Spur senden Open in new instrument-track/Song-Editor - In neuer Instrument-Spur im Song-Editor öffnen + In neuer Instrument-Spur im Song-Editor öffnen Open in new instrument-track/B+B Editor - In neuer Instrument-Spur im B+B Editor öffnen + In neuer Instrument-Spur im B+B Editor öffnen impulseEditor - + Draw your own waveform here by dragging your mouse onto this graph Zeichnen Sie eigene Wellenformen, indem Sie die Maus über den Graph ziehen - + Click here if you want a sine-wave for current oscillator. Klicken Sie hier, wenn Sie eine Sinus-Schwingung für den aktuellen Oszillator haben wollen. - + Click here if you want a triangle-wave for current oscillator. Klicken Sie hier, wenn Sie eine Dreiecks-Schwingung für den aktuellen Oszillator haben wollen. - + Click here if you want a saw-wave for current oscillator. Klicken Sie hier, wenn Sie eine Sägezahn-Schwingung für den aktuellen Oszillator haben wollen. - + Click here if you want a square-wave for current oscillator. Klicken Sie hier, wenn Sie eine Rechteck-Schwingung für den aktuellen Oszillator haben wollen. - + Click here if you want a white-noise for current oscillator. Klicken Sie hier, wenn Sie weißes Rauschen für den aktuellen Oszillator haben wollen. - + Click here if you want a user-defined wave-shape for current oscillator. Klicken Sie hier, wenn Sie eine selbst definierte Wellenform für den aktuellen Oszillator haben wollen. - + Click here to smooth waveform. Klicken Sie hier, um die Wellenform zu glätten. - + Click here to normalize waveform. Hier klicken, um die Wellenform zu normalisieren. - + Click here to enable/disable waveform. Hier klicken, um die Wellenform zu aktivieren/deaktiveren. - + &Help &Hilfe - + Sine wave Sinus-Welle - + Triangle wave Dreiecks-Welle - + Saw wave Sägezahn-Welle - + Square wave Rechtecks-Welle - + White noise wave Weißes Rauschen - + User defined wave Benutzerdefinierte Welle - + Smooth Glätten - + Normalize Normalisieren - + Enable waveform Wellenform aktivieren @@ -2231,122 +2246,122 @@ Stellen Sie sicher, dass Sie Schreibzugriff auf die gewählte Datei/Gerät haben instrumentTrack - + With this knob you can set the volume of the opened channel. Mit diesem Knopf können Sie die Lautstärke des geöffneten Kanals ändern. - + Within this rectangle you can set the position where the channel should be audible. You should have a soundcard supporting at least surround 4.0 for enjoying this feature. Innerhalb dieses Rechtecks können Sie die Position setzen, an der dieser Kanal zu hören sein soll. Um dieses Feature sinnvoll zu nutzen, sollten Sie eine Soundkarte haben, die mindestens Surround 4.0 unterstützt. - + unnamed_channel Unbenannter_Kanal - + Channel volume Kanal Lautstärke - + Channel volume: Kanal Lautstärke: - + VOL LAUT - + MIDI input/output MIDI-Eingabe/Ausgabe - + GENERAL SETTINGS GRUNDLEGENDE EINSTELLUNGEN - + VOLUME LAUTSTÄRKE - + FX CHNL FX KANAL - + Save current channel settings in a preset-file Aktuelle Kanal-Einstellungen in einer Preset-Datei speichern - + Click here, if you want to save current channel settings in a preset-file. Later you can load this preset by double-clicking it in the preset-browser. Klicken Sie hier, wenn Sie die aktuellen Kanal-Einstellungen in einer Preset-Datei speichern wollen. Spätern können Sie dieses Preset laden, indem Sie es im Preset-Browser doppelt anklicken. - + Default Default - + ENV/LFO/FILTER HÜLLK./LFO/FILTER - + ARP/CHORD ARP/AKKORD - + MIDI MIDI - + MIDI input MIDI-Eingabe - + MIDI output MIDI-Ausgabe - + Save channel-settings in file Kanal-Einstellungen in Datei speichern - + Channel-Settings-File (*.cs.xml) Channel-Settings-Datei (*.cs.xml) - + PLUGIN PLUGIN - + Surround area Surround-Area - + FX channel FX-Kanal - + FX FX @@ -2354,77 +2369,77 @@ Stellen Sie sicher, dass Sie Schreibzugriff auf die gewählte Datei/Gerät haben kickerInstrument - + Start frequency Startfrequenz - + START START - + Start frequency: Startfrequenz: - + End frequency Endfrequenz - + END ENDE - + End frequency: Endfrequenz: - + Decay Abfallzeit - + DECAY ABFALL - + Decay: Abfallzeit (decay): - + Distortion Verzerrung - + DIST DIST - + Distortion: Verzerrung: - + Gain Gain - + GAIN GAIN - + Gain: Gain: @@ -2432,37 +2447,37 @@ Stellen Sie sicher, dass Sie Schreibzugriff auf die gewählte Datei/Gerät haben knob - + &Help &Hilfe - + &Reset (%1%2) &Zurücksetzen (%1%2) - + &Copy value (%1%2) Wert &kopieren (%1%2) - + &Paste value (%1%2) Wert &einfügen (%1%2) - + Connect to MIDI-device Mit MIDI-Gerät verbinden - + Please enter a new value between %1 and %2: Bitte geben Sie einen neuen Wert zwischen %1 und %2 ein: - + &Open in automation editor Im Aut&omation-Editor öffnen @@ -2472,43 +2487,43 @@ Stellen Sie sicher, dass Sie Schreibzugriff auf die gewählte Datei/Gerät haben LADSPA Plugin Browser - LADSPA-Plugin Browser + LADSPA-Plugin Browser - + Available Effects Verfügbare Effekte - + Unavailable Effects Nicht verfügbare Effekte - + Instruments Instrumente - + Analysis Tools Analysewerkzeuge - + Don't know Weiß nicht Close - Schließen + Schließen - - This dialog displays information on all of the LADSPA plugins LMMS was able to locate. The plugins are divided into five categories based upon an interpretation of the port types and names. + + This dialog displays information on all of the LADSPA plugins LMMS was able to locate. The plugins are divided into five categories based upon an interpretation of the port types and names. -Available Effects are those that can be used by LMMS. In order for LMMS to be able to use an effect, it must, first and foremost, be an effect, which is to say, it has to have both input channels and output channels. LMMS identifies an input channel as an audio rate port containing 'in' in the name. Output channels are identified by the letters 'out'. Furthermore, the effect must have the same number of inputs and outputs and be real time capable. +Available Effects are those that can be used by LMMS. In order for LMMS to be able to use an effect, it must, first and foremost, be an effect, which is to say, it has to have both input channels and output channels. LMMS identifies an input channel as an audio rate port containing 'in' in the name. Output channels are identified by the letters 'out'. Furthermore, the effect must have the same number of inputs and outputs and be real time capable. Unavailable Effects are those that were identified as effects, but either didn't have the same number of input and output channels or weren't real time capable. @@ -2521,21 +2536,26 @@ Don't Knows are plugins for which no input or output channels were identifi Double clicking any of the plugins will bring up information on the ports. + + + Type: + Typ: + ladspaControl - + Link channels Kanäle verbinden - + Value: Wert: - + Sorry, no help available. Sorry, keine Hilfe verfügbar. @@ -2543,93 +2563,111 @@ Double clicking any of the plugins will bring up information on the ports. ladspaControlDialog - + Channel Kanal - + Link Channels Kanäle verbinden + + ladspaDescription + + + Plugins + Plugins + + + + Description + Beschreibung + + ladspaPortDialog - + Name Name - + Rate Rate - + Direction Richtung - + Type Typ - + Min < Default < Max Min < Standard < Max - + Logarithmic Logarithmisch - + SR Dependent SR-abhängig - + Audio Audio - + Control Steuerung - + Input Eingang - + Output Ausgang - + Toggled Umgeschaltet - + Integer Ganzahl - + Float Kommazahl - + Yes Ja + + + Ports + Ports + ladspaSubPluginDescriptionWidget @@ -2687,172 +2725,172 @@ Double clicking any of the plugins will bring up information on the ports. lb302Synth - + VCF Cutoff Frequency VCF-Kennfrequenz - + Cutoff Freq: Kennfrequenz: - + CUT FREQ - + VCF Resonance VCF-Resonanz - + Resonance: Resonanz: - + RES RES - + VCF Envelope Mod VCF-Hüllkurvenintensität - + Env Mod: Hüllkurven-Modulation: - + ENV MOD - + ENV-MOD - + VCF Envelope Decay VCF-Hüllkurvenabfallzeit - + Decay: Abfallzeit (decay): - + DEC DEC - + Slide - + Slide - + Accent Betonung - + Dead Tot - + 303-es-que, 24dB/octave, 3 pole filter - + Slide Decay Slide-Abfallzeit - + Slide Decay: Slide-Abfallzeit: - + SLIDE - + SLIDE - + Fine detuning of the VCO. Ranged between -100 and 100 centes. Feinverstimmung des VCOs. Bereich zwischen -100 und 100 Cents. - + VCO Fine Detuning: VCO Feinverstimmung: - + DETUNE - + Distortion Verzerrung - + DIST: Verzerrung: - + DIST - + DIST - + Waveform Wellenform - + WAVE: - Wellenform: + Wellenform: - + WAVE WELLE - + Sawtooth Sägezahn - + Inverted Sawtooth Invertierter Sägezahn - + Triangle Dreieck - + Square Rechteck - + Rounded Square Abgerundetes Reckteck - + Moog Moog @@ -2938,7 +2976,7 @@ Double clicking any of the plugins will bring up information on the ports. lcdSpinBox - + &Open in automation editor Im Aut&omation-Editor öffnen @@ -2946,30 +2984,45 @@ Double clicking any of the plugins will bring up information on the ports. listView - + Files Dateien - + Loading sample Lade Sample - + Please wait, loading sample for preview... Bitte warten, Sample wird für Vorschau geladen.... - + --- Factory files --- --- Distributions-Dateien --- + + + Send to active instrument-track + An aktive Instrument-Spur senden + + + + Open in new instrument-track/Song-Editor + In neuer Instrument-Spur im Song-Editor öffnen + + + + Open in new instrument-track/B+B Editor + In neuer Instrument-Spur im B+B Editor öffnen + liveTool - + This tool is intended to be used in live performances, though you can use it for music production as well. The following keys will work only if this window is active. The spacebar toggles play and pause in the Song Editor. @@ -2983,117 +3036,117 @@ F1-F10 schalten die ersten 10 Instrumente im Beat+Bassline-Editor stumm bzw. wie mainWindow - + My projects Meine Projekte - + My samples Meine Samples - + My presets Meine Presets - + My home Persönlicher Ordner - + Root directory Wurzelverzeichnis - + Loading song... Lade Song... - + Creating new song... Erstelle neuen Song... - + Creating GUI... Erstelle Oberfläche... - + Create new project Neues Projekt erstellen - + Open existing project Existierendes Projekt öffnen - + Save current project Aktuelles Projekt speichern - + Export current project Aktuelles Projekt exportieren - + Show/hide Piano-Roll Zeige/verstecke Piano-Roll - + By pressing this button, you can show or hide the Piano-Roll. With the help of the Piano-Roll you can edit melody-patterns in an easy way. Durch das Drücken dieses Knopfes können Sie das Piano-Roll ein- oder ausblenden. Mit Hilfe des Piano-Rolls können Sie Melodie-Patterns auf eine bequeme Art bearbeiten. - + Show/hide Song-Editor Zeige/verstecke Song-Editor - + By pressing this button, you can show or hide the Song-Editor. With the help of the Song-Editor you can edit song-playlist and specify when which track should be played. You can also insert and move samples (e.g. rap-samples) directly into the playlist. Durch das Drücken dieses Knopfes können Sie den Song-Editor ein- oder ausblenden. Mit Hilfe des Song-Editors können Sie den Song bearbeiten und einstellen, wann welche Spur gespielt werden soll. Sie können auch Samples (z.B. Rap-Samples) direkt in die Playliste einfügen und verschieben. - + Show/hide project notes Zeige/verstecke Projekt-Notizen - + By pressing this button, you can show or hide the project notes window. In this window you can put down your project notes. Durch das Drücken dieses Knopfes können Sie das Projektnotizen-Fenster ein- oder ausblenden. In diesem Fenster können Sie Ihre Projektnotizen aufschreiben. - + &Project &Projekt - + &New &Neu - + &Open... Ö&ffnen... - + &Save &Speichern - + Save &As... Speichern &als... @@ -3108,52 +3161,52 @@ F1-F10 schalten die ersten 10 Instrumente im Beat+Bassline-Editor stumm bzw. wie E&xportieren - + &Quit &Beenden - + &Settings Ein&stellungen - + Show settings dialog Einstellungsdialog anzeigen - + Show setup wizard Einrichtungsassistent zeigen - + &Help &Hilfe - + Help Hilfe - + What's this? Was ist das? - + About Über - + LMMS %1 LMMS %1 - + Open project Projekt öffnen @@ -3163,7 +3216,7 @@ F1-F10 schalten die ersten 10 Instrumente im Beat+Bassline-Editor stumm bzw. wie MultiMedia-Projekt (*.mmp *.xml) - + Save project Projekt speichern @@ -3173,7 +3226,7 @@ F1-F10 schalten die ersten 10 Instrumente im Beat+Bassline-Editor stumm bzw. wie MultiMedia-Projekt (*.mmp);;MultiMedia-Projekt-Vorlage (*.mpt) - + Help not available Hilfe nicht verfügbar @@ -3181,46 +3234,46 @@ F1-F10 schalten die ersten 10 Instrumente im Beat+Bassline-Editor stumm bzw. wie Currently there's no help available in LMMS. Please visit http://wiki.mindrules.net for documentation on LMMS. - Derzeit ist in LMMS keine Hilfe verfügbar. + Derzeit ist in LMMS keine Hilfe verfügbar. Bitte besuchen Sie http://wiki.mindrules.net für Dokumentationen über LMMS. - + Setting up main-window and workspace... Initialisiere Hauptfenster und Arbeitsbereich... - + Show/hide Beat+Baseline Editor Zeige/verstecke Beat+Baseline Editor - + By pressing this button, you can show or hide the Beat+Baseline Editor. The Beat+Baseline Editor is needed for creating beats, opening, adding and removing channels, cutting, copying and pasting beat- and baseline-patterns and other things like that. Durch das Drücken dieses Knopfes wird der Beat+Baseline Editor ein- oder ausgeblendet. Der Beat+Baseline Editor ist nötig, um Beats zu erstellen, Kanale zu öffnen, hinzuzufügen und zu entfernen sowie um Baseline-Patterns auszuschneiden, zu kopieren und einzufügen usw. - + &Edit &Bearbeiten - + Undo Rückgängig - + Redo Wiederherstellen - + Show/hide Automation Editor Zeige/Verstecke Automation-Editor - + By pressing this button, you can show or hide the Automation Editor. With the help of the Automation Editor you can edit dynamic values in an easy way. Durch das Drücken dieses Knopfes können Sie den Automation-Editor ein- oder ausblenden. Mit Hilfe des Automation-Editors können Sie dynamische Werte auf eine einfache Art und Weise bearbeiten. @@ -3230,290 +3283,312 @@ Bitte besuchen Sie http://wiki.mindrules.net für Dokumentationen über LMMS.LADSPA-Plugins... - + MultiMedia Project (*.mmp *.mmpz *.xml) MultiMedia Projekt (*.mmp *.mmpz *.xml) - + MultiMedia Project (*.mmp *.mmpz);;MultiMedia Project Template (*.mpt) MultiMedia Projekt (*.mmp *.mmpz);;MultiMedia Projekt-Vorlage (*.mpt) - + &Tools &Werkzeuge - + Online help Online-Hilfe - + Recently opened projects Zuletzt geöffnete Projekte - + Import... Importieren... - + E&xport... E&xportieren... + + + Untitled + Unbenannt + + + + Project not saved + Projekt nicht gespeichert + + + + The current project was modified since last saving. Do you want to save it now? + Das aktuelle Projekt wurde seit dem letzten Speichern geändert. Wollen Sie es jetzt speichern? + + + + Currently there's no help available in LMMS. +Please visit http://lmms.sf.net/wiki for documentation on LMMS. + Derzeit ist in LMMS keine Hilfe verfügbar. +Bitte besuchen Sie http://lmms.sf.net/wiki für Dokumentationen über LMMS. + mallets - + Spread Weite - + Spread: Weite: - + Hardness Härte - + Hardness: Härte: - + Position Position - + Position: Position: - + Vibrato Gain Vibrato Gain - + Vib Gain Vib Gain - + Vib Gain: Vib Gain: - + Vibrato Freq Vibrato-Freq - + Vib Freq Vib-Freq - + Vib Freq: Vib-Freq: - + Stick Mix Stick Mix - + Stick Mix: Stick Mix: - + Modulator Modulator - + Modulator: Modulator: - + Crossfade Crossfade - + Crossfade: Crossfade: - + LFO Speed LFO-Geschwindigkeit - + LFO Speed: LFO-Geschwindigkeit: - + LFO Depth LFO-Tiefe - + LFO Depth: LFO-Tiefe: - + ADSR ADSR - + ADSR: ADSR: - + Bowed Gestrichen - + Pressure Druck - + Pressure: Druck: - + Motion Bewegung - + Motion: Bewegung: - + Speed Geschwindigkeit - + Speed: Geschwindigkeit: - + Vibrato Vibrato - + Vibrato: Vibrato: - + Instrument Instrument - + Marimba Marimba - + Vibraphone Vibraphon - + Agogo Agogo - + Wood1 Holz 1 - + Reso Reso - + Wood2 Holz 2 - + Beats Beats - + Two Fixed Two Fixed - + Clump Clump - + Tubular Bells Glocken in Röhre - + Uniform Bar Uniform Bar - + Tuned Bar Tuned Bar - + Glass Glas - + Tibetan Bowl Tibetanische Schüssel - + Missing files Fehlende Dateien - + Your Stk-installation seems to be incomplete. Please make sure the full Stk-package is installed! Ihre Stk-Installation scheint unvollständig zu sein. Bitte stellen Sie sicher, dass das volle Stk-Paket installiert ist! @@ -3521,12 +3596,12 @@ Bitte besuchen Sie http://wiki.mindrules.net für Dokumentationen über LMMS. meterDialog - + Meter Numerator Takt/Zähler - + Meter Denominator Takt/Nenner @@ -3534,7 +3609,7 @@ Bitte besuchen Sie http://wiki.mindrules.net für Dokumentationen über LMMS. midiClient - + DEVICE GERÄT @@ -3542,7 +3617,7 @@ Bitte besuchen Sie http://wiki.mindrules.net für Dokumentationen über LMMS. midiClientRaw - + DEVICE GERÄT @@ -3550,62 +3625,62 @@ Bitte besuchen Sie http://wiki.mindrules.net für Dokumentationen über LMMS. midiTabWidget - + MIDI-SETUP FOR THIS CHANNEL MIDI-EINSTELLUNGEN FÜR DIESEN KANAL - + CHANNEL KANAL - + MIDI-devices to receive MIDI-events from MIDI-Geräte, von denen MIDI-Events empfangen werden sollen - + MIDI-devices to send MIDI-events to MIDI-Geräte, an die MIDI-Events gesendet werden sollen - + Receive MIDI-events MIDI-Ereignisse empfangen - + Send MIDI-events MIDI-Ereignisse senden - + Default velocity for all input-events Standardlautstärke für alle einkommenden Ereignisse - + Default velocity for all output-events Standardlautstärke für alle ausgehende Ereignisse - + Input channel Eingangskanal - + Output channel Ausgangskanal - + Default input velocity Standardeingabelautstärke - + Default output velocity Standardausgabelautstärke @@ -3613,22 +3688,22 @@ Bitte besuchen Sie http://wiki.mindrules.net für Dokumentationen über LMMS. mixer - + Plugin not found Plugin nicht gefunden - + The %1-plugin wasn't found! Das %1-Plugin wurde nicht gefunden! - + Error while loading plugin Fehler beim Laden des Plugins - + Failed loading plugin "%1"! Laden des Plugins "%1" fehlgeschlagen! @@ -3636,12 +3711,12 @@ Bitte besuchen Sie http://wiki.mindrules.net für Dokumentationen über LMMS. nameLabel - + Select icon Icon auswählen - + All images (*.png *.jpg *.jpeg *.gif *.bmp) Alle Bilder (*.png *.jpg *.jpeg *.gif *.bmp) @@ -3649,7 +3724,7 @@ Bitte besuchen Sie http://wiki.mindrules.net für Dokumentationen über LMMS. nineButtonSelector - + &Help &Hilfe @@ -3657,57 +3732,57 @@ Bitte besuchen Sie http://wiki.mindrules.net für Dokumentationen über LMMS. organicInstrument - + Osc %1 waveform Oszillator %1 Wellenform - + Osc %1 waveform: Oszillator %1 Wellenform: - + Osc %1 volume Oszillator %1 Lautstärke - + Osc %1 volume: Oszillator %1 Lautstärke: - + Osc %1 panning Oszillator %1 Balance - + Osc %1 panning: Oszillator %1 Balance: - + Osc %1 fine detuning left Oszillator %1 Fein-Verstimmung links - + Osc %1 fine detuning left: Oszillator %1 Fein-Verstimmung links: - + cents Cent - + FX1 FX1 - + Randomise Würfeln @@ -3715,57 +3790,57 @@ Bitte besuchen Sie http://wiki.mindrules.net für Dokumentationen über LMMS. patmanSynth - + Open other patch Andere Patch-Datei öffnen - + Click here to open another patch-file. Loop and Tune settings are not reset. Klicken Sie hier, um eine andere Patch-Datei zu laden. Wiederholungs- und Stimmungseinstellungen werden nicht zurückgesetzt. - + Loop Wiederholen - + Loop mode Modus beim Wiederholen - + Here you can toggle the Loop mode. If enabled, PatMan will use the loop information available in the file. Hier können Sie den Wiederholen-Modus (de-)aktivieren. Wenn aktiviert, verwendet PatMan die in der Datei verfügbaren Informationen zum Wiederholen. - + Tune Stimmung - + Tune mode Stimmungsmodus - + Here you can toggle the Tune mode. If enabled, PatMan will tune the sample to match the note's frequency. Hier können Sie den Stimmungs-Modus (de-)aktivieren. Wenn aktiviert, wird der Klang automatisch an die Frequenz der Note angepasst. - + No file selected Keine Datei ausgewählt - + Open patch file Patch-Datei öffnen - + Patch-Files (*.pat) Patch-Dateien (*.pat) @@ -3773,47 +3848,47 @@ Bitte besuchen Sie http://wiki.mindrules.net für Dokumentationen über LMMS. pattern - + Change name Name ändern - + Reset name Name zurücksetzen - + Freeze Einfrieren - + Unfreeze Ausfrieren - + Clear all notes Alle Noten löschen - + Cannot freeze pattern Kann Pattern nicht einfrieren - + The pattern currently cannot be freezed because you're in play-mode. Please stop and try again! Der Pattern kann derzeit nicht eingefroren werden, da Sie sich im Abspiel-Modus befinden. Bitte stoppen Sie und versuchen es erneut! - + Open in piano-roll Im Piano-Roll öffnen - + Refreeze Erneut einfrieren @@ -3828,27 +3903,27 @@ Bitte besuchen Sie http://wiki.mindrules.net für Dokumentationen über LMMS.Der Kanal, zu dem dieser Pattern gehört, ist derzeit stumm geschaltet, weshalb das Einfrieren keinen Sinn ergibt! Wollen Sie trotzdem fortfahren? - + Add steps Steps hinzufügen - + Remove steps Steps entfernen - + 1 step 1 Step - + %1 steps %1 Steps - + double-click to open this pattern in piano-roll use mouse wheel to set volume of a step Doppelklick, um diesen Pattern im Piano-Roll zu öffnen @@ -3868,12 +3943,12 @@ Lautstärke eines Steps kann mit Mausrad geändert werden patternFreezeStatusDialog - + Freezing pattern... Friere Pattern ein... - + Cancel Abbrechen @@ -3896,52 +3971,52 @@ Lautstärke eines Steps kann mit Mausrad geändert werden Wenn Sie hier klicken, wird der Verschiebe-Modus aktiviert. In diesem Modus können Sie die markierten Noten verschieben. Sie können auch 'M' auf Ihrer Tastatur drücken, um diesen Modus zu aktivieren. - + Cut selected notes (Ctrl+X) Ausgewählte Noten ausschneiden (Strg+X) - + Copy selected notes (Ctrl+C) Ausgewählte Noten kopieren (Strg+C) - + If you click here, selected notes will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste-button. Wenn Sie hier klicken, werden die markierten Noten in die Zwischenablage ausgeschnitten. Sie können sie überall, auch in einem anderen Pattern, wieder einfügen, indem Sie auf den Einfügen-Button klicken. - + If you click here, selected notes will be copied into the clipboard. You can paste them anywhere in any pattern by clicking on the paste-button. Wenn Sie hier klicken, werden die markierten Noten in die Zwischenablage kopiert. Sie können sie überall, auch in einem anderen Pattern, wieder einfügen, indem Sie auf den Einfügen-Button klicken. - + If you click here, the notes from the clipboard will be pasted at the first visible tact. Wenn Sie hier klicken, werden Noten aus Zwischenablage im ersten sichtbaren Takt eingefügt. - + Paste notes from clipboard (Ctrl+V) Noten aus Zwischenablage einfügen (Strg+V) - + Play/pause current pattern (Space) Aktuellen Pattern abspielen/pausieren (Leertaste) - + Stop playing of current pattern (Space) Abspielen des aktuellen Patterns stoppen (Leertaste) - + Click here, if you want to play the current pattern. This is useful while editing it. The pattern is automatically looped when its end is reached. Klicken Sie hier, wenn Sie den aktuellen Pattern spielen wollen. Das ist nützlich beim Bearbeiten. Der Pattern wird automatisch wiederholt, wenn sein Ende erreicht ist. - + Click here, if you want to stop playing of current pattern. Klicken Sie hier, wenn Sie das Abspielen des aktuellen Patterns stoppen wollen. @@ -3951,27 +4026,27 @@ Lautstärke eines Steps kann mit Mausrad geändert werden Wenn Sie hier klicken, wird der Zeichen-Modus aktiviert. In diesem Modus können Sie einzelne Noten hinzufügen, deren Größe ändern oder sie verschieben. Das ist der Standard-Modus, der meistens benutzt wird. Sie können auch 'D' auf Ihrer Tastatur drücken, um in diesen Modus zu gelangen. - + Piano-Roll - %1 Piano-Roll - %1 - + Piano-Roll - no pattern Piano-Roll - Kein Pattern - + Please open a pattern by double-clicking on it! Bitte öffnen Sie einen Pattern, indem Sie ihn doppelklicken! - + Record notes from MIDI-device/channel-piano Noten von MIDI-Gerät/Kanal-Klavier aufnehmen - + Click here, if you want to record notes from a MIDI-device or the virtual test-piano of the according channel-window to the current pattern. When recording all notes you play will be written to this pattern and you can play and edit them afterwards. Klicken Sie hier, wenn Sie Noten von einem MIDI-Gerät oder dem virtuellen Test-Klavier des zugehörigen Kanal-Fensters in den aktuellen Pattern aufnehmen wollen. Beim Aufnehmen werden alle Noten, die Sie spielen, in diesen Pattern geschrieben und hinterher können Sie diese abspielen und bearbeiten. @@ -3996,57 +4071,57 @@ Lautstärke eines Steps kann mit Mausrad geändert werden Verschieben-Modus (M) - + Notes copied Noten kopiert - + All selected notes were copied to the clipboard. Alle gewählten Noten wurden in die Zwischenablage kopiert. - + Last note Letzte Note - + Draw mode (Shift+D) Zeichnen-Modus (Umschalt+D) - + Erase mode (Shift+E) Radier-Modus (Umschalt+E) - + Select mode (Shift+S) Auswahl-Modus (Umschalt+S) - + Move selection mode (Shift+M) Auswahl-Verschieben-Modus (Umschalt+M) - + If you click here, draw-mode will be activated. In this mode you can add, resize and move single notes. This is the default-mode which is used most of the time. You can also press 'Shift+D' on your keyboard to activate this mode. Wenn Sie hier klicken, wird der Zeichnen-Modus aktiviert. In diesem Modus können Sie einzelne Noten hinzufügen und verschieben. Das ist der Standard-Modus, der meistens benutzt wird. Sie können auch 'Umschalt+D' auf Ihrer Tastatur drücken, um in diesen Modus zu gelangen. - + If you click here, erase-mode will be activated. In this mode you can erase single notes. You can also press 'Shift+E' on your keyboard to activate this mode. Wenn Sie hier klicken, wird der Radier-Modus aktiviert. In diesem Modus können Sie einzelne Noten löschen. Sie können auch 'Umschalt+E' auf Ihrer Tastatur drücken, um diesen Modus zu aktivieren. - + If you click here, select-mode will be activated. In this mode you can select notes. This is neccessary if you want to cut, copy, paste, delete or move notes. You can also press 'Shift+S' on your keyboard to activate this mode. Wenn Sie hier klicken, wird der Auswahl-Modus aktiviert. In diesem Modus können Sie Noten markieren. Das ist nötig, wenn Sie (mehrere) Noten ausschneiden, kopieren, einfügen, löschen oder verschieben wollen. Sie können auch 'Umschalt+S' auf Ihrer Tastatur drücken, um diesen Modus zu aktivieren. - + If you click here, move-mode will be activated. In this mode you can move the notes you selected in select-mode. You can also press 'Shift+M' on your keyboard to activate this mode. Wenn Sie hier klicken, wird der Auswahl-Verschieben-Modus aktiviert. In diesem Modus können Sie die markierten Noten verschieben. Sie können auch 'Umschalt+M' auf Ihrer Tastatur drücken, um diesen Modus zu aktivieren. @@ -4054,12 +4129,12 @@ Lautstärke eines Steps kann mit Mausrad geändert werden pianoWidget - + Base note Grundton - + &Open in automation editor Im Aut&omation-Editor öffnen @@ -4067,22 +4142,22 @@ Lautstärke eines Steps kann mit Mausrad geändert werden pluckedStringSynth - + Pick position Zupf-Position - + Pick position: Zupf-Position: - + Pickup position Abnehmer-Position - + Pickup position: Abnehmer-Position: @@ -4090,22 +4165,22 @@ Lautstärke eines Steps kann mit Mausrad geändert werden pluginBrowser - + Instrument plugins Instrument-Plugins - + Plugin browser Plugin-Browser - + cheap synthesis of guitar/harp-like sounds Einfache Synthese gitarren-/harfenähnlicher Klänge - + three powerful oscillators you can modulate in several ways Drei leistungsfähige Oszillatoren, die Sie auf verschiedene Art und Weise modulieren können @@ -4115,235 +4190,408 @@ Lautstärke eines Steps kann mit Mausrad geändert werden Einfacher Sampler mit verschiedenen Einstellungen zum Benutzen von Samples (z.B. Drums) in einem Kanal - + VST-host for using VST(i)-plugins within LMMS VST-Host zum Benutzen von VST(i)-Plugins innerhalb von LMMS - + no description keine Beschreibung - + Rough & Dirty Wavetable Synthesizer. Einfacher & roher Wavetable-Synthesizer. - + You can drag an instrument-plugin into either the Song-Editor, the Beat+Baseline Editor or just into a channel-window or on the corresponding channel-button. Sie können ein Instrument-Plugin entweder in den Song-Editor, den Beat+Baseline-Editor oder einfach in ein Kanal-Fenster oder auf den zugehörigen Kanal-Button ziehen. - + Additive Synthesizer for organ-like sounds Additiver Synthesizer für orgelähnliche Klänge - + Vibrating string modeler Modellierung einer schwingenden Saite - + Filter for importing MIDI-files into LMMS Filter, um MIDI-Dateien in LMMS zu importieren - + simple sampler with various settings for using samples (e.g. drums) in an instrument-track Einfacher Sampler mit verschiedenen Einstellungen zur Nutzung von Samples (z.B. Drums) in einer Instrument-Spur - + Filter for importing FL Studio projects into LMMS Filter für Import von FL Studio Projekten in LMMS - + Tuneful things to bang on Gegenstände, die nach etwas klingen, wenn man drauf rumkloppt - + plugin for using arbitrary LADSPA-effects inside LMMS. Plugin, um beliebige LADSPA-Effekte in LMMS nutzen zu können. - + plugin for using arbitrary VST-effects inside LMMS. Plugin um beliebige VST-Effekte in LMMS nutzen zu können. - + Incomplete monophonic immitation tb303 Unvollständiger monophonischer TB303-Klon - + versatile kick- & bassdrum-synthesizer Vielfältiger Kick- & Bassdrum-Synthesizer - + GUS-compatible patch instrument GUS-kompatibles Patch-Instrument - + Singer bot to add some basic vocals Künstlicher Sänger für ein paar einfache Vokale - + Tool for live performance Werkzeug für Live-Auftritte + + + Incomplete polyphonic immitation tb303 + Polyphonischer TB303-Klon + + + + Plugin for enhancing stereo separation of a stereo input file + + + + + List installed LADSPA plugins + Installierte LADSPA-Plugins auflisten + + + + polyb302Synth + + + VCF Cutoff Frequency + VCF-Kennfrequenz + + + + Cutoff Freq: + Kennfrequenz: + + + + CUT + FREQ + + + + VCF Resonance + VCF-Resonanz + + + + Resonance: + Resonanz: + + + + RES + RES + + + + VCF Envelope Mod + VCF-Hüllkurvenintensität + + + + Env Mod: + Hüllkurven-Modulation: + + + + ENV MOD + ENV-MOD + + + + VCF Envelope Decay + VCF-Hüllkurvenabfallzeit + + + + Decay: + Abfallzeit (decay): + + + + DEC + DEC + + + + 303-es-que, 24dB/octave, 3 pole filter + + + + + Slide Decay + Slide-Abfallzeit + + + + Slide Decay: + Slide-Abfallzeit: + + + + SLIDE + SLIDE + + + + VCO fine detuning + VCO Feinverstimmung + + + + VCO Fine Detuning: + VCO Feinverstimmung: + + + + DETUNE + + + + + Distortion + Verzerrung + + + + DIST: + DIST: + + + + DIST + DIST + + + + Waveform + Wellenform + + + + WAVE: + Wellenform: + + + + WAVE + WELLE + + + + Sawtooth + Sägezahn + + + + Inverted Sawtooth + Invertierter Sägezahn + + + + Triangle + Dreieck + + + + Square + Rechteck + + + + Rounded Square + Abgerundetes Reckteck + + + + Moog + Moog + projectNotes - + Put down your project notes here. Schreiben Sie hier Ihre Projekt-Notizen auf. - + Project notes Projekt-Notizen - + Edit Actions Bearbeiten - + &Undo &Rückgängig - + Ctrl+Z Strg+Z - + &Redo Wiede&rholen - + Ctrl+Y Strg+Y - + &Copy &Kopieren - + Ctrl+C Strg+C - + Cu&t A&usschneiden - + Ctrl+X Strg+X - + &Paste &Einfügen - + Ctrl+V Strg+V - + Format Actions Formatierung - + &Bold &Fett - + Ctrl+B Strg+F - + &Italic &Kursiv - + Ctrl+I Strg+K - + &Underline &Unterstrichen - + Ctrl+U Strg+U - + &Left &Links - + Ctrl+L Strg+L - + C&enter Z&entriert - + Ctrl+E Strg+Z - + &Right &Rechts - + Ctrl+R Strg+R - + &Justify &Blocksatz - + Ctrl+J Strg+J - + &Color... &Farbe... @@ -4351,77 +4599,77 @@ Lautstärke eines Steps kann mit Mausrad geändert werden rackPlugin - + Turn the effect off Effekt ausschalten - + On/Off An/aus - + Toggles the effect on or off. Schalten den Effekt an oder aus. - + Wet/Dry mix Wet/Dry-Mix - + W/D W/D - + Wet Level: Wet-Level: - + The Wet/Dry knob sets the ratio between the input signal and the effect that shows up in the output. Der Wet/Dry-Knopf legt das Verhältnis zwischen Eingangssignal und vom Effekt bearbeiteten Signal im Ausgang fest. - + Decay Abfallzeit - + Time: Zeit: - + The Decay knob controls how many buffers of silence must pass before the plugin stops processing. Smaller values will reduce the CPU overhead but run the risk of clipping the tail on delay effects. Der Abfallzeit-Knopf kontrolliert wie viele Puffer mit Stille durchgelaufen sein müssen, bis das Plugin mit der Verarbeitung stoppt. Kleinere Werte reduzieren den CPU-Overhead, können jedoch unter Umständen das Ende von Delay-Effekten usw. abschneiden. - + Gate Gate - + Gate: Gate: - + The Gate knob controls the signal level that is considered to be 'silence' while deciding when to stop processing signals. Der Gate-Knopf legt die Stärke des Signals fest, welches als Stille angesehen wird, um zu entscheiden, wann das Plugin mit der Verarbeitung aufhören kann. - + Controls Regler - + Effect plugins function as a chained series of effects where the signal will be processed from top to bottom. The On/Off switch allows you to bypass a given plugin at any point in time. @@ -4438,22 +4686,22 @@ Right clicking will bring up a context menu where you can change the order in wh - + Move &up Nach &oben verschieben - + Move &down Nach &unten verschieben - + &Remove this plugin Plugin entfe&rnen - + &Help &Hilfe @@ -4461,22 +4709,22 @@ Right clicking will bring up a context menu where you can change the order in wh remoteVSTPlugin - + Loading plugin Lade Plugin - + Please wait while loading VST-plugin... Bitte warten, während das VST-Plugin geladen wird... - + Failed loading VST-plugin Laden des VST-Plugins fehlgeschlagen - + The VST-plugin %1 could not be loaded for some reason. If it runs with other VST-software under Linux, please contact an LMMS-developer! Das VST-Plugin %1 konnte aus irgendeinem Grund nicht geladen werden. @@ -4486,7 +4734,7 @@ Wenn es mit anderer VST-software unter Linux funktioniert, kontaktieren Sie bitt renameDialog - + Rename... Umbenennen... @@ -4494,37 +4742,37 @@ Wenn es mit anderer VST-software unter Linux funktioniert, kontaktieren Sie bitt sampleBuffer - + Wave-Files (*.wav) Wave-Dateien (*.wav) - + OGG-Files (*.ogg) OGG-Dateien (*.ogg) - + VOC-Files (*.voc) VOC-Dateien (*.voc) - + AIFF-Files (*.aif *.aiff) AIFF-Dateien (*.aif *.aiff) - + AU-Files (*.au) AU-Dateien (*.au) - + RAW-Files (*.raw) RAW-Dateien (*.raw) - + Open audio file Audio-Datei öffnen @@ -4534,25 +4782,35 @@ Wenn es mit anderer VST-software unter Linux funktioniert, kontaktieren Sie bitt Alle Audio-Dateien (*.wav *.ogg *.flac *.voc *.aif *.aiff *.au *.raw) - + FLAC-Files (*.flac) FLAC-Dateien (*.flac) All Audio-Files (*.wav *.ogg *.flac *.spx *.voc *.aif *.aiff *.au *.raw) - Alle Audio-Dateien (*.wav *.ogg *.flac *.spx *.voc *.aif *.aiff *.au *.raw) + Alle Audio-Dateien (*.wav *.ogg *.flac *.spx *.voc *.aif *.aiff *.au *.raw) - + SPEEX-Files (*.spx) SPEEX-Dateien (*.spx) + + + All Audio-Files (*.wav *.ogg *.ds *.flac *.spx *.voc *.aif *.aiff *.au *.raw) + Alle Audio-Dateien (*.wav *.ogg *.ds *.flac *.spx *.voc *.aif *.aiff *.au *.raw) + + + + DrumSynth-Files (*.ds) + DrumSynth-Dateien (*.ds) + sampleTCO - + double-click to select sample Doppelklick, um Sample zu wählen @@ -4560,27 +4818,27 @@ Wenn es mit anderer VST-software unter Linux funktioniert, kontaktieren Sie bitt sampleTrack - + Sample track Sample-Spur - + Channel volume Kanal Lautstärke - + Channel volume: Kanal Lautstärke: - + VOL LAUT - + With this knob you can set the volume of the opened channel. Mit diesem Knopf können Sie die Lautstärke des geöffneten Kanals ändern. @@ -4588,214 +4846,214 @@ Wenn es mit anderer VST-software unter Linux funktioniert, kontaktieren Sie bitt setupDialog - + Setup LMMS Einrichtung von LMMS - + General settings Allgemeine Einstellungen - + BUFFER SIZE PUFFERGRÖSSE - + Reset to default-value Auf Standardwert zurücksetzen - + MISC VERSCHIEDENES Disable tooltips (no spurious interrupts while playing) - Tooltips deaktivieren (keine stör. Unterbrechungen beim Abspielen) + Tooltips deaktivieren (keine stör. Unterbrechungen beim Abspielen) - + Audio settings Audio-Einstellungen - + AUDIO INTERFACE AUDIO-SCHNITTSTELLE - + MIDI settings MIDI-Einstellungen - + MIDI INTERFACE MIDI-SCHNITTSTELLE - + OK OK - + Cancel Abbrechen - + Here you can setup the internal buffer-size used by LMMS. Smaller values result in a lower latency but also may cause unusable sound or bad performance, especially on older computers or systems with a non-realtime kernel. Hier können Sie die interne Puffergröße einstellen, die von LMMS genutzt wird. Kleinere Werte machen sich in einer geringeren Latenz bemerkbar, können aber auch zu unbrauchbarem Sound oder schlechter Performance führen, vor allem auf älteren Computern oder Systemen mit einem Nicht-Echtzeit-Kernel. - + Here you can select your preferred audio-interface. Depending on the configuration of your system during compilation time you can choose between ALSA, JACK, OSS and more. Below you see a box which offers controls to setup the selected audio-interface. Hier können Sie Ihre bevorzugte Audio-Schnittstelle auswählen. Abhängig von der Konfiguration Ihres Systems während der Compilierung können Sie zwischen ALSA, JACK, OSS und mehr wählen. Unterhalb sehen Sie eine Box, welche Kontrollelemente anbietet, um die gewählte Audio-Schnittstelle einzurichten. - + Here you can select your preferred MIDI-interface. Depending on the configuration of your system during compilation time you can choose between ALSA, OSS and more. Below you see a box which offers controls to setup the selected MIDI-interface. Hier können Sie Ihre bevorzugte MIDI-Schnittstelle auswählen. Abhängig von der Konfiguration Ihres Systems während der Compilierung können Sie zwischen ALSA, OSS und mehr wählen. Unterhalb sehen Sie eine Box, welche Kontrollelemente anbietet, um die gewählte MIDI-Schnittstelle einzurichten. - + Classical knob usability (move cursor around knob to change value) Klassische Knopf-Benutzbarkeit (Cursor um Knopf herum bewegen) - + Restart LMMS LMMS neustarten - + Please note that most changes won't take effect until you restart LMMS! Bitte beachten Sie, dass die meisten Änderungen erst wirksam werden, nachdem Sie LMMS neugestartet haben! GIMP-like windows (no MDI) - Fenster wie GIMP (kein MDI) + Fenster wie GIMP (kein MDI) Do not show wizard after up-/downgrade - Assistent nach Up-/Downgrade nicht anzeigen + Assistent nach Up-/Downgrade nicht anzeigen Do not show message after closing this dialog - Keine Meldung nach Schließen dieses Dialogs zeigen + Keine Meldung nach Schließen dieses Dialogs zeigen - + Directories Verzeichnisse - + LMMS working directory LMMS-Arbeitsverzeichnis - + VST-plugin directory VST-Plugin-Verzeichnis - + Choose LMMS working directory LMMS-Arbeitsverzeichnis wählen - + Choose your VST-plugin directory Wählen Sie Ihre VST-Plugin-Verzeichnis - + Performance settings Performance-Einstellungen - + UI effects vs. performance UI-Effekte vs. Performance - + Disable channel activity indicators Kanal-Aktivitäts-LEDs deaktivieren - + Only press keys on channel-piano manually Tasten in Kanal-Piano nur manuell drücken - + Frames: %1 Latency: %2 ms Frames: %1 Latenz: %2 ms - + Artwork directory Artwork-Verzeichnis - + Choose artwork-theme directory Artwork-Verzeichnis wählen - + Display volume as dBV Lautstärke als in dBV anzeigen - + FL Studio installation directory FL Studio Installationsverzeichnis - + Choose FL Studio installation directory FL Studio Installationsverzeichnis wählen - + LADSPA plugin directories LADSPA-Plugin-Verzeichnis - + STK rawwave directory STK RawWave-Verzeichnis - + Choose LADSPA plugin directory Wählen Sie Ihr LADSPA-Plugin-Verzeichnis - + Choose STK rawwave directory Wählen Sie Ihr STK-RawWave-Verzeichnis - + SMP support SMP-Unterstützung - + Parallelizing level Parallelisierungs-Level @@ -4805,7 +5063,7 @@ Latenz: %2 ms SMP-Level - + If you have a machine with more then one processor (e.g. dual-core systems) you should use a parallelizing-level above 1 which means that LMMS will try to split up sound-processing into several threads which should should be run on several cores by the underlaying operating-system. Please note that in some cases parallelizing won't work with small buffer-sizes. If you experience problems (i.e. lot of xruns), try to increase buffer-size. Wenn Sie einen Computer mit mehr als einem Prozessor besitzen (z.B. Dual-Core-Systeme), sollten Sie einen Parallelisierungs-Level größer 1 wählen. Das bedeutet, dass LMMS versuchen wird, die Sound-Verarbeitung in mehrere Threads aufzuteilen, welche dann vom Betriebsystem auf unterschiedlichen Kernen ausgeführt werden sollten. @@ -4814,53 +5072,78 @@ Bitte beachten Sie, dass in einigen Fällen Parallelisierung nicht mit kleinen P Do not compress project files per default - Projektdateien nicht standardmäßig komprimieren + Projektdateien nicht standardmäßig komprimieren + + + + Enable tooltips + Tooltips aktivieren + + + + Multiple Document Interface + MDI-Oberfläche + + + + Show wizard after up-/downgrade + Assistent nach Up-/Downgrade anzeigen + + + + Show restart warning after changing settings + Meldung nach Schließen dieses Dialogs zeigen + + + + Compress project files per default + Projektdateien standardmäßig komprimieren setupWidget - + ALSA (Advanced Linux Sound Architecture) ALSA (Advanced Linux Sound Architecture) - + Dummy (no sound output) Dummy (keine Sound-Ausgabe) - + OSS (Open Sound System) OSS (Open Sound System) - + SDL (Simple DirectMedia Layer) SDL (Simple DirectMedia Layer) - + ALSA Raw-MIDI (Advanced Linux Sound Architecture) ALSA Raw-MIDI (Advanced Linux Sound Architecture) - + OSS Raw-MIDI (Open Sound System) OSS Raw-MIDI (Open Sound System) - + Dummy (no MIDI support) Dummy (keine MIDI-Unterstützung) - + ALSA-Sequencer (Advanced Linux Sound Architecture) ALSA-Sequencer (Advanced Linux Sound Architecture) - + JACK (JACK Audio Connection Kit) JACK (JACK Audio Connection Kit) @@ -4868,119 +5151,119 @@ Bitte beachten Sie, dass in einigen Fällen Parallelisierung nicht mit kleinen P songEditor - + Click here, if you want to stop playing of your song. The song-position-marker will be set to the start of your song. Klicken Sie hier, wenn Sie das Abspielen des Songs stoppen wollen. Der Song-Positions-Marker wird automatisch auf den Song-Anfang zurückgesetzt. - + untitled unbenannt - + File already exists Datei existiert bereits - + Could not open file Konnte Datei nicht öffnen - + Error in multimedia-project Fehler im Multimedia-Projekt - + The multimedia-project %1 seems to contain errors. LMMS will try its best to recover as much as possible data from this file. Das Multimedia-Projekt %1 scheint Fehler zu beinhalten. LMMS wird versuchen, so viel wie möglich Daten aus dieser Datei wiederherzustellen. - + Could not write file Konnte Datei nicht schreiben - + Song-Editor Song-Editor - + The file "%1" already exists. Do you want to overwrite it? Die Datei "%1" existiert bereits. Wollen Sie diese überschreiben? - + Click here, if you want to play your whole song. Playing will be started at the song-position-marker (green). You can also move it while playing. Klicken Sie hier, wenn Sie Ihren ganzen Song abspielen wollen. Das Abspielen wird am Song-Positions-Marker (grün) gestartet. Sie können diesen auch während des Abspielens verschieben. - + Play song (Space) Song abspielen (Leertaste) - + Stop song (Space) Abspielen des Songs stoppen (Leertaste) - + The tempo of a song is specified in beats per minute (BPM). If you want to change the tempo of your song, change this value. Every tact has four beats, so the tempo in BPM specifies, how many tacts / 4 should be played within a minute (or how many tacts should be played within four minutes). Das Tempo eines Liedes wird in Beats pro Minute (BPM) angegeben. Wenn Sie das Tempo Ihres Songs ändern wollen, ändern Sie diesen Wert. Jeder Takt hat vier Schläge (Beats), das Tempo sagt also, wie viele Takte / 4 innerhalb einer Minute gespielt werden sollen (bzw. wie viele Takte innerhalb von vier Minuten gespielt werden sollen). - + master pitch Master-Tonhöhe - + tempo of song Geschwindigkeit des Songs - + Add beat/bassline Beat/Bassline hinzufügen - + Add sample-track Sample-Spur hinzufügen - + Project NOT saved. Projekt NICHT gespeichert. - + The file %1 already exists. Do you want to overwrite it? Die Datei %1 existiert bereits. Wollen Sie diese überschreiben? - + Select file for project-export... Datei für Projekt-Export wählen... Project not saved - Projekt nicht gespeichert + Projekt nicht gespeichert The current project was modified since last saving. Do you want to save it now? - Das aktuelle Projekt wurde seit dem letzten Speichern geändert. Wollen Sie es jetzt speichern? + Das aktuelle Projekt wurde seit dem letzten Speichern geändert. Wollen Sie es jetzt speichern? - + Import file Datei importieren @@ -4990,114 +5273,132 @@ Wollen Sie diese überschreiben? MIDI-Dateien (*.mid) - + TEMPO/BPM TEMPO/BPM - + Could not open file %1. You probably have no rights to read this file. Please make sure you have at least read-access to the file and try again. Die Datei %1 konnte nicht geöffnet werden. Sie besitzen wahrscheinlich keine Rechte, diese Datei zu lesen. Bitte stellen Sie sicher, dass Sie wenigstens Leserechte auf die Datei besitzen und versuchen es erneut. - + High quality mode High-Quality-Modus - + Project saved Projekt gespeichert - + The project %1 is now saved. Das Projekt %1 ist nun gespeichert. - + Could not write file %1. You probably are not permitted to write to this file. Please make sure you have write-access to the file and try again. Konnte die Datei %1 nicht schreiben. Sie sind möglicherweise nicht berechtigt, in diese Datei zu schreiben. Bitte stellen Sie sicher, dass Sie Schreibrechte auf diese Datei besitzen und versuchen es erneut. - + master volume Master-Lautstärke - + Value: %1% Wert: %1% - + Value: %1 semitones Wert: %1 Halbtöne - + Master volume Master-Lautstärke - + Master pitch Master-Tonhöhe - + The project %1 was not saved! Das Projekt %1 wurde nicht gespeichert! - + Draw mode Zeichen-Modus - + Edit mode (select and move) Editier-Modus (auswählen und verschieben) - + Auto limiter Autolimiter - + Tempo Tempo + + stereoEnhancerControlDialog + + + Width + Weite + + + + WIDE + WEITE + + + + Width: + Weite: + + surroundArea - + click to where this channel should be audible dorthin klicken, wo dieser Kanal zu hören sein soll - + Surround area X Surround-Area X - + Surround area Y Surround-Area Y - + Open &X in automation editor &X im Automation-Editor öffnen - + Open &Y in automation editor &Y im Automation-Editor öffnen @@ -5105,7 +5406,7 @@ Bitte stellen Sie sicher, dass Sie Schreibrechte auf diese Datei besitzen und ve tabWidget - + Settings for %1 Einstellungen für %1 @@ -5113,122 +5414,122 @@ Bitte stellen Sie sicher, dass Sie Schreibrechte auf diese Datei besitzen und ve tempoSyncKnob - + Tempo Sync Tempo-Synchronisation - + &Reset (%1%2) &Zurücksetzen (%1%2) - + &Copy value (%1%2) Wert &kopieren (%1%2) - + &Paste value (%1%2) Wert &einfügen (%1%2) - + No Sync Keine Synchronisation - + Eight beats Acht Schläge - + Whole note Ganze Note - + Half note Halbe Note - + Quarter note Viertelnote - + 8th note Achtelnote - + 16th note 16tel Note - + 32nd note 32tel Note - + Connect to MIDI-device Mit MIDI-Gerät verbinden - + &Help &Hilfe - + Synced to Eight Beats Mit acht Schlägen synchronisiert - + Synced to Whole Note Mit ganzer Note synchronisiert - + Synced to Half Note Mit halber Note synchronisiert - + Synced to Quarter Note Mit Viertelnote synchronisiert - + Synced to 8th Note Mit Achtelnote synchronisiert - + Synced to 16th Note Mit 16tel Note synchronisiert - + Synced to 32nd Note Mit 32tel Note synchronisiert - + &Open in automation editor Im Aut&omation-Editor öffnen - + Custom... Benutzerdefiniert... - + Custom Benutzerdefiniert @@ -5236,37 +5537,37 @@ Bitte stellen Sie sicher, dass Sie Schreibrechte auf diese Datei besitzen und ve timeLine - + Enable/disable auto-scrolling Automatisches Scrollen aktivieren/deaktivieren - + Enable/disable loop-points Loop-Punkte aktivieren/deaktivieren - + After stopping go back to begin Nach Stop zum Anfang zurückkehren - + After stopping go back to position at which playing was started Nach Stop zur Position zurückkehren, an der es los ging - + After stopping keep position Nach Stop Position beibehalten - + Hint Tipp - + Press <Ctrl> to disable magnetic loop-points. Drücken Sie <Strg> um magnetische Loop-Punkte zu deaktivieren. @@ -5274,17 +5575,17 @@ Bitte stellen Sie sicher, dass Sie Schreibrechte auf diese Datei besitzen und ve trackContainer - + Loading project... Lade Projekt... - + Cancel Abbrechen - + Please wait... Bitte warten... @@ -5308,12 +5609,12 @@ Please make sure you have write-permission to the file and the directory contain Bitte stellen Sie sicher, dass Sie Schreibrechte auf diese Datei und das Verzeichnis, das diese Datei enthält, besitzen und versuchen es erneut! - + Importing MIDI-file... Importiere MIDI-Datei... - + Couldn't import file Konnte Datei nicht importieren @@ -5325,26 +5626,26 @@ You should convert this file into a format supported by LMMS using another softw Sie sollten diese Datei mit Hilfe einer anderen Software in ein Format konvertieren, das von LMMS unterstützt wird. - + Couldn't open file Konnte Datei nicht öffnen - + Couldn't open file %1 for reading. Please make sure you have read-permission to the file and the directory containing the file and try again! Konnte Datei %1 nicht zum Lesen öffnen. Bitte stellen Sie sicher, dass Sie Lese-Rechte auf diese Datei sowie das Verzeichnis besitzen und probieren es erneut! - + Couldn't find a filter for importing file %1. You should convert this file into a format supported by LMMS using another software. Es konnte kein Filter gefunden werden, um die Datei %1 zu importieren. Sie sollten diese Datei mit Hilfe anderer Software in ein von LMMS unterstützes Format umwandeln. - + Importing FLP-file... Importiere FLP-Datei... @@ -5352,57 +5653,57 @@ Sie sollten diese Datei mit Hilfe anderer Software in ein von LMMS unterstützes trackContentObject - + Cut Ausschneiden - + Copy Kopieren - + Paste Einfügen - + Delete (middle mousebutton) Löschen (mittlere Maustaste) - + Current position Aktuelle Position - + Current length Aktuelle Länge - + %1:%2 (%3:%4 to %5:%6) %1:%2 (%3:%4 bis %5:%6) - + Hint Tipp - + Press <Ctrl> for free positioning. Drücken Sie <Strg> für freie Positionierung. - + Press <Ctrl> for free resizing. Drücken Sie <Strg> für freie Größenänderung. - + Mute/unmute (<Ctrl> + middle click) Stumm/Laut schalten (<Strg> + Mittelklick) @@ -5410,17 +5711,17 @@ Sie sollten diese Datei mit Hilfe anderer Software in ein von LMMS unterstützes trackOperationsWidget - + Clone this track Diese Spur klonen - + Remove this track Diese Spur entfernen - + With this switch you can either mute this track or mute all other tracks. By clicking left, this track is muted. This is useful, if you only want to listen to the other tracks without changing this track and loosing information. When you click right on this switch, all other tracks will be muted. This is useful, if you only want to listen to this track. @@ -5429,34 +5730,34 @@ Wenn Sie links klicken, wird diese Spur stummgeschaltet. Das ist nützlich, wenn Wenn Sie rechts klicken, werden alle anderen Spuren stumm geschaltet. Das ist nützlich, wenn Sie nur diese Spur hören wollen. - + left click = mute this track right click = mute all other tracks (solo) Klick links = diese Spur stummschalten Klick rechts = alle anderen Spuren stummschalten (Solo) - + Press <Ctrl> while clicking on move-grip to begin a new drag'n'drop-action. Drücken Sie <Strg> während des Klicks auf den Verschiebe-Griff, um eine neue Drag'n'Drop-Aktion zu beginnen. - + Actions for this track Aktionen für dise Spur - + Mute Stumm - + Enable automation Automation aktivieren - + Disable automation Automation deaktivieren @@ -5464,227 +5765,227 @@ Klick rechts = alle anderen Spuren stummschalten (Solo) tripleOscillator - + semitones Halbtöne - + cents Cent - + degrees Grad - + Click here if you want a sine-wave for current oscillator. Klicken Sie hier, wenn Sie eine Sinus-Schwingung für den aktuellen Oszillator haben wollen. - + Click here if you want a triangle-wave for current oscillator. Klicken Sie hier, wenn Sie eine Dreiecks-Schwingung für den aktuellen Oszillator haben wollen. - + Click here if you want a saw-wave for current oscillator. Klicken Sie hier, wenn Sie eine Sägezahn-Schwingung für den aktuellen Oszillator haben wollen. - + Click here if you want a square-wave for current oscillator. Klicken Sie hier, wenn Sie eine Rechteck-Schwingung für den aktuellen Oszillator haben wollen. - + Click here if you want a white-noise for current oscillator. Klicken Sie hier, wenn Sie weißes Rauschen für den aktuellen Oszillator haben wollen. - + Click here if you want a user-defined wave-shape for current oscillator. Klicken Sie hier, wenn Sie eine selbst definierte Wellenform für den aktuellen Oszillator haben wollen. - + Click here if you want a moog-saw-wave for current oscillator. Klicken Sie hier, wenn Sie eine Moog-Sägezahn-Schwingung für den aktuellen Oszillator haben wollen. - + Click here if you want an exponential wave for current oscillator. Klicken Sie hier, wenn Sie eine Exponential-Schwingung für den aktuellen Oszillator haben wollen. - + use frequency modulation for modulating oscillator 2 with oscillator 1 Frequenzmodulation benutzen, um Oszillator 2 mit Oszillator 1 zu modulieren - + use amplitude modulation for modulating oscillator 2 with oscillator 1 Amplitudenmodulation benutzen, um Oszillator 2 mit Oszillator 1 zu modulieren - + mix output of oscillator 1 & 2 Mische Ausgang von Oszillator 1 & 2 - + synchronize oscillator 1 with oscillator 2 Synchronisiere Oszillator 1 mit Oszillator 2 - + use frequency modulation for modulating oscillator 3 with oscillator 2 Frequenzmodulation benutzen, um Oszillator 3 mit Oszillator 2 zu modulieren - + use amplitude modulation for modulating oscillator 3 with oscillator 2 Amplitudenmodulation benutzen, um Oszillator 3 mit Oszillator 2 zu modulieren - + mix output of oscillator 2 & 3 Mische Ausgang von Oszillator 2 & 3 - + synchronize oscillator 2 with oscillator 3 Synchronisiere Oszillator 2 mit Oszillator 3 - + Osc %1 volume Oszillator %1 Lautstärke - + Osc %1 volume: Oszillator %1 Lautstärke: - + With this knob you can set the volume of oscillator %1. When setting a value of 0 the oscillator is turned off. Otherwise you can hear the oscillator as loud as you set it here. Mit diesem Knopf können Sie die Lautstärke von Oszillator %1 setzen. Wenn Sie einen Wert von 0 setzen, wird der Oszillator ausgeschaltet. Ansonsten können Sie ihn so laut hören, wie Sie es hier einstellen. - + Osc %1 panning Oszillator %1 Balance - + Osc %1 panning: Oszillator %1 Balance: - + With this knob you can set the panning of the oscillator %1. A value of -100 means 100% left and a value of 100 moves oscillator-output right. Mit diesem Knopf können Sie die Balance von Oszillator %1 setzen. Ein Wert von -100 heißt 100% links und ein Wert von 100 verschiebt den Oszillator-Ausgang nach rechts. - + Osc %1 coarse detuning Oszillator %1 Grob-Verstimmung - + Osc %1 coarse detuning: Oszillator %1 Grob-Verstimmung: - + With this knob you can set the coarse detuning of oscillator %1. You can detune the oscillator 12 semitones (1 octave) up and down. This is useful for creating sounds with a chord. Mit diesem Knopf können Sie die grobe Verstimmung von Oszillator %1 setzen. Sie können den Oszillator 12 Halbtöne (1 Oktave) nach oben und unten verstimmen. Das ist nützlich, wenn Sie einen Sound mit einem Akkord erstellen möchten. - + Osc %1 fine detuning left Oszillator %1 Fein-Verstimmung links - + Osc %1 fine detuning left: Oszillator %1 Fein-Verstimmung links: - + With this knob you can set the fine detuning of oscillator %1 for the left channel. The fine-detuning is ranged between -100 cents and +100 cents. This is useful for creating "fat" sounds. Mit diesem Knopf können Sie die Fein-Verstimmung von Oszillator %1 für den linken Kanal einstellen. Die Fein-Verstimmung liegt zwischen -100 Cent und +100 Cent. Das ist nützlich, um "fette" Sounds zu erzeugen. - + Osc %1 fine detuning right Oszillator %1 Fein-Verstimmung rechts - + Osc %1 fine detuning right: Oszillator %1 Fein-Verstimmung rechts: - + With this knob you can set the fine detuning of oscillator %1 for the right channel. The fine-detuning is ranged between -100 cents and +100 cents. This is useful for creating "fat" sounds. Mit diesem Knopf können Sie die Fein-Verstimmung von Oszillator %1 für den rechten Kanal einstellen. Die Fein-Verstimmung liegt zwischen -100 Cent und +100 Cent. Das ist nützlich, um "fette" Sounds zu erzeugen. - + Osc %1 phase-offset Oszillator %1 Phasen-Verschiebung - + Osc %1 phase-offset: Oszillator %1 Phasen-Verschiebung: - + With this knob you can set the phase-offset of oscillator %1. That means you can move the point within an oscillation where the oscillator begins to oscillate. For example if you have a sine-wave and have a phase-offset of 180 degrees the wave will first go down. It's the same with a square-wave. Mit diesem Knopf können Sie die Phasen-Verschiebung von Oszillator %1 setzen. Das heißt, Sie können den Punkt innerhalb einer Schwingung verschieben, an dem der Oszillator anfangen soll zu schwingen. Wenn Sie zum Beispiel eine Sinus-Welle haben und eine Phasen-Verschiebung von 180 Grad einstellen, wird die Welle zu erst runter gehen. Das gleiche trifft auch bei einer Rechteck-Welle zu. - + Osc %1 stereo phase-detuning Oszillator %1 Stereo Phasen-Verschiebung - + Osc %1 stereo phase-detuning: Oszillator %1 Stereo Phasen-Verschiebung: - + With this knob you can set the stereo phase-detuning of oscillator %1. The stereo phase-detuning specifies the size of the difference between the phase-offset of left and right channel. This is very good for creating wide stereo-sounds. Mit diesem Knopf können Sie die Stereo Phasen-Verschiebung von Oszillator %1 setzen. Die Stereo Phasen-Verschiebung gibt die Größe der Differenz zwischen den Phasen-Verschiebungen zwischen dem linken und rechten Kanal an. Das ist sehr gut, um großräumig-klingende Stereo-Sounds zu erzeugen. - + use phase modulation for modulating oscillator 2 with oscillator 1 Phasenmodulation benutzen, um Oszillator 2 mit Oszillator 1 zu modulieren - + Modulation type 1 Modulationsart 1 - + use phase modulation for modulating oscillator 3 with oscillator 2 Phasenmodulation benutzen, um Oszillator 3 mit Oszillator 2 zu modulieren - + Modulation type 2 Modulationsart 2 - + Osc %1 wave shape Oszillator %1 Wellenform @@ -5692,74 +5993,74 @@ Klick rechts = alle anderen Spuren stummschalten (Solo) vestigeInstrument - + Open other VST-plugin - + Click here, if you want to open another VST-plugin. After clicking on this button, a file-open-dialog appears and you can select your file. Klicken Sie hier, wenn Sie ein anderes VST-Plugin öffnen möchten. Nachdem Sie auf diesen Button geklickt haben, erscheint ein Datei-öffnen-Dialog und Sie können Ihre Datei wählen. - + Open VST-plugin VST-Plugn öffnen - + DLL-files (*.dll) DLL-Dateien (*.dll) - + EXE-files (*.exe) EXE-Dateien (*.exe) - + No VST-plugin loaded Kein VST-Plugin geladen - + by von - + Show/hide VST-GUI Zeige/verstecke VST-GUI - + Click here to show or hide the graphical user interface (GUI) of your VST-plugin. Klicken Sie hier, um die grafische Oberfläche (GUI) Ihers VST-Plugins anzuzeigen bzw. zu verstecken. - + Failed loading VST-plugin Laden des VST-Plugins fehlgeschlagen - + The VST-plugin %1 could not be loaded for some reason. If it runs with other VST-software under Linux, please contact an LMMS-developer! Das VST-Plugin %1 konnte aus irgendeinem Grund nicht geladen werden. Wenn es mit anderer VST-software unter Linux funktioniert, kontaktieren Sie bitte einen LMMS-Entwickler! - + Loading plugin Lade Plugin - + Please wait while loading VST-plugin... Bitte warten, während das VST-Plugin geladen wird... - + Turn off all notes Alle Noten ausschalten @@ -5767,7 +6068,7 @@ Wenn es mit anderer VST-software unter Linux funktioniert, kontaktieren Sie bitt vibed - + The waveform editor provides control over the initial state or impulse that is used to start the string vibrating. The buttons to the right of the graph will initialize the waveform to the selected type. The '?' button will load a waveform from a file--only the first 128 samples will be loaded. The waveform can also be drawn in the graph. @@ -5784,147 +6085,147 @@ Der 'S'-Button glättet die Wellenform. Der 'N'-Button normalisiert die Wellenform. - + Volume Lautstärke - + Volume: Lautstärke: - + The 'V' knob sets the volume of the selected string. Der 'V'-Knopf setzt die Lautstärke der gewählten Saite. - + String stiffness Härte der Saite - + String stiffness: Härte der Saite: - + The 'S' knob sets the stiffness of the selected string. The stiffness of the string affects how long the string will ring out. The lower the setting, the longer the string will ring. Der 'S'-Knopf setzt die Härte der gewählten Saite. Die Härte der Saite beeinflusst deren Ausklang-Dauer. Je kleiner die Einstellung, desto länger klingt die Saite aus. - + Pick position Zupf-Position - + Pick position: Zupf-Position: - + The 'P' knob sets the position where the selected string will be 'picked'. The lower the setting the closer the pick is to the bridge. Der 'P'-Knopf bestimmt die Position, an der die Saite angezupft wird. Je kleiner die Einstellung, desto näher wird am Steg gezupft. - + Pickup position Abnehmer-Position - + Pickup position: Abnehmer-Position: - + The 'PU' knob sets the position where the vibrations will be monitored for the selected string. The lower the setting, the closer the pickup is to the bridge. Der 'PU'-Knopf bestimmt die Position, an der die Schwingungen an der gewählten Saite abgenommen werden. Je kleiner die Einstellung, desto näher ist der Abnehmer am Steg. - + Pan Balance - + Pan: Balance: - + The Pan knob determines the location of the selected string in the stereo field. Der Balance-Knopf bestimmt den Ort der gewählten Saite im Stereo-Raum. - + Detune Verstimmung - + Detune: Verstimmung: - + The Detune knob modifies the pitch of the selected string. Settings less than zero will cause the string to sound flat. Settings greater than zero will cause the string to sound sharp. Der Verstimmungs-Knopf verändert die Tonhöhe der gewählten Saite. Einstellungen kleiner als 0 lassen die Saite flacher klingen, während Werte über 0 zu einem eher scharfen Klang führen. - + Fuzziness Unschärfe - + Fuzziness: Unschärfe: - + The Slap knob adds a bit of fuzz to the selected string which is most apparent during the attack, though it can also be used to make the string sound more 'metallic'. Der Unschärfe-Knopf fügt dem Klang der Saite etwas 'Fuzz' hinzu, welcher hauptsächlich während des Anschlages zum Tragen kommt, wenngleich er auch genutzt werden kann, um den Klang etwas metallischer zu gestalten. - + Length Länge - + Length: Länge: - + The Length knob sets the length of the selected string. Longer strings will both ring longer and sound brighter, however, they will also eat up more CPU cycles. Der Länge-Knopf bestimmt die Länge der gewählten Saite. Längere Saiten klingen länger und klingen heller, wobei sie gleichzeitig auch mehr CPU-Leistung fressen. - + Impulse or initial state Impuls oder Grundstellung - + The 'Imp' selector determines whether the waveform in the graph is to be treated as an impulse imparted to the string by the pick or the initial state of the string. Mit dem 'Imp'-Knopf legen Sie fest, ob die Wellenform in diesem Graph als Impuls zum Anzupfen der Saite oder als Grundstellung für die Saite genutzt werden soll. - + The Octave selector is used to choose which harmonic of the note the string will ring at. For example, '-2' means the string will ring two octaves below the fundamental, 'F' means the string will ring at the fundamental, and '6' means the string will ring six octaves above the fundamental. Mit dem Oktaven-Wähler kann der Oktavenversatz gegenüber der Note verändert werden. So meint beispielsweise eine Einstellung von '-2', dass die Saite zwei Oktaven unterhalb des Grundtons ('F') schwingen wird und '6' dementsprechend 6 Oktaven über dem Grundton. - + The String selector is used to choose which string the controls are editting. A Vibed instrument can contain up to nine independently vibrating strings. The LED in the lower right corner of the waveform editor indicates whether the selected string is active. Der Saiten-Wähler bestimmt die derzeit bearbeitete Saite. Ein Vibed-Instrument kann aus bis zu neun voneinander unabhängig schwingenden Saiten bestehen. Die LED in der Ecke rechts unterhalb der Wellenform gibt an, ob die gewählte Saite aktiv ist. - + Vibed models up to nine independently vibrating strings. The 'String' selector allows you to choose which string is being edited. The 'Imp' selector chooses whether the graph represents an impulse or the initial state of the string. The 'Octave' selector chooses which harmonic the string should vibrate at. The graph allows you to control the initial state or impulse used to set the string in motion. @@ -5949,20 +6250,35 @@ Der Länge-Knopf bestimmt die Länge der Saite. Die LED rechts unterhalb der Wellenform gibt an, ob die Saite aktiviert ist. - + &Help &Hilfe - + Impulse Impuls + + + Impulse Editor + Impuls-Editor + + + + Octave + Okatve + + + + String + Saite + visualizationWidget - + click to enable/disable visualization of master-output klicken, um Visualisierung des Masterausgangs an-/auszuschalten @@ -5970,12 +6286,12 @@ Die LED rechts unterhalb der Wellenform gibt an, ob die Saite aktiviert ist. volumeKnob - + Please enter a new value between -96.0 dBV and 6.0 dBV: Bitte geben Sie einen Wert zwischen -96.0 dBV und 6.0 dBV ein: - + Please enter a new value between %1 and %2: Bitte geben Sie einen neuen Wert zwischen %1 und %2 ein: From 121667b0a0e010e9d34f91bbbbe56197974489d2 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 14 Jan 2008 20:54:25 +0000 Subject: [PATCH 23/87] removed single-source-compile-feature, made FASTCALL-usage optional for the time being git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@662 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 4 ++++ configure.in | 53 +++++++++++++++++++++++++++++----------------------- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4e94565ef..06f4deedc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2008-01-14 Tobias Doerffel + * configure.in: + - removed single-source-compile-feature + - made FASTCALL-usage optional for the time being + * data/locale/de.ts: * data/locale/de.qm: updated German localization diff --git a/configure.in b/configure.in index e47c8f508..a34398793 100644 --- a/configure.in +++ b/configure.in @@ -2,8 +2,8 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.50) -AC_INIT(lmms, 0.4.0-svn20080106-mv, lmms-devel/at/lists/dot/sf/dot/net) -AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080106-mv) +AC_INIT(lmms, 0.4.0-svn20080114-mv, lmms-devel/at/lists/dot/sf/dot/net) +AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080114-mv) AM_CONFIG_HEADER(config.h) @@ -453,33 +453,40 @@ else fi # check whether to disable single-source-compile -AC_MSG_CHECKING([whether to enable single-source-compile]) +#AC_MSG_CHECKING([whether to enable single-source-compile]) # AH_TEMPLATE(SINGLE_SOURCE_COMPILE, [Define if you want to enable single-source-compile.]) -AC_ARG_ENABLE([ssc], - AS_HELP_STRING([--enable-ssc], - [enable single-source-compile]), [ENABLE_SSC=$enableval]) -if test "x$ENABLE_SSC" = "xyes" ; then - AC_MSG_RESULT(yes) - # AC_DEFINE(SINGLE_SOURCE_COMPILE) - CXXFLAGS="$CXXFLAGS -DSINGLE_SOURCE_COMPILE" -else - AC_MSG_RESULT(no) -fi +#AC_ARG_ENABLE([ssc], +# AS_HELP_STRING([--enable-ssc], +# [enable single-source-compile]), [ENABLE_SSC=$enableval]) +#if test "x$ENABLE_SSC" = "xyes" ; then +# AC_MSG_RESULT(yes) +# # AC_DEFINE(SINGLE_SOURCE_COMPILE) +# CXXFLAGS="$CXXFLAGS -DSINGLE_SOURCE_COMPILE" +#else +# AC_MSG_RESULT(no) +#fi # check whether compiler of current platform supports attribute regparm(x) -AC_MSG_CHECKING([whether we can use function-attribute regparm(x) on current platform]) -AH_TEMPLATE(FASTCALL, [Define to any attribute, speeding up function-calls]) -AC_RUN_IFELSE([ int __attribute__((regparm(3))) foo( int a, int b, int c ) - { return( a=b=c ); } - int __attribute__((regparm(3))) main( void ) - { return( foo(2,1,0) ); }], - AC_MSG_RESULT(yes) - AC_DEFINE(FASTCALL, [__attribute__((regparm(3)))]), - AC_MSG_RESULT(no) +AC_ARG_ENABLE([fastcall], + AS_HELP_STRING([--enable-fastcall], + [enable fastcall (regparm-attribute)]), [ENABLE_FASTCALL=$enableval]) +if test "x$ENABLE_FASTCALL" = "xyes" ; then + AC_MSG_CHECKING([whether we can use function-attribute regparm(x) on current platform]) + AH_TEMPLATE(FASTCALL, [Define to any attribute, speeding up function-calls]) + AC_RUN_IFELSE([ int __attribute__((regparm(3))) foo( int a, int b, int c ) + { return( a=b=c ); } + int __attribute__((regparm(3))) main( void ) + { return( foo(2,1,0) ); }], + AC_MSG_RESULT(yes) + AC_DEFINE(FASTCALL, [__attribute__((regparm(3)))]), + AC_MSG_RESULT(no) + AC_DEFINE_UNQUOTED(FASTCALL,[]) + ) +else AC_DEFINE_UNQUOTED(FASTCALL,[]) - ) +fi AC_MSG_CHECKING([whether floorf is known by compiler]) From add39dffbdc62083f8b7bae44fcd3cc77479373c Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 14 Jan 2008 21:16:04 +0000 Subject: [PATCH 24/87] copyright-extensions git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@663 0778d3d1-df1d-0410-868b-ea421aaaa00d --- src/core/effect_control_dialog.cpp | 2 +- src/core/envelope_and_lfo_widget.cpp | 2 +- src/core/import_filter.cpp | 2 +- src/core/main_window.cpp | 2 +- src/core/plugin.cpp | 2 +- src/core/sample_play_handle.cpp | 2 +- src/tracks/sample_track.cpp | 2 +- src/widgets/automatable_button.cpp | 2 +- src/widgets/combobox.cpp | 2 +- src/widgets/knob.cpp | 2 +- src/widgets/lcd_spinbox.cpp | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/core/effect_control_dialog.cpp b/src/core/effect_control_dialog.cpp index 175844ee4..48b7c84e0 100644 --- a/src/core/effect_control_dialog.cpp +++ b/src/core/effect_control_dialog.cpp @@ -4,7 +4,7 @@ * effect_control_dialog.cpp - base-class for effect-dialogs for displaying * and editing control port values * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * diff --git a/src/core/envelope_and_lfo_widget.cpp b/src/core/envelope_and_lfo_widget.cpp index 202b9c9bc..9fe87b7e1 100644 --- a/src/core/envelope_and_lfo_widget.cpp +++ b/src/core/envelope_and_lfo_widget.cpp @@ -4,7 +4,7 @@ * envelope_and_lfo_widget.cpp - widget which is m_used by envelope/lfo/filter- * tab of channel-window * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * diff --git a/src/core/import_filter.cpp b/src/core/import_filter.cpp index ed23273ca..640b26e4d 100644 --- a/src/core/import_filter.cpp +++ b/src/core/import_filter.cpp @@ -3,7 +3,7 @@ /* * import_filter.cpp - base-class for all import-filters (MIDI, FLP etc) * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * diff --git a/src/core/main_window.cpp b/src/core/main_window.cpp index 443a34823..34d9e98d3 100644 --- a/src/core/main_window.cpp +++ b/src/core/main_window.cpp @@ -3,7 +3,7 @@ /* * main_window.cpp - implementation of LMMS-main-window * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * diff --git a/src/core/plugin.cpp b/src/core/plugin.cpp index aa8070432..5ced487f1 100644 --- a/src/core/plugin.cpp +++ b/src/core/plugin.cpp @@ -3,7 +3,7 @@ /* * plugin.cpp - implementation of plugin-class including plugin-loader * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * diff --git a/src/core/sample_play_handle.cpp b/src/core/sample_play_handle.cpp index 6e5bbdd8d..b58a269f1 100644 --- a/src/core/sample_play_handle.cpp +++ b/src/core/sample_play_handle.cpp @@ -3,7 +3,7 @@ /* * sample_play_handle.cpp - implementation of class samplePlayHandle * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * diff --git a/src/tracks/sample_track.cpp b/src/tracks/sample_track.cpp index 204c99f4f..b87373639 100644 --- a/src/tracks/sample_track.cpp +++ b/src/tracks/sample_track.cpp @@ -4,7 +4,7 @@ * sample_track.cpp - implementation of class sampleTrack, a track which * provides arrangement of samples * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * diff --git a/src/widgets/automatable_button.cpp b/src/widgets/automatable_button.cpp index 7b04d089d..e88c0c021 100644 --- a/src/widgets/automatable_button.cpp +++ b/src/widgets/automatable_button.cpp @@ -4,7 +4,7 @@ * automatable_button.cpp - implementation of class automatableButton and * automatableButtonGroup * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * diff --git a/src/widgets/combobox.cpp b/src/widgets/combobox.cpp index dadf702de..8df63299a 100644 --- a/src/widgets/combobox.cpp +++ b/src/widgets/combobox.cpp @@ -3,7 +3,7 @@ /* * combobox.cpp - implementation of LMMS-combobox * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * diff --git a/src/widgets/knob.cpp b/src/widgets/knob.cpp index 569a2145e..6b6e681a6 100644 --- a/src/widgets/knob.cpp +++ b/src/widgets/knob.cpp @@ -6,7 +6,7 @@ * This file is partly based on the knob-widget of the Qwt Widget Library by * Josef Wilgen. * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * diff --git a/src/widgets/lcd_spinbox.cpp b/src/widgets/lcd_spinbox.cpp index 6a8105909..abd3e2673 100644 --- a/src/widgets/lcd_spinbox.cpp +++ b/src/widgets/lcd_spinbox.cpp @@ -3,7 +3,7 @@ /* * lcd_spinbox.cpp - class lcdSpinBox, an improved QLCDNumber * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * From 382d7d44b0fd4daab296eb539f0a4e0dde444c1f Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 14 Jan 2008 23:10:53 +0000 Subject: [PATCH 25/87] split off effectControlDialog into effectControlDialog and effectControls, made work with M/V as well as rewritten effect-framework, fixed bug in songEditor-engine git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@664 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 24 ++++ Makefile.am | 1 + include/dummy_effect.h | 70 +++++---- include/effect.h | 4 +- include/effect_control_dialog.h | 15 +- include/effect_controls.h | 68 +++++++++ plugins/bass_booster/Makefile.am | 4 +- plugins/bass_booster/bass_booster.cpp | 3 +- plugins/bass_booster/bass_booster.h | 20 +-- .../bassbooster_control_dialog.cpp | 133 +++--------------- .../bass_booster/bassbooster_control_dialog.h | 35 +---- plugins/bass_booster/bassbooster_controls.cpp | 103 ++++++++++++++ plugins/bass_booster/bassbooster_controls.h | 79 +++++++++++ src/core/effect.cpp | 11 +- src/core/effect_control_dialog.cpp | 11 +- src/core/song_editor.cpp | 2 + src/widgets/effect_view.cpp | 5 +- 17 files changed, 381 insertions(+), 207 deletions(-) create mode 100644 include/effect_controls.h create mode 100644 plugins/bass_booster/bassbooster_controls.cpp create mode 100644 plugins/bass_booster/bassbooster_controls.h diff --git a/ChangeLog b/ChangeLog index 06f4deedc..311efdd09 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,29 @@ 2008-01-14 Tobias Doerffel + * plugins/bass_booster/bassbooster_controls.h: + * plugins/bass_booster/bass_booster.cpp: + * plugins/bass_booster/bassbooster_control_dialog.cpp: + * plugins/bass_booster/Makefile.am: + * plugins/bass_booster/bassbooster_controls.cpp: + * plugins/bass_booster/bass_booster.h: + * plugins/bass_booster/bassbooster_control_dialog.h: + made work with M/V as well as rewritten effect-framework + + * include/effect.h: + * include/effect_control_dialog.h: + * include/dummy_effect.h: + * include/effect_controls.h: + * src/widgets/effect_view.cpp: + * src/core/effect_control_dialog.cpp: + * src/core/effect.cpp: + * Makefile.am: + split off effectControlDialog into effectControlDialog and + effectControls + + * src/core/song_editor.cpp: + also connect to dataUnchanged()-signal of tempo-model in order to + setup everything correct by connected slot + * configure.in: - removed single-source-compile-feature - made FASTCALL-usage optional for the time being diff --git a/Makefile.am b/Makefile.am index 02a96d0aa..ce9e32485 100644 --- a/Makefile.am +++ b/Makefile.am @@ -370,6 +370,7 @@ lmms_SOURCES = \ $(srcdir)/include/engine.h \ $(srcdir)/include/effect.h \ $(srcdir)/include/effect_chain.h \ + $(srcdir)/include/effect_controls.h \ $(srcdir)/include/effect_control_dialog.h \ $(srcdir)/include/effect_label.h \ $(srcdir)/include/effect_rack_view.h \ diff --git a/include/dummy_effect.h b/include/dummy_effect.h index 3e37ab955..3fadf49bc 100644 --- a/include/dummy_effect.h +++ b/include/dummy_effect.h @@ -27,14 +27,30 @@ #define _DUMMY_EFFECT_H #include "effect.h" +#include "effect_controls.h" #include "effect_control_dialog.h" class dummyEffectControlDialog : public effectControlDialog { public: - dummyEffectControlDialog( effect * _eff ) : - effectControlDialog( NULL, _eff ) + dummyEffectControlDialog( effectControls * _controls ) : + effectControlDialog( _controls ) + { + } + +} ; + + +class dummyEffectControls : public effectControls +{ +public: + dummyEffectControls( effect * _eff ) : + effectControls( _eff ) + { + } + + virtual ~dummyEffectControls() { } @@ -43,28 +59,6 @@ public: return( 0 ); } - inline virtual QString nodeName( void ) const - { - return( "dummycontrols" ); - } - -} ; - - - -class dummyEffect : public effect -{ -public: - inline dummyEffect( model * _parent ) : - effect( NULL, _parent, NULL ) - { - } - - inline virtual ~dummyEffect() - { - } - - inline virtual void saveSettings( QDomDocument &, QDomElement & ) { } @@ -75,13 +69,37 @@ public: inline virtual QString nodeName( void ) const { - return( "dummyeffect" ); + return( "dummycontrols" ); } - inline virtual effectControlDialog * createControlDialog( track * ) + virtual effectControlDialog * createView( void ) { return( new dummyEffectControlDialog( this ) ); } +} ; + + + +class dummyEffect : public effect +{ +public: + inline dummyEffect( model * _parent ) : + effect( NULL, _parent, NULL ), + m_controls( this ) + { + } + + inline virtual ~dummyEffect() + { + } + + inline virtual effectControls * getControls( void ) + { + return( &m_controls ); + } + +private: + dummyEffectControls m_controls; } ; diff --git a/include/effect.h b/include/effect.h index e7c51aa88..65d0120bb 100644 --- a/include/effect.h +++ b/include/effect.h @@ -40,7 +40,7 @@ class effectChain; -class effectControlDialog; +class effectControls; class track; @@ -161,7 +161,7 @@ public: return( m_key ); } - virtual effectControlDialog * createControlDialog( track * _track ) = 0; + virtual effectControls * getControls( void ) = 0; static effect * instantiate( const QString & _plugin_name, model * _parent, diff --git a/include/effect_control_dialog.h b/include/effect_control_dialog.h index 1d95eb488..b0a6a4f6d 100644 --- a/include/effect_control_dialog.h +++ b/include/effect_control_dialog.h @@ -29,22 +29,18 @@ #include #include "mv_base.h" -#include "types.h" -class effect; -class track; +class effectControls; class effectControlDialog : public QWidget, public modelView { Q_OBJECT public: - effectControlDialog( QWidget * _parent, effect * _eff ); + effectControlDialog( effectControls * _controls ); virtual ~effectControlDialog(); - virtual ch_cnt_t getControlCount( void ) = 0; - signals: void closed(); @@ -52,15 +48,10 @@ signals: protected: virtual void closeEvent( QCloseEvent * _ce ); - template - T * getEffect( void ) - { - return( dynamic_cast( m_effect ) ); - } private: - effect * m_effect; + effectControls * m_effectControls; } ; diff --git a/include/effect_controls.h b/include/effect_controls.h new file mode 100644 index 000000000..a339b7043 --- /dev/null +++ b/include/effect_controls.h @@ -0,0 +1,68 @@ +/* + * effect_controls.h - model for effect-controls + * + * Copyright (c) 2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _EFFECT_CONTROLS_H +#define _EFFECT_CONTROLS_H + +#include "mv_base.h" +#include "journalling_object.h" +#include "effect.h" + + +class track; +class effectControlDialog; + + +class effectControls : public journallingObject, public model +{ +public: + effectControls( effect * _eff ) : + journallingObject(), + model( _eff ), + m_effect( _eff ) + { + } + + virtual ~effectControls() + { + } + + virtual ch_cnt_t getControlCount( void ) = 0; + virtual effectControlDialog * createView( void ) = 0; + + +// template + effect * getEffect( void ) + { + return( m_effect ); + //return( dynamic_cast( m_effect ) ); + } + + +private: + effect * m_effect; + +} ; + +#endif diff --git a/plugins/bass_booster/Makefile.am b/plugins/bass_booster/Makefile.am index 3d699aeab..8d2efed35 100644 --- a/plugins/bass_booster/Makefile.am +++ b/plugins/bass_booster/Makefile.am @@ -11,7 +11,7 @@ AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="bassbooster" $(MOC) -o $@ $< -MOC_FILES = ./bassbooster_control_dialog.moc +MOC_FILES = ./bassbooster_controls.moc BUILT_SOURCES = $(MOC_FILES) ./embedded_resources.h EMBEDDED_RESOURCES = $(wildcard *png) @@ -30,6 +30,8 @@ pkglib_LTLIBRARIES= libbassbooster.la libbassbooster_la_SOURCES = bass_booster.cpp \ bass_booster.h \ + bassbooster_controls.cpp \ + bassbooster_controls.h \ bassbooster_control_dialog.cpp \ bassbooster_control_dialog.h diff --git a/plugins/bass_booster/bass_booster.cpp b/plugins/bass_booster/bass_booster.cpp index e8c9f4bce..1d4ddc22a 100644 --- a/plugins/bass_booster/bass_booster.cpp +++ b/plugins/bass_booster/bass_booster.cpp @@ -54,7 +54,8 @@ plugin::descriptor bassbooster_plugin_descriptor = bassBoosterEffect::bassBoosterEffect( model * _parent, const descriptor::subPluginFeatures::key * _key ) : effect( &bassbooster_plugin_descriptor, _parent, _key ), - m_bbFX( effectLib::fastBassBoost<>( 70.0f, 1.0f, 2.8f ) ) + m_bbFX( effectLib::fastBassBoost<>( 70.0f, 1.0f, 2.8f ) ), + m_bbControls( this ) { } diff --git a/plugins/bass_booster/bass_booster.h b/plugins/bass_booster/bass_booster.h index 108db8fa1..4f71820ea 100644 --- a/plugins/bass_booster/bass_booster.h +++ b/plugins/bass_booster/bass_booster.h @@ -33,7 +33,7 @@ #include "effect_lib.h" #include "engine.h" #include "main_window.h" -#include "bassbooster_control_dialog.h" +#include "bassbooster_controls.h" @@ -45,23 +45,25 @@ public: virtual ~bassBoosterEffect(); virtual bool FASTCALL processAudioBuffer( surroundSampleFrame * _buf, const fpp_t _frames ); - inline virtual QString nodeName( void ) const + + virtual effectControls * getControls( void ) { - return( "bassboostereffect" ); + return( &m_bbControls ); } - virtual inline effectControlDialog * createControlDialog( track * ) +/* inline virtual QString nodeName( void ) const { - return( new bassBoosterControlDialog( - NULL /*engine::getMainWindow()->workspace()*/, - this ) ); - } + return( "bassboostereffect" ); + }*/ private: effectLib::monoToStereoAdaptor > m_bbFX; - friend class bassBoosterControlDialog; + bassBoosterControls m_bbControls; + + friend class bassBoosterControls; + } ; diff --git a/plugins/bass_booster/bassbooster_control_dialog.cpp b/plugins/bass_booster/bassbooster_control_dialog.cpp index 93bc8cdb3..072933a12 100644 --- a/plugins/bass_booster/bassbooster_control_dialog.cpp +++ b/plugins/bass_booster/bassbooster_control_dialog.cpp @@ -1,7 +1,7 @@ /* * bassbooster_control_dialog.cpp - control-dialog for bassbooster-effect * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -25,126 +25,35 @@ #include -#include "bass_booster.h" -#include "knob.h" +#include "bassbooster_control_dialog.h" +#include "bassbooster_controls.h" -bassBoosterControlDialog::bassBoosterControlDialog( QWidget * _parent, - bassBoosterEffect * _eff ) : - effectControlDialog( _parent, _eff ), - m_effect( _eff ) +bassBoosterControlDialog::bassBoosterControlDialog( + bassBoosterControls * _controls ) : + effectControlDialog( _controls ) { QHBoxLayout * l = new QHBoxLayout( this ); - m_freqKnob = new knob( knobBright_26, this, tr( "Frequency" ), NULL ); - m_freqKnob->setRange( 50.0f, 200.0f, 1.0f ); - m_freqKnob->setInitValue( 100.0f ); - m_freqKnob->setLabel( tr( "FREQ" ) ); - m_freqKnob->setHintText( tr( "Frequency:" ) + " ", "Hz" ); - connect( m_freqKnob, SIGNAL( valueChanged( float ) ), - this, SLOT( changeFrequency( void ) ) ); + knob * freqKnob = new knob( knobBright_26, this, tr( "Frequency" ) ); + freqKnob->setModel( &_controls->m_freqModel ); + freqKnob->setLabel( tr( "FREQ" ) ); + freqKnob->setHintText( tr( "Frequency:" ) + " ", "Hz" ); - m_gainKnob = new knob( knobBright_26, this, tr( "Gain" ), NULL ); - m_gainKnob->setRange( 0.1f, 5.0f, 0.1f ); - m_gainKnob->setInitValue( 1.0f ); - m_gainKnob->setLabel( tr( "GAIN" ) ); - m_gainKnob->setHintText( tr( "Gain:" ) + " ", "" ); - connect( m_gainKnob, SIGNAL( valueChanged( float ) ), - this, SLOT( changeGain( void ) ) ); + knob * gainKnob = new knob( knobBright_26, this, tr( "Gain" ) ); + gainKnob->setModel( &_controls->m_gainModel ); + gainKnob->setLabel( tr( "GAIN" ) ); + gainKnob->setHintText( tr( "Gain:" ) + " ", "" ); - m_ratioKnob = new knob( knobBright_26, this, tr( "Ratio" ), NULL ); - m_ratioKnob->setRange( 0.1f, 10.0f, 0.1f ); - m_ratioKnob->setInitValue( 2.0f ); - m_ratioKnob->setLabel( tr( "RATIO" ) ); - m_ratioKnob->setHintText( tr( "Ratio:" ) + " ", "" ); - connect( m_ratioKnob, SIGNAL( valueChanged( float ) ), - this, SLOT( changeRatio( void ) ) ); + knob * ratioKnob = new knob( knobBright_26, this, tr( "Ratio" ) ); + ratioKnob->setModel( &_controls->m_ratioModel ); + ratioKnob->setLabel( tr( "RATIO" ) ); + ratioKnob->setHintText( tr( "Ratio:" ) + " ", "" ); - l->addWidget( m_freqKnob ); - l->addWidget( m_gainKnob ); - l->addWidget( m_ratioKnob ); - - changeFrequency(); - changeGain(); - changeRatio(); + l->addWidget( freqKnob ); + l->addWidget( gainKnob ); + l->addWidget( ratioKnob ); } - - -void bassBoosterControlDialog::changeFrequency( void ) -{ - m_effect->m_bbFX.leftFX().setFrequency( m_freqKnob->value() ); - m_effect->m_bbFX.rightFX().setFrequency( m_freqKnob->value() ); -} - - - - -void bassBoosterControlDialog::changeGain( void ) -{ - m_effect->m_bbFX.leftFX().setGain( m_gainKnob->value() ); - m_effect->m_bbFX.rightFX().setGain( m_gainKnob->value() ); -} - - - - -void bassBoosterControlDialog::changeRatio( void ) -{ - m_effect->m_bbFX.leftFX().setRatio( m_ratioKnob->value() ); - m_effect->m_bbFX.rightFX().setRatio( m_ratioKnob->value() ); -} - - - - -/* -void bassBoosterControlDialog::updateEffect( void ) -{ - //m_effect->m_bbFX = effectLib::bassBoost<>( m_freqKnob->value(), - // m_gainKnob->value(), m_ratioKnob->value() ); - m_effect->m_bbFX = effectLib::monoToStereoAdaptor< - effectLib::bassBoost<> >( - effectLib::bassBoost<>( m_freqKnob->value(), - m_gainKnob->value(), m_ratioKnob->value(), - m_effect->m_bbFX.leftFX() ), - effectLib::bassBoost<>( m_freqKnob->value(), - m_gainKnob->value(), m_ratioKnob->value(), - m_effect->m_bbFX.rightFX() ) - ); - m_effect->m_bbFX.leftFX().setSelectivity( m_freqKnob->value() ); - m_effect->m_bbFX.rightFX().setSelectivity( m_freqKnob->value() ); - m_effect->m_bbFX.leftFX().setGain( m_gainKnob->value() ); - m_effect->m_bbFX.rightFX().setGain( m_gainKnob->value() ); - m_effect->m_bbFX.leftFX().setRatio( m_ratioKnob->value() ); - m_effect->m_bbFX.rightFX().setRatio( m_ratioKnob->value() ); -} -*/ - - - -void FASTCALL bassBoosterControlDialog::loadSettings( - const QDomElement & _this ) -{ - m_freqKnob->setValue( _this.attribute( "freq" ).toFloat() ); - m_gainKnob->setValue( _this.attribute( "gain" ).toFloat() ); - m_ratioKnob->setValue( _this.attribute( "ratio" ).toFloat() ); -} - - - - -void FASTCALL bassBoosterControlDialog::saveSettings( QDomDocument & _doc, - QDomElement & _this ) -{ - _this.setAttribute( "freq", m_freqKnob->value() ); - _this.setAttribute( "gain", m_gainKnob->value() ); - _this.setAttribute( "ratio", m_ratioKnob->value() ); -} - - - -#include "bassbooster_control_dialog.moc" - diff --git a/plugins/bass_booster/bassbooster_control_dialog.h b/plugins/bass_booster/bassbooster_control_dialog.h index 03c94cd7d..7a482302f 100644 --- a/plugins/bass_booster/bassbooster_control_dialog.h +++ b/plugins/bass_booster/bassbooster_control_dialog.h @@ -1,7 +1,7 @@ /* * bassbooster_control_dialog.h - control-dialog for bassbooster-effect * - * Copyright (c) 2006 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -27,45 +27,18 @@ #include "effect_control_dialog.h" -class knob; -class bassBoosterEffect; + +class bassBoosterControls; class bassBoosterControlDialog : public effectControlDialog { - Q_OBJECT public: - bassBoosterControlDialog( QWidget * _parent, bassBoosterEffect * _eff ); + bassBoosterControlDialog( bassBoosterControls * _controls ); virtual ~bassBoosterControlDialog() { } - virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _parent ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); - inline virtual QString nodeName( void ) const - { - return( "bassboostercontrols" ); - } - - virtual ch_cnt_t getControlCount( void ) - { - return( 3 ); - } - - -private slots: - void changeFrequency( void ); - void changeGain( void ); - void changeRatio( void ); - - -private: - bassBoosterEffect * m_effect; - knob * m_freqKnob; - knob * m_gainKnob; - knob * m_ratioKnob; - } ; #endif diff --git a/plugins/bass_booster/bassbooster_controls.cpp b/plugins/bass_booster/bassbooster_controls.cpp new file mode 100644 index 000000000..bb96ecd68 --- /dev/null +++ b/plugins/bass_booster/bassbooster_controls.cpp @@ -0,0 +1,103 @@ +/* + * bassbooster_controls.cpp - controls for bassbooster-effect + * + * Copyright (c) 2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "bassbooster_controls.h" +#include "bass_booster.h" + + + +bassBoosterControls::bassBoosterControls( bassBoosterEffect * _eff ) : + effectControls( _eff ), + m_effect( _eff ), + m_freqModel( 100.0f, 50.0f, 200.0f, 1.0f, this ), + m_gainModel( 1.0f, 0.1f, 5.0f, 0.05f, this ), + m_ratioModel( 2.0f, 0.1f, 10.0f, 0.1f, this ) +{ + connect( &m_freqModel, SIGNAL( dataChanged( void ) ), + this, SLOT( changeFrequency( void ) ) ); + + connect( &m_gainModel, SIGNAL( dataChanged( void ) ), + this, SLOT( changeGain( void ) ) ); + + connect( &m_ratioModel, SIGNAL( dataChanged( void ) ), + this, SLOT( changeRatio( void ) ) ); + + changeFrequency(); + changeGain(); + changeRatio(); +} + + + + +void bassBoosterControls::changeFrequency( void ) +{ + m_effect->m_bbFX.leftFX().setFrequency( m_freqModel.value() ); + m_effect->m_bbFX.rightFX().setFrequency( m_freqModel.value() ); +} + + + + +void bassBoosterControls::changeGain( void ) +{ + m_effect->m_bbFX.leftFX().setGain( m_gainModel.value() ); + m_effect->m_bbFX.rightFX().setGain( m_gainModel.value() ); +} + + + + +void bassBoosterControls::changeRatio( void ) +{ + m_effect->m_bbFX.leftFX().setRatio( m_ratioModel.value() ); + m_effect->m_bbFX.rightFX().setRatio( m_ratioModel.value() ); +} + + + + +void bassBoosterControls::loadSettings( const QDomElement & _this ) +{ + m_freqModel.setValue( _this.attribute( "freq" ).toFloat() ); + m_gainModel.setValue( _this.attribute( "gain" ).toFloat() ); + m_ratioModel.setValue( _this.attribute( "ratio" ).toFloat() ); +} + + + + +void bassBoosterControls::saveSettings( QDomDocument & _doc, + QDomElement & _this ) +{ + _this.setAttribute( "freq", m_freqModel.value() ); + _this.setAttribute( "gain", m_gainModel.value() ); + _this.setAttribute( "ratio", m_ratioModel.value() ); +} + + + +#include "bassbooster_controls.moc" + diff --git a/plugins/bass_booster/bassbooster_controls.h b/plugins/bass_booster/bassbooster_controls.h new file mode 100644 index 000000000..6409ca746 --- /dev/null +++ b/plugins/bass_booster/bassbooster_controls.h @@ -0,0 +1,79 @@ +/* + * bassbooster_controls.h - controls for bassbooster-effect + * + * Copyright (c) 2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BASSBOOSTER_CONTROLS_H +#define _BASSBOOSTER_CONTROLS_H + +#include "effect_controls.h" +#include "bassbooster_control_dialog.h" +#include "knob.h" + + +class bassBoosterEffect; + + +class bassBoosterControls : public effectControls +{ + Q_OBJECT +public: + bassBoosterControls( bassBoosterEffect * _eff ); + virtual ~bassBoosterControls() + { + } + + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); + inline virtual QString nodeName( void ) const + { + return( "bassboostercontrols" ); + } + + virtual ch_cnt_t getControlCount( void ) + { + return( 3 ); + } + + virtual effectControlDialog * createView( void ) + { + return( new bassBoosterControlDialog( this ) ); + } + + +private slots: + void changeFrequency( void ); + void changeGain( void ); + void changeRatio( void ); + + +private: + bassBoosterEffect * m_effect; + knobModel m_freqModel; + knobModel m_gainModel; + knobModel m_ratioModel; + + friend class bassBoosterControlDialog; + +} ; + +#endif diff --git a/src/core/effect.cpp b/src/core/effect.cpp index 522414c6e..3a0a9849d 100644 --- a/src/core/effect.cpp +++ b/src/core/effect.cpp @@ -65,7 +65,7 @@ void effect::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "wet", m_wetDryModel.value() ); _this.setAttribute( "autoquit", m_autoQuitModel.value() ); _this.setAttribute( "gate", m_gateModel.value() ); -// m_controlView->saveState( _doc, _this ); + getControls()->saveState( _doc, _this ); } @@ -77,20 +77,19 @@ void effect::loadSettings( const QDomElement & _this ) m_wetDryModel.setValue( _this.attribute( "wet" ).toFloat() ); m_autoQuitModel.setValue( _this.attribute( "autoquit" ).toFloat() ); m_gateModel.setValue( _this.attribute( "gate" ).toFloat() ); -/* + QDomNode node = _this.firstChild(); while( !node.isNull() ) { if( node.isElement() ) { - if( m_controlView->nodeName() == node.nodeName() ) + if( getControls()->nodeName() == node.nodeName() ) { - m_controlView->restoreState( - node.toElement() ); + getControls()->restoreState( node.toElement() ); } } node = node.nextSibling(); - }*/ + } } diff --git a/src/core/effect_control_dialog.cpp b/src/core/effect_control_dialog.cpp index 48b7c84e0..980eb631f 100644 --- a/src/core/effect_control_dialog.cpp +++ b/src/core/effect_control_dialog.cpp @@ -30,15 +30,16 @@ #include #include "effect_control_dialog.h" +#include "effect_controls.h" #include "effect.h" -effectControlDialog::effectControlDialog( QWidget * _parent, effect * _eff ) : - QWidget( _parent ), - modelView( _eff ), - m_effect( _eff ) +effectControlDialog::effectControlDialog( effectControls * _controls ) : + QWidget( NULL ), + modelView( _controls ), + m_effectControls( _controls ) { - setWindowTitle( m_effect->publicName() ); + setWindowTitle( m_effectControls->getEffect()->publicName() ); } diff --git a/src/core/song_editor.cpp b/src/core/song_editor.cpp index 5b359348e..389bd0a5e 100644 --- a/src/core/song_editor.cpp +++ b/src/core/song_editor.cpp @@ -128,6 +128,8 @@ songEditor::songEditor( void ) : connect( &m_tempoModel, SIGNAL( dataChanged() ), this, SLOT( setTempo() ) ); + connect( &m_tempoModel, SIGNAL( dataUnchanged() ), + this, SLOT( setTempo() ) ); connect( m_tempoSpinBox, SIGNAL( manualChange() ), this, SLOT( setModified() ) ); diff --git a/src/widgets/effect_view.cpp b/src/widgets/effect_view.cpp index 50977e600..072ce0c8b 100644 --- a/src/widgets/effect_view.cpp +++ b/src/widgets/effect_view.cpp @@ -35,6 +35,7 @@ #include "audio_port.h" #include "caption_menu.h" +#include "effect_controls.h" #include "effect_control_dialog.h" #include "embed.h" #include "engine.h" @@ -112,7 +113,7 @@ effectView::effectView( effect * _model, QWidget * _parent ) : bg.toImage().copy( 5, 44, 195, 10 ) ) ); m_label->setPalette( pal ); - m_controlView = getEffect()->createControlDialog( NULL ); + m_controlView = getEffect()->getControls()->createView(); m_subWindow = engine::getMainWindow()->workspace()->addSubWindow( m_controlView ); connect( m_controlView, SIGNAL( closed() ), @@ -120,7 +121,7 @@ effectView::effectView( effect * _model, QWidget * _parent ) : m_subWindow->hide(); - if( m_controlView->getControlCount() == 0 ) + if( getEffect()->getControls()->getControlCount() == 0 ) { m_editButton->hide(); } From 3e93586a6644ac687e5ee7b82496136cc55aa153 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Thu, 17 Jan 2008 22:02:56 +0000 Subject: [PATCH 26/87] splitted ladspaControl-class, made ladspa-effect-plugin work again git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@665 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 18 ++ Makefile.am | 2 + include/ladspa_control.h | 29 ++- include/ladspa_control_view.h | 47 ++++ plugins/ladspa_effect/Makefile.am | 4 +- .../ladspa_effect/ladspa_control_dialog.cpp | 204 ++++-------------- plugins/ladspa_effect/ladspa_control_dialog.h | 46 +--- plugins/ladspa_effect/ladspa_controls.cpp | 185 ++++++++++++++++ plugins/ladspa_effect/ladspa_controls.h | 83 +++++++ plugins/ladspa_effect/ladspa_effect.cpp | 13 +- plugins/ladspa_effect/ladspa_effect.h | 22 +- src/core/ladspa_control.cpp | 108 ++-------- src/core/ladspa_control_view.cpp | 115 ++++++++++ 13 files changed, 541 insertions(+), 335 deletions(-) create mode 100644 include/ladspa_control_view.h create mode 100644 plugins/ladspa_effect/ladspa_controls.cpp create mode 100644 plugins/ladspa_effect/ladspa_controls.h create mode 100644 src/core/ladspa_control_view.cpp diff --git a/ChangeLog b/ChangeLog index 311efdd09..8a92eb506 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2008-01-17 Tobias Doerffel + + * plugins/ladspa_effect/Makefile.am: + * plugins/ladspa_effect/ladspa_effect.h: + * plugins/ladspa_effect/ladspa_effect.cpp: + * plugins/ladspa_effect/ladspa_controls.h: + * plugins/ladspa_effect/ladspa_controls.cpp: + * plugins/ladspa_effect/ladspa_control_dialog.h: + * plugins/ladspa_effect/ladspa_control_dialog.cpp: + made work again after all the changes in the last days... + + * Makefile.am: + * include/ladspa_control.h: + * include/ladspa_control_view.h: + * src/core/ladspa_control.cpp: + * src/core/ladspa_control_view.cpp: + splitted ladspaControl-class into ladspaControl and ladspaControlView + 2008-01-14 Tobias Doerffel * plugins/bass_booster/bassbooster_controls.h: diff --git a/Makefile.am b/Makefile.am index ce9e32485..d8ef64f7a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -169,6 +169,7 @@ lmms_SOURCES = \ $(srcdir)/src/core/ladspa_2_lmms.cpp \ $(srcdir)/src/core/ladspa_manager.cpp \ $(srcdir)/src/core/ladspa_control.cpp \ + $(srcdir)/src/core/ladspa_control_view.cpp \ $(srcdir)/src/core/main_window.cpp \ $(srcdir)/src/core/main.cpp \ $(srcdir)/src/core/meter_dialog.cpp \ @@ -384,6 +385,7 @@ lmms_SOURCES = \ $(srcdir)/include/ladspa_manager.h \ $(srcdir)/include/ladspa_2_lmms.h \ $(srcdir)/include/ladspa_control.h \ + $(srcdir)/include/ladspa_control_view.h \ $(srcdir)/include/ladspa_base.h \ $(THIRD_PARTY_CODE) diff --git a/include/ladspa_control.h b/include/ladspa_control.h index 9cafb0a8a..131ba968b 100644 --- a/include/ladspa_control.h +++ b/include/ladspa_control.h @@ -1,7 +1,7 @@ /* - * ladspa_control.h - widget for controlling a LADSPA port + * ladspa_control.h - model for controlling a LADSPA port * - * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2006-2008 Danny McRae * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -25,9 +25,6 @@ #ifndef _LADSPA_CONTROL_H #define _LADSPA_CONTROL_H -#include -#include - #ifdef HAVE_CONFIG_H #include #endif @@ -43,25 +40,24 @@ #include "knob.h" -class ledCheckBox; class track; typedef struct portDescription port_desc_t; -class ladspaControl : public QWidget, public journallingObject +class ladspaControl : public model, public journallingObject { Q_OBJECT public: - ladspaControl( QWidget * _parent, port_desc_t * _port, track * _track, + ladspaControl( model * _parent, port_desc_t * _port, track * _track, bool _link = FALSE ); ~ladspaControl(); - + LADSPA_Data getValue( void ); void FASTCALL setValue( LADSPA_Data _value ); void FASTCALL setLink( bool _state ); - + void FASTCALL linkControls( ladspaControl * _control ); void FASTCALL unlinkControls( ladspaControl * _control ); @@ -69,12 +65,12 @@ public: { return( &m_toggledModel ); } - + inline knobModel * getKnobModel( void ) { return( &m_knobModel ); } - + inline port_desc_t * getPort( void ) { return( m_port ); @@ -102,17 +98,16 @@ protected slots: private: + bool m_link; port_desc_t * m_port; - track * m_track; - QHBoxLayout * m_layout; - ledCheckBox * m_link; - ledCheckBox * m_toggle; - knob * m_knob; boolModel m_linkEnabledModel; boolModel m_toggledModel; knobModel m_knobModel; + + friend class ladspaControlView; + } ; #endif diff --git a/include/ladspa_control_view.h b/include/ladspa_control_view.h new file mode 100644 index 000000000..2a795130d --- /dev/null +++ b/include/ladspa_control_view.h @@ -0,0 +1,47 @@ +/* + * ladspa_control_view.h - widget for controlling a LADSPA port + * + * Copyright (c) 2006-2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _LADSPA_CONTROL_VIEW_H +#define _LADSPA_CONTROL_VIEW_H + +#include + +#include "mv_base.h" + + +class ladspaControl; + + +class ladspaControlView : public QWidget, public modelView +{ +public: + ladspaControlView( QWidget * _parent, ladspaControl * _ctl ); + virtual ~ladspaControlView(); + +private: + ladspaControl * m_ctl; + +} ; + +#endif diff --git a/plugins/ladspa_effect/Makefile.am b/plugins/ladspa_effect/Makefile.am index 6ed9c8622..5e969767e 100644 --- a/plugins/ladspa_effect/Makefile.am +++ b/plugins/ladspa_effect/Makefile.am @@ -15,7 +15,7 @@ AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="ladspaeffect" $(MOC) -o $@ $< -MOC_FILES = ./ladspa_control_dialog.moc +MOC_FILES = ./ladspa_controls.moc BUILT_SOURCES = $(MOC_FILES) ./embedded_resources.h @@ -34,9 +34,11 @@ CLEANFILES = $(MOC_FILES) ./embedded_resources.h pkglib_LTLIBRARIES = libladspaeffect.la libladspaeffect_la_SOURCES = ladspa_effect.cpp \ + ladspa_controls.cpp \ ladspa_control_dialog.cpp \ ladspa_subplugin_features.cpp \ ladspa_effect.h \ + ladspa_controls.h \ ladspa_control_dialog.h \ ladspa_subplugin_features.h diff --git a/plugins/ladspa_effect/ladspa_control_dialog.cpp b/plugins/ladspa_effect/ladspa_control_dialog.cpp index d6321d5a3..f38a96710 100644 --- a/plugins/ladspa_effect/ladspa_control_dialog.cpp +++ b/plugins/ladspa_effect/ladspa_control_dialog.cpp @@ -24,119 +24,89 @@ */ -#include +#include +#include #include "ladspa_effect.h" +#include "ladspa_control_dialog.h" +#include "ladspa_control_view.h" +#include "led_checkbox.h" -ladspaControlDialog::ladspaControlDialog( QWidget * _parent, - ladspaEffect * _eff, - track * _track ) : - effectControlDialog( _parent, _eff ), - m_effect( _eff ), - m_processors( _eff->getProcessorCount() ), - m_track( _track ), - m_noLink( FALSE ) + +ladspaControlDialog::ladspaControlDialog( ladspaControls * _ctl ) : + effectControlDialog( _ctl ) { - m_mainLay = new QVBoxLayout( this ); - m_effectLay = new QHBoxLayout(); - m_mainLay->addLayout( m_effectLay ); + QVBoxLayout * mainLay = new QVBoxLayout( this ); + QHBoxLayout * effectLay = new QHBoxLayout(); + mainLay->addLayout( effectLay ); - multi_proc_t controls = m_effect->getControls(); - m_controlCount = controls.count(); - int rows = static_cast( sqrt( - static_cast( m_controlCount ) ) ); + static_cast( _ctl->m_controlCount ) ) ); - for( ch_cnt_t proc = 0; proc < m_processors; proc++ ) + for( ch_cnt_t proc = 0; proc < _ctl->m_processors; proc++ ) { - control_list_t p; - - bool linked_control = FALSE; + control_list_t & controls = _ctl->m_controls[proc]; int row_cnt = 0; buffer_data_t last_port = NONE; - + QGroupBox * grouper; - if( m_processors > 1 ) + if( _ctl->m_processors > 1 ) { grouper = new QGroupBox( tr( "Channel " ) + QString::number( proc + 1 ), this ); - grouper->setAlignment( Qt::Vertical ); - if( proc == 0 ) - { - linked_control = TRUE; - } } else { grouper = new QGroupBox( this ); - grouper->setAlignment( Qt::Vertical ); } - - for( multi_proc_t::iterator it = controls.begin(); + grouper->setAlignment( Qt::Vertical ); + + for( control_list_t::iterator it = controls.begin(); it != controls.end(); it++ ) { - if( (*it)->proc == proc ) + if( (*it)->getPort()->proc == proc ) { if( last_port == NONE || - (*it)->data_type != TOGGLED || - ( (*it)->data_type == TOGGLED && + (*it)->getPort()->data_type != TOGGLED || + ( (*it)->getPort()->data_type == TOGGLED && last_port == TOGGLED ) ) { - (*it)->control = - new ladspaControl( grouper, *it, - m_track, - linked_control ); + new ladspaControlView( grouper, *it ); } else { while( row_cnt < rows ) { - m_blanks.append( - new QWidget( grouper ) ); + new QWidget( grouper ); row_cnt++; } - (*it)->control = new ladspaControl( - grouper, (*it), - m_track, - linked_control ); + new ladspaControlView( grouper, *it ); row_cnt = 0; } - + row_cnt++; if( row_cnt == ( rows - 1 ) ) { row_cnt = 0; } - last_port = (*it)->data_type; - - p.append( (*it)->control ); - - if( linked_control ) - { - connect( (*it)->control, - SIGNAL( linkChanged( Uint16, bool ) ), - this, - SLOT( linkPort( Uint16, bool ) ) ); - } + last_port = (*it)->getPort()->data_type; } } - - m_controls.append( p ); - m_effectLay->addWidget( grouper ); + effectLay->addWidget( grouper ); } - if( m_processors > 1 ) + + if( _ctl->m_processors > 1 ) { - m_mainLay->addSpacing( 3 ); + mainLay->addSpacing( 3 ); QHBoxLayout * center = new QHBoxLayout(); - m_mainLay->addLayout( center ); - m_stereoLink = new ledCheckBox( tr( "Link Channels" ), this ); - connect( m_stereoLink, SIGNAL( dataChanged() ), - this, SLOT( updateChannelLinkState() ) ); - m_stereoLink->setChecked( TRUE ); - center->addWidget( m_stereoLink ); + mainLay->addLayout( center ); + ledCheckBox * stereoLink = new ledCheckBox( + tr( "Link Channels" ), this ); + stereoLink->setModel( &_ctl->m_stereoLinkModel ); + center->addWidget( stereoLink ); } } @@ -145,108 +115,6 @@ ladspaControlDialog::ladspaControlDialog( QWidget * _parent, ladspaControlDialog::~ladspaControlDialog() { - for( ch_cnt_t proc = 0; proc < m_processors; proc++ ) - { - m_controls[proc].clear(); - } - m_controls.clear(); } - - -void FASTCALL ladspaControlDialog::saveSettings( QDomDocument & _doc, - QDomElement & _this ) -{ - if( m_processors > 1 ) - { - _this.setAttribute( "link", m_stereoLink->model()->value() ); - } - - multi_proc_t controls = m_effect->getControls(); - _this.setAttribute( "ports", controls.count() ); - for( multi_proc_t::iterator it = controls.begin(); - it != controls.end(); it++ ) - { - QString n = "port" + QString::number( (*it)->proc ) + - QString::number( (*it)->port_id ); - (*it)->control->saveSettings( _doc, _this, n ); - } -} - - - - -void FASTCALL ladspaControlDialog::loadSettings( const QDomElement & _this ) -{ - if( m_processors > 1 ) - { - m_stereoLink->model()->setValue( - _this.attribute( "link" ).toInt() ); - } - - multi_proc_t controls = m_effect->getControls(); - for( multi_proc_t::iterator it = controls.begin(); - it != controls.end(); it++ ) - { - QString n = "port" + QString::number( (*it)->proc ) + - QString::number( (*it)->port_id ); - (*it)->control->loadSettings( _this, n ); - } -} - - - - -void ladspaControlDialog::linkPort( Uint16 _port, bool _state ) -{ - ladspaControl * first = m_controls[0][_port]; - if( _state ) - { - for( ch_cnt_t proc = 1; proc < m_processors; proc++ ) - { - first->linkControls( m_controls[proc][_port] ); - } - } - else - { - for( ch_cnt_t proc = 1; proc < m_processors; proc++ ) - { - first->unlinkControls( m_controls[proc][_port] ); - } - m_noLink = TRUE; - m_stereoLink->setChecked( FALSE ); - } -} - - - -void ladspaControlDialog::updateChannelLinkState( void ) -{ - if( m_stereoLink->model()->value() ) - { - for( Uint16 port = 0; - port < m_controlCount / m_processors; - port++ ) - { - m_controls[0][port]->setLink( TRUE ); - } - } - else if( !m_noLink ) - { - for( Uint16 port = 0; - port < m_controlCount / m_processors; - port++ ) - { - m_controls[0][port]->setLink( FALSE ); - } - } - else - { - m_noLink = FALSE; - } -} - - -#include "ladspa_control_dialog.moc" - diff --git a/plugins/ladspa_effect/ladspa_control_dialog.h b/plugins/ladspa_effect/ladspa_control_dialog.h index f0d1da242..5d05841cc 100644 --- a/plugins/ladspa_effect/ladspa_control_dialog.h +++ b/plugins/ladspa_effect/ladspa_control_dialog.h @@ -26,59 +26,19 @@ #ifndef _LADSPA_CONTROL_DIALOG_H #define _LADSPA_CONTROL_DIALOG_H -#include -#include - #include "effect_control_dialog.h" -#include "ladspa_control.h" -#include "led_checkbox.h" -typedef QVector control_list_t; - -class ladspaEffect; +class ladspaControls; class ladspaControlDialog : public effectControlDialog { - Q_OBJECT public: - ladspaControlDialog( QWidget * _parent, ladspaEffect * _eff, - track * _track ); - virtual ~ladspaControlDialog(); - - inline ch_cnt_t getControlCount( void ) - { - return( m_controlCount ); - } - - virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _parent ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); - inline virtual QString nodeName( void ) const - { - return( "ladspacontrols" ); - } + ladspaControlDialog( ladspaControls * _ctl ); + ~ladspaControlDialog(); -protected slots: - void updateChannelLinkState( void ); - void linkPort( Uint16 _port, bool _state ); - - -private: - ladspaEffect * m_effect; - ch_cnt_t m_processors; - ch_cnt_t m_controlCount; - track * m_track; - bool m_noLink; - audioPort * m_port; - ledCheckBox * m_stereoLink; - QVector m_blanks; - QVector m_controls; - - QVBoxLayout * m_mainLay; - QHBoxLayout * m_effectLay; } ; diff --git a/plugins/ladspa_effect/ladspa_controls.cpp b/plugins/ladspa_effect/ladspa_controls.cpp new file mode 100644 index 000000000..7a7fb5bf3 --- /dev/null +++ b/plugins/ladspa_effect/ladspa_controls.cpp @@ -0,0 +1,185 @@ +/* + * ladspa_controls.cpp - model for LADSPA-plugin controls + * + * Copyright (c) 2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + + +#include "ladspa_effect.h" + + +ladspaControls::ladspaControls( ladspaEffect * _eff, + track * _track ) : + effectControls( _eff ), + m_effect( _eff ), + m_processors( _eff->getProcessorCount() ), + m_track( _track ), + m_noLink( FALSE ), + m_stereoLinkModel( TRUE, FALSE, TRUE, boolModel::defaultRelStep(), + this ) +{ + multi_proc_t controls = m_effect->getPortControls(); + m_controlCount = controls.count(); + + for( ch_cnt_t proc = 0; proc < m_processors; proc++ ) + { + control_list_t p; + + bool linked_control = ( m_processors > 1 && proc == 0 ); + buffer_data_t last_port = NONE; + + for( multi_proc_t::iterator it = controls.begin(); + it != controls.end(); it++ ) + { + if( (*it)->proc == proc ) + { + (*it)->control = new ladspaControl( this, *it, + m_track, + linked_control ); + + last_port = (*it)->data_type; + + p.append( (*it)->control ); + + if( linked_control ) + { + connect( (*it)->control, + SIGNAL( linkChanged( Uint16, bool ) ), + this, + SLOT( linkPort( Uint16, bool ) ) ); + } + } + } + + m_controls.append( p ); + } +} + + + + +ladspaControls::~ladspaControls() +{ + for( ch_cnt_t proc = 0; proc < m_processors; proc++ ) + { + m_controls[proc].clear(); + } + m_controls.clear(); +} + + + + +void FASTCALL ladspaControls::saveSettings( QDomDocument & _doc, + QDomElement & _this ) +{ + if( m_processors > 1 ) + { + _this.setAttribute( "link", m_stereoLinkModel.value() ); + } + + multi_proc_t controls = m_effect->getPortControls(); + _this.setAttribute( "ports", controls.count() ); + for( multi_proc_t::iterator it = controls.begin(); + it != controls.end(); it++ ) + { + QString n = "port" + QString::number( (*it)->proc ) + + QString::number( (*it)->port_id ); + (*it)->control->saveSettings( _doc, _this, n ); + } +} + + + + +void FASTCALL ladspaControls::loadSettings( const QDomElement & _this ) +{ + if( m_processors > 1 ) + { + m_stereoLinkModel.setValue( _this.attribute( "link" ).toInt() ); + } + + multi_proc_t controls = m_effect->getPortControls(); + for( multi_proc_t::iterator it = controls.begin(); + it != controls.end(); it++ ) + { + QString n = "port" + QString::number( (*it)->proc ) + + QString::number( (*it)->port_id ); + (*it)->control->loadSettings( _this, n ); + } +} + + + + +void ladspaControls::linkPort( Uint16 _port, bool _state ) +{ + ladspaControl * first = m_controls[0][_port]; + if( _state ) + { + for( ch_cnt_t proc = 1; proc < m_processors; proc++ ) + { + first->linkControls( m_controls[proc][_port] ); + } + } + else + { + for( ch_cnt_t proc = 1; proc < m_processors; proc++ ) + { + first->unlinkControls( m_controls[proc][_port] ); + } + m_noLink = TRUE; + m_stereoLinkModel.setValue( FALSE ); + } +} + + + +void ladspaControls::updateChannelLinkState( void ) +{ + if( m_stereoLinkModel.value() ) + { + for( Uint16 port = 0; + port < m_controlCount / m_processors; + port++ ) + { + m_controls[0][port]->setLink( TRUE ); + } + } + else if( !m_noLink ) + { + for( Uint16 port = 0; + port < m_controlCount / m_processors; + port++ ) + { + m_controls[0][port]->setLink( FALSE ); + } + } + else + { + m_noLink = FALSE; + } +} + + +#include "ladspa_controls.moc" + diff --git a/plugins/ladspa_effect/ladspa_controls.h b/plugins/ladspa_effect/ladspa_controls.h new file mode 100644 index 000000000..007f8906a --- /dev/null +++ b/plugins/ladspa_effect/ladspa_controls.h @@ -0,0 +1,83 @@ +/* + * ladspa_controls.h - model for LADSPA-plugin controls + * + * Copyright (c) 2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _LADSPA_CONTROLS_H +#define _LADSPA_CONTROLS_H + +#include "effect_controls.h" +#include "ladspa_control.h" +#include "ladspa_control_dialog.h" + + +typedef QVector control_list_t; + +class ladspaEffect; + + +class ladspaControls : public effectControls +{ + Q_OBJECT +public: + ladspaControls( ladspaEffect * _eff, track * _track ); + virtual ~ladspaControls(); + + inline ch_cnt_t getControlCount( void ) + { + return( m_controlCount ); + } + + virtual void FASTCALL saveSettings( QDomDocument & _doc, + QDomElement & _parent ); + virtual void FASTCALL loadSettings( const QDomElement & _this ); + inline virtual QString nodeName( void ) const + { + return( "ladspacontrols" ); + } + + virtual effectControlDialog * createView( void ) + { + return( new ladspaControlDialog( this ) ); + } + + +protected slots: + void updateChannelLinkState( void ); + void linkPort( Uint16 _port, bool _state ); + + +private: + ladspaEffect * m_effect; + ch_cnt_t m_processors; + ch_cnt_t m_controlCount; + track * m_track; + bool m_noLink; + boolModel m_stereoLinkModel; + QVector m_controls; + + + friend class ladspaControlDialog; + +} ; + +#endif diff --git a/plugins/ladspa_effect/ladspa_effect.cpp b/plugins/ladspa_effect/ladspa_effect.cpp index 152e96e10..1941ae7c8 100644 --- a/plugins/ladspa_effect/ladspa_effect.cpp +++ b/plugins/ladspa_effect/ladspa_effect.cpp @@ -62,10 +62,9 @@ plugin::descriptor ladspaeffect_plugin_descriptor = ladspaEffect::ladspaEffect( model * _parent, const descriptor::subPluginFeatures::key * _key ) : effect( &ladspaeffect_plugin_descriptor, _parent, _key ), + m_controls( NULL ), m_effName( "none" ), - m_key( ladspaSubPluginFeatures::subPluginKeyToLadspaKey( _key ) - /* ladspa_key_t( _cdata->settings.attribute( "label" ), - _cdata->settings.attribute( "lib" ) )*/ ) + m_key( ladspaSubPluginFeatures::subPluginKeyToLadspaKey( _key ) ) { ladspa2LMMS * manager = engine::getLADSPAManager(); if( manager->getDescription( m_key ) == NULL ) @@ -230,8 +229,8 @@ ladspaEffect::ladspaEffect( model * _parent, if( p->rate == AUDIO_RATE_INPUT || p->rate == CONTROL_RATE_INPUT ) { - p->control_id = m_controls.count(); - m_controls.append( p ); + p->control_id = m_portControls.count(); + m_portControls.append( p ); } } m_ports.append( ports ); @@ -293,6 +292,8 @@ ladspaEffect::ladspaEffect( model * _parent, { manager->activate( m_key, m_handles[proc] ); } + + m_controls = new ladspaControls( this, NULL /* TODO!! */ ); } @@ -461,7 +462,7 @@ void FASTCALL ladspaEffect::setControl( Uint16 _control, LADSPA_Data _value ) { return; } - m_controls[_control]->value = _value; + m_portControls[_control]->value = _value; } diff --git a/plugins/ladspa_effect/ladspa_effect.h b/plugins/ladspa_effect/ladspa_effect.h index 610813a1f..3913bee4c 100644 --- a/plugins/ladspa_effect/ladspa_effect.h +++ b/plugins/ladspa_effect/ladspa_effect.h @@ -30,8 +30,7 @@ #include "effect.h" #include "engine.h" #include "ladspa_base.h" -#include "ladspa_control.h" -#include "ladspa_control_dialog.h" +#include "ladspa_controls.h" #include "main_window.h" #include "mixer.h" @@ -50,11 +49,16 @@ public: void FASTCALL setControl( Uint16 _control, LADSPA_Data _data ); - inline const multi_proc_t & getControls( void ) + virtual effectControls * getControls( void ) { return( m_controls ); } + inline const multi_proc_t & getPortControls( void ) + { + return( m_portControls ); + } + virtual inline QString publicName( void ) const { return( m_effName ); @@ -65,14 +69,6 @@ public: m_effName = _name; } - virtual inline effectControlDialog * createControlDialog( - track * _track ) - { - return( new ladspaControlDialog( - NULL /*engine::getMainWindow()->workspace()*/, - this, _track ) ); - } - inline virtual QString nodeName( void ) const { return( "ladspaeffect" ); @@ -80,6 +76,8 @@ public: private: + ladspaControls * m_controls; + QString m_effName; ladspa_key_t m_key; Uint16 m_effectChannels; @@ -90,7 +88,7 @@ private: QVector m_handles; QVector m_ports; - multi_proc_t m_controls; + multi_proc_t m_portControls; } ; #endif diff --git a/src/core/ladspa_control.cpp b/src/core/ladspa_control.cpp index 9ba2016af..b0e846344 100644 --- a/src/core/ladspa_control.cpp +++ b/src/core/ladspa_control.cpp @@ -1,7 +1,7 @@ /* - * ladspa_control.cpp - widget for controlling a LADSPA port + * ladspa_control.cpp - model for controlling a LADSPA port * - * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2006-2008 Danny McRae * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -23,144 +23,76 @@ */ -#include - #include "ladspa_control.h" #include "automatable_model_templates.h" #include "ladspa_base.h" -#include "led_checkbox.h" -#include "tempo_sync_knob.h" -#include "tooltip.h" -ladspaControl::ladspaControl( QWidget * _parent, - port_desc_t * _port, - track * _track, - bool _link) : - QWidget( _parent ), +ladspaControl::ladspaControl( model * _parent, port_desc_t * _port, + track * _track, bool _link ) : + model( _parent ), m_port( _port ), - m_track( _track ), - m_link( NULL ), - m_toggle( NULL ), - m_knob( NULL ), - m_linkEnabledModel( FALSE, FALSE, TRUE ), - m_toggledModel( FALSE, FALSE, TRUE ), - m_knobModel() + m_linkEnabledModel( FALSE, FALSE, TRUE, boolModel::defaultRelStep(), + this ), + m_toggledModel( FALSE, FALSE, TRUE, boolModel::defaultRelStep(), + this ), + m_knobModel( 0, 0, 0, 1, this ) { - m_layout = new QHBoxLayout( this ); - if( _link ) { - m_link = new ledCheckBox( "", this ); - toolTip::add( m_link, tr( "Link channels" ) ); - m_linkEnabledModel.setValue( FALSE ); m_linkEnabledModel.setTrack( _track ); - m_link->setModel( &m_linkEnabledModel ); connect( &m_linkEnabledModel, SIGNAL( dataChanged() ), this, SLOT( linkStateChanged() ) ); - m_layout->addWidget( m_link ); } switch( m_port->data_type ) { case TOGGLED: - m_toggledModel.setTrack( m_track ); - m_toggle = new ledCheckBox( m_port->name, this, - QString::null, - ledCheckBox::GREEN ); - m_toggle->setModel( &m_toggledModel ); + m_toggledModel.setTrack( _track ); connect( &m_toggledModel, SIGNAL( dataChanged() ), this, SLOT( ledChanged() ) ); - setFixedSize( m_toggle->width(), m_toggle->height() ); if( m_port->def == 1.0f ) { m_toggledModel.setValue( TRUE ); } - if( _link ) - { - m_layout->addWidget( m_toggle ); - setFixedSize( m_link->width() + - m_toggle->width(), - m_toggle->height() ); - } break; + case INTEGER: - m_knobModel.setTrack( m_track ); + m_knobModel.setTrack( _track ); m_knobModel.setRange( static_cast( m_port->max ), static_cast( m_port->min ), 1 + static_cast( m_port->max - m_port->min ) / 400 ); m_knobModel.setInitValue( static_cast( m_port->def ) ); - m_knob = new knob( knobBright_26, this, m_port->name ); - m_knob->setModel( &m_knobModel ); connect( &m_knobModel, SIGNAL( dataChanged() ), this, SLOT( knobChanged() ) ); - - m_knob->setLabel( m_port->name ); - setFixedSize( m_knob->width(), m_knob->height() ); - m_knob->setHintText( tr( "Value:" ) + " ", "" ); - m_knob->setWhatsThis( - tr( "Sorry, no help available." ) ); - if( _link ) - { - m_layout->addWidget( m_knob ); - setFixedSize( m_link->width() + - m_knob->width(), - m_knob->height() ); - } break; + case FLOAT: - m_knobModel.setTrack( m_track ); + m_knobModel.setTrack( _track ); m_knobModel.setRange( m_port->min, m_port->max, ( m_port->max - m_port->min ) / ( m_port->name.toUpper() == "GAIN" && m_port->max == 10.0f ? 4000.0f : 400.0f ) ); m_knobModel.setInitValue( m_port->def ); - m_knob = new knob( knobBright_26, this, m_port->name ); - m_knob->setModel( &m_knobModel ); connect( &m_knobModel, SIGNAL( dataChanged() ), this, SLOT( knobChanged() ) ); - m_knob->setLabel( m_port->name ); - m_knob->setHintText( tr( "Value:" ) + " ", "" ); - m_knob->setWhatsThis( - tr( "Sorry, no help available." ) ); - setFixedSize( m_knob->width(), m_knob->height() ); - if( _link ) - { - m_layout->addWidget( m_knob ); - setFixedSize( m_link->width() + - m_knob->width(), - m_knob->height() ); - } break; + case TIME: - m_knobModel.setTrack( m_track ); + m_knobModel.setTrack( _track ); m_knobModel.setRange( m_port->min, m_port->max, ( m_port->max - m_port->min ) / 400.0f ); m_knobModel.setInitValue( m_port->def ); - m_knob = new tempoSyncKnob( knobBright_26, this, - m_port->name ); - m_knob->setModel( &m_knobModel ); connect( &m_knobModel, SIGNAL( dataChanged() ), this, SLOT( knobChanged() ) ); - m_knob->setLabel( m_port->name ); - m_knob->setHintText( tr( "Value:" ) + " ", "" ); - m_knob->setWhatsThis( - tr( "Sorry, no help available." ) ); - setFixedSize( m_knob->width(), m_knob->height() ); - if( _link ) - { - m_layout->addWidget( m_knob ); - setFixedSize( m_link->width() + - m_knob->width(), - m_knob->height() ); - } break; + default: break; } @@ -230,7 +162,7 @@ void FASTCALL ladspaControl::saveSettings( QDomDocument & _doc, QDomElement & _this, const QString & _name ) { - if( m_link != NULL ) + if( m_link ) { m_linkEnabledModel.saveSettings( _doc, _this, _name + "link" ); } @@ -255,7 +187,7 @@ void FASTCALL ladspaControl::saveSettings( QDomDocument & _doc, void FASTCALL ladspaControl::loadSettings( const QDomElement & _this, const QString & _name ) { - if( m_link != NULL ) + if( m_link ) { m_linkEnabledModel.loadSettings( _this, _name + "link" ); } diff --git a/src/core/ladspa_control_view.cpp b/src/core/ladspa_control_view.cpp new file mode 100644 index 000000000..dff6e0167 --- /dev/null +++ b/src/core/ladspa_control_view.cpp @@ -0,0 +1,115 @@ +/* + * ladspa_control_view.cpp - widget for controlling a LADSPA port + * + * Copyright (c) 2006-2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include + +#include "ladspa_control.h" +#include "ladspa_control_view.h" +#include "ladspa_base.h" +#include "led_checkbox.h" +#include "tempo_sync_knob.h" +#include "tooltip.h" + + +ladspaControlView::ladspaControlView( QWidget * _parent, + ladspaControl * _ctl ) : + QWidget( _parent ), + modelView( _ctl ), + m_ctl( _ctl ) +{ + QHBoxLayout * layout = new QHBoxLayout( this ); + + ledCheckBox * link = NULL; + + if( m_ctl->m_link ) + { + link = new ledCheckBox( "", this ); + link->setModel( &m_ctl->m_linkEnabledModel ); + toolTip::add( link, tr( "Link channels" ) ); + layout->addWidget( link ); + } + + knob * knb = NULL; + + switch( m_ctl->getPort()->data_type ) + { + case TOGGLED: + { + ledCheckBox * toggle = new ledCheckBox( + m_ctl->getPort()->name, this, + QString::null, + ledCheckBox::GREEN ); + toggle->setModel( m_ctl->getToggledModel() ); + setFixedSize( toggle->width(), toggle->height() ); + if( m_ctl->m_link ) + { + layout->addWidget( toggle ); + setFixedSize( link->width() + toggle->width(), + toggle->height() ); + } + break; + } + + case INTEGER: + case FLOAT: + knb = new knob( knobBright_26, this, + m_ctl->getPort()->name ); + break; + + case TIME: + knb = new tempoSyncKnob( knobBright_26, this, + m_ctl->getPort()->name ); + break; + + default: + break; + } + + if( knb != NULL ) + { + knb->setModel( m_ctl->getKnobModel() ); + knb->setLabel( m_ctl->getPort()->name ); + knb->setHintText( tr( "Value:" ) + " ", "" ); + knb->setWhatsThis( tr( "Sorry, no help available." ) ); + setFixedSize( knb->width(), knb->height() ); + if( m_ctl->m_link ) + { + layout->addWidget( knb ); + setFixedSize( link->width() + knb->width(), + knb->height() ); + } + } +} + + + + +ladspaControlView::~ladspaControlView() +{ +} + + + + From 0d012353f0b69ab0d22196e94c8b69a3e2e63827 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Fri, 18 Jan 2008 11:29:45 +0000 Subject: [PATCH 27/87] moved ladpsaControlView-source-file to widgets-dir git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@666 0778d3d1-df1d-0410-868b-ea421aaaa00d --- src/{core => widgets}/ladspa_control_view.cpp | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{core => widgets}/ladspa_control_view.cpp (100%) diff --git a/src/core/ladspa_control_view.cpp b/src/widgets/ladspa_control_view.cpp similarity index 100% rename from src/core/ladspa_control_view.cpp rename to src/widgets/ladspa_control_view.cpp From 1808379915a9252d79ca480bf701a536ea869ce1 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Fri, 18 Jan 2008 12:21:33 +0000 Subject: [PATCH 28/87] made LADSPA-plugin-layouter work again after Qt4-port, other small code-fixes git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@667 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 20 +++++++++ Makefile.am | 2 +- .../ladspa_effect/ladspa_control_dialog.cpp | 45 +++++++++---------- plugins/ladspa_effect/ladspa_controls.cpp | 8 ++-- src/core/ladspa_control.cpp | 6 +-- src/widgets/combobox.cpp | 4 +- src/widgets/knob.cpp | 4 +- src/widgets/ladspa_control_view.cpp | 21 ++++++--- 8 files changed, 68 insertions(+), 42 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8a92eb506..ab897f428 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,23 @@ +2008-01-18 Tobias Doerffel + + * src/widgets/combobox.cpp: + fixed painting + + * src/widgets/ladspa_control_view.cpp: + * plugins/ladspa_effect/ladspa_control_dialog.cpp: + made control-layouting work again (did not work at all after Qt4-port) + + * src/core/ladspa_control.cpp: + added initialization for m_link-member-variable, optimized + linkEnabledModel-initialization + + * src/widgets/knob.cpp: + * plugins/ladspa_effect/ladspa_controls.cpp: + coding style fixes + + * Makefile.am: + moved ladspa_control_view.cpp to src/widgets/ + 2008-01-17 Tobias Doerffel * plugins/ladspa_effect/Makefile.am: diff --git a/Makefile.am b/Makefile.am index d8ef64f7a..8671b5bd0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -169,7 +169,6 @@ lmms_SOURCES = \ $(srcdir)/src/core/ladspa_2_lmms.cpp \ $(srcdir)/src/core/ladspa_manager.cpp \ $(srcdir)/src/core/ladspa_control.cpp \ - $(srcdir)/src/core/ladspa_control_view.cpp \ $(srcdir)/src/core/main_window.cpp \ $(srcdir)/src/core/main.cpp \ $(srcdir)/src/core/meter_dialog.cpp \ @@ -226,6 +225,7 @@ lmms_SOURCES = \ $(srcdir)/src/widgets/group_box.cpp \ $(srcdir)/src/widgets/kmultitabbar.cpp \ $(srcdir)/src/widgets/knob.cpp \ + $(srcdir)/src/widgets/ladspa_control_view.cpp \ $(srcdir)/src/widgets/lcd_spinbox.cpp \ $(srcdir)/src/widgets/led_checkbox.cpp \ $(srcdir)/src/widgets/nstate_button.cpp \ diff --git a/plugins/ladspa_effect/ladspa_control_dialog.cpp b/plugins/ladspa_effect/ladspa_control_dialog.cpp index f38a96710..a869913f2 100644 --- a/plugins/ladspa_effect/ladspa_control_dialog.cpp +++ b/plugins/ladspa_effect/ladspa_control_dialog.cpp @@ -41,13 +41,14 @@ ladspaControlDialog::ladspaControlDialog( ladspaControls * _ctl ) : QHBoxLayout * effectLay = new QHBoxLayout(); mainLay->addLayout( effectLay ); - int rows = static_cast( sqrt( - static_cast( _ctl->m_controlCount ) ) ); - + const int cols = static_cast( sqrt( + static_cast( _ctl->m_controlCount / + _ctl->m_processors ) ) ); for( ch_cnt_t proc = 0; proc < _ctl->m_processors; proc++ ) { control_list_t & controls = _ctl->m_controls[proc]; - int row_cnt = 0; + int row = 0; + int col = 0; buffer_data_t last_port = NONE; QGroupBox * grouper; @@ -61,6 +62,9 @@ ladspaControlDialog::ladspaControlDialog( ladspaControls * _ctl ) : { grouper = new QGroupBox( this ); } + + QGridLayout * gl = new QGridLayout( grouper ); + grouper->setLayout( gl ); grouper->setAlignment( Qt::Vertical ); for( control_list_t::iterator it = controls.begin(); @@ -68,28 +72,23 @@ ladspaControlDialog::ladspaControlDialog( ladspaControls * _ctl ) : { if( (*it)->getPort()->proc == proc ) { - if( last_port == NONE || - (*it)->getPort()->data_type != TOGGLED || - ( (*it)->getPort()->data_type == TOGGLED && - last_port == TOGGLED ) ) + if( last_port != NONE && + (*it)->getPort()->data_type == + TOGGLED && + !( (*it)->getPort()->data_type == + TOGGLED && + last_port == TOGGLED ) ) { - new ladspaControlView( grouper, *it ); + ++row; + col = 0; } - else + gl->addWidget( new ladspaControlView( + grouper, *it ), + row, col ); + if( ++col == cols ) { - while( row_cnt < rows ) - { - new QWidget( grouper ); - row_cnt++; - } - new ladspaControlView( grouper, *it ); - row_cnt = 0; - } - - row_cnt++; - if( row_cnt == ( rows - 1 ) ) - { - row_cnt = 0; + ++row; + col = 0; } last_port = (*it)->getPort()->data_type; } diff --git a/plugins/ladspa_effect/ladspa_controls.cpp b/plugins/ladspa_effect/ladspa_controls.cpp index 7a7fb5bf3..e956e19da 100644 --- a/plugins/ladspa_effect/ladspa_controls.cpp +++ b/plugins/ladspa_effect/ladspa_controls.cpp @@ -43,10 +43,10 @@ ladspaControls::ladspaControls( ladspaEffect * _eff, for( ch_cnt_t proc = 0; proc < m_processors; proc++ ) { control_list_t p; - - bool linked_control = ( m_processors > 1 && proc == 0 ); + + const bool linked_control = ( m_processors > 1 && proc == 0 ); buffer_data_t last_port = NONE; - + for( multi_proc_t::iterator it = controls.begin(); it != controls.end(); it++ ) { @@ -69,7 +69,7 @@ ladspaControls::ladspaControls( ladspaEffect * _eff, } } } - + m_controls.append( p ); } } diff --git a/src/core/ladspa_control.cpp b/src/core/ladspa_control.cpp index b0e846344..db76bdab3 100644 --- a/src/core/ladspa_control.cpp +++ b/src/core/ladspa_control.cpp @@ -31,16 +31,16 @@ ladspaControl::ladspaControl( model * _parent, port_desc_t * _port, track * _track, bool _link ) : model( _parent ), + m_link( _link ), m_port( _port ), - m_linkEnabledModel( FALSE, FALSE, TRUE, boolModel::defaultRelStep(), + m_linkEnabledModel( _link, FALSE, TRUE, boolModel::defaultRelStep(), this ), m_toggledModel( FALSE, FALSE, TRUE, boolModel::defaultRelStep(), this ), m_knobModel( 0, 0, 0, 1, this ) { - if( _link ) + if( m_link ) { - m_linkEnabledModel.setValue( FALSE ); m_linkEnabledModel.setTrack( _track ); connect( &m_linkEnabledModel, SIGNAL( dataChanged() ), this, SLOT( linkStateChanged() ) ); diff --git a/src/widgets/combobox.cpp b/src/widgets/combobox.cpp index 8df63299a..06bd4f395 100644 --- a/src/widgets/combobox.cpp +++ b/src/widgets/combobox.cpp @@ -202,10 +202,10 @@ void comboBox::paintEvent( QPaintEvent * _pe ) tx += pm.width() + 2; } p.setPen( QColor( 64, 64, 64 ) ); - p.drawText( tx+1, p.fontMetrics().height()-1, + p.drawText( tx+1, p.fontMetrics().height()-3, model()->currentText() ); p.setPen( QColor( 224, 224, 224 ) ); - p.drawText( tx, p.fontMetrics().height()-2, + p.drawText( tx, p.fontMetrics().height()-4, model()->currentText() ); } } diff --git a/src/widgets/knob.cpp b/src/widgets/knob.cpp index 6b6e681a6..6b1fc3e3b 100644 --- a/src/widgets/knob.cpp +++ b/src/widgets/knob.cpp @@ -84,8 +84,6 @@ knob::knob( int _knob_num, QWidget * _parent, const QString & _name ) : m_knobPixmap = new QPixmap( embed::getIconPixmap( QString( "knob0" + QString::number( m_knobNum + 1 ) ).toAscii().constData() ) ); - //setRange( 0.0f, 100.0f, 1.0f ); - setFixedSize( m_knobPixmap->width(), m_knobPixmap->height() ); setTotalAngle( 270.0f ); } @@ -451,7 +449,7 @@ void knob::paintEvent( QPaintEvent * _me ) p.translate( -ur.x(), -ur.y() ); drawKnob( &p ); - if( m_label != "" ) + if( !m_label.isEmpty() ) { p.setFont( pointSize<6>( p.font() ) ); p.setPen( QColor( 64, 64, 64 ) ); diff --git a/src/widgets/ladspa_control_view.cpp b/src/widgets/ladspa_control_view.cpp index dff6e0167..98f761966 100644 --- a/src/widgets/ladspa_control_view.cpp +++ b/src/widgets/ladspa_control_view.cpp @@ -40,6 +40,8 @@ ladspaControlView::ladspaControlView( QWidget * _parent, m_ctl( _ctl ) { QHBoxLayout * layout = new QHBoxLayout( this ); + layout->setMargin( 0 ); + layout->setSpacing( 0 ); ledCheckBox * link = NULL; @@ -62,13 +64,17 @@ ladspaControlView::ladspaControlView( QWidget * _parent, QString::null, ledCheckBox::GREEN ); toggle->setModel( m_ctl->getToggledModel() ); - setFixedSize( toggle->width(), toggle->height() ); - if( m_ctl->m_link ) + layout->addWidget( toggle ); + if( link != NULL ) { - layout->addWidget( toggle ); setFixedSize( link->width() + toggle->width(), toggle->height() ); } + else + { + setFixedSize( toggle->width(), + toggle->height() ); + } break; } @@ -93,13 +99,16 @@ ladspaControlView::ladspaControlView( QWidget * _parent, knb->setLabel( m_ctl->getPort()->name ); knb->setHintText( tr( "Value:" ) + " ", "" ); knb->setWhatsThis( tr( "Sorry, no help available." ) ); - setFixedSize( knb->width(), knb->height() ); - if( m_ctl->m_link ) + layout->addWidget( knb ); + if( link != NULL ) { - layout->addWidget( knb ); setFixedSize( link->width() + knb->width(), knb->height() ); } + else + { + setFixedSize( knb->width(), knb->height() ); + } } } From 157940921c0ef8fbb3c0646732e414cb27256161 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Fri, 18 Jan 2008 17:08:25 +0000 Subject: [PATCH 29/87] made effect-settings load again git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@668 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 16 ++++++++++++++++ include/effect_rack_view.h | 2 +- plugins/bass_booster/bass_booster.cpp | 2 +- plugins/bass_booster/bass_booster.h | 7 +------ plugins/ladspa_effect/ladspa_effect.h | 5 ----- plugins/vst_effect/vst_effect.h | 5 ----- src/core/effect_chain.cpp | 15 ++++++--------- src/lib/mmp.cpp | 22 +++++++++++++++++++++- src/widgets/effect_rack_view.cpp | 14 ++++++++------ 9 files changed, 54 insertions(+), 34 deletions(-) diff --git a/ChangeLog b/ChangeLog index ab897f428..5669407f6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,21 @@ 2008-01-18 Tobias Doerffel + * src/core/effect_chain.cpp: + * src/lib/mmp.cpp: + added upgrade-path in order to properly load projects not using the + new effect-data-structure + + * plugins/bass_booster/bass_booster.h: + * plugins/ladspa_effect/ladspa_effect.h: + * plugins/vst_effect/vst_effect.h: + removed nodeName()-function as effects must not overload it (they have + descriptors with they unique name in it) + + * include/effect_rack_view.h: + * src/widgets/effect_rack_view.cpp: + renamed updateView() to update() in order to also track + dataChanged()-signals of model without an additional connection + * src/widgets/combobox.cpp: fixed painting diff --git a/include/effect_rack_view.h b/include/effect_rack_view.h index ea98a68c4..434ea598c 100644 --- a/include/effect_rack_view.h +++ b/include/effect_rack_view.h @@ -54,7 +54,7 @@ public slots: private slots: - void updateView( void ); + virtual void update( void ); void addEffect( void ); diff --git a/plugins/bass_booster/bass_booster.cpp b/plugins/bass_booster/bass_booster.cpp index 1d4ddc22a..6a9865801 100644 --- a/plugins/bass_booster/bass_booster.cpp +++ b/plugins/bass_booster/bass_booster.cpp @@ -1,7 +1,7 @@ /* * bass_booster.cpp - bass-booster-effect-plugin * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * diff --git a/plugins/bass_booster/bass_booster.h b/plugins/bass_booster/bass_booster.h index 4f71820ea..2ec5b15af 100644 --- a/plugins/bass_booster/bass_booster.h +++ b/plugins/bass_booster/bass_booster.h @@ -1,7 +1,7 @@ /* * bass_booster.h - bass-booster-effect-plugin * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -51,11 +51,6 @@ public: return( &m_bbControls ); } -/* inline virtual QString nodeName( void ) const - { - return( "bassboostereffect" ); - }*/ - private: effectLib::monoToStereoAdaptor > m_bbFX; diff --git a/plugins/ladspa_effect/ladspa_effect.h b/plugins/ladspa_effect/ladspa_effect.h index 3913bee4c..9ea8aa22d 100644 --- a/plugins/ladspa_effect/ladspa_effect.h +++ b/plugins/ladspa_effect/ladspa_effect.h @@ -69,11 +69,6 @@ public: m_effName = _name; } - inline virtual QString nodeName( void ) const - { - return( "ladspaeffect" ); - } - private: ladspaControls * m_controls; diff --git a/plugins/vst_effect/vst_effect.h b/plugins/vst_effect/vst_effect.h index 404d47a23..25ee7cef2 100644 --- a/plugins/vst_effect/vst_effect.h +++ b/plugins/vst_effect/vst_effect.h @@ -57,11 +57,6 @@ public: this ) ); } - inline virtual QString nodeName( void ) const - { - return( "vsteffect" ); - } - private: void openPlugin( const QString & _plugin ); diff --git a/src/core/effect_chain.cpp b/src/core/effect_chain.cpp index 085dab678..31d2c27b4 100644 --- a/src/core/effect_chain.cpp +++ b/src/core/effect_chain.cpp @@ -53,7 +53,7 @@ effectChain::~effectChain() void effectChain::saveSettings( QDomDocument & _doc, QDomElement & _this ) { - _this.setAttribute( "fxenabled", m_enabledModel.value() ); + _this.setAttribute( "enabled", m_enabledModel.value() ); _this.setAttribute( "numofeffects", m_effects.count() ); for( effectList::iterator it = m_effects.begin(); it != m_effects.end(); it++ ) @@ -69,19 +69,15 @@ void effectChain::saveSettings( QDomDocument & _doc, QDomElement & _this ) void effectChain::loadSettings( const QDomElement & _this ) { -// deleteAllPlugins(); - for( int i = 0; i < m_effects.count(); ++i ) - { - delete m_effects[i]; - } - m_effects.clear(); + deleteAllPlugins(); - m_enabledModel.setValue( _this.attribute( "fxenabled" ).toInt() ); + m_enabledModel.setValue( _this.attribute( "enabled" ).toInt() ); const int plugin_cnt = _this.attribute( "numofeffects" ).toInt(); QDomNode node = _this.firstChild(); - for( int i = 0; i < plugin_cnt; i++ ) + int fx_loaded = 0; + while( !node.isNull() && fx_loaded < plugin_cnt ) { if( node.isElement() && node.nodeName() == "effect" ) { @@ -102,6 +98,7 @@ void effectChain::loadSettings( const QDomElement & _this ) e->restoreState( node.toElement() ); } } + ++fx_loaded; } node = node.nextSibling(); } diff --git a/src/lib/mmp.cpp b/src/lib/mmp.cpp index b41aa4f40..395bd8400 100644 --- a/src/lib/mmp.cpp +++ b/src/lib/mmp.cpp @@ -580,11 +580,31 @@ void multimediaProject::upgrade( void ) if( el.hasAttribute( "fxdisabled" ) && el.attribute( "fxdisabled" ).toInt() == 0 ) { - el.setAttribute( "fxenabled", 1 ); + el.setAttribute( "enabled", 1 ); } } } + if( version < "0.4.0-svn20080118" ) + { + QDomNodeList list = elementsByTagName( "fx" ); + for( int i = 0; !list.item( i ).isNull(); ++i ) + { + QDomElement fxchain = list.item( i ).toElement(); + fxchain.setTagName( "fxchain" ); + QDomNode rack = list.item( i ).firstChild(); + QDomNodeList effects = rack.childNodes(); + // move items one level up + while( effects.count() ) + { + fxchain.appendChild( effects.at( 0 ) ); + } + fxchain.setAttribute( "numofeffects", + rack.toElement().attribute( "numofeffects" ) ); + fxchain.removeChild( rack ); + } + } + if( !m_head.hasAttribute( "mastervol" ) ) { m_head.setAttribute( "mastervol", 100 ); diff --git a/src/widgets/effect_rack_view.cpp b/src/widgets/effect_rack_view.cpp index bbf4d6feb..a10ceddb7 100644 --- a/src/widgets/effect_rack_view.cpp +++ b/src/widgets/effect_rack_view.cpp @@ -56,7 +56,7 @@ effectRackView::effectRackView( effectChain * _model, QWidget * _parent ) : m_scrollArea->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOn ); m_scrollArea->setPalette( QApplication::palette( m_scrollArea ) ); m_scrollArea->move( 6, 22 ); - + m_addButton = new QPushButton( m_effectsGroupBox/*, "Add Effect"*/ ); m_addButton->setText( tr( "Add" ) ); m_addButton->move( 75, 210 ); @@ -119,7 +119,7 @@ void effectRackView::moveUp( effectView * _view ) m_effectViews[i - 1] = _view; m_effectViews[i] = temp; - updateView(); + update(); } } @@ -171,13 +171,13 @@ void effectRackView::deletePlugin( effectView * _view ) fxChain()->m_effects.end(), e ) ); delete e; - updateView(); + update(); } -void effectRackView::updateView( void ) +void effectRackView::update( void ) { QWidget * w = m_scrollArea->widget(); QVector view_map( fxChain()->m_effects.size(), FALSE ); @@ -230,6 +230,8 @@ void effectRackView::updateView( void ) } } w->setFixedSize( 210, m_lastY ); + + QWidget::update(); } @@ -246,7 +248,7 @@ void effectRackView::addEffect( void ) } fxChain()->appendEffect( esd.instantiateSelectedPlugin( fxChain() ) ); - updateView(); + update(); } @@ -255,7 +257,7 @@ void effectRackView::addEffect( void ) void effectRackView::modelChanged( void ) { m_effectsGroupBox->setModel( &fxChain()->m_enabledModel ); - updateView(); + update(); } From 0f23db9f9aa755eb8274bd02960e05678d5fdb89 Mon Sep 17 00:00:00 2001 From: Paul Giblock Date: Thu, 24 Jan 2008 05:50:29 +0000 Subject: [PATCH 30/87] updated boolModel, split lb302 for MV but there is a bug git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@669 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 17 + include/automatable_model.h | 12 +- .../audio_file_processor.cpp | 4 +- plugins/lb302/lb302.cpp | 343 ++++++++++-------- plugins/lb302/lb302.h | 65 +++- src/core/arp_and_chords_tab_widget.cpp | 4 +- src/core/effect.cpp | 2 +- src/core/envelope_tab_widget.cpp | 2 +- src/core/ladspa_control.cpp | 6 +- src/widgets/knob.cpp | 2 +- 10 files changed, 274 insertions(+), 183 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5669407f6..7a8ebd363 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2008-01-24 Paul Giblock + + * include/automatable_model.h: + * src/widgets/knob.cpp: + * src/core/arp_and_chords_tab_widget.cpp: + * src/core/effect.cpp: + * src/core/ladspa_control.cpp: + * src/core/envelope_tab_widget.cpp: + * plugins/audio_file_processor/audio_file_processor.cpp: + add boolModel subclass in order to simplify the constructor + + * plugins/lb302/lb302.cpp: + * plugins/lb302/lb302.h: + split lb302 for M/V. However, lmms_plugin_main() receives null data, + which means the instrumentTrack cannot be set.. + + 2008-01-18 Tobias Doerffel * src/core/effect_chain.cpp: diff --git a/include/automatable_model.h b/include/automatable_model.h index 88249c7cc..3cf537cb0 100644 --- a/include/automatable_model.h +++ b/include/automatable_model.h @@ -288,10 +288,20 @@ public: // some model-primitives -generateModelPrimitive(bool,signed char); +//generateModelPrimitive(bool,signed char); generateModelPrimitive(float,float); generateModelPrimitive(int,int); +class boolModel : public automatableModel { +public: + boolModel( const bool _val = FALSE, + ::model * _parent = NULL, + bool _default_constructed = FALSE ) : + automatableModel( _val, FALSE, TRUE, defaultRelStep(), _parent, _default_constructed ) + {} +}; + +typedef automatableModelView boolModelView; #endif diff --git a/plugins/audio_file_processor/audio_file_processor.cpp b/plugins/audio_file_processor/audio_file_processor.cpp index d66d55dee..25fc3fc39 100644 --- a/plugins/audio_file_processor/audio_file_processor.cpp +++ b/plugins/audio_file_processor/audio_file_processor.cpp @@ -77,8 +77,8 @@ audioFileProcessor::audioFileProcessor( instrumentTrack * _instrument_track ) : m_ampModel( 100, 0, 500, 1, this ), m_startPointModel( 0, 0, 1, 0.0000001f, this ), m_endPointModel( 1, 0, 1, 0.0000001f, this ), - m_reverseModel( FALSE, FALSE, TRUE, boolModel::defaultRelStep(), this ), - m_loopModel( FALSE, FALSE, TRUE, boolModel::defaultRelStep(), this ) + m_reverseModel( FALSE, this ), + m_loopModel( FALSE, this ) { connect( &m_reverseModel, SIGNAL( dataChanged() ), this, SLOT( reverseModelChanged() ) ); diff --git a/plugins/lb302/lb302.cpp b/plugins/lb302/lb302.cpp index 787e624bc..9019c847c 100644 --- a/plugins/lb302/lb302.cpp +++ b/plugins/lb302/lb302.cpp @@ -39,6 +39,7 @@ #include "note_play_handle.h" #include "templates.h" #include "audio_port.h" +#include "automatable_model_templates.h" #undef SINGLE_SOURCE_COMPILE #include "embed.cpp" @@ -306,132 +307,65 @@ void lb302Filter3Pole::setState(const lb302FilterState* fs) // LBSynth // -lb302Synth::lb302Synth( instrumentTrack * _channel_track ) : - instrument( _channel_track, &lb302_plugin_descriptor ) +lb302Synth::lb302Synth( instrumentTrack * _instrumentTrack ) : + instrument( _instrumentTrack, &lb302_plugin_descriptor ), + vcf_cut_knob( 0.75f, 0.0f, 1.5f, 0.005f, this ), + vcf_res_knob( 0.75f, 0.0f, 1.25f, 0.005f, this ), + vcf_mod_knob( 0.1f, 0.0f, 1.0f, 0.005f, this ), + vcf_dec_knob( 0.1f, 0.0f, 1.0f, 0.005f, this ), + vco_fine_detune_knob( 0.0f, -100.0f, 100.0f, 1.0f, this ), + dist_knob( 0.0f, 0.0f, 1.0f, 0.01f, this ), + wave_knob( 0.0f, 0.0f, 5.0f, 1.0f, this ), + slide_dec_knob( 0.6f, 0.0f, 1.0f, 0.005f, this ), + slideToggle( FALSE, this ), + accentToggle( FALSE, this ), + deadToggle( FALSE, this ), + db24Toggle( FALSE, this ) + { - // GUI +printf("Set track: %Lx\n", (unsigned long long)_instrumentTrack); - vcf_cut_knob = new knob( knobBright_26, this, tr( "VCF Cutoff Frequency" ), - _channel_track ); - vcf_cut_knob->setRange( 0.0f, 1.5f, 0.005f ); // Originally [0,1.0] - vcf_cut_knob->setInitValue( 0.75f ); - vcf_cut_knob->move( 75, 130 ); - vcf_cut_knob->setHintText( tr( "Cutoff Freq:" ) + " ", "" ); - vcf_cut_knob->setLabel( tr("CUT") ); - - vcf_res_knob = new knob( knobBright_26, this, tr( "VCF Resonance" ), - _channel_track ); - vcf_res_knob->setRange( 0.0f, 1.25f, 0.005f ); // Originally [0,1.0] - vcf_res_knob->setInitValue( 0.75f ); - vcf_res_knob->move( 120, 130 ); - vcf_res_knob->setHintText( tr( "Resonance:" ) + " ", "" ); - vcf_res_knob->setLabel( tr("RES") ); - - vcf_mod_knob = new knob( knobBright_26, this, tr( "VCF Envelope Mod" ), - _channel_track ); - vcf_mod_knob->setRange( 0.0f, 1.0f, 0.005f ); // Originally [0,1.0] - vcf_mod_knob->setInitValue( 1.0f ); - vcf_mod_knob->move( 165, 130 ); - vcf_mod_knob->setHintText( tr( "Env Mod:" ) + " ", "" ); - vcf_mod_knob->setLabel( tr("ENV MOD") ); - - vcf_dec_knob = new knob( knobBright_26, this, tr( "VCF Envelope Decay" ), - _channel_track ); - vcf_dec_knob->setRange( 0.0f, 1.0f, 0.005f ); // Originally [0,1.0] - vcf_dec_knob->setInitValue( 0.1f ); - vcf_dec_knob->move( 210, 130 ); - vcf_dec_knob->setHintText( tr( "Decay:" ) + " ", "" ); - vcf_dec_knob->setLabel( tr("DEC") ); - - slideToggle = new ledCheckBox( "Slide", this, - tr( "Slide" ), - _channel_track ); - slideToggle->move( 10, 180 ); - - - accentToggle = new ledCheckBox( "Accent", this, - tr( "Accent" ), - _channel_track ); - accentToggle->move( 10, 200 ); - accentToggle->setDisabled(true); - - - deadToggle = new ledCheckBox( "Dead", this, - tr( "Dead" ), - _channel_track ); - deadToggle->move( 10, 220 ); - - db24Toggle = new ledCheckBox( "24dB/oct", this, - tr( "303-es-que, 24dB/octave, 3 pole filter" ), - _channel_track ); - db24Toggle->move( 10, 150); - - - slide_dec_knob = new knob( knobBright_26, this, tr( "Slide Decay" ), - _channel_track ); - slide_dec_knob->setRange( 0.0f, 1.0f, 0.005f ); // Originally [0,1.0] - slide_dec_knob->setInitValue( 0.6f ); - slide_dec_knob->move( 210, 75 ); - slide_dec_knob->setHintText( tr( "Slide Decay:" ) + " ", "" ); - slide_dec_knob->setLabel( tr( "SLIDE")); - - vco_fine_detune_knob = new knob( knobBright_26, this, - tr("Fine detuning of the VCO. Ranged between -100 and 100 centes."), - _channel_track ); - vco_fine_detune_knob->setRange(-100.0f, 100.0f, 1.0f); - vco_fine_detune_knob->setInitValue(0.0f); - vco_fine_detune_knob->move(165,75); - vco_fine_detune_knob->setHintText( tr( "VCO Fine Detuning:") + " ", "cents"); - vco_fine_detune_knob->setLabel( tr( "DETUNE")); - - - dist_knob = new knob( knobBright_26, this, tr( "Distortion" ), - _channel_track ); - dist_knob->setRange( 0.0f, 1.0f, 0.01f ); // Originally [0,1.0] - dist_knob->setInitValue( 0.0f ); - dist_knob->move( 210, 190 ); - dist_knob->setHintText( tr( "DIST:" ) + " ", "" ); - dist_knob->setLabel( tr( "DIST")); - - - wave_knob = new knob( knobBright_26, this, tr( "Waveform" ), - _channel_track ); - wave_knob->setRange( 0.0f, 5.0f, 1.0f ); // Originally [0,1.0] - wave_knob->setInitValue( 0.0f ); - wave_knob->move( 120, 75 ); - wave_knob->setHintText( tr( "WAVE:" ) + " ", "" ); - wave_knob->setLabel( tr( "WAVE")); - - - connect( vcf_cut_knob, SIGNAL( valueChanged( float ) ), +/* + connect( &vcf_cut_knob, SIGNAL( valueChanged( float ) ), this, SLOT ( filterChanged( float ) ) ); - connect( vcf_res_knob, SIGNAL( valueChanged( float ) ), + connect( &vcf_res_knob, SIGNAL( valueChanged( float ) ), this, SLOT ( filterChanged( float ) ) ); - connect( vcf_mod_knob, SIGNAL( valueChanged( float ) ), + connect( &vcf_mod_knob, SIGNAL( valueChanged( float ) ), this, SLOT ( filterChanged( float ) ) ); - connect( vcf_dec_knob, SIGNAL( valueChanged( float ) ), + connect( &vcf_dec_knob, SIGNAL( valueChanged( float ) ), this, SLOT ( filterChanged( float ) ) ); - connect( vco_fine_detune_knob, SIGNAL( valueChanged( float ) ), + connect( &vco_fine_detune_knob, SIGNAL( valueChanged( float ) ), this, SLOT ( detuneChanged( float) ) ); - connect( db24Toggle, SIGNAL( toggled( bool ) ), + connect( &db24Toggle, SIGNAL( toggled( bool ) ), this, SLOT ( db24Toggled( bool) ) ); - connect( dist_knob, SIGNAL( valueChanged(float) ), + connect( &dist_knob, SIGNAL( valueChanged(float) ), this, SLOT ( filterChanged( float ))); - connect( wave_knob, SIGNAL( valueChanged(float) ), + connect( &wave_knob, SIGNAL( valueChanged(float) ), this, SLOT ( waveChanged( float ))); +*/ - setAutoFillBackground( TRUE ); - QPalette pal; - pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( - "artwork" ) ); - setPalette( pal ); + vcf_cut_knob.setTrack( _instrumentTrack ); + vcf_res_knob.setTrack( _instrumentTrack ); + vcf_mod_knob.setTrack( _instrumentTrack ); + vcf_dec_knob.setTrack( _instrumentTrack ); + + vco_fine_detune_knob.setTrack( _instrumentTrack ); + + dist_knob.setTrack( _instrumentTrack ); + wave_knob.setTrack( _instrumentTrack ); + slide_dec_knob.setTrack( _instrumentTrack ); + + slideToggle.setTrack( _instrumentTrack ); + accentToggle.setTrack( _instrumentTrack ); + deadToggle.setTrack( _instrumentTrack ); + db24Toggle.setTrack( _instrumentTrack ); // SYNTH @@ -496,19 +430,19 @@ lb302Synth::~lb302Synth() void lb302Synth::saveSettings( QDomDocument & _doc, QDomElement & _this ) { - vcf_cut_knob->saveSettings( _doc, _this, "vcf_cut" ); - vcf_res_knob->saveSettings( _doc, _this, "vcf_res" ); - vcf_mod_knob->saveSettings( _doc, _this, "vcf_mod" ); - vcf_dec_knob->saveSettings( _doc, _this, "vcf_dec" ); + vcf_cut_knob.saveSettings( _doc, _this, "vcf_cut" ); + vcf_res_knob.saveSettings( _doc, _this, "vcf_res" ); + vcf_mod_knob.saveSettings( _doc, _this, "vcf_mod" ); + vcf_dec_knob.saveSettings( _doc, _this, "vcf_dec" ); - vco_fine_detune_knob->saveSettings( _doc, _this, "vco_detune" ); - wave_knob->saveSettings( _doc, _this, "shape"); - dist_knob->saveSettings( _doc, _this, "dist"); - slide_dec_knob->saveSettings( _doc, _this, "slide_dec"); + vco_fine_detune_knob.saveSettings( _doc, _this, "vco_detune" ); + wave_knob.saveSettings( _doc, _this, "shape"); + dist_knob.saveSettings( _doc, _this, "dist"); + slide_dec_knob.saveSettings( _doc, _this, "slide_dec"); - slideToggle->saveSettings( _doc, _this, "slide"); - deadToggle->saveSettings( _doc, _this, "dead"); - db24Toggle->saveSettings( _doc, _this, "db24"); + slideToggle.saveSettings( _doc, _this, "slide"); + deadToggle.saveSettings( _doc, _this, "dead"); + db24Toggle.saveSettings( _doc, _this, "db24"); } @@ -516,19 +450,19 @@ void lb302Synth::saveSettings( QDomDocument & _doc, void lb302Synth::loadSettings( const QDomElement & _this ) { - vcf_cut_knob->loadSettings( _this, "vcf_cut" ); - vcf_res_knob->loadSettings( _this, "vcf_res" ); - vcf_mod_knob->loadSettings( _this, "vcf_mod" ); - vcf_dec_knob->loadSettings( _this, "vcf_dec" ); + vcf_cut_knob.loadSettings( _this, "vcf_cut" ); + vcf_res_knob.loadSettings( _this, "vcf_res" ); + vcf_mod_knob.loadSettings( _this, "vcf_mod" ); + vcf_dec_knob.loadSettings( _this, "vcf_dec" ); - vco_fine_detune_knob->loadSettings( _this, "vco_detune" ); - dist_knob->loadSettings( _this, "dist"); - wave_knob->loadSettings( _this, "shape"); - slide_dec_knob->loadSettings( _this, "slide_dec"); + vco_fine_detune_knob.loadSettings( _this, "vco_detune" ); + dist_knob.loadSettings( _this, "dist"); + wave_knob.loadSettings( _this, "shape"); + slide_dec_knob.loadSettings( _this, "slide_dec"); - slideToggle->loadSettings( _this, "slide"); - deadToggle->loadSettings( _this, "dead"); - db24Toggle->loadSettings( _this, "db24"); + slideToggle.loadSettings( _this, "slide"); + deadToggle.loadSettings( _this, "dead"); + db24Toggle.loadSettings( _this, "db24"); filterChanged(0.0); detuneChanged(0.0); @@ -538,12 +472,12 @@ void lb302Synth::loadSettings( const QDomElement & _this ) // recalcFilter. void lb302Synth::filterChanged( float ) { - fs.cutoff = vcf_cut_knob->value(); - fs.reso = vcf_res_knob->value(); - fs.envmod = vcf_mod_knob->value(); - fs.dist = LB_DIST_RATIO*dist_knob->value(); + fs.cutoff = vcf_cut_knob.value(); + fs.reso = vcf_res_knob.value(); + fs.envmod = vcf_mod_knob.value(); + fs.dist = LB_DIST_RATIO*dist_knob.value(); - float d = 0.2 + (2.3*vcf_dec_knob->value()); + float d = 0.2 + (2.3*vcf_dec_knob.value()); d*=LB_HZ; // d *= smpl rate fs.envdecay = pow(0.1, 1.0/d * ENVINC); // decay is 0.1 to the 1/d * ENVINC // vcf_envdecay is now adjusted for both @@ -554,7 +488,7 @@ void lb302Synth::filterChanged( float ) void lb302Synth::db24Toggled( bool ) { delete vcf; - if(db24Toggle->isChecked()) { + if(db24Toggle.value()) { vcf = new lb302Filter3Pole(&fs); } else { @@ -573,7 +507,7 @@ void lb302Synth::detuneChanged( float ) slidebase_freq = vco_slidebase*LB_HZ/vco_detune; } - vco_detune = powf(2.0f, (float)vco_fine_detune_knob->value()/1200.0f); + vco_detune = powf(2.0f, (float)vco_fine_detune_knob.value()/1200.0f); vco_inc = freq*vco_detune/LB_HZ; // If a slide note is pending, @@ -589,14 +523,16 @@ void lb302Synth::detuneChanged( float ) // TODO: Set vco_shape in here. void lb302Synth::waveChanged( float ) { - switch(int(rint(wave_knob->value()))) { - case 0: wave_knob->setHintText(tr("Sawtooth "),""); break; - case 1: wave_knob->setHintText(tr("Inverted Sawtooth "),""); break; - case 2: wave_knob->setHintText(tr("Triangle "),""); break; - case 3: wave_knob->setHintText(tr("Square "),""); break; - case 4: wave_knob->setHintText(tr("Rounded Square "),""); break; - case 5: wave_knob->setHintText(tr("Moog "),""); break; +/* + switch(int(rint(wave_knob.value()))) { + case 0: wave_knob.setHintText(tr("Sawtooth "),""); break; + case 1: wave_knob.setHintText(tr("Inverted Sawtooth "),""); break; + case 2: wave_knob.setHintText(tr("Triangle "),""); break; + case 3: wave_knob.setHintText(tr("Square "),""); break; + case 4: wave_knob.setHintText(tr("Rounded Square "),""); break; + case 5: wave_knob.setHintText(tr("Moog "),""); break; } +*/ } QString lb302Synth::nodeName( void ) const @@ -654,7 +590,7 @@ int lb302Synth::process(sampleFrame *outbuf, const Uint32 size) if (vco_slide) { vco_inc=vco_slidebase-vco_slide; // Calculate coeff from dec_knob on knob change. - vco_slide*= 0.9+(slide_dec_knob->value()*0.0999); // TODO: Adjust for Hz and ENVINC + vco_slide*= 0.9+(slide_dec_knob.value()*0.0999); // TODO: Adjust for Hz and ENVINC } } @@ -683,7 +619,7 @@ int lb302Synth::process(sampleFrame *outbuf, const Uint32 size) } - switch(int(rint(wave_knob->value()))) { + switch(int(rint(wave_knob.value()))) { case 0: vco_shape = SAWTOOTH; break; case 1: vco_shape = INVERTED_SAWTOOTH; break; case 2: vco_shape = TRIANGLE; break; @@ -704,7 +640,6 @@ int lb302Synth::process(sampleFrame *outbuf, const Uint32 size) vco_k = -vco_c; // Is this sawtooth backwards? break; - // TODO: I think TRIANGLE is broken. case TRIANGLE: // p0: duty rev.saw<->triangle<->saw p1: curviness vco_k = (vco_c*2.0)+0.5; if (vco_k>0.5) vco_k = 1.0-vco_k; @@ -808,7 +743,7 @@ void lb302Synth::initNote( lb302Note *n) // End break-out // Slide note, save inc for next note - if (slideToggle->value()) { + if (slideToggle.value()) { vco_slideinc = vco_inc; // May need to equal vco_slidebase+vco_slide if last note slid } @@ -832,7 +767,7 @@ void lb302Synth::playNote( notePlayHandle * _n, bool ) { fpp_t framesPerPeriod = engine::getMixer()->framesPerPeriod(); - ///=== WEIRD CODE FOR MONOPHONIC BEHAVIOUR - BEGIN === /// + // if( _n->arpBaseNote() ) { @@ -913,7 +848,7 @@ void lb302Synth::playNote( notePlayHandle * _n, bool ) #endif - ///=== WEIRD CODE FOR MONOPHONIC BEHAVIOUR - END === /// + // /// Malloc our period history buffer if (period_states == NULL) { @@ -952,7 +887,7 @@ void lb302Synth::playNote( notePlayHandle * _n, bool ) /// This code is obsolete, hence the "if false" // Existing note. Allow it to decay. - if(deadToggle->value()==0 && decay_note) { + if(deadToggle.value() == 0 && decay_note) { #ifdef LB_DECAY if (catch_decay < 1) { // BEGIN NOT SURE OF... @@ -972,7 +907,7 @@ void lb302Synth::playNote( notePlayHandle * _n, bool ) #else lb302Note note; note.vco_inc = _n->frequency()*vco_detune/LB_HZ; // TODO: Use actual sampling rate. - note.dead = deadToggle->value(); + note.dead = deadToggle.value(); initNote(¬e); vca_mode=0; vca_a = state->vca_a; @@ -983,7 +918,7 @@ void lb302Synth::playNote( notePlayHandle * _n, bool ) else { lb302Note note; note.vco_inc = _n->frequency()*vco_detune/LB_HZ; // TODO: Use actual sampling rate. - note.dead = deadToggle->value(); + note.dead = deadToggle.value(); initNote(¬e); use_hold_note = false; } @@ -993,6 +928,7 @@ void lb302Synth::playNote( notePlayHandle * _n, bool ) sampleFrame *buf = new sampleFrame[frames]; process(buf, frames); + printf("track %Lx\n", getInstrumentTrack()); getInstrumentTrack()->processAudioBuffer( buf, frames, _n ); delete[] buf; @@ -1008,6 +944,106 @@ void lb302Synth::deleteNotePluginData( notePlayHandle * _n ) } +pluginView * lb302Synth::instantiateView( QWidget * _parent ) +{ + return( new lb302SynthView( this, _parent ) ); +} + + +lb302SynthView::lb302SynthView( instrument * _instrument, QWidget * _parent ) : + instrumentView( _instrument, _parent ) +{ + // GUI + m_vcfCutKnob = new knob( knobBright_26, this, tr( "VCF Cutoff Frequency" ) ); + m_vcfCutKnob->move( 75, 130 ); + m_vcfCutKnob->setHintText( tr( "Cutoff Freq:" ) + " ", "" ); + m_vcfCutKnob->setLabel( tr("CUT") ); + + m_vcfResKnob = new knob( knobBright_26, this, tr( "VCF Resonance" ) ); + m_vcfResKnob->move( 120, 130 ); + m_vcfResKnob->setHintText( tr( "Resonance:" ) + " ", "" ); + m_vcfResKnob->setLabel( tr("RES") ); + + m_vcfModKnob = new knob( knobBright_26, this, tr( "VCF Envelope Mod" ) ); + m_vcfModKnob->move( 165, 130 ); + m_vcfModKnob->setHintText( tr( "Env Mod:" ) + " ", "" ); + m_vcfModKnob->setLabel( tr("ENV MOD") ); + + m_vcfDecKnob = new knob( knobBright_26, this, tr( "VCF Envelope Decay" ) ); + m_vcfDecKnob->move( 210, 130 ); + m_vcfDecKnob->setHintText( tr( "Decay:" ) + " ", "" ); + m_vcfDecKnob->setLabel( tr("DEC") ); + + m_slideToggle = new ledCheckBox( "Slide", this, tr( "Slide" ) ); + m_slideToggle->move( 10, 180 ); + + m_accentToggle = new ledCheckBox( "Accent", this, tr( "Accent" ) ); + m_accentToggle->move( 10, 200 ); + m_accentToggle->setDisabled(true); + + m_deadToggle = new ledCheckBox( "Dead", this, tr( "Dead" ) ); + m_deadToggle->move( 10, 220 ); + + m_db24Toggle = new ledCheckBox( "24dB/oct", this, + tr( "303-es-que, 24dB/octave, 3 pole filter" ) ); + m_db24Toggle->move( 10, 150); + + + m_slideDecKnob = new knob( knobBright_26, this, tr( "Slide Decay" ) ); + m_slideDecKnob->move( 210, 75 ); + m_slideDecKnob->setHintText( tr( "Slide Decay:" ) + " ", "" ); + m_slideDecKnob->setLabel( tr( "SLIDE")); + + m_vcoFineDetuneKnob = new knob( knobBright_26, this, + tr("Fine detuning of the VCO. Ranged between -100 and 100 centes.") ); + m_vcoFineDetuneKnob->move(165, 75); + m_vcoFineDetuneKnob->setHintText( tr( "VCO Fine Detuning:") + " ", "cents"); + m_vcoFineDetuneKnob->setLabel( tr( "DETUNE")); + + m_distKnob = new knob( knobBright_26, this, tr( "Distortion" ) ); + m_distKnob->move( 210, 190 ); + m_distKnob->setHintText( tr( "DIST:" ) + " ", "" ); + m_distKnob->setLabel( tr( "DIST")); + + + m_waveKnob = new knob( knobBright_26, this, tr( "Waveform" ) ); + m_waveKnob->move( 120, 75 ); + m_waveKnob->setHintText( tr( "WAVE:" ) + " ", "" ); + m_waveKnob->setLabel( tr( "WAVE")); + + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( + "artwork" ) ); + setPalette( pal ); +} + +lb302SynthView::~lb302SynthView() +{ +} + +void lb302SynthView::modelChanged( void ) +{ + lb302Synth * syn = castModel(); + + m_vcfCutKnob->setModel( &syn->vcf_cut_knob ); + m_vcfResKnob->setModel( &syn->vcf_res_knob ); + m_vcfDecKnob->setModel( &syn->vcf_dec_knob ); + m_vcfModKnob->setModel( &syn->vcf_mod_knob ); + + m_vcoFineDetuneKnob->setModel( &syn->vco_fine_detune_knob ); + + m_distKnob->setModel( &syn->dist_knob ); + m_waveKnob->setModel( &syn->wave_knob ); + + m_slideToggle->setModel( &syn->slideToggle ); + m_accentToggle->setModel( &syn->accentToggle ); + m_deadToggle->setModel( &syn->deadToggle ); + m_db24Toggle->setModel( &syn->db24Toggle ); +} + + extern "C" { @@ -1015,6 +1051,7 @@ extern "C" // neccessary for getting instance out of shared lib plugin * lmms_plugin_main( void * _data ) { + return( new lb302Synth( static_cast( _data ) ) ); } diff --git a/plugins/lb302/lb302.h b/plugins/lb302/lb302.h index 0311394e7..1b31ed8bb 100644 --- a/plugins/lb302/lb302.h +++ b/plugins/lb302/lb302.h @@ -34,11 +34,12 @@ #include "effect_lib.h" #include "instrument.h" +#include "instrument_view.h" #include "led_checkbox.h" +#include "knob.h" #include "mixer.h" - -class knob; +class lb302SynthView; class notePlayHandle; class lb302FilterKnobState @@ -210,28 +211,30 @@ public: return 4048; } + virtual pluginView * instantiateView( QWidget * _parent ); + private: void initNote(lb302Note *note); private: - knob * vcf_cut_knob; - knob * vcf_res_knob; - knob * vcf_dec_knob; - knob * vcf_mod_knob; + knobModel vcf_cut_knob; + knobModel vcf_res_knob; + knobModel vcf_mod_knob; + knobModel vcf_dec_knob; - knob * vco_fine_detune_knob; + knobModel vco_fine_detune_knob; - knob * dist_knob; - knob * wave_knob; + knobModel dist_knob; + knobModel wave_knob; + knobModel slide_dec_knob; - ledCheckBox * slideToggle; - ledCheckBox * accentToggle; - ledCheckBox * deadToggle; - ledCheckBox * db24Toggle; + boolModel slideToggle; + boolModel accentToggle; + boolModel deadToggle; + boolModel db24Toggle; - knob * slide_dec_knob; public slots: void filterChanged(float); @@ -239,10 +242,6 @@ public slots: void waveChanged(float); void db24Toggled( bool ); -private: - - - private: // Oscillator float vco_inc, // Sample increment for the frequency. Creates Sawtooth. @@ -294,7 +293,37 @@ private: int process(sampleFrame *outbuf, const Uint32 size); + friend class lb302SynthView; + } ; +class lb302SynthView : public instrumentView +{ +public: + lb302SynthView( instrument * _instrument, + QWidget * _parent ); + virtual ~lb302SynthView(); + +private: + virtual void modelChanged( void ); + + knob * m_vcfCutKnob; + knob * m_vcfResKnob; + knob * m_vcfDecKnob; + knob * m_vcfModKnob; + + knob * m_vcoFineDetuneKnob; + + knob * m_distKnob; + knob * m_waveKnob; + knob * m_slideDecKnob; + + ledCheckBox * m_slideToggle; + ledCheckBox * m_accentToggle; + ledCheckBox * m_deadToggle; + ledCheckBox * m_db24Toggle; + +} ; + #endif diff --git a/src/core/arp_and_chords_tab_widget.cpp b/src/core/arp_and_chords_tab_widget.cpp index 086c7cbeb..859451fad 100644 --- a/src/core/arp_and_chords_tab_widget.cpp +++ b/src/core/arp_and_chords_tab_widget.cpp @@ -181,11 +181,11 @@ const int ARP_GROUPBOX_HEIGHT = 240 - ARP_GROUPBOX_Y; arpAndChordsTabWidget::arpAndChordsTabWidget( instrumentTrack * _instrument_track ) : QWidget( _instrument_track->tabWidgetParent() ), - m_chordsEnabledModel( new boolModel( FALSE, FALSE, TRUE, 1 /* this */ ) ), + m_chordsEnabledModel( new boolModel( FALSE ) ), m_chordsModel( new comboBoxModel( /* this */ ) ), m_chordRangeModel( new floatModel( 1.0f, 1.0f, 9.0f, 1.0f /* this */ ) ), - m_arpEnabledModel( new boolModel( FALSE, FALSE, TRUE, 1/* this */ ) ), + m_arpEnabledModel( new boolModel( FALSE ) ), m_arpModel( new comboBoxModel( /* this */ ) ), m_arpRangeModel( new floatModel( 1.0f, 1.0f, 9.0f, 1.0f /* this */ ) ), diff --git a/src/core/effect.cpp b/src/core/effect.cpp index 3a0a9849d..90063c52d 100644 --- a/src/core/effect.cpp +++ b/src/core/effect.cpp @@ -42,7 +42,7 @@ effect::effect( const plugin::descriptor * _desc, m_noRun( FALSE ), m_running( FALSE ), m_bufferCount( 0 ), - m_enabledModel( TRUE, FALSE, TRUE, boolModel::defaultRelStep(), this ), + m_enabledModel( TRUE, this ), m_wetDryModel( 1.0f, 0.0f, 1.0f, 0.01f, this ), m_gateModel( 0.0f, 0.0f, 1.0f, 0.01f, this ), m_autoQuitModel( 1.0f, 1.0f, 8000.0f, 100.0f, this ) diff --git a/src/core/envelope_tab_widget.cpp b/src/core/envelope_tab_widget.cpp index 2ec337dd8..00c7df3bf 100644 --- a/src/core/envelope_tab_widget.cpp +++ b/src/core/envelope_tab_widget.cpp @@ -74,7 +74,7 @@ static const QString targetNames[envelopeTabWidget::TARGET_COUNT][2] = envelopeTabWidget::envelopeTabWidget( instrumentTrack * _instrument_track ) : QWidget( _instrument_track->tabWidgetParent() ), m_instrumentTrack( _instrument_track ), - m_filterEnabledModel( new boolModel( FALSE, FALSE, TRUE, 1 /* this */ ) ), + m_filterEnabledModel( new boolModel( FALSE /* this */ ) ), m_filterModel( new comboBoxModel( /* this */ ) ), m_filterCutModel( new floatModel( /* this */ ) ), m_filterResModel( new floatModel( /* this */ ) ) diff --git a/src/core/ladspa_control.cpp b/src/core/ladspa_control.cpp index db76bdab3..c93ad4d12 100644 --- a/src/core/ladspa_control.cpp +++ b/src/core/ladspa_control.cpp @@ -33,10 +33,8 @@ ladspaControl::ladspaControl( model * _parent, port_desc_t * _port, model( _parent ), m_link( _link ), m_port( _port ), - m_linkEnabledModel( _link, FALSE, TRUE, boolModel::defaultRelStep(), - this ), - m_toggledModel( FALSE, FALSE, TRUE, boolModel::defaultRelStep(), - this ), + m_linkEnabledModel( _link, this ), + m_toggledModel( FALSE, this ), m_knobModel( 0, 0, 0, 1, this ) { if( m_link ) diff --git a/src/widgets/knob.cpp b/src/widgets/knob.cpp index 6b1fc3e3b..c8e947c51 100644 --- a/src/widgets/knob.cpp +++ b/src/widgets/knob.cpp @@ -65,7 +65,7 @@ textFloat * knob::s_textFloat = NULL; knob::knob( int _knob_num, QWidget * _parent, const QString & _name ) : QWidget( _parent ), - autoModelView( new autoModel( 0, 0, 0, 1, NULL, TRUE ) ), + autoModelView( new knobModel( 0, 0, 0, 1, NULL, TRUE ) ), m_mouseOffset( 0.0f ), m_buttonPressed( FALSE ), m_hintTextBeforeValue( "" ), From b0882c59246096c208fc5165f35c2c668215a20e Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Thu, 24 Jan 2008 11:19:15 +0000 Subject: [PATCH 31/87] fixed broken plugin-entry-point git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@670 0778d3d1-df1d-0410-868b-ea421aaaa00d --- plugins/lb302/lb302.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/lb302/lb302.cpp b/plugins/lb302/lb302.cpp index 9019c847c..443d3a0c4 100644 --- a/plugins/lb302/lb302.cpp +++ b/plugins/lb302/lb302.cpp @@ -1049,7 +1049,7 @@ extern "C" { // neccessary for getting instance out of shared lib -plugin * lmms_plugin_main( void * _data ) +plugin * lmms_plugin_main( model *, void * _data ) { return( new lb302Synth( From a8d490d4cc6b037e2c13356480dad5751d1977ec Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Thu, 24 Jan 2008 11:21:22 +0000 Subject: [PATCH 32/87] eliminated warnings when compiling with GCC 4.3 git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@671 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 45 ++++++++++++++++++- README | 5 +-- configure.in | 4 +- include/automatable_model.h | 15 ++++--- include/journalling_object.h | 2 +- include/types.h | 18 +++++--- plugins/bass_booster/bass_booster.cpp | 1 + plugins/bass_booster/bassbooster_controls.cpp | 1 + plugins/stk/mallets/mallets.cpp | 2 +- src/audio/audio_alsa.cpp | 3 +- src/audio/audio_file_device.cpp | 4 +- src/audio/audio_jack.cpp | 3 +- src/audio/audio_oss.cpp | 3 +- src/audio/audio_port.cpp | 1 + src/core/automation_editor.cpp | 1 + src/core/effect.cpp | 1 + src/core/effect_chain.cpp | 1 + src/core/effect_control_dialog.cpp | 1 + src/core/effect_select_dialog.cpp | 3 +- src/core/main.cpp | 3 +- src/core/meter_dialog.cpp | 1 + src/core/mixer.cpp | 3 +- src/core/preset_preview_play_handle.cpp | 2 +- src/core/setup_dialog.cpp | 3 +- src/core/timeline.cpp | 3 +- src/lib/drumsynth.cpp | 3 +- src/lib/mmp.cpp | 1 + src/lib/project_journal.cpp | 3 +- src/midi/midi_alsa_seq.cpp | 3 +- src/tracks/instrument_track.cpp | 4 +- src/widgets/group_box.cpp | 1 + 31 files changed, 107 insertions(+), 37 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7a8ebd363..6718a8dd6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,47 @@ +2008-01-24 Tobias Doerffel + + * include/types.h: + replaced own buggy valueRanges-calculations by numeric_limits-class + + * plugins/lb302/lb302.cpp: + fixed broken plugin-entry-point + + * configure.in: + * plugins/bass_booster/bass_booster.cpp: + * plugins/bass_booster/bassbooster_controls.cpp: + * plugins/stk/mallets/mallets.cpp: + * include/automatable_model.h: + * include/journalling_object.h: + * src/audio/audio_file_device.cpp: + * src/audio/audio_alsa.cpp: + * src/audio/audio_oss.cpp: + * src/audio/audio_port.cpp: + * src/audio/audio_jack.cpp: + * src/midi/midi_alsa_seq.cpp: + * src/lib/project_journal.cpp: + * src/lib/mmp.cpp: + * src/lib/drumsynth.cpp: + * src/widgets/group_box.cpp: + * src/tracks/instrument_track.cpp: + * src/core/effect_chain.cpp: + * src/core/preset_preview_play_handle.cpp: + * src/core/effect_control_dialog.cpp: + * src/core/setup_dialog.cpp: + * src/core/main.cpp: + * src/core/mixer.cpp: + * src/core/effect.cpp: + * src/core/timeline.cpp: + * src/core/effect_select_dialog.cpp: + * src/core/automation_editor.cpp: + * src/core/meter_dialog.cpp: + various fixes for GCC 4.3 + + * README: + cleanups / fixes + + * include/automatable_model.h: + cleanups / coding-style fixes + 2008-01-24 Paul Giblock * include/automatable_model.h: @@ -14,7 +58,6 @@ split lb302 for M/V. However, lmms_plugin_main() receives null data, which means the instrumentTrack cannot be set.. - 2008-01-18 Tobias Doerffel * src/core/effect_chain.cpp: diff --git a/README b/README index 792f2d990..04c1bbdd0 100644 --- a/README +++ b/README @@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., -What is LMMS?? +What is LMMS? -------------- LMMS aims to be a free alternative to popular (but commercial and closed- @@ -47,8 +47,7 @@ least 500 MHz, but for really enjoying LMMS less than 1 GHz makes no sense... Required libraries: -- multithreaded version of Qt 3.0 (at least 3.2 recommended) or higher with - devel-files +- Qt >= 4.3.0 with devel-files Optional, but strongly recommended: - JACK with devel-files diff --git a/configure.in b/configure.in index a34398793..ec73a9e28 100644 --- a/configure.in +++ b/configure.in @@ -574,9 +574,9 @@ lmmsdatadir="$datadir/$PACKAGE" AC_SUBST(lmmsdatadir) -EXTRA_WARNINGS="-Wextra -Wno-unused-parameter -Wunsafe-loop-optimizations -Winline -Wdisabled-optimization" +EXTRA_WARNINGS="-Wextra -Wno-unused-parameter -Wunsafe-loop-optimizations -Wdisabled-optimization" if test "x$CXX" == "xg++" ; then - CXXFLAGS="$CXXFLAGS -ansi -Wall $EXTRA_WARNINGS -fno-exceptions" + CXXFLAGS="-ansi -Wall $EXTRA_WARNINGS $CXXFLAGS -fno-exceptions" fi LDFLAGS="$LDFLAGS -L/usr/local/lib" diff --git a/include/automatable_model.h b/include/automatable_model.h index 3cf537cb0..c77551f0f 100644 --- a/include/automatable_model.h +++ b/include/automatable_model.h @@ -279,8 +279,6 @@ public: } ; -//#include "automatable_model_templates.h" - #define generateModelPrimitive(type,type2) \ typedef automatableModel type##Model; \ @@ -292,16 +290,21 @@ public: generateModelPrimitive(float,float); generateModelPrimitive(int,int); -class boolModel : public automatableModel { +class boolModel : public automatableModel +{ public: boolModel( const bool _val = FALSE, ::model * _parent = NULL, bool _default_constructed = FALSE ) : - automatableModel( _val, FALSE, TRUE, defaultRelStep(), _parent, _default_constructed ) - {} -}; + autoModel( _val, FALSE, TRUE, defaultRelStep(), _parent, + _default_constructed ) + { + } + +} ; typedef automatableModelView boolModelView; + #endif diff --git a/include/journalling_object.h b/include/journalling_object.h index 7c8d91842..a0316548e 100644 --- a/include/journalling_object.h +++ b/include/journalling_object.h @@ -105,7 +105,7 @@ public: journallingObject( void ); virtual ~journallingObject(); - inline const jo_id_t id( void ) const + inline jo_id_t id( void ) const { return( m_id ); } diff --git a/include/types.h b/include/types.h index e689adacc..09b020e75 100644 --- a/include/types.h +++ b/include/types.h @@ -1,7 +1,7 @@ /* * types.h - typedefs for common types that are used in the whole app * - * Copyright (c) 2004-2006 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -26,6 +26,8 @@ #ifndef _TYPES_H #define _TYPES_H +#include + typedef unsigned char Uint8; typedef signed char Sint8; typedef unsigned short Uint16; @@ -60,13 +62,15 @@ typedef Uint32 jo_id_t; // (unique) ID of a journalling object template struct valueRanges { - enum + static inline T min( void ) { - max = static_cast( static_cast( ~0 ) > 0 ? - ~0 : ( ( ( T ) 1 << ( sizeof( T ) * 8 - 1 ) ) - 1 ) ), - min = static_cast( static_cast( ~0 ) > 0 ? - 0 : ( -max - 1 ) ) - } ; + return( std::numeric_limits::min() ); + } + + static inline T max( void ) + { + return( std::numeric_limits::max() ); + } } ; diff --git a/plugins/bass_booster/bass_booster.cpp b/plugins/bass_booster/bass_booster.cpp index 6a9865801..9617d9511 100644 --- a/plugins/bass_booster/bass_booster.cpp +++ b/plugins/bass_booster/bass_booster.cpp @@ -24,6 +24,7 @@ #include "bass_booster.h" +#include "automatable_model_templates.h" #undef SINGLE_SOURCE_COMPILE diff --git a/plugins/bass_booster/bassbooster_controls.cpp b/plugins/bass_booster/bassbooster_controls.cpp index bb96ecd68..52247c67e 100644 --- a/plugins/bass_booster/bassbooster_controls.cpp +++ b/plugins/bass_booster/bassbooster_controls.cpp @@ -25,6 +25,7 @@ #include "bassbooster_controls.h" #include "bass_booster.h" +#include "automatable_model_templates.h" diff --git a/plugins/stk/mallets/mallets.cpp b/plugins/stk/mallets/mallets.cpp index a58665b6a..ca729599c 100644 --- a/plugins/stk/mallets/mallets.cpp +++ b/plugins/stk/mallets/mallets.cpp @@ -73,7 +73,7 @@ malletsInstrument::malletsInstrument( instrumentTrack * _instrument_track ): m_pressureModel(64.0f, 0.0f, 128.0f, 0.1f, this), m_motionModel(64.0f, 0.0f, 128.0f, 0.1f, this), m_velocityModel(64.0f, 0.0f, 128.0f, 0.1f, this), - m_strikeModel( FALSE, FALSE, TRUE, boolModel::defaultRelStep(), this ), + m_strikeModel( FALSE, this ), m_presetsModel(this), m_spreadModel(0, 0, 255, 1, this) { diff --git a/src/audio/audio_alsa.cpp b/src/audio/audio_alsa.cpp index 4574ae090..25d34ed54 100644 --- a/src/audio/audio_alsa.cpp +++ b/src/audio/audio_alsa.cpp @@ -3,7 +3,7 @@ /* * audio_alsa.cpp - device-class which implements ALSA-PCM-output * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -36,6 +36,7 @@ #ifdef ALSA_SUPPORT #include "endian_handling.h" +#include "automatable_model_templates.h" #include "config_mgr.h" #include "lcd_spinbox.h" #include "gui_templates.h" diff --git a/src/audio/audio_file_device.cpp b/src/audio/audio_file_device.cpp index 906d39913..f28e68fc9 100644 --- a/src/audio/audio_file_device.cpp +++ b/src/audio/audio_file_device.cpp @@ -4,7 +4,7 @@ * audio_file_device.cpp - base-class for audio-device-classes which write * their output into a file * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -28,9 +28,9 @@ #include - #include "audio_file_device.h" #include "export_project_dialog.h" +#include "automatable_model_templates.h" audioFileDevice::audioFileDevice( const sample_rate_t _sample_rate, diff --git a/src/audio/audio_jack.cpp b/src/audio/audio_jack.cpp index 5f0b1de4c..90eada53b 100644 --- a/src/audio/audio_jack.cpp +++ b/src/audio/audio_jack.cpp @@ -3,7 +3,7 @@ /* * audio_jack.cpp - support for JACK-transport * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -40,6 +40,7 @@ #include "debug.h" #include "templates.h" +#include "automatable_model_templates.h" #include "gui_templates.h" #include "config_mgr.h" #include "lcd_spinbox.h" diff --git a/src/audio/audio_oss.cpp b/src/audio/audio_oss.cpp index 5ce44c706..02ae2ecb4 100644 --- a/src/audio/audio_oss.cpp +++ b/src/audio/audio_oss.cpp @@ -3,7 +3,7 @@ /* * audio_oss.cpp - device-class that implements OSS-PCM-output * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -35,6 +35,7 @@ #include #include "endian_handling.h" +#include "automatable_model_templates.h" #include "lcd_spinbox.h" #include "gui_templates.h" #include "templates.h" diff --git a/src/audio/audio_port.cpp b/src/audio/audio_port.cpp index d4cc53c84..7b9bafd1a 100644 --- a/src/audio/audio_port.cpp +++ b/src/audio/audio_port.cpp @@ -31,6 +31,7 @@ #include "audio_port.h" #include "audio_device.h" #include "engine.h" +#include "automatable_model_templates.h" audioPort::audioPort( const QString & _name, track * _track ) : diff --git a/src/core/automation_editor.cpp b/src/core/automation_editor.cpp index 719c6ad85..e18170ed6 100644 --- a/src/core/automation_editor.cpp +++ b/src/core/automation_editor.cpp @@ -49,6 +49,7 @@ #include "song_editor.h" +#include "automatable_model_templates.h" #include "main_window.h" #include "embed.h" #include "engine.h" diff --git a/src/core/effect.cpp b/src/core/effect.cpp index 90063c52d..12d67cb3d 100644 --- a/src/core/effect.cpp +++ b/src/core/effect.cpp @@ -31,6 +31,7 @@ #include "dummy_effect.h" #include "effect_chain.h" #include "effect_view.h" +#include "automatable_model_templates.h" effect::effect( const plugin::descriptor * _desc, diff --git a/src/core/effect_chain.cpp b/src/core/effect_chain.cpp index 31d2c27b4..5928e05b4 100644 --- a/src/core/effect_chain.cpp +++ b/src/core/effect_chain.cpp @@ -28,6 +28,7 @@ #include "effect_chain.h" #include "engine.h" +#include "automatable_model_templates.h" diff --git a/src/core/effect_control_dialog.cpp b/src/core/effect_control_dialog.cpp index 980eb631f..4d471b3ab 100644 --- a/src/core/effect_control_dialog.cpp +++ b/src/core/effect_control_dialog.cpp @@ -32,6 +32,7 @@ #include "effect_control_dialog.h" #include "effect_controls.h" #include "effect.h" +#include "automatable_model_templates.h" effectControlDialog::effectControlDialog( effectControls * _controls ) : diff --git a/src/core/effect_select_dialog.cpp b/src/core/effect_select_dialog.cpp index 5d716d2b0..c82510c9c 100644 --- a/src/core/effect_select_dialog.cpp +++ b/src/core/effect_select_dialog.cpp @@ -3,7 +3,7 @@ /* * effect_select_dialog.cpp - dialog to choose effect plugin * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -33,6 +33,7 @@ #include "effect_select_dialog.h" #include "gui_templates.h" +#include "automatable_model_templates.h" #include "embed.h" diff --git a/src/core/main.cpp b/src/core/main.cpp index 18b7e28d1..c9211f392 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -3,7 +3,7 @@ /* * main.cpp - just main.cpp which is starting up app... * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -43,6 +43,7 @@ #include "export_project_dialog.h" #include "song_editor.h" #include "gui_templates.h" +#include "automatable_model_templates.h" #warning TODO: move somewhere else static inline QString baseName( const QString & _file ) diff --git a/src/core/meter_dialog.cpp b/src/core/meter_dialog.cpp index 3a0af7c0a..1c85be4d2 100644 --- a/src/core/meter_dialog.cpp +++ b/src/core/meter_dialog.cpp @@ -31,6 +31,7 @@ #include "meter_dialog.h" #include "embed.h" #include "gui_templates.h" +#include "automatable_model_templates.h" meterDialog::meterDialog( QWidget * _parent, track * _track ): diff --git a/src/core/mixer.cpp b/src/core/mixer.cpp index 29121750a..1a636ac30 100644 --- a/src/core/mixer.cpp +++ b/src/core/mixer.cpp @@ -3,7 +3,7 @@ /* * mixer.cpp - audio-device-independent mixer for LMMS * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -39,6 +39,7 @@ #include "sample_play_handle.h" #include "piano_roll.h" #include "micro_timer.h" +#include "automatable_model_templates.h" #include "audio_device.h" #include "midi_client.h" diff --git a/src/core/preset_preview_play_handle.cpp b/src/core/preset_preview_play_handle.cpp index 0c07224cd..1d2091a4f 100644 --- a/src/core/preset_preview_play_handle.cpp +++ b/src/core/preset_preview_play_handle.cpp @@ -144,7 +144,7 @@ presetPreviewPlayHandle::presetPreviewPlayHandle( // create note-play-handle for it m_previewNote = new notePlayHandle( s_previewTC->previewInstrumentTrack(), 0, - valueRanges::max / 2, + valueRanges::max() / 2, note( 0, 0, static_cast( A ), static_cast( DEFAULT_OCTAVE - 1 ), 100 ) ); diff --git a/src/core/setup_dialog.cpp b/src/core/setup_dialog.cpp index 271070c4b..1c26df701 100644 --- a/src/core/setup_dialog.cpp +++ b/src/core/setup_dialog.cpp @@ -3,7 +3,7 @@ /* * setup_dialog.cpp - dialog for setting up LMMS * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -49,6 +49,7 @@ #include "tooltip.h" #include "led_checkbox.h" #include "lcd_spinbox.h" +#include "automatable_model_templates.h" // platform-specific audio-interface-classes diff --git a/src/core/timeline.cpp b/src/core/timeline.cpp index 3c76e105f..abf735e97 100644 --- a/src/core/timeline.cpp +++ b/src/core/timeline.cpp @@ -3,7 +3,7 @@ /* * timeline.cpp - class timeLine, representing a time-line with position marker * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -40,6 +40,7 @@ #include "nstate_button.h" #include "main_window.h" #include "text_float.h" +#include "automatable_model_templates.h" diff --git a/src/lib/drumsynth.cpp b/src/lib/drumsynth.cpp index 509cd9d0f..8d64976c2 100644 --- a/src/lib/drumsynth.cpp +++ b/src/lib/drumsynth.cpp @@ -27,7 +27,8 @@ #include "drumsynth.h" #include -#include +#include +#include #include //sin(), exp(), etc. #include //sscanf(), sprintf() diff --git a/src/lib/mmp.cpp b/src/lib/mmp.cpp index 395bd8400..48fbead8c 100644 --- a/src/lib/mmp.cpp +++ b/src/lib/mmp.cpp @@ -36,6 +36,7 @@ #include "config_mgr.h" #include "project_version.h" #include "song_editor.h" +#include "automatable_model_templates.h" multimediaProject::typeDescStruct diff --git a/src/lib/project_journal.cpp b/src/lib/project_journal.cpp index f641a1634..b78ae7f09 100644 --- a/src/lib/project_journal.cpp +++ b/src/lib/project_journal.cpp @@ -3,7 +3,7 @@ /* * project_journal.cpp - implementation of project-journal * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -31,6 +31,7 @@ #include "engine.h" #include "journalling_object.h" #include "song_editor.h" +#include "automatable_model_templates.h" projectJournal::projectJournal( void ) : diff --git a/src/midi/midi_alsa_seq.cpp b/src/midi/midi_alsa_seq.cpp index 5dfabd59e..827d8fda9 100644 --- a/src/midi/midi_alsa_seq.cpp +++ b/src/midi/midi_alsa_seq.cpp @@ -3,7 +3,7 @@ /* * midi_alsa_seq.cpp - ALSA-sequencer-client * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -36,6 +36,7 @@ #include "song_editor.h" #include "midi_port.h" #include "note.h" +#include "automatable_model_templates.h" #ifdef ALSA_SUPPORT diff --git a/src/tracks/instrument_track.cpp b/src/tracks/instrument_track.cpp index d2bb1c1f6..4e2e4ab08 100644 --- a/src/tracks/instrument_track.cpp +++ b/src/tracks/instrument_track.cpp @@ -500,7 +500,7 @@ void instrumentTrack::processInEvent( const midiEvent & _me, notePlayHandle( this, _time.frames( engine::framesPerTact64th() ), - valueRanges::max / 2, + valueRanges::max() / 2, n ); if( engine::getMixer()->addPlayHandle( nph ) ) @@ -734,7 +734,7 @@ void instrumentTrack::setName( const QString & _new_name ) for( int i = 0; i < numOfTCOs(); ++i ) { pattern * p = dynamic_cast( getTCO( i ) ); - if( p != NULL && p->name() == m_name || p->name() == "" ) + if( ( p != NULL && p->name() == m_name ) || p->name() == "" ) { p->setName( _new_name ); } diff --git a/src/widgets/group_box.cpp b/src/widgets/group_box.cpp index 76c825490..0c84236b9 100644 --- a/src/widgets/group_box.cpp +++ b/src/widgets/group_box.cpp @@ -42,6 +42,7 @@ #include "embed.h" #include "gui_templates.h" +#include "automatable_model_templates.h" QPixmap * groupBox::s_ledBg = NULL; From be604b1d680ab74d15f6e65f22d8d5fec03ca124 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 26 Jan 2008 00:42:39 +0000 Subject: [PATCH 33/87] added transformableAutoModel-class which is not used yet but might be helpful in some cases in the future git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@672 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/transformable_auto_model.h | 91 ++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 include/transformable_auto_model.h diff --git a/include/transformable_auto_model.h b/include/transformable_auto_model.h new file mode 100644 index 000000000..b8ffb8985 --- /dev/null +++ b/include/transformable_auto_model.h @@ -0,0 +1,91 @@ +/* + * transformable_auto_model.h - template transformableAutoModel + * + * Copyright (c) 2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _TRANSFORMABLE_AUTO_MODEL_H +#define _TRANSFORMABLE_AUTO_MODEL_H + +#include "automatable_model.h" +//#include "automatable_model_templates.h" + + +template +struct AutoModelTransformer +{ + inline virtual T transform( const T & _val ) const + { + return( _val ); + } +} ; + + +template +class transformableAutoModel : public automatableModel +{ +public: + transformableAutoModel( const AutoModelTransformer * _transformer, + const T _val = 0, + const T _min = 0, + const T _max = 0, + const T _step = defaultRelStep(), + ::model * _parent = NULL, + bool _default_constructed = FALSE ) : + automatableModel( _val, _min, _max, _step, _parent, + _default_constructed ), + m_transformer( _transformer ) + { + } + + inline virtual ~transformableAutoModel() + { + } + + inline virtual void setValue( const T _value ) + { + autoModel::setValue( _value ); + if( m_transformer != NULL ) + { + m_transformedValue = m_transformer->transform( + autoModel::value() ); + } + else + { + m_transformedValue = autoModel::value(); + } + } + + inline virtual T value( void ) const + { + return( m_transformedValue ); + } + +private: + T m_transformedValue; + const AutoModelTransformer * m_transformer; + +} ; + + +#endif + From 73be443b23b6cb4d344efcd073c3e5bf910d0d0d Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 26 Jan 2008 00:43:06 +0000 Subject: [PATCH 34/87] changed coding-style for enum-constants, use model for external wave-shape- and modulation-algo-parameter git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@673 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/oscillator.h | 57 +++++---- src/lib/oscillator.cpp | 263 +++++++++++++++++++++-------------------- 2 files changed, 165 insertions(+), 155 deletions(-) diff --git a/include/oscillator.h b/include/oscillator.h index 092838766..45d087a86 100644 --- a/include/oscillator.h +++ b/include/oscillator.h @@ -1,7 +1,7 @@ /* * oscillator.h - header-file for oscillator.cpp, a powerful oscillator-class * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -38,40 +38,49 @@ #include "sample_buffer.h" #include "lmms_constants.h" #include "lmms_math.h" +#include "automatable_model.h" class oscillator { public: - enum waveShapes + enum WaveShapes { - SIN_WAVE, - TRIANGLE_WAVE, - SAW_WAVE, - SQUARE_WAVE, - MOOG_SAW_WAVE, - EXP_WAVE, - WHITE_NOISE_WAVE, - USER_DEF_WAVE + SineWave, + TriangleWave, + SawWave, + SquareWave, + MoogSawWave, + ExponentialWave, + WhiteNoise, + UserDefinedWave, + NumWaveShapes } ; - enum modulationAlgos + enum ModulationAlgos { - PHASE_MODULATION, AMP_MODULATION, MIX, SYNC, FREQ_MODULATION + PhaseModulation, + AmplitudeModulation, + SignalMix, + SynchronizedBySubOsc, + FrequencyModulation, + NumModulationAlgos, } ; - oscillator( const waveShapes & _wave_shape, - const modulationAlgos & _modulation_algo, + + oscillator( const intModel & _wave_shape_model, + const intModel & _mod_algo_model, const float & _freq, const float & _detuning, const float & _phase_offset, const float & _volume, - oscillator * _m_subOsc = NULL ) FASTCALL; + oscillator * _m_subOsc = NULL ); virtual ~oscillator() { delete m_subOsc; } + inline void setUserWave( const sampleBuffer * _wave ) { m_userWave = _wave; @@ -154,8 +163,8 @@ public: private: - const waveShapes & m_waveShape; - const modulationAlgos & m_modulationAlgo; + const intModel & m_waveShapeModel; + const intModel & m_modulationAlgoModel; const float & m_freq; const float & m_detuning; const float & m_volume; @@ -183,26 +192,26 @@ private: const ch_cnt_t _chnl ); inline bool syncOk( float _osc_coeff ); - template + template void updateNoSub( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ); - template + template void updatePM( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ); - template + template void updateAM( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ); - template + template void updateMix( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ); - template + template void updateSync( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ); - template + template void updateFM( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ); - template + template inline sample_t getSample( const float _sample ); inline void FASTCALL recalcPhase( void ); diff --git a/src/lib/oscillator.cpp b/src/lib/oscillator.cpp index 9e4a28465..b4414d0e1 100644 --- a/src/lib/oscillator.cpp +++ b/src/lib/oscillator.cpp @@ -26,18 +26,19 @@ #include "oscillator.h" +#include "automatable_model_templates.h" -oscillator::oscillator( const waveShapes & _wave_shape, - const modulationAlgos & _modulation_algo, - const float & _freq, - const float & _detuning, - const float & _phase_offset, - const float & _volume, +oscillator::oscillator( const intModel & _wave_shape_model, + const intModel & _mod_algo_model, + const float & _freq, + const float & _detuning, + const float & _phase_offset, + const float & _volume, oscillator * _sub_osc ) : - m_waveShape( _wave_shape ), - m_modulationAlgo( _modulation_algo ), + m_waveShapeModel( _wave_shape_model ), + m_modulationAlgoModel( _mod_algo_model ), m_freq( _freq ), m_detuning( _detuning ), m_volume( _volume ), @@ -57,21 +58,21 @@ void oscillator::update( sampleFrame * _ab, const fpp_t _frames, { if( m_subOsc != NULL ) { - switch( m_modulationAlgo ) + switch( m_modulationAlgoModel.value() ) { - case PHASE_MODULATION: + case PhaseModulation: updatePM( _ab, _frames, _chnl ); break; - case AMP_MODULATION: + case AmplitudeModulation: updateAM( _ab, _frames, _chnl ); break; - case MIX: + case SignalMix: updateMix( _ab, _frames, _chnl ); break; - case SYNC: + case SynchronizedBySubOsc: updateSync( _ab, _frames, _chnl ); break; - case FREQ_MODULATION: + case FrequencyModulation: updateFM( _ab, _frames, _chnl ); } } @@ -87,32 +88,32 @@ void oscillator::update( sampleFrame * _ab, const fpp_t _frames, void oscillator::updateNoSub( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ) { - switch( m_waveShape ) + switch( m_waveShapeModel.value() ) { - case SIN_WAVE: + case SineWave: default: - updateNoSub( _ab, _frames, _chnl ); + updateNoSub( _ab, _frames, _chnl ); break; - case TRIANGLE_WAVE: - updateNoSub( _ab, _frames, _chnl ); + case TriangleWave: + updateNoSub( _ab, _frames, _chnl ); break; - case SAW_WAVE: - updateNoSub( _ab, _frames, _chnl ); + case SawWave: + updateNoSub( _ab, _frames, _chnl ); break; - case SQUARE_WAVE: - updateNoSub( _ab, _frames, _chnl ); + case SquareWave: + updateNoSub( _ab, _frames, _chnl ); break; - case MOOG_SAW_WAVE: - updateNoSub( _ab, _frames, _chnl ); + case MoogSawWave: + updateNoSub( _ab, _frames, _chnl ); break; - case EXP_WAVE: - updateNoSub( _ab, _frames, _chnl ); + case ExponentialWave: + updateNoSub( _ab, _frames, _chnl ); break; - case WHITE_NOISE_WAVE: - updateNoSub( _ab, _frames, _chnl ); + case WhiteNoise: + updateNoSub( _ab, _frames, _chnl ); break; - case USER_DEF_WAVE: - updateNoSub( _ab, _frames, _chnl ); + case UserDefinedWave: + updateNoSub( _ab, _frames, _chnl ); break; } } @@ -123,32 +124,32 @@ void oscillator::updateNoSub( sampleFrame * _ab, const fpp_t _frames, void oscillator::updatePM( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ) { - switch( m_waveShape ) + switch( m_waveShapeModel.value() ) { - case SIN_WAVE: + case SineWave: default: - updatePM( _ab, _frames, _chnl ); + updatePM( _ab, _frames, _chnl ); break; - case TRIANGLE_WAVE: - updatePM( _ab, _frames, _chnl ); + case TriangleWave: + updatePM( _ab, _frames, _chnl ); break; - case SAW_WAVE: - updatePM( _ab, _frames, _chnl ); + case SawWave: + updatePM( _ab, _frames, _chnl ); break; - case SQUARE_WAVE: - updatePM( _ab, _frames, _chnl ); + case SquareWave: + updatePM( _ab, _frames, _chnl ); break; - case MOOG_SAW_WAVE: - updatePM( _ab, _frames, _chnl ); + case MoogSawWave: + updatePM( _ab, _frames, _chnl ); break; - case EXP_WAVE: - updatePM( _ab, _frames, _chnl ); + case ExponentialWave: + updatePM( _ab, _frames, _chnl ); break; - case WHITE_NOISE_WAVE: - updatePM( _ab, _frames, _chnl ); + case WhiteNoise: + updatePM( _ab, _frames, _chnl ); break; - case USER_DEF_WAVE: - updatePM( _ab, _frames, _chnl ); + case UserDefinedWave: + updatePM( _ab, _frames, _chnl ); break; } } @@ -159,32 +160,32 @@ void oscillator::updatePM( sampleFrame * _ab, const fpp_t _frames, void oscillator::updateAM( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ) { - switch( m_waveShape ) + switch( m_waveShapeModel.value() ) { - case SIN_WAVE: + case SineWave: default: - updateAM( _ab, _frames, _chnl ); + updateAM( _ab, _frames, _chnl ); break; - case TRIANGLE_WAVE: - updateAM( _ab, _frames, _chnl ); + case TriangleWave: + updateAM( _ab, _frames, _chnl ); break; - case SAW_WAVE: - updateAM( _ab, _frames, _chnl ); + case SawWave: + updateAM( _ab, _frames, _chnl ); break; - case SQUARE_WAVE: - updateAM( _ab, _frames, _chnl ); + case SquareWave: + updateAM( _ab, _frames, _chnl ); break; - case MOOG_SAW_WAVE: - updateAM( _ab, _frames, _chnl ); + case MoogSawWave: + updateAM( _ab, _frames, _chnl ); break; - case EXP_WAVE: - updateAM( _ab, _frames, _chnl ); + case ExponentialWave: + updateAM( _ab, _frames, _chnl ); break; - case WHITE_NOISE_WAVE: - updateAM( _ab, _frames, _chnl ); + case WhiteNoise: + updateAM( _ab, _frames, _chnl ); break; - case USER_DEF_WAVE: - updateAM( _ab, _frames, _chnl ); + case UserDefinedWave: + updateAM( _ab, _frames, _chnl ); break; } } @@ -195,32 +196,32 @@ void oscillator::updateAM( sampleFrame * _ab, const fpp_t _frames, void oscillator::updateMix( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ) { - switch( m_waveShape ) + switch( m_waveShapeModel.value() ) { - case SIN_WAVE: + case SineWave: default: - updateMix( _ab, _frames, _chnl ); + updateMix( _ab, _frames, _chnl ); break; - case TRIANGLE_WAVE: - updateMix( _ab, _frames, _chnl ); + case TriangleWave: + updateMix( _ab, _frames, _chnl ); break; - case SAW_WAVE: - updateMix( _ab, _frames, _chnl ); + case SawWave: + updateMix( _ab, _frames, _chnl ); break; - case SQUARE_WAVE: - updateMix( _ab, _frames, _chnl ); + case SquareWave: + updateMix( _ab, _frames, _chnl ); break; - case MOOG_SAW_WAVE: - updateMix( _ab, _frames, _chnl ); + case MoogSawWave: + updateMix( _ab, _frames, _chnl ); break; - case EXP_WAVE: - updateMix( _ab, _frames, _chnl ); + case ExponentialWave: + updateMix( _ab, _frames, _chnl ); break; - case WHITE_NOISE_WAVE: - updateMix( _ab, _frames, _chnl ); + case WhiteNoise: + updateMix( _ab, _frames, _chnl ); break; - case USER_DEF_WAVE: - updateMix( _ab, _frames, _chnl ); + case UserDefinedWave: + updateMix( _ab, _frames, _chnl ); break; } } @@ -231,32 +232,32 @@ void oscillator::updateMix( sampleFrame * _ab, const fpp_t _frames, void oscillator::updateSync( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ) { - switch( m_waveShape ) + switch( m_waveShapeModel.value() ) { - case SIN_WAVE: + case SineWave: default: - updateSync( _ab, _frames, _chnl ); + updateSync( _ab, _frames, _chnl ); break; - case TRIANGLE_WAVE: - updateSync( _ab, _frames, _chnl ); + case TriangleWave: + updateSync( _ab, _frames, _chnl ); break; - case SAW_WAVE: - updateSync( _ab, _frames, _chnl ); + case SawWave: + updateSync( _ab, _frames, _chnl ); break; - case SQUARE_WAVE: - updateSync( _ab, _frames, _chnl ); + case SquareWave: + updateSync( _ab, _frames, _chnl ); break; - case MOOG_SAW_WAVE: - updateSync( _ab, _frames, _chnl ); + case MoogSawWave: + updateSync( _ab, _frames, _chnl ); break; - case EXP_WAVE: - updateSync( _ab, _frames, _chnl ); + case ExponentialWave: + updateSync( _ab, _frames, _chnl ); break; - case WHITE_NOISE_WAVE: - updateSync( _ab, _frames, _chnl ); + case WhiteNoise: + updateSync( _ab, _frames, _chnl ); break; - case USER_DEF_WAVE: - updateSync( _ab, _frames, _chnl ); + case UserDefinedWave: + updateSync( _ab, _frames, _chnl ); break; } } @@ -267,32 +268,32 @@ void oscillator::updateSync( sampleFrame * _ab, const fpp_t _frames, void oscillator::updateFM( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ) { - switch( m_waveShape ) + switch( m_waveShapeModel.value() ) { - case SIN_WAVE: + case SineWave: default: - updateFM( _ab, _frames, _chnl ); + updateFM( _ab, _frames, _chnl ); break; - case TRIANGLE_WAVE: - updateFM( _ab, _frames, _chnl ); + case TriangleWave: + updateFM( _ab, _frames, _chnl ); break; - case SAW_WAVE: - updateFM( _ab, _frames, _chnl ); + case SawWave: + updateFM( _ab, _frames, _chnl ); break; - case SQUARE_WAVE: - updateFM( _ab, _frames, _chnl ); + case SquareWave: + updateFM( _ab, _frames, _chnl ); break; - case MOOG_SAW_WAVE: - updateFM( _ab, _frames, _chnl ); + case MoogSawWave: + updateFM( _ab, _frames, _chnl ); break; - case EXP_WAVE: - updateFM( _ab, _frames, _chnl ); + case ExponentialWave: + updateFM( _ab, _frames, _chnl ); break; - case WHITE_NOISE_WAVE: - updateFM( _ab, _frames, _chnl ); + case WhiteNoise: + updateFM( _ab, _frames, _chnl ); break; - case USER_DEF_WAVE: - updateFM( _ab, _frames, _chnl ); + case UserDefinedWave: + updateFM( _ab, _frames, _chnl ); break; } } @@ -341,7 +342,7 @@ float oscillator::syncInit( sampleFrame * _ab, const fpp_t _frames, // if we have no sub-osc, we can't do any modulation... just get our samples -template +template void oscillator::updateNoSub( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ) { @@ -359,7 +360,7 @@ void oscillator::updateNoSub( sampleFrame * _ab, const fpp_t _frames, // do pm by using sub-osc as modulator -template +template void oscillator::updatePM( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ) { @@ -370,7 +371,7 @@ void oscillator::updatePM( sampleFrame * _ab, const fpp_t _frames, for( fpp_t frame = 0; frame < _frames; ++frame ) { _ab[frame][_chnl] = getSample( m_phase + _ab[frame][_chnl] ) - * m_volume; + * m_volume; m_phase += osc_coeff; } } @@ -379,7 +380,7 @@ void oscillator::updatePM( sampleFrame * _ab, const fpp_t _frames, // do am by using sub-osc as modulator -template +template void oscillator::updateAM( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ) { @@ -398,7 +399,7 @@ void oscillator::updateAM( sampleFrame * _ab, const fpp_t _frames, // do mix by using sub-osc as mix-sample -template +template void oscillator::updateMix( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ) { @@ -418,7 +419,7 @@ void oscillator::updateMix( sampleFrame * _ab, const fpp_t _frames, // sync with sub-osc (every time sub-osc starts new period, we also start new // period) -template +template void oscillator::updateSync( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ) { @@ -441,7 +442,7 @@ void oscillator::updateSync( sampleFrame * _ab, const fpp_t _frames, // do fm by using sub-osc as modulator -template +template void oscillator::updateFM( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ) { @@ -461,7 +462,7 @@ void oscillator::updateFM( sampleFrame * _ab, const fpp_t _frames, template<> -inline sample_t oscillator::getSample( +inline sample_t oscillator::getSample( const float _sample ) { return( sinSample( _sample ) ); @@ -471,7 +472,7 @@ inline sample_t oscillator::getSample( template<> -inline sample_t oscillator::getSample( +inline sample_t oscillator::getSample( const float _sample ) { return( triangleSample( _sample ) ); @@ -481,7 +482,7 @@ inline sample_t oscillator::getSample( template<> -inline sample_t oscillator::getSample( +inline sample_t oscillator::getSample( const float _sample ) { return( sawSample( _sample ) ); @@ -491,7 +492,7 @@ inline sample_t oscillator::getSample( template<> -inline sample_t oscillator::getSample( +inline sample_t oscillator::getSample( const float _sample ) { return( squareSample( _sample ) ); @@ -501,7 +502,7 @@ inline sample_t oscillator::getSample( template<> -inline sample_t oscillator::getSample( +inline sample_t oscillator::getSample( const float _sample ) { return( moogSawSample( _sample ) ); @@ -511,7 +512,7 @@ inline sample_t oscillator::getSample( template<> -inline sample_t oscillator::getSample( +inline sample_t oscillator::getSample( const float _sample ) { return( expSample( _sample ) ); @@ -521,7 +522,7 @@ inline sample_t oscillator::getSample( template<> -inline sample_t oscillator::getSample( +inline sample_t oscillator::getSample( const float _sample ) { return( noiseSample( _sample ) ); @@ -531,7 +532,7 @@ inline sample_t oscillator::getSample( template<> -inline sample_t oscillator::getSample( +inline sample_t oscillator::getSample( const float _sample ) { return( userWaveSample( _sample ) ); From a7fb026159adf036ffcae98987a6fd8bb6bec87d Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 26 Jan 2008 00:43:26 +0000 Subject: [PATCH 35/87] added missing header git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@674 0778d3d1-df1d-0410-868b-ea421aaaa00d --- src/widgets/ladspa_control_view.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/widgets/ladspa_control_view.cpp b/src/widgets/ladspa_control_view.cpp index 98f761966..5132ac2ba 100644 --- a/src/widgets/ladspa_control_view.cpp +++ b/src/widgets/ladspa_control_view.cpp @@ -31,6 +31,7 @@ #include "led_checkbox.h" #include "tempo_sync_knob.h" #include "tooltip.h" +#include "automatable_model_templates.h" ladspaControlView::ladspaControlView( QWidget * _parent, From 81434922d3eaed8447836e14e3811dd4388359b2 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 26 Jan 2008 00:43:42 +0000 Subject: [PATCH 36/87] update buttons after changing button-group's value git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@675 0778d3d1-df1d-0410-868b-ea421aaaa00d --- src/widgets/automatable_button.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/widgets/automatable_button.cpp b/src/widgets/automatable_button.cpp index e88c0c021..73f824e0b 100644 --- a/src/widgets/automatable_button.cpp +++ b/src/widgets/automatable_button.cpp @@ -219,6 +219,10 @@ void automatableButtonGroup::activateButton( automatableButton * _btn ) m_buttons.indexOf( _btn ) != -1 ) { model()->setValue( m_buttons.indexOf( _btn ) ); + foreach( automatableButton * btn, m_buttons ) + { + btn->update(); + } } } @@ -240,7 +244,7 @@ void automatableButtonGroup::updateButtons( void ) int i = 0; foreach( automatableButton * btn, m_buttons ) { - btn->setValue( i == value() ); + btn->model()->setValue( i == value() ); ++i; } } From 36f7b4de0ff5c1b66cd70d53503bd62131a01a9e Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 26 Jan 2008 00:44:21 +0000 Subject: [PATCH 37/87] initial M/V-split of TripleOscillator - lots of debugging and cleanups pending, however basically works :) git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@676 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 22 + .../triple_oscillator/triple_oscillator.cpp | 1115 +++++++++-------- plugins/triple_oscillator/triple_oscillator.h | 105 +- 3 files changed, 676 insertions(+), 566 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6718a8dd6..3ed5117b8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +2008-01-26 Tobias Doerffel + + * plugins/triple_oscillator/triple_oscillator.h: + * plugins/triple_oscillator/triple_oscillator.cpp: + initial M/V-split - lots of debugging and cleanups pending, however + basically works :) + + * include/transformable_auto_model.h: + added transformableAutoModel-class which is not used yet but might be + helpful in some cases in the future + + * include/oscillator.h: + * src/lib/oscillator.cpp: + - changed coding-style for enum-constants + - use model for external wave-shape- and modulation-algo-parameter + + * src/widgets/ladspa_control_view.cpp: + added missing header + + * src/widgets/automatable_button.cpp: + update buttons after changing button-group's value + 2008-01-24 Tobias Doerffel * include/types.h: diff --git a/plugins/triple_oscillator/triple_oscillator.cpp b/plugins/triple_oscillator/triple_oscillator.cpp index 1faef3e27..d45ca41b9 100644 --- a/plugins/triple_oscillator/triple_oscillator.cpp +++ b/plugins/triple_oscillator/triple_oscillator.cpp @@ -1,7 +1,7 @@ /* * triple_oscillator.cpp - powerful instrument with three oscillators * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -39,6 +39,7 @@ #include "song_editor.h" #include "tooltip.h" #include "volume_knob.h" +#include "automatable_model_templates.h" #undef SINGLE_SOURCE_COMPILE @@ -56,7 +57,7 @@ plugin::descriptor tripleoscillator_plugin_descriptor = "three powerful oscillators you can modulate " "in several ways" ), "Tobias Doerffel ", - 0x0100, + 0x0110, plugin::Instrument, new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), NULL @@ -64,424 +65,166 @@ plugin::descriptor tripleoscillator_plugin_descriptor = } - -tripleOscillator::tripleOscillator( instrumentTrack * _channel_track ) : - instrument( _channel_track, &tripleoscillator_plugin_descriptor ) + + +oscillatorObject::oscillatorObject( model * _parent, track * _track ) : + model( _parent ), + m_volumeModel( DEFAULT_VOLUME / NUM_OF_OSCILLATORS, + MIN_VOLUME, MAX_VOLUME, 1.0f, this ), + m_panModel( DEFAULT_PANNING, PANNING_LEFT, PANNING_RIGHT, 1.0f, this ), + m_coarseModel( 0, -2 * NOTES_PER_OCTAVE, 2 * NOTES_PER_OCTAVE, + 1.0f, this ), + m_fineLeftModel( 0.0f, -100.0f, 100.0f, 1.0f, this ), + m_fineRightModel( 0.0f, -100.0f, 100.0f, 1.0f, this ), + m_phaseOffsetModel( 0.0f, 0.0f, 360.0f, 1.0f, this ), + m_stereoPhaseDetuningModel( 0.0f, 0.0f, 360.0f, 1.0f, this ), + m_waveShapeModel( oscillator::SineWave, 0, oscillator::NumWaveShapes, + 1, this ), + m_modulationAlgoModel( oscillator::SignalMix, 0, + oscillator::NumModulationAlgos, 1, this ), + m_sampleBuffer( new sampleBuffer ), + m_volumeLeft( 0.0f ), + m_volumeRight( 0.0f ), + m_detuningLeft( 0.0f ), + m_detuningRight( 0.0f ), + m_phaseOffsetLeft( 0.0f ), + m_phaseOffsetRight( 0.0f ) { - setAutoFillBackground( TRUE ); - QPalette pal; - pal.setBrush( backgroundRole(), - PLUGIN_NAME::getIconPixmap( "artwork" ) ); - setPalette( pal ); + m_volumeModel.setTrack( _track ); + m_panModel.setTrack( _track ); + m_coarseModel.setTrack( _track ); + m_fineLeftModel.setTrack( _track ); + m_fineRightModel.setTrack( _track ); + m_phaseOffsetModel.setTrack( _track ); + m_stereoPhaseDetuningModel.setTrack( _track ); + m_waveShapeModel.setTrack( _track ); + m_modulationAlgoModel.setTrack( _track ); - pixmapButton * pm_osc1_btn = new pixmapButton( this, NULL, NULL ); - pm_osc1_btn->move( 46, 50 ); - pm_osc1_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "pm_active" ) ); - pm_osc1_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "pm_inactive" ) ); - pm_osc1_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( "btn_mask" ). - createHeuristicMask() ) ); - toolTip::add( pm_osc1_btn, tr( "use phase modulation for " - "modulating oscillator 2 with " - "oscillator 1" ) ); + // Connect knobs with oscillators' inputs + connect( &m_volumeModel, SIGNAL( dataChanged() ), + this, SLOT( updateVolume() ) ); + connect( &m_panModel, SIGNAL( dataChanged() ), + this, SLOT( updateVolume() ) ); + updateVolume(); - pixmapButton * am_osc1_btn = new pixmapButton( this, NULL, NULL ); - am_osc1_btn->move( 86, 50 ); - am_osc1_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "am_active" ) ); - am_osc1_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "am_inactive" ) ); - am_osc1_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( "btn_mask" ). - createHeuristicMask() ) ); - toolTip::add( am_osc1_btn, tr( "use amplitude modulation for " - "modulating oscillator 2 with " - "oscillator 1" ) ); + connect( &m_coarseModel, SIGNAL( dataChanged() ), + this, SLOT( updateDetuningLeft() ) ); + connect( &m_coarseModel, SIGNAL( dataChanged() ), + this, SLOT( updateDetuningRight() ) ); + connect( &m_fineLeftModel, SIGNAL( dataChanged() ), + this, SLOT( updateDetuningLeft() ) ); + connect( &m_fineRightModel, SIGNAL( dataChanged() ), + this, SLOT( updateDetuningRight() ) ); + updateDetuningLeft(); + updateDetuningRight(); - pixmapButton * mix_osc1_btn = new pixmapButton( this, NULL, NULL ); - mix_osc1_btn->move( 126, 50 ); - mix_osc1_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "mix_active" ) ); - mix_osc1_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "mix_inactive" ) ); - mix_osc1_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( - "btn_mask" ).createHeuristicMask() ) ); - toolTip::add( mix_osc1_btn, tr( "mix output of oscillator 1 & 2" ) ); + connect( &m_phaseOffsetModel, SIGNAL( dataChanged() ), + this, SLOT( updatePhaseOffsetLeft() ) ); + connect( &m_phaseOffsetModel, SIGNAL( dataChanged() ), + this, SLOT( updatePhaseOffsetRight() ) ); + connect( &m_stereoPhaseDetuningModel, SIGNAL( dataChanged() ), + this, SLOT( updatePhaseOffsetLeft() ) ); + updatePhaseOffsetLeft(); + updatePhaseOffsetRight(); - pixmapButton * sync_osc1_btn = new pixmapButton( this, NULL, NULL ); - sync_osc1_btn->move( 166, 50 ); - sync_osc1_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "sync_active" ) ); - sync_osc1_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "sync_inactive" ) ); - sync_osc1_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( - "btn_mask" ).createHeuristicMask() ) ); - toolTip::add( sync_osc1_btn, tr( "synchronize oscillator 1 with " - "oscillator 2" ) ); - - pixmapButton * fm_osc1_btn = new pixmapButton( this, NULL, NULL ); - fm_osc1_btn->move( 206, 50 ); - fm_osc1_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "fm_active" ) ); - fm_osc1_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "fm_inactive" ) ); - fm_osc1_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( "btn_mask" ). - createHeuristicMask() ) ); - toolTip::add( fm_osc1_btn, tr( "use frequency modulation for " - "modulating oscillator 2 with " - "oscillator 1" ) ); - - m_mod1BtnGrp = new automatableButtonGroup( this, - tr( "Modulation type 1" ), - _channel_track ); - m_mod1BtnGrp->addButton( pm_osc1_btn ); - m_mod1BtnGrp->addButton( am_osc1_btn ); - m_mod1BtnGrp->addButton( mix_osc1_btn ); - m_mod1BtnGrp->addButton( sync_osc1_btn ); - m_mod1BtnGrp->addButton( fm_osc1_btn ); - m_mod1BtnGrp->setInitValue( m_osc[0].m_modulationAlgo ); - - connect( m_mod1BtnGrp, SIGNAL( valueChanged( int ) ), - &m_osc[0], SLOT( modCh( int ) ) ); +} - pixmapButton * pm_osc2_btn = new pixmapButton( this, NULL, NULL ); - pm_osc2_btn->move( 46, 68 ); - pm_osc2_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "pm_active" ) ); - pm_osc2_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "pm_inactive" ) ); - pm_osc2_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( "btn_mask" ). - createHeuristicMask() ) ); - toolTip::add( pm_osc2_btn, tr( "use phase modulation for " - "modulating oscillator 3 with " - "oscillator 2" ) ); - - pixmapButton * am_osc2_btn = new pixmapButton( this, NULL, NULL ); - am_osc2_btn->move( 86, 68 ); - am_osc2_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "am_active" ) ); - am_osc2_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "am_inactive" ) ); - am_osc2_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( "btn_mask" ). - createHeuristicMask() ) ); - toolTip::add( am_osc2_btn, tr( "use amplitude modulation for " - "modulating oscillator 3 with " - "oscillator 2" ) ); - - pixmapButton * mix_osc2_btn = new pixmapButton( this, NULL, NULL ); - mix_osc2_btn->move( 126, 68 ); - mix_osc2_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "mix_active" ) ); - mix_osc2_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "mix_inactive" ) ); - mix_osc2_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( - "btn_mask" ).createHeuristicMask() ) ); - toolTip::add( mix_osc2_btn, tr("mix output of oscillator 2 & 3" ) ); - - pixmapButton * sync_osc2_btn = new pixmapButton( this, NULL, NULL ); - sync_osc2_btn->move( 166, 68 ); - sync_osc2_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "sync_active" ) ); - sync_osc2_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "sync_inactive" ) ); - sync_osc2_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( - "btn_mask" ).createHeuristicMask() ) ); - toolTip::add( sync_osc2_btn, tr( "synchronize oscillator 2 with " - "oscillator 3" ) ); - - pixmapButton * fm_osc2_btn = new pixmapButton( this, NULL, NULL ); - fm_osc2_btn->move( 206, 68 ); - fm_osc2_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "fm_active" ) ); - fm_osc2_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "fm_inactive" ) ); - fm_osc2_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( "btn_mask" ). - createHeuristicMask() ) ); - toolTip::add( fm_osc2_btn, tr( "use frequency modulation for " - "modulating oscillator 3 with " - "oscillator 2" ) ); - - m_mod2BtnGrp = new automatableButtonGroup( this, - tr( "Modulation type 2" ), - _channel_track ); - m_mod2BtnGrp->addButton( pm_osc2_btn ); - m_mod2BtnGrp->addButton( am_osc2_btn ); - m_mod2BtnGrp->addButton( mix_osc2_btn ); - m_mod2BtnGrp->addButton( sync_osc2_btn ); - m_mod2BtnGrp->addButton( fm_osc2_btn ); - m_mod2BtnGrp->setInitValue( m_osc[1].m_modulationAlgo ); - - connect( m_mod2BtnGrp, SIGNAL( valueChanged( int ) ), - &m_osc[1], SLOT( modCh( int ) ) ); +oscillatorObject::~oscillatorObject() +{ + sharedObject::unref( m_sampleBuffer ); +} + + + + +void oscillatorObject::oscUserDefWaveDblClick( void ) +{ + QString af = m_sampleBuffer->openAudioFile(); + if( af != "" ) + { + m_sampleBuffer->setAudioFile( af ); + // TODO: + //toolTip::add( m_usrWaveBtn, m_sampleBuffer->audioFile() ); + } +} + + + + +void oscillatorObject::updateVolume( void ) +{ + if( m_panModel.value() >= 0.0f ) + { + const float panningFactorLeft = 1.0f - m_panModel.value() + / (float)PANNING_RIGHT; + m_volumeLeft = panningFactorLeft * m_volumeModel.value() / + 100.0f; + m_volumeRight = m_volumeModel.value() / 100.0f; + } + else + { + m_volumeLeft = m_volumeModel.value() / 100.0f; + const float panningFactorRight = 1.0f + m_panModel.value() + / (float)PANNING_RIGHT; + m_volumeRight = panningFactorRight * m_volumeModel.value() / + 100.0f; + } +} + + + + +void oscillatorObject::updateDetuningLeft( void ) +{ + m_detuningLeft = powf( 2.0f, ( (float)m_coarseModel.value() * 100.0f + + (float)m_fineLeftModel.value() ) / 1200.0f ) + / engine::getMixer()->sampleRate(); +} + + + + +void oscillatorObject::updateDetuningRight( void ) +{ + m_detuningRight = powf( 2.0f, ( (float)m_coarseModel.value() * 100.0f + + (float)m_fineRightModel.value() ) / 1200.0f ) + / engine::getMixer()->sampleRate(); +} + + + + +void oscillatorObject::updatePhaseOffsetLeft( void ) +{ + m_phaseOffsetLeft = ( m_phaseOffsetModel.value() + + m_stereoPhaseDetuningModel.value() ) / 360.0f; +} + + + + +void oscillatorObject::updatePhaseOffsetRight( void ) +{ + m_phaseOffsetRight = m_phaseOffsetModel.value() / 360.0f; +} + + + + + + + + +tripleOscillator::tripleOscillator( instrumentTrack * _instrument_track ) : + instrument( _instrument_track, &tripleoscillator_plugin_descriptor ) +{ for( int i = 0; i < NUM_OF_OSCILLATORS; ++i ) { - // setup volume-knob - m_osc[i].m_volKnob = new volumeKnob( knobSmall_17, this, tr( - "Osc %1 volume" ).arg( i+1 ), _channel_track ); - m_osc[i].m_volKnob->move( 6, 104 + i * 50 ); - m_osc[i].m_volKnob->setRange( MIN_VOLUME, MAX_VOLUME, 1.0f ); - m_osc[i].m_volKnob->setInitValue( DEFAULT_VOLUME - / NUM_OF_OSCILLATORS ); - m_osc[i].m_volKnob->setHintText( tr( "Osc %1 volume:" ).arg( - i+1 ) + " ", "%" ); - m_osc[i].m_volKnob->setWhatsThis( - tr( "With this knob you can set the volume of " - "oscillator %1. When setting a value of 0 the " - "oscillator is turned off. Otherwise you can " - "hear the oscillator as loud as you set it " - "here.").arg( i+1 ) ); + m_osc[i] = new oscillatorObject( this, _instrument_track ); - // setup panning-knob - m_osc[i].m_panKnob = new knob( knobSmall_17, this, - tr( "Osc %1 panning" ).arg( i + 1 ), - _channel_track ); - m_osc[i].m_panKnob->move( 33, 104 + i * 50 ); - m_osc[i].m_panKnob->setRange( PANNING_LEFT, PANNING_RIGHT, - 1.0f ); - m_osc[i].m_panKnob->setInitValue( DEFAULT_PANNING ); - m_osc[i].m_panKnob->setHintText( tr("Osc %1 panning:").arg( - i + 1 ) - + " ", "" ); - m_osc[i].m_panKnob->setWhatsThis( - tr( "With this knob you can set the panning of the " - "oscillator %1. A value of -100 means 100% " - "left and a value of 100 moves oscillator-" - "output right.").arg( i+1 ) ); - - // setup coarse-knob - m_osc[i].m_coarseKnob = new knob( knobSmall_17, this, - tr( "Osc %1 coarse detuning" ).arg( i + 1 ), - _channel_track ); - m_osc[i].m_coarseKnob->move( 66, 104 + i * 50 ); - m_osc[i].m_coarseKnob->setRange( -2 * NOTES_PER_OCTAVE, - 2 * NOTES_PER_OCTAVE, 1.0f ); - m_osc[i].m_coarseKnob->setInitValue( 0.0f ); - m_osc[i].m_coarseKnob->setHintText( - tr( "Osc %1 coarse detuning:" ).arg( i + 1 ) + " ", - " " + tr( "semitones" ) ); - m_osc[i].m_coarseKnob->setWhatsThis( - tr( "With this knob you can set the coarse detuning of " - "oscillator %1. You can detune the oscillator " - "12 semitones (1 octave) up and down. This is " - "useful for creating sounds with a chord." ). - arg( i + 1 ) ); - - // setup knob for left fine-detuning - m_osc[i].m_fineLKnob = new knob( knobSmall_17, this, - tr( "Osc %1 fine detuning left" ).arg( i+1 ), - _channel_track ); - m_osc[i].m_fineLKnob->move( 90, 104 + i * 50 ); - m_osc[i].m_fineLKnob->setRange( -100.0f, 100.0f, 1.0f ); - m_osc[i].m_fineLKnob->setInitValue( 0.0f ); - m_osc[i].m_fineLKnob->setHintText( tr( "Osc %1 fine detuning " - "left:" ).arg( i + 1 ) - + " ", " " + - tr( "cents" ) ); - m_osc[i].m_fineLKnob->setWhatsThis( - tr( "With this knob you can set the fine detuning of " - "oscillator %1 for the left channel. The fine-" - "detuning is ranged between -100 cents and " - "+100 cents. This is useful for creating " - "\"fat\" sounds." ).arg( i + 1 ) ); - - // setup knob for right fine-detuning - m_osc[i].m_fineRKnob = new knob( knobSmall_17, this, - tr( "Osc %1 fine detuning right" - ).arg( i + 1 ), - _channel_track ); - m_osc[i].m_fineRKnob->move( 110, 104 + i * 50 ); - m_osc[i].m_fineRKnob->setRange( -100.0f, 100.0f, 1.0f ); - m_osc[i].m_fineRKnob->setInitValue( 0.0f ); - m_osc[i].m_fineRKnob->setHintText( tr( "Osc %1 fine detuning " - "right:").arg( i + 1 ) + - " ", " " + tr( "cents" ) ); - m_osc[i].m_fineRKnob->setWhatsThis( - tr( "With this knob you can set the fine detuning of " - "oscillator %1 for the right channel. The " - "fine-detuning is ranged between -100 cents " - "and +100 cents. This is useful for creating " - "\"fat\" sounds." ).arg( i+1 ) ); - - // setup phase-offset-knob - m_osc[i].m_phaseOffsetKnob = new knob( knobSmall_17, this, - tr( "Osc %1 phase-" - "offset" ).arg( i+1 ), - _channel_track ); - m_osc[i].m_phaseOffsetKnob->move( 142, 104 + i * 50 ); - m_osc[i].m_phaseOffsetKnob->setRange( 0.0f, 360.0f, 1.0f ); - m_osc[i].m_phaseOffsetKnob->setInitValue( 0.0f ); - m_osc[i].m_phaseOffsetKnob->setHintText( tr( "Osc %1 phase-" - "offset:" ). - arg( i + 1 ) + - " ", " " + tr( "degrees" ) ); - m_osc[i].m_phaseOffsetKnob->setWhatsThis( - tr( "With this knob you can set the phase-offset of " - "oscillator %1. That means you can move the " - "point within an oscillation where the " - "oscillator begins to oscillate. For example " - "if you have a sine-wave and have a phase-" - "offset of 180 degrees the wave will first go " - "down. It's the same with a square-wave." - ).arg( i+1 ) ); - - // setup stereo-phase-detuning-knob - m_osc[i].m_stereoPhaseDetuningKnob = new knob( knobSmall_17, - this, tr( "Osc %1 stereo phase-" - "detuning" ).arg( i+1 ), - _channel_track ); - m_osc[i].m_stereoPhaseDetuningKnob->move( 166, 104 + i * 50 ); - m_osc[i].m_stereoPhaseDetuningKnob->setRange( 0.0f, 360.0f, - 1.0f ); - m_osc[i].m_stereoPhaseDetuningKnob->setInitValue( 0.0f ); - m_osc[i].m_stereoPhaseDetuningKnob->setHintText( tr("Osc %1 " - "stereo phase-" - "detuning:" ). - arg( i + 1 ) + - " ", " " + - tr( "degrees" ) ); - m_osc[i].m_stereoPhaseDetuningKnob->setWhatsThis( - tr( "With this knob you can set the stereo phase-" - "detuning of oscillator %1. The stereo phase-" - "detuning specifies the size of the difference " - "between the phase-offset of left and right " - "channel. This is very good for creating wide " - "stereo-sounds." ).arg( i+1 ) ); - - // Connect knobs with oscillators' inputs - connect( m_osc[i].m_volKnob, SIGNAL( valueChanged() ), - &m_osc[i], SLOT( updateVolume() ) ); - connect( m_osc[i].m_panKnob, SIGNAL( valueChanged() ), - &m_osc[i], SLOT( updateVolume() ) ); - m_osc[i].updateVolume(); - - connect( m_osc[i].m_coarseKnob, SIGNAL( valueChanged() ), - &m_osc[i], SLOT( updateDetuningLeft() ) ); - connect( m_osc[i].m_coarseKnob, SIGNAL( valueChanged() ), - &m_osc[i], SLOT( updateDetuningRight() ) ); - connect( m_osc[i].m_fineLKnob, SIGNAL( valueChanged() ), - &m_osc[i], SLOT( updateDetuningLeft() ) ); - connect( m_osc[i].m_fineRKnob, SIGNAL( valueChanged() ), - &m_osc[i], SLOT( updateDetuningRight() ) ); - m_osc[i].updateDetuningLeft(); - m_osc[i].updateDetuningRight(); - - connect( m_osc[i].m_phaseOffsetKnob, SIGNAL( valueChanged() ), - &m_osc[i], SLOT( updatePhaseOffsetLeft() ) ); - connect( m_osc[i].m_phaseOffsetKnob, SIGNAL( valueChanged() ), - &m_osc[i], SLOT( updatePhaseOffsetRight() ) ); - connect( m_osc[i].m_stereoPhaseDetuningKnob, - SIGNAL( valueChanged() ), - &m_osc[i], SLOT( updatePhaseOffsetLeft() ) ); - m_osc[i].updatePhaseOffsetLeft(); - m_osc[i].updatePhaseOffsetRight(); - - pixmapButton * sin_wave_btn = new pixmapButton( this, NULL, - NULL ); - sin_wave_btn->move( 188, 105 + i * 50 ); - sin_wave_btn->setActiveGraphic( embed::getIconPixmap( - "sin_wave_active" ) ); - sin_wave_btn->setInactiveGraphic( embed::getIconPixmap( - "sin_wave_inactive" ) ); - sin_wave_btn->setChecked( TRUE ); - toolTip::add( sin_wave_btn, - tr( "Click here if you want a sine-wave for " - "current oscillator." ) ); - - pixmapButton * triangle_wave_btn = new pixmapButton( this, NULL, - NULL ); - triangle_wave_btn->move( 203, 105 + i * 50 ); - triangle_wave_btn->setActiveGraphic( - embed::getIconPixmap( "triangle_wave_active" ) ); - triangle_wave_btn->setInactiveGraphic( - embed::getIconPixmap( "triangle_wave_inactive" ) ); - toolTip::add( triangle_wave_btn, - tr( "Click here if you want a triangle-wave " - "for current oscillator." ) ); - - pixmapButton * saw_wave_btn = new pixmapButton( this, NULL, - NULL ); - saw_wave_btn->move( 218, 105 + i * 50 ); - saw_wave_btn->setActiveGraphic( embed::getIconPixmap( - "saw_wave_active" ) ); - saw_wave_btn->setInactiveGraphic( embed::getIconPixmap( - "saw_wave_inactive" ) ); - toolTip::add( saw_wave_btn, - tr( "Click here if you want a saw-wave for " - "current oscillator." ) ); - - pixmapButton * sqr_wave_btn = new pixmapButton( this, NULL, - NULL ); - sqr_wave_btn->move( 233, 105 + i * 50 ); - sqr_wave_btn->setActiveGraphic( embed::getIconPixmap( - "square_wave_active" ) ); - sqr_wave_btn->setInactiveGraphic( embed::getIconPixmap( - "square_wave_inactive" ) ); - toolTip::add( sqr_wave_btn, - tr( "Click here if you want a square-wave for " - "current oscillator." ) ); - - pixmapButton * moog_saw_wave_btn = new pixmapButton( this, NULL, - NULL ); - moog_saw_wave_btn->move( 188, 120+i*50 ); - moog_saw_wave_btn->setActiveGraphic( - embed::getIconPixmap( "moog_saw_wave_active" ) ); - moog_saw_wave_btn->setInactiveGraphic( - embed::getIconPixmap( "moog_saw_wave_inactive" ) ); - toolTip::add( moog_saw_wave_btn, - tr( "Click here if you want a moog-saw-wave " - "for current oscillator." ) ); - - pixmapButton * exp_wave_btn = new pixmapButton( this, NULL, - NULL ); - exp_wave_btn->move( 203, 120+i*50 ); - exp_wave_btn->setActiveGraphic( embed::getIconPixmap( - "exp_wave_active" ) ); - exp_wave_btn->setInactiveGraphic( embed::getIconPixmap( - "exp_wave_inactive" ) ); - toolTip::add( exp_wave_btn, - tr( "Click here if you want an exponential " - "wave for current oscillator." ) ); - - pixmapButton * white_noise_btn = new pixmapButton( this, NULL, - NULL ); - white_noise_btn->move( 218, 120+i*50 ); - white_noise_btn->setActiveGraphic( - embed::getIconPixmap( "white_noise_wave_active" ) ); - white_noise_btn->setInactiveGraphic( - embed::getIconPixmap( "white_noise_wave_inactive" ) ); - toolTip::add( white_noise_btn, - tr( "Click here if you want a white-noise for " - "current oscillator." ) ); - - m_osc[i].m_usrWaveBtn = new pixmapButton( this, NULL, NULL ); - m_osc[i].m_usrWaveBtn->move( 233, 120+i*50 ); - m_osc[i].m_usrWaveBtn->setActiveGraphic( embed::getIconPixmap( - "usr_wave_active" ) ); - m_osc[i].m_usrWaveBtn->setInactiveGraphic( embed::getIconPixmap( - "usr_wave_inactive" ) ); - toolTip::add( m_osc[i].m_usrWaveBtn, - tr( "Click here if you want a user-defined " - "wave-shape for current oscillator." ) ); - - m_osc[i].m_waveBtnGrp = new automatableButtonGroup( this, - tr( "Osc %1 wave shape" ).arg( i + 1 ), - _channel_track ); - m_osc[i].m_waveBtnGrp->addButton( sin_wave_btn ); - m_osc[i].m_waveBtnGrp->addButton( triangle_wave_btn ); - m_osc[i].m_waveBtnGrp->addButton( saw_wave_btn ); - m_osc[i].m_waveBtnGrp->addButton( sqr_wave_btn ); - m_osc[i].m_waveBtnGrp->addButton( moog_saw_wave_btn ); - m_osc[i].m_waveBtnGrp->addButton( exp_wave_btn ); - m_osc[i].m_waveBtnGrp->addButton( white_noise_btn ); - m_osc[i].m_waveBtnGrp->addButton( m_osc[i].m_usrWaveBtn ); - - connect( m_osc[i].m_waveBtnGrp, SIGNAL( valueChanged( int ) ), - &m_osc[i], SLOT( oscWaveCh( int ) ) ); - connect( m_osc[i].m_usrWaveBtn, SIGNAL( doubleClicked() ), - &m_osc[i], SLOT( oscUserDefWaveDblClick() ) ); } connect( engine::getMixer(), SIGNAL( sampleRateChanged() ), @@ -500,26 +243,27 @@ tripleOscillator::~tripleOscillator() void tripleOscillator::saveSettings( QDomDocument & _doc, QDomElement & _this ) { - m_mod1BtnGrp->saveSettings( _doc, _this, "modalgo1" ); - m_mod2BtnGrp->saveSettings( _doc, _this, "modalgo2" ); - for( int i = 0; i < NUM_OF_OSCILLATORS; ++i ) { QString is = QString::number( i ); - m_osc[i].m_volKnob->saveSettings( _doc, _this, "vol" + is ); - m_osc[i].m_panKnob->saveSettings( _doc, _this, "pan" + is ); - m_osc[i].m_coarseKnob->saveSettings( _doc, _this, "coarse" + m_osc[i]->m_volumeModel.saveSettings( _doc, _this, "vol" + is ); + m_osc[i]->m_panModel.saveSettings( _doc, _this, "pan" + is ); + m_osc[i]->m_coarseModel.saveSettings( _doc, _this, "coarse" + is ); - m_osc[i].m_fineLKnob->saveSettings( _doc, _this, "finel" + is ); - m_osc[i].m_fineRKnob->saveSettings( _doc, _this, "finer" + is ); - m_osc[i].m_phaseOffsetKnob->saveSettings( _doc, _this, + m_osc[i]->m_fineLeftModel.saveSettings( _doc, _this, "finel" + + is ); + m_osc[i]->m_fineRightModel.saveSettings( _doc, _this, "finer" + + is ); + m_osc[i]->m_phaseOffsetModel.saveSettings( _doc, _this, "phoffset" + is ); - m_osc[i].m_stereoPhaseDetuningKnob->saveSettings( _doc, _this, + m_osc[i]->m_stereoPhaseDetuningModel.saveSettings( _doc, _this, "stphdetun" + is ); - m_osc[i].m_waveBtnGrp->saveSettings( _doc, _this, + m_osc[i]->m_waveShapeModel.saveSettings( _doc, _this, "wavetype" + is ); + m_osc[i]->m_modulationAlgoModel.saveSettings( _doc, _this, + "modalgo" + is ); _this.setAttribute( "userwavefile" + is, - m_osc[i].m_sampleBuffer->audioFile() ); + m_osc[i]->m_sampleBuffer->audioFile() ); } } @@ -528,24 +272,24 @@ void tripleOscillator::saveSettings( QDomDocument & _doc, QDomElement & _this ) void tripleOscillator::loadSettings( const QDomElement & _this ) { - m_mod1BtnGrp->loadSettings( _this, "modalgo1" ); - m_mod2BtnGrp->loadSettings( _this, "modalgo2" ); - for( int i = 0; i < NUM_OF_OSCILLATORS; ++i ) { QString is = QString::number( i ); - m_osc[i].m_volKnob->loadSettings( _this, "vol" + is ); - m_osc[i].m_panKnob->loadSettings( _this, "pan" + is ); - m_osc[i].m_coarseKnob->loadSettings( _this, "coarse" + is ); - m_osc[i].m_fineLKnob->loadSettings( _this, "finel" + is ); - m_osc[i].m_fineRKnob->loadSettings( _this, "finer" + is ); - m_osc[i].m_phaseOffsetKnob->loadSettings( _this, + m_osc[i]->m_volumeModel.loadSettings( _this, "vol" + is ); + m_osc[i]->m_panModel.loadSettings( _this, "pan" + is ); + m_osc[i]->m_coarseModel.loadSettings( _this, "coarse" + is ); + m_osc[i]->m_fineLeftModel.loadSettings( _this, "finel" + is ); + m_osc[i]->m_fineRightModel.loadSettings( _this, "finer" + is ); + m_osc[i]->m_phaseOffsetModel.loadSettings( _this, "phoffset" + is ); - m_osc[i].m_stereoPhaseDetuningKnob->loadSettings( _this, + m_osc[i]->m_stereoPhaseDetuningModel.loadSettings( _this, "stphdetun" + is ); - m_osc[i].m_sampleBuffer->setAudioFile( _this.attribute( + m_osc[i]->m_waveShapeModel.loadSettings( _this, "wavetype" + + is ); + m_osc[i]->m_modulationAlgoModel.loadSettings( _this, + "modalgo" + is ); + m_osc[i]->m_sampleBuffer->setAudioFile( _this.attribute( "userwavefile" + is ) ); - m_osc[i].m_waveBtnGrp->loadSettings( _this, "wavetype" + is ); } } @@ -559,7 +303,7 @@ void tripleOscillator::setParameter( const QString & _param, { for( int i = 0; i < NUM_OF_OSCILLATORS; ++i ) { - m_osc[i].m_sampleBuffer->setAudioFile( _value ); + m_osc[i]->m_sampleBuffer->setAudioFile( _value ); } } } @@ -589,42 +333,42 @@ void tripleOscillator::playNote( notePlayHandle * _n, bool ) if( i == NUM_OF_OSCILLATORS - 1 ) { oscs_l[i] = new oscillator( - m_osc[i].m_waveShape, - m_osc[i].m_modulationAlgo, + m_osc[i]->m_waveShapeModel, + m_osc[i]->m_modulationAlgoModel, _n->frequency(), - m_osc[i].m_detuningLeft, - m_osc[i].m_phaseOffsetLeft, - m_osc[i].m_volumeLeft ); + m_osc[i]->m_detuningLeft, + m_osc[i]->m_phaseOffsetLeft, + m_osc[i]->m_volumeLeft ); oscs_r[i] = new oscillator( - m_osc[i].m_waveShape, - m_osc[i].m_modulationAlgo, + m_osc[i]->m_waveShapeModel, + m_osc[i]->m_modulationAlgoModel, _n->frequency(), - m_osc[i].m_detuningRight, - m_osc[i].m_phaseOffsetRight, - m_osc[i].m_volumeRight ); + m_osc[i]->m_detuningRight, + m_osc[i]->m_phaseOffsetRight, + m_osc[i]->m_volumeRight ); } else { oscs_l[i] = new oscillator( - m_osc[i].m_waveShape, - m_osc[i].m_modulationAlgo, + m_osc[i]->m_waveShapeModel, + m_osc[i]->m_modulationAlgoModel, _n->frequency(), - m_osc[i].m_detuningLeft, - m_osc[i].m_phaseOffsetLeft, - m_osc[i].m_volumeLeft, + m_osc[i]->m_detuningLeft, + m_osc[i]->m_phaseOffsetLeft, + m_osc[i]->m_volumeLeft, oscs_l[i + 1] ); oscs_r[i] = new oscillator( - m_osc[i].m_waveShape, - m_osc[i].m_modulationAlgo, + m_osc[i]->m_waveShapeModel, + m_osc[i]->m_modulationAlgoModel, _n->frequency(), - m_osc[i].m_detuningRight, - m_osc[i].m_phaseOffsetRight, - m_osc[i].m_volumeRight, + m_osc[i]->m_detuningRight, + m_osc[i]->m_phaseOffsetRight, + m_osc[i]->m_volumeRight, oscs_r[i + 1] ); } - oscs_l[i]->setUserWave( m_osc[i].m_sampleBuffer ); - oscs_r[i]->setUserWave( m_osc[i].m_sampleBuffer ); + oscs_l[i]->setUserWave( m_osc[i]->m_sampleBuffer ); + oscs_r[i]->setUserWave( m_osc[i]->m_sampleBuffer ); } @@ -640,7 +384,7 @@ void tripleOscillator::playNote( notePlayHandle * _n, bool ) const fpp_t frames = _n->framesLeftForCurrentPeriod(); sampleFrame * buf = new sampleFrame[frames]; - + osc_l->update( buf, frames, 0 ); osc_r->update( buf, frames, 1 ); @@ -666,12 +410,20 @@ void tripleOscillator::deleteNotePluginData( notePlayHandle * _n ) +pluginView * tripleOscillator::instantiateView( QWidget * _parent ) +{ + return( new tripleOscillatorView( this, _parent ) ); +} + + + + void tripleOscillator::updateAllDetuning( void ) { for( int i = 0; i < NUM_OF_OSCILLATORS; ++i ) { - m_osc[i].updateDetuningLeft(); - m_osc[i].updateDetuningRight(); + m_osc[i]->updateDetuningLeft(); + m_osc[i]->updateDetuningRight(); } } @@ -679,110 +431,390 @@ void tripleOscillator::updateAllDetuning( void ) - - - -oscillatorObject::oscillatorObject( void ) : - m_waveShape( oscillator::SIN_WAVE ), - m_sampleBuffer( new sampleBuffer ), - m_modulationAlgo( oscillator::MIX ) +tripleOscillatorView::tripleOscillatorView( instrument * _instrument, + QWidget * _parent ) : + instrumentView( _instrument, _parent ) { -} + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), + PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); + + // TODO: clean rewrite using layouts and all that... + pixmapButton * pm_osc1_btn = new pixmapButton( this, NULL ); + pm_osc1_btn->move( 46, 50 ); + pm_osc1_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "pm_active" ) ); + pm_osc1_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "pm_inactive" ) ); + pm_osc1_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( "btn_mask" ). + createHeuristicMask() ) ); + toolTip::add( pm_osc1_btn, tr( "use phase modulation for " + "modulating oscillator 2 with " + "oscillator 1" ) ); + + pixmapButton * am_osc1_btn = new pixmapButton( this, NULL ); + am_osc1_btn->move( 86, 50 ); + am_osc1_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "am_active" ) ); + am_osc1_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "am_inactive" ) ); + am_osc1_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( "btn_mask" ). + createHeuristicMask() ) ); + toolTip::add( am_osc1_btn, tr( "use amplitude modulation for " + "modulating oscillator 2 with " + "oscillator 1" ) ); + + pixmapButton * mix_osc1_btn = new pixmapButton( this, NULL ); + mix_osc1_btn->move( 126, 50 ); + mix_osc1_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "mix_active" ) ); + mix_osc1_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "mix_inactive" ) ); + mix_osc1_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( + "btn_mask" ).createHeuristicMask() ) ); + toolTip::add( mix_osc1_btn, tr( "mix output of oscillator 1 & 2" ) ); + + pixmapButton * sync_osc1_btn = new pixmapButton( this, NULL ); + sync_osc1_btn->move( 166, 50 ); + sync_osc1_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "sync_active" ) ); + sync_osc1_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "sync_inactive" ) ); + sync_osc1_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( + "btn_mask" ).createHeuristicMask() ) ); + toolTip::add( sync_osc1_btn, tr( "synchronize oscillator 1 with " + "oscillator 2" ) ); + + pixmapButton * fm_osc1_btn = new pixmapButton( this, NULL ); + fm_osc1_btn->move( 206, 50 ); + fm_osc1_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "fm_active" ) ); + fm_osc1_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "fm_inactive" ) ); + fm_osc1_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( "btn_mask" ). + createHeuristicMask() ) ); + toolTip::add( fm_osc1_btn, tr( "use frequency modulation for " + "modulating oscillator 2 with " + "oscillator 1" ) ); + + m_mod1BtnGrp = new automatableButtonGroup( this, + tr( "Modulation type 1" ) ); + m_mod1BtnGrp->addButton( pm_osc1_btn ); + m_mod1BtnGrp->addButton( am_osc1_btn ); + m_mod1BtnGrp->addButton( mix_osc1_btn ); + m_mod1BtnGrp->addButton( sync_osc1_btn ); + m_mod1BtnGrp->addButton( fm_osc1_btn ); + pixmapButton * pm_osc2_btn = new pixmapButton( this, NULL ); + pm_osc2_btn->move( 46, 68 ); + pm_osc2_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "pm_active" ) ); + pm_osc2_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "pm_inactive" ) ); + pm_osc2_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( "btn_mask" ). + createHeuristicMask() ) ); + toolTip::add( pm_osc2_btn, tr( "use phase modulation for " + "modulating oscillator 3 with " + "oscillator 2" ) ); -oscillatorObject::~oscillatorObject() -{ - sharedObject::unref( m_sampleBuffer ); -} + pixmapButton * am_osc2_btn = new pixmapButton( this, NULL ); + am_osc2_btn->move( 86, 68 ); + am_osc2_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "am_active" ) ); + am_osc2_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "am_inactive" ) ); + am_osc2_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( "btn_mask" ). + createHeuristicMask() ) ); + toolTip::add( am_osc2_btn, tr( "use amplitude modulation for " + "modulating oscillator 3 with " + "oscillator 2" ) ); + + pixmapButton * mix_osc2_btn = new pixmapButton( this, NULL ); + mix_osc2_btn->move( 126, 68 ); + mix_osc2_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "mix_active" ) ); + mix_osc2_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "mix_inactive" ) ); + mix_osc2_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( + "btn_mask" ).createHeuristicMask() ) ); + toolTip::add( mix_osc2_btn, tr("mix output of oscillator 2 & 3" ) ); + + pixmapButton * sync_osc2_btn = new pixmapButton( this, NULL ); + sync_osc2_btn->move( 166, 68 ); + sync_osc2_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "sync_active" ) ); + sync_osc2_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "sync_inactive" ) ); + sync_osc2_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( + "btn_mask" ).createHeuristicMask() ) ); + toolTip::add( sync_osc2_btn, tr( "synchronize oscillator 2 with " + "oscillator 3" ) ); + + pixmapButton * fm_osc2_btn = new pixmapButton( this, NULL ); + fm_osc2_btn->move( 206, 68 ); + fm_osc2_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "fm_active" ) ); + fm_osc2_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "fm_inactive" ) ); + fm_osc2_btn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( "btn_mask" ). + createHeuristicMask() ) ); + toolTip::add( fm_osc2_btn, tr( "use frequency modulation for " + "modulating oscillator 3 with " + "oscillator 2" ) ); + + m_mod2BtnGrp = new automatableButtonGroup( this, + tr( "Modulation type 2" ) ); + m_mod2BtnGrp->addButton( pm_osc2_btn ); + m_mod2BtnGrp->addButton( am_osc2_btn ); + m_mod2BtnGrp->addButton( mix_osc2_btn ); + m_mod2BtnGrp->addButton( sync_osc2_btn ); + m_mod2BtnGrp->addButton( fm_osc2_btn ); - - -void oscillatorObject::oscWaveCh( int _n ) -{ - m_waveShape = static_cast( _n ); -} - - - - -void oscillatorObject::oscUserDefWaveDblClick( void ) -{ - QString af = m_sampleBuffer->openAudioFile(); - if( af != "" ) + for( int i = 0; i < NUM_OF_OSCILLATORS; ++i ) { - m_sampleBuffer->setAudioFile( af ); - toolTip::add( m_usrWaveBtn, m_sampleBuffer->audioFile() ); + // setup volume-knob + volumeKnob * vk = new volumeKnob( knobSmall_17, this, tr( + "Osc %1 volume" ).arg( i+1 ) ); + vk->move( 6, 104 + i * 50 ); + vk->setHintText( tr( "Osc %1 volume:" ).arg( + i+1 ) + " ", "%" ); + vk->setWhatsThis( + tr( "With this knob you can set the volume of " + "oscillator %1. When setting a value of 0 the " + "oscillator is turned off. Otherwise you can " + "hear the oscillator as loud as you set it " + "here.").arg( i+1 ) ); + + // setup panning-knob + knob * pk = new knob( knobSmall_17, this, + tr( "Osc %1 panning" ).arg( i + 1 ) ); + pk->move( 33, 104 + i * 50 ); + pk->setHintText( tr("Osc %1 panning:").arg( i + 1 ) + " ", "" ); + pk->setWhatsThis( + tr( "With this knob you can set the panning of the " + "oscillator %1. A value of -100 means 100% " + "left and a value of 100 moves oscillator-" + "output right.").arg( i+1 ) ); + + // setup coarse-knob + knob * ck = new knob( knobSmall_17, this, + tr( "Osc %1 coarse detuning" ).arg( i + 1 ) ); + ck->move( 66, 104 + i * 50 ); + ck->setHintText( tr( "Osc %1 coarse detuning:" ).arg( i + 1 ) + + " ", " " + tr( "semitones" ) ); + ck->setWhatsThis( + tr( "With this knob you can set the coarse detuning of " + "oscillator %1. You can detune the oscillator " + "12 semitones (1 octave) up and down. This is " + "useful for creating sounds with a chord." ). + arg( i + 1 ) ); + + // setup knob for left fine-detuning + knob * flk = new knob( knobSmall_17, this, + tr( "Osc %1 fine detuning left" ).arg( i+1 ) ); + flk->move( 90, 104 + i * 50 ); + flk->setHintText( tr( "Osc %1 fine detuning left:" ). + arg( i + 1 ) + " ", + " " + tr( "cents" ) ); + flk->setWhatsThis( + tr( "With this knob you can set the fine detuning of " + "oscillator %1 for the left channel. The fine-" + "detuning is ranged between -100 cents and " + "+100 cents. This is useful for creating " + "\"fat\" sounds." ).arg( i + 1 ) ); + + // setup knob for right fine-detuning + knob * frk = new knob( knobSmall_17, this, + tr( "Osc %1 fine detuning right" ).arg( i + 1 ) ); + frk->move( 110, 104 + i * 50 ); + frk->setHintText( tr( "Osc %1 fine detuning right:" ). + arg( i + 1 ) + " ", + " " + tr( "cents" ) ); + frk->setWhatsThis( + tr( "With this knob you can set the fine detuning of " + "oscillator %1 for the right channel. The " + "fine-detuning is ranged between -100 cents " + "and +100 cents. This is useful for creating " + "\"fat\" sounds." ).arg( i+1 ) ); + + // setup phase-offset-knob + knob * pok = new knob( knobSmall_17, this, + tr( "Osc %1 phase-offset" ).arg( i+1 ) ); + pok->move( 142, 104 + i * 50 ); + pok->setHintText( tr( "Osc %1 phase-offset:" ). + arg( i + 1 ) + " ", + " " + tr( "degrees" ) ); + pok->setWhatsThis( + tr( "With this knob you can set the phase-offset of " + "oscillator %1. That means you can move the " + "point within an oscillation where the " + "oscillator begins to oscillate. For example " + "if you have a sine-wave and have a phase-" + "offset of 180 degrees the wave will first go " + "down. It's the same with a square-wave." + ).arg( i+1 ) ); + + // setup stereo-phase-detuning-knob + knob * spdk = new knob( knobSmall_17, this, + tr( "Osc %1 stereo phase-detuning" ).arg( i+1 ) ); + spdk->move( 166, 104 + i * 50 ); + spdk->setHintText( tr("Osc %1 stereo phase-detuning:" ). + arg( i + 1 ) + " ", + " " + tr( "degrees" ) ); + spdk->setWhatsThis( + tr( "With this knob you can set the stereo phase-" + "detuning of oscillator %1. The stereo phase-" + "detuning specifies the size of the difference " + "between the phase-offset of left and right " + "channel. This is very good for creating wide " + "stereo-sounds." ).arg( i+1 ) ); + + + pixmapButton * sin_wave_btn = new pixmapButton( this, NULL ); + sin_wave_btn->move( 188, 105 + i * 50 ); + sin_wave_btn->setActiveGraphic( embed::getIconPixmap( + "sin_wave_active" ) ); + sin_wave_btn->setInactiveGraphic( embed::getIconPixmap( + "sin_wave_inactive" ) ); + toolTip::add( sin_wave_btn, + tr( "Click here if you want a sine-wave for " + "current oscillator." ) ); + + pixmapButton * triangle_wave_btn = + new pixmapButton( this, NULL ); + triangle_wave_btn->move( 203, 105 + i * 50 ); + triangle_wave_btn->setActiveGraphic( + embed::getIconPixmap( "triangle_wave_active" ) ); + triangle_wave_btn->setInactiveGraphic( + embed::getIconPixmap( "triangle_wave_inactive" ) ); + toolTip::add( triangle_wave_btn, + tr( "Click here if you want a triangle-wave " + "for current oscillator." ) ); + + pixmapButton * saw_wave_btn = new pixmapButton( this, NULL ); + saw_wave_btn->move( 218, 105 + i * 50 ); + saw_wave_btn->setActiveGraphic( embed::getIconPixmap( + "saw_wave_active" ) ); + saw_wave_btn->setInactiveGraphic( embed::getIconPixmap( + "saw_wave_inactive" ) ); + toolTip::add( saw_wave_btn, + tr( "Click here if you want a saw-wave for " + "current oscillator." ) ); + + pixmapButton * sqr_wave_btn = new pixmapButton( this, NULL ); + sqr_wave_btn->move( 233, 105 + i * 50 ); + sqr_wave_btn->setActiveGraphic( embed::getIconPixmap( + "square_wave_active" ) ); + sqr_wave_btn->setInactiveGraphic( embed::getIconPixmap( + "square_wave_inactive" ) ); + toolTip::add( sqr_wave_btn, + tr( "Click here if you want a square-wave for " + "current oscillator." ) ); + + pixmapButton * moog_saw_wave_btn = + new pixmapButton( this, NULL ); + moog_saw_wave_btn->move( 188, 120+i*50 ); + moog_saw_wave_btn->setActiveGraphic( + embed::getIconPixmap( "moog_saw_wave_active" ) ); + moog_saw_wave_btn->setInactiveGraphic( + embed::getIconPixmap( "moog_saw_wave_inactive" ) ); + toolTip::add( moog_saw_wave_btn, + tr( "Click here if you want a moog-saw-wave " + "for current oscillator." ) ); + + pixmapButton * exp_wave_btn = new pixmapButton( this, NULL ); + exp_wave_btn->move( 203, 120+i*50 ); + exp_wave_btn->setActiveGraphic( embed::getIconPixmap( + "exp_wave_active" ) ); + exp_wave_btn->setInactiveGraphic( embed::getIconPixmap( + "exp_wave_inactive" ) ); + toolTip::add( exp_wave_btn, + tr( "Click here if you want an exponential " + "wave for current oscillator." ) ); + + pixmapButton * white_noise_btn = new pixmapButton( this, NULL ); + white_noise_btn->move( 218, 120+i*50 ); + white_noise_btn->setActiveGraphic( + embed::getIconPixmap( "white_noise_wave_active" ) ); + white_noise_btn->setInactiveGraphic( + embed::getIconPixmap( "white_noise_wave_inactive" ) ); + toolTip::add( white_noise_btn, + tr( "Click here if you want a white-noise for " + "current oscillator." ) ); + + pixmapButton * uwb = new pixmapButton( this, NULL ); + uwb->move( 233, 120+i*50 ); + uwb->setActiveGraphic( embed::getIconPixmap( + "usr_wave_active" ) ); + uwb->setInactiveGraphic( embed::getIconPixmap( + "usr_wave_inactive" ) ); + toolTip::add( uwb, tr( "Click here if you want a user-defined " + "wave-shape for current oscillator." ) ); + + automatableButtonGroup * wsbg = + new automatableButtonGroup( this, + tr( "Osc %1 wave shape" ).arg( i + 1 ) ); + wsbg->addButton( sin_wave_btn ); + wsbg->addButton( triangle_wave_btn ); + wsbg->addButton( saw_wave_btn ); + wsbg->addButton( sqr_wave_btn ); + wsbg->addButton( moog_saw_wave_btn ); + wsbg->addButton( exp_wave_btn ); + wsbg->addButton( white_noise_btn ); + wsbg->addButton( uwb ); + +/* connect( m_osc[i].m_usrWaveBtn, SIGNAL( doubleClicked() ), + &m_osc[i], SLOT( oscUserDefWaveDblClick() ) );*/ + + m_oscKnobs[i] = oscillatorKnobs( vk, pk, ck, flk, frk, pok, + spdk, uwb, wsbg ); + } } -void oscillatorObject::modCh( int _n ) +tripleOscillatorView::~tripleOscillatorView() { - m_modulationAlgo = static_cast( _n ); } -void oscillatorObject::updateVolume( void ) +void tripleOscillatorView::modelChanged( void ) { - if( m_panKnob->value() >= 0.0f ) + tripleOscillator * t = castModel(); + m_mod1BtnGrp->setModel( &t->m_osc[0]->m_modulationAlgoModel ); + m_mod2BtnGrp->setModel( &t->m_osc[1]->m_modulationAlgoModel ); + + for( int i = 0; i < NUM_OF_OSCILLATORS; ++i ) { - float panningFactorLeft = 1.0f - m_panKnob->value() - / (float)PANNING_RIGHT; - m_volumeLeft = panningFactorLeft * m_volKnob->value() / 100.0f; - m_volumeRight = m_volKnob->value() / 100.0f; + m_oscKnobs[i].m_volKnob->setModel( + &t->m_osc[i]->m_volumeModel ); + m_oscKnobs[i].m_panKnob->setModel( + &t->m_osc[i]->m_panModel ); + m_oscKnobs[i].m_coarseKnob->setModel( + &t->m_osc[i]->m_coarseModel ); + m_oscKnobs[i].m_fineLeftKnob->setModel( + &t->m_osc[i]->m_fineLeftModel ); + m_oscKnobs[i].m_fineRightKnob->setModel( + &t->m_osc[i]->m_fineRightModel ); + m_oscKnobs[i].m_phaseOffsetKnob->setModel( + &t->m_osc[i]->m_phaseOffsetModel ); + m_oscKnobs[i].m_stereoPhaseDetuningKnob->setModel( + &t->m_osc[i]->m_stereoPhaseDetuningModel ); + m_oscKnobs[i].m_waveShapeBtnGrp->setModel( + &t->m_osc[i]->m_waveShapeModel ); + connect( m_oscKnobs[i].m_userWaveButton, + SIGNAL( doubleClicked() ), + t->m_osc[i], SLOT( oscUserDefWaveDblClick() ) ); } - else - { - m_volumeLeft = m_volKnob->value() / 100.0f; - float panningFactorRight = 1.0f + m_panKnob->value() - / (float)PANNING_RIGHT; - m_volumeRight = panningFactorRight * m_volKnob->value() - / 100.0f; - } -} - - - - -void oscillatorObject::updateDetuningLeft( void ) -{ - m_detuningLeft = powf( 2.0f, ( (float)m_coarseKnob->value() * 100.0f - + (float)m_fineLKnob->value() ) / 1200.0f ) - / engine::getMixer()->sampleRate(); -} - - - - -void oscillatorObject::updateDetuningRight( void ) -{ - m_detuningRight = powf( 2.0f, ( (float)m_coarseKnob->value() * 100.0f - + (float)m_fineRKnob->value() ) / 1200.0f ) - / engine::getMixer()->sampleRate(); -} - - - - -void oscillatorObject::updatePhaseOffsetLeft( void ) -{ - m_phaseOffsetLeft = ( m_phaseOffsetKnob->value() + - m_stereoPhaseDetuningKnob->value() ) / 360.0f; -} - - - - -void oscillatorObject::updatePhaseOffsetRight( void ) -{ - m_phaseOffsetRight = m_phaseOffsetKnob->value() / 360.0f; } @@ -792,7 +824,7 @@ extern "C" { // neccessary for getting instance out of shared lib -plugin * lmms_plugin_main( void * _data ) +plugin * lmms_plugin_main( model *, void * _data ) { return( new tripleOscillator( static_cast( _data ) ) ); @@ -801,8 +833,5 @@ plugin * lmms_plugin_main( void * _data ) } -#undef setChecked - - #include "triple_oscillator.moc" diff --git a/plugins/triple_oscillator/triple_oscillator.h b/plugins/triple_oscillator/triple_oscillator.h index 56650386d..9ee038a90 100644 --- a/plugins/triple_oscillator/triple_oscillator.h +++ b/plugins/triple_oscillator/triple_oscillator.h @@ -2,7 +2,7 @@ * triple_oscillator.h - declaration of class tripleOscillator a powerful * instrument-plugin with 3 oscillators * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -28,7 +28,9 @@ #include "instrument.h" +#include "instrument_view.h" #include "oscillator.h" +#include "automatable_model.h" class automatableButtonGroup; @@ -41,25 +43,29 @@ class volumeKnob; const int NUM_OF_OSCILLATORS = 3; -class oscillatorObject : public QObject +class oscillatorObject : public model { Q_OBJECT +public: + oscillatorObject( model * _parent, track * _track ); + virtual ~oscillatorObject(); + + private: - oscillator::waveShapes m_waveShape; - volumeKnob * m_volKnob; - knob * m_panKnob; - knob * m_coarseKnob; - knob * m_fineLKnob; - knob * m_fineRKnob; - knob * m_phaseOffsetKnob; - knob * m_stereoPhaseDetuningKnob; - automatableButtonGroup * m_waveBtnGrp; - pixmapButton * m_usrWaveBtn; + floatModel m_volumeModel; + floatModel m_panModel; + floatModel m_coarseModel; + floatModel m_fineLeftModel; + floatModel m_fineRightModel; + floatModel m_phaseOffsetModel; + floatModel m_stereoPhaseDetuningModel; + intModel m_waveShapeModel; + intModel m_modulationAlgoModel; sampleBuffer * m_sampleBuffer; - oscillator::modulationAlgos m_modulationAlgo; float m_volumeLeft; float m_volumeRight; + // normalized detuning -> x/sampleRate float m_detuningLeft; float m_detuningRight; @@ -67,18 +73,13 @@ private: float m_phaseOffsetLeft; float m_phaseOffsetRight; - oscillatorObject( void ); - virtual ~oscillatorObject(); - friend class tripleOscillator; + friend class tripleOscillatorView; private slots: - void oscWaveCh( int _n ); void oscUserDefWaveDblClick( void ); - void modCh( int _n ); - void updateVolume( void ); void updateDetuningLeft( void ); void updateDetuningRight( void ); @@ -94,7 +95,7 @@ class tripleOscillator : public instrument { Q_OBJECT public: - tripleOscillator( instrumentTrack * _channel ); + tripleOscillator( instrumentTrack * _track ); virtual ~tripleOscillator(); virtual void FASTCALL playNote( notePlayHandle * _n, @@ -116,6 +117,8 @@ public: return( 128 ); } + virtual pluginView * instantiateView( QWidget * _parent ); + protected slots: void updateAllDetuning( void ); @@ -124,7 +127,7 @@ protected slots: private: instrumentTrack * m_instrumentTrack; - oscillatorObject m_osc[NUM_OF_OSCILLATORS]; + oscillatorObject * m_osc[NUM_OF_OSCILLATORS]; struct oscPtr { @@ -132,10 +135,66 @@ private: oscillator * oscRight; } ; - automatableButtonGroup * m_mod1BtnGrp; - automatableButtonGroup * m_mod2BtnGrp; + + friend class tripleOscillatorView; } ; + +class tripleOscillatorView : public instrumentView +{ +public: + tripleOscillatorView( instrument * _instrument, QWidget * _parent ); + virtual ~tripleOscillatorView(); + + +private: + virtual void modelChanged( void ); + + automatableButtonGroup * m_mod1BtnGrp; + automatableButtonGroup * m_mod2BtnGrp; + + struct oscillatorKnobs + { + oscillatorKnobs( volumeKnob * v, + knob * p, + knob * c, + knob * fl, + knob * fr, + knob * po, + knob * spd, + pixmapButton * uwb, + automatableButtonGroup * wsbg ) : + m_volKnob( v ), + m_panKnob( p ), + m_coarseKnob( c ), + m_fineLeftKnob( fl ), + m_fineRightKnob( fr ), + m_phaseOffsetKnob( po ), + m_stereoPhaseDetuningKnob( spd ), + m_userWaveButton( uwb ), + m_waveShapeBtnGrp( wsbg ) + { + } + oscillatorKnobs() + { + } + volumeKnob * m_volKnob; + knob * m_panKnob; + knob * m_coarseKnob; + knob * m_fineLeftKnob; + knob * m_fineRightKnob; + knob * m_phaseOffsetKnob; + knob * m_stereoPhaseDetuningKnob; + pixmapButton * m_userWaveButton; + automatableButtonGroup * m_waveShapeBtnGrp; + + } ; + + oscillatorKnobs m_oscKnobs[NUM_OF_OSCILLATORS]; +} ; + + + #endif From 3817dc7a7853ad50cbcc17fd9276d4d53289e9f0 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 26 Jan 2008 08:51:56 +0000 Subject: [PATCH 38/87] fixed upper boundaries for wave-shape- and modulation-algo-models git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@677 0778d3d1-df1d-0410-868b-ea421aaaa00d --- plugins/triple_oscillator/triple_oscillator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/triple_oscillator/triple_oscillator.cpp b/plugins/triple_oscillator/triple_oscillator.cpp index d45ca41b9..c5e408c96 100644 --- a/plugins/triple_oscillator/triple_oscillator.cpp +++ b/plugins/triple_oscillator/triple_oscillator.cpp @@ -78,10 +78,10 @@ oscillatorObject::oscillatorObject( model * _parent, track * _track ) : m_fineRightModel( 0.0f, -100.0f, 100.0f, 1.0f, this ), m_phaseOffsetModel( 0.0f, 0.0f, 360.0f, 1.0f, this ), m_stereoPhaseDetuningModel( 0.0f, 0.0f, 360.0f, 1.0f, this ), - m_waveShapeModel( oscillator::SineWave, 0, oscillator::NumWaveShapes, + m_waveShapeModel( oscillator::SineWave, 0, oscillator::NumWaveShapes-1, 1, this ), m_modulationAlgoModel( oscillator::SignalMix, 0, - oscillator::NumModulationAlgos, 1, this ), + oscillator::NumModulationAlgos-1, 1, this ), m_sampleBuffer( new sampleBuffer ), m_volumeLeft( 0.0f ), m_volumeRight( 0.0f ), From 69893707b09e387a7ec93146e483e156f7b90691 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 26 Jan 2008 08:52:19 +0000 Subject: [PATCH 39/87] call updateButtons() after model-change, use model()->value() rather than value() git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@678 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 9 +++++++++ src/widgets/automatable_button.cpp | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 3ed5117b8..c27046fea 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-01-26 Tobias Doerffel + + * src/widgets/automatable_button.cpp: + - call updateButtons() after model-change + - use model()->value() rather than value() + + * plugins/triple_oscillator/triple_oscillator.cpp: + fixed upper boundaries for wave-shape- and modulation-algo-models + 2008-01-26 Tobias Doerffel * plugins/triple_oscillator/triple_oscillator.h: diff --git a/src/widgets/automatable_button.cpp b/src/widgets/automatable_button.cpp index 73f824e0b..d7846e43a 100644 --- a/src/widgets/automatable_button.cpp +++ b/src/widgets/automatable_button.cpp @@ -234,6 +234,7 @@ void automatableButtonGroup::modelChanged( void ) connect( model(), SIGNAL( dataChanged() ), this, SLOT( updateButtons() ) ); autoModelView::modelChanged(); + updateButtons(); } @@ -244,7 +245,7 @@ void automatableButtonGroup::updateButtons( void ) int i = 0; foreach( automatableButton * btn, m_buttons ) { - btn->model()->setValue( i == value() ); + btn->model()->setValue( i == model()->value() ); ++i; } } From d242ed725ff756575c4c07a8bfe2d661519a88e7 Mon Sep 17 00:00:00 2001 From: Paul Giblock Date: Tue, 29 Jan 2008 03:36:34 +0000 Subject: [PATCH 40/87] Finished LB302 MV split git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@679 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 9 + include/automatable_model.h | 1 - plugins/lb302/lb302.cpp | 972 ++++++++++++++++++------------------ plugins/lb302/lb302.h | 298 +++++------ 4 files changed, 655 insertions(+), 625 deletions(-) diff --git a/ChangeLog b/ChangeLog index c27046fea..ebfee74d2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-01-28 Paul Giblock + * plugins/lb302/lb302.cpp: + * plugins/lb302/lb302.h: + finished LB302 M/V-split. however, more changes can be made to meet + the coding guidelines. Let's save this job for LB303 + + * include/automatable_model.h: + cleaned up code for boolModel + 2008-01-26 Tobias Doerffel * src/widgets/automatable_button.cpp: diff --git a/include/automatable_model.h b/include/automatable_model.h index c77551f0f..d610fc669 100644 --- a/include/automatable_model.h +++ b/include/automatable_model.h @@ -286,7 +286,6 @@ public: // some model-primitives -//generateModelPrimitive(bool,signed char); generateModelPrimitive(float,float); generateModelPrimitive(int,int); diff --git a/plugins/lb302/lb302.cpp b/plugins/lb302/lb302.cpp index 443d3a0c4..99cfc45c1 100644 --- a/plugins/lb302/lb302.cpp +++ b/plugins/lb302/lb302.cpp @@ -83,7 +83,7 @@ plugin::descriptor lb302_plugin_descriptor = STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), "LB302", QT_TRANSLATE_NOOP( "pluginBrowser", - "Incomplete monophonic immitation tb303" ), + "Incomplete monophonic immitation tb303" ), "Paul Giblock ", 0x0100, plugin::Instrument, @@ -97,47 +97,51 @@ plugin::descriptor lb302_plugin_descriptor = // lb302Filter // -lb302Filter::lb302Filter(lb302FilterKnobState* p_fs) : - fs(p_fs), +lb302Filter::lb302Filter(lb302FilterKnobState* p_fs) : + fs(p_fs), vcf_c0(0), - vcf_e0(0), - vcf_e1(0) + vcf_e0(0), + vcf_e1(0) { }; + void lb302Filter::recalc() { - vcf_e1 = exp(6.109 + 1.5876*(fs->envmod) + 2.1553*(fs->cutoff) - 1.2*(1.0-(fs->reso))); - vcf_e0 = exp(5.613 - 0.8*(fs->envmod) + 2.1553*(fs->cutoff) - 0.7696*(1.0-(fs->reso))); - vcf_e0*=M_PI/44100.0; - vcf_e1*=M_PI/44100.0; - vcf_e1 -= vcf_e0; + vcf_e1 = exp(6.109 + 1.5876*(fs->envmod) + 2.1553*(fs->cutoff) - 1.2*(1.0-(fs->reso))); + vcf_e0 = exp(5.613 - 0.8*(fs->envmod) + 2.1553*(fs->cutoff) - 0.7696*(1.0-(fs->reso))); + vcf_e0*=M_PI/44100.0; + vcf_e1*=M_PI/44100.0; + vcf_e1 -= vcf_e0; - vcf_rescoeff = exp(-1.20 + 3.455*(fs->reso)); + vcf_rescoeff = exp(-1.20 + 3.455*(fs->reso)); }; + void lb302Filter::envRecalc() { - vcf_c0 *= fs->envdecay; // Filter Decay. vcf_decay is adjusted for Hz and ENVINC - // vcf_rescoeff = exp(-1.20 + 3.455*(fs->reso)); moved above + vcf_c0 *= fs->envdecay; // Filter Decay. vcf_decay is adjusted for Hz and ENVINC + // vcf_rescoeff = exp(-1.20 + 3.455*(fs->reso)); moved above }; + void lb302Filter::playNote() { - vcf_c0 = vcf_e1; + vcf_c0 = vcf_e1; } + // // lb302FilterIIR2 // lb302FilterIIR2::lb302FilterIIR2(lb302FilterKnobState* p_fs) : - lb302Filter(p_fs), - vcf_d1(0), - vcf_d2(0), - vcf_a(0), - vcf_b(0), - vcf_c(1) + lb302Filter(p_fs), + vcf_d1(0), + vcf_d2(0), + vcf_a(0), + vcf_b(0), + vcf_c(1) { m_dist = new effectLib::distortion<>( 1.0, 1.0f); @@ -145,164 +149,172 @@ lb302FilterIIR2::lb302FilterIIR2(lb302FilterKnobState* p_fs) : }; - - lb302FilterIIR2::~lb302FilterIIR2() { delete m_dist; } - - void lb302FilterIIR2::recalc() { - lb302Filter::recalc(); + lb302Filter::recalc(); //m_dist->setThreshold(0.5+(fs->dist*2.0)); m_dist->setThreshold(fs->dist*75.0); }; + void lb302FilterIIR2::envRecalc() { - float k, w; - - lb302Filter::envRecalc(); + float k, w; - w = vcf_e0 + vcf_c0; // e0 is adjusted for Hz and doesn't need ENVINC - k = exp(-w/vcf_rescoeff); - // Does this mean c0 is inheritantly? - vcf_a = 2.0*cos(2.0*w) * k; - vcf_b = -k*k; - vcf_c = 1.0 - vcf_a - vcf_b; + lb302Filter::envRecalc(); + + w = vcf_e0 + vcf_c0; // e0 is adjusted for Hz and doesn't need ENVINC + k = exp(-w/vcf_rescoeff); // Does this mean c0 is inheritantly? + + vcf_a = 2.0*cos(2.0*w) * k; + vcf_b = -k*k; + vcf_c = 1.0 - vcf_a - vcf_b; } float lb302FilterIIR2::process(const float& samp) { - float ret = vcf_a*vcf_d1 + vcf_b*vcf_d2 + vcf_c*samp; - // Delayed samples for filter - vcf_d2 = vcf_d1; - vcf_d1 = ret; + float ret = vcf_a*vcf_d1 + vcf_b*vcf_d2 + vcf_c*samp; + // Delayed samples for filter + vcf_d2 = vcf_d1; + vcf_d1 = ret; if(fs->dist > 0) ret=m_dist->nextSample(ret); - // output = IIR2 + dry - return ret; + + // output = IIR2 + dry + return ret; } + void lb302FilterIIR2::getState(lb302FilterState* fs) { - fs->iir.vcf_c0 = vcf_c0; - fs->iir.vcf_a = vcf_a; - fs->iir.vcf_b = vcf_b; - fs->iir.vcf_c = vcf_c; - fs->iir.vcf_d1 = vcf_d1; - fs->iir.vcf_d2 = vcf_d2; + fs->iir.vcf_c0 = vcf_c0; + fs->iir.vcf_a = vcf_a; + fs->iir.vcf_b = vcf_b; + fs->iir.vcf_c = vcf_c; + fs->iir.vcf_d1 = vcf_d1; + fs->iir.vcf_d2 = vcf_d2; } + void lb302FilterIIR2::setState(const lb302FilterState* fs) { - vcf_c0 = fs->iir.vcf_c0; - vcf_a = fs->iir.vcf_a; - vcf_b = fs->iir.vcf_b; - vcf_c = fs->iir.vcf_c; - vcf_d1 = fs->iir.vcf_d1; - vcf_d2 = fs->iir.vcf_d2; + vcf_c0 = fs->iir.vcf_c0; + vcf_a = fs->iir.vcf_a; + vcf_b = fs->iir.vcf_b; + vcf_c = fs->iir.vcf_c; + vcf_d1 = fs->iir.vcf_d1; + vcf_d2 = fs->iir.vcf_d2; } + + // // lb302Filter3Pole // lb302Filter3Pole::lb302Filter3Pole(lb302FilterKnobState *p_fs) : - lb302Filter(p_fs), - ay1(0), - ay2(0), - aout(0), - lastin(0) + lb302Filter(p_fs), + ay1(0), + ay2(0), + aout(0), + lastin(0) { }; + void lb302Filter3Pole::recalc() { - // DO NOT CALL BASE CLASS - vcf_e0 = 0.000001; - vcf_e1 = 1.0; + // DO NOT CALL BASE CLASS + vcf_e0 = 0.000001; + vcf_e1 = 1.0; } + // TODO: Try using k instead of vcf_reso void lb302Filter3Pole::envRecalc() { - float w,k; - float kfco; - - lb302Filter::envRecalc(); - - - w = vcf_e0 + vcf_c0; // e0 is adjusted for Hz and doesn't need ENVINC - k = (fs->cutoff > 0.975)?0.975:fs->cutoff; - kfco = 50.f+(k)*((2300.f-1600.f*(fs->envmod))+(w)*(700.f+1500.f*(k)+(1500.f+(k)*(44100.f/2.f-6000.f))*(fs->envmod))); - //+iacc*(.3+.7*kfco*kenvmod)*kaccent*kaccurve*2000 + float w,k; + float kfco; + lb302Filter::envRecalc(); + // e0 is adjusted for Hz and doesn't need ENVINC + w = vcf_e0 + vcf_c0; + k = (fs->cutoff > 0.975)?0.975:fs->cutoff; + kfco = 50.f + (k)*((2300.f-1600.f*(fs->envmod))+(w) * + (700.f+1500.f*(k)+(1500.f+(k)*(44100.f/2.f-6000.f)) * + (fs->envmod)) ); + //+iacc*(.3+.7*kfco*kenvmod)*kaccent*kaccurve*2000 #ifdef LB_24_IGNORE_ENVELOPE - // kfcn = fs->cutoff; - kfcn = 2.0 * kfco / LB_HZ; + // kfcn = fs->cutoff; + kfcn = 2.0 * kfco / LB_HZ; #else - kfcn = w; + kfcn = w; #endif - kp = ((-2.7528*kfcn + 3.0429)*kfcn + 1.718)*kfcn - 0.9984; - kp1 = kp+1.0; - kp1h = 0.5*kp1; + kp = ((-2.7528*kfcn + 3.0429)*kfcn + 1.718)*kfcn - 0.9984; + kp1 = kp+1.0; + kp1h = 0.5*kp1; #ifdef LB_24_RES_TRICK - k = exp(-w/vcf_rescoeff); - kres = (((k))) * (((-2.7079*kp1 + 10.963)*kp1 - 14.934)*kp1 + 8.4974); + k = exp(-w/vcf_rescoeff); + kres = (((k))) * (((-2.7079*kp1 + 10.963)*kp1 - 14.934)*kp1 + 8.4974); #else - kres = (((fs->reso))) * (((-2.7079*kp1 + 10.963)*kp1 - 14.934)*kp1 + 8.4974); + kres = (((fs->reso))) * (((-2.7079*kp1 + 10.963)*kp1 - 14.934)*kp1 + 8.4974); #endif - value = 1.0+( (fs->dist) *(1.5 + 2.0*kres*(1.0-kfcn))); // ENVMOD was DIST*/ + value = 1.0+( (fs->dist) *(1.5 + 2.0*kres*(1.0-kfcn))); // ENVMOD was DIST } + float lb302Filter3Pole::process(const float& samp) { - float ax1 = lastin; - float ay11 = ay1; - float ay31 = ay2; - lastin = (samp) - tanh(kres*aout); - ay1 = kp1h * (lastin+ax1) - kp*ay1; - ay2 = kp1h * (ay1 + ay11) - kp*ay2; - aout = kp1h * (ay2 + ay31) - kp*aout; - - return tanh(aout*value)*LB_24_VOL_ADJUST/(1.0+fs->dist); + float ax1 = lastin; + float ay11 = ay1; + float ay31 = ay2; + lastin = (samp) - tanh(kres*aout); + ay1 = kp1h * (lastin+ax1) - kp*ay1; + ay2 = kp1h * (ay1 + ay11) - kp*ay2; + aout = kp1h * (ay2 + ay31) - kp*aout; + + return tanh(aout*value)*LB_24_VOL_ADJUST/(1.0+fs->dist); } + void lb302Filter3Pole::getState(lb302FilterState* fs) { - fs->pole.aout = aout; - fs->pole.vcf_c0 = vcf_c0; - fs->pole.kp = kp; - fs->pole.kp1h = kp1h; - fs->pole.kres = kres; - fs->pole.ay1 = ay1; - fs->pole.ay2 = ay2; - fs->pole.lastin = lastin; - fs->pole.value = value; + fs->pole.aout = aout; + fs->pole.vcf_c0 = vcf_c0; + fs->pole.kp = kp; + fs->pole.kp1h = kp1h; + fs->pole.kres = kres; + fs->pole.ay1 = ay1; + fs->pole.ay2 = ay2; + fs->pole.lastin = lastin; + fs->pole.value = value; } + void lb302Filter3Pole::setState(const lb302FilterState* fs) { - aout = fs->pole.aout; - vcf_c0 = fs->pole.vcf_c0; - kp = fs->pole.kp; - kp1h = fs->pole.kp1h; - kres = fs->pole.kres; - ay1 = fs->pole.ay1; - ay2 = fs->pole.ay2; - lastin = fs->pole.lastin; - value = fs->pole.value; + aout = fs->pole.aout; + vcf_c0 = fs->pole.vcf_c0; + kp = fs->pole.kp; + kp1h = fs->pole.kp1h; + kres = fs->pole.kres; + ay1 = fs->pole.ay1; + ay2 = fs->pole.ay2; + lastin = fs->pole.lastin; + value = fs->pole.value; } + // // LBSynth // @@ -323,131 +335,127 @@ lb302Synth::lb302Synth( instrumentTrack * _instrumentTrack ) : db24Toggle( FALSE, this ) { -printf("Set track: %Lx\n", (unsigned long long)_instrumentTrack); -/* - connect( &vcf_cut_knob, SIGNAL( valueChanged( float ) ), - this, SLOT ( filterChanged( float ) ) ); + connect( &vcf_cut_knob, SIGNAL( dataChanged( ) ), + this, SLOT ( filterChanged( ) ) ); - connect( &vcf_res_knob, SIGNAL( valueChanged( float ) ), - this, SLOT ( filterChanged( float ) ) ); + connect( &vcf_res_knob, SIGNAL( dataChanged( ) ), + this, SLOT ( filterChanged( ) ) ); - connect( &vcf_mod_knob, SIGNAL( valueChanged( float ) ), - this, SLOT ( filterChanged( float ) ) ); + connect( &vcf_mod_knob, SIGNAL( dataChanged( ) ), + this, SLOT ( filterChanged( ) ) ); - connect( &vcf_dec_knob, SIGNAL( valueChanged( float ) ), - this, SLOT ( filterChanged( float ) ) ); + connect( &vcf_dec_knob, SIGNAL( dataChanged( ) ), + this, SLOT ( filterChanged( ) ) ); - connect( &vco_fine_detune_knob, SIGNAL( valueChanged( float ) ), - this, SLOT ( detuneChanged( float) ) ); + connect( &vco_fine_detune_knob, SIGNAL( dataChanged( ) ), + this, SLOT ( filterChanged( ) ) ); - connect( &db24Toggle, SIGNAL( toggled( bool ) ), - this, SLOT ( db24Toggled( bool) ) ); + connect( &db24Toggle, SIGNAL( dataChanged( ) ), + this, SLOT ( db24Toggled( ) ) ); - connect( &dist_knob, SIGNAL( valueChanged(float) ), - this, SLOT ( filterChanged( float ))); + connect( &dist_knob, SIGNAL( dataChanged( ) ), + this, SLOT ( filterChanged( ))); - connect( &wave_knob, SIGNAL( valueChanged(float) ), - this, SLOT ( waveChanged( float ))); -*/ + connect( &wave_knob, SIGNAL( dataChanged( ) ), + this, SLOT ( waveChanged( ))); - vcf_cut_knob.setTrack( _instrumentTrack ); - vcf_res_knob.setTrack( _instrumentTrack ); - vcf_mod_knob.setTrack( _instrumentTrack ); - vcf_dec_knob.setTrack( _instrumentTrack ); + vcf_cut_knob.setTrack( _instrumentTrack ); + vcf_res_knob.setTrack( _instrumentTrack ); + vcf_mod_knob.setTrack( _instrumentTrack ); + vcf_dec_knob.setTrack( _instrumentTrack ); - vco_fine_detune_knob.setTrack( _instrumentTrack ); + vco_fine_detune_knob.setTrack( _instrumentTrack ); - dist_knob.setTrack( _instrumentTrack ); - wave_knob.setTrack( _instrumentTrack ); - slide_dec_knob.setTrack( _instrumentTrack ); - - slideToggle.setTrack( _instrumentTrack ); - accentToggle.setTrack( _instrumentTrack ); - deadToggle.setTrack( _instrumentTrack ); - db24Toggle.setTrack( _instrumentTrack ); + dist_knob.setTrack( _instrumentTrack ); + wave_knob.setTrack( _instrumentTrack ); + slide_dec_knob.setTrack( _instrumentTrack ); + + slideToggle.setTrack( _instrumentTrack ); + accentToggle.setTrack( _instrumentTrack ); + deadToggle.setTrack( _instrumentTrack ); + db24Toggle.setTrack( _instrumentTrack ); - // SYNTH + // SYNTH - vco_inc = 0.0; + vco_inc = 0.0; vco_c = 0; vco_k = 0; - - vco_slide = 0; vco_slideinc = 0; - vco_slidebase = 0; - fs.cutoff = 0; fs.envmod = 0; - fs.reso = 0; fs.envdecay = 0; - fs.dist = 0; + vco_slide = 0; vco_slideinc = 0; + vco_slidebase = 0; + + fs.cutoff = 0; + fs.envmod = 0; + fs.reso = 0; + fs.envdecay = 0; + fs.dist = 0; vcf_envpos = ENVINC; - vco_detune = 0; + vco_detune = 0; - vca_mode = 3; vca_a = 0; // Start VCA on an attack. + // Start VCA on an attack. + vca_mode = 3; + vca_a = 0; - //vca_attack = 1.0 - 0.94406088; - vca_attack = 1.0 - 0.96406088; - vca_decay = 0.99897516; - - vco_shape = SAWTOOTH; + //vca_attack = 1.0 - 0.94406088; + vca_attack = 1.0 - 0.96406088; + vca_decay = 0.99897516; - vca_a0 = 0.5; // Experimenting between original (0.5) and 1.0 - vca_a = 9; - vca_mode = 3; + vco_shape = SAWTOOTH; - vcf = new lb302FilterIIR2(&fs); + // Experimenting with a0 between original (0.5) and 1.0 + vca_a0 = 0.5; + vca_a = 9; + vca_mode = 3; - use_hold_note = false; - sample_cnt = 0; - release_frame = 1<<24; - catch_frame = 0; - catch_decay = 0; + vcf = new lb302FilterIIR2(&fs); - recalcFilter(); + use_hold_note = false; + sample_cnt = 0; + release_frame = 1<<24; + catch_frame = 0; + catch_decay = 0; - lastFramesPlayed = 1; // because we subtract 1 later - last_offset = 0; + recalcFilter(); - period_states = NULL; - period_states_cnt = 0; + lastFramesPlayed = 1; // because we subtract 1 later + last_offset = 0; - filterChanged(0.0); - detuneChanged(0.0); + period_states = NULL; + period_states_cnt = 0; + + filterChanged(); + detuneChanged(); } - - lb302Synth::~lb302Synth() { - delete vcf; + delete vcf; } - - void lb302Synth::saveSettings( QDomDocument & _doc, - QDomElement & _this ) + QDomElement & _this ) { vcf_cut_knob.saveSettings( _doc, _this, "vcf_cut" ); vcf_res_knob.saveSettings( _doc, _this, "vcf_res" ); vcf_mod_knob.saveSettings( _doc, _this, "vcf_mod" ); vcf_dec_knob.saveSettings( _doc, _this, "vcf_dec" ); - vco_fine_detune_knob.saveSettings( _doc, _this, "vco_detune" ); - wave_knob.saveSettings( _doc, _this, "shape"); - dist_knob.saveSettings( _doc, _this, "dist"); - slide_dec_knob.saveSettings( _doc, _this, "slide_dec"); + vco_fine_detune_knob.saveSettings( _doc, _this, "vco_detune" ); + wave_knob.saveSettings( _doc, _this, "shape"); + dist_knob.saveSettings( _doc, _this, "dist"); + slide_dec_knob.saveSettings( _doc, _this, "slide_dec"); - slideToggle.saveSettings( _doc, _this, "slide"); - deadToggle.saveSettings( _doc, _this, "dead"); - db24Toggle.saveSettings( _doc, _this, "db24"); + slideToggle.saveSettings( _doc, _this, "slide"); + deadToggle.saveSettings( _doc, _this, "dead"); + db24Toggle.saveSettings( _doc, _this, "db24"); } - - void lb302Synth::loadSettings( const QDomElement & _this ) { vcf_cut_knob.loadSettings( _this, "vcf_cut" ); @@ -455,73 +463,77 @@ void lb302Synth::loadSettings( const QDomElement & _this ) vcf_mod_knob.loadSettings( _this, "vcf_mod" ); vcf_dec_knob.loadSettings( _this, "vcf_dec" ); - vco_fine_detune_knob.loadSettings( _this, "vco_detune" ); - dist_knob.loadSettings( _this, "dist"); - wave_knob.loadSettings( _this, "shape"); - slide_dec_knob.loadSettings( _this, "slide_dec"); + vco_fine_detune_knob.loadSettings( _this, "vco_detune" ); + dist_knob.loadSettings( _this, "dist"); + wave_knob.loadSettings( _this, "shape"); + slide_dec_knob.loadSettings( _this, "slide_dec"); - slideToggle.loadSettings( _this, "slide"); - deadToggle.loadSettings( _this, "dead"); - db24Toggle.loadSettings( _this, "db24"); + slideToggle.loadSettings( _this, "slide"); + deadToggle.loadSettings( _this, "dead"); + db24Toggle.loadSettings( _this, "db24"); - filterChanged(0.0); - detuneChanged(0.0); + filterChanged(); + detuneChanged(); } // TODO: Split into one function per knob. envdecay doesn't require // recalcFilter. -void lb302Synth::filterChanged( float ) +void lb302Synth::filterChanged( void ) { - fs.cutoff = vcf_cut_knob.value(); - fs.reso = vcf_res_knob.value(); - fs.envmod = vcf_mod_knob.value(); - fs.dist = LB_DIST_RATIO*dist_knob.value(); + fs.cutoff = vcf_cut_knob.value(); + fs.reso = vcf_res_knob.value(); + fs.envmod = vcf_mod_knob.value(); + fs.dist = LB_DIST_RATIO*dist_knob.value(); - float d = 0.2 + (2.3*vcf_dec_knob.value()); - d*=LB_HZ; // d *= smpl rate - fs.envdecay = pow(0.1, 1.0/d * ENVINC); // decay is 0.1 to the 1/d * ENVINC - // vcf_envdecay is now adjusted for both - // sampling rate and ENVINC - recalcFilter(); -} + float d = 0.2 + (2.3*vcf_dec_knob.value()); -void lb302Synth::db24Toggled( bool ) -{ - delete vcf; - if(db24Toggle.value()) { - vcf = new lb302Filter3Pole(&fs); - } - else { - vcf = new lb302FilterIIR2(&fs); - } - recalcFilter(); + d *= LB_HZ; // d *= smpl rate + fs.envdecay = pow(0.1, 1.0/d * ENVINC); // decay is 0.1 to the 1/d * ENVINC + // vcf_envdecay is now adjusted for both + // sampling rate and ENVINC + recalcFilter(); } -void lb302Synth::detuneChanged( float ) +void lb302Synth::db24Toggled( void ) { - float freq = vco_inc*LB_HZ/vco_detune; - float slidebase_freq=0; - - if(vco_slide) { - slidebase_freq = vco_slidebase*LB_HZ/vco_detune; - } - - vco_detune = powf(2.0f, (float)vco_fine_detune_knob.value()/1200.0f); - vco_inc = freq*vco_detune/LB_HZ; - - // If a slide note is pending, - if(vco_slideinc) - vco_slideinc = vco_inc; - - // If currently sliding, - // May need to rescale vco_slide as well - if(vco_slide) - vco_slidebase=slidebase_freq*vco_detune/LB_HZ; + delete vcf; + if(db24Toggle.value()) { + vcf = new lb302Filter3Pole(&fs); + } + else { + vcf = new lb302FilterIIR2(&fs); + } + recalcFilter(); } + +void lb302Synth::detuneChanged( void ) +{ + float freq = vco_inc*LB_HZ/vco_detune; + float slidebase_freq=0; + + if(vco_slide) { + slidebase_freq = vco_slidebase*LB_HZ/vco_detune; + } + + vco_detune = powf(2.0f, (float)vco_fine_detune_knob.value()/1200.0f); + vco_inc = freq*vco_detune/LB_HZ; + + // If a slide note is pending, + if(vco_slideinc) + vco_slideinc = vco_inc; + + // If currently sliding, + // May need to rescale vco_slide as well + if(vco_slide) + vco_slidebase = slidebase_freq*vco_detune/LB_HZ; +} + + // TODO: Set vco_shape in here. -void lb302Synth::waveChanged( float ) +// setHintText is impossible from the synth now?? +void lb302Synth::waveChanged( void ) { /* switch(int(rint(wave_knob.value()))) { @@ -535,231 +547,241 @@ void lb302Synth::waveChanged( float ) */ } + QString lb302Synth::nodeName( void ) const { return( lb302_plugin_descriptor.name ); } + // OBSOLETE. Break apart once we get Q_OBJECT to work. >:[ void lb302Synth::recalcFilter() { - vcf->recalc(); + vcf->recalc(); - // THIS IS OLD 3pole/24dB code, I may reintegrate it. Don't need it - // right now. Should be toggled by LB_24_RES_TRICK at the moment. + // THIS IS OLD 3pole/24dB code, I may reintegrate it. Don't need it + // right now. Should be toggled by LB_24_RES_TRICK at the moment. - /*kfcn = 2.0 * (((vcf_cutoff*3000))) / LB_HZ; - kp = ((-2.7528*kfcn + 3.0429)*kfcn + 1.718)*kfcn - 0.9984; - kp1 = kp+1.0; - kp1h = 0.5*kp1; - kres = (((vcf_reso))) * (((-2.7079*kp1 + 10.963)*kp1 - 14.934)*kp1 + 8.4974); - value = 1.0+( (((0))) *(1.5 + 2.0*kres*(1.0-kfcn))); // ENVMOD was DIST*/ + /*kfcn = 2.0 * (((vcf_cutoff*3000))) / LB_HZ; + kp = ((-2.7528*kfcn + 3.0429)*kfcn + 1.718)*kfcn - 0.9984; + kp1 = kp+1.0; + kp1h = 0.5*kp1; + kres = (((vcf_reso))) * (((-2.7079*kp1 + 10.963)*kp1 - 14.934)*kp1 + 8.4974); + value = 1.0+( (((0))) *(1.5 + 2.0*kres*(1.0-kfcn))); // ENVMOD was DIST*/ - vcf_envpos = ENVINC; // Trigger filter update in process() + vcf_envpos = ENVINC; // Trigger filter update in process() } inline int MIN(int a, int b) { - return (a= ENVINC) { - vcf->envRecalc(); - - vcf_envpos = 0; + vcf->envRecalc(); - if (vco_slide) { - vco_inc=vco_slidebase-vco_slide; - // Calculate coeff from dec_knob on knob change. - vco_slide*= 0.9+(slide_dec_knob.value()*0.0999); // TODO: Adjust for Hz and ENVINC + vcf_envpos = 0; - } + if (vco_slide) { + vco_inc=vco_slidebase-vco_slide; + // Calculate coeff from dec_knob on knob change. + vco_slide*= 0.9+(slide_dec_knob.value()*0.0999); // TODO: Adjust for Hz and ENVINC + + } } - sample_cnt++; + sample_cnt++; vcf_envpos++; - // unused variables - //float old_vco_k = vco_k; - //bool looking; - int decay_frames = 128; + // unused variables + //float old_vco_k = vco_k; + //bool looking; + int decay_frames = 128; // update vco - vco_c += vco_inc; + vco_c += vco_inc; - if(vco_c > 0.5) vco_c -= 1.0; + if(vco_c > 0.5) + vco_c -= 1.0; - if (catch_decay > 0) { - if (catch_decay < decay_frames) { - catch_decay++; - } - else if (use_hold_note) { - use_hold_note = false; - initNote(&hold_note); - } - } - - - switch(int(rint(wave_knob.value()))) { - case 0: vco_shape = SAWTOOTH; break; - case 1: vco_shape = INVERTED_SAWTOOTH; break; - case 2: vco_shape = TRIANGLE; break; - case 3: vco_shape = SQUARE; break; - case 4: vco_shape = ROUND_SQUARE; break; - case 5: vco_shape = MOOG; break; - default: vco_shape = SAWTOOTH; break; - } + if (catch_decay > 0) { + if (catch_decay < decay_frames) { + catch_decay++; + } + else if (use_hold_note) { + use_hold_note = false; + initNote(&hold_note); + } + } - // add vco_shape_param the changes the shape of each curve. - // merge sawtooths with triangle and square with round square? - switch (vco_shape) { - case SAWTOOTH: // p0: curviness of line - vco_k = vco_c; // Is this sawtooth backwards? - break; + switch(int(rint(wave_knob.value()))) { + case 0: vco_shape = SAWTOOTH; break; + case 1: vco_shape = INVERTED_SAWTOOTH; break; + case 2: vco_shape = TRIANGLE; break; + case 3: vco_shape = SQUARE; break; + case 4: vco_shape = ROUND_SQUARE; break; + case 5: vco_shape = MOOG; break; + default: vco_shape = SAWTOOTH; break; + } - case INVERTED_SAWTOOTH: // p0: curviness of line - vco_k = -vco_c; // Is this sawtooth backwards? - break; + // add vco_shape_param the changes the shape of each curve. + // merge sawtooths with triangle and square with round square? + switch (vco_shape) { + case SAWTOOTH: // p0: curviness of line + vco_k = vco_c; // Is this sawtooth backwards? + break; - case TRIANGLE: // p0: duty rev.saw<->triangle<->saw p1: curviness - vco_k = (vco_c*2.0)+0.5; - if (vco_k>0.5) vco_k = 1.0-vco_k; - break; + case INVERTED_SAWTOOTH: // p0: curviness of line + vco_k = -vco_c; // Is this sawtooth backwards? + break; - case SQUARE: // p0: slope of top - vco_k = (vco_c<0)?0.5:-0.5; - break; + case TRIANGLE: // p0: duty rev.saw<->triangle<->saw p1: curviness + vco_k = (vco_c*2.0)+0.5; + if (vco_k>0.5) + vco_k = 1.0- vco_k; + break; - case ROUND_SQUARE: // p0: width of round - vco_k = (vco_c<0)?(sqrtf(1-(vco_c*vco_c*4))-0.5):-0.5; - break; + case SQUARE: // p0: slope of top + vco_k = (vco_c<0)?0.5:-0.5; + break; - case MOOG: // Maybe the fall should be exponential/sinsoidal instead of quadric. - // [-0.5, 0]: Rise, [0,0.25]: Slope down, [0.25,0.5]: Low - vco_k = (vco_c*2.0)+0.5; - if (vco_k>1.0) vco_k = -0.5 ; - else if (vco_k>0.5) { - w = 2.0*(vco_k-0.5)-1.0; - vco_k = 0.5 - sqrtf(1.0-(w*w)); - } - vco_k *= 2.0; // MOOG wave gets filtered away - break; - } + case ROUND_SQUARE: // p0: width of round + vco_k = (vco_c<0)?(sqrtf(1-(vco_c*vco_c*4))-0.5):-0.5; + break; - //vca_a = 0.5; - // Write out samples. + case MOOG: // Maybe the fall should be exponential/sinsoidal instead of quadric. + // [-0.5, 0]: Rise, [0,0.25]: Slope down, [0.25,0.5]: Low + vco_k = (vco_c*2.0)+0.5; + if (vco_k>1.0) { + vco_k = -0.5 ; + } + else if (vco_k>0.5) { + w = 2.0*(vco_k-0.5)-1.0; + vco_k = 0.5 - sqrtf(1.0-(w*w)); + } + vco_k *= 2.0; // MOOG wave gets filtered away + break; + } + + //vca_a = 0.5; + // Write out samples. #ifdef LB_FILTERED - samp = vcf->process(vco_k)*2.0*vca_a; + samp = vcf->process(vco_k)*2.0*vca_a; #else - samp = vco_k*vca_a; + samp = vco_k*vca_a; #endif - /* - float releaseFrames = desiredReleaseFrames(); - samp *= (releaseFrames - catch_decay)/releaseFrames; - */ - samp *= (float)(decay_frames - catch_decay)/(float)decay_frames; + /* + float releaseFrames = desiredReleaseFrames(); + samp *= (releaseFrames - catch_decay)/releaseFrames; + */ + samp *= (float)(decay_frames - catch_decay)/(float)decay_frames; - for(int c=0; c=release_frame) { - vca_mode=1; - } - - // Handle Envelope - // TODO: Add decay once I figure out how to extend past the end of a note. + if((int)i>=release_frame) { + vca_mode=1; + } + + // Handle Envelope + // TODO: Add decay once I figure out how to extend past the end of a note. if(vca_mode==0) { - vca_a+=(vca_a0-vca_a)*vca_attack; - if(sample_cnt>=0.5*44100) - vca_mode = 2; - } + vca_a+=(vca_a0-vca_a)*vca_attack; + if(sample_cnt>=0.5*44100) + vca_mode = 2; + } else if(vca_mode == 1) { vca_a *= vca_decay; - + // the following line actually speeds up processing - if(vca_a < (1/65536.0)) { vca_a = 0; vca_mode = 3; } + if(vca_a < (1/65536.0)) { + vca_a = 0; + vca_mode = 3; + } } - // Store state - period_states[i].vco_c = vco_c; - period_states[i].vca_a = vca_a; // Doesn't change anything (currently) - period_states[i].vca_mode = vca_mode; // Doesn't change anything (currently) - period_states[i].sample_cnt = sample_cnt; // Doesn't change anything (currently) - vcf->getState(&period_states[i].fs); + + // Store state + period_states[i].vco_c = vco_c; + period_states[i].vca_a = vca_a; // Doesn't change anything (currently) + period_states[i].vca_mode = vca_mode; // Doesn't change anything (currently) + period_states[i].sample_cnt = sample_cnt; // Doesn't change anything (currently) + vcf->getState(&period_states[i].fs); } return 1; } + /* Prepares the active LB302 note. I separated this into a function because it * needs to be called on0playNote() when a new note is started. It also needs * to be called from process() when a prior edge-to-edge note is done releasing. */ + void lb302Synth::initNote( lb302Note *n) { - catch_decay = 0; + catch_decay = 0; - vco_inc = n->vco_inc; + vco_inc = n->vco_inc; - // TODO: Try moving to the if() below - if(n->dead == 0 || (vca_mode==1 || vca_mode==3)) { - sample_cnt = 0; - vca_mode = 0; vca_a = 0; - } - else { - vca_mode = 2; - } + // TODO: Try moving to the if() below + if(n->dead == 0 || (vca_mode==1 || vca_mode==3)) { + sample_cnt = 0; + vca_mode = 0; + vca_a = 0; + } + else { + vca_mode = 2; + } - // Initiate Slide - // TODO: Break out into function, should be called again on detuneChanged - if (vco_slideinc) { - vco_slide = vco_inc-vco_slideinc; - vco_slidebase = vco_inc; - vco_slideinc = 0; - } - else { - vco_slide = 0; - } - // End break-out + // Initiate Slide + // TODO: Break out into function, should be called again on detuneChanged + if (vco_slideinc) { + vco_slide = vco_inc-vco_slideinc; + vco_slidebase = vco_inc; + vco_slideinc = 0; + } + else { + vco_slide = 0; + } + // End break-out - // Slide note, save inc for next note - if (slideToggle.value()) { - vco_slideinc = vco_inc; // May need to equal vco_slidebase+vco_slide if last note slid - } + // Slide note, save inc for next note + if (slideToggle.value()) { + vco_slideinc = vco_inc; // May need to equal vco_slidebase+vco_slide if last note slid + } - recalcFilter(); - - if(n->dead ==0){ - // Swap next two blocks?? - vcf->playNote(); - // Ensure envelope is recalculated - vcf_envpos = ENVINC; + recalcFilter(); + + if(n->dead ==0){ + // Swap next two blocks?? + vcf->playNote(); + // Ensure envelope is recalculated + vcf_envpos = ENVINC; - // Double Check - vca_mode = 0; - vca_a = 0.0; - } + // Double Check + vca_mode = 0; + vca_a = 0.0; + } } @@ -783,11 +805,11 @@ void lb302Synth::playNote( notePlayHandle * _n, bool ) // somewhere else f_cnt_t resume_pos = lastFramesPlayed-1; - bool decay_note = false; + bool decay_note = false; // find out which situation we're in constNotePlayHandleVector v = - notePlayHandle::nphsOfInstrumentTrack( getInstrumentTrack(), TRUE ); + notePlayHandle::nphsOfInstrumentTrack( getInstrumentTrack(), TRUE ); // more than one note running? if( v.count() > 1 ) { @@ -797,10 +819,10 @@ void lb302Synth::playNote( notePlayHandle * _n, bool ) // has taken over successfully (i.e. played more than the // difference of the two offsets)? if ( _n->released() && - yn->totalFramesPlayed() >= yn->offset() - on->offset() ) + yn->totalFramesPlayed() >= yn->offset() - on->offset() ) { // then we do not need to play something anymore - return; + return; } // have to fill up the frames left to the new note so limit @@ -816,7 +838,7 @@ void lb302Synth::playNote( notePlayHandle * _n, bool ) // new note while other notes are running? if( v.count() > 1 && yn == _n && - _n->totalFramesPlayed() == 0 ) + _n->totalFramesPlayed() == 0 ) { // if there had been a previous note whose // offset > _n->offset() it played more frames than @@ -824,9 +846,10 @@ void lb302Synth::playNote( notePlayHandle * _n, bool ) // the offset of the youngest note, otherwise we get // frames with both waves overlapped engine::getMixer()->clearAudioBuffer( - _n->getInstrumentTrack()->getAudioPort()-> - firstBuffer(), - framesPerPeriod - yn->offset(), yn->offset() ); + _n->getInstrumentTrack()->getAudioPort()->firstBuffer(), + framesPerPeriod - yn->offset(), + yn->offset() ); + resume_pos = yn->offset() - on->offset() - 1; // make sure we have positive value, otherwise we're // accessing states out of borders @@ -834,8 +857,9 @@ void lb302Synth::playNote( notePlayHandle * _n, bool ) { resume_pos += framesPerPeriod; } - decay_note = true; - } + + decay_note = true; + } } #ifdef LB_DEBUG @@ -854,91 +878,86 @@ void lb302Synth::playNote( notePlayHandle * _n, bool ) if (period_states == NULL) { period_states = new lb302State[framesPerPeriod]; - for (int i=0; i < framesPerPeriod; i++) { - period_states[i].vco_c = vco_c; - period_states[i].vca_a = vca_a; // Doesn't change anything (currently) - period_states[i].vca_mode = vca_mode; // Doesn't change anything (currently) - period_states[i].sample_cnt = sample_cnt; // Doesn't change anything (currently) - vcf->getState(&period_states[i].fs); - } - } + for (int i=0; i < framesPerPeriod; i++) { + period_states[i].vco_c = vco_c; + period_states[i].vca_a = vca_a; // Doesn't change anything (currently) + period_states[i].vca_mode = vca_mode; // Doesn't change anything (currently) + period_states[i].sample_cnt = sample_cnt; // Doesn't change anything (currently) + vcf->getState(&period_states[i].fs); + } + } - // now resume at the proper position and process as usual - lb302State *state = &period_states[resume_pos]; + // now resume at the proper position and process as usual + lb302State *state = &period_states[resume_pos]; - /// Actually resume the state, now that we have the right state object. - vco_c = state->vco_c; - vca_a = state->vca_a; - vca_mode = state->vca_mode; - sample_cnt = state->sample_cnt; - vcf->setState(&state->fs); + // Actually resume the state, now that we have the right state object. + vco_c = state->vco_c; + vca_a = state->vca_a; + vca_mode = state->vca_mode; + sample_cnt = state->sample_cnt; + vcf->setState(&state->fs); - /// Currently have release/decay disabled - // Start the release decay if this is the first release period. - //if (_n->released() && catch_decay == 0) - // catch_decay = 1; - + // Currently have release/decay disabled + // Start the release decay if this is the first release period. + //if (_n->released() && catch_decay == 0) + // catch_decay = 1; - release_frame = _n->framesLeft() - desiredReleaseFrames(); - if ( _n->totalFramesPlayed() <= 0 ) { - /// This code is obsolete, hence the "if false" + release_frame = _n->framesLeft() - desiredReleaseFrames(); - // Existing note. Allow it to decay. - if(deadToggle.value() == 0 && decay_note) { + if ( _n->totalFramesPlayed() <= 0 ) { + // This code is obsolete, hence the "if false" + + // Existing note. Allow it to decay. + if(deadToggle.value() == 0 && decay_note) { #ifdef LB_DECAY - if (catch_decay < 1) { - // BEGIN NOT SURE OF... - //lb302State *st = &period_states[period_states_cnt-1]; - //vca_a = st->vca_a; - //sample_cnt = st->sample_cnt; - // END NOT SURE OF + if (catch_decay < 1) { + // BEGIN NOT SURE OF... + //lb302State *st = &period_states[period_states_cnt-1]; + //vca_a = st->vca_a; + //sample_cnt = st->sample_cnt; + // END NOT SURE OF - // Reserve this note for retrigger in process() - hold_note.vco_inc = _n->frequency()*vco_detune/LB_HZ; // TODO: Use actual sampling rate. - hold_note.dead = deadToggle->value(); - use_hold_note = true; - catch_decay = 1; - } - else { - } + // Reserve this note for retrigger in process() + hold_note.vco_inc = _n->frequency()*vco_detune/LB_HZ; // TODO: Use actual sampling rate. + hold_note.dead = deadToggle->value(); + use_hold_note = true; + catch_decay = 1; + } #else - lb302Note note; - note.vco_inc = _n->frequency()*vco_detune/LB_HZ; // TODO: Use actual sampling rate. - note.dead = deadToggle.value(); - initNote(¬e); - vca_mode=0; - vca_a = state->vca_a; + lb302Note note; + note.vco_inc = _n->frequency()*vco_detune/LB_HZ; // TODO: Use actual sampling rate. + note.dead = deadToggle.value(); + initNote(¬e); + vca_mode=0; + vca_a = state->vca_a; #endif - } - /// Start a new note. - else { - lb302Note note; - note.vco_inc = _n->frequency()*vco_detune/LB_HZ; // TODO: Use actual sampling rate. - note.dead = deadToggle.value(); - initNote(¬e); - use_hold_note = false; - } + } + /// Start a new note. + else { + lb302Note note; + note.vco_inc = _n->frequency()*vco_detune/LB_HZ; // TODO: Use actual sampling rate. + note.dead = deadToggle.value(); + initNote(¬e); + use_hold_note = false; + } + + } - } - sampleFrame *buf = new sampleFrame[frames]; - process(buf, frames); - printf("track %Lx\n", getInstrumentTrack()); - getInstrumentTrack()->processAudioBuffer( buf, frames, _n ); + process(buf, frames); + getInstrumentTrack()->processAudioBuffer( buf, frames, _n ); - delete[] buf; + delete[] buf; - lastFramesPlayed = frames;//_n->framesLeftForCurrentPeriod(); //_n->totalFramesPlayed(); + lastFramesPlayed = frames; //_n->framesLeftForCurrentPeriod(); //_n->totalFramesPlayed(); } - - void lb302Synth::deleteNotePluginData( notePlayHandle * _n ) { } @@ -1019,31 +1038,34 @@ lb302SynthView::lb302SynthView( instrument * _instrument, QWidget * _parent ) : setPalette( pal ); } + lb302SynthView::~lb302SynthView() { } + void lb302SynthView::modelChanged( void ) { lb302Synth * syn = castModel(); m_vcfCutKnob->setModel( &syn->vcf_cut_knob ); m_vcfResKnob->setModel( &syn->vcf_res_knob ); - m_vcfDecKnob->setModel( &syn->vcf_dec_knob ); + m_vcfDecKnob->setModel( &syn->vcf_dec_knob ); m_vcfModKnob->setModel( &syn->vcf_mod_knob ); + m_slideDecKnob->setModel( &syn->slide_dec_knob ); - m_vcoFineDetuneKnob->setModel( &syn->vco_fine_detune_knob ); + m_vcoFineDetuneKnob->setModel( &syn->vco_fine_detune_knob ); - m_distKnob->setModel( &syn->dist_knob ); - m_waveKnob->setModel( &syn->wave_knob ); + m_distKnob->setModel( &syn->dist_knob ); + m_waveKnob->setModel( &syn->wave_knob ); - m_slideToggle->setModel( &syn->slideToggle ); - m_accentToggle->setModel( &syn->accentToggle ); - m_deadToggle->setModel( &syn->deadToggle ); - m_db24Toggle->setModel( &syn->db24Toggle ); + m_slideToggle->setModel( &syn->slideToggle ); + m_accentToggle->setModel( &syn->accentToggle ); + m_deadToggle->setModel( &syn->deadToggle ); + m_db24Toggle->setModel( &syn->db24Toggle ); } - + extern "C" { @@ -1052,8 +1074,8 @@ extern "C" plugin * lmms_plugin_main( model *, void * _data ) { -return( new lb302Synth( - static_cast( _data ) ) ); + return( new lb302Synth( + static_cast( _data ) ) ); } diff --git a/plugins/lb302/lb302.h b/plugins/lb302/lb302.h index 1b31ed8bb..99a88f88c 100644 --- a/plugins/lb302/lb302.h +++ b/plugins/lb302/lb302.h @@ -44,94 +44,94 @@ class notePlayHandle; class lb302FilterKnobState { - public: - float cutoff; - float reso; - float envmod; - float envdecay; - float dist; + public: + float cutoff; + float reso; + float envmod; + float envdecay; + float dist; }; class lb302FilterIIR2State { - public: - float vcf_c0; - float vcf_a; - float vcf_b; - float vcf_c; - float vcf_d1; - float vcf_d2; + public: + float vcf_c0; + float vcf_a; + float vcf_b; + float vcf_c; + float vcf_d1; + float vcf_d2; }; class lb302Filter3PoleState { - public: - float vcf_c0; - float kp, - kp1h, - kres, - ay1, - ay2, - lastin, - value; - float aout; + public: + float vcf_c0; + float kp, + kp1h, + kres, + ay1, + ay2, + lastin, + value; + float aout; }; typedef union { - lb302FilterIIR2State iir; - lb302Filter3PoleState pole; + lb302FilterIIR2State iir; + lb302Filter3PoleState pole; } lb302FilterState; class lb302Filter { - public: - lb302Filter(lb302FilterKnobState* p_fs); - virtual ~lb302Filter() {}; + public: + lb302Filter(lb302FilterKnobState* p_fs); + virtual ~lb302Filter() {}; - virtual void recalc(); - virtual void envRecalc(); - virtual float process(const float& samp)=0; - virtual void playNote(); + virtual void recalc(); + virtual void envRecalc(); + virtual float process(const float& samp)=0; + virtual void playNote(); - virtual void getState(lb302FilterState* fs)=0; - virtual void setState(const lb302FilterState* fs)=0; + virtual void getState(lb302FilterState* fs)=0; + virtual void setState(const lb302FilterState* fs)=0; - protected: - lb302FilterKnobState *fs; - - // Filter Decay + protected: + lb302FilterKnobState *fs; + + // Filter Decay float vcf_c0; // c0=e1 on retrigger; c0*=ed every sample; cutoff=e0+c0 float vcf_e0, // e0 and e1 for interpolation - vcf_e1; - float vcf_rescoeff; // Resonance coefficient [0.30,9.54] + vcf_e1; + float vcf_rescoeff; // Resonance coefficient [0.30,9.54] }; class lb302FilterIIR2 : public lb302Filter { - public: - lb302FilterIIR2(lb302FilterKnobState* p_fs); + public: + lb302FilterIIR2(lb302FilterKnobState* p_fs); virtual ~lb302FilterIIR2(); - virtual void recalc(); - virtual void envRecalc(); - virtual float process(const float& samp); + virtual void recalc(); + virtual void envRecalc(); + virtual float process(const float& samp); - virtual void getState(lb302FilterState* fs); - virtual void setState(const lb302FilterState* fs); + virtual void getState(lb302FilterState* fs); + virtual void setState(const lb302FilterState* fs); - protected: - float vcf_d1, // d1 and d2 are added back into the sample with - vcf_d2; // vcf_a and b as coefficients. IIR2 resonance - // loop. + protected: + float vcf_d1, // d1 and d2 are added back into the sample with + vcf_d2; // vcf_a and b as coefficients. IIR2 resonance + // loop. + + // IIR2 Coefficients for mixing dry and delay. + float vcf_a, // Mixing coefficients for the final sound. + vcf_b, // + vcf_c; - // IIR2 Coefficients for mixing dry and delay. - float vcf_a, // Mixing coefficients for the final sound. - vcf_b, // - vcf_c; - effectLib::monoToStereoAdaptor > * m_dist_fx; effectLib::distortion<> * m_dist; }; @@ -139,72 +139,72 @@ class lb302FilterIIR2 : public lb302Filter class lb302Filter3Pole : public lb302Filter { - public: - lb302Filter3Pole(lb302FilterKnobState* p_fs); + public: + lb302Filter3Pole(lb302FilterKnobState* p_fs); - //virtual void recalc(); - virtual void envRecalc(); - virtual void recalc(); - virtual float process(const float& samp); + //virtual void recalc(); + virtual void envRecalc(); + virtual void recalc(); + virtual float process(const float& samp); - virtual void getState(lb302FilterState* fs); - virtual void setState(const lb302FilterState* fs); + virtual void getState(lb302FilterState* fs); + virtual void setState(const lb302FilterState* fs); - protected: - float kfcn, - kp, - kp1, - kp1h, - kres; - float ay1, - ay2, - aout, - lastin, - value; + protected: + float kfcn, + kp, + kp1, + kp1h, + kres; + float ay1, + ay2, + aout, + lastin, + value; }; - + class lb302State { public: - float vco_c; - float vca_a; - int vca_mode; - int sample_cnt; + float vco_c; + float vca_a; + int vca_mode; + int sample_cnt; - lb302FilterState fs; + lb302FilterState fs; }; class lb302Note { public: - float vco_inc; - bool dead; + float vco_inc; + bool dead; }; class lb302Synth : public instrument { - Q_OBJECT + Q_OBJECT public: lb302Synth( instrumentTrack * _channel_track ); virtual ~lb302Synth(); virtual void FASTCALL playNote( notePlayHandle * _n, - bool _try_parallelizing ); + bool _try_parallelizing ); virtual void FASTCALL deleteNotePluginData( notePlayHandle * _n ); virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _parent ); + QDomElement & _parent ); virtual void FASTCALL loadSettings( const QDomElement & _this ); virtual QString nodeName( void ) const; - virtual bool isMonophonic(void) const { - return true; - } + virtual bool isMonophonic(void) const { + return true; + } virtual f_cnt_t desiredReleaseFrames( void ) const { @@ -215,83 +215,83 @@ public: private: - void initNote(lb302Note *note); + void initNote(lb302Note *note); private: knobModel vcf_cut_knob; knobModel vcf_res_knob; knobModel vcf_mod_knob; - knobModel vcf_dec_knob; + knobModel vcf_dec_knob; - knobModel vco_fine_detune_knob; + knobModel vco_fine_detune_knob; - knobModel dist_knob; - knobModel wave_knob; - knobModel slide_dec_knob; + knobModel dist_knob; + knobModel wave_knob; + knobModel slide_dec_knob; - boolModel slideToggle; - boolModel accentToggle; - boolModel deadToggle; - boolModel db24Toggle; + boolModel slideToggle; + boolModel accentToggle; + boolModel deadToggle; + boolModel db24Toggle; public slots: - void filterChanged(float); - void detuneChanged(float); - void waveChanged(float); - void db24Toggled( bool ); + void filterChanged( void ); + void detuneChanged( void ); + void waveChanged( void ); + void db24Toggled( void ); private: - // Oscillator - float vco_inc, // Sample increment for the frequency. Creates Sawtooth. - vco_k, // Raw oscillator sample [-0.5,0.5] - vco_c; // Raw oscillator sample [-0.5,0.5] + // Oscillator + float vco_inc, // Sample increment for the frequency. Creates Sawtooth. + vco_k, // Raw oscillator sample [-0.5,0.5] + vco_c; // Raw oscillator sample [-0.5,0.5] - float vco_slide, //* Current value of slide exponential curve. Nonzero=sliding - vco_slideinc, //* Slide base to use in next node. Nonzero=slide next note - vco_slidebase; //* The base vco_inc while sliding. + float vco_slide, //* Current value of slide exponential curve. Nonzero=sliding + vco_slideinc, //* Slide base to use in next node. Nonzero=slide next note + vco_slidebase; //* The base vco_inc while sliding. - float vco_detune; + float vco_detune; - enum vco_shape_t { SAWTOOTH, INVERTED_SAWTOOTH, SQUARE, TRIANGLE, MOOG, ROUND_SQUARE }; - vco_shape_t vco_shape; + enum vco_shape_t { SAWTOOTH, INVERTED_SAWTOOTH, SQUARE, TRIANGLE, MOOG, ROUND_SQUARE }; + vco_shape_t vco_shape; - // User settings - lb302FilterKnobState fs; - lb302Filter *vcf; - lb302Note hold_note; - bool use_hold_note; - - int lastFramesPlayed; - int release_frame; + // User settings + lb302FilterKnobState fs; + lb302Filter *vcf; + lb302Note hold_note; + bool use_hold_note; - - // More States - int vcf_envpos; // Update counter. Updates when >= ENVINC + int lastFramesPlayed; + int release_frame; + + + // More States + int vcf_envpos; // Update counter. Updates when >= ENVINC float vca_attack, // Amp attack - vca_decay, // Amp decay - vca_a0, // Initial amplifier coefficient - vca_a; // Amplifier coefficient. - - // Envelope State + vca_decay, // Amp decay + vca_a0, // Initial amplifier coefficient + vca_a; // Amplifier coefficient. + + // Envelope State int vca_mode; // 0: attack, 1: decay, 2: idle - // My hacks - int sample_cnt; - - int last_offset; + // My hacks + int sample_cnt; - lb302State *period_states; - int period_states_cnt; + int last_offset; - int catch_frame; - int catch_decay; + lb302State *period_states; + int period_states_cnt; - void recalcFilter(); + int catch_frame; + int catch_decay; - int process(sampleFrame *outbuf, const Uint32 size); + void recalcFilter(); + + int process(sampleFrame *outbuf, const Uint32 size); friend class lb302SynthView; @@ -302,7 +302,7 @@ class lb302SynthView : public instrumentView { public: lb302SynthView( instrument * _instrument, - QWidget * _parent ); + QWidget * _parent ); virtual ~lb302SynthView(); private: @@ -310,19 +310,19 @@ private: knob * m_vcfCutKnob; knob * m_vcfResKnob; - knob * m_vcfDecKnob; + knob * m_vcfDecKnob; knob * m_vcfModKnob; - knob * m_vcoFineDetuneKnob; + knob * m_vcoFineDetuneKnob; - knob * m_distKnob; - knob * m_waveKnob; - knob * m_slideDecKnob; + knob * m_distKnob; + knob * m_waveKnob; + knob * m_slideDecKnob; - ledCheckBox * m_slideToggle; - ledCheckBox * m_accentToggle; - ledCheckBox * m_deadToggle; - ledCheckBox * m_db24Toggle; + ledCheckBox * m_slideToggle; + ledCheckBox * m_accentToggle; + ledCheckBox * m_deadToggle; + ledCheckBox * m_db24Toggle; } ; From 1ea7d068c674b51b0a665c249e545c7b48154b73 Mon Sep 17 00:00:00 2001 From: Paul Giblock Date: Wed, 30 Jan 2008 07:43:50 +0000 Subject: [PATCH 41/87] Beginning MV split for Organic git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@680 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 12 +- plugins/lb302/lb302.cpp | 4 +- plugins/organic/organic.cpp | 388 +++++++++++++++++++----------------- plugins/organic/organic.h | 77 +++++-- 4 files changed, 281 insertions(+), 200 deletions(-) diff --git a/ChangeLog b/ChangeLog index ebfee74d2..5a580c609 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,12 @@ -2008-01-28 Paul Giblock +2007-01-30 Paul Giblock + * plugins/organic/organic.cpp: + * plugins/organic/organic.h: + Began split on Organic. But doesn't show in instrument list + + * plugins/lb302/lb302.cpp: + Fixed comments + +2008-01-28 Paul Giblock * plugins/lb302/lb302.cpp: * plugins/lb302/lb302.h: finished LB302 M/V-split. however, more changes can be made to meet @@ -6,7 +14,7 @@ * include/automatable_model.h: cleaned up code for boolModel - + 2008-01-26 Tobias Doerffel * src/widgets/automatable_button.cpp: diff --git a/plugins/lb302/lb302.cpp b/plugins/lb302/lb302.cpp index 99cfc45c1..29734de33 100644 --- a/plugins/lb302/lb302.cpp +++ b/plugins/lb302/lb302.cpp @@ -703,7 +703,6 @@ int lb302Synth::process(sampleFrame *outbuf, const Uint32 size) } // Handle Envelope - // TODO: Add decay once I figure out how to extend past the end of a note. if(vca_mode==0) { vca_a+=(vca_a0-vca_a)*vca_attack; if(sample_cnt>=0.5*44100) @@ -732,7 +731,7 @@ int lb302Synth::process(sampleFrame *outbuf, const Uint32 size) /* Prepares the active LB302 note. I separated this into a function because it - * needs to be called on0playNote() when a new note is started. It also needs + * needs to be called onplayNote() when a new note is started. It also needs * to be called from process() when a prior edge-to-edge note is done releasing. */ @@ -743,6 +742,7 @@ void lb302Synth::initNote( lb302Note *n) vco_inc = n->vco_inc; // TODO: Try moving to the if() below + // Why vca_mode==3? if(n->dead == 0 || (vca_mode==1 || vca_mode==3)) { sample_cnt = 0; vca_mode = 0; diff --git a/plugins/organic/organic.cpp b/plugins/organic/organic.cpp index f6d54c677..d09b51bed 100644 --- a/plugins/organic/organic.cpp +++ b/plugins/organic/organic.cpp @@ -61,12 +61,12 @@ plugin::descriptor organic_plugin_descriptor = } -QPixmap * organicInstrument::s_artwork = NULL; +QPixmap * organicInstrumentView::s_artwork = NULL; /*********************************************************************** * -* class BitInvader +* class OrganicInstrument * * lmms - plugin * @@ -74,128 +74,36 @@ QPixmap * organicInstrument::s_artwork = NULL; organicInstrument::organicInstrument( instrumentTrack * _channel_track ) : - instrument( _channel_track, - &organic_plugin_descriptor ), - m_modulationAlgo( oscillator::MIX ) + instrument( _channel_track, &organic_plugin_descriptor ), + m_modulationAlgo( oscillator::SignalMix ), + m_fx1Knob( 0.0f, 0.0f, 0.99f, 0.01f , this ), + m_volKnob( 100.0f, 0.0f, 200.0f, 1.0f, this ) { - m_num_oscillators = 8; + m_numOscillators = 8; - m_osc = new oscillatorObject[m_num_oscillators]; + for (int i=0; i < m_numOscillators; i++) + { + m_osc[i] = new oscillatorObject( this, _channel_track ); + m_osc[i]->m_numOscillators = m_numOscillators; + } + + m_osc[0]->m_harmonic = log2f( 0.5f ); // one octave below + m_osc[1]->m_harmonic = log2f( 0.75f ); // a fifth below + m_osc[2]->m_harmonic = log2f( 1.0f ); // base freq + m_osc[3]->m_harmonic = log2f( 2.0f ); // first overtone + m_osc[4]->m_harmonic = log2f( 3.0f ); // second overtone + m_osc[5]->m_harmonic = log2f( 4.0f ); // . + m_osc[6]->m_harmonic = log2f( 5.0f ); // . + m_osc[7]->m_harmonic = log2f( 6.0f ); // . + + for (int i=0; i < m_numOscillators; i++) { + m_osc[i]->updateVolume(); + m_osc[i]->updateDetuning(); + } - m_osc[0].m_harmonic = log2f( 0.5f ); // one octave below - m_osc[1].m_harmonic = log2f( 0.75f ); // a fifth below - m_osc[2].m_harmonic = log2f( 1.0f ); // base freq - m_osc[3].m_harmonic = log2f( 2.0f ); // first overtone - m_osc[4].m_harmonic = log2f( 3.0f ); // second overtone - m_osc[5].m_harmonic = log2f( 4.0f ); // . - m_osc[6].m_harmonic = log2f( 5.0f ); // . - m_osc[7].m_harmonic = log2f( 6.0f ); // . - for (int i=0; i < m_num_oscillators; i++) - { - m_osc[i].m_num_oscillators = m_num_oscillators; - - // setup volume-knob - m_osc[i].m_oscKnob = new knob( knobGreen_17, this, tr( - "Osc %1 waveform" ).arg( i + 1 ), - _channel_track ); - m_osc[i].m_oscKnob->move( 25 + i * 20, 90 ); - m_osc[i].m_oscKnob->setRange( 0.0f, 5.0f, 0.25f ); - m_osc[i].m_oscKnob->setInitValue( 0.0f ); - m_osc[i].m_oscKnob->setHintText( tr( "Osc %1 waveform:" ).arg( - i + 1 ) + " ", "%" ); - - connect( m_osc[i].m_oscKnob, SIGNAL( valueChanged() ), - &m_osc[i], SLOT ( oscButtonChanged() ) ); - - // setup volume-knob - m_osc[i].m_volKnob = new volumeKnob( knobGreen_17, this, tr( - "Osc %1 volume" ).arg( i + 1 ), - _channel_track ); - m_osc[i].m_volKnob->move( 25 + i * 20, 110 ); - m_osc[i].m_volKnob->setRange( 0, 100, 1.0f ); - m_osc[i].m_volKnob->setInitValue( 100 ); - m_osc[i].m_volKnob->setHintText( tr( "Osc %1 volume:" ).arg( - i + 1 ) + " ", "%" ); - - // setup panning-knob - m_osc[i].m_panKnob = new knob( knobGreen_17, this, - tr( "Osc %1 panning" ).arg( i + 1 ), - _channel_track ); - m_osc[i].m_panKnob->move( 25 + i * 20, 130 ); - m_osc[i].m_panKnob->setRange( PANNING_LEFT, PANNING_RIGHT, - 1.0f ); - m_osc[i].m_panKnob->setInitValue( DEFAULT_PANNING ); - m_osc[i].m_panKnob->setHintText( tr("Osc %1 panning:").arg( - i + 1 ) + " ", "" ); - - // setup knob for left fine-detuning - m_osc[i].m_detuneKnob = new knob( knobGreen_17, this, - tr( "Osc %1 fine detuning left" ).arg( i + 1 ), - _channel_track ); - m_osc[i].m_detuneKnob->move( 25 + i * 20, 150 ); - m_osc[i].m_detuneKnob->setRange( -100.0f, 100.0f, 1.0f ); - m_osc[i].m_detuneKnob->setInitValue( 0.0f ); - m_osc[i].m_detuneKnob->setHintText( tr( "Osc %1 fine detuning " - "left:" ).arg( i + 1 ) - + " ", " " + - tr( "cents" ) ); - - connect( m_osc[i].m_volKnob, SIGNAL( valueChanged() ), - &m_osc[i], SLOT( updateVolume() ) ); - connect( m_osc[i].m_panKnob, SIGNAL( valueChanged() ), - &m_osc[i], SLOT( updateVolume() ) ); - m_osc[i].updateVolume(); - - connect( m_osc[i].m_detuneKnob, SIGNAL( valueChanged() ), - &m_osc[i], SLOT( updateDetuning() ) ); - m_osc[i].updateDetuning(); - } - - connect( engine::getMixer(), SIGNAL( sampleRateChanged() ), - this, SLOT( updateAllDetuning() ) ); - - // setup knob for FX1 - m_fx1Knob = new knob( knobGreen_17, this, tr( "FX1" ), _channel_track ); - m_fx1Knob->move( 20, 200 ); - m_fx1Knob->setRange( 0.0f, 0.99f, 0.01f ); - m_fx1Knob->setInitValue( 0.0f); - - // setup volume-knob - m_volKnob = new knob( knobGreen_17, this, tr( "Osc %1 volume" ).arg( - 1 ), _channel_track ); - m_volKnob->move( 50, 200 ); - m_volKnob->setRange( 0, 200, 1.0f ); - m_volKnob->setInitValue( 100 ); - m_volKnob->setHintText( tr( "Osc %1 volume:" ).arg( 1 ) + " ", "%" ); - - // randomise - m_randBtn = new pixmapButton( this, tr( "Randomise" ), _channel_track ); - m_randBtn->move( 100, 200 ); - m_randBtn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "randomise_pressed" ) ); - m_randBtn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "randomise" ) ); - //m_randBtn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( "btn_mask" ). - // createHeuristicMask() ) ); - - connect( m_randBtn, SIGNAL ( clicked() ), - this, SLOT( randomiseSettings() ) ); - - - if( s_artwork == NULL ) - { - s_artwork = new QPixmap( PLUGIN_NAME::getIconPixmap( - "artwork" ) ); - } - - - - setAutoFillBackground( TRUE ); - QPalette pal; - pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( - "artwork" ) ); - setPalette( pal ); + //connect( engine::getMixer(), SIGNAL( sampleRateChanged() ), + // this, SLOT( updateAllDetuning() ) ); } @@ -211,20 +119,20 @@ organicInstrument::~organicInstrument() void organicInstrument::saveSettings( QDomDocument & _doc, QDomElement & _this ) { - _this.setAttribute( "num_osc", QString::number( m_num_oscillators ) ); - m_fx1Knob->saveSettings( _doc, _this, "foldback" ); - m_volKnob->saveSettings( _doc, _this, "vol" ); + _this.setAttribute( "num_osc", QString::number( m_numOscillators ) ); + m_fx1Knob.saveSettings( _doc, _this, "foldback" ); + m_volKnob.saveSettings( _doc, _this, "vol" ); - for( int i = 0; i < m_num_oscillators; ++i ) + for( int i = 0; i < m_numOscillators; ++i ) { QString is = QString::number( i ); - m_osc[i].m_volKnob->saveSettings( _doc, _this, "vol" + is ); - m_osc[i].m_panKnob->saveSettings( _doc, _this, "pan" + is ); + m_osc[i]->m_volKnob.saveSettings( _doc, _this, "vol" + is ); + m_osc[i]->m_panKnob.saveSettings( _doc, _this, "pan" + is ); _this.setAttribute( "harmonic" + is, QString::number( - powf( 2.0f, m_osc[i].m_harmonic ) ) ); - m_osc[i].m_detuneKnob->saveSettings( _doc, _this, "detune" + powf( 2.0f, m_osc[i]->m_harmonic ) ) ); + m_osc[i]->m_detuneKnob.saveSettings( _doc, _this, "detune" + is ); - m_osc[i].m_oscKnob->saveSettings( _doc, _this, "wavetype" + m_osc[i]->m_oscKnob.saveSettings( _doc, _this, "wavetype" + is ); } } @@ -234,20 +142,20 @@ void organicInstrument::saveSettings( QDomDocument & _doc, QDomElement & _this ) void organicInstrument::loadSettings( const QDomElement & _this ) { -// m_num_oscillators = _this.attribute( "num_osc" ). +// m_numOscillators = _this.attribute( "num_osc" ). // toInt(); - for( int i = 0; i < m_num_oscillators; ++i ) + for( int i = 0; i < m_numOscillators; ++i ) { QString is = QString::number( i ); - m_osc[i].m_volKnob->loadSettings( _this, "vol" + is ); - m_osc[i].m_detuneKnob->loadSettings( _this, "detune" + is ); - m_osc[i].m_panKnob->loadSettings( _this, "pan" + is ); - m_osc[i].m_oscKnob->loadSettings( _this, "wavetype" + is ); + m_osc[i]->m_volKnob.loadSettings( _this, "vol" + is ); + m_osc[i]->m_detuneKnob.loadSettings( _this, "detune" + is ); + m_osc[i]->m_panKnob.loadSettings( _this, "pan" + is ); + m_osc[i]->m_oscKnob.loadSettings( _this, "wavetype" + is ); } - m_volKnob->loadSettings( _this, "vol" ); - m_fx1Knob->loadSettings( _this, "foldback" ); + m_volKnob.loadSettings( _this, "vol" ); + m_fx1Knob.loadSettings( _this, "foldback" ); } @@ -263,60 +171,60 @@ void organicInstrument::playNote( notePlayHandle * _n, bool ) { if( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) { - oscillator * oscs_l[m_num_oscillators]; - oscillator * oscs_r[m_num_oscillators]; + oscillator * oscs_l[m_numOscillators]; + oscillator * oscs_r[m_numOscillators]; - for( Sint8 i = m_num_oscillators - 1; i >= 0; --i ) + for( Sint8 i = m_numOscillators - 1; i >= 0; --i ) { // randomize the phaseOffset [0,1) - m_osc[i].m_phaseOffsetLeft = rand() + m_osc[i]->m_phaseOffsetLeft = rand() / ( RAND_MAX + 1.0f ); - m_osc[i].m_phaseOffsetRight = rand() + m_osc[i]->m_phaseOffsetRight = rand() / ( RAND_MAX + 1.0f ); // initialise ocillators - if( i == m_num_oscillators - 1 ) + if( i == m_numOscillators - 1 ) { // create left oscillator oscs_l[i] = new oscillator( - m_osc[i].m_waveShape, + m_osc[i]->m_waveShape, m_modulationAlgo, _n->frequency(), - m_osc[i].m_detuningLeft, - m_osc[i].m_phaseOffsetLeft, - m_osc[i].m_volumeLeft ); + m_osc[i]->m_detuningLeft, + m_osc[i]->m_phaseOffsetLeft, + m_osc[i]->m_volumeLeft ); // create right oscillator oscs_r[i] = new oscillator( - m_osc[i].m_waveShape, + m_osc[i]->m_waveShape, m_modulationAlgo, _n->frequency(), - m_osc[i].m_detuningRight, - m_osc[i].m_phaseOffsetRight, - m_osc[i].m_volumeRight ); + m_osc[i]->m_detuningRight, + m_osc[i]->m_phaseOffsetRight, + m_osc[i]->m_volumeRight ); } else { // create left oscillator oscs_l[i] = new oscillator( - m_osc[i].m_waveShape, + m_osc[i]->m_waveShape, m_modulationAlgo, _n->frequency(), - m_osc[i].m_detuningLeft, - m_osc[i].m_phaseOffsetLeft, - m_osc[i].m_volumeLeft, + m_osc[i]->m_detuningLeft, + m_osc[i]->m_phaseOffsetLeft, + m_osc[i]->m_volumeLeft, oscs_l[i + 1] ); // create right oscillator oscs_r[i] = new oscillator( - m_osc[i].m_waveShape, + m_osc[i]->m_waveShape, m_modulationAlgo, _n->frequency(), - m_osc[i].m_detuningRight, - m_osc[i].m_phaseOffsetRight, - m_osc[i].m_volumeRight, + m_osc[i]->m_detuningRight, + m_osc[i]->m_phaseOffsetRight, + m_osc[i]->m_volumeRight, oscs_r[i + 1] ); } @@ -342,13 +250,13 @@ void organicInstrument::playNote( notePlayHandle * _n, bool ) // -- fx section -- // fxKnob is [0;1] - float t = m_fx1Knob->value(); + float t = m_fx1Knob.value(); for (int i=0 ; i < frames ; i++) { - buf[i][0] = waveshape( buf[i][0], t ) * m_volKnob->value() + buf[i][0] = waveshape( buf[i][0], t ) * m_volKnob.value() / 100.0f; - buf[i][1] = waveshape( buf[i][1], t ) * m_volKnob->value() + buf[i][1] = waveshape( buf[i][1], t ) * m_volKnob.value() / 100.0f; } @@ -396,7 +304,8 @@ float inline organicInstrument::waveshape(float in, float amount) void organicInstrument::randomiseSettings( void ) { - for( int i = 0; i < m_num_oscillators; i++ ) +/* + for( int i = 0; i < m_numOscillators; i++ ) { m_osc[i].m_volKnob->setValue( intRand( 0, 100 ) ); @@ -408,6 +317,7 @@ void organicInstrument::randomiseSettings( void ) m_osc[i].m_oscKnob->setValue( intRand( 0, 5 ) ); } +*/ } @@ -415,9 +325,9 @@ void organicInstrument::randomiseSettings( void ) void organicInstrument::updateAllDetuning( void ) { - for( int i = 0; i < m_num_oscillators; ++i ) + for( int i = 0; i < m_numOscillators; ++i ) { - m_osc[i].updateDetuning(); + m_osc[i]->updateDetuning(); } } @@ -432,15 +342,135 @@ int organicInstrument::intRand( int min, int max ) return( randn ); } +organicInstrumentView::organicInstrumentView( instrument * _instrument, + QWidget * _parent ) : + instrumentView( _instrument, _parent ) +{ + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( + "artwork" ) ); + setPalette( pal ); + + for (int i=0; i < m_numOscillators; ++i) + { + // setup waveform-knob + knob * oscKnob = new knob( knobGreen_17, this, tr( + "Osc %1 waveform" ).arg( i + 1 ) ); + oscKnob->move( 25 + i * 20, 90 ); + oscKnob->setHintText( tr( "Osc %1 waveform:" ).arg( + i + 1 ) + " ", "%" ); + + //connect( m_osc[i].m_oscKnob, SIGNAL( valueChanged() ), + // &m_osc[i], SLOT ( oscButtonChanged() ) ); + + // setup volume-knob + volumeKnob * volKnob = new volumeKnob( knobGreen_17, this, tr( + "Osc %1 volume" ).arg( i + 1 ) ); + volKnob->move( 25 + i * 20, 110 ); + volKnob->setHintText( tr( "Osc %1 volume:" ).arg( + i + 1 ) + " ", "%" ); + + // setup panning-knob + knob * panKnob = new knob( knobGreen_17, this, + tr( "Osc %1 panning" ).arg( i + 1 ) ); + panKnob->move( 25 + i * 20, 130 ); + panKnob->setHintText( tr("Osc %1 panning:").arg( + i + 1 ) + " ", "" ); + + // setup knob for left fine-detuning + knob * detuneKnob = new knob( knobGreen_17, this, + tr( "Osc %1 fine detuning left" ).arg( i + 1 ) ); + detuneKnob->move( 25 + i * 20, 150 ); + detuneKnob->setHintText( tr( "Osc %1 fine detuning " + "left:" ).arg( i + 1 ) + + " ", " " + + tr( "cents" ) ); + + m_oscKnobs[i] = oscillatorKnobs( volKnob, oscKnob, panKnob, detuneKnob ); + + + /*connect( m_osc[i].m_volKnob, SIGNAL( valueChanged() ), + &m_osc[i], SLOT( updateVolume() ) ); + connect( m_osc[i].m_panKnob, SIGNAL( valueChanged() ), + &m_osc[i], SLOT( updateVolume() ) ); + //m_osc[i].updateVolume(); + + connect( m_osc[i].m_detuneKnob, SIGNAL( valueChanged() ), + &m_osc[i], SLOT( updateDetuning() ) ); + //m_osc[i].updateDetuning();*/ + } + + + // setup knob for FX1 + m_fx1Knob = new knob( knobGreen_17, this, tr( "FX1" ) ); + m_fx1Knob->move( 20, 200 ); + + // setup volume-knob + m_volKnob = new knob( knobGreen_17, this, tr( "Osc %1 volume" ).arg( + 1 ) ); + m_volKnob->move( 50, 200 ); + m_volKnob->setHintText( tr( "Osc %1 volume:" ).arg( 1 ) + " ", "%" ); + + // randomise + /*m_randBtn = new pixmapButton( this, tr( "Randomise" ), _channel_track ); + m_randBtn->move( 100, 200 ); + m_randBtn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "randomise_pressed" ) ); + m_randBtn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "randomise" ) ); + //m_randBtn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( "btn_mask" ). + // createHeuristicMask() ) ); + + connect( m_randBtn, SIGNAL ( clicked() ), + this, SLOT( randomiseSettings() ) ); +*/ + + + + if( s_artwork == NULL ) + { + s_artwork = new QPixmap( PLUGIN_NAME::getIconPixmap( + "artwork" ) ); + } +} +void organicInstrumentView::modelChanged( void ) +{ + organicInstrument * oi = castModel(); + + m_numOscillators = oi->m_numOscillators; + + m_fx1Knob->setModel( &oi->m_fx1Knob ); + m_volKnob->setModel( &oi->m_volKnob ); + + for( int i = 0; i < m_numOscillators; ++i ) + { + m_oscKnobs[i].m_volKnob->setModel( + &oi->m_osc[i]->m_volKnob ); + m_oscKnobs[i].m_oscKnob->setModel( + &oi->m_osc[i]->m_oscKnob ); + m_oscKnobs[i].m_panKnob->setModel( + &oi->m_osc[i]->m_panKnob ); + m_oscKnobs[i].m_detuneKnob->setModel( + &oi->m_osc[i]->m_detuneKnob ); + /*connect( m_oscKnobs[i].m_userWaveButton, + SIGNAL( doubleClicked() ), + t->m_osc[i], SLOT( oscUserDefWaveDblClick() ) ); + */ + } +} - - -oscillatorObject::oscillatorObject( void ) : - m_waveShape( oscillator::SIN_WAVE ) +oscillatorObject::oscillatorObject( model * _parent, track * _track ) : + model( _parent ), + m_waveShape( oscillator::SineWave, 0, oscillator::NumWaveShapes-1, 1, this ), + m_oscKnob( 0.0f, 0.0f, 5.0f, 0.25f, this ), + m_volKnob( 100.0f, 0.0f, 100.0f, 1.0f, this ), + m_panKnob( DEFAULT_PANNING, PANNING_LEFT, PANNING_RIGHT, 1.0f, this ), + m_detuneKnob( 0.0f, -100.0f, 100.0f, 1.0f, this ) { } @@ -456,6 +486,7 @@ oscillatorObject::~oscillatorObject() void oscillatorObject::oscButtonChanged( void ) { +/* static oscillator::waveShapes shapes[] = { oscillator::SIN_WAVE, @@ -467,6 +498,7 @@ void oscillatorObject::oscButtonChanged( void ) } ; m_waveShape = shapes[(int)roundf( m_oscKnob->value() )]; +*/ } @@ -474,10 +506,10 @@ void oscillatorObject::oscButtonChanged( void ) void oscillatorObject::updateVolume( void ) { - m_volumeLeft = ( 1.0f - m_panKnob->value() / (float)PANNING_RIGHT ) - * m_volKnob->value() / m_num_oscillators / 100.0f; - m_volumeRight = ( 1.0f + m_panKnob->value() / (float)PANNING_RIGHT ) - * m_volKnob->value() / m_num_oscillators / 100.0f; + m_volumeLeft = ( 1.0f - m_panKnob.value() / (float)PANNING_RIGHT ) + * m_volKnob.value() / m_numOscillators / 100.0f; + m_volumeRight = ( 1.0f + m_panKnob.value() / (float)PANNING_RIGHT ) + * m_volKnob.value() / m_numOscillators / 100.0f; } @@ -486,10 +518,10 @@ void oscillatorObject::updateVolume( void ) void oscillatorObject::updateDetuning( void ) { m_detuningLeft = powf( 2.0f, m_harmonic - + (float)m_detuneKnob->value() / 100.0f ) + + (float)m_detuneKnob.value() / 100.0f ) / engine::getMixer()->sampleRate(); m_detuningRight = powf( 2.0f, m_harmonic - - (float)m_detuneKnob->value() / 100.0f ) + - (float)m_detuneKnob.value() / 100.0f ) / engine::getMixer()->sampleRate(); } @@ -500,7 +532,7 @@ extern "C" { // neccessary for getting instance out of shared lib -plugin * lmms_plugin_main( void * _data ) +plugin * lmms_plugin_main( model *, void * _data ) { return( new organicInstrument( static_cast( _data ) ) ); } @@ -514,10 +546,10 @@ plugin * lmms_plugin_main( void * _data ) * - 32.692 Hz in the bass to 5919.85 Hz of treble in a Hammond organ * => implement harmonic foldback * - * - randomize preset + m_osc[i].m_oscKnob->setInitValue( 0.0f ); + * - randomize preset */ - #include "organic.moc" diff --git a/plugins/organic/organic.h b/plugins/organic/organic.h index 9af047547..780dbda34 100644 --- a/plugins/organic/organic.h +++ b/plugins/organic/organic.h @@ -28,7 +28,9 @@ #include "instrument.h" +#include "instrument_view.h" #include "oscillator.h" +#include "automatable_model.h" class QPixmap; @@ -38,16 +40,16 @@ class pixmapButton; class volumeKnob; -class oscillatorObject : public QObject +class oscillatorObject : public model { Q_OBJECT private: - int m_num_oscillators; - oscillator::waveShapes m_waveShape; - knob * m_oscKnob; - volumeKnob * m_volKnob; - knob * m_panKnob; - knob * m_detuneKnob; + int m_numOscillators; + intModel m_waveShape; + floatModel m_oscKnob; + floatModel m_volKnob; + floatModel m_panKnob; + floatModel m_detuneKnob; float m_harmonic; float m_volumeLeft; @@ -59,10 +61,11 @@ private: float m_phaseOffsetLeft; float m_phaseOffsetRight; - oscillatorObject( void ); + oscillatorObject( model * _parent, track * _track ); virtual ~oscillatorObject(); friend class organicInstrument; + friend class organicInstrumentView; private slots: @@ -73,8 +76,6 @@ private slots: } ; - - class organicInstrument : public instrument { Q_OBJECT @@ -110,11 +111,9 @@ private: return (x / (1.0 + 0.28 * (x * x))); } - static QPixmap * s_artwork; + int m_numOscillators; - int m_num_oscillators; - - oscillatorObject * m_osc; + oscillatorObject ** m_osc; struct oscPtr { @@ -122,19 +121,61 @@ private: oscillator * oscRight; } ; - const oscillator::modulationAlgos m_modulationAlgo; + const intModel m_modulationAlgo; - knob * m_fx1Knob; - knob * m_volKnob; - pixmapButton * m_randBtn; + floatModel m_fx1Knob; + floatModel m_volKnob; + /*pixmapButton * m_randBtn;*/ + virtual pluginView * instantiateView( QWidget * _parent ); private slots: void updateAllDetuning( void ); + friend class organicInstrumentView; } ; +class organicInstrumentView : public instrumentView +{ +public: + organicInstrumentView( instrument * _instrument, QWidget * _parent ); + virtual ~organicInstrumentView(); + +private: + virtual void modelChanged( void ); + + struct oscillatorKnobs + { + oscillatorKnobs( volumeKnob * v, + knob * o, + knob * p, + knob * dt ) : + m_volKnob( v ), + m_oscKnob( o ), + m_panKnob( p ), + m_detuneKnob( dt ) + { + } + oscillatorKnobs() + { + } + + volumeKnob * m_volKnob; + knob * m_oscKnob; + knob * m_panKnob; + knob * m_detuneKnob; + } ; + + oscillatorKnobs * m_oscKnobs; + + knob * m_fx1Knob; + knob * m_volKnob; + + int m_numOscillators; + + static QPixmap * s_artwork; +}; #endif From 8fce2d725294ff65339fdf04c439f33083a0aecb Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 30 Jan 2008 22:15:16 +0000 Subject: [PATCH 42/87] renamed from envelope_tab_widget.h git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@681 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/{envelope_tab_widget.h => sound_shaping.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename include/{envelope_tab_widget.h => sound_shaping.h} (100%) diff --git a/include/envelope_tab_widget.h b/include/sound_shaping.h similarity index 100% rename from include/envelope_tab_widget.h rename to include/sound_shaping.h From d289ed208d51f0c9a868fe3ed2bc01506226a394 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 30 Jan 2008 22:36:06 +0000 Subject: [PATCH 43/87] renamed from envelope_and_lfo_widget.h git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@682 0778d3d1-df1d-0410-868b-ea421aaaa00d --- .../{envelope_and_lfo_widget.h => envelope_and_lfo_parameters.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename include/{envelope_and_lfo_widget.h => envelope_and_lfo_parameters.h} (100%) diff --git a/include/envelope_and_lfo_widget.h b/include/envelope_and_lfo_parameters.h similarity index 100% rename from include/envelope_and_lfo_widget.h rename to include/envelope_and_lfo_parameters.h From b0f37bbeb75de5fcb693bfd1e65258e31a4a3fd7 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 30 Jan 2008 22:38:18 +0000 Subject: [PATCH 44/87] renamed from envelope_tab_wiget.h git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@683 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/{sound_shaping.h => instrument_sound_shaping.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename include/{sound_shaping.h => instrument_sound_shaping.h} (100%) diff --git a/include/sound_shaping.h b/include/instrument_sound_shaping.h similarity index 100% rename from include/sound_shaping.h rename to include/instrument_sound_shaping.h From 39cbcecd5ece147399add16159de3dc8e34db319 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 30 Jan 2008 22:41:35 +0000 Subject: [PATCH 45/87] renamed from envelope_and_lfo_widget.cpp git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@684 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ...nvelope_and_lfo_widget.cpp => envelope_and_lfo_parameters.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/core/{envelope_and_lfo_widget.cpp => envelope_and_lfo_parameters.cpp} (100%) diff --git a/src/core/envelope_and_lfo_widget.cpp b/src/core/envelope_and_lfo_parameters.cpp similarity index 100% rename from src/core/envelope_and_lfo_widget.cpp rename to src/core/envelope_and_lfo_parameters.cpp From 96818d710ba411056687c4568607b2243d367e34 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 30 Jan 2008 22:42:27 +0000 Subject: [PATCH 46/87] renamed from envelope_tab_widget.cpp git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@685 0778d3d1-df1d-0410-868b-ea421aaaa00d --- .../{envelope_tab_widget.cpp => instrument_sound_shaping.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/core/{envelope_tab_widget.cpp => instrument_sound_shaping.cpp} (100%) diff --git a/src/core/envelope_tab_widget.cpp b/src/core/instrument_sound_shaping.cpp similarity index 100% rename from src/core/envelope_tab_widget.cpp rename to src/core/instrument_sound_shaping.cpp From c2ab2cc8b79405523ae0990b70c30719d58937cd Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 30 Jan 2008 23:46:38 +0000 Subject: [PATCH 47/87] moved from midi_tab_widget.h git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@686 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/{midi_tab_widget.h => instrument_midi_io.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename include/{midi_tab_widget.h => instrument_midi_io.h} (100%) diff --git a/include/midi_tab_widget.h b/include/instrument_midi_io.h similarity index 100% rename from include/midi_tab_widget.h rename to include/instrument_midi_io.h From af9c7332241b9f1ebd3a4f0a362289bbc5914ded Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 30 Jan 2008 23:47:37 +0000 Subject: [PATCH 48/87] moved from midi_tab_widget.cpp git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@687 0778d3d1-df1d-0410-868b-ea421aaaa00d --- src/core/{midi_tab_widget.cpp => instrument_midi_io.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/core/{midi_tab_widget.cpp => instrument_midi_io.cpp} (100%) diff --git a/src/core/midi_tab_widget.cpp b/src/core/instrument_midi_io.cpp similarity index 100% rename from src/core/midi_tab_widget.cpp rename to src/core/instrument_midi_io.cpp From 792d1eca17a5b3f06d02c6594fbeadf4cc410c6d Mon Sep 17 00:00:00 2001 From: Danny McRae Date: Fri, 1 Feb 2008 18:55:50 +0000 Subject: [PATCH 49/87] Updated references to renamed header files. git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@688 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 12 ++++++++++++ Makefile.am | 18 +++++++++--------- src/core/envelope_and_lfo_parameters.cpp | 4 ++-- src/core/instrument_midi_io.cpp | 4 ++-- src/core/instrument_sound_shaping.cpp | 6 +++--- src/core/mixer.cpp | 2 +- src/core/note_play_handle.cpp | 2 +- src/core/song_editor.cpp | 2 +- src/tracks/instrument_track.cpp | 4 ++-- 9 files changed, 33 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5a580c609..37c6e031c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2008-02-01 Danny McRae + * Makefile.am: + * src/tracks/instrument_track.cpp: + * src/core/note_play_handle.cpp: + * src/core/envelope_and_lfo_parameters.cpp: + * src/core/mixer.cpp: + * src/core/instrument_sound_shaping.cpp: + * src/core/instrument_midi_io.cpp: + * src/core/song_editor.cpp: + Some of the files have been renamed, so I updated the + include references to get the build to work again. + 2007-01-30 Paul Giblock * plugins/organic/organic.cpp: * plugins/organic/organic.h: diff --git a/Makefile.am b/Makefile.am index 8671b5bd0..b94147635 100644 --- a/Makefile.am +++ b/Makefile.am @@ -63,8 +63,8 @@ lmms_MOC = \ ./effect_control_dialog.moc \ ./effect_label.moc \ ./effect_select_dialog.moc \ - ./envelope_and_lfo_widget.moc \ - ./envelope_tab_widget.moc \ + ./envelope_and_lfo_parameters.moc \ + ./instrument_sound_shaping.moc \ ./export_project_dialog.moc \ ./fade_button.moc \ ./file_browser.moc \ @@ -81,7 +81,7 @@ lmms_MOC = \ ./nstate_button.moc \ ./meter_dialog.moc \ ./midi_alsa_seq.moc \ - ./midi_tab_widget.moc \ + ./instrument_midi_io.moc \ ./pattern.moc \ ./piano_roll.moc \ ./piano_widget.moc \ @@ -160,8 +160,8 @@ lmms_SOURCES = \ $(srcdir)/src/core/effect_select_dialog.cpp \ $(srcdir)/src/core/effect.cpp \ $(srcdir)/src/core/engine.cpp \ - $(srcdir)/src/core/envelope_and_lfo_widget.cpp \ - $(srcdir)/src/core/envelope_tab_widget.cpp \ + $(srcdir)/src/core/envelope_and_lfo_parameters.cpp \ + $(srcdir)/src/core/instrument_sound_shaping.cpp \ $(srcdir)/src/core/export_project_dialog.cpp \ $(srcdir)/src/core/file_browser.cpp \ $(srcdir)/src/core/import_filter.cpp \ @@ -172,7 +172,7 @@ lmms_SOURCES = \ $(srcdir)/src/core/main_window.cpp \ $(srcdir)/src/core/main.cpp \ $(srcdir)/src/core/meter_dialog.cpp \ - $(srcdir)/src/core/midi_tab_widget.cpp \ + $(srcdir)/src/core/instrument_midi_io.cpp \ $(srcdir)/src/core/mixer.cpp \ $(srcdir)/src/core/mv_base.cpp \ $(srcdir)/src/core/name_label.cpp \ @@ -284,8 +284,8 @@ lmms_SOURCES = \ $(srcdir)/include/note_play_handle.h \ $(srcdir)/include/piano_roll.h \ $(srcdir)/include/basic_filters.h \ - $(srcdir)/include/envelope_tab_widget.h \ - $(srcdir)/include/envelope_and_lfo_widget.h \ + $(srcdir)/include/instrument_sound_shaping.h \ + $(srcdir)/include/envelope_and_lfo_parameters.h \ $(srcdir)/include/about_dialog.h \ $(srcdir)/include/oscillator.h \ $(srcdir)/include/arp_and_chords_tab_widget.h \ @@ -350,7 +350,7 @@ lmms_SOURCES = \ $(srcdir)/include/dummy_instrument.h \ $(srcdir)/include/instrument_play_handle.h \ $(srcdir)/include/string_pair_drag.h \ - $(srcdir)/include/midi_tab_widget.h \ + $(srcdir)/include/instrument_midi_io.h \ $(srcdir)/include/audio_port.h \ $(srcdir)/include/tool.h \ $(srcdir)/include/tool_button.h \ diff --git a/src/core/envelope_and_lfo_parameters.cpp b/src/core/envelope_and_lfo_parameters.cpp index 9fe87b7e1..9af4fef9c 100644 --- a/src/core/envelope_and_lfo_parameters.cpp +++ b/src/core/envelope_and_lfo_parameters.cpp @@ -26,7 +26,7 @@ */ -#include "envelope_and_lfo_widget.h" +#include "envelope_and_lfo_parameters.h" #include @@ -1041,7 +1041,7 @@ void envelopeAndLFOWidget::lfoUserWaveChanged( void ) -#include "envelope_and_lfo_widget.moc" +#include "envelope_and_lfo_parameters.moc" #endif diff --git a/src/core/instrument_midi_io.cpp b/src/core/instrument_midi_io.cpp index c620a0848..5767cf5aa 100644 --- a/src/core/instrument_midi_io.cpp +++ b/src/core/instrument_midi_io.cpp @@ -31,7 +31,7 @@ #include -#include "midi_tab_widget.h" +#include "instrument_midi_io.h" #include "embed.h" #include "engine.h" #include "gui_templates.h" @@ -485,7 +485,7 @@ void midiTabWidget::activatedWriteablePort( QAction * _item ) -#include "midi_tab_widget.moc" +#include "instrument_midi_io.moc" #endif diff --git a/src/core/instrument_sound_shaping.cpp b/src/core/instrument_sound_shaping.cpp index 00c7df3bf..803f4a185 100644 --- a/src/core/instrument_sound_shaping.cpp +++ b/src/core/instrument_sound_shaping.cpp @@ -29,11 +29,11 @@ #include -#include "envelope_tab_widget.h" +#include "instrument_sound_shaping.h" #include "combobox.h" #include "embed.h" #include "engine.h" -#include "envelope_and_lfo_widget.h" +#include "envelope_and_lfo_parameters.h" #include "group_box.h" #include "gui_templates.h" #include "instrument_track.h" @@ -486,7 +486,7 @@ void envelopeTabWidget::loadSettings( const QDomElement & _this ) -#include "envelope_tab_widget.moc" +#include "instrument_sound_shaping.moc" diff --git a/src/core/mixer.cpp b/src/core/mixer.cpp index 1a636ac30..c11940acf 100644 --- a/src/core/mixer.cpp +++ b/src/core/mixer.cpp @@ -31,7 +31,7 @@ #include "play_handle.h" #include "song_editor.h" #include "templates.h" -#include "envelope_and_lfo_widget.h" +#include "envelope_and_lfo_parameters.h" #include "debug.h" #include "engine.h" #include "config_mgr.h" diff --git a/src/core/note_play_handle.cpp b/src/core/note_play_handle.cpp index c8af5a3cb..af3ca2e42 100644 --- a/src/core/note_play_handle.cpp +++ b/src/core/note_play_handle.cpp @@ -30,7 +30,7 @@ #include "automatable_model_templates.h" #include "config_mgr.h" #include "detuning_helper.h" -#include "envelope_tab_widget.h" +#include "instrument_sound_shaping.h" #include "instrument_track.h" #include "midi_port.h" #include "song_editor.h" diff --git a/src/core/song_editor.cpp b/src/core/song_editor.cpp index 389bd0a5e..a4695b986 100644 --- a/src/core/song_editor.cpp +++ b/src/core/song_editor.cpp @@ -56,7 +56,7 @@ #include "config_mgr.h" #include "cpuload_widget.h" #include "embed.h" -#include "envelope_and_lfo_widget.h" +#include "envelope_and_lfo_parameters.h" #include "export_project_dialog.h" #include "import_filter.h" #include "instrument_track.h" diff --git a/src/tracks/instrument_track.cpp b/src/tracks/instrument_track.cpp index 4e2e4ab08..0e064fbf9 100644 --- a/src/tracks/instrument_track.cpp +++ b/src/tracks/instrument_track.cpp @@ -53,7 +53,7 @@ #include "effect_rack_view.h" #include "embed.h" #include "engine.h" -#include "envelope_tab_widget.h" +#include "instrument_sound_shaping.h" #include "fade_button.h" #include "gui_templates.h" #include "instrument.h" @@ -61,7 +61,7 @@ #include "main_window.h" #include "midi_client.h" #include "midi_port.h" -#include "midi_tab_widget.h" +#include "instrument_midi_io.h" #include "mmp.h" #include "note_play_handle.h" #include "pattern.h" From 40017887e9afb4e369522923bcd5c549742353e9 Mon Sep 17 00:00:00 2001 From: Danny McRae Date: Sat, 2 Feb 2008 05:42:03 +0000 Subject: [PATCH 50/87] Started work on a STK based multitimbral instrument. git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@689 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 198 ++++++++++ configure.in | 17 + include/basic_filters.h | 27 +- plugins/stk/Makefile.am | 3 +- plugins/stk/voices/Makefile.am | 16 + plugins/stk/voices/b3/Makefile.am | 46 +++ plugins/stk/voices/b3/artwork.png | Bin 0 -> 70825 bytes plugins/stk/voices/b3/b3_instrument.cpp | 103 +++++ plugins/stk/voices/b3/b3_instrument.h | 46 +++ plugins/stk/voices/b3/b3_instrument_view.cpp | 110 ++++++ plugins/stk/voices/b3/b3_instrument_view.h | 51 +++ plugins/stk/voices/b3/b3_model.cpp | 88 +++++ plugins/stk/voices/b3/b3_model.h | 86 ++++ plugins/stk/voices/b3/b3_processor.cpp | 51 +++ plugins/stk/voices/b3/b3_processor.h | 42 ++ plugins/stk/voices/b3/logo.png | Bin 0 -> 890 bytes plugins/stk/voices/bandedwg/Makefile.am | 46 +++ plugins/stk/voices/bandedwg/artwork.png | Bin 0 -> 73241 bytes .../voices/bandedwg/bandedwg_instrument.cpp | 105 +++++ .../stk/voices/bandedwg/bandedwg_instrument.h | 46 +++ .../bandedwg/bandedwg_instrument_view.cpp | 121 ++++++ .../bandedwg/bandedwg_instrument_view.h | 53 +++ .../stk/voices/bandedwg/bandedwg_model.cpp | 98 +++++ plugins/stk/voices/bandedwg/bandedwg_model.h | 100 +++++ .../voices/bandedwg/bandedwg_processor.cpp | 53 +++ .../stk/voices/bandedwg/bandedwg_processor.h | 42 ++ plugins/stk/voices/bandedwg/logo.png | Bin 0 -> 890 bytes plugins/stk/voices/blow_bottle/Makefile.am | 46 +++ plugins/stk/voices/blow_bottle/artwork.png | Bin 0 -> 71988 bytes .../blow_bottle/blow_bottle_instrument.cpp | 102 +++++ .../blow_bottle/blow_bottle_instrument.h | 47 +++ .../blow_bottle_instrument_view.cpp | 89 +++++ .../blow_bottle/blow_bottle_instrument_view.h | 50 +++ .../voices/blow_bottle/blow_bottle_model.cpp | 79 ++++ .../voices/blow_bottle/blow_bottle_model.h | 63 +++ .../blow_bottle/blow_bottle_processor.cpp | 53 +++ .../blow_bottle/blow_bottle_processor.h | 43 ++ plugins/stk/voices/blow_bottle/logo.png | Bin 0 -> 890 bytes plugins/stk/voices/blow_hole/Makefile.am | 46 +++ plugins/stk/voices/blow_hole/artwork.png | Bin 0 -> 71623 bytes .../voices/blow_hole/blow_hole_instrument.cpp | 103 +++++ .../voices/blow_hole/blow_hole_instrument.h | 46 +++ .../blow_hole/blow_hole_instrument_view.cpp | 110 ++++++ .../blow_hole/blow_hole_instrument_view.h | 51 +++ .../stk/voices/blow_hole/blow_hole_model.cpp | 88 +++++ .../stk/voices/blow_hole/blow_hole_model.h | 67 ++++ .../voices/blow_hole/blow_hole_processor.cpp | 51 +++ .../voices/blow_hole/blow_hole_processor.h | 42 ++ plugins/stk/voices/blow_hole/logo.png | Bin 0 -> 890 bytes plugins/stk/voices/bowed/Makefile.am | 46 +++ plugins/stk/voices/bowed/artwork.png | Bin 0 -> 71559 bytes plugins/stk/voices/bowed/bowed_instrument.cpp | 102 +++++ plugins/stk/voices/bowed/bowed_instrument.h | 46 +++ .../voices/bowed/bowed_instrument_view.cpp | 100 +++++ .../stk/voices/bowed/bowed_instrument_view.h | 50 +++ plugins/stk/voices/bowed/bowed_model.cpp | 83 ++++ plugins/stk/voices/bowed/bowed_model.h | 79 ++++ plugins/stk/voices/bowed/bowed_processor.cpp | 50 +++ plugins/stk/voices/bowed/bowed_processor.h | 42 ++ plugins/stk/voices/bowed/logo.png | Bin 0 -> 890 bytes plugins/stk/voices/brass/Makefile.am | 46 +++ plugins/stk/voices/brass/artwork.png | Bin 0 -> 71358 bytes plugins/stk/voices/brass/brass_instrument.cpp | 102 +++++ plugins/stk/voices/brass/brass_instrument.h | 46 +++ .../voices/brass/brass_instrument_view.cpp | 100 +++++ .../stk/voices/brass/brass_instrument_view.h | 50 +++ plugins/stk/voices/brass/brass_model.cpp | 83 ++++ plugins/stk/voices/brass/brass_model.h | 79 ++++ plugins/stk/voices/brass/brass_processor.cpp | 50 +++ plugins/stk/voices/brass/brass_processor.h | 42 ++ plugins/stk/voices/brass/logo.png | Bin 0 -> 890 bytes plugins/stk/voices/clarinet/Makefile.am | 46 +++ plugins/stk/voices/clarinet/artwork.png | Bin 0 -> 71622 bytes .../voices/clarinet/clarinet_instrument.cpp | 103 +++++ .../stk/voices/clarinet/clarinet_instrument.h | 46 +++ .../clarinet/clarinet_instrument_view.cpp | 110 ++++++ .../clarinet/clarinet_instrument_view.h | 51 +++ .../stk/voices/clarinet/clarinet_model.cpp | 88 +++++ plugins/stk/voices/clarinet/clarinet_model.h | 86 ++++ .../voices/clarinet/clarinet_processor.cpp | 51 +++ .../stk/voices/clarinet/clarinet_processor.h | 42 ++ plugins/stk/voices/clarinet/logo.png | Bin 0 -> 890 bytes plugins/stk/voices/flute/Makefile.am | 46 +++ plugins/stk/voices/flute/artwork.png | Bin 0 -> 71134 bytes plugins/stk/voices/flute/flute_instrument.cpp | 103 +++++ plugins/stk/voices/flute/flute_instrument.h | 46 +++ .../voices/flute/flute_instrument_view.cpp | 110 ++++++ .../stk/voices/flute/flute_instrument_view.h | 51 +++ plugins/stk/voices/flute/flute_model.cpp | 88 +++++ plugins/stk/voices/flute/flute_model.h | 86 ++++ plugins/stk/voices/flute/flute_processor.cpp | 51 +++ plugins/stk/voices/flute/flute_processor.h | 42 ++ plugins/stk/voices/flute/logo.png | Bin 0 -> 890 bytes plugins/stk/voices/fmvoices/Makefile.am | 46 +++ plugins/stk/voices/fmvoices/artwork.png | Bin 0 -> 71849 bytes .../voices/fmvoices/fmvoices_instrument.cpp | 103 +++++ .../stk/voices/fmvoices/fmvoices_instrument.h | 46 +++ .../fmvoices/fmvoices_instrument_view.cpp | 110 ++++++ .../fmvoices/fmvoices_instrument_view.h | 51 +++ .../stk/voices/fmvoices/fmvoices_model.cpp | 88 +++++ plugins/stk/voices/fmvoices/fmvoices_model.h | 86 ++++ .../voices/fmvoices/fmvoices_processor.cpp | 51 +++ .../stk/voices/fmvoices/fmvoices_processor.h | 42 ++ plugins/stk/voices/fmvoices/logo.png | Bin 0 -> 890 bytes plugins/stk/voices/include/stk_instrument.h | 168 ++++++++ .../stk/voices/include/stk_instrument_view.h | 181 +++++++++ plugins/stk/voices/include/stk_model.h | 184 +++++++++ plugins/stk/voices/include/stk_processor.h | 363 +++++++++++++++++ plugins/stk/voices/include/stk_voice.h | 369 ++++++++++++++++++ plugins/stk/voices/metal/Makefile.am | 46 +++ plugins/stk/voices/metal/artwork.png | Bin 0 -> 71394 bytes plugins/stk/voices/metal/logo.png | Bin 0 -> 890 bytes plugins/stk/voices/metal/metal_instrument.cpp | 103 +++++ plugins/stk/voices/metal/metal_instrument.h | 46 +++ .../voices/metal/metal_instrument_view.cpp | 110 ++++++ .../stk/voices/metal/metal_instrument_view.h | 51 +++ plugins/stk/voices/metal/metal_model.cpp | 88 +++++ plugins/stk/voices/metal/metal_model.h | 86 ++++ plugins/stk/voices/metal/metal_processor.cpp | 51 +++ plugins/stk/voices/metal/metal_processor.h | 42 ++ plugins/stk/voices/moog/Makefile.am | 46 +++ plugins/stk/voices/moog/artwork.png | Bin 0 -> 71518 bytes plugins/stk/voices/moog/logo.png | Bin 0 -> 890 bytes plugins/stk/voices/moog/moog_instrument.cpp | 102 +++++ plugins/stk/voices/moog/moog_instrument.h | 46 +++ .../stk/voices/moog/moog_instrument_view.cpp | 100 +++++ .../stk/voices/moog/moog_instrument_view.h | 50 +++ plugins/stk/voices/moog/moog_model.cpp | 83 ++++ plugins/stk/voices/moog/moog_model.h | 79 ++++ plugins/stk/voices/moog/moog_processor.cpp | 50 +++ plugins/stk/voices/moog/moog_processor.h | 42 ++ plugins/stk/voices/percflute/Makefile.am | 46 +++ plugins/stk/voices/percflute/artwork.png | Bin 0 -> 71599 bytes plugins/stk/voices/percflute/logo.png | Bin 0 -> 890 bytes .../voices/percflute/percflute_instrument.cpp | 103 +++++ .../voices/percflute/percflute_instrument.h | 46 +++ .../percflute/percflute_instrument_view.cpp | 110 ++++++ .../percflute/percflute_instrument_view.h | 51 +++ .../stk/voices/percflute/percflute_model.cpp | 88 +++++ .../stk/voices/percflute/percflute_model.h | 86 ++++ .../voices/percflute/percflute_processor.cpp | 51 +++ .../voices/percflute/percflute_processor.h | 42 ++ plugins/stk/voices/resonate/Makefile.am | 46 +++ plugins/stk/voices/resonate/artwork.png | Bin 0 -> 71786 bytes plugins/stk/voices/resonate/logo.png | Bin 0 -> 890 bytes .../voices/resonate/resonate_instrument.cpp | 102 +++++ .../stk/voices/resonate/resonate_instrument.h | 46 +++ .../resonate/resonate_instrument_view.cpp | 100 +++++ .../resonate/resonate_instrument_view.h | 50 +++ .../stk/voices/resonate/resonate_model.cpp | 83 ++++ plugins/stk/voices/resonate/resonate_model.h | 79 ++++ .../voices/resonate/resonate_processor.cpp | 50 +++ .../stk/voices/resonate/resonate_processor.h | 42 ++ plugins/stk/voices/rhodey/Makefile.am | 46 +++ plugins/stk/voices/rhodey/artwork.png | Bin 0 -> 71756 bytes plugins/stk/voices/rhodey/logo.png | Bin 0 -> 890 bytes .../stk/voices/rhodey/rhodey_instrument.cpp | 103 +++++ plugins/stk/voices/rhodey/rhodey_instrument.h | 46 +++ .../voices/rhodey/rhodey_instrument_view.cpp | 110 ++++++ .../voices/rhodey/rhodey_instrument_view.h | 51 +++ plugins/stk/voices/rhodey/rhodey_model.cpp | 88 +++++ plugins/stk/voices/rhodey/rhodey_model.h | 86 ++++ .../stk/voices/rhodey/rhodey_processor.cpp | 51 +++ plugins/stk/voices/rhodey/rhodey_processor.h | 42 ++ plugins/stk/voices/src/stk_model.cpp | 122 ++++++ plugins/stk/voices/tubebell/Makefile.am | 46 +++ plugins/stk/voices/tubebell/artwork.png | Bin 0 -> 71446 bytes plugins/stk/voices/tubebell/logo.png | Bin 0 -> 890 bytes .../voices/tubebell/tubebell_instrument.cpp | 103 +++++ .../stk/voices/tubebell/tubebell_instrument.h | 46 +++ .../tubebell/tubebell_instrument_view.cpp | 110 ++++++ .../tubebell/tubebell_instrument_view.h | 51 +++ .../stk/voices/tubebell/tubebell_model.cpp | 88 +++++ plugins/stk/voices/tubebell/tubebell_model.h | 86 ++++ .../voices/tubebell/tubebell_processor.cpp | 51 +++ .../stk/voices/tubebell/tubebell_processor.h | 42 ++ plugins/stk/voices/wurley/Makefile.am | 46 +++ plugins/stk/voices/wurley/artwork.png | Bin 0 -> 71568 bytes plugins/stk/voices/wurley/logo.png | Bin 0 -> 890 bytes .../stk/voices/wurley/wurley_instrument.cpp | 103 +++++ plugins/stk/voices/wurley/wurley_instrument.h | 46 +++ .../voices/wurley/wurley_instrument_view.cpp | 110 ++++++ .../voices/wurley/wurley_instrument_view.h | 51 +++ plugins/stk/voices/wurley/wurley_model.cpp | 88 +++++ plugins/stk/voices/wurley/wurley_model.h | 86 ++++ .../stk/voices/wurley/wurley_processor.cpp | 51 +++ plugins/stk/voices/wurley/wurley_processor.h | 42 ++ 187 files changed, 11475 insertions(+), 12 deletions(-) create mode 100644 plugins/stk/voices/Makefile.am create mode 100644 plugins/stk/voices/b3/Makefile.am create mode 100644 plugins/stk/voices/b3/artwork.png create mode 100644 plugins/stk/voices/b3/b3_instrument.cpp create mode 100644 plugins/stk/voices/b3/b3_instrument.h create mode 100644 plugins/stk/voices/b3/b3_instrument_view.cpp create mode 100644 plugins/stk/voices/b3/b3_instrument_view.h create mode 100644 plugins/stk/voices/b3/b3_model.cpp create mode 100644 plugins/stk/voices/b3/b3_model.h create mode 100644 plugins/stk/voices/b3/b3_processor.cpp create mode 100644 plugins/stk/voices/b3/b3_processor.h create mode 100644 plugins/stk/voices/b3/logo.png create mode 100644 plugins/stk/voices/bandedwg/Makefile.am create mode 100644 plugins/stk/voices/bandedwg/artwork.png create mode 100644 plugins/stk/voices/bandedwg/bandedwg_instrument.cpp create mode 100644 plugins/stk/voices/bandedwg/bandedwg_instrument.h create mode 100644 plugins/stk/voices/bandedwg/bandedwg_instrument_view.cpp create mode 100644 plugins/stk/voices/bandedwg/bandedwg_instrument_view.h create mode 100644 plugins/stk/voices/bandedwg/bandedwg_model.cpp create mode 100644 plugins/stk/voices/bandedwg/bandedwg_model.h create mode 100644 plugins/stk/voices/bandedwg/bandedwg_processor.cpp create mode 100644 plugins/stk/voices/bandedwg/bandedwg_processor.h create mode 100644 plugins/stk/voices/bandedwg/logo.png create mode 100644 plugins/stk/voices/blow_bottle/Makefile.am create mode 100644 plugins/stk/voices/blow_bottle/artwork.png create mode 100644 plugins/stk/voices/blow_bottle/blow_bottle_instrument.cpp create mode 100644 plugins/stk/voices/blow_bottle/blow_bottle_instrument.h create mode 100644 plugins/stk/voices/blow_bottle/blow_bottle_instrument_view.cpp create mode 100644 plugins/stk/voices/blow_bottle/blow_bottle_instrument_view.h create mode 100644 plugins/stk/voices/blow_bottle/blow_bottle_model.cpp create mode 100644 plugins/stk/voices/blow_bottle/blow_bottle_model.h create mode 100644 plugins/stk/voices/blow_bottle/blow_bottle_processor.cpp create mode 100644 plugins/stk/voices/blow_bottle/blow_bottle_processor.h create mode 100644 plugins/stk/voices/blow_bottle/logo.png create mode 100644 plugins/stk/voices/blow_hole/Makefile.am create mode 100644 plugins/stk/voices/blow_hole/artwork.png create mode 100644 plugins/stk/voices/blow_hole/blow_hole_instrument.cpp create mode 100644 plugins/stk/voices/blow_hole/blow_hole_instrument.h create mode 100644 plugins/stk/voices/blow_hole/blow_hole_instrument_view.cpp create mode 100644 plugins/stk/voices/blow_hole/blow_hole_instrument_view.h create mode 100644 plugins/stk/voices/blow_hole/blow_hole_model.cpp create mode 100644 plugins/stk/voices/blow_hole/blow_hole_model.h create mode 100644 plugins/stk/voices/blow_hole/blow_hole_processor.cpp create mode 100644 plugins/stk/voices/blow_hole/blow_hole_processor.h create mode 100644 plugins/stk/voices/blow_hole/logo.png create mode 100644 plugins/stk/voices/bowed/Makefile.am create mode 100644 plugins/stk/voices/bowed/artwork.png create mode 100644 plugins/stk/voices/bowed/bowed_instrument.cpp create mode 100644 plugins/stk/voices/bowed/bowed_instrument.h create mode 100644 plugins/stk/voices/bowed/bowed_instrument_view.cpp create mode 100644 plugins/stk/voices/bowed/bowed_instrument_view.h create mode 100644 plugins/stk/voices/bowed/bowed_model.cpp create mode 100644 plugins/stk/voices/bowed/bowed_model.h create mode 100644 plugins/stk/voices/bowed/bowed_processor.cpp create mode 100644 plugins/stk/voices/bowed/bowed_processor.h create mode 100644 plugins/stk/voices/bowed/logo.png create mode 100644 plugins/stk/voices/brass/Makefile.am create mode 100644 plugins/stk/voices/brass/artwork.png create mode 100644 plugins/stk/voices/brass/brass_instrument.cpp create mode 100644 plugins/stk/voices/brass/brass_instrument.h create mode 100644 plugins/stk/voices/brass/brass_instrument_view.cpp create mode 100644 plugins/stk/voices/brass/brass_instrument_view.h create mode 100644 plugins/stk/voices/brass/brass_model.cpp create mode 100644 plugins/stk/voices/brass/brass_model.h create mode 100644 plugins/stk/voices/brass/brass_processor.cpp create mode 100644 plugins/stk/voices/brass/brass_processor.h create mode 100644 plugins/stk/voices/brass/logo.png create mode 100644 plugins/stk/voices/clarinet/Makefile.am create mode 100644 plugins/stk/voices/clarinet/artwork.png create mode 100644 plugins/stk/voices/clarinet/clarinet_instrument.cpp create mode 100644 plugins/stk/voices/clarinet/clarinet_instrument.h create mode 100644 plugins/stk/voices/clarinet/clarinet_instrument_view.cpp create mode 100644 plugins/stk/voices/clarinet/clarinet_instrument_view.h create mode 100644 plugins/stk/voices/clarinet/clarinet_model.cpp create mode 100644 plugins/stk/voices/clarinet/clarinet_model.h create mode 100644 plugins/stk/voices/clarinet/clarinet_processor.cpp create mode 100644 plugins/stk/voices/clarinet/clarinet_processor.h create mode 100644 plugins/stk/voices/clarinet/logo.png create mode 100644 plugins/stk/voices/flute/Makefile.am create mode 100644 plugins/stk/voices/flute/artwork.png create mode 100644 plugins/stk/voices/flute/flute_instrument.cpp create mode 100644 plugins/stk/voices/flute/flute_instrument.h create mode 100644 plugins/stk/voices/flute/flute_instrument_view.cpp create mode 100644 plugins/stk/voices/flute/flute_instrument_view.h create mode 100644 plugins/stk/voices/flute/flute_model.cpp create mode 100644 plugins/stk/voices/flute/flute_model.h create mode 100644 plugins/stk/voices/flute/flute_processor.cpp create mode 100644 plugins/stk/voices/flute/flute_processor.h create mode 100644 plugins/stk/voices/flute/logo.png create mode 100644 plugins/stk/voices/fmvoices/Makefile.am create mode 100644 plugins/stk/voices/fmvoices/artwork.png create mode 100644 plugins/stk/voices/fmvoices/fmvoices_instrument.cpp create mode 100644 plugins/stk/voices/fmvoices/fmvoices_instrument.h create mode 100644 plugins/stk/voices/fmvoices/fmvoices_instrument_view.cpp create mode 100644 plugins/stk/voices/fmvoices/fmvoices_instrument_view.h create mode 100644 plugins/stk/voices/fmvoices/fmvoices_model.cpp create mode 100644 plugins/stk/voices/fmvoices/fmvoices_model.h create mode 100644 plugins/stk/voices/fmvoices/fmvoices_processor.cpp create mode 100644 plugins/stk/voices/fmvoices/fmvoices_processor.h create mode 100644 plugins/stk/voices/fmvoices/logo.png create mode 100644 plugins/stk/voices/include/stk_instrument.h create mode 100644 plugins/stk/voices/include/stk_instrument_view.h create mode 100644 plugins/stk/voices/include/stk_model.h create mode 100644 plugins/stk/voices/include/stk_processor.h create mode 100644 plugins/stk/voices/include/stk_voice.h create mode 100644 plugins/stk/voices/metal/Makefile.am create mode 100644 plugins/stk/voices/metal/artwork.png create mode 100644 plugins/stk/voices/metal/logo.png create mode 100644 plugins/stk/voices/metal/metal_instrument.cpp create mode 100644 plugins/stk/voices/metal/metal_instrument.h create mode 100644 plugins/stk/voices/metal/metal_instrument_view.cpp create mode 100644 plugins/stk/voices/metal/metal_instrument_view.h create mode 100644 plugins/stk/voices/metal/metal_model.cpp create mode 100644 plugins/stk/voices/metal/metal_model.h create mode 100644 plugins/stk/voices/metal/metal_processor.cpp create mode 100644 plugins/stk/voices/metal/metal_processor.h create mode 100644 plugins/stk/voices/moog/Makefile.am create mode 100644 plugins/stk/voices/moog/artwork.png create mode 100644 plugins/stk/voices/moog/logo.png create mode 100644 plugins/stk/voices/moog/moog_instrument.cpp create mode 100644 plugins/stk/voices/moog/moog_instrument.h create mode 100644 plugins/stk/voices/moog/moog_instrument_view.cpp create mode 100644 plugins/stk/voices/moog/moog_instrument_view.h create mode 100644 plugins/stk/voices/moog/moog_model.cpp create mode 100644 plugins/stk/voices/moog/moog_model.h create mode 100644 plugins/stk/voices/moog/moog_processor.cpp create mode 100644 plugins/stk/voices/moog/moog_processor.h create mode 100644 plugins/stk/voices/percflute/Makefile.am create mode 100644 plugins/stk/voices/percflute/artwork.png create mode 100644 plugins/stk/voices/percflute/logo.png create mode 100644 plugins/stk/voices/percflute/percflute_instrument.cpp create mode 100644 plugins/stk/voices/percflute/percflute_instrument.h create mode 100644 plugins/stk/voices/percflute/percflute_instrument_view.cpp create mode 100644 plugins/stk/voices/percflute/percflute_instrument_view.h create mode 100644 plugins/stk/voices/percflute/percflute_model.cpp create mode 100644 plugins/stk/voices/percflute/percflute_model.h create mode 100644 plugins/stk/voices/percflute/percflute_processor.cpp create mode 100644 plugins/stk/voices/percflute/percflute_processor.h create mode 100644 plugins/stk/voices/resonate/Makefile.am create mode 100644 plugins/stk/voices/resonate/artwork.png create mode 100644 plugins/stk/voices/resonate/logo.png create mode 100644 plugins/stk/voices/resonate/resonate_instrument.cpp create mode 100644 plugins/stk/voices/resonate/resonate_instrument.h create mode 100644 plugins/stk/voices/resonate/resonate_instrument_view.cpp create mode 100644 plugins/stk/voices/resonate/resonate_instrument_view.h create mode 100644 plugins/stk/voices/resonate/resonate_model.cpp create mode 100644 plugins/stk/voices/resonate/resonate_model.h create mode 100644 plugins/stk/voices/resonate/resonate_processor.cpp create mode 100644 plugins/stk/voices/resonate/resonate_processor.h create mode 100644 plugins/stk/voices/rhodey/Makefile.am create mode 100644 plugins/stk/voices/rhodey/artwork.png create mode 100644 plugins/stk/voices/rhodey/logo.png create mode 100644 plugins/stk/voices/rhodey/rhodey_instrument.cpp create mode 100644 plugins/stk/voices/rhodey/rhodey_instrument.h create mode 100644 plugins/stk/voices/rhodey/rhodey_instrument_view.cpp create mode 100644 plugins/stk/voices/rhodey/rhodey_instrument_view.h create mode 100644 plugins/stk/voices/rhodey/rhodey_model.cpp create mode 100644 plugins/stk/voices/rhodey/rhodey_model.h create mode 100644 plugins/stk/voices/rhodey/rhodey_processor.cpp create mode 100644 plugins/stk/voices/rhodey/rhodey_processor.h create mode 100644 plugins/stk/voices/src/stk_model.cpp create mode 100644 plugins/stk/voices/tubebell/Makefile.am create mode 100644 plugins/stk/voices/tubebell/artwork.png create mode 100644 plugins/stk/voices/tubebell/logo.png create mode 100644 plugins/stk/voices/tubebell/tubebell_instrument.cpp create mode 100644 plugins/stk/voices/tubebell/tubebell_instrument.h create mode 100644 plugins/stk/voices/tubebell/tubebell_instrument_view.cpp create mode 100644 plugins/stk/voices/tubebell/tubebell_instrument_view.h create mode 100644 plugins/stk/voices/tubebell/tubebell_model.cpp create mode 100644 plugins/stk/voices/tubebell/tubebell_model.h create mode 100644 plugins/stk/voices/tubebell/tubebell_processor.cpp create mode 100644 plugins/stk/voices/tubebell/tubebell_processor.h create mode 100644 plugins/stk/voices/wurley/Makefile.am create mode 100644 plugins/stk/voices/wurley/artwork.png create mode 100644 plugins/stk/voices/wurley/logo.png create mode 100644 plugins/stk/voices/wurley/wurley_instrument.cpp create mode 100644 plugins/stk/voices/wurley/wurley_instrument.h create mode 100644 plugins/stk/voices/wurley/wurley_instrument_view.cpp create mode 100644 plugins/stk/voices/wurley/wurley_instrument_view.h create mode 100644 plugins/stk/voices/wurley/wurley_model.cpp create mode 100644 plugins/stk/voices/wurley/wurley_model.h create mode 100644 plugins/stk/voices/wurley/wurley_processor.cpp create mode 100644 plugins/stk/voices/wurley/wurley_processor.h diff --git a/ChangeLog b/ChangeLog index 37c6e031c..dad6c29e6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,204 @@ * src/core/song_editor.cpp: Some of the files have been renamed, so I updated the include references to get the build to work again. + + * include/basic_filters.h: + Added the ability to clear the filter taps to support + a LPF where the threshold is set by the velocity of + the note. + + * configure.in: + * plugins/stk/voices/resonate/resonate_processor.h: + * plugins/stk/voices/voices/resonate/resonate_instrument.h: + * plugins/stk/voices/voices/resonate/resonate_model.cpp: + * plugins/stk/voices/voices/resonate/resonate_instrument_view.cpp: + * plugins/stk/voices/voices/resonate/artwork.png: + * plugins/stk/voices/voices/resonate/resonate_processor.cpp: + * plugins/stk/voices/voices/resonate/resonate_instrument_view.h: + * plugins/stk/voices/voices/resonate/resonate_instrument.cpp: + * plugins/stk/voices/voices/resonate/logo.png: + * plugins/stk/voices/voices/resonate/resonate_model.h: + * plugins/stk/voices/voices/resonate/Makefile.am: + * plugins/stk/voices/voices/flute/artwork.png: + * plugins/stk/voices/voices/flute/flute_processor.cpp: + * plugins/stk/voices/voices/flute/flute_instrument_view.h: + * plugins/stk/voices/voices/flute/flute_model.h: + * plugins/stk/voices/voices/flute/flute_processor.h: + * plugins/stk/voices/voices/flute/flute_model.cpp: + * plugins/stk/voices/voices/flute/logo.png: + * plugins/stk/voices/voices/flute/flute_instrument.h: + * plugins/stk/voices/voices/flute/Makefile.am: + * plugins/stk/voices/voices/flute/flute_instrument_view.cpp: + * plugins/stk/voices/voices/flute/flute_instrument.cpp: + * plugins/stk/voices/voices/metal/metal_processor.h: + * plugins/stk/voices/voices/metal/metal_instrument.cpp: + * plugins/stk/voices/voices/metal/metal_processor.cpp: + * plugins/stk/voices/voices/metal/artwork.png: + * plugins/stk/voices/voices/metal/metal_instrument_view.cpp: + * plugins/stk/voices/voices/metal/metal_instrument.h: + * plugins/stk/voices/voices/metal/logo.png: + * plugins/stk/voices/voices/metal/metal_instrument_view.h: + * plugins/stk/voices/voices/metal/metal_model.cpp: + * plugins/stk/voices/voices/metal/Makefile.am: + * plugins/stk/voices/voices/metal/metal_model.h: + * plugins/stk/voices/voices/fmvoices/fmvoices_instrument.cpp: + * plugins/stk/voices/voices/fmvoices/fmvoices_processor.h: + * plugins/stk/voices/voices/fmvoices/fmvoices_instrument.h: + * plugins/stk/voices/voices/fmvoices/artwork.png: + * plugins/stk/voices/voices/fmvoices/fmvoices_instrument_view.h: + * plugins/stk/voices/voices/fmvoices/fmvoices_instrument_view.cpp: + * plugins/stk/voices/voices/fmvoices/logo.png: + * plugins/stk/voices/voices/fmvoices/fmvoices_processor.cpp: + * plugins/stk/voices/voices/fmvoices/fmvoices_model.cpp: + * plugins/stk/voices/voices/fmvoices/fmvoices_model.h: + * plugins/stk/voices/voices/fmvoices/Makefile.am: + * plugins/stk/voices/voices/moog/moog_instrument_view.h: + * plugins/stk/voices/voices/moog/moog_instrument_view.cpp: + * plugins/stk/voices/voices/moog/moog_model.cpp: + * plugins/stk/voices/voices/moog/moog_processor.h: + * plugins/stk/voices/voices/moog/artwork.png: + * plugins/stk/voices/voices/moog/logo.png: + * plugins/stk/voices/voices/moog/moog_model.h: + * plugins/stk/voices/voices/moog/moog_instrument.h: + * plugins/stk/voices/voices/moog/moog_instrument.cpp: + * plugins/stk/voices/voices/moog/moog_processor.cpp: + * plugins/stk/voices/voices/moog/Makefile.am: + * plugins/stk/voices/voices/include/stk_instrument_view.h: + * plugins/stk/voices/voices/include/stk_voice.h: + * plugins/stk/voices/voices/include/stk_instrument.h: + * plugins/stk/voices/voices/include/stk_model.h: + * plugins/stk/voices/voices/include/stk_processor.h: + * plugins/stk/voices/voices/wurley/wurley_instrument.h: + * plugins/stk/voices/voices/wurley/wurley_instrument_view.cpp: + * plugins/stk/voices/voices/wurley/wurley_model.cpp: + * plugins/stk/voices/voices/wurley/wurley_instrument_view.h: + * plugins/stk/voices/voices/wurley/wurley_model.h: + * plugins/stk/voices/voices/wurley/artwork.png: + * plugins/stk/voices/voices/wurley/wurley_processor.h: + * plugins/stk/voices/voices/wurley/logo.png: + * plugins/stk/voices/voices/wurley/Makefile.am: + * plugins/stk/voices/voices/wurley/wurley_processor.cpp: + * plugins/stk/voices/voices/wurley/wurley_instrument.cpp: + * plugins/stk/voices/voices/bowed/bowed_instrument.cpp: + * plugins/stk/voices/voices/bowed/bowed_model.cpp: + * plugins/stk/voices/voices/bowed/bowed_instrument_view.cpp: + * plugins/stk/voices/voices/bowed/bowed_model.h: + * plugins/stk/voices/voices/bowed/bowed_processor.h: + * plugins/stk/voices/voices/bowed/artwork.png: + * plugins/stk/voices/voices/bowed/bowed_processor.cpp: + * plugins/stk/voices/voices/bowed/logo.png: + * plugins/stk/voices/voices/bowed/bowed_instrument_view.h: + * plugins/stk/voices/voices/bowed/Makefile.am: + * plugins/stk/voices/voices/bowed/bowed_instrument.h: + * plugins/stk/voices/voices/blow_hole/blow_hole_instrument.cpp: + * plugins/stk/voices/voices/blow_hole/blow_hole_instrument_view.cpp: + * plugins/stk/voices/voices/blow_hole/artwork.png: + * plugins/stk/voices/voices/blow_hole/blow_hole_model.h: + * plugins/stk/voices/voices/blow_hole/blow_hole_processor.h: + * plugins/stk/voices/voices/blow_hole/logo.png: + * plugins/stk/voices/voices/blow_hole/blow_hole_processor.cpp: + * plugins/stk/voices/voices/blow_hole/blow_hole_instrument_view.h: + * plugins/stk/voices/voices/blow_hole/blow_hole_model.cpp: + * plugins/stk/voices/voices/blow_hole/Makefile.am: + * plugins/stk/voices/voices/blow_hole/blow_hole_instrument.h: + * plugins/stk/voices/voices/rhodey/rhodey_instrument_view.h: + * plugins/stk/voices/voices/rhodey/rhodey_processor.h: + * plugins/stk/voices/voices/rhodey/rhodey_processor.cpp: + * plugins/stk/voices/voices/rhodey/rhodey_instrument_view.cpp: + * plugins/stk/voices/voices/rhodey/artwork.png: + * plugins/stk/voices/voices/rhodey/rhodey_model.cpp: + * plugins/stk/voices/voices/rhodey/rhodey_model.h: + * plugins/stk/voices/voices/rhodey/rhodey_instrument.h: + * plugins/stk/voices/voices/rhodey/logo.png: + * plugins/stk/voices/voices/rhodey/rhodey_instrument.cpp: + * plugins/stk/voices/voices/rhodey/Makefile.am: + * plugins/stk/voices/voices/tubebell/tubebell_processor.cpp: + * plugins/stk/voices/voices/tubebell/tubebell_instrument_view.h: + * plugins/stk/voices/voices/tubebell/artwork.png: + * plugins/stk/voices/voices/tubebell/tubebell_instrument.h: + * plugins/stk/voices/voices/tubebell/tubebell_instrument.cpp: + * plugins/stk/voices/voices/tubebell/tubebell_model.h: + * plugins/stk/voices/voices/tubebell/logo.png: + * plugins/stk/voices/voices/tubebell/tubebell_model.cpp: + * plugins/stk/voices/voices/tubebell/tubebell_instrument_view.cpp: + * plugins/stk/voices/voices/tubebell/Makefile.am: + * plugins/stk/voices/voices/tubebell/tubebell_processor.h: + * plugins/stk/voices/voices/clarinet/clarinet_instrument.cpp: + * plugins/stk/voices/voices/clarinet/artwork.png: + * plugins/stk/voices/voices/clarinet/clarinet_processor.h: + * plugins/stk/voices/voices/clarinet/clarinet_processor.cpp: + * plugins/stk/voices/voices/clarinet/clarinet_instrument.h: + * plugins/stk/voices/voices/clarinet/clarinet_model.cpp: + * plugins/stk/voices/voices/clarinet/logo.png: + * plugins/stk/voices/voices/clarinet/clarinet_instrument_view.cpp: + * plugins/stk/voices/voices/clarinet/clarinet_model.h: + * plugins/stk/voices/voices/clarinet/Makefile.am: + * plugins/stk/voices/voices/clarinet/clarinet_instrument_view.h: + * plugins/stk/voices/voices/b3/b3_instrument.cpp: + * plugins/stk/voices/voices/b3/b3_model.h: + * plugins/stk/voices/voices/b3/b3_model.cpp: + * plugins/stk/voices/voices/b3/artwork.png: + * plugins/stk/voices/voices/b3/b3_instrument_view.h: + * plugins/stk/voices/voices/b3/logo.png: + * plugins/stk/voices/voices/b3/b3_processor.h: + * plugins/stk/voices/voices/b3/b3_instrument_view.cpp: + * plugins/stk/voices/voices/b3/b3_instrument.h: + * plugins/stk/voices/voices/b3/b3_processor.cpp: + * plugins/stk/voices/voices/b3/Makefile.am: + * plugins/stk/voices/voices/src/stk_model.cpp: + * plugins/stk/voices/voices/percflute/percflute_instrument.h: + * plugins/stk/voices/voices/percflute/percflute_model.h: + * plugins/stk/voices/voices/percflute/percflute_instrument_view.h: + * plugins/stk/voices/voices/percflute/percflute_processor.cpp: + * plugins/stk/voices/voices/percflute/percflute_processor.h: + * plugins/stk/voices/voices/percflute/artwork.png: + * plugins/stk/voices/voices/percflute/percflute_instrument_view.cpp: + * plugins/stk/voices/voices/percflute/percflute_instrument.cpp: + * plugins/stk/voices/voices/percflute/logo.png: + * plugins/stk/voices/voices/percflute/percflute_model.cpp: + * plugins/stk/voices/voices/percflute/Makefile.am: + * plugins/stk/voices/voices/blow_bottle/blow_bottle_processor.cpp: + * plugins/stk/voices/voices/blow_bottle/blow_bottle_model.h: + * plugins/stk/voices/voices/blow_bottle/blow_bottle_model.cpp: + * plugins/stk/voices/voices/blow_bottle/artwork.png: + * plugins/stk/voices/voices/blow_bottle/blow_bottle_processor.h: + * plugins/stk/voices/voices/blow_bottle/blow_bottle_instrument.h: + * plugins/stk/voices/voices/blow_bottle/blow_bottle_instrument_view.cpp: + * plugins/stk/voices/voices/blow_bottle/logo.png: + * plugins/stk/voices/voices/blow_bottle/blow_bottle_instrument_view.h: + * plugins/stk/voices/voices/blow_bottle/blow_bottle_instrument.cpp: + * plugins/stk/voices/voices/blow_bottle/Makefile.am: + * plugins/stk/voices/voices/Makefile.am: + * plugins/stk/voices/voices/brass/brass_instrument_view.h: + * plugins/stk/voices/voices/brass/brass_instrument.cpp: + * plugins/stk/voices/voices/brass/brass_processor.h: + * plugins/stk/voices/voices/brass/brass_processor.cpp: + * plugins/stk/voices/voices/brass/brass_instrument_view.cpp: + * plugins/stk/voices/voices/brass/artwork.png: + * plugins/stk/voices/voices/brass/brass_instrument.h: + * plugins/stk/voices/voices/brass/logo.png: + * plugins/stk/voices/voices/brass/brass_model.cpp: + * plugins/stk/voices/voices/brass/brass_model.h: + * plugins/stk/voices/voices/brass/Makefile.am: + * plugins/stk/voices/voices/bandedwg/bandedwg_processor.h: + * plugins/stk/voices/voices/bandedwg/bandedwg_instrument_view.h: + * plugins/stk/voices/voices/bandedwg/bandedwg_processor.cpp: + * plugins/stk/voices/voices/bandedwg/artwork.png: + * plugins/stk/voices/voices/bandedwg/bandedwg_model.h: + * plugins/stk/voices/voices/bandedwg/bandedwg_instrument.h: + * plugins/stk/voices/voices/bandedwg/bandedwg_instrument.cpp: + * plugins/stk/voices/voices/bandedwg/bandedwg_instrument_view.cpp: + * plugins/stk/voices/voices/bandedwg/logo.png: + * plugins/stk/voices/voices/bandedwg/bandedwg_model.cpp: + * plugins/stk/voices/voices/bandedwg/Makefile.am: + Started working on a multitimbral instrument that uses all of the + voices available in STK. Need to work out the differences in + level among the voices and figure out what the controls actually + do. Simplist way to do that was to build them as individual + instruments first. The models, views, and processors should be + reusable for the larger instrument. Except for bandedwg and + flute they all work, so if you're curious, add "voices" to the + Makefile.am in plugins/stk to get them to build. 2007-01-30 Paul Giblock * plugins/organic/organic.cpp: diff --git a/configure.in b/configure.in index ec73a9e28..0c8b1edc7 100644 --- a/configure.in +++ b/configure.in @@ -658,6 +658,23 @@ AC_CONFIG_FILES([Makefile plugins/singerbot/Makefile plugins/stk/Makefile plugins/stk/mallets/Makefile + plugins/stk/voices/Makefile + plugins/stk/voices/b3/Makefile + plugins/stk/voices/bandedwg/Makefile + plugins/stk/voices/blow_bottle/Makefile + plugins/stk/voices/blow_hole/Makefile + plugins/stk/voices/bowed/Makefile + plugins/stk/voices/brass/Makefile + plugins/stk/voices/clarinet/Makefile + plugins/stk/voices/flute/Makefile + plugins/stk/voices/fmvoices/Makefile + plugins/stk/voices/metal/Makefile + plugins/stk/voices/moog/Makefile + plugins/stk/voices/percflute/Makefile + plugins/stk/voices/resonate/Makefile + plugins/stk/voices/rhodey/Makefile + plugins/stk/voices/tubebell/Makefile + plugins/stk/voices/wurley/Makefile plugins/triple_oscillator/Makefile plugins/vestige/Makefile plugins/vibed/Makefile diff --git a/include/basic_filters.h b/include/basic_filters.h index 1f4856446..6dc697519 100644 --- a/include/basic_filters.h +++ b/include/basic_filters.h @@ -92,17 +92,7 @@ public: m_sampleRate( _sample_rate ), m_subFilter( NULL ) { - // reset in/out history - for( ch_cnt_t _chnl = 0; _chnl < CHANNELS; ++_chnl ) - { - // reset in/out history for simple filters - m_ou1[_chnl] = m_ou2[_chnl] = m_in1[_chnl] = - m_in2[_chnl] = 0.0f; - // reset in/out historey for moog-filter - m_y1[_chnl] = m_y2[_chnl] = m_y3[_chnl] = m_y4[_chnl] = - m_oldx[_chnl] = m_oldy1[_chnl] = - m_oldy2[_chnl] = m_oldy3[_chnl] = 0.0f; - } + clearHistory(); } inline ~basicFilters() @@ -110,6 +100,21 @@ public: delete m_subFilter; } + inline void clearHistory( void ) + { + // reset in/out history + for( ch_cnt_t _chnl = 0; _chnl < CHANNELS; ++_chnl ) + { + // reset in/out history for simple filters + m_ou1[_chnl] = m_ou2[_chnl] = m_in1[_chnl] = + m_in2[_chnl] = 0.0f; + // reset in/out historey for moog-filter + m_y1[_chnl] = m_y2[_chnl] = m_y3[_chnl] = m_y4[_chnl] = + m_oldx[_chnl] = m_oldy1[_chnl] = + m_oldy2[_chnl] = m_oldy3[_chnl] = 0.0f; + } + } + inline sample_t update( sample_t _in0, ch_cnt_t _chnl ) { sample_t out; diff --git a/plugins/stk/Makefile.am b/plugins/stk/Makefile.am index 243a8fd79..4eb93be39 100644 --- a/plugins/stk/Makefile.am +++ b/plugins/stk/Makefile.am @@ -1 +1,2 @@ -SUBDIRS = mallets +SUBDIRS = mallets +# voices \ No newline at end of file diff --git a/plugins/stk/voices/Makefile.am b/plugins/stk/voices/Makefile.am new file mode 100644 index 000000000..1e547a463 --- /dev/null +++ b/plugins/stk/voices/Makefile.am @@ -0,0 +1,16 @@ +SUBDIRS = b3 \ + bandedwg \ + blow_bottle \ + blow_hole \ + bowed \ + brass \ + clarinet \ + flute \ + fmvoices \ + metal \ + moog \ + percflute \ + resonate \ + rhodey \ + tubebell \ + wurley diff --git a/plugins/stk/voices/b3/Makefile.am b/plugins/stk/voices/b3/Makefile.am new file mode 100644 index 000000000..14cf364ed --- /dev/null +++ b/plugins/stk/voices/b3/Makefile.am @@ -0,0 +1,46 @@ +AUTOMAKE_OPTIONS = foreign 1.4 + + +INCLUDES = -I@stk_includes@ -I$(top_srcdir)/include -I$(top_srcdir)/src/lib -I. -I$(top_srcdir)/plugins/stk/voices/include + + +AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="b3" + + +%.moc: ./%.h + $(MOC) -o $@ $< + + +MOC_FILES = ./b3_model.moc + +BUILT_SOURCES = $(MOC_FILES) ./embedded_resources.h +EMBEDDED_RESOURCES = $(wildcard *png) + +./embedded_resources.h: $(EMBEDDED_RESOURCES) + $(BIN2RES) $(EMBEDDED_RESOURCES) > $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES = libb3.la + +libb3_la_SOURCES = b3_model.cpp \ + b3_model.h \ + b3_processor.cpp \ + b3_processor.h \ + b3_instrument.cpp \ + b3_instrument.h \ + b3_instrument_view.cpp \ + b3_instrument_view.h \ + $(top_srcdir)/plugins/stk/voices/src/stk_model.cpp \ + stk_model.h + + + +libb3_la_LDFLAGS = -L@stk_lib@ -lstk -Wl,-export-dynamic + +$(libb3_la_SOURCES): ./embedded_resources.h diff --git a/plugins/stk/voices/b3/artwork.png b/plugins/stk/voices/b3/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..b843c16ecc8db62f68b610e1a339be6cccf43ae5 GIT binary patch literal 70825 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 Dtgwot literal 0 HcmV?d00001 diff --git a/plugins/stk/voices/b3/b3_instrument.cpp b/plugins/stk/voices/b3/b3_instrument.cpp new file mode 100644 index 000000000..d1e621486 --- /dev/null +++ b/plugins/stk/voices/b3/b3_instrument.cpp @@ -0,0 +1,103 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "engine.h" +#include "note_play_handle.h" + +#include "b3_instrument.h" +#include "b3_instrument_view.h" +#include "b3_processor.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embedded_resources.h" + + +extern "C" +{ + +plugin::descriptor b3_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "B3", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Organ noises" ), + "Danny McRae ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + +b3Instrument::b3Instrument( instrumentTrack * _channel_track ): + stkInstrument( _channel_track, &b3_plugin_descriptor ) +{ + model()->operator4()->setTrack( _channel_track ); + model()->operator3()->setTrack( _channel_track ); + model()->lfoSpeed()->setTrack( _channel_track ); + model()->lfoDepth()->setTrack( _channel_track ); + model()->adsrTarget()->setTrack( _channel_track ); +} + + + + +b3Instrument::~b3Instrument() +{ +} + + + + +QString b3Instrument::nodeName( void ) const +{ + return( b3_plugin_descriptor.name ); +} + + + + +pluginView * b3Instrument::instantiateView( QWidget * _parent ) +{ + return( new b3InstrumentView( this, _parent ) ); +} + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( model * _model, void * _data ) +{ + return( new b3Instrument( static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/stk/voices/b3/b3_instrument.h b/plugins/stk/voices/b3/b3_instrument.h new file mode 100644 index 000000000..405f699e4 --- /dev/null +++ b/plugins/stk/voices/b3/b3_instrument.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _B3_INSTRUMENT_H +#define _B3_INSTRUMENT_H + +#include "stk_instrument.h" + +#include "b3_processor.h" +#include "b3_model.h" + + +class b3Instrument : public stkInstrument +{ +public: + b3Instrument( instrumentTrack * _channel_track ); + virtual ~b3Instrument( void ); + + QString nodeName( void ) const; + + pluginView * instantiateView( QWidget * _parent ); +}; + +#endif diff --git a/plugins/stk/voices/b3/b3_instrument_view.cpp b/plugins/stk/voices/b3/b3_instrument_view.cpp new file mode 100644 index 000000000..459bafab4 --- /dev/null +++ b/plugins/stk/voices/b3/b3_instrument_view.cpp @@ -0,0 +1,110 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include +#include +#include + +#include "b3_instrument_view.h" + +#include +#include + +#include "engine.h" +#include "gui_templates.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +b3InstrumentView::b3InstrumentView( b3Instrument * _instrument, QWidget * _parent ) : + stkInstrumentView( _instrument, _parent ) +{ + QVBoxLayout * vl = new QVBoxLayout( m_topView ); + QHBoxLayout * h1 = new QHBoxLayout(); + QHBoxLayout * h2 = new QHBoxLayout(); + QHBoxLayout * h3 = new QHBoxLayout(); + + + m_operator4 = new knob( knobSmall_17, m_topView, tr( "Operator 4" ) ); + m_operator4->setLabel( tr( "Operator 4" ) ); + m_operator4->setHintText( tr( "Operator 4:" ) + " ", "" ); + + m_operator3 = new knob( knobSmall_17, m_topView, tr( "Operator 3" ) ); + m_operator3->setLabel( tr( "Operator 3" ) ); + m_operator3->setHintText( tr( "Operator 3:" ) + " ", "" ); + + m_lfoSpeed = new knob( knobSmall_17, m_topView, tr( "LFO Speed" ) ); + m_lfoSpeed->setLabel( tr( "LFO Speed" ) ); + m_lfoSpeed->setHintText( tr( "LFO Speed:" ) + " ", "" ); + + m_lfoDepth = new knob( knobSmall_17, m_topView, tr( "LFO Depth" ) ); + m_lfoDepth->setLabel( tr( "LFO Depth" ) ); + m_lfoDepth->setHintText( tr( "LFO Depth:" ) + " ", "" ); + + m_adsrTarget = new knob( knobSmall_17, m_topView, tr( "ADSR Target" ) ); + m_adsrTarget->setLabel( tr( "ADSR Target" ) ); + m_adsrTarget->setHintText( tr( "ADSR Target:" ) + " ", "" ); + + h1->addWidget( m_operator4 ); + h1->addWidget( m_operator3 ); + + h2->addWidget( m_lfoSpeed ); + h2->addWidget( m_lfoDepth ); + + h3->addWidget( m_adsrTarget ); + + vl->addLayout( h1 ); + vl->addLayout( h2 ); + vl->addLayout( h3 ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); +} + + + + +b3InstrumentView::~b3InstrumentView() +{ +} + + + + +void b3InstrumentView::modelChanged( void ) +{ + stkInstrumentView::modelChanged(); + + b3Instrument * inst = castModel(); + m_operator4->setModel( inst->model()->operator4() ); + m_operator3->setModel( inst->model()->operator3() ); + m_lfoSpeed->setModel( inst->model()->lfoSpeed() ); + m_lfoDepth->setModel( inst->model()->lfoDepth() ); + m_adsrTarget->setModel( inst->model()->adsrTarget() ); +} + + + diff --git a/plugins/stk/voices/b3/b3_instrument_view.h b/plugins/stk/voices/b3/b3_instrument_view.h new file mode 100644 index 000000000..4757163bc --- /dev/null +++ b/plugins/stk/voices/b3/b3_instrument_view.h @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _B3_INSTRUMENT_VIEW_H +#define _B3_INSTRUMENT_VIEW_H + +#include "knob.h" + +#include "stk_instrument_view.h" +#include "b3_instrument.h" + + +class b3InstrumentView: public stkInstrumentView +{ +public: + b3InstrumentView( b3Instrument * _instrument, QWidget * _parent ); + virtual ~b3InstrumentView( void ); + +private: + virtual void modelChanged( void ); + + knob * m_operator4; + knob * m_operator3; + knob * m_lfoSpeed; + knob * m_lfoDepth; + knob * m_adsrTarget; +}; + +#endif diff --git a/plugins/stk/voices/b3/b3_model.cpp b/plugins/stk/voices/b3/b3_model.cpp new file mode 100644 index 000000000..a1738546f --- /dev/null +++ b/plugins/stk/voices/b3/b3_model.cpp @@ -0,0 +1,88 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "b3_model.h" + + +b3Model::b3Model( bool _monophonic, + StkFloat _portamento, + StkFloat _bend, + StkFloat _bend_range, + bool _velocity_sensitive_lpf, + StkFloat _velocity_sensitive_q, + StkFloat _volume, + StkFloat _pan, + StkFloat _spread, + StkFloat _operator4, + StkFloat _operator3, + StkFloat _lfo_speed, + StkFloat _lfo_depth, + StkFloat _adsr_target ): + stkModel( _monophonic, _portamento, _bend, _bend_range, _velocity_sensitive_lpf, _velocity_sensitive_q, _volume, _pan, _spread ), + m_operator4( new floatModel( _operator4, 0.0f, 128.0f, 0.1f, this ) ), + m_operator3( new floatModel( _operator3, 0.0f, 128.0f, 0.1f, this ) ), + m_lfoSpeed( new floatModel( _lfo_speed, 0.0f, 128.0f, 0.1f, this ) ), + m_lfoDepth( new floatModel( _lfo_depth, 0.0f, 128.0f, 0.1f, this ) ), + m_adsrTarget( new floatModel( _adsr_target, 0.0f, 128.0f, 0.1f, this ) ) +{ +} + + + + +b3Model::~b3Model() +{ + delete m_operator4; + delete m_operator3; + delete m_lfoSpeed; + delete m_lfoDepth; + delete m_adsrTarget; +} + + + + +void FASTCALL b3Model::saveSettings( QDomDocument & _doc, QDomElement & _parent ) +{ + stkModel::saveSettings( _doc, _parent ); + m_operator4->saveSettings( _doc, _parent, "operator4" ); + m_operator3->saveSettings( _doc, _parent, "operator3" ); + m_lfoSpeed->saveSettings( _doc, _parent, "lfospeed" ); + m_lfoDepth->saveSettings( _doc, _parent, "lfodepth" ); + m_adsrTarget->saveSettings( _doc, _parent, "adsrtarget" ); +} + + + + +void FASTCALL b3Model::loadSettings( const QDomElement & _this ) +{ + stkModel::loadSettings( _this ); + m_operator4->loadSettings( _this, "operator4" ); + m_operator3->loadSettings( _this, "operator3" ); + m_lfoSpeed->loadSettings( _this, "lfospeed" ); + m_lfoDepth->loadSettings( _this, "lfodepth" ); + m_adsrTarget->loadSettings( _this, "adsrtarget" ); +} + diff --git a/plugins/stk/voices/b3/b3_model.h b/plugins/stk/voices/b3/b3_model.h new file mode 100644 index 000000000..d427c1fa8 --- /dev/null +++ b/plugins/stk/voices/b3/b3_model.h @@ -0,0 +1,86 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _B3_MODEL_H +#define _B3_MODEL_H + +#include "stk_model.h" + + +class b3Model: public stkModel +{ +public: + b3Model( bool _monophonic = FALSE, + StkFloat _portamento = 0.0f, + StkFloat _bend = 0.0f, + StkFloat _bend_range = 2.0f, + bool _velocity_sensitive_lpf = TRUE, + StkFloat _velocity_sensitive_q = 0.5f, + StkFloat _volume = 1.0f, + StkFloat _pan = 0.0f, + StkFloat _spread = 0.0f, + StkFloat _operator4 = 64.0f, + StkFloat _operator3 = 64.0f, + StkFloat _lfo_speed = 64.0f, + StkFloat _lfo_depth = 64.0f, + StkFloat _adsr_target = 64.0f ); + ~b3Model(); + + inline floatModel * operator4( void ) const + { + return( m_operator4 ); + } + + inline floatModel * operator3( void ) const + { + return( m_operator3 ); + } + + inline floatModel * lfoSpeed( void ) + { + return( m_lfoSpeed ); + } + + inline floatModel * lfoDepth( void ) const + { + return( m_lfoDepth ); + } + + inline floatModel * adsrTarget( void ) const + { + return( m_adsrTarget ); + } + + void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _parent ); + + void FASTCALL loadSettings( const QDomElement & _this ); + +private: + floatModel * m_operator4; + floatModel * m_operator3; + floatModel * m_lfoSpeed; + floatModel * m_lfoDepth; + floatModel * m_adsrTarget; +}; + +#endif diff --git a/plugins/stk/voices/b3/b3_processor.cpp b/plugins/stk/voices/b3/b3_processor.cpp new file mode 100644 index 000000000..e05ff7eb7 --- /dev/null +++ b/plugins/stk/voices/b3/b3_processor.cpp @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include "b3_processor.h" +#include "config_mgr.h" + + +b3Processor::b3Processor( sample_rate_t _sample_rate ): + stkProcessor( _sample_rate ) +{ +} + + + + +b3Processor::~b3Processor() +{ +} + + + + +void b3Processor::setControls( b3Model * _model ) +{ + voice()->controlChange( 2, _model->operator4()->value() ); + voice()->controlChange( 4, _model->operator3()->value() ); + voice()->controlChange( 11, _model->lfoSpeed()->value() ); + voice()->controlChange( 1, _model->lfoDepth()->value() ); + voice()->controlChange( 128, _model->adsrTarget()->value() ); + m_delayRead = m_delayWrite - static_cast( _model->spread()->value() ); +} diff --git a/plugins/stk/voices/b3/b3_processor.h b/plugins/stk/voices/b3/b3_processor.h new file mode 100644 index 000000000..df225bc7f --- /dev/null +++ b/plugins/stk/voices/b3/b3_processor.h @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _B3_PROCESSOR_H +#define _B3_PROCESSOR_H + +#include "BeeThree.h" + +#include "stk_processor.h" + +#include "b3_model.h" + +class b3Processor: public stkProcessor +{ +public: + b3Processor( sample_rate_t _sample_rate ); + ~b3Processor( void ); + + void setControls( b3Model * _model ); +}; + +#endif diff --git a/plugins/stk/voices/b3/logo.png b/plugins/stk/voices/b3/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..20a6081015e8b76b4f4e96a40f8c624e5aaeb64c GIT binary patch literal 890 zcmV-=1BLvFP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4z z76CcTyF*|A00R0+L_t(&-tCuNXpUhR$N&4;%#hD~)Mm=ph7?Eh5h2az5iw502@WWx zq!cx3lBBlQlF|+okrS-pz)qMrkPvp_YcU@+8_TfWuaoPor^oAkpNIFrbpPw=eeUc2 z-~a2rp8LM9>wcww5H&S5In~wGIqI*dtE=n3llSoO@bK{P@bK{HKltU|4U|aQENPLX z5=p})B_w^6)GDb(Qlq5X&bb6|L(;N8@cmiR2OX`#~DrpbRZIGk}NgE{f zN!lIk90Jq>eLy0@Gsecfi^vZ@H$#(KZ}w}cq6NkQcZ|~stdOK!>&%yQUDA9>PbAe! zYL@g;Qjesek|s);Eorf&DbBeMlH{Blm%`b2NpB^6a?Xv6xFYlHw+xuRuikEHr zU{c`x?Mo+e1X!EF(P-d-iS13p+i0B2F$>tk-}JAxtk?@I$+Tzh0o#D7K%Q-xQeY48 z#yF3Ff;1C4YP`cS3)rbNoT@;IElfq|ig^9Ko9V6;sG#d&7O<@u&egSK1_biLgz5H` z&)XO7uqEpTo&y(w3LrPagxbx~ $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES = libbandedwg.la + +libbandedwg_la_SOURCES = bandedwg_model.cpp \ + bandedwg_model.h \ + bandedwg_processor.cpp \ + bandedwg_processor.h \ + bandedwg_instrument.cpp \ + bandedwg_instrument.h \ + bandedwg_instrument_view.cpp \ + bandedwg_instrument_view.h \ + $(top_srcdir)/plugins/stk/voices/src/stk_model.cpp \ + stk_model.h + + + +libbandedwg_la_LDFLAGS = -L@stk_lib@ -lstk -Wl,-export-dynamic + +$(libbandedwg_la_SOURCES): ./embedded_resources.h diff --git a/plugins/stk/voices/bandedwg/artwork.png b/plugins/stk/voices/bandedwg/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..7178e5a769147f32cb2b79947b87c189590262f7 GIT binary patch literal 73241 zcmXt91yodByB@kbzM-U3NNoiw_z$wF zf{Y~O>G|)M_L4+!1aWM8e73#Kqi<>XVhr2P%yZ=2S9rN-D=@^!5-46+})_T*G}~xZR`1Tr-{V zR?kc5O!(7_)8$M#7z3I+S(<&sq-i(Vu&LUwm%j4tnzhTQ!n;)Vxw;gqFVOBC1k?vVxnCzeU zE&sO9-iEAP-TCHTAN+Vcm}<03D@LP6d`eV1oi%~d$l>$HAV6dj5Fy4o#NC`hCQw|M zzo8@fnHPB3P%W+$9(i9t624VNH;)py(!+WEDF~Mn69HUkw0m5rWknQ+EH;`f@=owb zk@wx>K)^k$GVX8crFHcZ=)&?*!L9BrW>F!Hc4rqPApxA2)InnGsR)qoRgr3C=jA#W z4@c>K3b~exyoE{NzA+nAa`=zlp4g7$J+-WcCAjcb8K*nrmXprKSI!3ig_uyG!b89f zHdgZ5C9fn<1DGPfgD235llRF^Ce2Rmxm>sG8jj^~DkUB}yN!-LwN^#)$KXlfDNb(g z;D%7ELE?Rh)#N2rgCynq>DKOE76ona`{c@9O>$yNs{Ry3fK2jC`zYY2-R^)lekfcS z$w9l#n8|*4@gUmHSDCn+m?N6aJX9N3%=|!$>}k@CoP>^H(%}ydEdVZ3pN+gy*rowy$*D0Ttqlgch6myF{_^OVwylj zlpGPp2pW+Ze}6l@u@$lWXd(*C#oE=oj)k8Kb7LKOca|9ptdlSrf_^&javb+d-QAOT zyuqE*n)96m>Y^TrSs4^C1-ybTCxKM{NeQ!Z%28F>NA1*@h7#scV|Lc(s{7nx@lBehG_PJtB z*4EWmyBcn!A{g+JMuk)G`MwYrf*Z!234!!4mr7)Hb0$e~I}6Z-BT7c_hnqkdFn!KG zbHWIv!`4xYO}aU;rmSBVT9xw#+R-8z@Am$3#7t+23?saMW2R#;yEck~$T}2cMT*<) zZ$*0IbIMY6`Qp{bZ7NjUzE@sNOcB>6nZ@DWA}EvfxRP+y9GDUhoJc{`xFK*tD-tZ~ zN%Fn#Ms#-{9SDnXoC*7EQ4{FKuSjsEKW?Z55rFmJ=9#UJnJ!1y0wP@KD6n_nQF-o@x{NLvZ z@bJu@%dyxmNl=;1jn0#NURX-Y=)6~2DG6h+f$lx2Lo9wpCOX!;Xc*5E$6ZE+wlpG! zCk^5<48m1hXj_jI=aD0-b$oK606WyxAZf@P6B|2UpS_ER4GfO`TRApY;aZ!In8qi6iy z!p@X&c!Nh6T!cC(7xLA%*77z5UeYL;$1>X=uOB~1Ok6z->((B#aVeiRRfa~XUmnyS zJ7Ypa+|%QSq~FhvQbM7fzoN+;$AkZ?eYNt#Pn1>AJLzC7;9!Vat&i=qr**mHzDE>^_?+CLh<55r}*8mMO^q0YIp8mj-TCHql=2@$%Q=$ z`(h}1_9jcl!Qj|8-SM)L)Ntcm91C*(`1`50`jGk|_okH_=P5n(!RRh)<#O4w!*EY< zZ@GQqF6-t2mgg^D^cj4qHAk)GQ5OnMe`692OGFI!O$)Kw4>c2mBJ0_suRwp+P)O43 zW9anL;D^N{;nb2~KE6ufc>Jmj7&IT}eli`a+S0>=1Oo$u z-)R%o(0vVwT-29*#3C^pJs>j}2Djxzf`EWz z65L!0mPF}TCMFN{5)9hEg8@PGUfF4oN|zu)gj0jW{C2HFE*}42Y+?e3f=%Ap;d93+ zDmr@LWbog#H4!Z>E%e0;=^}k;_FNf}+|UjF{w=2(MS@0=lOVpd`VdZdNe)t>I$cR* zY9)0jjOma@jvuk)E@i0M^H|5*onlcs!BMyB;BxEoTt}5qVi1ulJ}RIzLLPpS$5@ZI zn`sz&j##EBz;eWGyjw|7QQwepjq=+sa|VWAsw~MjtlYS*wYA;SA!qsekK?G&>5n53is# z#k|Xr{JH}toyp-dOxBa0B(BHR0BKvU;nmwLemF>4TAF|6&_AV!b=3ITmo|=j;;8Ho zXw+0}MEeYae@}SiJ#WvgAf0n_P_mkp2I3Y5=B=j^8%M>^06OL(u0gBvF)eBVQ^?L3 zi)ox3yp=3rq?CvQVyC&n=gkYWE{2*I8ZnkGJO?Q%S`yYto^e}V$HTc-hfA&hf#DWw zUDAq|7l|GJ_DWGn$;8Elu%MuzRD*?y5FN}E`t)14p~ksuXVeN>WiDC757MfLJv@Zh z6|>4$1f+zK8&HNdRnLzTCJ_ZtTz{*y8rupEGvx%tX8jn^#0fb#su?3oVb4oQW=I!= z&p?4VjgC>_IQ!v_DdKj}--WXDa~vCvJTn+!74}q3bC_t8Ze@sl6Gmj4|HgN3IKme5 zgZ9nv7;*u4$oI_z1&1CizLWfJ&Y#?)LV>MEEf}HL6rX4RvUDoTZ#uDmbf=PHq3`CD z1fOUR_R9&c^k=6egXK_2_PnPh@k?Bov9E6q4&7GS{GSXV2!(PtS?v$Y^c0qWBIb2j zouQ4sSOf?IBV%*@W$R4-j4e$}fym3dA1%b5V;#pfZ%d*={r&reIEHGCNg1AmJ+fFo zeeUGxbM*8^M@@Fy&7E(=TCAliz0VNvR)x}_O30=&W$DrGf+y^*GH7);-&L(TQ&vTPXqs9^p{!YVsmF}=SWBI@G@&$V0dB`}MIc3Ajmv=QuUGg! z4t1_>>~Ac|v!dv;vU;w%$E@V=`?U29Lyo;ZG`--`CG_N~iV|@BJ>8#a>*~S?rP4Aox}*7)!!8bHE6AwT z50|dskA6Hc@;k00>d*G-kp1p6)0p zFHCyAiRL?l;Fl{d^y{+m>}rMXrvoJ?b-9m(U^9N+;Ge58L8xlkXL;^e5Ka-1-&^#$ z7*W1oemB~>Ij6S#$$v%P(8=Bl{578bAB&lafU8U|SW+UJGhLT#v@qo+gD3DuO?H$vdrgCx4tr zO|FiXwDt4?apB*;f6ssLwT=_i@qhmuANhoYqVn>nqoSkp^x5myc0FIfk4mr-Eyw?i z?~dm3FD$Fz6W}YsHppVCW<`|zr3Ww8tZ_v0?)(~CxN{PItU|+#BIfumEMGQxBFKL# z8D;Hi&{Q0^o9E8iHsZHaGdX%N{2zVn;zyD-R!8#p#$Vuj#_p(C?-(k9M65``|Cc@qq;ecLoYav7v6X`-Y+1WDkNfdl_3(L zIBRcKZj_C_V?p|2Df^m!JlL_av90Y_RDVul_I)@o+Nf$hT3`9+LwR>~+^4|N{_{9< zbmv=3EqV{nbxmjh&7A|q0vx`P&Yf08k<%)V6roI(UZ8bbI)1q43+BSZ;OKJJq6vx! zDo9D}YGF=Z?@f^jsSmX|Z_-Hq4I$TU$7rUY(jum!YV#B*&;hy3iRk<>6|)(0%0y zf>iq@Nd<=^mKdoeN8N8baQeO(XEZ8DCo8ZKM|u;3W*Np3^PZ@y_myIwB@n(9<8fwDXcf^DinDQ+`y^!DKsr;Y7kYE!@yGA!0WfU7Wp`TkANNks;&6h# zSm%8R#L`X(!x4X@b>)G5f~VJO<<3yweOwCqRSU20)#cyCP(Ax*q*#$#rm7#0o~*2_ zt2tgr0VYuQ+1BM?yT!(?TGlLnNBFB{FOCv6y(W99Z`x)RBZOMf(nA_WjArDClGFKK zNwQM4)W{ksFu8MG!OnU)CH2d1i>P6F6ItduxVUk$nrRvGzt1p{gb#K~W&dmZ-L#jZ zuANf^<4&l=Qsd=8maGmc6%O6;(AL)Od~PdSTjqr5NVb2z&&xhqhn_-4{9b*-JJ5J3VwHy$z1{i(^siIDfNsIT$sFq?{Lidt-YMWWi z7kL#GzQNn+`G_hMF-YgxEi$D<3_=wMViLKOVJ5z~$lBUzeFd>15eRoz1sW`lBFfC1 zCJ;4w?PyPl*-E5SQnW@zg#usXAQf{S$gW$fPs&lUVUZddfKs-3mq$yH*>66rU;o4et$*zcoGUa(b!*?cp7st!0l*J;qT8&M1zy?KYA@Lo@C6ng^*YR zxI6dlJxa&zbalQ8Q|Fb>bBSo%KK42G>b&Z>s(t;b)qp=HFqG04RZafBi}D_B+413m zlMO>wUGeSP_n-lO-z&~kVI>CIiM7q^&C}*#6D}(C0hF5mh*Xco7T!tI*z^92XZ}3c zTvZ-O1`p$BDMWB*gCP_X2PDGUSl`8LK+BS3xotVq>4rzKdvJ>_TH~(@UaNRSJI~Uo zDmL+KjioV-xrkv=8*e#1&+GFhrj?25)i1Ps5oPg- zt7RQsb`mHY9Ib>M8zH)n%Mz=wK#VCn0VpiUgIsLT;x4Epd712p+hMAsTJ2oA-J)1V z{=D^iQ7X2HukQFn zCI6MWVi_=?VM@R;mF>_*&|ZEoHo2@s%9kmYE1FW2fa5Efd7nLL_&mQzk2EYq(z8v>r%G@3XbV$j_`-3#k8!fpT$aX1&X zW6%E@+qYjcrOG?#|EI=q{fn<7oH5rMe<#Zs+l)oEdX{7tzeUU1xg$|dzW-HfMLx|q+R=p% z%IN(i_PwmjbsS)iptWcYHknH;9s`sqjvC!6qgX!|t7p~7AacPBn@p`dkYHqri|xpa zo6FE(-*Ov8=w796SuZ27T9p5s6UH&6yDsZ&)s!n zlulbSr49jfA@fbee=3J3cl5ojEvB0M*Q%=1H9HeqClJ2^+w&gfA|J;M)$+M{u z>{M0!Vsnf4It_}vftj>iNFw454GAki4Jbb5f)>A7V5*HM2%992U{IV4veO}-SDB+g z3@CSkR z#kxNeed6|#cpGY}pr8Qpcb%MsLZM&}@;jc=z3@7Gbs6_OTed^em0BBtIinTc;ZQR( zV_th9GQgw2V1U9p*Y3sVb~qQnAM?%c$@l&wRMd>N#%huwDmK~#3{T11++Q5N|1jDv zDnCkAWqs+OV7viMd-H(D!{b zyWi6p<36&cB@U*REXGf$9BHk>7;5Bkcu8$OXgR^7#2+()Z1|7ZliqTu@f9!c?>)9A zHjIEk6cl46W#!A)h$`0-CW?f?m^^Ik?C=o4U8+RP1S6G?=Ds0RYGD+c7@L~HpPiju z-~D*H>sZOm$+6(z0zDpR=~S95M85nk+^D4$S|}1OKTKDV!{pig8v>g8CxGix7 zNE+K8{zFG%WoKI(d|CYy$M*z5=>DX~{dz6bsBwFIT-Bx3z&$54lA{Cq12jm76`!lM zj=Q6Sg5Z{_NGeoLUfvM5)@hl*;hB=UzisoRY)eMiFN-#jNtg+g5m<-T1G7e62}sUT z(|VM%h9zP(^-xKcx8gUaE{%xGZ|%X4XaZ5c*jzjz@0%?|7#0p3hKKRZk=k>Ol{3fv zDdze`J3#)Q(aZC6oz%eQW&uPS2uF)yH6t&W{JXE*!2WqmhCQ{Xzn_y;LEYrcBTe_X zbJE18-B6}!@vn`zIW{~6IhQ=CSUoFQFziL(w73RJc?~&=S~-GznMTDltYX@98Fgz} zGH0*A_@Ig_%&<%YE-T`tiTMQeP%UUPKpeWhA%(0fE`F+;mn>Lb{V>wVs(F)uEH9d^9!GY#(6k zI5kHB`ms9l?gz;v_vEnaW9-vEoPTehT;6Q&?8FakJ-6^7_EyXk^R>oB`yNnr^O+=} z$feUW*TQ7cf_mJL`(_CV2>`a=xE=Z*-?`uJl>q2bKFz}WaXD(X{mAwER*Ig6mED&J zIyp{0zR;`oV;}d;co~P&O}Xoi1r4CY@dGOBcynMFy0&HlxWK0$cS`{9{Ood56r19>2nT-C7QH8k!!7%a1JfpXX=AsRLRBy_S4T5LoEKg-Mtann9 z$`nDZbm_0#>lM-Uo=yH3^qq!4;3S1Be&;iBcZUK{2TE?XvI3k&hKPdCe{xx!XDxy) z3B!}4Zu#@K^T45#NHmK3cb{VCT#`eL$WT(u`Gz}iEgr8*-i7B&HXWMxXy67vcqY)Z zZOs%Pd>!-Qx@GrCMW*U_Fnu`~)Oue<^ui+}BiEaxIJk01=BfB!pQirED&{ihNzQYF&l-@gz9Xqh*=9j%*?+-V|&F(Kl(EF@dHExRW5M)~|jf;5i5rSL8(`br{kXKba z{Cn8g?Sa*HaqWuEB!*uO7a0!FOXAd&F{>uL-dBSQXP=n!C)){iGC1(^yjS|-X=P5v zBydcCK>g0ZmB{dJVHQAg2ckho+bL_;!{v4iEwHIQoca2w(eMmu@Lsi~Z(+ZQ=^;yn zAe=JLk&nG&pIDBNg{zg-f2Ajgr5|zf!^z z_SSB$e@9bJk^#*br8XXGNu^wGVy$xa0BGxG1?9HUZ|*o=a!Yw^rQ5hJy&zy8*lf}f z@uI>19x^lzUxe5fOVQKua5ui^!uje|SE*-4F%z+-YyPygiJdDEmlA+GMBK0Bo-sK; ze;5_I@j%XD{P7(au?U-E4^GxdVcRS^Z3DfYu~jOk<}B$Qb0ZOZ)ByP+cnA>5O=$n@ zxq!V0sQBz`U9U6SD{CLa~xqgQk* zS9rmB@U+4>7oHTLJpjddOD+5=8Ul3~#`o>!oElfckzpo|-1kL>BVP>39O`PMAjFW; z-g0Vw_t^yZ^OpxnT7QOoep6|D9rt8}3smxLl5@#@^H2JrIHD9zwYK{Iot#uSw)EO*PT$1|>-x~QljZ0Sip!(Z@u;U~^oYg-l@(nJ9IS7;fcI*GM0OKqB z<^FU7nxVZ#^q@0$x*7oS$;8YoNXK-#OPnahZBdqb?G6sW$#qFr=#oZGo%1#q3$NrxQIP8tCGrQX9y#Pl0wRAuR~jO3g;F z%MXqC?|6YFtsN8XO+89XK_@D8({4u_PN1Axnye*UVJM>fOCrA5Da+b?E1yQ`CW;$A zf$?q5W>r0q`7m*?9OcznlH*3V2-Pu=yR~Ufgf!*C2sBWTZv{zus5%#Pl{}oV5dXtK zq6`G>aEmqNM^ZIst#&@XDi|#$rgs$I+>ye1_pw(g~zN^$%cuYIo5@=ft)|yKPF9U z`Dkg0;9WWR>P4ycasOklw2Z9JnM2e{MKesCY5Ya`2j7jnVY|xeKGzTS{{@?hzgZzn zp~g&W9MF(c*unoAR<Uvq-y4+0-RL@!bsxAH&j&bI$A#*S7h!lJH-AGeZtoeAdXgkNQWwvZBBJQFc= zNsB1nUxu_bElE`dJaXR5XBm`)WZb}cwO>X6*L7w80(nvb?TWw7d1T!DD*(XnWn%NS zD!Ll&6r*CDY2Rki)hGsQ%9h1FYPF7tQ3tpfei7qcY#g`d1(i$l$Q~LIpQf%!uy6%K zC5(`A5yr7;Al1^+a-7j2`(|%V!M9e!6?aq?icEpzsj;=esLc7A4DvN27{Kg?2GXxx zUE+qN>v>+}hQAiLgVGVm5aD*Vg-y_x{@7<=?v6>}QXx^4<97vqwa*yn)x68rb)P-E zWlGhboeJr0q@Y(%Qr+jo8i7T;Co?DIp3WihTO|))1_7Knbz*f!o`XKwJ9^KE(p804U$Kt36a^yX(6iE%6 zm#3#(78VxIDmW)5G@e(90F>LId<{d5d&II}{9 zM1Mzx+Vo}j^~Wt8hz4qa)3;K+NX>=D#>QV%ls*i37kN8fS3+BuE#wfp305sgLo8NGaZQbl z{UuPSF)fVD={G+28vMF-nh$b^*D(odPqwOOyd%{Rk z=HKs0AtvofW6^vSGs4ln<{BqdPM*aVpg%z<+`R~&%zNLmTVcl5{tI(@42GN;#A3U6 zgvKnJ7w?e?dy*N!Nkf^GlONeE&eqH8W1QQk{QK-RCfOSi3rfeU=e)?!!IUmG`ad&q`90hF%dlN3dP$HJjl4%H+pOw$isLlGUMLLW!slLZGEx`)RHD4o&fR?oPh>o) z{J8Y1_ZAq|8~exg4PK{ZB@TTQpNu^{NhxpoWs*|I&xMD0bv$OK5*mxmI~B3$+1LmQ z%cOSC5)!Qe!tizzeC;gAr8Rt_SuF?+=D88P?A+r=~TRjZ!`H&8lQ8GvJ{@gN$b zSv8PP!thxv-q2Hto|gv^O$5AeY1;whIzL`REGNv1M z+FH|wjfq}=uqoUHKLoD2tKZ+ISs%NAw!j+)ZG(!63l#y{(j7Pb>mzTbKDtfQqK}fY zaNh9uw*trzt#|Lz@&A0_QK{gY>uSlMkeOIiCZ|pvvUzRfn!E7VE%*Gj=J$2}kmN~2 zMoZ=yLLM>cyw~b{+>`j&yij?b{KKTgSDkH`}X zse)AaV`F~iGr=mg-ft8^PG7LY28Gq+*@E)CNYqU0Ss1lhi9NofJJJF5?`ufayNOIQ z8R`o`pCtb_TzS&8PQ1QGqLz$N5DIwKFz=h>5=wQ8A8$J&IiB}>vOLmaquu+?SZpdC zRrs^8IqLY6LTDLVMpqz(zU*J3U1K1sT0uE^EcL}|?y(2t`cyG{c%c7~{Ci|#R#Wus zK_GFi&4atD?Nt8Rkc!#(vSj}r+&EVBksql06|hsk9$ovp89Vu!^-o`WIhAHg$tWo; z*%7wRQq0BE7@SgqlU$ZTc$JK55G9&B1eH#gIz(P^>Q)vxQrJiOO&qUh!FVU|+JZdW zV?ZCIj;<%@vF|69god6h3R~#a%?BNO?5FQrq6))>g}&My4ckb|h9Ibvalv;S7id+i z0e3*Z7{5gzt5cBve3kQsaRvk8kf9u1tz{>^fp5O-uPdKti}pe~@D+iR{k$~Q(QGRE z7j>uE1hRnL8vHcHGWisXn2s){{f-cmw@&41WnZ*enW?aMf4w34xRE-bfQ5-^Je1<>__tveIJFz>WuY0r#)O~zUQFHMy{{lW;oiS(Du**?9uh-4>^dLsj{bnNXEbPQE%j`gZ1sq zkJ}bWRH!NkZvV>O`k;eL&rfoN>Ickl5P<0$;aeG|z62qelTHMj=gdsif$78Th5L}+ zayLzCgwcwYcL-BAhu?+5;e1_ak+&TF!Lu-7b5bXiJoepRd88H=#CzLOSBFJR1b z3nnVFT5q#8{|_%vCi>riY zUN*e-bRC+nD!qKp-$zu-wz!_r|CJwa}{#)+~yaqyHzkI=Y2B?V?pO)cJS6ghV|6=j<50Bx)R@Xu)rNOQ$(ra43J*ZNj zCD&W1E1i*AY>Xe>ar`Z?1A^E*F0{YF&|4Ijn7qNRLyRRC!Gu7^Gbtf%e;0Zwyf$<{ z9_NKp{<`|{^dKU~noyPBadlBw2deOMFb%A-nbdHT0(S0BgmJVwRCZ~VOA(Fu_6{bXSlTLi8XvVZO9dL<3jITDSz><% zqd<2Mt)8~Vh4@}n7||%H508w1tq!u@qre@hvBQAHo}hh(fUMv3Hs6nMV06En=$s-{ zK>GN{op`kUcBZK#m`BO+W-GOa2NP5if7h9no8O<-^D#I!#X%T}^4Gf`x0*uNtAXFQ zGi=T~QProV3bdo6xiFuX3&de7bGh)%6_0vcCoM((v`;Qvg7BzlHSg{!)i#KKIy?U% zxy&bS1EzuYbi%@@@D(}6ry$iJ^%CVZ6wzxqut-~%FW8@pivtD9b6mpj#|C!FPf{|n zo`nU{j>n5?S|#;AASA{A)OL3Moq-?}hZ0yy|FDE^cMIGnGnWw;8;p48gBf%8tCPFj zl744dc#kI$mDyaQU6?VVWmGc6P>RL?>k1_3fs!2+6-8Ao#kVU`1PgGLqrpQIvA$@L zANY{KT(DO@EZ>=El>tIxP*PIZH| z6Y)4Lw3c%vXJzAf#d-1fqu-smffrDp{2nd+ehHidE^yl1)-jGZ>$s%wy%&r7_cKP`JO9(f}bk&m7M zZRbutJBSw7(0Gv-$CQfMT21_w%Lck5gjJZmT&uzaG!dED7g7myz)DQZ$@vAmMr33b zML+sV_r-5`^^3cn@(d9Nzmsqd+9q5LG+2lL=U6}QhF6T%j*W`?5;uwf`!a329%Qjf zA?Olz_6Os)DCKi{A_O^DoRhK zv*wxZ?uG}`(}#x+$?|)=Nz2ZbB9sD{Z_QFxNs2JMF+=GHg-Xl`(7o1|%xZRxy6BwB zJh(C&@rbobmo0cSYLx48(-AT+G7%}2vju}e-LhS5RHELSs)sXP>F_xb!Xe|e?QGu3 zi3B0ftKjnL^NjR#@dUcG^z^lpOj1%1V)Nx?Nzyu8Y&!llD5a#RC>^)((Out zT4_)~$w`6IZMNpK-!<9+$~-x0kFiNKAp0(_|A~KSc(-5u&P6ty>cht7K;j=wddx1A zCjd&siuAV|w2Q+Z!1)kh-(Vfg)^TnfCp_!w-OfnIs#s#1ADg{-6Tb~qoxZti{&)Pg1`F{1S;%XW(hiAIEU()$kwt*$Rnt}<1R^!$ zBHn4$kt%NRe|PIRzOTaTI}Om6YN5D)r;m4>(CC(Zoj1S}_i~d6Pud0@R3EL1`4U6h z42G*T?I}we^Eh$hYR2`5%WJ~!$+27h7@c9z#;aCuKPY>h)5ZJ)2<&7OZZ$9T1w5o} zgW|aJ*uVvEFd04amG_g^N{_SGrE$;gMSn9ph{{Fu=Hp{vN`S5YL%eSOXG@vu^{1z! zm4EtQwS7&A5sSi9Wz;ze>9yb2AE%dDQspMdmiah@C@_0{OdGoJx3hI^lR;T_=f9mWhPG$RSaJ6yX@lT_+08}rv%Ubc)XC`r3#S3x9L;9id}q zt?lf$gt@U;GNA7rJKx?J{O}bn#D0LR&c+Id{9SD7aWnwN>;1OhJx&gB0bL}Fe8%sM zfIzrsL02^4UpF!wk!vc$CZ9L?{93}la76m?x_0|f1^@CIZ6M$X`BS`c`=ZZ6jV{5; z#=hPgh~fyGfA39N$~9R@I4ffG?y*B*B3^Yb`i5b(4t=I=9hkf|{^)bz6RPgyphg5@ zk>lmO<$G`MC`PxKw~EHLwo%bP%ymjDD}j*z<-kKRSgKev71>ih8X>JXJU$-JcD@!# zA}|o>$ONJHgjj&xJjcG()zzV;8W8GLNZ9+zCJS9$fv%r9bV*;o>y>FZ{OkSiy|*o< zLMCrs9vT}WD?#ulYbX3I`Cx?@{a;gU2pQ_R`$F0BmQ#@s;a4*}^{a&@#>U1FFpMDV z+zFV$TSoj4mXZYizUw*ukdRQ%#CTJw_ZJN_Mj7Uqwfr*GT`VU)-(wKoDVXEIj98Ni zp|bv@XhfV8TA_&Z3wDidNRa3F0|*fYJO5XXbL4hM7vfim#+9n?ga#ZkOp}_B#djc) zCNk7$za+TK1op_`H-Pw_Gf(%MjG~}s&$YO|1j}ASJ!GSkQ>pE*-Nzna;~E_PX(o8{ z>Bzgc#>dGNHb9Zd@HX!i7kV}bGa@MGibOx$U2PnB9d#{{oQ|fqT!7VHmXfEdtJ@uj zBOHX{S_u0pmhhMjn&##dVdxF`z-=jDMQng#wC-0;XVBo=gG~7Ph2x@K(?i89KL{n8 z!^%x@CFJ+T;|l967|^_#sTb|oC(jYZ)aDukfgvvR?K;(}aRnt^xs zB~a0jQ+;;FlOOJVF`PQ>Kb{vE{+&FD>gsi~AgtbKJKvq{Fx7(>Of55HRZf>XsTjTD zX1iT!>53xq_%C*&ICiP9u!hU^!H_RUlJJ5X#@6Q;$3d8+mAqY|fd9FF7@k{^KrY`5 zX#eUX^MOcPz^X9`79y@PV!o7}~Q6eKF9Sr^h>vGO*uL%6M(*EEE z5`Pme1Tc(H)`Ve2b&v z^v?-r5HBvc)!oT%LG1d^a02gWkO_L$ZVb;dW=~A=?^zXuRE)nP3 z`!`=3l+C&G=Y5ZU_+nGuj)khQq`(#Ky0l!MuK1AT0>M-JH$N)Ob!^PWVB1kjwZGYx zFxb;LBskN)CA{zLkB7e>d$v-4bbN~A+9Zn57}|1LDWoYIQ2e6yb-RetbC3Sd8OPJ- z-d-t89Gr~|o2ssv%G3{2!owe4&$W~Ic!qfME)C9XZ}4jsLYH3cZtK6eH_>Z^CoPJY zfEZgZ5q=)CMBWl>Kp$#MuCFs>#B&7a1+RzR`UxgytR-UE)g?%{7%Lep5~iCtOp%+I zTVxZ^zMK|7brm6L`N*3(#69sg8fvxO-Ta^4Q(NCGv0^F_iAF9{Zi-zUYZYfy>VO*a zWA(l<4KJyVDT_qhbYTMCNFHrZoTl!>lNXy@!md|l&3M6|810X$glGIl@RZ_8EEx&J zeev7-db=)f=9)f=zF2G~03=Qth%DP9ncvKZh!w$s4P#@mt!Z`jw5&8S*AHRS)(01Y z8PUk3(b69o{Et+rHs)jorp*U)L6reisGDs01Q}$cWhi|J8+5Ub-TN-kIU)#N*ir>` zhKii~ZTxs>`k~rG%k5%BdX+u2<=%ExBKlxOF6xH4a`$-k&**XeM<*wu48got#$V;( zEhmRknOvC^9mVULIVDPP{N<0o0(&#!g)Ww8Gl-InQ$FC0cF~5)74fy;oWGFoF|cB< z>7*03vGXpY4*pFd1;d3u_ItYfSH$6i_RI#Kb7o&zIX2j4^#h+7L@+Gi?lmU$vyB6E zVDglr)`U}%A}FbBXI<<0_8`p^T^QAuZ99c@7?o6M&(&91>b!&$`|FZu*7E>d!Q=2m zL>L*G3DkjHijtn~nmKqTL%r5*ee>pm=1te@6Q9O8HL@n{)Xz+P z1=v)5jjBwTLYSzxoFRI)=w%-k5#%`-m6wS-k!s0-2q9R&yLG~DihqJYDbPR(C2 zqnF7RjqY^+xLz%Nzum70;OTu%0yq8mYv=AedUm}Q>x&3+AN5)etki3&T`SoWcZpRR znrJ_kKV>eFGXO2}!|P0NZ0L(%=a(f$(Hl7cNIVHvGX?<)rvc}-U0=TlZ7KLotP4L`qQFM-~NT^Z2`kZLypn(+0*%99VE8d!4V z8>5f+qu+e)+@9Fb0`c#>BKjeO z`dv}Nz+&@LqGbN0m2)nS<2n{N_nutiLwrb$V{T*fyTIaHgCPG;M#=yNgG4-0?rQTI z$y!L(f%Pj$*%QMwOCt;VD;Ih3&Imi5tQP=F)Kg|ijGO6&^E0#hZb9s@w)V4h0UR|V$d21Cw~_Gq z-A=lLDjP|s{69x&vRFyqLQk)PIv(xddwek&b003pW)I~JDmW_xQkZ$0*_a58c59JF z_cSRfDJK`zeiXB9TWsX}zeh%%X+`I3$K~rkCsm)i91SWB3;JwGkVWp-a5gMOADEBE z52!ng33}{%)e5xTeP18 zIa1)xia|rHJ-m~@N~tU>jVH!1X^@VS1u88$T9yy%rtEXtd=ljMz30#IxFi8;oC27% zjg5_Gk?DUaR%p^E8VxTD5m#_lZ$vUGiNX00zLmJVTGw5yA<1$aL8~_A zy_e>zzeS(Cg&wBV{c-1Xlt4tqxF-Zl);vPDa)tnJ+B;O68_G<`Ajt8y9_ggP z?-~V(!IFpYsP$L`fVIR|#Z;3f9#t<6_dH&Jcd=d4RcNOwr2Me~(z6-G&vAd?NQI1K z^7c$P*>H1ngG?7tbTb@Fm+#giIcAht%5Pl`Dw|I0n39Q(T!G5Ax+D4|&~&afXfB2d z4m<%N!DAS^fi)3{4z2FX`NEku1KrlCyyaNFwCm*SYh!}79C;cV1Txh2K-nGn4+mD( z%*F~Y!&C^x!Wft*=)MigeR@Psg$bM3U_61%gH;@tT>Zb0;@16|#k2ndK|#L0 zx>^83ZOVG5j{W=hW7iW;;K#!F|rYSaV+=!h!cOp$wyx|RRKoo`;92~@pFTMyVC8~M? zE;#^d_HY~zxowE_U9ji=X?0uzx`Vji$%`S z3&kSuw}F9yUi748oejglcfb2xTz~!bC>4v`TQN2^%K7}s6DMF8rlRu}3VQ6Z;z%gH zc8RgEF}(Ag@5J2P9BaM@L4cqA>}UAUhyE|bae`ZJxdokW7lvk_?%TJY4N|MshOf2n zX}$BO=0UR*i4xpwHkG1tQ`dqmQ!$EY=D83C6YsNt0gV(Qi%kcc!Iwm`T#w8gP%0%5 zu#{vPC|Dq0tDv%cQD!7?Hhj(Y0Y_m7TO<0^X+!`BO`W0oFtu{h10l&`@_Lre8!5s7 z0K@8yy|IN*{nM|KwNQ(q0yY)jIh8<^gnHP3!zg!>DB;9>F0XkL5f+yg@!Ye|VfT}} zv9PcJ!!R&4HHEV`Zp8Za>y?_27WFKb%V@XTEN(zbGhq;*uKUA1&*LZ})DqRKgQrs! zLjGwVQDnDq<5@iYXVW?707BrcZ+$C%_`@Fp0N(!gx1*bB=2>1^VqyvD?hzJddG zjTT1{OjD`SIJSdr+qU5gU;F|tz4TI+geKsbo-Y8@Ycgp;+ zMn>@NcfVVeZuQ#sJpVkNdFC0s=RNP?(lwR6Qr$Io+c0fA@DOjeE(qHxjr*p;%U@oIE#qT>_1$AKG;s9&qRDrU3#N$^S?3BqDbm&^`HkZ&y#gzy#n>KC2x~VCQjHnK(a;1z78#Z8eW|nED zaTKG|>0o(f8LeguQ55R@+u&gy**WV;rk*co9|5cmOtRl3bdqhzAz3XNv`9I*%!p@_ zDiJ%5%zQMOrRLH(U%ZcWiO@ZPlLKMY_;s}59H-Cda z`_n&FU26v&g;=f9>MC`8m_wPDqMg4 z^~mS)h$3}Ogu3tCxf52cR#Tfz%j|G7zRtbFD1u}6l6%WC06lVs!ZQkK6P<5%d4Pjp z6$}E1q9|lw!?Y~jl4$mZ1!_Y=p?nyIJS>7E1YPSlsk_cF5hpP#qmoLhrM1@$Ayl`I zevq*~h|2Os0EEu31*Z?H6lFjNqc1diM&#ci*3P)8F%8>z}Iyl(Z z@WS)$GLB6t_ZqBtgEYn9;1I${$zcm2lvI_T#-l`3RU}5AOPX|~%(T3`j7qr--w(8Q zeT3E3Rn%*BSj0#ZTE~|paCH0QhU8r z6B}4lUWc_j;z{ENlyi}1K*r+!zwEu)jxAYoC1!i_;hcy&=1|3=icPWwv>v*_kK-q* zUj(%HL;`A&YJo#{RaV|1BjOD1zK4D=Tei*5y+u;g1A~c3pir52i16^U2eV~sfW@>$ z=!y9EtX1+6uCszYWLavqJ2* zzoozV>%XSI`}@DwUia0jSM-N}_=oiCU;moE|NeXW=9_OcgB;q02Qe?GIn(Ed2m0L) zKhTE{ALvQE(gBj8OvQ%9t!lmKE80S_bE+oP1CtpZ_^M$T$y`m`#MizA470%TAdr zm&KY~=*ZRwbsU~W=N@CE`};ec)}$d(TN@qHOphtiG*29|2(CLEQc!wfz6zBMN_pF} z;K86G!h(%4u|rL1bXrdAiH)R5IkAxSjgbI?1ZzQjE~$nYQb)XCoU9lX;Q)c50yanz zu?TM7vyNFe?6IH2vuKiz9L7pWS+2A$E1fTA`uyn={Z=;ShYufg zu75lp>DzC=rT;}Jx^LdRq1Ufp)A4wuSNHey?RVd4_~g2-s+<0szy2Hg@bLpZJwEEq zhG!%b31zVhyI^fuPCfIY1F$j&f-)B=PPC$4JOP5EW5aBbcfK2*!O)fX$L zyjBk~Cc#Uyf7ZqUD*#4LtB+=o?OUXtj3b9#jCPS&qXi^r*hS-n99?UpZ@&5F**wc_ zz8VNSo7fg#E|)Jtr8Zc-MDtc-EPR+e|GQbANjT0-?v}irk~y(2w(d< zU;94x_w1ozNn`divxhZ4S6dY~GfKsJA@}8Tw6BD0k|D(G4n+C)bzSLrJdzKA?(gn| zT-LZ6G8aNDwbJtVNI!n~k^am7`CsU-{_3y3uqwJet!`iDKldMtT;9HT>##|VzWPCc zZT7Vf3v^0-E^`asmO%D}er+>ai(z}~)Yj-XzxmCxd6wG+Zj(n~0|hIiwjg##Lu7ERKoZX{JvZC zc5{C5Ypow&x3{l7F!<+j^!xVu*EX#EUboYc+voayhsf8SU(Gy9`9}|(uYJFN&S7QS zv484kvIp2O4D^d%{DR)Ud&gDzG*C)W$ybPQj>uE~-H*Rh$IE%1duqx*@)CC8dtZ5( z_SdXew=MN-)bH&J(V4Ss6fNPL+cVPCB%gK_0mfHfD-|)zw_nfBxNkQPe(lr8kI&{= z?5`sX!bWDzGn*3}4+lxsOloI@|50md&=^CY%>+Jv``vfsWaOr^@X~$Df>e0cnbvaj zcWnofZKOAC#;w-=JqSaia5tFMdj#u{KCP7^1^EDOcY;_3DD#9DM{bAR=#U+Gw)n(>D9m{vju{*0W!RV;Pw z%STW^6#+(TRe+m7A#x78vYJfZo9f2})mE=;1C&_tJ#Hp1p$a4$2?qX}{q0DZY9X?B zxCJ81jR8j^wz}5v$7k>?I2VH;^5A4UaN#36*aFCcP{N5xBF8azKnQ<-GlqzN^y^b;e=Pv6(INF-7Ps!ajyot1|&a0dCrP zJtjBk!+A0yf8Q}*L=PL8HwSwls~Jh?{|?a4#4+_tjmMV&e%*XTPOs~=_#S-8I8@#7Dij&Lh*RRDKa-wg)`G)?t|L`B^ z-TU_nAc6A9(Z8Gae?@`>IQFMM97X_;xz<+2#j?>jjOtti+9&`e5FJQ7(lOGqv_=q2 zFlvGHaNRbY;Rlh`V)l*sGyugcAO(QPX&Tv=F0gdcVKg!fyb&d}y1 zEj1QsFuZ4{{BL#@g}CN=*)-=n2>B_PMGlpmca8>A4#FL#)=DXkW`kEjsk_~D3yoSf znPo(DI-gbW1cz8e9Al$FD}mW^6CllvgE*;rb>6kD49ivf&jtR5MYTDHF7)6?Y$W+Q z_!>Ev9@aokoq4)}N1!;y9do8 zOJP>zCI{ZStU`vG=+*r_ZFwbXZZ`^!WJn6$JDG2@@+gT-56T3m^TLrAvF$Gvh~v+k z4~VAa4!;O5X_)<%&bjdSlsT&+ukw(Ha>fa%A%{ln&j}okULj;qjrMy45fpLr;h<$5 zK(ip3XZhI4FyQWk0$eKxNxU(cV*lFD5~akxzq?a3pQPLzBqJLe2W2#FJ=_|$l&RY8({KL^@q11KcYz?KCS7H~+G%I$hbeRmnlhOYmMj-NCBUTYDVDZ*S2m5StbA zZc72R=sJQykembl2FNQss;f!@QbnPxN4&F~H~n{>Ydbk`s*Y3@Lvmg@BdAu99S5qn zGmJnyW2wDL^yYng&1BDtU!iqF+XN+|7sr}XD^VpP$!37UGA_cgUam;iXi|20yH+;>5nnP5T_41=hbI1g#XXki5Z1yunbMX|uqQ z#~}lHYSVJq_0$)+g_=YFfw+U}1|y}>51On4PlDDOZLL#cn_*s7LlK6Q89n#o!=skx z7qK75vjGPfWY!PO01h-2`2h29f#zw@(Ns){MJ@9E@%PmhN`xYK_c?Fef{5sdClq|C zRhhGwR`ejp%s)zU%OcLZ%9xbT74O7m7-DUJ>=a^T1!N35RoUdA3kI|K#rNOS>o;%c za^i8elY@>cKiRBa*l{?W@$!lhFsz3CgA>Ke$;~V*uYgKMa)czm3?YeTooEnUvNENB zOruQmLD@*_%9KvrW;t(cbRo{AD5=2Y^MPORI1Y3?9JJMdc!!l`!6bEXL{XE{8&!v$ z-}(?J$qjHipPtRLV9`70X%cP&(@8lfz`E&FIdl=bRA6QypBGayolZP7Y!I7Y)&Loc zC2Eb%dVBSGGw7`;Mka664zl{dW|Z8&M`iU{Fb<3VbYk0LkMdKD8&rcWJvK(b&UxDM zx(lE{^b^QC@T;>2BdQXT{ur`qysL&5#5cB)PH~rjL&Wh&-h1Wvqj$DBa#h@6>x~zH zMrMb|7>$s3dO9z^FU<0hJFo~jP3gt}yF=j1*~ELt)9Ivw3?Oz&juE>ekY}pU4NI*Q zjOl`Njwb09!S8J#xxlbrdlUZPP*$SkjWJS80E$G}HVleFgMl@SiGeK`3nG0~UMyHu ztrAt=s7l(V-gI&k!UadD~g$g8}4{_cc(H&puj3#Pf0-pR;2X+MQ^O2pq<{cUH@T_o zNGb|a+)r}`C9p72>SB(Hh0`k0RyVal+KA(AoS~B91ioA@e6tAvWep0$ZbLq@8{Nz3jTI3ZRiVsv=nxvvNxgu?j=n9-|mD zICFEh#$`V1?7eJmK6D^cP6p#hV)6;UecbHZwlW=8O4$$t=a6k{Kh$#3b~4KP<>>-r zLl^@BxgX{O)moI#ZZ9hy-SuiA$ha|^eDr1}A<58u*LB%bqUCwebF0sT9DZn1o$pG; zsFQ$A+YtO3(t6P<;$YGdUaj;&Mrk-qV+{1;k3Z7m<0D0&wRTjNV&uAB1Q|JJ+SaV4 zV=aX?IiY|~;+tY-e65QvVw>z~U1Wnv5%C5wy(I?Vc0s}iz(b(PIJy09u{Gsv0~6TH zCPFlj_C#hzjdBeX#$@3P)3rIfwngQUlHunHP}cSEMS)%+t_rW1f*KAOoT@h`;aN~%$- z#ju+X9tyCYwr;tgmj=O?5J{$@B{NalwoOKSd?|JXT+{I~07t70vG|D^g}{`gHFB*{ zg&mpvc}!IR;#uAbj7Zpkli%f4;-fh^ik~BX6z7fy;mpF{{o&z3J<6=9p>w2BuK40m z2w~%rVfa)**+YzM+Z+5BTy6MxkuioupM=G<%3(r8)D+3*lo5=1uIt)`A!^waX!3!! zZB--1)_C*;7Y}R%@XyI+gv*Cfa;734^3Ua2vMl6jnnd63b>14KUx%tn7krVvTdE|L z9LpgdktHu}MO_xw!AoT^i5|lG-X%%+^v-u8hy)3O>`{zW88$|Yk=2Rf^#+?P?;R!a zgxk3u8FnW3;jFC(P)W{FGqO&8KCTvV5RXcl>Ean!o8!VF=V*~M*xDL-`FR1PL8Rqm zOqa{L12&_8q^&hNi8h2CVY#x{q(|%SuG}(VlI28p>zwCIHK{7>+E~|B@dV49gqNHT zftnmDrDTeClB0IKJJL7|bd}lcI88K8qnhwFL-NN53Dd_WW#_;vRaHz3{sdarOl?`| z>G6?A94YRUKvt)X{thuc&V()Ca6nkVFeE)K?ItN=fDf50`pnwcr3EJ<#yDw6Gz_EW zQa2`{ioF=2*p0n&s^lqRh>_!=(>!Zg8s$(xUw64)HQLA8>|z5p)jL;} z9YPH^O_P>p{Po3!wsrSaJTou_v>mw=(eLvIu`Vms+W$^5e;)|BbEH0clgw(HpyDBR zB8D~TuRDM7D#j9Z=b?vQ8}9^oi82ZiNtF`il0_>o{kidtt71EhNF#mE#_h+M%rQ9k zUM?5%qHrX%U@~Dr#@pkMAD+##uvv$U;G~*yX5^@4yd0jaiI)pYl7B5mvR*FQ9;nx$ zjLkd@RT`J_A@)NFW|>HP@geXO3Nvq+?RUF%uGUbM4dbYsh-%C&mUX3vpC0<*Dz3lh z^O@qO&!4H*N~fnM_5Qj_rZQf3H2!D()U^~?2GNqC_$gQ0@P$(vnC98IB--*yPp3lL zmX-O06b&o*0G$svZA?)UGC~Y`x`SD_qu&}^Wp{IER6`ab$pl39#v+QwlDs0rr%~!BQ!23^HknE(RjhdVH1My5iTbZI^R&u^UK$r|0r4O)ju3 zb8z4amOY0uT5&5P8peUDl_V7b z3YG#F8XW45h^Beo_2il>2yMUM2jd!9)~4loEmif#wbUI*m~&=6fZ-Oy z*m;Jl0WcLYZ7G@8@-&X*=ULKKy!z9ZQZ$7JT>NILtCV<#zAOt>n2W#@QL1K)sPTKS z`4Y|Yj=$o(qd-p6aqo^trD&H@)pq=FJW~9FU;a{UevWr{RBNOA`+NHK+wbVzyLU`p zk=quQH|S~LfC+KJAbp^fR@#w6g_(lK4H!fOQ)v-!0X=yTZ#l1F@10(|ZmVu^MI48b zoMS);3L_9x?EDh*U#O>i@Zu%{jk(tw;8yu$5o0g2*$}`q>pF2P*z@V6RZ)Vn&+uA%8cs`ZXy6|*X#A!JWH)bE7B!%^;Tsgp{?lp{$lVW+Rdv05Y}3$ zO22NCR-JRSnzS9;P8B%>$ZT?+efLN#r}O$ve!c3tI-gD=kZL=V)@E3fi)1mtAFy!G zAGDm|o2%|vP^{P@ElHrbAyYbHQ=<&RycleuZCz>08#w_Qf>2ul8YH3WS=}#ah8UX+ zGFGzWo7J%I>}_G4Yr#fC*^99jsGS5FF-A#^Nh&s=FdLx=ZVP-J5LFyTNH&0b}bW5L7t5NI;Y6>)>&=c60B z<}eHzYXopmKYwe9WMs#{YKkmSs1n07dKS%n6XhgEyBI0Lrw#`usIp)gHZ%TJBNZ#5 z_MWQu6b;U08I8(6kg5X8LPtdB^I0_>Sm(~03KXraR2y6FV`zkcpmNrBMS#0fE5+mS zNR5c@K73S;vF3vr2_Ovck}Nv7WiB!na>6uX3az8OWjbHZ>;or102E$9KHQWNdHKL& zO0-H){5TBKhxhoV^ZBfPbuf+ua|z%W(>Pf+XsMLy{RQ@#oYeF>krW6v)7bhY1Q(!^|6(d{Qx>qZ92nSu$N5HXQduq z0rN`BjX+AKZbjVT)ot~a(61LnRi`P--*Q#m=b93CF#{0dsrZaHN##4;6p--umrg_#98osGOW2SM^k;zqNwm8MeSVUvf#F!|>4p0^0emn8vayttwmRgdW@;J@2_|}EU3ulp$ z4y=x^by0aC7FjMuCk>mSkn+2W!u<1kVB*iBjllaI#<4TtoTGW3D?(G62#|1Tf8{r)mWtiZ~~B&OuaXPbQEt8tw}E z`%y459DY@*Q(G71v9w+6M z4VT|?p@;+!o#R)vYepXwe4ue01nndhWx(0gYLG#0sI_zvi`?XV5@Rg6>H%b3VC`56 zMh^hw^1=u6FbtGi)(?D?n~_AYf)^5nib{B1{D$jZ0L!un#kWe?9n`P^%B^u4MJg)_ zH8C=D5?M431C7I|v}oEDGCrIr*rf0y*Rlx+IxKKu3MnNiZZs8Mgg_~IVOI@0I)T7t zo@R~oK{T+tG5v!o2)C}<{0eK2py~m$tX5j3^v6a=ToG2A-E`%~{L*@+6_F(Jc&JMx z0al`P!^TDGs+U$}6m9lA&y=?;mPM?)cBM-ti;a8=fn2TRe4xB#>G}DynTDjB1~Op? zJ~(&GDaYEn%AB{edd^!B$Cfu`+ktASy{I9KfG=L8szIyLP?A2AX91wrjGK)5AWFNl ziTVtY;5Hc-2lY6PlyjjWg5Ddova7Aqa$R<+&)N4GIH=JZ6qyjrfC?Og#!#zBN`98> z<)W3`RazdjA=DbZdHa?QhndoldWZ@UjnhaGC99JSt62|r6jK66|a0` z;X4N($fsT%;6OUb$nOghg{qXII+|GjH;d3aV(_oEMrWg)#;Fe}DQ*HRaO)M0jfxM_ zndmF>{YG+02qSWy-^AsC)9EJ$iV2)IGCGQm*=A^XG9b+aJN)X z*h|6r!;YEAk&LjMo|4$G(3s~^Xh@0HZKZAPDlU{iu$8j68*|=QIUTL}VO94Ir^+{e zPTb(|D&rX@TQ;R3saIGrVgPWihcuW{GRmgyy`7i-aU2Hn$79zwTiagKO4!3}ls2Q7 zzRMZA>?kB6w$XMJeA=nVtlNuxL)whw@tiM0`tcfh1qBz9SCF6sgr9_chi7YIrR2>7 zAWA@COtITZjh#2X%ZoFba8w*=NUTGb&jyUb=khE~0Ay4G<2cCX;|UQ`S(U?K2q{gt z`%VKFI$%aO9Q;a^hB$QlF8LX`{|-_Sc1tg;>rHbH`5+pHr2FhH9i`PRbSFWOmQL%P zr%#_g(dBZX^Xa5*%#R<~gFh-VD5V2#z3cT#m+Mss1H5>EU+0?jh61M>JnWPb4T5~P z);Pfuh6U1_;DZOr23c5+dJ-h0h1R|pLIAL!Z00s@N2@!wV~r+2T9#4U4%k5NEIj6e zc&~NUR~4;%FX62wn?)5(OcBJnv$Al+2j4xptz}WEVh|aHcw?-zVeBCP?~IUvjHQ=V zs982*5Wh7<3|k9fXG|o}a~8oKP^DciSEcASlShUs%|>XWYOBU;PB-*3dlqL(b{>s6 zm9=&wi?ZYA?>0NCUPE@ebv=f(v=}?@D6-jo3VHw>h!&6Lk-b1a!#)d2=zlmaWNJ^%^2<7M(7m7564S}7yAHLPNSZy ztrBhR3rp%Oo^DpJJ)}hAH0~CcMUu6TwC*J`n$*xlQ`UiA8E-0+oHJ)$%jX5G1dcq& zzVps&8(>92IHbTBT-HS$cvFh~MwWxr+A_lyJcw~;f;K>&XBY;Zk^c|%!T;BPmV85p zMGLk{0A+>dUP@ui?TeuoBY6c}ifBYM0M4v!caySwlh4FjM_Ifp=gjUiP;AP7W4(Yq zS8}EzYvJkfvHzLY=rGSTjw3B{umT%891ax0Zd0gUHr*;?u?V!;9(Jk8UVj_S$NK9(8<=C z9ylPm0003w$A&V%Z4)0NKta%4fyi1A5*rWz3Ht3I7Dy!H4(A+I2vCqiCoM!u##&ga z5>RTRh{X-QB6S9`w^@NEvEPtcQF9+(2mf6>wPa_#a^ zL9pTS*$n~kg1YHMsg))}echB@Bt(WrI-{)Ax!EYKlp}n(C{0m9YqUhQG{RkvYy|yY zc+s_1n&$(x#*|(w4uNT47=|5^4rE@(G^Hru0+NnZGzEj!YT}BRH{is!c!gRho8W@( zoLj{*$kR1nDd!-l=_t3Ixay{;A(ZL`F8pie-}l)w14KNkDYeq&eAf4tGmkXSX9n)T z123ggtwlNfh!u7c?1$fT!XR@dtH%j&1m8OVwjl(1_wMbpd6rVLwoAaHsPYBiVb=`D zBeWV)slpB$K6PMkq7`+9o1s%Do45h^{^;X2ZjpT`q$_4y(66&ybp3;zXOxG$Y z{jt_YwUwR4F-$I$C8c`zAZCbNdds(B?93@SQBWIXnxDO0U-|6HDZBNiov8tt`4SsjEs_30}Mb`NCyBN$!k2STx@RE?Q8v z$e0riq zdKHwlN#vllR*vscF-NzQ(!>tA^^hZt(ZVncl1J@ib8kY@uQwnDqoB8aiz>^k89rWA zO2)9T-Wc>(RZrmrM=!ysvd#cL0^UiM@gyah58l89FHu<|D)-5R34;bTpV)EQ^nL@2SQ><1k7kSX4)k zKkEYw9vvk==;v**AMg90$9x=7)d&Ic&}WEFeVS)IRFHOz7BD3ywOyoi-x|^Re4@+w z%r3BK?6-BLZCmMdKGTN}KkC>9w=H_C1hI)>vMER<h)#+id z?vpWHw;2M94uKEW=bS;V-mevz*Q5N`cxLlr@%Ir3&_B$;MjA543L((raU|ORj=@ye7dNnki0RDGJ4VZauXiC zrmvEEv*U)qp{f9-F+jv3BO)rs@+ykENeqE}N;{e}h$gudI?VI4d6uM%LueABDh{37 z3sx`!WbQ+x5U@77ORa`w`p(?LA%d3HRt7zi%k7LN!LMkxow2V>Xb;ePwcGwqe948tjP{8I1TzVkYGNa5m9}*N5HwVb4$tR{>gSW_?=6z= zdU&u-u=Yk2Uj5_ICa|AgqLe13J)=+m{P{C&VvdPP$K%r@V;@irp?L?wK8_sBZWkB; zfIQq1dK-e^BPAZ)FapV_%amI!0tm9bp7w2RCzQZ!HAsj;ilRCrl7BC3nIsx~P2_;& zR~T5MIOkw9>(5}yHY|}8BbC%iHyRHmU==9AB^Ny`h=|5v+$sA;>4}G-TR3-(e0S-A zBk8)Z5d@|l1(sS8w$P~2ySMM2&9gY?bz0H6_Cd#)7>6a}QUp?0mYg&E`>w4BeTuXS zM;|OW(37z#gZI?Dr$P2a-m>aEP(5S(=#jE2z#apEq=GOf7b_~BKm66NXr2%1O$T-5 z-SNn=$;A*1&_ncb1fNpty6OVO=0WKKYA9Y1=DIljoM_UW@uai%&I+JuAYzg%X;&dt12Tei zl2TGK3qCs=i(H$m3nv_eAt^wcH-0`3|8XP5M3uO18~y!1{Qa|e7H51A0Fq&XVn4bmO@cUz@dPY7TF$u($Z%P3`-c=DPebrJ zma{&It~ycl!4|D`8LV^ckLVo5pMLs@OHOmc^%Tyate)fXpeM_^u5_4ZUGTUmaf|cf zW#qld2gE&OqZC;wN3?hGa5p7%6$h453S9-=wt^O%cvds4MtMXAkYihA&aduBbtx!~ zJ966A+EZg41xaII8w7{yFfMuw{t#IF8s?**-h+S6?M-;lK zj0$z*EBV9eg2HoygMeFgSr+xJQ?K#NrE!z$Ko7^tm;=&8r+HT6jd?!Et?D$s*{T6y z7NWLJ&)``sCW9y|tU-*+oO5&-2D&?P{CAcJE$1B3L~7TCDhq^SIcUwt!n%hfVazq6KBB*0ecRzZLaM2plBpMcOg)K?NkV=-H6|O^9=>>>C?wg ztictde2gd==Hipygmw4KrIsb9vugQ=7^Y!4>E;*Q9NUT{xC^k6XFaLasQP=9$MYd)!R( zx%J>MnP6T5_)6YXqmCK6-t?QyV^6#=VoX|DfNY{)517*?cxZ=#62)(=(w3yvlpU1O+Yy;C$@B9~m5h&|zYH5;+kq-yjtus^# zxoj#fvMr!~KVwObK*wQ70%U_fB55|Q(X#OLWSmAG`+3%}Z`&%C=2E$eZi1Yn$Hzwv z^z?#bJ^b`Q=gWoSZ+`Pz3c=IqbW$H~7ValC(I=5oTK_b=SS``S`g!T709jlhN^Dsr zo&c_F+hDci9pQF*0|yO+44pV4y{}CrF-9Qz=boOPlq22q%c|Npp`=85CNK*SA2ySU zn#Ae}e)KS$T$Y9D!?AM&QrvHF^iPNx0xSb>x!Y-ij@wLZF~|Ny?LAcmg&x!xEof>h zl5u6xBj?_Z@DSujMD%nz_3wR~e6r=93{xwW>h*wYtv zf~A@7YdjSZeg5=G0}iS&=up|MQ8ront5Vm9K~ zG7NXOj3FTfc^}8)QNKgZywf>?#3GXOX}T*n%-zv2!?FhzgVu;+W9hAu<~41S4(1DM~4nrH{WZ3q^@J zM_bZbqgStA(KJq)n*dt$Fbq6L*U^$J+F=;z?sz0-&Fw9o8#N&caGC3GG}VjP8)u3A zS+|v%Y;F=OD%(F{WWbvtXwMAhk);mWKG)uCaF$WG8OhDQrKxgnOyoU-9PC=#zTn_1 zs%k0=>r4ul4}f3*(}jPPu5BD5Ts z_2chh+A@tJRZ(l=5JQ!EIPBxGFtSFk&$m1uwDE8}YME_`4W;slS8Ac{v`I21kAbe& zWtReq+fqp`Mxk>^2bo!BYOR~xgAU8BuGh_8)Kk4Hd4P^8Dld{yFz0k`=sZ;iFKpi@ z@^ToB!=R^S41tnF=k!F3@-VQbUA`ZC@~2fI+?|z(#5CVF-MitdiA58uYDv%N*g8~A}?^K6-0*X2r%oDfa8R|1&m1KHtyB<-s%Et7 z-F(vT6@ZPi(988oPdI=u?^LFh|H8){3tlA}riX3RgcXJN&iwp9otHffN#C7POsmtL zznBEvTUw{(HZ;(ETcakRqerzSPN}wiLFE*LnO2NR#{K>Mvw4;#Y&Wz+mTqki3Ahfa zPCP~q)iAl|8jmCqQ24CIFz&L{tN793=SC(Q2RW23K{a&hb^}bK1w=%dtt4>6UoIE= z^!YQbG8RuUDL&%JQQUH-k~5voXZ=Ilx@vD@`)p)0L(rLrL@|JT&0u- z3S&3F2e5}qz?Rsyx4(^u#kj+kQn(?=_G|va+OQV&jhJXW0Uq)}M{@!(2)PA^>szL=&jDf_1QHNHQoZB3%3n;KU(+3et%us|ks3`=kv^&3>Ph|-mAriEdbA+Hyl1z~R!Yf|d0JX8`@ z)Q>48T9;KrKXABy{P>ZcPA7`(CQYRoUh(;I;p{BAA#FJkLKLN()BlIWFod8C9bSA+ zRd9Wgqc7fz21+S(KA(5}vIV>lLWe&O3GD4GK1=!~o_8E4DkYm9r}v6L?+1xn3i8Z| ztXu$v6!!#=E<_XY(vXe2H9G zpRH{tS_EzncpZ>)G*1(Q&w{%1W*mr%%qH52ky|%m>0Pgj;3ZrsOeV!v6>6s9>a8Or zt$id{jGGP)lVUU{IBYEKxfYWE19o7o6q{s(0eR*Vgr$0k_W`%E=d2+=ZfYWOAuttK=at-BL4vEJ7NEkd`=3?QPr*IbqV;NNWB|Wq>8_}D z9K(yfilCv7WqR2@bkBP^;F4spW29*h&tfGxdO9mqkaMi0E>XUfS z#}IWE>?G|b8rPzK?PsyRe~ow~=bWP?6(-0~>$Z}2o*spNZ>_3W1JS{0n``fl+Ra0p z0}+$ugh;9|@&TJodNCP*UM`DVSE`1S58#}r>3j7d(CgQ)X__Wl*OjJ;-@|fU=y*I* z^d_jVFF>B<1|QV>%{fPT&8j-WZKiR+((Bu?18j3a2ec&&MkAPCS6RFyE~<+>6GG*! zt86i7Er2#yF=@D6>x3M9P`0;0xrPm5NjkQ)@@5m-(%+7Z@b{o%YqDU#dcsJ~%4KgQ zwPciVm?ne}y2MvX_-MTSb|=2!V2_$UDk2~sD9wp8x@D7jW3&O8V?OL!Np*ONyMd76~Op+E; zjs5c`TnAhX*dvzOY}c&%C>r1xt!OEQM$fInr;i_1F$p7;PoF-~r_Y}`HrY8xPmhlp zGQTbhJxWrGy=`LTAo;vyTBO9Z(!O4nrQI!OU14mwiLn$;Yv|!^C_R#5)Tjb~SIRE< z*OBDBlZkg;w~eYK(Ws2ooV>Pgf_e@g2;{A(4q^814h(1J*u_wu!2ySg5r>*x zXi$AArXe@VvaD2=MHOa1xe=y$d`8c*t9D}4IX55Dql|US&Z*}l6^6BUvK)EK>V(f7 zxFI=bI-gEm(J87pR20^z0#y$VB9LP6Zm>SHu_wPSi;l8=@bukx-_z??uX@6;1bV!A z^P1v3&E$ipNphQT%8kRIn-ZpV%C!!Gdu&HLup#FxWCEvPQ%XruXB-M-?09hN+A^=T zM$%nzhs35oU$dp3> zVyhZVbdyPdEksVi!D3G6!{M;wR|Ablf9Z^v$Ii|zZlL*HX`pEu^=o+_C<^1wJC;wf znMad0WsuP$Z-!-AHK-4%r6`HL`ssE5GM;1*r6DQ%OidADQmh6Epa*dxwf<(?x+?Q) zp66%tEa-7n{wq@(I1&R_0b*WCrDa{zmiq4gzDG;RCU5HM%b(}d(-XPYsGu6nnWzG5 zBH@a3-MNlvMKNk`^UL|XOK8PS4Sq(el~$vx_&j{3>*YdQUTGd@Dy`7Rk00subfSn1 zDLY=M=9Yu_fEQ)cR2Lna3F!qJThTzVX9_V;rD|-B%kIXq8f=ure6VzI!rJ;e*K@S9 zY{JX=tjr>2lohH~j00++>$U8V`f(h|m2TR=#tx+?mJ;~PZdcw}vC8FqW^k-@wH|cK zD7&x1Ub2Yp*EYDl*}2pUY71Nn2TWQTFvf#cAOchv`elHE(0!*EDNGa1^Q^s|&Cpxj zYAl}8uIxn=6pK_m*);>4BZNT9x@wz+@zC{peKyYmSt~XQ+<;UhWt@#T#Wm91-Ld=4 z-xxBMQpl%a$L@Rm`n91K*qZ@W zz+@}A2-4b}PF(YP>e>Sen;PK?c)oEQ^=oTnQ|OBTb5}0;7cE`8Sz>1h;?P7N@5Kcb z@72lov3!7L#&zI%Tl38jBOT>k;Sk>hWWwkYpGokZT8tFbo}ekc^f^4s^?Id?jFYR$ z;;Z6Qh$;=`yv1xljm7iX1Hx`}8yu=VzZr+_9CSP?JZB6u`?GE9N+)C30`EkuTW9Fp zAx3)l_ATAr-N~eg-~0J;q2+p|XjMHp0rR$TGNYh?+2lrBd8HkD>4ue4sT$^-9iOS+ zoAgNRZd$c608iL{_-YCuCIVm|p@*}HDFCzZ{j!O8MhP9%$Gr+G&-dA@1A8eda&Mhr zb}6ce=N&llgI!;umT1~X%BhQz&?53U{cqn9eh!d??7Ovj;AHHu?ZIjfIyEUQUGW6^ z>~dXpZl$)`*u)s)Y{VpLAYyu7Y^*`3$hmY)|LfPUpUtz}-`{ugjG1Yp3IHg#tc#&s zd;Nahth6887G%c6N*#c2XtTSC0piNUXay|XPA6UDIb>tNW0E^$9u3N(f>Tlk+vj1xa8w#1ZftC5X6iZ7E7u*b*+%c| zN^p$QO5w4Mcb$uFa^o;5Xs`y3VRyUqTRrSbN-w}AD6wE^0r^!x6znmX&B98_F6>Tq zu1dl|6$g_IwY;JxMxjak%|KA;h7A_z#9@m#>htCDY@VgIeq-7x3d&uS?Dp%R`U)}7 z>}KVgTZG(xKlr(IaTcu7Hpwp-%)Fmzzs=Z|52CZ*Rl}a6#PimD36`rdc9D`Dhv2d- zbdvq^>C;F0_~|3XH*emMbB-Q&>Y&G@~A-3f2;2W!NL|Itm{GPepG z(PL+zi12|Qoy|D6R#!1Z8pgpG1Teb^lMBApE0vPfY!jOwOgXKbN+Bn%BwlQ#J71vm z5Cimj$`N3PAjJ4O=jnO{aVIL*9_TZwI|LGF;G=Q=Wdc%HYdI6e1?g-`NlhHyzJC2| zo&^_{Z42>zEEN?Mlx4ZWQfyrptpf3VQI+;;EJ=vOCgu@c#kR?e9=CfnA}Q}ZoyGSa zH#9Qd$zFn$c7~FTh)(A-y?Omw^Vyt3^6x+?CW@!?nR3qb`1Gim(AUeA&ZiU2!YfC~ zTS`$o8Qv!{)5P!s)p@3*HSzxyS*q6{*g-MIQkY7}l_5TyDkyg+H@s{2F*OzI*px zzh*G;%Bt-!K8D~Lpj@4EbY?-*;A3khoOoi}_Qak{Y}>YNOl;e>lbP7IZD;T7dv^Ez z_MAS?KNnByc2`wb)o%r)1RfO&*S`E}8$E|?rk}r$RfUW`eM_lU@}Um9e;jP1Nye?k z6UT*2)$tu-;Mmlui{U4U9lGEYw`}DWCuBpa=y^fKHLbiBJF4%<9(3$`M2n;QtcHPg z1$#B}91pw`i&s8tu0a!C?QnF1JREXAAyMLoiR@xwaSq|(ItuBW4o=ALC3(`@=n7x3 zH7}X2>u7a{Il~G=SQ2iZb`+M)^=K*^L3!@>;k94+*-9&a*9{`Wj~-w_>#r=)jXh-1 zA6fDMFEPfU4G(ohX9uoKz^3fG4D;4+&s&pfAU$9oCJ<1%=WKy<9#{#vJT&c>* zmPR7l*lbmKeZ&E?fhv@9M2vWwvw8dR;oaTLRGpw!`8O>%e8&qP8Jaalx_0K;HpeZC zlI!rumZQcjkcMP{j3DL*9-f+a)njyrZ8xon2JfVewQD)W3Cn_htjA~qU6eZQPNSAf zcoqu70TnlsUnaM@FA6=jvOq-IrYxj&7f%egN;US?}%YAz;ATM1I@Nd<-^hkXOLW_-&G$C8(XBqCD5Jy}MdnAGwl z_B*P)sL(rUQ#+$;uzo9v4aGxF`M0l@8u4Z%Zwi)-W8U(v!!gTNcMG{cx6O zOKp9|5SGD<#K_C)Hu#0aL!&R2;djX)-(b}?y-^Y39Dw|Jy{53i2tS(a=ob*nWG!rT19>Sk|uS4uIYWX<3Rj9tE} zB8X7dBpDdoHJ>PtUn|40C08`WUWy-uS+!cbelC1HQwBKRX0I= zf6mFD=47G2KkcKDIh8RA(WvzMmWN~4H)*hJK(x`GGCV3+dZfzpRt(U+A`MG_JO5n@ z7-J%#Pxufe$|XL)yLgFIo>|3G@-T-H^^+50cXMGp%Sh zydqicT82Yy^^VTaH~kKQtzRG);W|_+Wg?$$LhoER9jm6f8?>KUY?hXoiM9vP6qa<$ zb82OL+Z$_KDp7tAv^0y>2k9ZK5sTm`sbRir)bod_kRrd_5QMr~S(7@h5!<1W5F>-A zP;k6J>|MYDA`HHcXIQ-gVe}yP1l|qR%Xfor^Q97&Jo=!<0+59Y@+A zOSIe)k+&Cv?%8nMh$w#i`8n$y0mP=3A3NCX++xJz?A;WUp`mRfC?6FH$3Pt zr_RYV-jLe~cbrgQyaMN*mkC;i9f~a{xWz`2Xxe~_GOC)4x1zemnvCgJi|dIX;L~JC zXL~UlJ2EVwEIzz8%fiUM2T)}bnd^r-7|k+@Buv6v4H>sx8mh)I_3SW~KgwkV!L^Mz#P?dQEYY&y*(o&DUkXuvmMF-i-#k4%0R!(b?iY&gQpkm7PFNo+ zv124zw-nkcn^Q|@XAyN?X;cPs;)?QXTk+xT>v#eo`s0=Hp>U4{9hj=eLJ0m4)^Gd{ zk4M?n*m&xsv_`6!@w%yGX00krqdUu0Nx;q5fBD(SMvs}^YF5USwX23L+I|+Aalc)Y zo&|weiPI=2@{D+72lN*jMVh^6T>;3rGS-qA>p5xtw{1 z-Hjzpw@-9N>xl`G4E!3EsxH{4t~0&aUig`RwZS(~w)ont&Qg$FFcMsXU2a})Cd5*) za^jy44>F^OK*~18JquH7qF>Ik2B|hXAbj2&>K2R4UOJa8@LY{^(4IjFM{~R+%nDGt zvO0rBun&2ojJ4z3Cj70SAV|A$i$gFc`|2?On3g>2#9dUgZQlohqx;s zjIF!|GKBN;`E2Vts_ikV{fcQ+J%~jK&PG#Rwp6X@a28@;S~W+a$GQYsE!tCNdCHb#R1SZOF)`~oyZFAfNB z4U9eR%OQ&99Z#H;$hwS7Eo^X&oil7<63l(Jq{Ak5EuU>qk6q{U$!uq49oKO;!r>}- z;@@L!XH>8xK3f=9d@x6e%F?q^{EtDcU=pdR4n<8gXGJgZoew~vAJI-f2(!7{;`MsF zlW4tQ;~U{D`dXETFBFr9z;HrQ!fgCD&owv#yDoz~7*~h}jI|i-*SF8~P8Fud>RxE1 zRECX1K5 zr@XeBR0E1sr(yMf%KKXVB0yG_dRX~SndJ3|3e~P#{7><|ShhHA`X4tJ*?Io=yWB2y z{`+Pi3W3z){6FO|s}n>2f83mu@jq_)>MJlj#>f z9RD|pK*g{z{2ol~iHYt&kXmy#z_?2bXPj4*)l7JAEIrY@C$Uw1m1O4JHpkFWxDD3> znJ8=2ZCDpQ$tL|9GD=oHwKMgk$L3Y$0v04CTi@u$=5F(jcrquXSYhBTKta406VGO1D4mEB{Z8V6; z$!nY>YF| znEHg9TqltQm^57)sE|^V4acO?>${(znSu8W$t6&bjW7GFZYP8}jq1Y6!aX$nXwY+z}>h+OrD9_sKtU^d%*B zD;>#bChb}^@8o+Q1)TIV9j#K$rnj9F#0_r$Tvyrd`fb`;!~}gILeojW9Ri|PJ0x;s zz6Kdp&S5Y&H<6I7db`QBXA>iuu|tB8*#dFZI*U{XPbOAe6IzR%c4QCG526#P$@@c9 zmMP>@8tuSjH6Ol^UsYGipI2q#ZZX};nI7-EjAV~X;LD@8B}^o=joj_&aAc;Fmu-!d z&q)#c9CwyDYiy!{7wuQBtDq1!O6m+ANz*h{tD@=~md@CZ5$#-X#GnuLB;Mh4l5D7w zx!>ig9)yP24$aAKT*DG`{joc+^_S)udGz#U|PKnu3C8l&OCHh6Rm>7KPypW*aJ8n&y0deSHlCT_s3WggMX* zITzG><=JI8s~9=&o)4)h&iI@!SBx{ND^$>G3VlGKXp`c8p$#uI*XY=BHb$P;U_Kc% zJ*xkWB3ja!m9iwg#0^H;d|z- z+Iv$h-a4wLdud9fi>5_X1};;7tn#N9HG^NC#cEULZBZqdx&_OcuO+u+<)bpQ!)B#| z2;JE}6!>2nqm)j_9EA{TtgS>+$tCUgtzSgnlnw%40QUG_19I8<@kkov!~13HC_l5 z$g~MW;VbS9W(>|DYcB`edp}%SPZZZ=Gh9j-T}S~00>dkx(n1`d32{}yE0+S{`<-k zYuMWs>zkXWYn-9OyoU+oUUcRK7bPl;izU!FME*!G{wQFX^eKQbTx$Wopo{xiv-%h0 zINjlRv=bDQ8dGqtdwxHjc!tsTK5_<3iti1pAyNH)RsP6VPq1)WIw<8YSat!LtVqP* z`}P7`-+bP#^6@J;mM~bA1XFeGCz_lJ0j~{VNykp@`^1jMx7vg2b!nn9p(spyWx}%L z73R6Z0Z=t)oqnbw5RHwlQiajG(wwO3>D z&iwQo4$?76e}?K5s_$(5iWA3n)+c?9DLmr~F{zCnuPBGG=o%h?s&h!W#S#pN zA(qgt5E4yBb~DkXa2C~^fcjY`I2M-vb)uvLD*(b~56=m$!&Dkf@_0f>@Cj*T|F&;t zEZ7T6hOoeD`z&zxK7A3;(ylfaJp1tRZ}n7a!w}(n+n{y&@C%&LBBe$y;7_5kr0pxL z`sKY=`ZvM^Dt;Cj)cZz28l1r%Io^p)Q1Tm~X|)v!HLFvynVVDSKz@PnRTz{)~%5GLWS4pw#iHHI|AeilJAYS)9BQ3fd1Nf5O=m$ z|6{(5D5Fn-Skj2Ht>U#xYhb{Q_Xh7yYSRQl#ge84nq4v*r$wQKrMV8iPuyd9$adnYt1wWl{^=b z=-$s$_}NT`xNr?o!Yx4Tgh(5tPCRC%goeLMnrVvwF0)I*d96ik+xy)sfx-Moe#92m z0%eL#*@RBX5bp@t9x(e`lTZw_@w#Itq1NBZaz~3I%EYKGgUS>#6NZriHt{nf)V4HXgYh09-AaBSG5#ZmN2DM{>KH`-pn za0D!JtsokKHBZ%L$@U?WecNX3<(#}eIhVFLT|m6k)Q|+4ur`sV67Tb^IhdrG_K+6J zSomAFah;;%7y0O0@L{_((9V(;BeG2szvQnR2;iMxN$WAj+7cdrK_Y`_TqazdP@hk~;-UhB)SMI|#7q+dNRT z9+e1HcqOr({-VkYgkA%ViyZo}DSvy?qp)Sf+fN(Voql3^46K@+edA%#qIpjJB{(0Fo!mQ*UPKcsE~@(#*- zr|^WZax?^1j2G|ybHmSGFG}XWUh7hI2oC&pRaWLv4tJ4_^-jWdsw(VWXDm0X2*Qze zU-V~2rseqG8zR1e`_bMOo*a@r{$o)_z8H!XB}Z2H#L`w3J=@m zp}ZlHHtveryzt87aOYp;!Aq*y*7)7@ULA0wFM?%btXmPP{LcP~%|m(x;cK6}j%9xJ zh}Sno8yx`Xd@&i}P~R*yinee$<9w=4^FY!X6A%72KF$wUg5iRvKXLLzcy+T`k4rT) z-f#XY$^^BtTIQ8fA8WF5M`0;@NsN%MfSNHbw zDJ+oziG9)o%@KplPcUV zld82@$5P!PVhQI#L>gq|QEr4Pzx=%|7~|3wz}a6D>}=mvIJhl;h>YyObVC-D5crAI zujrbqEAm@^ZGVH4{9#0>2xP{5TqI)6`jkvzLG7?gy71l~90k%XWxUSRpEfb5xpIj| zW=ymN@ubIiS|LxObzYhm_4NL^coNth8Zt2PJ03+iBk)=@MRpmEUZy_qFEymefv^*w zCi`8D7%wSz_2i%IHI>>I7Z>hQG|47SBH75$Hy=?dpeV;{iuSbxfbm2f4lm{h9N$za z+y1Fe)h~P}a0o2LyvNH;B?P~J^uk1dcB@lD($F4-A=;ej;^@*b%Lhjv2qAyFR}!D= zo-D}+h4CB4ELUL>{4o6~lgt37nliyJJQrPG>5slEaw7I_EL;wh2*UAC<uHcnA)OS<;Zlt6iFkYgZntn5TlBq|!!vRd+Wh zb4gh!P{;!LozWi@CZr@2E1ym_$u3!pkE7DPrX(V@mFN+nCBP`w4}xiIsLulgDSqz& zXGWY7(wvYa!t=1jN`;|@zFXZ8+sv&iM z;8vER-^xOzKl=wTSDsG_M*@OTDzx5*EJ7UBPulH}-z9+py+7=`CJ&V)B{MUNQ`PeP zG?rqr`6&Gf4&Cw=LO-5jK7U_aUQ!N;cfZV6AEn!L<(greYB4`or4Ta}xU#|_)L^@34iQV2D4V|6xA+y zO%M>*Iv*th`K3{DI?SK=lDIK)CiXA2rR#tkGBQ_s)Q)K$4nG8yQQ?>4Ot1rrzs^_` zgCch>stNv&FF>}N6-yLx zlDZR#N2fNY_%#sngMdmw8V+?)zrOLrj$~IQBHCa^8}aF&DiMTbXW;1TV9fI(ozwm`?jxL zFpM`WQh9T(V!ly(+T?UzN*PrGN3Xli=G8P@OpaHMc3s7X?7p}4%pgBgJdl2|Jl?9qA#u`#w?`i#V~CP{ zJoam)&~YRCS4llX*FqFi6o150tkCmLs7uqdAK~6)CgXD%_YM$5=U5ZPSUlBnk`0y- z9Vs~~(k)+NhKb*w+BX5&$BxZ?nPj4mo=`G^6(Ro!X8;Rb`6|O~neFCgS(rgoBymx? z&=_jXa-r3Xw1PM7;jQqf{d!{-4Q!fWio}?vk~KO2gZ@W(S0tnT%HQOqTYGQ!olatO zjU`Tm0gcs|B{&M7jAX_e z2w8tv=7Hy%#PW}i>u^xsUl@YiifoZMo-9HP42X&z8(@G$->a(vm}w`oASPr56>Cip zQP_n&87?@cdc1I~FQs!?snNpW?D_E>XZviC#Q7Jx_4heoc}{9BU%9wd0y+_AG%|J* z7~n^s8qz_V3uaVaw^bn=st5F`NYr|vo<_uMWTTzmbX3(#H=A*_U7clmS@OGABU{#e zq`FvoxQxE9LkOzxbtP6DfO8C-Ee3()VmtI8G3a$o81%|zH_?N==@Q6Xfnz?VWqxYW z_R&$d*G8qlh9V+0u*jD0^*{E*{FzCr?dc|QU?C2pX|OK88o+tq*ZJ57&hO|yP9jB2 zGOsVANXyjaZj~#_2Ep03tu{IbAuG(FR@TXKu+@j044QPx*Exsay8J;8Yc8%la+Ct5 z&AK-yDnruRF1QXUfTM0%ovr?U@OOZ74i4n&6$~TI#BTA4n}Fi~Z6m~_ZX2D5DNFW= zW|jwWw`v;eF($eQop8&o1j^+9#X{Wd+!f@)HzGQ_SDn&jB|lQ=Pl(IuT$stPumVmQ z*6F#cKl3zwZb>LBZZxvHSzjgJdB;C@p-!wz3Y?Xl>vFQ3p3-zuXT!IX{)A<6WwCi; zFjWWL9$z@HUSe)~U}k!ux-TvIGTOS5P3G-UvoavIeYu{v{$}bJ|Lm<=-K=Oz@0xHv zd+%}lau{In`OKxo?#{^BtTAh7ZKc(&kLgT(0ygrx-n=>Uxasx7X0tP?^N6DqGW}md zWP#6DpO4AAejuUsI6wVo$J?#VZMM$m%i^7h&w~lzB}`gA_^Vp`nAWvZ^9abz7AK~W z=PmJ3Oy5y{2i5s}@7!NRY*5t=Z^o?in#>;4olm|a)7m6A%Rt`x>|{a|?b0w){igQ9 zJGuQg+w8!k0e$p*ap|YpUB6vRuzcdMFy3&-o20;Ml^9z58R)8v}O+(BrW~E{GilW>$2e*3f#Vrxi(+#zB%RID#@a)n=q{wGp6C&F2~I433@CxX@SKT#0upk2;k?R+c0nj z{H{y=DfoA*iBMxk`HFizD9WhwF}ETc%*$kC-k1~6P6r}Bl0yNVSoL5=>a-D4*tfC= zzZDBkou&i-{3h!3dCWR+V~Y^qN!j;;xTGu?Xi~pwW@c8UR~f63t5X%A6b%)Qvafu3 z^one#f|ru%Ot{uvwu3p-&+ME%GLf z{gFlxfBtz|kV{v6W>AWT_>)>B(Q%F;W-M%CbDz;XU?4i#7YY_}sz|vg#0OQ@dR0n0 zOz(M$^OH3uN6gWM17%b*rGAGOk*WCoYB$Ew-93*T$h%JPK20$F@B3y14DQbfc^$1P zUFW$5lc}>mh{}69^qlqn%xkirR|Glz4RKpw)Ux_n1mo!;gGx_GpKhl0ixKRv`iJ|a zDQDmm@u}p;Wy8Bb?QdN(4n|R z2TGA4P`3;+svQ~#!NkJ4321V)GVG-L{jd?(N$)I^+Q@@%w?OWV_SbeT-%eU&y{y`h^LF~*sA%55ht_%U)67c> zllRMXhB?_jCRfEYCK|M>m6crZp0m$7-CB%(x?Q|ZFdk}JR5@R2iOyF+m0*3IcQf zRDma}osTDrmcuPRk(aLrs_-oSSP6%$pkW#%!gi@yy#|GvI!JD;%>2`FGeD9Ecs z<6&ZDso;>n?vV5ndpz#c4&(P97iUL5{6T=LoHl2xTs?QCF~-7W6jcaRZ#0LLIa9lY z;n!rAS#TO(B91vyEE%KYdh@!DqS13w0NC>FsmI;ujtN2*17`Z7KR#s_;^XT}?8x?S zc$%mE_ZjXL?ZG8lF?!dV=^mB!krKV+&Ze&QOHgb>Vt zDpfC5!or0O=J+yHNMfg&eDlOEy?^%wA!%)Cyb_HiI}9_D^h1RvDsq#vYrJ6uA!f3KVXPgKib_(Yl?YGNtWxKT`WSj}s|D3F5_%otqL3_?{T+pDCQsP4YhS?D&(k{m z*x{c9;G@Q4DCA+4)ClkhP~cK=PDDhEbO=IqaAVnd5g>7fZMVy~3N;xmLQJdi1&aP+ z?&Ka!foLjJQ;<1eGt1oh#p*NIIwh4Ce%82&N?5@QZb_b?k$xj_tjoBEZq^YF4Eloa z30nQ)4L6#2i;g+%J@IDcr5TZ8txrR*)7s{-5y4VC&N}fTX-1uz4qHU^yTYcOdu3RN z<<7q&zQ;<>Z8^&bki&(1;eq?5$oVG_a0y|VA!_{NP@MM%XEI2vMf)JbCWuApG(oBe z=fOT}D1$am2^%~H0XS2Qkv z!7@*wI$yo^d^jkmYKljZXvlmlyMXA-HKLW4#4Y#^fh2E?$xxZuE<}f=QGus0cBnS< zf(W0ZIcrVXkCFzgvcMVr2ft^ip&8W)Z&hlIM~Ne6C{jNJQ6)Sj(b(UkG*m^ZK?=Gd z%6&DcNyh5EZ{P>%t=9DyF4z#cnYxag$Dc?GAO^Y_@0FSQSvZ_6zH?&v*9}C_r|pO1 zr1F(2dZZ!@&6d$!n#h&LN}8mr%*+6FO0~Ax(MTP?R zldQW~GU~CjruuC;>|b^VPY*Ba7H3d88)r8vSx6KBe@1t5@}gxcBs=RLTsEz4fo6R@ zZ1!mfT0a!c#4{k$O|KYNF^>;2m=H+&_PAUX`MtVJSIGM;8ms-R8+N>qK?Fs$p_UE~ ztp?qduRsd>M9v!VQzZ@@nc2@|Y1EaukR|PU3Aauv5GAlgloet)COa0@qjXg;*$4}j zux`3!cTOnKe~ksqM1PpH_zDExBfM30#jNpnguzZ99M0r5raZQo{6sk`7;0!{f}*6h zvrCPyFaea@(_DTc7+h=5QvXOmuo#*$Da%-DHTu%jid7-yWdF_nxZTT2V+niuzPKsC zQ+F+!<4j-xz{5}y@w$3;Uv{st8Y$w{^kk!!&U$z6!{Wp3W#I(XA_hfg%p2i!lCoT; zRH|bO-(1pQBU!{v`vUl#&E<2|%g2h)e|#lhG(ngPjL8B;0eSbA=wm0 z=~KdQL=L-zenB`>{CACH)!H!o!?!e zBHX;1Der0@B?#qc`eep{MW|a5RYVj~vTmwa_7wuFC{1xVN(DzXXV8Oi@O;(U8)56o?Idr0ID} z#|->1Q}$8Fsjyo)-EP$k&4e^j^#3HI~jQ6j=Wd#8+cDHi@MKNX%|G#q;L9D5aaqx-i2{qjdvDJ{(_PSw6mIBdV~o0C5W%}PaxoQpg<3mC*Jb|ZGh10peAuwPekO@gg-+f%V zbfI#BXO&`3w>7i)qY@X_Lea*6nuQF?d0^cq?t@TVY z&>hO(LAu67o6-(j3lq(Ae3|(q>6d?NvhYmyo3iw^Ih|fj2_tW>;c@3A0@!Z8P^Z(y z{7r%-u#J4cpI_>I|G;J;(kS)2-J-Gn~X^W`O+sO}0q4@#g0H6C`J^+UP!f8YS z`}A6~#^Xd%V{$rfHQOY@a9vxD3$$1^Q^k5)arwO6^CJ%EvYtje*AFTd1`_og|lR5$Ywx?7tnrJd7@h9n!UF5bd!}kJR zf4O*)8BSZ$!N?yknTs7z@bK_YDKXw?zcjsD@3O$j@}<>`TG0*pl$Y>VIQ(M>9*iyG z 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

GC4p`fbghduCPRA_u=}K-R#%_@ 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 RipJ*ttZDy@0>)Ob2y55UA-|0 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 + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "engine.h" +#include "note_play_handle.h" + +#include "blow_bottle_instrument.h" +#include "blow_bottle_instrument_view.h" +#include "blow_bottle_processor.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embedded_resources.h" + + +extern "C" +{ + +plugin::descriptor blowbottle_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "Blow Bottle", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Blown bottle noises" ), + "Danny McRae ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + +blowBottleInstrument::blowBottleInstrument( instrumentTrack * _channel_track ): + stkInstrument( _channel_track, &blowbottle_plugin_descriptor ) +{ + model()->noiseGain()->setTrack( _channel_track ); + model()->vibratoFrequency()->setTrack( _channel_track ); + model()->vibratoGain()->setTrack( _channel_track ); +} + + + + +blowBottleInstrument::~blowBottleInstrument() +{ +} + + + + +QString blowBottleInstrument::nodeName( void ) const +{ + return( blowbottle_plugin_descriptor.name ); +} + + + + +pluginView * blowBottleInstrument::instantiateView( QWidget * _parent ) +{ + return( new blowBottleInstrumentView( this, _parent ) ); +} + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( model * _model, void * _data ) +{ + return( new blowBottleInstrument( static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/stk/voices/blow_bottle/blow_bottle_instrument.h b/plugins/stk/voices/blow_bottle/blow_bottle_instrument.h new file mode 100644 index 000000000..66f6cef02 --- /dev/null +++ b/plugins/stk/voices/blow_bottle/blow_bottle_instrument.h @@ -0,0 +1,47 @@ +/* + * blow_bottle_instrument.h - interface to lmms for blown bottle noises + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BLOW_BOTTLE_INSTRUMENT_H +#define _BLOW_BOTTLE_INSTRUMENT_H + +#include "stk_instrument.h" + +#include "blow_bottle_processor.h" +#include "blow_bottle_model.h" + + +class blowBottleInstrument : public stkInstrument +{ +public: + blowBottleInstrument( instrumentTrack * _channel_track ); + virtual ~blowBottleInstrument( void ); + + QString nodeName( void ) const; + + pluginView * instantiateView( QWidget * _parent ); +}; + +#endif diff --git a/plugins/stk/voices/blow_bottle/blow_bottle_instrument_view.cpp b/plugins/stk/voices/blow_bottle/blow_bottle_instrument_view.cpp new file mode 100644 index 000000000..61fe9a051 --- /dev/null +++ b/plugins/stk/voices/blow_bottle/blow_bottle_instrument_view.cpp @@ -0,0 +1,89 @@ +/* + * blow_bottle_instrument_view.cpp - gui interface to blown bottle noises + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include +#include +#include + +#include "blow_bottle_instrument_view.h" + +#include +#include + +#include "engine.h" +#include "gui_templates.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +blowBottleInstrumentView::blowBottleInstrumentView( blowBottleInstrument * _instrument, QWidget * _parent ) : + stkInstrumentView( _instrument, _parent ) +{ + QVBoxLayout * vl = new QVBoxLayout( m_topView ); + + m_noiseGain = new knob( knobSmall_17, m_topView, tr( "Noise" ) ); + m_noiseGain->setLabel( tr( "Noise Gain" ) ); + m_noiseGain->setHintText( tr( "Noise:" ) + " ", "" ); + + m_vibratoFrequency = new knob( knobSmall_17, m_topView, tr( "Vib Freq" ) ); + m_vibratoFrequency->setLabel( tr( "Vibrato Frequency" ) ); + m_vibratoFrequency->setHintText( tr( "Vib Freq:" ) + " ", "" ); + + m_vibratoGain = new knob( knobSmall_17, m_topView, tr( "Vib Gain" ) ); + m_vibratoGain->setLabel( tr( "Vibrato Gain" ) ); + m_vibratoGain->setHintText( tr( "Vib Gain:" ) + " ", "" ); + + vl->addWidget( m_noiseGain ); + vl->addWidget( m_vibratoFrequency ); + vl->addWidget( m_vibratoGain ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); +} + + + + +blowBottleInstrumentView::~blowBottleInstrumentView() +{ +} + + + + +void blowBottleInstrumentView::modelChanged( void ) +{ + stkInstrumentView::modelChanged(); + + blowBottleInstrument * inst = castModel(); + m_noiseGain->setModel( inst->model()->noiseGain() ); + m_vibratoFrequency->setModel( inst->model()->vibratoFrequency() ); + m_vibratoGain->setModel( inst->model()->vibratoGain() ); +} + + + diff --git a/plugins/stk/voices/blow_bottle/blow_bottle_instrument_view.h b/plugins/stk/voices/blow_bottle/blow_bottle_instrument_view.h new file mode 100644 index 000000000..38e9e8dc3 --- /dev/null +++ b/plugins/stk/voices/blow_bottle/blow_bottle_instrument_view.h @@ -0,0 +1,50 @@ +/* + * blow_bottle_instrument_view.h - gui interface to blown bottle noises + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BLOW_BOTTLE_INSTRUMENT_VIEW_H +#define _BLOW_BOTTLE_INSTRUMENT_VIEW_H + +#include "knob.h" + +#include "stk_instrument_view.h" +#include "blow_bottle_instrument.h" + + +class blowBottleInstrumentView: public stkInstrumentView +{ +public: + blowBottleInstrumentView( blowBottleInstrument * _instrument, QWidget * _parent ); + virtual ~blowBottleInstrumentView( void ); + +private: + virtual void modelChanged( void ); + + knob * m_noiseGain; + knob * m_vibratoFrequency; + knob * m_vibratoGain; +}; + +#endif diff --git a/plugins/stk/voices/blow_bottle/blow_bottle_model.cpp b/plugins/stk/voices/blow_bottle/blow_bottle_model.cpp new file mode 100644 index 000000000..8e304907a --- /dev/null +++ b/plugins/stk/voices/blow_bottle/blow_bottle_model.cpp @@ -0,0 +1,79 @@ +/* + * blow_bottle_model.cpp - data storage for blown bottle noises + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "blow_bottle_model.h" + + +blowBottleModel::blowBottleModel( bool _monophonic, + StkFloat _portamento, + StkFloat _bend, + StkFloat _bend_range, + bool _velocity_sensitive_lpf, + StkFloat _velocity_sensitive_q, + StkFloat _volume, + StkFloat _pan, + StkFloat _spread, + StkFloat _noise_gain, + StkFloat _vibrato_frequency, + StkFloat _vibrato_gain ): + stkModel( _monophonic, _portamento, _bend, _bend_range, _velocity_sensitive_lpf, _velocity_sensitive_q, _volume, _pan, _spread ), + m_noiseGain( new floatModel( _noise_gain, 0.0f, 128.0f, 0.1f, this ) ), + m_vibratoFrequency( new floatModel( _vibrato_frequency, 0.0f, 128.0f, 0.1f, this ) ), + m_vibratoGain( new floatModel( _vibrato_gain, 0.0f, 128.0f, 0.1f, this ) ) +{ +} + + + + +blowBottleModel::~blowBottleModel() +{ + delete m_noiseGain; + delete m_vibratoFrequency; + delete m_vibratoGain; +} + + + + +void FASTCALL blowBottleModel::saveSettings( QDomDocument & _doc, QDomElement & _parent ) +{ + stkModel::saveSettings( _doc, _parent ); + m_noiseGain->saveSettings( _doc, _parent, "noisegain" ); + m_vibratoFrequency->saveSettings( _doc, _parent, "vibratofrequency" ); + m_vibratoGain->saveSettings( _doc, _parent, "vibratogain" ); +} + + + + +void FASTCALL blowBottleModel::loadSettings( const QDomElement & _this ) +{ + stkModel::loadSettings( _this ); + m_noiseGain->loadSettings( _this, "noisegain" ); + m_vibratoFrequency->loadSettings( _this, "vibratofrequency" ); + m_vibratoGain->loadSettings( _this, "vibratogain" ); +} + diff --git a/plugins/stk/voices/blow_bottle/blow_bottle_model.h b/plugins/stk/voices/blow_bottle/blow_bottle_model.h new file mode 100644 index 000000000..52d9dee08 --- /dev/null +++ b/plugins/stk/voices/blow_bottle/blow_bottle_model.h @@ -0,0 +1,63 @@ +/* + * blow_bottle_model.h - data storage for blown bottle noises + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BLOW_BOTTLE_MODEL_H +#define _BLOW_BOTTLE_MODEL_H + +#include "stk_model.h" + + +class blowBottleModel: public stkModel +{ +public: + blowBottleModel( bool _monophonic = FALSE, + StkFloat _portamento = 0.0f, + StkFloat _bend = 0.0f, + StkFloat _bend_range = 2.0f, + bool _velocity_sensitive_lpf = TRUE, + StkFloat _velocity_sensitive_q = 0.5f, + StkFloat _volume = 1.0f, + StkFloat _pan = 0.0f, + StkFloat _spread = 0.0f, + StkFloat _noise_gain = 64.0f, + StkFloat _vibrato_frequency = 64.0f, + StkFloat _vibrato_gain = 64.0f ); + ~blowBottleModel(); + + inline floatModel * noiseGain( void ) { return( m_noiseGain ); } + inline floatModel * vibratoFrequency( void ) { return( m_vibratoFrequency ); } + inline floatModel * vibratoGain( void ) { return( m_vibratoGain ); } + + void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _parent ); + + void FASTCALL loadSettings( const QDomElement & _this ); + +private: + floatModel * m_noiseGain; + floatModel * m_vibratoFrequency; + floatModel * m_vibratoGain; + floatModel * m_volume; +}; + +#endif diff --git a/plugins/stk/voices/blow_bottle/blow_bottle_processor.cpp b/plugins/stk/voices/blow_bottle/blow_bottle_processor.cpp new file mode 100644 index 000000000..f65239356 --- /dev/null +++ b/plugins/stk/voices/blow_bottle/blow_bottle_processor.cpp @@ -0,0 +1,53 @@ +/* + * blow_bottle_processor.cpp - sound generator for blown bottle noises + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include "BlowBotl.h" + +#include "blow_bottle_processor.h" +#include "config_mgr.h" + + +blowBottleProcessor::blowBottleProcessor( sample_rate_t _sample_rate ): + stkProcessor( _sample_rate ) +{ +} + + + + +blowBottleProcessor::~blowBottleProcessor() +{ +} + + + + +void blowBottleProcessor::setControls( blowBottleModel * _model ) +{ + voice()->controlChange( 1, _model->vibratoGain()->value() ); + voice()->controlChange( 4, _model->noiseGain()->value() ); + voice()->controlChange( 11, _model->vibratoFrequency()->value() ); + voice()->controlChange( 128, _model->volume()->value() ); + m_delayRead = m_delayWrite - static_cast( _model->spread()->value() ); +} diff --git a/plugins/stk/voices/blow_bottle/blow_bottle_processor.h b/plugins/stk/voices/blow_bottle/blow_bottle_processor.h new file mode 100644 index 000000000..f94f8539a --- /dev/null +++ b/plugins/stk/voices/blow_bottle/blow_bottle_processor.h @@ -0,0 +1,43 @@ +/* + * blow_bottle_processor.h - sound generator for blown bottle noises + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BLOW_BOTTLE_PROCESSOR_H +#define _BLOW_BOTTLE_PROCESSOR_H + +#include "BlowBotl.h" + +#include "stk_processor.h" + +#include "blow_bottle_model.h" + +class blowBottleProcessor: public stkProcessor +{ +public: + blowBottleProcessor( sample_rate_t _sample_rate ); + ~blowBottleProcessor( void ); + + void setControls( blowBottleModel * _model ); +}; + +#endif diff --git a/plugins/stk/voices/blow_bottle/logo.png b/plugins/stk/voices/blow_bottle/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..20a6081015e8b76b4f4e96a40f8c624e5aaeb64c GIT binary patch literal 890 zcmV-=1BLvFP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4z z76CcTyF*|A00R0+L_t(&-tCuNXpUhR$N&4;%#hD~)Mm=ph7?Eh5h2az5iw502@WWx zq!cx3lBBlQlF|+okrS-pz)qMrkPvp_YcU@+8_TfWuaoPor^oAkpNIFrbpPw=eeUc2 z-~a2rp8LM9>wcww5H&S5In~wGIqI*dtE=n3llSoO@bK{P@bK{HKltU|4U|aQENPLX z5=p})B_w^6)GDb(Qlq5X&bb6|L(;N8@cmiR2OX`#~DrpbRZIGk}NgE{f zN!lIk90Jq>eLy0@Gsecfi^vZ@H$#(KZ}w}cq6NkQcZ|~stdOK!>&%yQUDA9>PbAe! zYL@g;Qjesek|s);Eorf&DbBeMlH{Blm%`b2NpB^6a?Xv6xFYlHw+xuRuikEHr zU{c`x?Mo+e1X!EF(P-d-iS13p+i0B2F$>tk-}JAxtk?@I$+Tzh0o#D7K%Q-xQeY48 z#yF3Ff;1C4YP`cS3)rbNoT@;IElfq|ig^9Ko9V6;sG#d&7O<@u&egSK1_biLgz5H` z&)XO7uqEpTo&y(w3LrPagxbx~ $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES = libblowhole.la + +libblowhole_la_SOURCES = blow_hole_model.cpp \ + blow_hole_model.h \ + blow_hole_processor.cpp \ + blow_hole_processor.h \ + blow_hole_instrument.cpp \ + blow_hole_instrument.h \ + blow_hole_instrument_view.cpp \ + blow_hole_instrument_view.h \ + $(top_srcdir)/plugins/stk/voices/src/stk_model.cpp \ + stk_model.h + + + +libblowhole_la_LDFLAGS = -L@stk_lib@ -lstk -Wl,-export-dynamic + +$(libblowhole_la_SOURCES): ./embedded_resources.h diff --git a/plugins/stk/voices/blow_hole/artwork.png b/plugins/stk/voices/blow_hole/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..03e1ce0a7b576c94314cb90f247a72102646cb2d GIT binary patch literal 71623 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 literal 0 HcmV?d00001 diff --git a/plugins/stk/voices/blow_hole/blow_hole_instrument.cpp b/plugins/stk/voices/blow_hole/blow_hole_instrument.cpp new file mode 100644 index 000000000..903770647 --- /dev/null +++ b/plugins/stk/voices/blow_hole/blow_hole_instrument.cpp @@ -0,0 +1,103 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "engine.h" +#include "note_play_handle.h" + +#include "blow_hole_instrument.h" +#include "blow_hole_instrument_view.h" +#include "blow_hole_processor.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embedded_resources.h" + + +extern "C" +{ + +plugin::descriptor blowhole_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "Blow Hole", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Blown tube noises" ), + "Danny McRae ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + +blowHoleInstrument::blowHoleInstrument( instrumentTrack * _channel_track ): + stkInstrument( _channel_track, &blowhole_plugin_descriptor ) +{ + model()->reedStiffness()->setTrack( _channel_track ); + model()->noiseGain()->setTrack( _channel_track ); + model()->toneholeState()->setTrack( _channel_track ); + model()->registerState()->setTrack( _channel_track ); + model()->breathPressure()->setTrack( _channel_track ); +} + + + + +blowHoleInstrument::~blowHoleInstrument() +{ +} + + + + +QString blowHoleInstrument::nodeName( void ) const +{ + return( blowhole_plugin_descriptor.name ); +} + + + + +pluginView * blowHoleInstrument::instantiateView( QWidget * _parent ) +{ + return( new blowHoleInstrumentView( this, _parent ) ); +} + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( model * _model, void * _data ) +{ + return( new blowHoleInstrument( static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/stk/voices/blow_hole/blow_hole_instrument.h b/plugins/stk/voices/blow_hole/blow_hole_instrument.h new file mode 100644 index 000000000..21ffb7fea --- /dev/null +++ b/plugins/stk/voices/blow_hole/blow_hole_instrument.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BLOW_HOLE_INSTRUMENT_H +#define _BLOW_HOLE_INSTRUMENT_H + +#include "stk_instrument.h" + +#include "blow_hole_processor.h" +#include "blow_hole_model.h" + + +class blowHoleInstrument : public stkInstrument +{ +public: + blowHoleInstrument( instrumentTrack * _channel_track ); + virtual ~blowHoleInstrument( void ); + + QString nodeName( void ) const; + + pluginView * instantiateView( QWidget * _parent ); +}; + +#endif diff --git a/plugins/stk/voices/blow_hole/blow_hole_instrument_view.cpp b/plugins/stk/voices/blow_hole/blow_hole_instrument_view.cpp new file mode 100644 index 000000000..c1453099d --- /dev/null +++ b/plugins/stk/voices/blow_hole/blow_hole_instrument_view.cpp @@ -0,0 +1,110 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include +#include +#include + +#include "blow_hole_instrument_view.h" + +#include +#include + +#include "engine.h" +#include "gui_templates.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +blowHoleInstrumentView::blowHoleInstrumentView( blowHoleInstrument * _instrument, QWidget * _parent ) : + stkInstrumentView( _instrument, _parent ) +{ + QVBoxLayout * vl = new QVBoxLayout( m_topView ); + QHBoxLayout * h1 = new QHBoxLayout(); + QHBoxLayout * h2 = new QHBoxLayout(); + QHBoxLayout * h3 = new QHBoxLayout(); + + + m_reedStiffness = new knob( knobSmall_17, m_topView, tr( "Stiffness" ) ); + m_reedStiffness->setLabel( tr( "Reed Stiffness" ) ); + m_reedStiffness->setHintText( tr( "Stiffness:" ) + " ", "" ); + + m_noiseGain = new knob( knobSmall_17, m_topView, tr( "Noise" ) ); + m_noiseGain->setLabel( tr( "Noise Gain" ) ); + m_noiseGain->setHintText( tr( "Noise:" ) + " ", "" ); + + m_toneholeState = new knob( knobSmall_17, m_topView, tr( "Tone Hole" ) ); + m_toneholeState->setLabel( tr( "Tone Hole" ) ); + m_toneholeState->setHintText( tr( "Tone Hole:" ) + " ", "" ); + + m_registerState = new knob( knobSmall_17, m_topView, tr( "Register" ) ); + m_registerState->setLabel( tr( "Register" ) ); + m_registerState->setHintText( tr( "Register:" ) + " ", "" ); + + m_breathPressure = new knob( knobSmall_17, m_topView, tr( "Breath Pres" ) ); + m_breathPressure->setLabel( tr( "Breath Pressure" ) ); + m_breathPressure->setHintText( tr( "Pressure:" ) + " ", "" ); + + h1->addWidget( m_reedStiffness ); + h1->addWidget( m_noiseGain ); + + h2->addWidget( m_toneholeState ); + h2->addWidget( m_registerState ); + + h3->addWidget( m_breathPressure ); + + vl->addLayout( h1 ); + vl->addLayout( h2 ); + vl->addLayout( h3 ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); +} + + + + +blowHoleInstrumentView::~blowHoleInstrumentView() +{ +} + + + + +void blowHoleInstrumentView::modelChanged( void ) +{ + stkInstrumentView::modelChanged(); + + blowHoleInstrument * inst = castModel(); + m_reedStiffness->setModel( inst->model()->reedStiffness() ); + m_noiseGain->setModel( inst->model()->noiseGain() ); + m_toneholeState->setModel( inst->model()->toneholeState() ); + m_registerState->setModel( inst->model()->registerState() ); + m_breathPressure->setModel( inst->model()->breathPressure() ); +} + + + diff --git a/plugins/stk/voices/blow_hole/blow_hole_instrument_view.h b/plugins/stk/voices/blow_hole/blow_hole_instrument_view.h new file mode 100644 index 000000000..7631fe0c2 --- /dev/null +++ b/plugins/stk/voices/blow_hole/blow_hole_instrument_view.h @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BLOW_HOLE_INSTRUMENT_VIEW_H +#define _BLOW_HOLE_INSTRUMENT_VIEW_H + +#include "knob.h" + +#include "stk_instrument_view.h" +#include "blow_hole_instrument.h" + + +class blowHoleInstrumentView: public stkInstrumentView +{ +public: + blowHoleInstrumentView( blowHoleInstrument * _instrument, QWidget * _parent ); + virtual ~blowHoleInstrumentView( void ); + +private: + virtual void modelChanged( void ); + + knob * m_reedStiffness; + knob * m_noiseGain; + knob * m_toneholeState; + knob * m_registerState; + knob * m_breathPressure; +}; + +#endif diff --git a/plugins/stk/voices/blow_hole/blow_hole_model.cpp b/plugins/stk/voices/blow_hole/blow_hole_model.cpp new file mode 100644 index 000000000..d0f753666 --- /dev/null +++ b/plugins/stk/voices/blow_hole/blow_hole_model.cpp @@ -0,0 +1,88 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "blow_hole_model.h" + + +blowHoleModel::blowHoleModel( bool _monophonic, + StkFloat _portamento, + StkFloat _bend, + StkFloat _bend_range, + bool _velocity_sensitive_lpf, + StkFloat _velocity_sensitive_q, + StkFloat _volume, + StkFloat _pan, + StkFloat _spread, + StkFloat _reed_stiffness, + StkFloat _noise_gain, + StkFloat _tonehole_state, + StkFloat _register_state, + StkFloat _breath_pressure ): + stkModel( _monophonic, _portamento, _bend, _bend_range, _velocity_sensitive_lpf, _velocity_sensitive_q, _volume, _pan, _spread ), + m_reedStiffness( new floatModel( _reed_stiffness, 0.0f, 128.0f, 0.1f, this ) ), + m_noiseGain( new floatModel( _noise_gain, 0.0f, 128.0f, 0.1f, this ) ), + m_toneholeState( new floatModel( _tonehole_state, 0.0f, 128.0f, 0.1f, this ) ), + m_registerState( new floatModel( _register_state, 0.0f, 128.0f, 0.1f, this ) ), + m_breathPressure( new floatModel( _breath_pressure, 0.0f, 128.0f, 0.1f, this ) ) +{ +} + + + + +blowHoleModel::~blowHoleModel() +{ + delete m_reedStiffness; + delete m_noiseGain; + delete m_toneholeState; + delete m_registerState; + delete m_breathPressure; +} + + + + +void FASTCALL blowHoleModel::saveSettings( QDomDocument & _doc, QDomElement & _parent ) +{ + stkModel::saveSettings( _doc, _parent ); + m_reedStiffness->saveSettings( _doc, _parent, "reedstiffness" ); + m_noiseGain->saveSettings( _doc, _parent, "noisegain" ); + m_toneholeState->saveSettings( _doc, _parent, "toneholestate" ); + m_registerState->saveSettings( _doc, _parent, "registerstate" ); + m_breathPressure->saveSettings( _doc, _parent, "breathpressure" ); +} + + + + +void FASTCALL blowHoleModel::loadSettings( const QDomElement & _this ) +{ + stkModel::loadSettings( _this ); + m_reedStiffness->loadSettings( _this, "reedstiffness" ); + m_noiseGain->loadSettings( _this, "noisegain" ); + m_toneholeState->loadSettings( _this, "toneholestate" ); + m_registerState->loadSettings( _this, "registerstate" ); + m_breathPressure->loadSettings( _this, "breathpressure" ); +} + diff --git a/plugins/stk/voices/blow_hole/blow_hole_model.h b/plugins/stk/voices/blow_hole/blow_hole_model.h new file mode 100644 index 000000000..302081a7f --- /dev/null +++ b/plugins/stk/voices/blow_hole/blow_hole_model.h @@ -0,0 +1,67 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BLOW_HOLE_MODEL_H +#define _BLOW_HOLE_MODEL_H + +#include "stk_model.h" + + +class blowHoleModel: public stkModel +{ +public: + blowHoleModel( bool _monophonic = FALSE, + StkFloat _portamento = 0.0f, + StkFloat _bend = 0.0f, + StkFloat _bend_range = 2.0f, + bool _velocity_sensitive_lpf = TRUE, + StkFloat _velocity_sensitive_q = 0.5f, + StkFloat _volume = 1.0f, + StkFloat _pan = 0.0f, + StkFloat _spread = 0.0f, + StkFloat _reed_stiffness = 64.0f, + StkFloat _noise_gain = 64.0f, + StkFloat _tonehole_state = 64.0f, + StkFloat _register_state = 64.0f, + StkFloat _breath_pressure = 64.0f ); + ~blowHoleModel(); + + inline floatModel * reedStiffness( void ) { return( m_reedStiffness ); } + inline floatModel * noiseGain( void ) { return( m_noiseGain ); } + inline floatModel * toneholeState( void ) { return( m_toneholeState ); } + inline floatModel * registerState( void ) { return( m_registerState ); } + inline floatModel * breathPressure( void ) { return( m_breathPressure ); } + + void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _parent ); + + void FASTCALL loadSettings( const QDomElement & _this ); + +private: + floatModel * m_reedStiffness; + floatModel * m_noiseGain; + floatModel * m_toneholeState; + floatModel * m_registerState; + floatModel * m_breathPressure; +}; + +#endif diff --git a/plugins/stk/voices/blow_hole/blow_hole_processor.cpp b/plugins/stk/voices/blow_hole/blow_hole_processor.cpp new file mode 100644 index 000000000..13ce2fefc --- /dev/null +++ b/plugins/stk/voices/blow_hole/blow_hole_processor.cpp @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include "blow_hole_processor.h" +#include "config_mgr.h" + + +blowHoleProcessor::blowHoleProcessor( sample_rate_t _sample_rate ): + stkProcessor( _sample_rate, 20.0f ) +{ +} + + + + +blowHoleProcessor::~blowHoleProcessor() +{ +} + + + + +void blowHoleProcessor::setControls( blowHoleModel * _model ) +{ + voice()->controlChange( 1, _model->registerState()->value() ); + voice()->controlChange( 2, _model->reedStiffness()->value() ); + voice()->controlChange( 4, _model->noiseGain()->value() ); + voice()->controlChange( 11, _model->toneholeState()->value() ); + voice()->controlChange( 128, _model->breathPressure()->value() ); + m_delayRead = m_delayWrite - static_cast( _model->spread()->value() ); +} diff --git a/plugins/stk/voices/blow_hole/blow_hole_processor.h b/plugins/stk/voices/blow_hole/blow_hole_processor.h new file mode 100644 index 000000000..331aeba3c --- /dev/null +++ b/plugins/stk/voices/blow_hole/blow_hole_processor.h @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BLOW_HOLE_PROCESSOR_H +#define _BLOW_HOLE_PROCESSOR_H + +#include "BlowHole.h" + +#include "stk_processor.h" + +#include "blow_hole_model.h" + +class blowHoleProcessor: public stkProcessor +{ +public: + blowHoleProcessor( sample_rate_t _sample_rate ); + ~blowHoleProcessor( void ); + + void setControls( blowHoleModel * _model ); +}; + +#endif diff --git a/plugins/stk/voices/blow_hole/logo.png b/plugins/stk/voices/blow_hole/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..20a6081015e8b76b4f4e96a40f8c624e5aaeb64c GIT binary patch literal 890 zcmV-=1BLvFP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4z z76CcTyF*|A00R0+L_t(&-tCuNXpUhR$N&4;%#hD~)Mm=ph7?Eh5h2az5iw502@WWx zq!cx3lBBlQlF|+okrS-pz)qMrkPvp_YcU@+8_TfWuaoPor^oAkpNIFrbpPw=eeUc2 z-~a2rp8LM9>wcww5H&S5In~wGIqI*dtE=n3llSoO@bK{P@bK{HKltU|4U|aQENPLX z5=p})B_w^6)GDb(Qlq5X&bb6|L(;N8@cmiR2OX`#~DrpbRZIGk}NgE{f zN!lIk90Jq>eLy0@Gsecfi^vZ@H$#(KZ}w}cq6NkQcZ|~stdOK!>&%yQUDA9>PbAe! zYL@g;Qjesek|s);Eorf&DbBeMlH{Blm%`b2NpB^6a?Xv6xFYlHw+xuRuikEHr zU{c`x?Mo+e1X!EF(P-d-iS13p+i0B2F$>tk-}JAxtk?@I$+Tzh0o#D7K%Q-xQeY48 z#yF3Ff;1C4YP`cS3)rbNoT@;IElfq|ig^9Ko9V6;sG#d&7O<@u&egSK1_biLgz5H` z&)XO7uqEpTo&y(w3LrPagxbx~ $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES = libbowed.la + +libbowed_la_SOURCES = bowed_model.cpp \ + bowed_model.h \ + bowed_processor.cpp \ + bowed_processor.h \ + bowed_instrument.cpp \ + bowed_instrument.h \ + bowed_instrument_view.cpp \ + bowed_instrument_view.h \ + $(top_srcdir)/plugins/stk/voices/src/stk_model.cpp \ + stk_model.h + + + +libbowed_la_LDFLAGS = -L@stk_lib@ -lstk -Wl,-export-dynamic + +$(libbowed_la_SOURCES): ./embedded_resources.h diff --git a/plugins/stk/voices/bowed/artwork.png b/plugins/stk/voices/bowed/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..5cbf673a0872e107067f78488dbe73189fef8d02 GIT binary patch literal 71559 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 + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "engine.h" +#include "note_play_handle.h" + +#include "bowed_instrument.h" +#include "bowed_instrument_view.h" +#include "bowed_processor.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embedded_resources.h" + + +extern "C" +{ + +plugin::descriptor bowed_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "Bowed", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Bowed string" ), + "Danny McRae ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + +bowedInstrument::bowedInstrument( instrumentTrack * _channel_track ): + stkInstrument( _channel_track, &bowed_plugin_descriptor ) +{ + model()->bowPressure()->setTrack( _channel_track ); + model()->bowPosition()->setTrack( _channel_track ); + model()->vibratoFrequency()->setTrack( _channel_track ); + model()->vibratoGain()->setTrack( _channel_track ); +} + + + + +bowedInstrument::~bowedInstrument() +{ +} + + + + +QString bowedInstrument::nodeName( void ) const +{ + return( bowed_plugin_descriptor.name ); +} + + + + +pluginView * bowedInstrument::instantiateView( QWidget * _parent ) +{ + return( new bowedInstrumentView( this, _parent ) ); +} + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( model * _model, void * _data ) +{ + return( new bowedInstrument( static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/stk/voices/bowed/bowed_instrument.h b/plugins/stk/voices/bowed/bowed_instrument.h new file mode 100644 index 000000000..82fbb9017 --- /dev/null +++ b/plugins/stk/voices/bowed/bowed_instrument.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BOWED_INSTRUMENT_H +#define _BOWED_INSTRUMENT_H + +#include "stk_instrument.h" + +#include "bowed_processor.h" +#include "bowed_model.h" + + +class bowedInstrument : public stkInstrument +{ +public: + bowedInstrument( instrumentTrack * _channel_track ); + virtual ~bowedInstrument( void ); + + QString nodeName( void ) const; + + pluginView * instantiateView( QWidget * _parent ); +}; + +#endif diff --git a/plugins/stk/voices/bowed/bowed_instrument_view.cpp b/plugins/stk/voices/bowed/bowed_instrument_view.cpp new file mode 100644 index 000000000..2493b2571 --- /dev/null +++ b/plugins/stk/voices/bowed/bowed_instrument_view.cpp @@ -0,0 +1,100 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include +#include +#include + +#include "bowed_instrument_view.h" + +#include +#include + +#include "engine.h" +#include "gui_templates.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +bowedInstrumentView::bowedInstrumentView( bowedInstrument * _instrument, QWidget * _parent ) : + stkInstrumentView( _instrument, _parent ) +{ + QVBoxLayout * vl = new QVBoxLayout( m_topView ); + QHBoxLayout * h1 = new QHBoxLayout; + QHBoxLayout * h2 = new QHBoxLayout; + + m_bowPressure = new knob( knobSmall_17, m_topView, tr( "Pressure" ) ); + m_bowPressure->setLabel( tr( "Bow Pressure" ) ); + m_bowPressure->setHintText( tr( "Pressure:" ) + " ", "" ); + + m_bowPosition = new knob( knobSmall_17, m_topView, tr( "Position" ) ); + m_bowPosition->setLabel( tr( "Bow Position" ) ); + m_bowPosition->setHintText( tr( "Position:" ) + " ", "" ); + + m_vibratoFrequency = new knob( knobSmall_17, m_topView, tr( "Vib Freq" ) ); + m_vibratoFrequency->setLabel( tr( "Vibrato Frequency" ) ); + m_vibratoFrequency->setHintText( tr( "Vib Freq:" ) + " ", "" ); + + m_vibratoGain = new knob( knobSmall_17, m_topView, tr( "Vib Gain" ) ); + m_vibratoGain->setLabel( tr( "Vibrato Gain" ) ); + m_vibratoGain->setHintText( tr( "Vib Gain:" ) + " ", "" ); + + h1->addWidget( m_bowPressure ); + h1->addWidget( m_bowPosition ); + + h2->addWidget( m_vibratoFrequency ); + h2->addWidget( m_vibratoGain ); + + vl->addLayout( h1 ); + vl->addLayout( h2 ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); +} + + + + +bowedInstrumentView::~bowedInstrumentView() +{ +} + + + + +void bowedInstrumentView::modelChanged( void ) +{ + stkInstrumentView::modelChanged(); + + bowedInstrument * inst = castModel(); + m_bowPressure->setModel( inst->model()->bowPressure() ); + m_bowPosition->setModel( inst->model()->bowPosition() ); + m_vibratoFrequency->setModel( inst->model()->vibratoFrequency() ); + m_vibratoGain->setModel( inst->model()->vibratoGain() ); +} + + + diff --git a/plugins/stk/voices/bowed/bowed_instrument_view.h b/plugins/stk/voices/bowed/bowed_instrument_view.h new file mode 100644 index 000000000..20237bf37 --- /dev/null +++ b/plugins/stk/voices/bowed/bowed_instrument_view.h @@ -0,0 +1,50 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BOWED_INSTRUMENT_VIEW_H +#define _BOWED_INSTRUMENT_VIEW_H + +#include "knob.h" + +#include "stk_instrument_view.h" +#include "bowed_instrument.h" + + +class bowedInstrumentView: public stkInstrumentView +{ +public: + bowedInstrumentView( bowedInstrument * _instrument, QWidget * _parent ); + virtual ~bowedInstrumentView( void ); + +private: + virtual void modelChanged( void ); + + knob * m_bowPressure; + knob * m_bowPosition; + knob * m_vibratoFrequency; + knob * m_vibratoGain; +}; + +#endif diff --git a/plugins/stk/voices/bowed/bowed_model.cpp b/plugins/stk/voices/bowed/bowed_model.cpp new file mode 100644 index 000000000..e5d9cab66 --- /dev/null +++ b/plugins/stk/voices/bowed/bowed_model.cpp @@ -0,0 +1,83 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "bowed_model.h" + + +bowedModel::bowedModel( bool _monophonic, + StkFloat _portamento, + StkFloat _bend, + StkFloat _bend_range, + bool _velocity_sensitive_lpf, + StkFloat _velocity_sensitive_q, + StkFloat _volume, + StkFloat _pan, + StkFloat _spread, + StkFloat _bow_pressure, + StkFloat _bow_position, + StkFloat _vibrato_frequency, + StkFloat _vibrato_gain ): + stkModel( _monophonic, _portamento, _bend, _bend_range, _velocity_sensitive_lpf, _velocity_sensitive_q, _volume, _pan, _spread ), + m_bowPressure( new floatModel( _bow_pressure, 0.0f, 128.0f, 0.1f, this ) ), + m_bowPosition( new floatModel( _bow_position, 0.0f, 128.0f, 0.1f, this ) ), + m_vibratoFrequency( new floatModel( _vibrato_frequency, 0.0f, 128.0f, 0.1f, this ) ), + m_vibratoGain( new floatModel( _vibrato_gain, 0.0f, 128.0f, 0.1f, this ) ) +{ +} + + + + +bowedModel::~bowedModel() +{ + delete m_bowPressure; + delete m_bowPosition; + delete m_vibratoFrequency; + delete m_vibratoGain; +} + + + + +void FASTCALL bowedModel::saveSettings( QDomDocument & _doc, QDomElement & _parent ) +{ + stkModel::saveSettings( _doc, _parent ); + m_bowPressure->saveSettings( _doc, _parent, "bowpressure" ); + m_bowPosition->saveSettings( _doc, _parent, "bowgain" ); + m_vibratoFrequency->saveSettings( _doc, _parent, "vibratofrequency" ); + m_vibratoGain->saveSettings( _doc, _parent, "vibratogain" ); +} + + + + +void FASTCALL bowedModel::loadSettings( const QDomElement & _this ) +{ + stkModel::loadSettings( _this ); + m_bowPressure->loadSettings( _this, "bowpressure" ); + m_bowPosition->loadSettings( _this, "bowposition" ); + m_vibratoFrequency->loadSettings( _this, "vibratofrequency" ); + m_vibratoGain->loadSettings( _this, "vibratogain" ); +} + diff --git a/plugins/stk/voices/bowed/bowed_model.h b/plugins/stk/voices/bowed/bowed_model.h new file mode 100644 index 000000000..7fd67a895 --- /dev/null +++ b/plugins/stk/voices/bowed/bowed_model.h @@ -0,0 +1,79 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BOWED_MODEL_H +#define _BOWED_MODEL_H + +#include "stk_model.h" + + +class bowedModel: public stkModel +{ +public: + bowedModel( bool _monophonic = FALSE, + StkFloat _portamento = 0.0f, + StkFloat _bend = 0.0f, + StkFloat _bend_range = 2.0f, + bool _velocity_sensitive_lpf = TRUE, + StkFloat _velocity_sensitive_q = 0.5f, + StkFloat _volume = 1.0f, + StkFloat _pan = 0.0f, + StkFloat _spread = 0.0f, + StkFloat _bow_pressure = 64.0f, + StkFloat _bow_position = 64.0f, + StkFloat _vibrato_frequency = 64.0f, + StkFloat _vibrato_gain = 64.0f ); + ~bowedModel(); + + inline floatModel * bowPressure( void ) const + { + return( m_bowPressure ); + } + + inline floatModel * bowPosition( void ) const + { + return( m_bowPosition ); + } + + inline floatModel * vibratoFrequency( void ) const + { + return( m_vibratoFrequency ); + } + + inline floatModel * vibratoGain( void ) const + { + return( m_vibratoGain ); + } + + void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _parent ); + + void FASTCALL loadSettings( const QDomElement & _this ); + +private: + floatModel * m_bowPressure; + floatModel * m_bowPosition; + floatModel * m_vibratoFrequency; + floatModel * m_vibratoGain; +}; + +#endif diff --git a/plugins/stk/voices/bowed/bowed_processor.cpp b/plugins/stk/voices/bowed/bowed_processor.cpp new file mode 100644 index 000000000..ab165c6f9 --- /dev/null +++ b/plugins/stk/voices/bowed/bowed_processor.cpp @@ -0,0 +1,50 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include "bowed_processor.h" +#include "config_mgr.h" + + +bowedProcessor::bowedProcessor( sample_rate_t _sample_rate ): + stkProcessor( _sample_rate, 20.0f ) +{ +} + + + + +bowedProcessor::~bowedProcessor() +{ +} + + + + +void bowedProcessor::setControls( bowedModel * _model ) +{ + voice()->controlChange( 2, _model->bowPressure()->value() ); + voice()->controlChange( 4, _model->bowPosition()->value() ); + voice()->controlChange( 11, _model->vibratoFrequency()->value() ); + voice()->controlChange( 1, _model->vibratoGain()->value() ); + m_delayRead = m_delayWrite - static_cast( _model->spread()->value() ); +} diff --git a/plugins/stk/voices/bowed/bowed_processor.h b/plugins/stk/voices/bowed/bowed_processor.h new file mode 100644 index 000000000..6fd34cffa --- /dev/null +++ b/plugins/stk/voices/bowed/bowed_processor.h @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BOWED_PROCESSOR_H +#define _BOWED_PROCESSOR_H + +#include "Bowed.h" + +#include "stk_processor.h" + +#include "bowed_model.h" + +class bowedProcessor: public stkProcessor +{ +public: + bowedProcessor( sample_rate_t _sample_rate ); + ~bowedProcessor( void ); + + void setControls( bowedModel * _model ); +}; + +#endif diff --git a/plugins/stk/voices/bowed/logo.png b/plugins/stk/voices/bowed/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..20a6081015e8b76b4f4e96a40f8c624e5aaeb64c GIT binary patch literal 890 zcmV-=1BLvFP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4z z76CcTyF*|A00R0+L_t(&-tCuNXpUhR$N&4;%#hD~)Mm=ph7?Eh5h2az5iw502@WWx zq!cx3lBBlQlF|+okrS-pz)qMrkPvp_YcU@+8_TfWuaoPor^oAkpNIFrbpPw=eeUc2 z-~a2rp8LM9>wcww5H&S5In~wGIqI*dtE=n3llSoO@bK{P@bK{HKltU|4U|aQENPLX z5=p})B_w^6)GDb(Qlq5X&bb6|L(;N8@cmiR2OX`#~DrpbRZIGk}NgE{f zN!lIk90Jq>eLy0@Gsecfi^vZ@H$#(KZ}w}cq6NkQcZ|~stdOK!>&%yQUDA9>PbAe! zYL@g;Qjesek|s);Eorf&DbBeMlH{Blm%`b2NpB^6a?Xv6xFYlHw+xuRuikEHr zU{c`x?Mo+e1X!EF(P-d-iS13p+i0B2F$>tk-}JAxtk?@I$+Tzh0o#D7K%Q-xQeY48 z#yF3Ff;1C4YP`cS3)rbNoT@;IElfq|ig^9Ko9V6;sG#d&7O<@u&egSK1_biLgz5H` z&)XO7uqEpTo&y(w3LrPagxbx~ $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES = libbrass.la + +libbrass_la_SOURCES = brass_model.cpp \ + brass_model.h \ + brass_processor.cpp \ + brass_processor.h \ + brass_instrument.cpp \ + brass_instrument.h \ + brass_instrument_view.cpp \ + brass_instrument_view.h \ + $(top_srcdir)/plugins/stk/voices/src/stk_model.cpp \ + stk_model.h + + + +libbrass_la_LDFLAGS = -L@stk_lib@ -lstk -Wl,-export-dynamic + +$(libbrass_la_SOURCES): ./embedded_resources.h diff --git a/plugins/stk/voices/brass/artwork.png b/plugins/stk/voices/brass/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..427a997a1d725cb195355845349d4fa0b47d5b1d GIT binary patch literal 71358 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 literal 0 HcmV?d00001 diff --git a/plugins/stk/voices/brass/brass_instrument.cpp b/plugins/stk/voices/brass/brass_instrument.cpp new file mode 100644 index 000000000..744817af8 --- /dev/null +++ b/plugins/stk/voices/brass/brass_instrument.cpp @@ -0,0 +1,102 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "engine.h" +#include "note_play_handle.h" + +#include "brass_instrument.h" +#include "brass_instrument_view.h" +#include "brass_processor.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embedded_resources.h" + + +extern "C" +{ + +plugin::descriptor brass_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "Brass", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Brass sounds" ), + "Danny McRae ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + +brassInstrument::brassInstrument( instrumentTrack * _channel_track ): + stkInstrument( _channel_track, &brass_plugin_descriptor ) +{ + model()->lipTension()->setTrack( _channel_track ); + model()->slideLength()->setTrack( _channel_track ); + model()->vibratoFrequency()->setTrack( _channel_track ); + model()->vibratoGain()->setTrack( _channel_track ); +} + + + + +brassInstrument::~brassInstrument() +{ +} + + + + +QString brassInstrument::nodeName( void ) const +{ + return( brass_plugin_descriptor.name ); +} + + + + +pluginView * brassInstrument::instantiateView( QWidget * _parent ) +{ + return( new brassInstrumentView( this, _parent ) ); +} + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( model * _model, void * _data ) +{ + return( new brassInstrument( static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/stk/voices/brass/brass_instrument.h b/plugins/stk/voices/brass/brass_instrument.h new file mode 100644 index 000000000..502414798 --- /dev/null +++ b/plugins/stk/voices/brass/brass_instrument.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BRASS_INSTRUMENT_H +#define _BRASS_INSTRUMENT_H + +#include "stk_instrument.h" + +#include "brass_processor.h" +#include "brass_model.h" + + +class brassInstrument : public stkInstrument +{ +public: + brassInstrument( instrumentTrack * _channel_track ); + virtual ~brassInstrument( void ); + + QString nodeName( void ) const; + + pluginView * instantiateView( QWidget * _parent ); +}; + +#endif diff --git a/plugins/stk/voices/brass/brass_instrument_view.cpp b/plugins/stk/voices/brass/brass_instrument_view.cpp new file mode 100644 index 000000000..9b303aa97 --- /dev/null +++ b/plugins/stk/voices/brass/brass_instrument_view.cpp @@ -0,0 +1,100 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include +#include +#include + +#include "brass_instrument_view.h" + +#include +#include + +#include "engine.h" +#include "gui_templates.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +brassInstrumentView::brassInstrumentView( brassInstrument * _instrument, QWidget * _parent ) : + stkInstrumentView( _instrument, _parent ) +{ + QVBoxLayout * vl = new QVBoxLayout( m_topView ); + QHBoxLayout * h1 = new QHBoxLayout; + QHBoxLayout * h2 = new QHBoxLayout; + + m_lipTension = new knob( knobSmall_17, m_topView, tr( "Tension" ) ); + m_lipTension->setLabel( tr( "Lip Tension" ) ); + m_lipTension->setHintText( tr( "Tension:" ) + " ", "" ); + + m_slideLength = new knob( knobSmall_17, m_topView, tr( "Length" ) ); + m_slideLength->setLabel( tr( "Slide Length" ) ); + m_slideLength->setHintText( tr( "Length:" ) + " ", "" ); + + m_vibratoFrequency = new knob( knobSmall_17, m_topView, tr( "Vib Freq" ) ); + m_vibratoFrequency->setLabel( tr( "Vibrato Frequency" ) ); + m_vibratoFrequency->setHintText( tr( "Vib Freq:" ) + " ", "" ); + + m_vibratoGain = new knob( knobSmall_17, m_topView, tr( "Vib Gain" ) ); + m_vibratoGain->setLabel( tr( "Vibrato Gain" ) ); + m_vibratoGain->setHintText( tr( "Vib Gain:" ) + " ", "" ); + + h1->addWidget( m_lipTension ); + h1->addWidget( m_slideLength ); + + h2->addWidget( m_vibratoFrequency ); + h2->addWidget( m_vibratoGain ); + + vl->addLayout( h1 ); + vl->addLayout( h2 ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); +} + + + + +brassInstrumentView::~brassInstrumentView() +{ +} + + + + +void brassInstrumentView::modelChanged( void ) +{ + stkInstrumentView::modelChanged(); + + brassInstrument * inst = castModel(); + m_lipTension->setModel( inst->model()->lipTension() ); + m_slideLength->setModel( inst->model()->slideLength() ); + m_vibratoFrequency->setModel( inst->model()->vibratoFrequency() ); + m_vibratoGain->setModel( inst->model()->vibratoGain() ); +} + + + diff --git a/plugins/stk/voices/brass/brass_instrument_view.h b/plugins/stk/voices/brass/brass_instrument_view.h new file mode 100644 index 000000000..e06e5ae9d --- /dev/null +++ b/plugins/stk/voices/brass/brass_instrument_view.h @@ -0,0 +1,50 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BRASS_INSTRUMENT_VIEW_H +#define _BRASS_INSTRUMENT_VIEW_H + +#include "knob.h" + +#include "stk_instrument_view.h" +#include "brass_instrument.h" + + +class brassInstrumentView: public stkInstrumentView +{ +public: + brassInstrumentView( brassInstrument * _instrument, QWidget * _parent ); + virtual ~brassInstrumentView( void ); + +private: + virtual void modelChanged( void ); + + knob * m_lipTension; + knob * m_slideLength; + knob * m_vibratoFrequency; + knob * m_vibratoGain; +}; + +#endif diff --git a/plugins/stk/voices/brass/brass_model.cpp b/plugins/stk/voices/brass/brass_model.cpp new file mode 100644 index 000000000..ffb08173b --- /dev/null +++ b/plugins/stk/voices/brass/brass_model.cpp @@ -0,0 +1,83 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "brass_model.h" + + +brassModel::brassModel( bool _monophonic, + StkFloat _portamento, + StkFloat _bend, + StkFloat _bend_range, + bool _velocity_sensitive_lpf, + StkFloat _velocity_sensitive_q, + StkFloat _volume, + StkFloat _pan, + StkFloat _spread, + StkFloat _lip_tension, + StkFloat _slide_length, + StkFloat _vibrato_frequency, + StkFloat _vibrato_gain ): + stkModel( _monophonic, _portamento, _bend, _bend_range, _velocity_sensitive_lpf, _velocity_sensitive_q, _volume, _pan, _spread ), + m_lipTension( new floatModel( _lip_tension, 0.0f, 128.0f, 0.1f, this ) ), + m_slideLength( new floatModel( _slide_length, 0.0f, 128.0f, 0.1f, this ) ), + m_vibratoFrequency( new floatModel( _vibrato_frequency, 0.0f, 128.0f, 0.1f, this ) ), + m_vibratoGain( new floatModel( _vibrato_gain, 0.0f, 128.0f, 0.1f, this ) ) +{ +} + + + + +brassModel::~brassModel() +{ + delete m_lipTension; + delete m_slideLength; + delete m_vibratoFrequency; + delete m_vibratoGain; +} + + + + +void FASTCALL brassModel::saveSettings( QDomDocument & _doc, QDomElement & _parent ) +{ + stkModel::saveSettings( _doc, _parent ); + m_lipTension->saveSettings( _doc, _parent, "liptension" ); + m_slideLength->saveSettings( _doc, _parent, "slidelength" ); + m_vibratoFrequency->saveSettings( _doc, _parent, "vibratofrequency" ); + m_vibratoGain->saveSettings( _doc, _parent, "vibratogain" ); +} + + + + +void FASTCALL brassModel::loadSettings( const QDomElement & _this ) +{ + stkModel::loadSettings( _this ); + m_lipTension->loadSettings( _this, "liptension" ); + m_slideLength->loadSettings( _this, "slidelength" ); + m_vibratoFrequency->loadSettings( _this, "vibratofrequency" ); + m_vibratoGain->loadSettings( _this, "vibratogain" ); +} + diff --git a/plugins/stk/voices/brass/brass_model.h b/plugins/stk/voices/brass/brass_model.h new file mode 100644 index 000000000..1bdecc609 --- /dev/null +++ b/plugins/stk/voices/brass/brass_model.h @@ -0,0 +1,79 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BRASS_MODEL_H +#define _BRASS_MODEL_H + +#include "stk_model.h" + + +class brassModel: public stkModel +{ +public: + brassModel( bool _monophonic = FALSE, + StkFloat _portamento = 0.0f, + StkFloat _bend = 0.0f, + StkFloat _bend_range = 2.0f, + bool _velocity_sensitive_lpf = TRUE, + StkFloat _velocity_sensitive_q = 0.5f, + StkFloat _volume = 1.0f, + StkFloat _pan = 0.0f, + StkFloat _spread = 0.0f, + StkFloat _lip_tension = 64.0f, + StkFloat _slid_position = 64.0f, + StkFloat _vibrato_frequency = 64.0f, + StkFloat _vibrato_gain = 64.0f ); + ~brassModel(); + + inline floatModel * lipTension( void ) const + { + return( m_lipTension ); + } + + inline floatModel * slideLength( void ) const + { + return( m_slideLength ); + } + + inline floatModel * vibratoFrequency( void ) const + { + return( m_vibratoFrequency ); + } + + inline floatModel * vibratoGain( void ) const + { + return( m_vibratoGain ); + } + + void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _parent ); + + void FASTCALL loadSettings( const QDomElement & _this ); + +private: + floatModel * m_lipTension; + floatModel * m_slideLength; + floatModel * m_vibratoFrequency; + floatModel * m_vibratoGain; +}; + +#endif diff --git a/plugins/stk/voices/brass/brass_processor.cpp b/plugins/stk/voices/brass/brass_processor.cpp new file mode 100644 index 000000000..11057adfc --- /dev/null +++ b/plugins/stk/voices/brass/brass_processor.cpp @@ -0,0 +1,50 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include "brass_processor.h" +#include "config_mgr.h" + + +brassProcessor::brassProcessor( sample_rate_t _sample_rate ): + stkProcessor( _sample_rate, 20.0f ) +{ +} + + + + +brassProcessor::~brassProcessor() +{ +} + + + + +void brassProcessor::setControls( brassModel * _model ) +{ + voice()->controlChange( 2, _model->lipTension()->value() ); + voice()->controlChange( 4, _model->slideLength()->value() ); + voice()->controlChange( 11, _model->vibratoFrequency()->value() ); + voice()->controlChange( 1, _model->vibratoGain()->value() ); + m_delayRead = m_delayWrite - static_cast( _model->spread()->value() ); +} diff --git a/plugins/stk/voices/brass/brass_processor.h b/plugins/stk/voices/brass/brass_processor.h new file mode 100644 index 000000000..b6c5d2c82 --- /dev/null +++ b/plugins/stk/voices/brass/brass_processor.h @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BRASS_PROCESSOR_H +#define _BRASS_PROCESSOR_H + +#include "Brass.h" + +#include "stk_processor.h" + +#include "brass_model.h" + +class brassProcessor: public stkProcessor +{ +public: + brassProcessor( sample_rate_t _sample_rate ); + ~brassProcessor( void ); + + void setControls( brassModel * _model ); +}; + +#endif diff --git a/plugins/stk/voices/brass/logo.png b/plugins/stk/voices/brass/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..20a6081015e8b76b4f4e96a40f8c624e5aaeb64c GIT binary patch literal 890 zcmV-=1BLvFP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4z z76CcTyF*|A00R0+L_t(&-tCuNXpUhR$N&4;%#hD~)Mm=ph7?Eh5h2az5iw502@WWx zq!cx3lBBlQlF|+okrS-pz)qMrkPvp_YcU@+8_TfWuaoPor^oAkpNIFrbpPw=eeUc2 z-~a2rp8LM9>wcww5H&S5In~wGIqI*dtE=n3llSoO@bK{P@bK{HKltU|4U|aQENPLX z5=p})B_w^6)GDb(Qlq5X&bb6|L(;N8@cmiR2OX`#~DrpbRZIGk}NgE{f zN!lIk90Jq>eLy0@Gsecfi^vZ@H$#(KZ}w}cq6NkQcZ|~stdOK!>&%yQUDA9>PbAe! zYL@g;Qjesek|s);Eorf&DbBeMlH{Blm%`b2NpB^6a?Xv6xFYlHw+xuRuikEHr zU{c`x?Mo+e1X!EF(P-d-iS13p+i0B2F$>tk-}JAxtk?@I$+Tzh0o#D7K%Q-xQeY48 z#yF3Ff;1C4YP`cS3)rbNoT@;IElfq|ig^9Ko9V6;sG#d&7O<@u&egSK1_biLgz5H` z&)XO7uqEpTo&y(w3LrPagxbx~ $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES = libclarinet.la + +libclarinet_la_SOURCES = clarinet_model.cpp \ + clarinet_model.h \ + clarinet_processor.cpp \ + clarinet_processor.h \ + clarinet_instrument.cpp \ + clarinet_instrument.h \ + clarinet_instrument_view.cpp \ + clarinet_instrument_view.h \ + $(top_srcdir)/plugins/stk/voices/src/stk_model.cpp \ + stk_model.h + + + +libclarinet_la_LDFLAGS = -L@stk_lib@ -lstk -Wl,-export-dynamic + +$(libclarinet_la_SOURCES): ./embedded_resources.h diff --git a/plugins/stk/voices/clarinet/artwork.png b/plugins/stk/voices/clarinet/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..d75c8f0e5a2dc2cb43d248dbf02f60c6298c0f63 GIT binary patch literal 71622 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 literal 0 HcmV?d00001 diff --git a/plugins/stk/voices/clarinet/clarinet_instrument.cpp b/plugins/stk/voices/clarinet/clarinet_instrument.cpp new file mode 100644 index 000000000..bc4b54777 --- /dev/null +++ b/plugins/stk/voices/clarinet/clarinet_instrument.cpp @@ -0,0 +1,103 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "engine.h" +#include "note_play_handle.h" + +#include "clarinet_instrument.h" +#include "clarinet_instrument_view.h" +#include "clarinet_processor.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embedded_resources.h" + + +extern "C" +{ + +plugin::descriptor clarinet_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "Clarinet", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Clarinet noises" ), + "Danny McRae ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + +clarinetInstrument::clarinetInstrument( instrumentTrack * _channel_track ): + stkInstrument( _channel_track, &clarinet_plugin_descriptor ) +{ + model()->reedStiffness()->setTrack( _channel_track ); + model()->noiseGain()->setTrack( _channel_track ); + model()->vibratoFrequency()->setTrack( _channel_track ); + model()->vibratoGain()->setTrack( _channel_track ); + model()->breathPressure()->setTrack( _channel_track ); +} + + + + +clarinetInstrument::~clarinetInstrument() +{ +} + + + + +QString clarinetInstrument::nodeName( void ) const +{ + return( clarinet_plugin_descriptor.name ); +} + + + + +pluginView * clarinetInstrument::instantiateView( QWidget * _parent ) +{ + return( new clarinetInstrumentView( this, _parent ) ); +} + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( model * _model, void * _data ) +{ + return( new clarinetInstrument( static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/stk/voices/clarinet/clarinet_instrument.h b/plugins/stk/voices/clarinet/clarinet_instrument.h new file mode 100644 index 000000000..73c4b1a32 --- /dev/null +++ b/plugins/stk/voices/clarinet/clarinet_instrument.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _CLARINET_INSTRUMENT_H +#define _CLARINET_INSTRUMENT_H + +#include "stk_instrument.h" + +#include "clarinet_processor.h" +#include "clarinet_model.h" + + +class clarinetInstrument : public stkInstrument +{ +public: + clarinetInstrument( instrumentTrack * _channel_track ); + virtual ~clarinetInstrument( void ); + + QString nodeName( void ) const; + + pluginView * instantiateView( QWidget * _parent ); +}; + +#endif diff --git a/plugins/stk/voices/clarinet/clarinet_instrument_view.cpp b/plugins/stk/voices/clarinet/clarinet_instrument_view.cpp new file mode 100644 index 000000000..54a4de7e4 --- /dev/null +++ b/plugins/stk/voices/clarinet/clarinet_instrument_view.cpp @@ -0,0 +1,110 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include +#include +#include + +#include "clarinet_instrument_view.h" + +#include +#include + +#include "engine.h" +#include "gui_templates.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +clarinetInstrumentView::clarinetInstrumentView( clarinetInstrument * _instrument, QWidget * _parent ) : + stkInstrumentView( _instrument, _parent ) +{ + QVBoxLayout * vl = new QVBoxLayout( m_topView ); + QHBoxLayout * h1 = new QHBoxLayout(); + QHBoxLayout * h2 = new QHBoxLayout(); + QHBoxLayout * h3 = new QHBoxLayout(); + + + m_reedStiffness = new knob( knobSmall_17, m_topView, tr( "Stiffness" ) ); + m_reedStiffness->setLabel( tr( "Reed Stiffness" ) ); + m_reedStiffness->setHintText( tr( "Stiffness:" ) + " ", "" ); + + m_noiseGain = new knob( knobSmall_17, m_topView, tr( "Noise" ) ); + m_noiseGain->setLabel( tr( "Noise Gain" ) ); + m_noiseGain->setHintText( tr( "Noise:" ) + " ", "" ); + + m_vibratoFrequency = new knob( knobSmall_17, m_topView, tr( "Vib Freq" ) ); + m_vibratoFrequency->setLabel( tr( "Vibrato Frequency" ) ); + m_vibratoFrequency->setHintText( tr( "Tone Hole:" ) + " ", "" ); + + m_vibratoGain = new knob( knobSmall_17, m_topView, tr( "vib Gain" ) ); + m_vibratoGain->setLabel( tr( "Vibrato Gain" ) ); + m_vibratoGain->setHintText( tr( "Vib Gain:" ) + " ", "" ); + + m_breathPressure = new knob( knobSmall_17, m_topView, tr( "Breath Pres" ) ); + m_breathPressure->setLabel( tr( "Breath Pressure" ) ); + m_breathPressure->setHintText( tr( "Pressure:" ) + " ", "" ); + + h1->addWidget( m_reedStiffness ); + h1->addWidget( m_noiseGain ); + + h2->addWidget( m_vibratoFrequency ); + h2->addWidget( m_vibratoGain ); + + h3->addWidget( m_breathPressure ); + + vl->addLayout( h1 ); + vl->addLayout( h2 ); + vl->addLayout( h3 ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); +} + + + + +clarinetInstrumentView::~clarinetInstrumentView() +{ +} + + + + +void clarinetInstrumentView::modelChanged( void ) +{ + stkInstrumentView::modelChanged(); + + clarinetInstrument * inst = castModel(); + m_reedStiffness->setModel( inst->model()->reedStiffness() ); + m_noiseGain->setModel( inst->model()->noiseGain() ); + m_vibratoFrequency->setModel( inst->model()->vibratoFrequency() ); + m_vibratoGain->setModel( inst->model()->vibratoGain() ); + m_breathPressure->setModel( inst->model()->breathPressure() ); +} + + + diff --git a/plugins/stk/voices/clarinet/clarinet_instrument_view.h b/plugins/stk/voices/clarinet/clarinet_instrument_view.h new file mode 100644 index 000000000..046b25536 --- /dev/null +++ b/plugins/stk/voices/clarinet/clarinet_instrument_view.h @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _CLARINET_INSTRUMENT_VIEW_H +#define _CLARINET_INSTRUMENT_VIEW_H + +#include "knob.h" + +#include "stk_instrument_view.h" +#include "clarinet_instrument.h" + + +class clarinetInstrumentView: public stkInstrumentView +{ +public: + clarinetInstrumentView( clarinetInstrument * _instrument, QWidget * _parent ); + virtual ~clarinetInstrumentView( void ); + +private: + virtual void modelChanged( void ); + + knob * m_reedStiffness; + knob * m_noiseGain; + knob * m_vibratoFrequency; + knob * m_vibratoGain; + knob * m_breathPressure; +}; + +#endif diff --git a/plugins/stk/voices/clarinet/clarinet_model.cpp b/plugins/stk/voices/clarinet/clarinet_model.cpp new file mode 100644 index 000000000..c1d2fdac1 --- /dev/null +++ b/plugins/stk/voices/clarinet/clarinet_model.cpp @@ -0,0 +1,88 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "clarinet_model.h" + + +clarinetModel::clarinetModel( bool _monophonic, + StkFloat _portamento, + StkFloat _bend, + StkFloat _bend_range, + bool _velocity_sensitive_lpf, + StkFloat _velocity_sensitive_q, + StkFloat _volume, + StkFloat _pan, + StkFloat _spread, + StkFloat _reed_stiffness, + StkFloat _noise_gain, + StkFloat _vibrato_frequency, + StkFloat _vibrato_gain, + StkFloat _breath_pressure ): + stkModel( _monophonic, _portamento, _bend, _bend_range, _velocity_sensitive_lpf, _velocity_sensitive_q, _volume, _pan, _spread ), + m_reedStiffness( new floatModel( _reed_stiffness, 0.0f, 128.0f, 0.1f, this ) ), + m_noiseGain( new floatModel( _noise_gain, 0.0f, 128.0f, 0.1f, this ) ), + m_vibratoFrequency( new floatModel( _vibrato_frequency, 0.0f, 128.0f, 0.1f, this ) ), + m_vibratoGain( new floatModel( _vibrato_gain, 0.0f, 128.0f, 0.1f, this ) ), + m_breathPressure( new floatModel( _breath_pressure, 0.0f, 128.0f, 0.1f, this ) ) +{ +} + + + + +clarinetModel::~clarinetModel() +{ + delete m_reedStiffness; + delete m_noiseGain; + delete m_vibratoFrequency; + delete m_vibratoGain; + delete m_breathPressure; +} + + + + +void FASTCALL clarinetModel::saveSettings( QDomDocument & _doc, QDomElement & _parent ) +{ + stkModel::saveSettings( _doc, _parent ); + m_reedStiffness->saveSettings( _doc, _parent, "reedstiffness" ); + m_noiseGain->saveSettings( _doc, _parent, "noisegain" ); + m_vibratoFrequency->saveSettings( _doc, _parent, "vibratofrequency" ); + m_vibratoGain->saveSettings( _doc, _parent, "vibratogain" ); + m_breathPressure->saveSettings( _doc, _parent, "breathpressure" ); +} + + + + +void FASTCALL clarinetModel::loadSettings( const QDomElement & _this ) +{ + stkModel::loadSettings( _this ); + m_reedStiffness->loadSettings( _this, "reedstiffness" ); + m_noiseGain->loadSettings( _this, "noisegain" ); + m_vibratoFrequency->loadSettings( _this, "vibratofrequency" ); + m_vibratoGain->loadSettings( _this, "vibratogain" ); + m_breathPressure->loadSettings( _this, "breathpressure" ); +} + diff --git a/plugins/stk/voices/clarinet/clarinet_model.h b/plugins/stk/voices/clarinet/clarinet_model.h new file mode 100644 index 000000000..2636ccb39 --- /dev/null +++ b/plugins/stk/voices/clarinet/clarinet_model.h @@ -0,0 +1,86 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _CLARINET_MODEL_H +#define _CLARINET_MODEL_H + +#include "stk_model.h" + + +class clarinetModel: public stkModel +{ +public: + clarinetModel( bool _monophonic = FALSE, + StkFloat _portamento = 0.0f, + StkFloat _bend = 0.0f, + StkFloat _bend_range = 2.0f, + bool _velocity_sensitive_lpf = TRUE, + StkFloat _velocity_sensitive_q = 0.5f, + StkFloat _volume = 1.0f, + StkFloat _pan = 0.0f, + StkFloat _spread = 0.0f, + StkFloat _reed_stiffness = 64.0f, + StkFloat _noise_gain = 64.0f, + StkFloat _vibrato_frequency = 64.0f, + StkFloat _vibrato_gain = 64.0f, + StkFloat _breath_pressure = 64.0f ); + ~clarinetModel(); + + inline floatModel * reedStiffness( void ) const + { + return( m_reedStiffness ); + } + + inline floatModel * noiseGain( void ) const + { + return( m_noiseGain ); + } + + inline floatModel * vibratoFrequency( void ) + { + return( m_vibratoFrequency ); + } + + inline floatModel * vibratoGain( void ) const + { + return( m_vibratoGain ); + } + + inline floatModel * breathPressure( void ) const + { + return( m_breathPressure ); + } + + void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _parent ); + + void FASTCALL loadSettings( const QDomElement & _this ); + +private: + floatModel * m_reedStiffness; + floatModel * m_noiseGain; + floatModel * m_vibratoFrequency; + floatModel * m_vibratoGain; + floatModel * m_breathPressure; +}; + +#endif diff --git a/plugins/stk/voices/clarinet/clarinet_processor.cpp b/plugins/stk/voices/clarinet/clarinet_processor.cpp new file mode 100644 index 000000000..3151e53ee --- /dev/null +++ b/plugins/stk/voices/clarinet/clarinet_processor.cpp @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include "clarinet_processor.h" +#include "config_mgr.h" + + +clarinetProcessor::clarinetProcessor( sample_rate_t _sample_rate ): + stkProcessor( _sample_rate, 20.0f ) +{ +} + + + + +clarinetProcessor::~clarinetProcessor() +{ +} + + + + +void clarinetProcessor::setControls( clarinetModel * _model ) +{ + voice()->controlChange( 2, _model->reedStiffness()->value() ); + voice()->controlChange( 4, _model->noiseGain()->value() ); + voice()->controlChange( 11, _model->vibratoFrequency()->value() ); + voice()->controlChange( 1, _model->vibratoGain()->value() ); + voice()->controlChange( 128, _model->breathPressure()->value() ); + m_delayRead = m_delayWrite - static_cast( _model->spread()->value() ); +} diff --git a/plugins/stk/voices/clarinet/clarinet_processor.h b/plugins/stk/voices/clarinet/clarinet_processor.h new file mode 100644 index 000000000..0a65c35ff --- /dev/null +++ b/plugins/stk/voices/clarinet/clarinet_processor.h @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _CLARINET_PROCESSOR_H +#define _CLARINET_PROCESSOR_H + +#include "Clarinet.h" + +#include "stk_processor.h" + +#include "clarinet_model.h" + +class clarinetProcessor: public stkProcessor +{ +public: + clarinetProcessor( sample_rate_t _sample_rate ); + ~clarinetProcessor( void ); + + void setControls( clarinetModel * _model ); +}; + +#endif diff --git a/plugins/stk/voices/clarinet/logo.png b/plugins/stk/voices/clarinet/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..20a6081015e8b76b4f4e96a40f8c624e5aaeb64c GIT binary patch literal 890 zcmV-=1BLvFP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4z z76CcTyF*|A00R0+L_t(&-tCuNXpUhR$N&4;%#hD~)Mm=ph7?Eh5h2az5iw502@WWx zq!cx3lBBlQlF|+okrS-pz)qMrkPvp_YcU@+8_TfWuaoPor^oAkpNIFrbpPw=eeUc2 z-~a2rp8LM9>wcww5H&S5In~wGIqI*dtE=n3llSoO@bK{P@bK{HKltU|4U|aQENPLX z5=p})B_w^6)GDb(Qlq5X&bb6|L(;N8@cmiR2OX`#~DrpbRZIGk}NgE{f zN!lIk90Jq>eLy0@Gsecfi^vZ@H$#(KZ}w}cq6NkQcZ|~stdOK!>&%yQUDA9>PbAe! zYL@g;Qjesek|s);Eorf&DbBeMlH{Blm%`b2NpB^6a?Xv6xFYlHw+xuRuikEHr zU{c`x?Mo+e1X!EF(P-d-iS13p+i0B2F$>tk-}JAxtk?@I$+Tzh0o#D7K%Q-xQeY48 z#yF3Ff;1C4YP`cS3)rbNoT@;IElfq|ig^9Ko9V6;sG#d&7O<@u&egSK1_biLgz5H` z&)XO7uqEpTo&y(w3LrPagxbx~ $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES = libflute.la + +libflute_la_SOURCES = flute_model.cpp \ + flute_model.h \ + flute_processor.cpp \ + flute_processor.h \ + flute_instrument.cpp \ + flute_instrument.h \ + flute_instrument_view.cpp \ + flute_instrument_view.h \ + $(top_srcdir)/plugins/stk/voices/src/stk_model.cpp \ + stk_model.h + + + +libflute_la_LDFLAGS = -L@stk_lib@ -lstk -Wl,-export-dynamic + +$(libflute_la_SOURCES): ./embedded_resources.h diff --git a/plugins/stk/voices/flute/artwork.png b/plugins/stk/voices/flute/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..9f146b019062aa9f9354ee6d359d4dd619b4432c GIT binary patch literal 71134 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≶7=%AEizTBw?KVx;3`Nd}|Dvu%pwR>Y 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 RC%ymx002ovPDHLkV1gJr?WzC( literal 0 HcmV?d00001 diff --git a/plugins/stk/voices/flute/flute_instrument.cpp b/plugins/stk/voices/flute/flute_instrument.cpp new file mode 100644 index 000000000..20d4ed31e --- /dev/null +++ b/plugins/stk/voices/flute/flute_instrument.cpp @@ -0,0 +1,103 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "engine.h" +#include "note_play_handle.h" + +#include "flute_instrument.h" +#include "flute_instrument_view.h" +#include "flute_processor.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embedded_resources.h" + + +extern "C" +{ + +plugin::descriptor flute_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "Flute", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Flute noises" ), + "Danny McRae ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + +fluteInstrument::fluteInstrument( instrumentTrack * _channel_track ): + stkInstrument( _channel_track, &flute_plugin_descriptor ) +{ + model()->jetDelay()->setTrack( _channel_track ); + model()->noiseGain()->setTrack( _channel_track ); + model()->vibratoFrequency()->setTrack( _channel_track ); + model()->vibratoGain()->setTrack( _channel_track ); + model()->breathPressure()->setTrack( _channel_track ); +} + + + + +fluteInstrument::~fluteInstrument() +{ +} + + + + +QString fluteInstrument::nodeName( void ) const +{ + return( flute_plugin_descriptor.name ); +} + + + + +pluginView * fluteInstrument::instantiateView( QWidget * _parent ) +{ + return( new fluteInstrumentView( this, _parent ) ); +} + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( model * _model, void * _data ) +{ + return( new fluteInstrument( static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/stk/voices/flute/flute_instrument.h b/plugins/stk/voices/flute/flute_instrument.h new file mode 100644 index 000000000..3715d811f --- /dev/null +++ b/plugins/stk/voices/flute/flute_instrument.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _FLUTE_INSTRUMENT_H +#define _FLUTE_INSTRUMENT_H + +#include "stk_instrument.h" + +#include "flute_processor.h" +#include "flute_model.h" + + +class fluteInstrument : public stkInstrument +{ +public: + fluteInstrument( instrumentTrack * _channel_track ); + virtual ~fluteInstrument( void ); + + QString nodeName( void ) const; + + pluginView * instantiateView( QWidget * _parent ); +}; + +#endif diff --git a/plugins/stk/voices/flute/flute_instrument_view.cpp b/plugins/stk/voices/flute/flute_instrument_view.cpp new file mode 100644 index 000000000..c91e2ba6e --- /dev/null +++ b/plugins/stk/voices/flute/flute_instrument_view.cpp @@ -0,0 +1,110 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include +#include +#include + +#include "flute_instrument_view.h" + +#include +#include + +#include "engine.h" +#include "gui_templates.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +fluteInstrumentView::fluteInstrumentView( fluteInstrument * _instrument, QWidget * _parent ) : + stkInstrumentView( _instrument, _parent ) +{ + QVBoxLayout * vl = new QVBoxLayout( m_topView ); + QHBoxLayout * h1 = new QHBoxLayout(); + QHBoxLayout * h2 = new QHBoxLayout(); + QHBoxLayout * h3 = new QHBoxLayout(); + + + m_jetDelay = new knob( knobSmall_17, m_topView, tr( "Jet Delay" ) ); + m_jetDelay->setLabel( tr( "Jet Delay" ) ); + m_jetDelay->setHintText( tr( "Delay:" ) + " ", "" ); + + m_noiseGain = new knob( knobSmall_17, m_topView, tr( "Noise" ) ); + m_noiseGain->setLabel( tr( "Noise Gain" ) ); + m_noiseGain->setHintText( tr( "Noise:" ) + " ", "" ); + + m_vibratoFrequency = new knob( knobSmall_17, m_topView, tr( "Vib Freq" ) ); + m_vibratoFrequency->setLabel( tr( "Vibrato Frequency" ) ); + m_vibratoFrequency->setHintText( tr( "Tone Hole:" ) + " ", "" ); + + m_vibratoGain = new knob( knobSmall_17, m_topView, tr( "vib Gain" ) ); + m_vibratoGain->setLabel( tr( "Vibrato Gain" ) ); + m_vibratoGain->setHintText( tr( "Vib Gain:" ) + " ", "" ); + + m_breathPressure = new knob( knobSmall_17, m_topView, tr( "Breath Pres" ) ); + m_breathPressure->setLabel( tr( "Breath Pressure" ) ); + m_breathPressure->setHintText( tr( "Pressure:" ) + " ", "" ); + + h1->addWidget( m_jetDelay ); + h1->addWidget( m_noiseGain ); + + h2->addWidget( m_vibratoFrequency ); + h2->addWidget( m_vibratoGain ); + + h3->addWidget( m_breathPressure ); + + vl->addLayout( h1 ); + vl->addLayout( h2 ); + vl->addLayout( h3 ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); +} + + + + +fluteInstrumentView::~fluteInstrumentView() +{ +} + + + + +void fluteInstrumentView::modelChanged( void ) +{ + stkInstrumentView::modelChanged(); + + fluteInstrument * inst = castModel(); + m_jetDelay->setModel( inst->model()->jetDelay() ); + m_noiseGain->setModel( inst->model()->noiseGain() ); + m_vibratoFrequency->setModel( inst->model()->vibratoFrequency() ); + m_vibratoGain->setModel( inst->model()->vibratoGain() ); + m_breathPressure->setModel( inst->model()->breathPressure() ); +} + + + diff --git a/plugins/stk/voices/flute/flute_instrument_view.h b/plugins/stk/voices/flute/flute_instrument_view.h new file mode 100644 index 000000000..88349df40 --- /dev/null +++ b/plugins/stk/voices/flute/flute_instrument_view.h @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _FLUTE_INSTRUMENT_VIEW_H +#define _FLUTE_INSTRUMENT_VIEW_H + +#include "knob.h" + +#include "stk_instrument_view.h" +#include "flute_instrument.h" + + +class fluteInstrumentView: public stkInstrumentView +{ +public: + fluteInstrumentView( fluteInstrument * _instrument, QWidget * _parent ); + virtual ~fluteInstrumentView( void ); + +private: + virtual void modelChanged( void ); + + knob * m_jetDelay; + knob * m_noiseGain; + knob * m_vibratoFrequency; + knob * m_vibratoGain; + knob * m_breathPressure; +}; + +#endif diff --git a/plugins/stk/voices/flute/flute_model.cpp b/plugins/stk/voices/flute/flute_model.cpp new file mode 100644 index 000000000..3c1e06640 --- /dev/null +++ b/plugins/stk/voices/flute/flute_model.cpp @@ -0,0 +1,88 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "flute_model.h" + + +fluteModel::fluteModel( bool _monophonic, + StkFloat _portamento, + StkFloat _bend, + StkFloat _bend_range, + bool _velocity_sensitive_lpf, + StkFloat _velocity_sensitive_q, + StkFloat _volume, + StkFloat _pan, + StkFloat _spread, + StkFloat _jet_delay, + StkFloat _noise_gain, + StkFloat _vibrato_frequency, + StkFloat _vibrato_gain, + StkFloat _breath_pressure ): + stkModel( _monophonic, _portamento, _bend, _bend_range, _velocity_sensitive_lpf, _velocity_sensitive_q, _volume, _pan, _spread ), + m_jetDelay( new floatModel( _jet_delay, 0.0f, 128.0f, 0.1f, this ) ), + m_noiseGain( new floatModel( _noise_gain, 0.0f, 128.0f, 0.1f, this ) ), + m_vibratoFrequency( new floatModel( _vibrato_frequency, 0.0f, 128.0f, 0.1f, this ) ), + m_vibratoGain( new floatModel( _vibrato_gain, 0.0f, 128.0f, 0.1f, this ) ), + m_breathPressure( new floatModel( _breath_pressure, 0.0f, 128.0f, 0.1f, this ) ) +{ +} + + + + +fluteModel::~fluteModel() +{ + delete m_jetDelay; + delete m_noiseGain; + delete m_vibratoFrequency; + delete m_vibratoGain; + delete m_breathPressure; +} + + + + +void FASTCALL fluteModel::saveSettings( QDomDocument & _doc, QDomElement & _parent ) +{ + stkModel::saveSettings( _doc, _parent ); + m_jetDelay->saveSettings( _doc, _parent, "reedstiffness" ); + m_noiseGain->saveSettings( _doc, _parent, "noisegain" ); + m_vibratoFrequency->saveSettings( _doc, _parent, "vibratofrequency" ); + m_vibratoGain->saveSettings( _doc, _parent, "vibratogain" ); + m_breathPressure->saveSettings( _doc, _parent, "breathpressure" ); +} + + + + +void FASTCALL fluteModel::loadSettings( const QDomElement & _this ) +{ + stkModel::loadSettings( _this ); + m_jetDelay->loadSettings( _this, "reedstiffness" ); + m_noiseGain->loadSettings( _this, "noisegain" ); + m_vibratoFrequency->loadSettings( _this, "vibratofrequency" ); + m_vibratoGain->loadSettings( _this, "vibratogain" ); + m_breathPressure->loadSettings( _this, "breathpressure" ); +} + diff --git a/plugins/stk/voices/flute/flute_model.h b/plugins/stk/voices/flute/flute_model.h new file mode 100644 index 000000000..a5a74c8ff --- /dev/null +++ b/plugins/stk/voices/flute/flute_model.h @@ -0,0 +1,86 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _FLUTE_MODEL_H +#define _FLUTE_MODEL_H + +#include "stk_model.h" + + +class fluteModel: public stkModel +{ +public: + fluteModel( bool _monophonic = FALSE, + StkFloat _portamento = 0.0f, + StkFloat _bend = 0.0f, + StkFloat _bend_range = 2.0f, + bool _velocity_sensitive_lpf = TRUE, + StkFloat _velocity_sensitive_q = 0.5f, + StkFloat _volume = 1.0f, + StkFloat _pan = 0.0f, + StkFloat _spread = 0.0f, + StkFloat _jet_delay = 64.0f, + StkFloat _noise_gain = 64.0f, + StkFloat _vibrato_frequency = 64.0f, + StkFloat _vibrato_gain = 64.0f, + StkFloat _breath_pressure = 64.0f ); + ~fluteModel(); + + inline floatModel * jetDelay( void ) const + { + return( m_jetDelay ); + } + + inline floatModel * noiseGain( void ) const + { + return( m_noiseGain ); + } + + inline floatModel * vibratoFrequency( void ) + { + return( m_vibratoFrequency ); + } + + inline floatModel * vibratoGain( void ) const + { + return( m_vibratoGain ); + } + + inline floatModel * breathPressure( void ) const + { + return( m_breathPressure ); + } + + void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _parent ); + + void FASTCALL loadSettings( const QDomElement & _this ); + +private: + floatModel * m_jetDelay; + floatModel * m_noiseGain; + floatModel * m_vibratoFrequency; + floatModel * m_vibratoGain; + floatModel * m_breathPressure; +}; + +#endif diff --git a/plugins/stk/voices/flute/flute_processor.cpp b/plugins/stk/voices/flute/flute_processor.cpp new file mode 100644 index 000000000..5fb36bcf5 --- /dev/null +++ b/plugins/stk/voices/flute/flute_processor.cpp @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include "flute_processor.h" +#include "config_mgr.h" + + +fluteProcessor::fluteProcessor( sample_rate_t _sample_rate ): + stkProcessor( _sample_rate, 20.0f ) +{ +} + + + + +fluteProcessor::~fluteProcessor() +{ +} + + + + +void fluteProcessor::setControls( fluteModel * _model ) +{ + voice()->controlChange( 2, _model->jetDelay()->value() ); + voice()->controlChange( 4, _model->noiseGain()->value() ); + voice()->controlChange( 11, _model->vibratoFrequency()->value() ); + voice()->controlChange( 1, _model->vibratoGain()->value() ); + voice()->controlChange( 128, _model->breathPressure()->value() ); + m_delayRead = m_delayWrite - static_cast( _model->spread()->value() ); +} diff --git a/plugins/stk/voices/flute/flute_processor.h b/plugins/stk/voices/flute/flute_processor.h new file mode 100644 index 000000000..b5bcf7266 --- /dev/null +++ b/plugins/stk/voices/flute/flute_processor.h @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _FLUTE_PROCESSOR_H +#define _FLUTE_PROCESSOR_H + +#include "Flute.h" + +#include "stk_processor.h" + +#include "flute_model.h" + +class fluteProcessor: public stkProcessor +{ +public: + fluteProcessor( sample_rate_t _sample_rate ); + ~fluteProcessor( void ); + + void setControls( fluteModel * _model ); +}; + +#endif diff --git a/plugins/stk/voices/flute/logo.png b/plugins/stk/voices/flute/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..20a6081015e8b76b4f4e96a40f8c624e5aaeb64c GIT binary patch literal 890 zcmV-=1BLvFP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4z z76CcTyF*|A00R0+L_t(&-tCuNXpUhR$N&4;%#hD~)Mm=ph7?Eh5h2az5iw502@WWx zq!cx3lBBlQlF|+okrS-pz)qMrkPvp_YcU@+8_TfWuaoPor^oAkpNIFrbpPw=eeUc2 z-~a2rp8LM9>wcww5H&S5In~wGIqI*dtE=n3llSoO@bK{P@bK{HKltU|4U|aQENPLX z5=p})B_w^6)GDb(Qlq5X&bb6|L(;N8@cmiR2OX`#~DrpbRZIGk}NgE{f zN!lIk90Jq>eLy0@Gsecfi^vZ@H$#(KZ}w}cq6NkQcZ|~stdOK!>&%yQUDA9>PbAe! zYL@g;Qjesek|s);Eorf&DbBeMlH{Blm%`b2NpB^6a?Xv6xFYlHw+xuRuikEHr zU{c`x?Mo+e1X!EF(P-d-iS13p+i0B2F$>tk-}JAxtk?@I$+Tzh0o#D7K%Q-xQeY48 z#yF3Ff;1C4YP`cS3)rbNoT@;IElfq|ig^9Ko9V6;sG#d&7O<@u&egSK1_biLgz5H` z&)XO7uqEpTo&y(w3LrPagxbx~ $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES = libfmvoices.la + +libfmvoices_la_SOURCES = fmvoices_model.cpp \ + fmvoices_model.h \ + fmvoices_processor.cpp \ + fmvoices_processor.h \ + fmvoices_instrument.cpp \ + fmvoices_instrument.h \ + fmvoices_instrument_view.cpp \ + fmvoices_instrument_view.h \ + $(top_srcdir)/plugins/stk/voices/src/stk_model.cpp \ + stk_model.h + + + +libfmvoices_la_LDFLAGS = -L@stk_lib@ -lstk -Wl,-export-dynamic + +$(libfmvoices_la_SOURCES): ./embedded_resources.h diff --git a/plugins/stk/voices/fmvoices/artwork.png b/plugins/stk/voices/fmvoices/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..1c5f7ebd4092534933f3dbac397c9a89867a6b3a GIT binary patch literal 71849 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 M07*qoM6N<$f|IpCRsaA1 literal 0 HcmV?d00001 diff --git a/plugins/stk/voices/fmvoices/fmvoices_instrument.cpp b/plugins/stk/voices/fmvoices/fmvoices_instrument.cpp new file mode 100644 index 000000000..ebb6280ea --- /dev/null +++ b/plugins/stk/voices/fmvoices/fmvoices_instrument.cpp @@ -0,0 +1,103 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "engine.h" +#include "note_play_handle.h" + +#include "fmvoices_instrument.h" +#include "fmvoices_instrument_view.h" +#include "fmvoices_processor.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embedded_resources.h" + + +extern "C" +{ + +plugin::descriptor fmvoices_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "FM Voices", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Voice noises" ), + "Danny McRae ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + +fmvoicesInstrument::fmvoicesInstrument( instrumentTrack * _channel_track ): + stkInstrument( _channel_track, &fmvoices_plugin_descriptor ) +{ + model()->vowel()->setTrack( _channel_track ); + model()->spectralTilt()->setTrack( _channel_track ); + model()->lfoSpeed()->setTrack( _channel_track ); + model()->lfoDepth()->setTrack( _channel_track ); + model()->adsrTarget()->setTrack( _channel_track ); +} + + + + +fmvoicesInstrument::~fmvoicesInstrument() +{ +} + + + + +QString fmvoicesInstrument::nodeName( void ) const +{ + return( fmvoices_plugin_descriptor.name ); +} + + + + +pluginView * fmvoicesInstrument::instantiateView( QWidget * _parent ) +{ + return( new fmvoicesInstrumentView( this, _parent ) ); +} + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( model * _model, void * _data ) +{ + return( new fmvoicesInstrument( static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/stk/voices/fmvoices/fmvoices_instrument.h b/plugins/stk/voices/fmvoices/fmvoices_instrument.h new file mode 100644 index 000000000..d24046d06 --- /dev/null +++ b/plugins/stk/voices/fmvoices/fmvoices_instrument.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _FMVOICES_INSTRUMENT_H +#define _FMVOICES_INSTRUMENT_H + +#include "stk_instrument.h" + +#include "fmvoices_processor.h" +#include "fmvoices_model.h" + + +class fmvoicesInstrument : public stkInstrument +{ +public: + fmvoicesInstrument( instrumentTrack * _channel_track ); + virtual ~fmvoicesInstrument( void ); + + QString nodeName( void ) const; + + pluginView * instantiateView( QWidget * _parent ); +}; + +#endif diff --git a/plugins/stk/voices/fmvoices/fmvoices_instrument_view.cpp b/plugins/stk/voices/fmvoices/fmvoices_instrument_view.cpp new file mode 100644 index 000000000..59808bb9b --- /dev/null +++ b/plugins/stk/voices/fmvoices/fmvoices_instrument_view.cpp @@ -0,0 +1,110 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include +#include +#include + +#include "fmvoices_instrument_view.h" + +#include +#include + +#include "engine.h" +#include "gui_templates.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +fmvoicesInstrumentView::fmvoicesInstrumentView( fmvoicesInstrument * _instrument, QWidget * _parent ) : + stkInstrumentView( _instrument, _parent ) +{ + QVBoxLayout * vl = new QVBoxLayout( m_topView ); + QHBoxLayout * h1 = new QHBoxLayout(); + QHBoxLayout * h2 = new QHBoxLayout(); + QHBoxLayout * h3 = new QHBoxLayout(); + + + m_vowel = new knob( knobSmall_17, m_topView, tr( "Vowel" ) ); + m_vowel->setLabel( tr( "Vowel" ) ); + m_vowel->setHintText( tr( "Vowel:" ) + " ", "" ); + + m_spectralTilt = new knob( knobSmall_17, m_topView, tr( "Tilt" ) ); + m_spectralTilt->setLabel( tr( "Spectral Tilt" ) ); + m_spectralTilt->setHintText( tr( "Tilt:" ) + " ", "" ); + + m_lfoSpeed = new knob( knobSmall_17, m_topView, tr( "LFO Speed" ) ); + m_lfoSpeed->setLabel( tr( "LFO Speed" ) ); + m_lfoSpeed->setHintText( tr( "LFO Speed:" ) + " ", "" ); + + m_lfoDepth = new knob( knobSmall_17, m_topView, tr( "LFO Depth" ) ); + m_lfoDepth->setLabel( tr( "LFO Depth" ) ); + m_lfoDepth->setHintText( tr( "LFO Depth:" ) + " ", "" ); + + m_adsrTarget = new knob( knobSmall_17, m_topView, tr( "ADSR Target" ) ); + m_adsrTarget->setLabel( tr( "ADSR Target" ) ); + m_adsrTarget->setHintText( tr( "ADSR Target:" ) + " ", "" ); + + h1->addWidget( m_vowel ); + h1->addWidget( m_spectralTilt ); + + h2->addWidget( m_lfoSpeed ); + h2->addWidget( m_lfoDepth ); + + h3->addWidget( m_adsrTarget ); + + vl->addLayout( h1 ); + vl->addLayout( h2 ); + vl->addLayout( h3 ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); +} + + + + +fmvoicesInstrumentView::~fmvoicesInstrumentView() +{ +} + + + + +void fmvoicesInstrumentView::modelChanged( void ) +{ + stkInstrumentView::modelChanged(); + + fmvoicesInstrument * inst = castModel(); + m_vowel->setModel( inst->model()->vowel() ); + m_spectralTilt->setModel( inst->model()->spectralTilt() ); + m_lfoSpeed->setModel( inst->model()->lfoSpeed() ); + m_lfoDepth->setModel( inst->model()->lfoDepth() ); + m_adsrTarget->setModel( inst->model()->adsrTarget() ); +} + + + diff --git a/plugins/stk/voices/fmvoices/fmvoices_instrument_view.h b/plugins/stk/voices/fmvoices/fmvoices_instrument_view.h new file mode 100644 index 000000000..233e949c6 --- /dev/null +++ b/plugins/stk/voices/fmvoices/fmvoices_instrument_view.h @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _FMVOICES_INSTRUMENT_VIEW_H +#define _FMVOICES_INSTRUMENT_VIEW_H + +#include "knob.h" + +#include "stk_instrument_view.h" +#include "fmvoices_instrument.h" + + +class fmvoicesInstrumentView: public stkInstrumentView +{ +public: + fmvoicesInstrumentView( fmvoicesInstrument * _instrument, QWidget * _parent ); + virtual ~fmvoicesInstrumentView( void ); + +private: + virtual void modelChanged( void ); + + knob * m_vowel; + knob * m_spectralTilt; + knob * m_lfoSpeed; + knob * m_lfoDepth; + knob * m_adsrTarget; +}; + +#endif diff --git a/plugins/stk/voices/fmvoices/fmvoices_model.cpp b/plugins/stk/voices/fmvoices/fmvoices_model.cpp new file mode 100644 index 000000000..f742e905d --- /dev/null +++ b/plugins/stk/voices/fmvoices/fmvoices_model.cpp @@ -0,0 +1,88 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "fmvoices_model.h" + + +fmvoicesModel::fmvoicesModel( bool _monophonic, + StkFloat _portamento, + StkFloat _bend, + StkFloat _bend_range, + bool _velocity_sensitive_lpf, + StkFloat _velocity_sensitive_q, + StkFloat _volume, + StkFloat _pan, + StkFloat _spread, + StkFloat _vowel, + StkFloat _spectral_tilt, + StkFloat _lfo_speed, + StkFloat _lfo_depth, + StkFloat _adsr_target ): + stkModel( _monophonic, _portamento, _bend, _bend_range, _velocity_sensitive_lpf, _velocity_sensitive_q, _volume, _pan, _spread ), + m_vowel( new floatModel( _vowel, 0.0f, 128.0f, 0.1f, this ) ), + m_spectralTilt( new floatModel( _spectral_tilt, 0.0f, 128.0f, 0.1f, this ) ), + m_lfoSpeed( new floatModel( _lfo_speed, 0.0f, 128.0f, 0.1f, this ) ), + m_lfoDepth( new floatModel( _lfo_depth, 0.0f, 128.0f, 0.1f, this ) ), + m_adsrTarget( new floatModel( _adsr_target, 0.0f, 128.0f, 0.1f, this ) ) +{ +} + + + + +fmvoicesModel::~fmvoicesModel() +{ + delete m_vowel; + delete m_spectralTilt; + delete m_lfoSpeed; + delete m_lfoDepth; + delete m_adsrTarget; +} + + + + +void FASTCALL fmvoicesModel::saveSettings( QDomDocument & _doc, QDomElement & _parent ) +{ + stkModel::saveSettings( _doc, _parent ); + m_vowel->saveSettings( _doc, _parent, "vowel" ); + m_spectralTilt->saveSettings( _doc, _parent, "spectraltilt" ); + m_lfoSpeed->saveSettings( _doc, _parent, "lfospeed" ); + m_lfoDepth->saveSettings( _doc, _parent, "lfodepth" ); + m_adsrTarget->saveSettings( _doc, _parent, "adsrtarget" ); +} + + + + +void FASTCALL fmvoicesModel::loadSettings( const QDomElement & _this ) +{ + stkModel::loadSettings( _this ); + m_vowel->loadSettings( _this, "vowel" ); + m_spectralTilt->loadSettings( _this, "spectraltilt" ); + m_lfoSpeed->loadSettings( _this, "lfospeed" ); + m_lfoDepth->loadSettings( _this, "lfodepth" ); + m_adsrTarget->loadSettings( _this, "adsrtarget" ); +} + diff --git a/plugins/stk/voices/fmvoices/fmvoices_model.h b/plugins/stk/voices/fmvoices/fmvoices_model.h new file mode 100644 index 000000000..031da3dfb --- /dev/null +++ b/plugins/stk/voices/fmvoices/fmvoices_model.h @@ -0,0 +1,86 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _FMVOICES_MODEL_H +#define _FMVOICES_MODEL_H + +#include "stk_model.h" + + +class fmvoicesModel: public stkModel +{ +public: + fmvoicesModel( bool _monophonic = FALSE, + StkFloat _portamento = 0.0f, + StkFloat _bend = 0.0f, + StkFloat _bend_range = 2.0f, + bool _velocity_sensitive_lpf = TRUE, + StkFloat _velocity_sensitive_q = 0.5f, + StkFloat _volume = 1.0f, + StkFloat _pan = 0.0f, + StkFloat _spread = 0.0f, + StkFloat _vowel = 64.0f, + StkFloat _spectral_tilt = 64.0f, + StkFloat _lfo_speed = 64.0f, + StkFloat _lfo_depth = 64.0f, + StkFloat _adsr_target = 64.0f ); + ~fmvoicesModel(); + + inline floatModel * vowel( void ) const + { + return( m_vowel ); + } + + inline floatModel * spectralTilt( void ) const + { + return( m_spectralTilt ); + } + + inline floatModel * lfoSpeed( void ) + { + return( m_lfoSpeed ); + } + + inline floatModel * lfoDepth( void ) const + { + return( m_lfoDepth ); + } + + inline floatModel * adsrTarget( void ) const + { + return( m_adsrTarget ); + } + + void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _parent ); + + void FASTCALL loadSettings( const QDomElement & _this ); + +private: + floatModel * m_vowel; + floatModel * m_spectralTilt; + floatModel * m_lfoSpeed; + floatModel * m_lfoDepth; + floatModel * m_adsrTarget; +}; + +#endif diff --git a/plugins/stk/voices/fmvoices/fmvoices_processor.cpp b/plugins/stk/voices/fmvoices/fmvoices_processor.cpp new file mode 100644 index 000000000..ee470f736 --- /dev/null +++ b/plugins/stk/voices/fmvoices/fmvoices_processor.cpp @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include "fmvoices_processor.h" +#include "config_mgr.h" + + +fmvoicesProcessor::fmvoicesProcessor( sample_rate_t _sample_rate ): + stkProcessor( _sample_rate ) +{ +} + + + + +fmvoicesProcessor::~fmvoicesProcessor() +{ +} + + + + +void fmvoicesProcessor::setControls( fmvoicesModel * _model ) +{ + voice()->controlChange( 2, _model->vowel()->value() ); + voice()->controlChange( 4, _model->spectralTilt()->value() ); + voice()->controlChange( 11, _model->lfoSpeed()->value() ); + voice()->controlChange( 1, _model->lfoDepth()->value() ); + voice()->controlChange( 128, _model->adsrTarget()->value() ); + m_delayRead = m_delayWrite - static_cast( _model->spread()->value() ); +} diff --git a/plugins/stk/voices/fmvoices/fmvoices_processor.h b/plugins/stk/voices/fmvoices/fmvoices_processor.h new file mode 100644 index 000000000..9c46047f3 --- /dev/null +++ b/plugins/stk/voices/fmvoices/fmvoices_processor.h @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _FMVOICES_PROCESSOR_H +#define _FMVOICES_PROCESSOR_H + +#include "FMVoices.h" + +#include "stk_processor.h" + +#include "fmvoices_model.h" + +class fmvoicesProcessor: public stkProcessor +{ +public: + fmvoicesProcessor( sample_rate_t _sample_rate ); + ~fmvoicesProcessor( void ); + + void setControls( fmvoicesModel * _model ); +}; + +#endif diff --git a/plugins/stk/voices/fmvoices/logo.png b/plugins/stk/voices/fmvoices/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..20a6081015e8b76b4f4e96a40f8c624e5aaeb64c GIT binary patch literal 890 zcmV-=1BLvFP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4z z76CcTyF*|A00R0+L_t(&-tCuNXpUhR$N&4;%#hD~)Mm=ph7?Eh5h2az5iw502@WWx zq!cx3lBBlQlF|+okrS-pz)qMrkPvp_YcU@+8_TfWuaoPor^oAkpNIFrbpPw=eeUc2 z-~a2rp8LM9>wcww5H&S5In~wGIqI*dtE=n3llSoO@bK{P@bK{HKltU|4U|aQENPLX z5=p})B_w^6)GDb(Qlq5X&bb6|L(;N8@cmiR2OX`#~DrpbRZIGk}NgE{f zN!lIk90Jq>eLy0@Gsecfi^vZ@H$#(KZ}w}cq6NkQcZ|~stdOK!>&%yQUDA9>PbAe! zYL@g;Qjesek|s);Eorf&DbBeMlH{Blm%`b2NpB^6a?Xv6xFYlHw+xuRuikEHr zU{c`x?Mo+e1X!EF(P-d-iS13p+i0B2F$>tk-}JAxtk?@I$+Tzh0o#D7K%Q-xQeY48 z#yF3Ff;1C4YP`cS3)rbNoT@;IElfq|ig^9Ko9V6;sG#d&7O<@u&egSK1_biLgz5H` z&)XO7uqEpTo&y(w3LrPagxbx~ + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _STK_INSTRUMENT_H +#define _STK_INSTRUMENT_H + +#include "instrument.h" + +#include "stk_voice.h" + + +template +class stkInstrument : public instrument +{ +public: + stkInstrument( instrumentTrack * _channel_track, + const descriptor * _descriptor, + Uint8 _polyphony = 64 ); + virtual ~stkInstrument(); + + void playNote( notePlayHandle * _n, bool _try_parallelizing ); + + void deleteNotePluginData( notePlayHandle * _n ); + + void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + + void loadSettings( const QDomElement & _this ); + + MODEL * model( void ) const; + + void setMissingFile( bool _state ); + +private: + MODEL * m_model; + + stkVoice * m_voice; + + sampleFrame * m_buffer; + fpp_t m_frames; +}; + + + + +template +stkInstrument::stkInstrument( + instrumentTrack * _channel_track, + const descriptor * _descriptor, + Uint8 _polyphony ): + instrument( _channel_track, _descriptor ), + m_model( new MODEL() ), + m_voice( new stkVoice( _polyphony ) ), + m_buffer( new sampleFrame[engine::getMixer()->framesPerPeriod()] ) +{ + m_model->monophonic()->setTrack( _channel_track ); + m_model->portamento()->setTrack( _channel_track ); + m_model->bend()->setTrack( _channel_track ); + m_model->bendRange()->setTrack( _channel_track ); + m_model->velocitySensitiveLPF()->setTrack( _channel_track ); + m_model->velocitySensitiveQ()->setTrack( _channel_track ); + m_model->volume()->setTrack( _channel_track ); + m_model->pan()->setTrack( _channel_track ); + m_model->releaseTriggered()->setTrack( _channel_track ); + m_model->randomizeAttack()->setTrack( _channel_track ); + m_model->randomizeLength()->setTrack( _channel_track ); + m_model->randomizeVelocityAmount()->setTrack( _channel_track ); + m_model->randomizeFrequencyAmount()->setTrack( _channel_track ); + m_model->spread()->setTrack( _channel_track ); +} + + + + +template +stkInstrument::~stkInstrument() +{ + delete m_voice; + delete m_model; + delete[] m_buffer; +} + + + + +template +inline void stkInstrument::playNote( + notePlayHandle * _n, + bool _try_parallelizing ) +{ + m_frames = _n->framesLeftForCurrentPeriod(); + + m_buffer = m_voice->playNote( _n, m_model, m_buffer, m_frames ); + getInstrumentTrack()->processAudioBuffer( m_buffer, m_frames, _n ); +} + + + + +template +inline void stkInstrument::deleteNotePluginData( + notePlayHandle * _n ) +{ + static_cast( _n->m_pluginData )->setActive( FALSE ); + _n->m_pluginData = NULL; +} + + + + +template +void stkInstrument::saveSettings( + QDomDocument & _doc, + QDomElement & _parent ) +{ + m_model->saveSettings( _doc, _parent ); +} + + + + +template +inline void stkInstrument::loadSettings( + const QDomElement & _this ) +{ + m_model->loadSettings( _this ); +} + + + + +template +inline MODEL * stkInstrument::model( void ) const +{ + return( m_model ); +} + + + + +template +inline void stkInstrument::setMissingFile( bool _state ) +{ + m_voice->setMissingFile( _state ); +} + + +#endif diff --git a/plugins/stk/voices/include/stk_instrument_view.h b/plugins/stk/voices/include/stk_instrument_view.h new file mode 100644 index 000000000..dc161d3d7 --- /dev/null +++ b/plugins/stk/voices/include/stk_instrument_view.h @@ -0,0 +1,181 @@ +/* + * stk_instrument_view.h - base class for stk gui interfaces + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _STK_INSTRUMENT_VIEW_H +#define _STK_INSTRUMENT_VIEW_H + +#include +#include + +#include "config_mgr.h" +#include "instrument_view.h" +#include "led_checkbox.h" +#include "tempo_sync_knob.h" + + +template +class stkInstrumentView: public instrumentView +{ +public: + stkInstrumentView( INSTRUMENT * _instrument, QWidget * _parent ); + virtual ~stkInstrumentView(); + +protected: + virtual void modelChanged( void ); + + QWidget * m_topView; + ledCheckBox * m_monophonic; + tempoSyncKnob * m_portamento; + knob * m_bend; + knob * m_bendRange; + ledCheckBox * m_velocitySensitiveLPF; + knob * m_velocitySensitiveQ; + knob * m_volume; + knob * m_pan; + ledCheckBox * m_releaseTriggered; + ledCheckBox * m_randomizeAttack; + tempoSyncKnob * m_randomizeLength; + knob * m_randomizeVelocityAmount; + knob * m_randomizeFrequencyAmount; + knob * m_spread; +}; + + +template +stkInstrumentView::stkInstrumentView( INSTRUMENT * _instrument, + QWidget * _parent ): + instrumentView( _instrument, _parent ) +{ + bool filesMissing = + !QDir( configManager::inst()->stkDir() ).exists() || + !QFileInfo( configManager::inst()->stkDir() + + QDir::separator() + + "sinewave.raw" ).exists(); + + if( filesMissing ) + { + QMessageBox::information( 0, tr( "Missing files" ), + tr( "Your Stk-installation seems to be " + "incomplete. Please make sure " + "the full Stk-package is installed!" ), + QMessageBox::Ok ); + } + + _instrument->setMissingFile( filesMissing ); + + m_topView = new QWidget( this ); + m_topView->setGeometry( 6, 51, 237, 100 ); + + m_monophonic = new ledCheckBox( tr( "" ), this ); + m_monophonic->move( 115, 206 ); + + m_portamento = new tempoSyncKnob( knobSmall_17, this, + tr( "Portamento" ) ); + m_portamento->setHintText( tr( "Portamento:" ) + " ", "ms" ); + m_portamento->move( 19, 218 ); + + m_bend = new knob( knobSmall_17, this, tr( "Bend" ) ); + m_bend->setHintText( tr( "Bend:" ) + " ", " half steps" ); + m_bend->move( 12, 190 ); + + m_velocitySensitiveLPF = new ledCheckBox( tr( "" ), this ); + m_velocitySensitiveLPF->move( 13, 165 ); + + m_velocitySensitiveQ = new knob( knobSmall_17, this, tr( "Q" ) ); + m_velocitySensitiveQ->setHintText( tr( "Q:" ) + " ", "" ); + m_velocitySensitiveQ->move( 74, 164 ); + + m_bendRange = new knob( knobSmall_17, this, tr( "Range" ) ); + m_bendRange->setHintText( tr( "Range:" ) + " ", + " " + tr( "half steps" ) ); + m_bendRange->move( 55, 190 ); + + m_volume = new knob( knobSmall_17, this, tr( "Volume" ) ); + m_volume->setHintText( tr( "Volume:" ) + " ", "" ); + m_volume->move( 158, 16 ); + + m_pan = new knob( knobSmall_17, this, tr( "Pan" ) ); + m_pan->setHintText( tr( "Pan:" ) + " ", "" ); + m_pan->move( 181, 16 ); + + m_releaseTriggered = new ledCheckBox( tr( "" ), this ); + m_releaseTriggered->move( 115, 222 ); + + m_randomizeAttack = new ledCheckBox( tr( "" ), this ); + m_randomizeAttack->move( 110, 166 ); + + m_randomizeLength = new tempoSyncKnob( knobSmall_17, this, + tr( "Length" ) ); + m_randomizeLength->setHintText( tr( "Length:" ) + " ", "ms" ); + m_randomizeLength->move( 197, 180 ); + + m_randomizeVelocityAmount = new knob( knobSmall_17, this, + tr( "Velocity" ) ); + m_randomizeVelocityAmount->setHintText( tr( "Velocity:" ) + " ", "" ); + m_randomizeVelocityAmount->move( 123, 180 ); + + m_randomizeFrequencyAmount = new knob( knobSmall_17, this, + tr( "Frequency" ) ); + m_randomizeFrequencyAmount->setHintText( tr( "Frequency:" ) + " ", + " " + tr( "half steps" ) ); + m_randomizeFrequencyAmount->move( 158, 180 ); + + m_spread = new knob( knobSmall_17, this, tr( "Spread" ) ); + m_spread->setHintText( tr( "Spread:" ) + " ", "" ); + m_spread->move( 212, 16 ); +} + + + + +template +stkInstrumentView::~stkInstrumentView() +{ +} + + + + +template +void stkInstrumentView::modelChanged() +{ + INSTRUMENT * inst = castModel(); + m_monophonic->setModel( inst->model()->monophonic() ); + m_portamento->setModel( inst->model()->portamento() ); + m_bend->setModel( inst->model()->bend() ); + m_bendRange->setModel( inst->model()->bendRange() ); + m_velocitySensitiveLPF->setModel( inst->model()->velocitySensitiveLPF() ); + m_velocitySensitiveQ->setModel( inst->model()->velocitySensitiveQ() ); + m_volume->setModel( inst->model()->volume() ); + m_pan->setModel( inst->model()->pan() ); + m_releaseTriggered->setModel( inst->model()->releaseTriggered() ); + m_randomizeAttack->setModel( inst->model()->randomizeAttack() ); + m_randomizeLength->setModel( inst->model()->randomizeLength() ); + m_randomizeVelocityAmount->setModel( inst->model()->randomizeVelocityAmount() ); + m_randomizeFrequencyAmount->setModel( inst->model()->randomizeFrequencyAmount() ); + m_spread->setModel( inst->model()->spread() ); +} + + +#endif diff --git a/plugins/stk/voices/include/stk_model.h b/plugins/stk/voices/include/stk_model.h new file mode 100644 index 000000000..6e7e62bbf --- /dev/null +++ b/plugins/stk/voices/include/stk_model.h @@ -0,0 +1,184 @@ +/* + * stk_model.h - base class for stk instrument models + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _STK_MODEL_H +#define _STK_MODEL_H + +#include "Instrmnt.h" + +#include "automatable_model_templates.h" +#include "basic_filters.h" + + +class stkModel: public model +{ +public: + stkModel( bool _monophonic = FALSE, + StkFloat _portamento = 0.0f, + StkFloat _bend = 0.0f, + StkFloat _bend_range = 2.0f, + bool _velocity_sensitive_lpf = TRUE, + StkFloat _velocity_sensitive_q = 0.5f, + StkFloat _volume = 1.0f, + StkFloat _pan = 0.0f, + bool _release_triggered = FALSE, + bool _randomize_attack = FALSE, + StkFloat _randomize_length = 0.0f, + StkFloat _randomize_velocity_amount = 0.5f, + StkFloat _randomize_frequency_amount = 0.5f, + StkFloat _spread = 0.0f ); + virtual ~stkModel(); + + // Indicates whether or not the instrument should use multiple voices + // when generating the signal. + inline boolModel * monophonic( void ) const + { + return( m_monophonic ); + } + + // Stores the time in ms over which a note will slide from the previous + // frequency. + inline floatModel * portamento( void ) const + { + return( m_portamento ); + } + + // Stores the pitch bend setting. Scaled by bendRange. + inline floatModel * bend( void ) const + { + return( m_bend ); + } + + // Stores the range in half steps over which a note can be bent. + inline floatModel * bendRange( void ) const + { + return( m_bendRange ); + } + + // Indicates whether or not to apply a low pass filter to the notes + // where the cutoff frequency is scaled by the notes' velocities. + inline boolModel * velocitySensitiveLPF( void ) const + { + return( m_velocitySensitiveLPF ); + } + + // Stores the Q value for the low pass filter. + inline floatModel * velocitySensitiveQ( void ) const + { + return( m_velocitySensitiveQ ); + } + + // Stores the volume setting for the voice. + inline floatModel * volume( void ) const + { + return( m_volume ); + } + + // Stores the pan setting for the voice. + inline floatModel * pan( void ) const + { + return( m_pan ); + } + + // Indicates whether or not only the release portion of the envelope + // should be played. + inline boolModel * releaseTriggered( void ) const + { + return( m_releaseTriggered ); + } + + // Indicates whether or not random offsets should be generated for + // the volume and pitch. The offsets will move linearly to + // zero over the length of time defined by randomizeLength. + inline boolModel * randomizeAttack( void ) const + { + return( m_randomizeAttack ); + } + + // Stores the length of time in ms over which random offsets should + // be applied. + inline floatModel * randomizeLength( void ) const + { + return( m_randomizeLength ); + } + + // Stores the range for the random offset generated for the + // volume of a note. + inline floatModel * randomizeVelocityAmount( void ) const + { + return( m_randomizeVelocityAmount ); + } + + // Stores the range in half steps for the random offset generated + // for the pitch of a note. + inline floatModel * randomizeFrequencyAmount( void ) const + { + return( m_randomizeFrequencyAmount ); + } + + // Sets a delay for the right channel. Provides a quick and dirty + // way to create a stereo spread effect. + inline floatModel * spread( void ) const + { + return( m_spread ); + } + + // Calculates the amount to scale a frequency in order to provide + // a "bend" in a note. + inline float bendScaler() const + { + return( pow( 2.0f, ( m_bendRange->value() * m_bend->value() / + 49152.0f ) ) ); + } + + // Generates a random number between -1.0 and 1.0. + inline float offset( void ) const + { + return( 2.0f * ( static_cast( rand() ) / + static_cast( RAND_MAX ) - 0.5f ) ); + } + + virtual void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _parent ); + virtual void FASTCALL loadSettings( const QDomElement & _this ); + +private: + boolModel * m_monophonic; // multiple voice indicator + floatModel * m_portamento; // time for slide between notes + floatModel * m_bend; // bend state of note + floatModel * m_bendRange; // range of bend in half steps + boolModel * m_velocitySensitiveLPF; // turns on a LPF + floatModel * m_velocitySensitiveQ; // Q setting for the LPF + floatModel * m_volume; // volume of the voice + floatModel * m_pan; // pan position of the voice + boolModel * m_releaseTriggered; // only play release + boolModel * m_randomizeAttack; // turns on randomization + floatModel * m_randomizeLength; // time for randomization + floatModel * m_randomizeVelocityAmount; // velocity randomization + floatModel * m_randomizeFrequencyAmount;// pitch randomization + floatModel * m_spread; // stereo width +}; + + + +#endif diff --git a/plugins/stk/voices/include/stk_processor.h b/plugins/stk/voices/include/stk_processor.h new file mode 100644 index 000000000..412ab0f85 --- /dev/null +++ b/plugins/stk/voices/include/stk_processor.h @@ -0,0 +1,363 @@ +/* + * stk_processor.h - base class for stk sound generators + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _STK_PROCESSOR_H +#define _STK_PROCESSOR_H + +#include "Instrmnt.h" + +#include "config_mgr.h" +#include "note_play_handle.h" +#include "types.h" + + +template +class stkProcessor +{ +public: + stkProcessor( sample_rate_t _sample_rate ); + stkProcessor( sample_rate_t _sample_rate, + StkFloat _lowest_frequency ); + virtual ~stkProcessor( void ); + + StkFloat nextSampleLeft( void ); + StkFloat nextSampleRight( void ); + + Instrmnt * voice( void ); + bool active( void ); + float lastFrequency( void ); + notePlayHandle * note( void ); + fpp_t attackFrame( void ); + float deltaVelocity( void ); + float deltaFrequency( void ); + basicFilters<> * velocitySensitiveLPF( void ); + float velocity( void ); + void clearBuffer( void ); + + void setActive( bool _state ); + void setLastFrequency( float _frequency ); + void setNote( notePlayHandle * _note ); + void setAttackFrame( fpp_t _frame ); + void setDeltaVelocity( float _velocity ); + void setDeltaFrequency( float _frequency ); + void setVelocity( float _velocity ); + void noteOn( StkFloat _pitch, StkFloat _velocity ); + +protected: + Uint8 m_delayRead; + Uint8 m_delayWrite; + +private: + Instrmnt * m_voice; + + StkFloat m_delay[256]; + bool m_active; + StkFloat m_sample; + Uint16 m_bufferIndex; + float m_lastFrequency; + float m_velocity; + notePlayHandle * m_note; + fpp_t m_attackFrame; + float m_deltaVelocity; + float m_deltaFrequency; + basicFilters<> * m_velocitySensitiveLPF; +}; + + + + +template + inline stkProcessor::stkProcessor( + sample_rate_t _sample_rate ): + m_delayWrite( 0 ), + m_lastFrequency( 440.0f ) +{ + try + { + Stk::setSampleRate( _sample_rate ); + Stk::setRawwavePath( + configManager::inst()->stkDir().toAscii().constData() ); + + m_voice = new STKVOICE(); + } + catch( ... ) + { + m_voice = NULL; + } + + setActive( FALSE ); + + m_velocitySensitiveLPF = + new basicFilters<>( engine::getMixer()->sampleRate() ); + + m_velocitySensitiveLPF->setFilterType( basicFilters<>::LOWPASS ); +} + + + + +template + inline stkProcessor::stkProcessor( + sample_rate_t _sample_rate, + StkFloat _lowest_frequency ): + m_delayWrite( 0 ), + m_lastFrequency( 440.0f ) +{ + try + { + Stk::setSampleRate( _sample_rate ); + Stk::setRawwavePath( + configManager::inst()->stkDir().toAscii().constData() ); + + m_voice = new STKVOICE( _lowest_frequency ); + } + catch( ... ) + { + m_voice = NULL; + } + + setActive( FALSE ); + + m_velocitySensitiveLPF = + new basicFilters<>( engine::getMixer()->sampleRate() ); + + m_velocitySensitiveLPF->setFilterType( basicFilters<>::LOWPASS ); +} + + + + +template +inline stkProcessor::~stkProcessor( void ) +{ + m_voice->noteOff( 0.0 ); + delete m_voice; + delete m_velocitySensitiveLPF; +} + + + + +template +inline StkFloat stkProcessor::nextSampleLeft( void ) +{ + if( m_voice == NULL ) + { + return( 0.0f ); + } + else + { + m_sample = m_voice->tick(); + m_delay[m_delayWrite] = m_sample; + m_delayWrite++; + return( m_sample ); + } +} + + + + +template +inline StkFloat stkProcessor::nextSampleRight( void ) +{ + m_sample = m_delay[m_delayRead]; + m_delayRead++; + return( m_sample ); +} + + + + +template +inline Instrmnt * stkProcessor::voice( void ) +{ + return( m_voice ); +} + + + + +template +inline bool stkProcessor::active( void ) +{ + return( m_active ); +} + + + + +template +inline float stkProcessor::lastFrequency( void ) +{ + return( m_lastFrequency ); +} + + + + +template +inline notePlayHandle * stkProcessor::note( void ) +{ + return( m_note ); +} + + + + +template +inline fpp_t stkProcessor::attackFrame( void ) +{ + return( m_attackFrame ); +} + + + + +template +inline float stkProcessor::deltaVelocity( void ) +{ + return( m_deltaVelocity ); +} + + + + +template +inline float stkProcessor::deltaFrequency( void ) +{ + return( m_deltaFrequency ); +} + + + + +template +inline basicFilters<> * stkProcessor::velocitySensitiveLPF( void ) +{ + return( m_velocitySensitiveLPF ); +} + + + + +template +inline float stkProcessor::velocity( void ) +{ + return( m_velocity ); +} + + + + +template +void stkProcessor::setActive( bool _state ) +{ + m_active = _state; + + if( !m_active && m_voice != NULL ) + { + clearBuffer(); + m_voice->noteOff( 0.0f ); + m_note = NULL; + } +} + + + +template +void stkProcessor::setLastFrequency( float _frequency ) +{ + m_lastFrequency = _frequency; +} + + + + +template +void stkProcessor::setNote( notePlayHandle * _note ) +{ + m_note = _note; +} + + + + +template +void stkProcessor::setAttackFrame( fpp_t _frame ) +{ + m_attackFrame = _frame; +} + + + + +template +void stkProcessor::setDeltaVelocity( float _velocity ) +{ + m_deltaVelocity = _velocity; +} + + + + +template +void stkProcessor::setDeltaFrequency( float _frequency ) +{ + m_deltaFrequency = _frequency; +} + + + + +template +void stkProcessor::clearBuffer( void ) +{ + for( m_bufferIndex = 0; m_bufferIndex < 256; m_bufferIndex++ ) + { + m_delay[m_bufferIndex] = 0.0; + } +} + + + + +template +void stkProcessor::noteOn( StkFloat _pitch, + StkFloat _velocity ) +{ + m_voice->noteOn( _pitch, _velocity ); +} + + + + +template +void stkProcessor::setVelocity( float _velocity ) +{ + m_velocity = _velocity; +} + + + +#endif diff --git a/plugins/stk/voices/include/stk_voice.h b/plugins/stk/voices/include/stk_voice.h new file mode 100644 index 000000000..1c246329e --- /dev/null +++ b/plugins/stk/voices/include/stk_voice.h @@ -0,0 +1,369 @@ +/* + * stk_voice.h - base class for stk voices + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _STK_VOICE_H +#define _STK_VOICE_H + +#include "note_play_handle.h" + + +template +class stkVoice +{ +public: + stkVoice( Uint8 _polyphony = 64 ); + virtual ~stkVoice(); + + sampleFrame * FASTCALL playNote( notePlayHandle * _n, + MODEL * _model, + sampleFrame * _buffer, + const fpp_t _frames ); + + void setMissingFile( bool _state ); + +private: + bool m_filesMissing; + + float m_targetFrequency; + float m_currentFrequency; + float m_lastFrequency; + PROCESSOR * m_processor; + fpp_t m_frame; + sample_t m_leftSample; + sample_t m_rightSample; + Uint8 m_channel; + float m_leftRMS; + float m_rightRMS; + float m_pan; + fpp_t m_totalAttackFrames; + fpp_t m_attackFrame; + float m_deltaVelocity; + float m_deltaFrequency; + float m_attackVelocity; + float m_attackFrequency; + + QVector m_voices; + Uint8 m_voiceIndex; + Uint8 m_polyphony; + + sample_rate_t m_sampleRate; + int m_portamentoFrames; +}; + + +template +stkVoice::stkVoice( Uint8 _polyphony ): + m_lastFrequency( 440.0f ), + m_polyphony( _polyphony ), + m_sampleRate( engine::getMixer()->sampleRate() ), + m_portamentoFrames( 0 ) +{ + for( m_voiceIndex = 0; m_voiceIndex < m_polyphony; m_voiceIndex++ ) + { + m_voices.append( new PROCESSOR( m_sampleRate ) ); + } +} + + + + +template +stkVoice::~stkVoice() +{ + for( m_voiceIndex = 0; m_voiceIndex < m_polyphony; m_voiceIndex++ ) + { + delete m_voices[m_voiceIndex]; + } +} + + + +template +sampleFrame * FASTCALL stkVoice::playNote( + notePlayHandle * _n, + MODEL * _model, + sampleFrame * _buffer, + const fpp_t _frames ) +{ + // Don't do anything if STK isn't installed properly. + if( m_filesMissing ) + { + return _buffer; + } + + // Don't do anything if the instrument is release triggered and we + // haven't released yet. + if( _model->releaseTriggered()->value() && !_n->released() ) + { + return _buffer; + } + + // If it's a new note, we need to get a voice. + if ( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) + { + // Monophonic instruments only use the first defined voice. + if( _model->monophonic()->value() ) + { + if( m_voices[0]->active() && + m_voices[0]->note() != NULL ) + { + m_voices[0]->note()->noteOff( 0 ); + } + m_processor = m_voices[0]; + } + // Otherwise, search for a voice that isn't in use. + else + { + m_processor = NULL; + for( m_voiceIndex = 0; m_voiceIndex < m_polyphony; + m_voiceIndex++ ) + { + if( !m_voices[m_voiceIndex]->active() ) + { + m_processor = m_voices[m_voiceIndex]; + break; + } + } + + // Don't do anything if no voices are available. + if( m_processor == NULL ) + { + return( _buffer ); + } + } + + // Assign the voice and label it as active. + _n->m_pluginData = m_processor; + m_processor->setActive( TRUE ); + + // Initialize the velocity and the number of frames played + // so far. + m_processor->setVelocity( + static_cast( _n->getVolume() ) / + 100.0f ); + m_processor->setAttackFrame( 0 ); + + // Initialize the number of frames for the portamento + // transition. + m_portamentoFrames = static_cast( + engine::getMixer()->sampleRate() * + _model->portamento()->value() / + 1000.0f ); + + // If the attack is randomized, calculate the number of frames + // over which the modifications should take place and + // generate a pair of offsets. + if( _model->randomizeAttack()->value() ) + { + m_totalAttackFrames = static_cast( + engine::getMixer()->sampleRate() * + _model->randomizeLength()->value() / + 1000.0f ); + + m_attackVelocity = + _model->randomizeVelocityAmount()->value() * + _model->offset(); + if( m_processor->velocity() + m_attackVelocity < 0.0f ) + { + m_attackVelocity = -m_processor->velocity(); + } + if( m_processor->velocity() + + m_attackVelocity > 1.0f ) + { + m_attackVelocity = 1.0f - m_processor->velocity(); + } + + m_processor->setDeltaVelocity( m_attackVelocity ); + + m_attackFrequency = + _model->randomizeFrequencyAmount()->value() * + _model->offset(); + + m_processor->setDeltaFrequency( m_attackFrequency ); + } + else + { + m_totalAttackFrames = 0; + m_processor->setDeltaVelocity( 0.0f ); + m_processor->setDeltaFrequency( 0.0f ); + } + + // If the velocity sensitive filter is turned on, calculate the + // coefficients and clear the taps. The filter cutoff is set + // as: + // cutoff = max_freq * ( 10^velocity ) / 10 + if( _model->velocitySensitiveLPF()->value() ) + { + m_processor->velocitySensitiveLPF()->calcFilterCoeffs( + pow( 10.0f, m_processor->velocity() + + m_processor->deltaVelocity() ) * + engine::getMixer()->sampleRate() / 20.0f, + _model->velocitySensitiveQ()->value() ); + m_processor->velocitySensitiveLPF()->clearHistory(); + } + } + + // Used to keep track of the level across the buffer. + m_leftRMS = 0.0f; + m_rightRMS = 0.0f; + + // Get the processing unit assigned to the note. + m_processor = static_cast( _n->m_pluginData ); + + // Initialize the pitch settings. + m_targetFrequency = _n->frequency(); + m_lastFrequency = m_processor->lastFrequency(); + m_currentFrequency = m_lastFrequency; + + m_processor->setControls( _model ); + + // Initialize the attack offset calculation variables. + m_attackVelocity = 0.0f; + m_attackFrequency = 1.0f; + m_attackFrame = m_processor->attackFrame(); + m_deltaVelocity = m_processor->deltaVelocity(); + m_deltaFrequency = m_processor->deltaFrequency(); + + // Generate the buffer. + for( m_frame = 0; m_frame < _frames; ++m_frame ) + { + // Slide across the randomized attack offsets. + // Will be ignored if randomization is turned off because + // both m_attackFrame and m_totalAttackFrames will be + // zero. Just a linear iterpolation. + if( m_attackFrame < m_totalAttackFrames ) + { + m_attackVelocity = m_deltaVelocity - m_deltaVelocity * + m_attackFrame / + m_totalAttackFrames; + + if( m_processor->velocity() + m_attackVelocity < 0.0f ) + { + m_attackVelocity = -m_processor->velocity(); + } + else if( m_processor->velocity() + m_attackVelocity > 1.0f ) + { + m_attackVelocity = 1.0f - m_processor->velocity(); + } + + + m_attackFrequency = m_deltaFrequency - + m_deltaFrequency * + m_attackFrame / + m_totalAttackFrames; + + // Convert m_attackFrequency to a half step based + // scaling factor for the pitch. + m_attackFrequency = pow( 2.0f, m_attackFrequency / + 12.0f ); + + m_attackFrame++; + } + + // If there are any portamento frames to be processed, + // calculate the pitch slide based on whatever the most + // recently used frequency was. + if( m_portamentoFrames > 0 ) + { + m_currentFrequency += ( m_targetFrequency - + m_lastFrequency ) / + static_cast( m_portamentoFrames ); + + // Sliding polyphonic instruments can end up with + // negative frequencies, so stop the slid as long + // as the situation persists. + if( m_currentFrequency < 0.0f ) + { + m_currentFrequency -= + ( m_targetFrequency - m_lastFrequency ) / + static_cast( m_portamentoFrames ); + } + + m_processor->noteOn( m_currentFrequency * + _model->bendScaler(), + m_processor->velocity() + + m_attackVelocity ); + } + else + { + m_processor->noteOn( m_targetFrequency * + _model->bendScaler() * + m_attackFrequency, + m_processor->velocity() + + m_attackVelocity ); + } + + // Calculate the pan level for the right channel. + m_pan = ( 1.0f + _model->pan()->value() ) / 2.0f; + + // Generate the samples. + m_leftSample = m_processor->nextSampleLeft() * + _model->volume()->value() * ( 1.0f - m_pan ); + m_rightSample = m_processor->nextSampleRight() * + _model->volume()->value() * m_pan; + + // Process the velocity sensitive filter. + if( _model->velocitySensitiveLPF()->value() ) + { + m_leftSample = m_processor->velocitySensitiveLPF()->update( m_leftSample, 0 ); + m_rightSample = m_processor->velocitySensitiveLPF()->update( m_rightSample, 1 ); + } + + // Keep track of the levels. + m_leftRMS += m_leftSample * m_leftSample; + m_rightRMS += m_rightSample * m_rightSample; + + // Stuff the samples into the channels. + for( m_channel = 0; m_channel < DEFAULT_CHANNELS / 2; + ++m_channel ) + { + _buffer[m_frame][m_channel * DEFAULT_CHANNELS / 2] = m_leftSample; + _buffer[m_frame][( m_channel + 1 ) * DEFAULT_CHANNELS / 2] = m_rightSample; + } + } + + // Remember the frequency and the number of frames processed. + m_processor->setLastFrequency( m_currentFrequency ); + m_processor->setAttackFrame( m_attackFrame ); + + // Keep track of the portamento frames. + if( m_portamentoFrames > 0 ) + { + m_portamentoFrames -= _frames; + } + + return( _buffer ); +} + + + + +template + void stkVoice::setMissingFile( bool _state ) +{ + m_filesMissing = _state; +} + + +#endif diff --git a/plugins/stk/voices/metal/Makefile.am b/plugins/stk/voices/metal/Makefile.am new file mode 100644 index 000000000..63a340767 --- /dev/null +++ b/plugins/stk/voices/metal/Makefile.am @@ -0,0 +1,46 @@ +AUTOMAKE_OPTIONS = foreign 1.4 + + +INCLUDES = -I@stk_includes@ -I$(top_srcdir)/include -I$(top_srcdir)/src/lib -I. -I$(top_srcdir)/plugins/stk/voices/include + + +AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="metal" + + +%.moc: ./%.h + $(MOC) -o $@ $< + + +MOC_FILES = ./metal_model.moc + +BUILT_SOURCES = $(MOC_FILES) ./embedded_resources.h +EMBEDDED_RESOURCES = $(wildcard *png) + +./embedded_resources.h: $(EMBEDDED_RESOURCES) + $(BIN2RES) $(EMBEDDED_RESOURCES) > $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES = libmetal.la + +libmetal_la_SOURCES = metal_model.cpp \ + metal_model.h \ + metal_processor.cpp \ + metal_processor.h \ + metal_instrument.cpp \ + metal_instrument.h \ + metal_instrument_view.cpp \ + metal_instrument_view.h \ + $(top_srcdir)/plugins/stk/voices/src/stk_model.cpp \ + stk_model.h + + + +libmetal_la_LDFLAGS = -L@stk_lib@ -lstk -Wl,-export-dynamic + +$(libmetal_la_SOURCES): ./embedded_resources.h diff --git a/plugins/stk/voices/metal/artwork.png b/plugins/stk/voices/metal/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..55d1ce0fcb45ab9fa9f67f1c05e3d44dfe7bf151 GIT binary patch literal 71394 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≀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 Uq5)Em`Tzg`07*qoM6N<$f?Sy%n*aa+ literal 0 HcmV?d00001 diff --git a/plugins/stk/voices/metal/logo.png b/plugins/stk/voices/metal/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..20a6081015e8b76b4f4e96a40f8c624e5aaeb64c GIT binary patch literal 890 zcmV-=1BLvFP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4z z76CcTyF*|A00R0+L_t(&-tCuNXpUhR$N&4;%#hD~)Mm=ph7?Eh5h2az5iw502@WWx zq!cx3lBBlQlF|+okrS-pz)qMrkPvp_YcU@+8_TfWuaoPor^oAkpNIFrbpPw=eeUc2 z-~a2rp8LM9>wcww5H&S5In~wGIqI*dtE=n3llSoO@bK{P@bK{HKltU|4U|aQENPLX z5=p})B_w^6)GDb(Qlq5X&bb6|L(;N8@cmiR2OX`#~DrpbRZIGk}NgE{f zN!lIk90Jq>eLy0@Gsecfi^vZ@H$#(KZ}w}cq6NkQcZ|~stdOK!>&%yQUDA9>PbAe! zYL@g;Qjesek|s);Eorf&DbBeMlH{Blm%`b2NpB^6a?Xv6xFYlHw+xuRuikEHr zU{c`x?Mo+e1X!EF(P-d-iS13p+i0B2F$>tk-}JAxtk?@I$+Tzh0o#D7K%Q-xQeY48 z#yF3Ff;1C4YP`cS3)rbNoT@;IElfq|ig^9Ko9V6;sG#d&7O<@u&egSK1_biLgz5H` z&)XO7uqEpTo&y(w3LrPagxbx~ + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "engine.h" +#include "note_play_handle.h" + +#include "metal_instrument.h" +#include "metal_instrument_view.h" +#include "metal_processor.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embedded_resources.h" + + +extern "C" +{ + +plugin::descriptor metal_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "Metal", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Buzzy noises" ), + "Danny McRae ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + +metalInstrument::metalInstrument( instrumentTrack * _channel_track ): + stkInstrument( _channel_track, &metal_plugin_descriptor ) +{ + model()->index()->setTrack( _channel_track ); + model()->crossfade()->setTrack( _channel_track ); + model()->lfoSpeed()->setTrack( _channel_track ); + model()->lfoDepth()->setTrack( _channel_track ); + model()->adsrTarget()->setTrack( _channel_track ); +} + + + + +metalInstrument::~metalInstrument() +{ +} + + + + +QString metalInstrument::nodeName( void ) const +{ + return( metal_plugin_descriptor.name ); +} + + + + +pluginView * metalInstrument::instantiateView( QWidget * _parent ) +{ + return( new metalInstrumentView( this, _parent ) ); +} + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( model * _model, void * _data ) +{ + return( new metalInstrument( static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/stk/voices/metal/metal_instrument.h b/plugins/stk/voices/metal/metal_instrument.h new file mode 100644 index 000000000..73b9bcb90 --- /dev/null +++ b/plugins/stk/voices/metal/metal_instrument.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _METAL_INSTRUMENT_H +#define _METAL_INSTRUMENT_H + +#include "stk_instrument.h" + +#include "metal_processor.h" +#include "metal_model.h" + + +class metalInstrument : public stkInstrument +{ +public: + metalInstrument( instrumentTrack * _channel_track ); + virtual ~metalInstrument( void ); + + QString nodeName( void ) const; + + pluginView * instantiateView( QWidget * _parent ); +}; + +#endif diff --git a/plugins/stk/voices/metal/metal_instrument_view.cpp b/plugins/stk/voices/metal/metal_instrument_view.cpp new file mode 100644 index 000000000..06ab9fba4 --- /dev/null +++ b/plugins/stk/voices/metal/metal_instrument_view.cpp @@ -0,0 +1,110 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include +#include +#include + +#include "metal_instrument_view.h" + +#include +#include + +#include "engine.h" +#include "gui_templates.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +metalInstrumentView::metalInstrumentView( metalInstrument * _instrument, QWidget * _parent ) : + stkInstrumentView( _instrument, _parent ) +{ + QVBoxLayout * vl = new QVBoxLayout( m_topView ); + QHBoxLayout * h1 = new QHBoxLayout(); + QHBoxLayout * h2 = new QHBoxLayout(); + QHBoxLayout * h3 = new QHBoxLayout(); + + + m_index = new knob( knobSmall_17, m_topView, tr( "Index" ) ); + m_index->setLabel( tr( "Modulator Index" ) ); + m_index->setHintText( tr( "Index:" ) + " ", "" ); + + m_crossfade = new knob( knobSmall_17, m_topView, tr( "Crossfade" ) ); + m_crossfade->setLabel( tr( "Modulator Crossfade" ) ); + m_crossfade->setHintText( tr( "Crossfade:" ) + " ", "" ); + + m_lfoSpeed = new knob( knobSmall_17, m_topView, tr( "LFO Speed" ) ); + m_lfoSpeed->setLabel( tr( "LFO Speed" ) ); + m_lfoSpeed->setHintText( tr( "LFO Speed:" ) + " ", "" ); + + m_lfoDepth = new knob( knobSmall_17, m_topView, tr( "LFO Depth" ) ); + m_lfoDepth->setLabel( tr( "LFO Depth" ) ); + m_lfoDepth->setHintText( tr( "LFO Depth:" ) + " ", "" ); + + m_adsrTarget = new knob( knobSmall_17, m_topView, tr( "ADSR Target" ) ); + m_adsrTarget->setLabel( tr( "ADSR Target" ) ); + m_adsrTarget->setHintText( tr( "ADSR Target:" ) + " ", "" ); + + h1->addWidget( m_index ); + h1->addWidget( m_crossfade ); + + h2->addWidget( m_lfoSpeed ); + h2->addWidget( m_lfoDepth ); + + h3->addWidget( m_adsrTarget ); + + vl->addLayout( h1 ); + vl->addLayout( h2 ); + vl->addLayout( h3 ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); +} + + + + +metalInstrumentView::~metalInstrumentView() +{ +} + + + + +void metalInstrumentView::modelChanged( void ) +{ + stkInstrumentView::modelChanged(); + + metalInstrument * inst = castModel(); + m_index->setModel( inst->model()->index() ); + m_crossfade->setModel( inst->model()->crossfade() ); + m_lfoSpeed->setModel( inst->model()->lfoSpeed() ); + m_lfoDepth->setModel( inst->model()->lfoDepth() ); + m_adsrTarget->setModel( inst->model()->adsrTarget() ); +} + + + diff --git a/plugins/stk/voices/metal/metal_instrument_view.h b/plugins/stk/voices/metal/metal_instrument_view.h new file mode 100644 index 000000000..751dd1200 --- /dev/null +++ b/plugins/stk/voices/metal/metal_instrument_view.h @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _METAL_INSTRUMENT_VIEW_H +#define _METAL_INSTRUMENT_VIEW_H + +#include "knob.h" + +#include "stk_instrument_view.h" +#include "metal_instrument.h" + + +class metalInstrumentView: public stkInstrumentView +{ +public: + metalInstrumentView( metalInstrument * _instrument, QWidget * _parent ); + virtual ~metalInstrumentView( void ); + +private: + virtual void modelChanged( void ); + + knob * m_index; + knob * m_crossfade; + knob * m_lfoSpeed; + knob * m_lfoDepth; + knob * m_adsrTarget; +}; + +#endif diff --git a/plugins/stk/voices/metal/metal_model.cpp b/plugins/stk/voices/metal/metal_model.cpp new file mode 100644 index 000000000..bd9b84301 --- /dev/null +++ b/plugins/stk/voices/metal/metal_model.cpp @@ -0,0 +1,88 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "metal_model.h" + + +metalModel::metalModel( bool _monophonic, + StkFloat _portamento, + StkFloat _bend, + StkFloat _bend_range, + bool _velocity_sensitive_lpf, + StkFloat _velocity_sensitive_q, + StkFloat _volume, + StkFloat _pan, + StkFloat _spread, + StkFloat _index, + StkFloat _crossfade, + StkFloat _lfo_speed, + StkFloat _lfo_depth, + StkFloat _adsr_target ): + stkModel( _monophonic, _portamento, _bend, _bend_range, _velocity_sensitive_lpf, _velocity_sensitive_q, _volume, _pan, _spread ), + m_index( new floatModel( _index, 0.0f, 128.0f, 0.1f, this ) ), + m_crossfade( new floatModel( _crossfade, 0.0f, 128.0f, 0.1f, this ) ), + m_lfoSpeed( new floatModel( _lfo_speed, 0.0f, 128.0f, 0.1f, this ) ), + m_lfoDepth( new floatModel( _lfo_depth, 0.0f, 128.0f, 0.1f, this ) ), + m_adsrTarget( new floatModel( _adsr_target, 0.0f, 128.0f, 0.1f, this ) ) +{ +} + + + + +metalModel::~metalModel() +{ + delete m_index; + delete m_crossfade; + delete m_lfoSpeed; + delete m_lfoDepth; + delete m_adsrTarget; +} + + + + +void FASTCALL metalModel::saveSettings( QDomDocument & _doc, QDomElement & _parent ) +{ + stkModel::saveSettings( _doc, _parent ); + m_index->saveSettings( _doc, _parent, "index" ); + m_crossfade->saveSettings( _doc, _parent, "crossfade" ); + m_lfoSpeed->saveSettings( _doc, _parent, "lfospeed" ); + m_lfoDepth->saveSettings( _doc, _parent, "lfodepth" ); + m_adsrTarget->saveSettings( _doc, _parent, "adsrtarget" ); +} + + + + +void FASTCALL metalModel::loadSettings( const QDomElement & _this ) +{ + stkModel::loadSettings( _this ); + m_index->loadSettings( _this, "index" ); + m_crossfade->loadSettings( _this, "crossfade" ); + m_lfoSpeed->loadSettings( _this, "lfospeed" ); + m_lfoDepth->loadSettings( _this, "lfodepth" ); + m_adsrTarget->loadSettings( _this, "adsrtarget" ); +} + diff --git a/plugins/stk/voices/metal/metal_model.h b/plugins/stk/voices/metal/metal_model.h new file mode 100644 index 000000000..7bdb3024c --- /dev/null +++ b/plugins/stk/voices/metal/metal_model.h @@ -0,0 +1,86 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _METAL_MODEL_H +#define _METAL_MODEL_H + +#include "stk_model.h" + + +class metalModel: public stkModel +{ +public: + metalModel( bool _monophonic = FALSE, + StkFloat _portamento = 0.0f, + StkFloat _bend = 0.0f, + StkFloat _bend_range = 2.0f, + bool _velocity_sensitive_lpf = TRUE, + StkFloat _velocity_sensitive_q = 0.5f, + StkFloat _volume = 1.0f, + StkFloat _pan = 0.0f, + StkFloat _spread = 0.0f, + StkFloat _index = 64.0f, + StkFloat _crossfade = 64.0f, + StkFloat _lfo_speed = 64.0f, + StkFloat _lfo_depth = 64.0f, + StkFloat _adsr_target = 64.0f ); + ~metalModel(); + + inline floatModel * index( void ) const + { + return( m_index ); + } + + inline floatModel * crossfade( void ) const + { + return( m_crossfade ); + } + + inline floatModel * lfoSpeed( void ) + { + return( m_lfoSpeed ); + } + + inline floatModel * lfoDepth( void ) const + { + return( m_lfoDepth ); + } + + inline floatModel * adsrTarget( void ) const + { + return( m_adsrTarget ); + } + + void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _parent ); + + void FASTCALL loadSettings( const QDomElement & _this ); + +private: + floatModel * m_index; + floatModel * m_crossfade; + floatModel * m_lfoSpeed; + floatModel * m_lfoDepth; + floatModel * m_adsrTarget; +}; + +#endif diff --git a/plugins/stk/voices/metal/metal_processor.cpp b/plugins/stk/voices/metal/metal_processor.cpp new file mode 100644 index 000000000..178f4584a --- /dev/null +++ b/plugins/stk/voices/metal/metal_processor.cpp @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include "metal_processor.h" +#include "config_mgr.h" + + +metalProcessor::metalProcessor( sample_rate_t _sample_rate ): + stkProcessor( _sample_rate ) +{ +} + + + + +metalProcessor::~metalProcessor() +{ +} + + + + +void metalProcessor::setControls( metalModel * _model ) +{ + voice()->controlChange( 2, _model->index()->value() ); + voice()->controlChange( 4, _model->crossfade()->value() ); + voice()->controlChange( 11, _model->lfoSpeed()->value() ); + voice()->controlChange( 1, _model->lfoDepth()->value() ); + voice()->controlChange( 128, _model->adsrTarget()->value() ); + m_delayRead = m_delayWrite - static_cast( _model->spread()->value() ); +} diff --git a/plugins/stk/voices/metal/metal_processor.h b/plugins/stk/voices/metal/metal_processor.h new file mode 100644 index 000000000..07e846283 --- /dev/null +++ b/plugins/stk/voices/metal/metal_processor.h @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _METAL_PROCESSOR_H +#define _METAL_PROCESSOR_H + +#include "HevyMetl.h" + +#include "stk_processor.h" + +#include "metal_model.h" + +class metalProcessor: public stkProcessor +{ +public: + metalProcessor( sample_rate_t _sample_rate ); + ~metalProcessor( void ); + + void setControls( metalModel * _model ); +}; + +#endif diff --git a/plugins/stk/voices/moog/Makefile.am b/plugins/stk/voices/moog/Makefile.am new file mode 100644 index 000000000..634c5b9eb --- /dev/null +++ b/plugins/stk/voices/moog/Makefile.am @@ -0,0 +1,46 @@ +AUTOMAKE_OPTIONS = foreign 1.4 + + +INCLUDES = -I@stk_includes@ -I$(top_srcdir)/include -I$(top_srcdir)/src/lib -I. -I$(top_srcdir)/plugins/stk/voices/include + + +AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="moog" + + +%.moc: ./%.h + $(MOC) -o $@ $< + + +MOC_FILES = ./moog_model.moc + +BUILT_SOURCES = $(MOC_FILES) ./embedded_resources.h +EMBEDDED_RESOURCES = $(wildcard *png) + +./embedded_resources.h: $(EMBEDDED_RESOURCES) + $(BIN2RES) $(EMBEDDED_RESOURCES) > $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES = libmoog.la + +libmoog_la_SOURCES = moog_model.cpp \ + moog_model.h \ + moog_processor.cpp \ + moog_processor.h \ + moog_instrument.cpp \ + moog_instrument.h \ + moog_instrument_view.cpp \ + moog_instrument_view.h \ + $(top_srcdir)/plugins/stk/voices/src/stk_model.cpp \ + stk_model.h + + + +libmoog_la_LDFLAGS = -L@stk_lib@ -lstk -Wl,-export-dynamic + +$(libmoog_la_SOURCES): ./embedded_resources.h diff --git a/plugins/stk/voices/moog/artwork.png b/plugins/stk/voices/moog/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..2abdb5171c35451851ce9384faf3b4c1c90db16e GIT binary patch literal 71518 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 z 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 literal 0 HcmV?d00001 diff --git a/plugins/stk/voices/moog/logo.png b/plugins/stk/voices/moog/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..20a6081015e8b76b4f4e96a40f8c624e5aaeb64c GIT binary patch literal 890 zcmV-=1BLvFP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4z z76CcTyF*|A00R0+L_t(&-tCuNXpUhR$N&4;%#hD~)Mm=ph7?Eh5h2az5iw502@WWx zq!cx3lBBlQlF|+okrS-pz)qMrkPvp_YcU@+8_TfWuaoPor^oAkpNIFrbpPw=eeUc2 z-~a2rp8LM9>wcww5H&S5In~wGIqI*dtE=n3llSoO@bK{P@bK{HKltU|4U|aQENPLX z5=p})B_w^6)GDb(Qlq5X&bb6|L(;N8@cmiR2OX`#~DrpbRZIGk}NgE{f zN!lIk90Jq>eLy0@Gsecfi^vZ@H$#(KZ}w}cq6NkQcZ|~stdOK!>&%yQUDA9>PbAe! zYL@g;Qjesek|s);Eorf&DbBeMlH{Blm%`b2NpB^6a?Xv6xFYlHw+xuRuikEHr zU{c`x?Mo+e1X!EF(P-d-iS13p+i0B2F$>tk-}JAxtk?@I$+Tzh0o#D7K%Q-xQeY48 z#yF3Ff;1C4YP`cS3)rbNoT@;IElfq|ig^9Ko9V6;sG#d&7O<@u&egSK1_biLgz5H` z&)XO7uqEpTo&y(w3LrPagxbx~ + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "engine.h" +#include "note_play_handle.h" + +#include "moog_instrument.h" +#include "moog_instrument_view.h" +#include "moog_processor.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embedded_resources.h" + + +extern "C" +{ + +plugin::descriptor moog_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "Moog", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Moogy sounds" ), + "Danny McRae ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + +moogInstrument::moogInstrument( instrumentTrack * _channel_track ): + stkInstrument( _channel_track, &moog_plugin_descriptor ) +{ + model()->filterQ()->setTrack( _channel_track ); + model()->filterSweepRate()->setTrack( _channel_track ); + model()->vibratoFrequency()->setTrack( _channel_track ); + model()->vibratoGain()->setTrack( _channel_track ); +} + + + + +moogInstrument::~moogInstrument() +{ +} + + + + +QString moogInstrument::nodeName( void ) const +{ + return( moog_plugin_descriptor.name ); +} + + + + +pluginView * moogInstrument::instantiateView( QWidget * _parent ) +{ + return( new moogInstrumentView( this, _parent ) ); +} + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( model * _model, void * _data ) +{ + return( new moogInstrument( static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/stk/voices/moog/moog_instrument.h b/plugins/stk/voices/moog/moog_instrument.h new file mode 100644 index 000000000..4b7ffe876 --- /dev/null +++ b/plugins/stk/voices/moog/moog_instrument.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _MOOG_INSTRUMENT_H +#define _MOOG_INSTRUMENT_H + +#include "stk_instrument.h" + +#include "moog_processor.h" +#include "moog_model.h" + + +class moogInstrument : public stkInstrument +{ +public: + moogInstrument( instrumentTrack * _channel_track ); + virtual ~moogInstrument( void ); + + QString nodeName( void ) const; + + pluginView * instantiateView( QWidget * _parent ); +}; + +#endif diff --git a/plugins/stk/voices/moog/moog_instrument_view.cpp b/plugins/stk/voices/moog/moog_instrument_view.cpp new file mode 100644 index 000000000..719f3a55e --- /dev/null +++ b/plugins/stk/voices/moog/moog_instrument_view.cpp @@ -0,0 +1,100 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include +#include +#include + +#include "moog_instrument_view.h" + +#include +#include + +#include "engine.h" +#include "gui_templates.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +moogInstrumentView::moogInstrumentView( moogInstrument * _instrument, QWidget * _parent ) : + stkInstrumentView( _instrument, _parent ) +{ + QVBoxLayout * vl = new QVBoxLayout( m_topView ); + QHBoxLayout * h1 = new QHBoxLayout; + QHBoxLayout * h2 = new QHBoxLayout; + + m_filterQ = new knob( knobSmall_17, m_topView, tr( "Filter Q" ) ); + m_filterQ->setLabel( tr( "Filter Q" ) ); + m_filterQ->setHintText( tr( "Q:" ) + " ", "" ); + + m_filterSweepRate = new knob( knobSmall_17, m_topView, tr( "Sweep Rate" ) ); + m_filterSweepRate->setLabel( tr( "Sweep Rate" ) ); + m_filterSweepRate->setHintText( tr( "Rate:" ) + " ", "" ); + + m_vibratoFrequency = new knob( knobSmall_17, m_topView, tr( "Vib Freq" ) ); + m_vibratoFrequency->setLabel( tr( "Vibrato Frequency" ) ); + m_vibratoFrequency->setHintText( tr( "Vib Freq:" ) + " ", "" ); + + m_vibratoGain = new knob( knobSmall_17, m_topView, tr( "Vib Gain" ) ); + m_vibratoGain->setLabel( tr( "Vibrato Gain" ) ); + m_vibratoGain->setHintText( tr( "Vib Gain:" ) + " ", "" ); + + h1->addWidget( m_filterQ ); + h1->addWidget( m_filterSweepRate ); + + h2->addWidget( m_vibratoFrequency ); + h2->addWidget( m_vibratoGain ); + + vl->addLayout( h1 ); + vl->addLayout( h2 ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); +} + + + + +moogInstrumentView::~moogInstrumentView() +{ +} + + + + +void moogInstrumentView::modelChanged( void ) +{ + stkInstrumentView::modelChanged(); + + moogInstrument * inst = castModel(); + m_filterQ->setModel( inst->model()->filterQ() ); + m_filterSweepRate->setModel( inst->model()->filterSweepRate() ); + m_vibratoFrequency->setModel( inst->model()->vibratoFrequency() ); + m_vibratoGain->setModel( inst->model()->vibratoGain() ); +} + + + diff --git a/plugins/stk/voices/moog/moog_instrument_view.h b/plugins/stk/voices/moog/moog_instrument_view.h new file mode 100644 index 000000000..ee3365381 --- /dev/null +++ b/plugins/stk/voices/moog/moog_instrument_view.h @@ -0,0 +1,50 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _MOOG_INSTRUMENT_VIEW_H +#define _MOOG_INSTRUMENT_VIEW_H + +#include "knob.h" + +#include "stk_instrument_view.h" +#include "moog_instrument.h" + + +class moogInstrumentView: public stkInstrumentView +{ +public: + moogInstrumentView( moogInstrument * _instrument, QWidget * _parent ); + virtual ~moogInstrumentView( void ); + +private: + virtual void modelChanged( void ); + + knob * m_filterQ; + knob * m_filterSweepRate; + knob * m_vibratoFrequency; + knob * m_vibratoGain; +}; + +#endif diff --git a/plugins/stk/voices/moog/moog_model.cpp b/plugins/stk/voices/moog/moog_model.cpp new file mode 100644 index 000000000..0919627db --- /dev/null +++ b/plugins/stk/voices/moog/moog_model.cpp @@ -0,0 +1,83 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "moog_model.h" + + +moogModel::moogModel( bool _monophonic, + StkFloat _portamento, + StkFloat _bend, + StkFloat _bend_range, + bool _velocity_sensitive_lpf, + StkFloat _velocity_sensitive_q, + StkFloat _volume, + StkFloat _pan, + StkFloat _spread, + StkFloat _filter_q, + StkFloat _filter_sweep_rate, + StkFloat _vibrato_frequency, + StkFloat _vibrato_gain ): + stkModel( _monophonic, _portamento, _bend, _bend_range, _velocity_sensitive_lpf, _velocity_sensitive_q, _volume, _pan, _spread ), + m_filterQ( new floatModel( _filter_q, 0.0f, 128.0f, 0.1f, this ) ), + m_filterSweepRate( new floatModel( _filter_sweep_rate, 0.0f, 128.0f, 0.1f, this ) ), + m_vibratoFrequency( new floatModel( _vibrato_frequency, 0.0f, 128.0f, 0.1f, this ) ), + m_vibratoGain( new floatModel( _vibrato_gain, 0.0f, 128.0f, 0.1f, this ) ) +{ +} + + + + +moogModel::~moogModel() +{ + delete m_filterQ; + delete m_filterSweepRate; + delete m_vibratoFrequency; + delete m_vibratoGain; +} + + + + +void FASTCALL moogModel::saveSettings( QDomDocument & _doc, QDomElement & _parent ) +{ + stkModel::saveSettings( _doc, _parent ); + m_filterQ->saveSettings( _doc, _parent, "filterq" ); + m_filterSweepRate->saveSettings( _doc, _parent, "filtersweeprate" ); + m_vibratoFrequency->saveSettings( _doc, _parent, "vibratofrequency" ); + m_vibratoGain->saveSettings( _doc, _parent, "vibratogain" ); +} + + + + +void FASTCALL moogModel::loadSettings( const QDomElement & _this ) +{ + stkModel::loadSettings( _this ); + m_filterQ->loadSettings( _this, "filterq" ); + m_filterSweepRate->loadSettings( _this, "filtersweeprate" ); + m_vibratoFrequency->loadSettings( _this, "vibratofrequency" ); + m_vibratoGain->loadSettings( _this, "vibratogain" ); +} + diff --git a/plugins/stk/voices/moog/moog_model.h b/plugins/stk/voices/moog/moog_model.h new file mode 100644 index 000000000..e904d9d41 --- /dev/null +++ b/plugins/stk/voices/moog/moog_model.h @@ -0,0 +1,79 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _MOOG_MODEL_H +#define _MOOG_MODEL_H + +#include "stk_model.h" + + +class moogModel: public stkModel +{ +public: + moogModel( bool _monophonic = FALSE, + StkFloat _portamento = 0.0f, + StkFloat _bend = 0.0f, + StkFloat _bend_range = 2.0f, + bool _velocity_sensitive_lpf = TRUE, + StkFloat _velocity_sensitive_q = 0.5f, + StkFloat _volume = 1.0f, + StkFloat _pan = 0.0f, + StkFloat _spread = 0.0f, + StkFloat _filter_q = 64.0f, + StkFloat _filter_sweep_rate = 64.0f, + StkFloat _vibrato_frequency = 64.0f, + StkFloat _vibrato_gain = 64.0f ); + ~moogModel(); + + inline floatModel * filterQ( void ) const + { + return( m_filterQ ); + } + + inline floatModel * filterSweepRate( void ) const + { + return( m_filterSweepRate ); + } + + inline floatModel * vibratoFrequency( void ) const + { + return( m_vibratoFrequency ); + } + + inline floatModel * vibratoGain( void ) const + { + return( m_vibratoGain ); + } + + void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _parent ); + + void FASTCALL loadSettings( const QDomElement & _this ); + +private: + floatModel * m_filterQ; + floatModel * m_filterSweepRate; + floatModel * m_vibratoFrequency; + floatModel * m_vibratoGain; +}; + +#endif diff --git a/plugins/stk/voices/moog/moog_processor.cpp b/plugins/stk/voices/moog/moog_processor.cpp new file mode 100644 index 000000000..958c1ca4f --- /dev/null +++ b/plugins/stk/voices/moog/moog_processor.cpp @@ -0,0 +1,50 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include "moog_processor.h" +#include "config_mgr.h" + + +moogProcessor::moogProcessor( sample_rate_t _sample_rate ): + stkProcessor( _sample_rate ) +{ +} + + + + +moogProcessor::~moogProcessor() +{ +} + + + + +void moogProcessor::setControls( moogModel * _model ) +{ + voice()->controlChange( 2, _model->filterQ()->value() ); + voice()->controlChange( 4, _model->filterSweepRate()->value() ); + voice()->controlChange( 11, _model->vibratoFrequency()->value() ); + voice()->controlChange( 1, _model->vibratoGain()->value() ); + m_delayRead = m_delayWrite - static_cast( _model->spread()->value() ); +} diff --git a/plugins/stk/voices/moog/moog_processor.h b/plugins/stk/voices/moog/moog_processor.h new file mode 100644 index 000000000..6bbc01ed3 --- /dev/null +++ b/plugins/stk/voices/moog/moog_processor.h @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _MOOG_PROCESSOR_H +#define _MOOG_PROCESSOR_H + +#include "Moog.h" + +#include "stk_processor.h" + +#include "moog_model.h" + +class moogProcessor: public stkProcessor +{ +public: + moogProcessor( sample_rate_t _sample_rate ); + ~moogProcessor( void ); + + void setControls( moogModel * _model ); +}; + +#endif diff --git a/plugins/stk/voices/percflute/Makefile.am b/plugins/stk/voices/percflute/Makefile.am new file mode 100644 index 000000000..bdacf3b80 --- /dev/null +++ b/plugins/stk/voices/percflute/Makefile.am @@ -0,0 +1,46 @@ +AUTOMAKE_OPTIONS = foreign 1.4 + + +INCLUDES = -I@stk_includes@ -I$(top_srcdir)/include -I$(top_srcdir)/src/lib -I. -I$(top_srcdir)/plugins/stk/voices/include + + +AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="percflute" + + +%.moc: ./%.h + $(MOC) -o $@ $< + + +MOC_FILES = ./percflute_model.moc + +BUILT_SOURCES = $(MOC_FILES) ./embedded_resources.h +EMBEDDED_RESOURCES = $(wildcard *png) + +./embedded_resources.h: $(EMBEDDED_RESOURCES) + $(BIN2RES) $(EMBEDDED_RESOURCES) > $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES = libpercflute.la + +libpercflute_la_SOURCES = percflute_model.cpp \ + percflute_model.h \ + percflute_processor.cpp \ + percflute_processor.h \ + percflute_instrument.cpp \ + percflute_instrument.h \ + percflute_instrument_view.cpp \ + percflute_instrument_view.h \ + $(top_srcdir)/plugins/stk/voices/src/stk_model.cpp \ + stk_model.h + + + +libpercflute_la_LDFLAGS = -L@stk_lib@ -lstk -Wl,-export-dynamic + +$(libpercflute_la_SOURCES): ./embedded_resources.h diff --git a/plugins/stk/voices/percflute/artwork.png b/plugins/stk/voices/percflute/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..a0aad9db5b13abee3c1c0aadd1441c9bb232ee2d GIT binary patch literal 71599 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�&h%{5Q6N z@D|?VM~%9=yek_eeEWHn%{uD0J6P++4aBFBv^AZ)Pz>t)v&fd}NYPa4q>==>5!&}B z?H4l2I(+uYl@n&RWrw1ZQU@Y`^g3+#$3ll+#B^k}66nLHKYAuG)o!cu6>Rz9HYR(J ztpx}6{Rr~#&wNor>JasBJQ&LqjJVtz16U~_yOvi}Yyg^T%CAgO)6xK7W)($H&{qQ= zIWuF4-x~pAHhKtQGv6n_=)Mm4XdjW@TrT;>j|tSd2Ux0_gvgv%NN~XXrg%h$PDGjK zRuw7L1_P*w`^TqC?mlt)rY@#XkEl-#Tswgh0?53(zdidsJx)3AN#H31|G4Q;C++b9 zGy1%%mTzmHc&M{gq#cy-cXAGuM46KSAg+g$VG#hJFM8VIPSX}Dj8bxPRSkOq1re|a zV1itCK70#%ee8JA^r#{c8_c~-MZTYIbG{nD9{KxM>!B!qma;PjLr_Z@_A)g1ZiI8p zHu>v`{g=T2QYykdynVx;l*%elzR^Zs{d>~5c$N!T6=@02!4_r7FIo^O-9`ysu9=$Q znn1hR>yRe=9EhQ*04gH^?{dK1bOHBG$<3JtWw4Cg^n=t`tYBLasT7hIpltwRC8T+U z1#p&kNhTH0T6hH`$_HZ6ewci%oD<_9TQdE3gKiCrg=u7astiH6_2UGoYrT)9Mh0$z z?a4APiz@OQiGqFxo;&y*rjm?k)ls6T`42da<_lbL4(Yh{qlMc2lT%I;=zZH7xcB*? z57trRWRYzll;wlpU_$8~mxCOdMD=5;asBo*z%jKe8W2?4Aj$OqB~6mp{lgA!;E1Pr zS3@P{!=_Ied+v%R|Bo;~PWm6^Z0Ta`;J>D?Kf9fZ;A;UV*DlUhG^;QX;&x&$T=oPD zcq`=28?#_Qu&AVpHhSs;2%ozA42rll`E<+bHOpt^Kuqtm0N34Lre_n#~pSG4>OhCc$mUZY|hTk`jK6elQ`CG*BZ;NdGSeczc~jJsRv{y zHnJTHB-*UBEYqo#CTr?oNkQE=OOO6YP%uP~fOz8D6x^!6$=EZ+9Q3$YhJlVD3VDaP zv!*^jAwBgT8v1FQ6ZhfKdx=q5I;bTOXwt5`2Ss)_3$@G3j)49Fl)8bFF~TJ(Dv$RQ zkM`ffua%DW-?S>yRTt9}rPzBmutfELrA*hWm(?yh{3>KXVZcU&Y54EI^QX%(&N6F2 z9;t9%D#&6Pahco!xDGH30Po9C?Yv8;u>ZJdf_tz5E8mwc%M%CCm(#=ZrMu(yW{m5$ z3lhv+_?}+eG9B6h^%O7)dGOBP)0_-_K=~dm=WugW`_u$Xq$y7-_zf<8zP$LK&NGQ| z>+3%If()=kkYEs>+tKgMjlSyx3bx`uK^T$aRu9r>RzMqA*jP4yE@_fm&jHVXgDmAmR zw%+7lyT{0M|7ZSPtM3SESb@SYZr1DU+zCU==yk#dc4N}mO({3fGEAqI>NDDxsO1$+ zuR?COm~<&%C#nLnoGiLEWY00LcSfv@z7Y`-u1ia+eNC7jy8uNwvj2T~<+ttMAOF?T zuAAEw&8C$x2BcXxW80BzWqO=+0esr~T61mGp)w!K^{Bf4ECO3S;w)7 zKrO1DhiNwHcSqT%DzRj&L)H+4$LsUWQRGYT-MA>RK6jzgww!IN-r5XjqE?Ki8+lG7 z;BEc5qq+W`OymAcHku_I1I#JF1_xRN6BASR#%FFbtHdgOT`i*glAXFew^6UPkEzzT zQNDBq5J0yAmKIPOd8U~!NZ!*aU+3dC0NyL$An>?dP@9+({`#iy6v!k`8Tk3%b~N{= zPk;j*ao@!IL7R~}5Y@MDf$(k9KArcUpY>om(5&yK+4RlODd+>L(?`fV7G)w?u9We- z58>%MZ4uoPa)1^)zqo1=EeeFMj>?#1fe;;FEpAlzlNohI18J0WJ|~p^Xi|rXwEm{? z8y0-G=E1@!94*Y?D-wb~(`DXUOR$!6WL3HY^5d`q{M4l2J<*v6=sWz@N-`V;mATntmfV`iQ`Y3!Atv|xvYZHszu>APn~nQ z^(LU3n}G-7OS5P#rNr{eS<3TwgoAMdOUM3{6ZBfmj6K z4fS4KL8iV*e-Hx07=6I~<77G%qDu{=hyf+Ps%qgoHJ>}n@KfdKdE zaftT2y_!;V$n36-Gbpzd+A&i+(Rm7?l(e#2F$C~EwvHXf1Q9?)X>fj8<^1> z^7mMX-eEmhf^7dyGo&}axXbop!%osmZB*rzrhxxQEB#F4Gkj^d@CL_1Qd0ta$DI%ji=ZSzcIN+?16` z&gwol>W{WF$g=PD?&v4WV4^8N2JVvpS-AHe5L|k3F)jt-H9V{pI^S%{EAo|3AeLc2 zCD0j%-hISzWLtIAQdR#X=NQUX5me6eQ@mJ67M^gJLCR9<0Zs>1@++(*T6s`qx+d=L z;IGx$c_5vb`jsuFG2NB5*#Rpp)ysE;F_LeHL*}{;GwPD zpy!$To#METR~YS9>-Od*6>%}JqB@PXejyUEI*@v&$w@g zDyjqIiR~sX8Wz1qUw{Y9<^DKazFKq~1OQu}dnHg4h}V44*4ssq6hR~tITGR7K(^*E z+1g*>Ix{eFC;FO}_U7|&jtTT+MJPGL9`CnRcD%SRJ5I?1v+(Xl(&xSsMmQ~AXnb5~ zS_7k)`FDu8X9)OGS;j6VtWfCdF=YUgo?2qZ`odzUd04T& zpO%>#!5XS4RmULni6k+Ni!m|HA#;W?7gobH@2cW-Zz1Eh$vVrw;l| z<5Ok9(5Cd)$2x&q6~)>1;zu?!%`5@izy(@H^miE>63m05oo&0P1R+3Z{CrkqM}A}3*2wV%lS7gTddjkpf{c@ zTCjIi`2yBvBSMh`i(sy{k6^^=?us1=XI|yXj}5>v2k2pUPmF+nQIONea)RHX}_$kl^1$^?JDUY6hIri&n1EieaZyzj#+u2E7?O!O#JZv4JtW}Pw_ zpJ$%wc_FRgzOt~g1J{Mi$?=s;Rc51AY*|x7M}4RLOc=-m~ooO09HCG_J7Gb^|uk>qhI%G`tJ?c85Sn zklQ6DUE=eO47PTb5yZH=>%kmP*Go}T3KD}N*Dsos)YCJZJQ!{B+tMU zsQKnxL5@d)J;9RA^+>;G2%*^vKdJ%~?5Hz=Qun;2MD<3dtZHZo2E<09;bB>UY6mxC z1VHUnm|ErwZd=if3>J&*+j0kFRb8Tea}tc~gl=Gz`Q3J-J@R*Sb9*qJ@;>Wc-2fdox`RVAXr*V&-w>~?<1~mtqc4cPgi{kW}e=Wgsh5{ zmF>&P+YSC4PO*+LSMb`oaAeF-W`$ku{X&zmo}U019eqH6sj8;NA8?^E6{z!>i{g0t zFD5y5clZ7cN(B{E(<&TRUc3un8dc{0QXuV5kA}@#!UWy_dfb2j$2pgeAsU*$jjv2r zy!Ycj_+EKMMF-M&zWnkZ(ou++P6TZ;Km61zclUOyfmqpFhW2hUxxE)DQE4!jo{gJ- zI9sN6p;w=+vtLL9&ZpyPxFa&2PI1$z(u-N>zT<_U{pGrH>kvrC8P6C4=;C&)c1fM5 z#vMmEN4fJo%~);J1k-)lX>v#upj$ZyBN}=N@_+S)KYVDsS+uxEQ^J(YG$vuzOic9r-Ad$xg*fu{ z)(L6#`NU;wZteb117*1EaBjsF(M@Qud)k07cfwM;g0Wwbn;L%OFKoPw-M$ylKLAS- zP?yx1dq9-1_?Kgs%cv`w?9UO2)v8wPojvJQFx-h+C#awC{T-Lm} z+wcCc8k(AhbQRRs_h3QS8_~X+;Q_N5C~N~0=UEwE zRu+JumGztwan;R+rm?GK-{FLa4rm{$eR`jI{3v|p{WQt?jI&sQ;fvC<0VaRx!Q2u& zb;BHfS7dI&O7w5mm`pRlG<|s2Z5PqR44=&EQ<`fJv0hAa#}nSQ_{G47&nX9ve7N!9 zk?%SEhO(lQU#?UYH*8*RY=AIcmjjx0`#mkv7t>4)u}(b9RLaw$uijSe^eCv^&Cy-- z(XMBb*>K#0a}wrBY4%`qlNqOw9?C*flk9*_8U7Y09PA<{*?qmrz4d#0s`RTp4eYVo zIqzdqf#AZmQ_i2lV6ljiJTmh~Vc|0vVi}d&D0Ut%0HwVi@O$k7Fa>_<2|aCKULqAK z0p6p{+g286Z_qEz2HBc9;R)Y52=^x_lEO1Z9F8^J7)J$A)GeARe92;}PTV1#iyNSB zlC8ILdG{;?O0wN-GQU8u5LM5)xSH{fwWx*?vU9)0!i0CnYT3Byv6Tdagq7mMKXej^ zpEN!Y^-N#^gQ)A#gk&`^r2!$#w}2>}g3jOT6%h+LCq6Si%E(^xYL^z>tDD>Ej*f3* z@U~ts(-2P4K_}y(w~*3XL=YGuWq@3t&FZVXj>mER0LRjlqLh%A!oL_z70T=VcCM2a zAU`3{AhK@rJZrP@)Z}pY`f|Z)*He-VmFb#*&){x8`dk*ZMF>2(#Q`E-eSA0zBXmBf zxG8Vrj{BB`cD%hgy9KyI8b zC&bA7m^)LXp%@Ym8ukFhciTF7{>H9JNvpNG`rmz9`jj^hvDJ74(}UNUMqKiCk6v< z_*To>Gs{W)qjkEF7m=~@I%&s^#oJt z+yy;k3mAB4g?@TU&dtYd`3f8(Ka$7&#p6$3AC}*dl|T>!U^2aSwFJ)A;ao2U>40b- zVAod&JuaqJ1k)Rvrm-$Y|8`7=(k~?e)L$wPuE1G$yC7o}G|b$Dy|OJ3P0Ak(H0z_& z)2}~!Rs?k%{(f{lwRy$|?yC>JvGQhZ)-#hrrof`U>XAb!e!Ns&bs5-IeJ>}VKRBMfP2}O)$=@}abud{rdu+a zq$|T^6}jT$3or&_*tiXU1sLX;sn3lmfM3P~4j-iM{cbzR30U-czdil=wm!RL9gu+I z^L#(H^;h_kb6jTY5TkYV)cIZA)q)>{RC{o*P`;=y58FOO4QJ?ZFK@c`XwOrFL`iM{ zLLgq@B(E1p8;Zg}i@5YSEjTOgQU~>6;rWY(t2dmRsQO9n8ckruDz42R$yWK5=RZ34 z0{R2TzLK)xBza3A@tF`d6j2>GN*Yzi%D{T?Pz!^*J$8`%`+w~7)1)p+#u^q&2A>Eq z-V!$guDhZF*VC#%P9JDOu7gf<8^DnE#qoQJMr~MLf3%^qd*8vv4&YvIQHxft^#dt9 z)Udc5lsaP5ay-V;YyK#1S%DhFlQ&98cK4qTTwrJYoNmOk9wsm)zln5=ss=VTmH5~Q zZ2a7Z)J2^+Y!hy7xy-&X&*$X)_9_)QXMb3|vELFs0XiiSIH2`Eb2>f6&XsGD>)IA2 z1c6su-yWOia!MJ?D=W9gUZ2M7{tjAXXDlxQ0ZU-GJURJoM6x*74or)>@!_2}H=i&m z5PY4B&_Q=;9rwhZfW*9!v|6Hogar$nGI1T0{cR*sI2&Fj5U54JC)c+Xh%9Z_Q>d9r zG^0*^Z-~2*DMQsAfF8&%D!{U!rMQ#tTd#_hL+^_vuaeJzx>SO|UC-f2fhRpZOC3X0 zer6i+NS4_*e^*RDc=jNYP+2Tf-mq-v&j1;%iR>{JC72?N41Ry2@S$zPO|x6uH~c-_ z?1Mw6z82pWx}=Mf!7Y&XfhD|Aat_fIxS2OP_Ijut$>$TQAtC zsy6uT{41-js_Jy3LFS)yjB9G*J=x8J1O`ffaUpB?6F(`u)%}1=r?B4scp|2*{y$}1 zVEAqHdn4R^gn)!7SLd!$D@lkr5P>GGeOpsxKD5aYuo3$%DoO$lfT~rG(?9$^#~Fll zMxOg(yyKnsEqMJ z>)%3R4@+Jgjmnizde75}&k%(SzCWp_=Bb-+LbCTkvNyK4^5%Q;doW;Pc{hrTePT@vt(O}GdTNK_iGAKKMXF`x+ijbgj zf3~mdhKU)vL7BME!2+)TKZEL86V)bjdz3510(H|3-A;yd(r#T2CA!@ z{7%#FG1{+>ZQf4usmQ!>70oOjKR}+)`bbIlZ{ffZAZK5eeG^P-xWwnKLx95^(Nr9C z%DMrfsr;maV)&V%ePOto8(w_l2Mr@z^WS=l%o7SI?GQk0U$0`mgDizKVX_oue1qt4- z8{{tr;#+zKL9N68mj!sbk$`ofhg>=hHN7so>B2^ZrjZ6wVm8X^sKRTx{mafhedKIF zW>1!pABo!4(>H7a?MGAl6 zyZHfev5I5nD-W-2x7`byL3l==QTKzHON5N~zB7K(H)(+iPr)Q{Gr6J>3Gu{=0`Y2L z^LDP66J~J{)SDRUApI=S-B@>fMtGb@ICLxCk=&in4%e#LRAWE)5H6_tPoGy$H%MQ% ze7>k8us=l>Ea7%zCb;;7dMnTfbT>bpNPfGmEJX_z`>=Oi4_GApEiD2Ht=QbLdpDdw zY_Ga0?D3=p)7{2qjO-I#ZO`93mfO(_5(6c=TW#6SsPvq(Na!M9NW3Ror}%;p0Lm2@ zBb-;#Zb|yAj*03R90PObKu{zmBlRzj1c3lq2m0w(u|vCNVoH2Ba&8Qgc);I zh7u0X3wHr#1H{qr}s;)86xhM)a1VN(pwFhAC{%j)ZNm4avZmGF*r@SW(JE$UHNI{#F zd0Z7coRo#0{C<|h!`4UDpL9vxG8(E^&^zqwm*hT*==a=uLsciu&JM%$GH5+mIjH~D z&x+Izs;Mv>mDkdT-)*Y&U`A!q9+;&vjFl_12IZ9^?+k$0IQjV}&blv;1^P`AJ!n3x zW|smW7Q*zO{X7)>L4Bw1*H>(H;;@OwI9gH$PAe-btzfe_zGL@c(}NSI987W{oiaUF z9NzZH&>3?VtDmb7g$FFPW@Q%70xV{E+(Kjtg8}!I>Dd1V3PJV0Q8{7*Ys#Cd)H> zpJ7HJv2?)Ia5%(%w`)7ZHa76|Q%~W!=bz_XcWP=1Yinybdh{rkmzS}yu)s6ON!zXG z#0yMOpxf(VYjYDjJ3AOSt#ks(C`_dbOJ3F2qBoQlIyoof4fUYNgd9y6238=#T`uy5 zR3)GeJW|x5=zs@Z(tyhY66Lh7^mUqWTB|D=&Z~VM30+cFUUC4kFOK?-cf12VSI(nI z%%2ED_onn@y8J4W&t>sNF1TbX6)O%m9HUfgjZUY{)tVp-P-PXGK?D6DK-`G!kVWFU zlR^rGUQ}PDE*lEv{hWmsMqNa7V6_h1%&ZE-bZ9lPY0{*#STyUKN&+-U(3CVj7u>^4 zt&X(8WLbSufG?;(7bI{}OXPXe1CvL6{xGeP8VZc3vre^clE=Oh*20r?oH3>Yn4}4^ zG{a~-LU(Tu8}4H6?Cfw|ztw7Cad8nx*4D6k=n!URW-vWHjaI9LsZIxrOG}uapXXWP z)HnU~Q%_@OcL#%hf1<&Lz*|4v@M)R8gwjE^S*raX{2l+b{CaUoH-16aR!5&gknLW$OwRiZ=bUtIsf9lVeS|4i)D_xakv@B6RsPd`0q z5H9ySmwO-od%n@|Nn`#qo1jQDldX=5E3cGF=LO=0>!>a>WD_1CX2Kx4e`i^SR;vZ6 z6gus;BbQY+8uA>1E{#Fj?_+ys8{hu7Z{v|i9{HZ)5`NwLpoZ3embdCbktVQy{?Gcz+*wb#|N>HUU-0nVR4kH?>Q!U`sKyOxUTK+^AZArD@v z%YLn@&DTNi>l+OFc?7=KUBBFg_227Yb>!f>zLycX-1=F}qb$F#(Yf6F{YQ+IpN{=| zpUF31VHjd%Wd-wdb2ciEL)-l1$X7JNS<^h_t?eyVylgZY_0*K_vk4Q!_b#)U{?~l1 zZa>r$-rs{8!Zl}iQGDs92}T-=*HMxDQ?)`r6*^?iI5Z|LZgi z!XKGMlF_YZ(@oY4Sk8$4qN-S+Q7h$yKJ6rz#ib<(S90T8cv> z9X-nIKJCCBx(I2S^5k7fybDT6+~gG7Ok*|A1Fey}s!kM!TsHH=e5xYUEW)}B%Ti|! z5G8Qauh&!MhVpP*8F9bwlylkGxO%hl4KfRWsQTXo`g!A+YNuw)mjufB`edu|M_Vs02W5uBI|h#j-*aMyy;zv{3?-i0A;P zkxnHopVmkO6DqY(>tUAXT*J56K*62$7`wU9Cp4V0i>YC53G<2?)Je_K^iYOYDfInVi4j{Ky&L!P+~Jt+i2FC3&UIb#e0 z9eEerIF!1Uo32!as_3ovH^%(nWHwL$6Vg)`H8eNtve>@KDf^u7@mAOR|^0m)rl!7%pl7f`N)wgZu zQQ%ZfC`=GsFO2LV_VY^y;_NfG2BP9{r*PWub{b~wrHi7p@9FBSjJ&!<(kN%LkUZqj zYxcJjI0U9>$RG>t*CU9iBd*bGa#%;8nQ}AFidIdAA?`j=fQ_-Us%N~JVn6J)XcuC4 z+U;6m+J&2;n~_Zyhr(#`dZnjLPocDN`)z@r$wN(sLU<#c5;p@}GBPc=m6SYxnr2*G z$@7fKLCi~#k~Q6lRmWaC3Z0s4%26O)R;qXV6i^>sr@RI&?kIHU zk@l=8a{jliYYS&^OfB_I7?P088KG#EX2*q|9s&Ixt+6z9lqkLZmOPWaVEl?wH%gnR z6Hz+Fn$j4+0C2MzsKZjHj$@rBG+Co^VV7j?wQw&)O(_&M1ddJQlLtt_gZiE;Qz0)h zp1?x2PQP?QEv@k8f79zysg6d~(%?en_}W6&(ZA~hSYs%{OS6b0Pez95sTGIAqMrJ~>a>Q* zCG^~Qez}y0qz%cb1(%FiUe%P?%41#{k0MO1%#?HYdwmYi$4-8n)Rk@ z@-8zb-E*ZqQC`$aXM@O2N^9EzsTEgMa%bq2huN$wFJpRU2IHYEXA5WOY~<%It90x* zvd*-5rPsiadF&suDAHMO%fgZjs1!6g!cBe&Rp5HotproBp6aIrI3o4d{WsBj-n8)W|LD5YTmJ(Wy+h>VMi2IF7&3T!>`{;r4Tp|FdPl9 zn6=QM7eXR-+y+Z0wSxkD1smgxE{$C(ox!O*O*$72@N=a@?Uy&R+XrIOx+8O^LdAB>~JKO9=wVoBkr6K>!hY?otG30Me;yvQa7P|)ZnBJYr1 zoo^T^DuK(7sjZs!s`A7=gD^xp&=V7I06QK@O3565%ANf=a>l8{ngdz@JThBpi_tjp zPCcF1?ibbabJw+(I&vD*jS1{l$~tFnytf_>hun}sh#iw-l7t5)(t-j=TM@~H1p7HRu@8>IN(yk$c238ma7T6+TL7G15HkMdbl>v;b zU_3EJqJ$EU+zJ%B1LF)%p66~ZnmurtF%WrfHNA=gRHe8Q)?x)cEN|L)jYhN<$GNb& za!#Tsj6%+{wN^|ZnG`rIYOORH7wtOqCMqg4Kdmewq6oru))B)E!uHn7sAiB+nqb$S zGp*J3#utps{r~K}%Z@Htb{@9&EiV6`d9Kw}&2EB{C~;^(uOYvIHJ1T-AR3SX8S>bg zNg|;cA3!f)J%TmyT$T)ihDEbYc6HUcWafW~h<)*3t#9oW|0zlo4XcxdETBcUH#w>7 zNGb|a+;?*ZC9p72>SB(Hh0`k0RyVal+QcK>87e7u;LGL0Cz}9J)*!;3JlRA`X#|xZ z)Zr$e5FTsK;aY6oIyQ`97QWEl#{_Yk{D~k;~ppbwyjLZl~Ojuz&T{w+Bdaax`)23U!E>7 zHiR)Cko#diP_0Gz?DnvNqc5t3Amhet^3j`_gd{`rUDst#iI(d@&#gWWviYG+b-pVV zqfP=gZA0*9Nb5zbh>b}{c(u~^GD^c{8e^dEzWa`C-+v|DnEg#mx9x7hS|Q*|Qo!KrksH-XNy8!~mQwNcaGF2s9Zxx8E(crkrhH0yZlS zZmiB2H!778`Dp@_C6l}L>Ep*|b1fkinA0+P1Y=p@<@c7)~1Vv`=NySsABgh`eY*{yS)Gu5Q3uxn#oSH%-7a}r*1J_KsA zsg#l_-bn(=@$N|DFwj+Iv*R?;IE`w;*9^%Y4-%%2P0G%JSE{O*82kyeu9@1h($nK3 zk2q4?DS@m`8~q((dYlP3z~+FkfMH0wTiTbThygxivgk8wW0w}}h#2FfA<;05noHf7 zWZua-a!LoWPrCC#%O#K&;JJ?STS3WObgYCh29;#SsD=>EXs;RPh;%0=iuPppraD5| zt^FDmI-gIP=uyr1XB4wUJ7dR~4dvb}=Ks_hg%GKfOye-nDuN~O0Py+9{r28dUKVPu zqvt_>HY~60wM5MAL!dCvyK8}q5u~T~TA&}twV=(wwV=f*#+?V1%_^RHA$TJ1Y4F2N z?|xgU9PjS*w5>9cfOD<_&G7Yu*@Jv8?6yG}W>9mJAja;WxZvK%f1l51o}}cgmd&v8 z?kqrV)lhXqhz9lDG*2BYZ;i%jqT}(72{U{OkS1KBG-;BhX8GEid>Kq3t+4>?kVY{p zWHhw))4kT6dE_t*bU4hKOw5)R^UR(e^;S4rOfSVW=Xu z%pvwo31*o{d+{Og6bdtMneBJGb*|P>l?~&loQP`7EtYkqhtCgva~0R$^Z88i<-QB^g+tF{0t+Kn>G^!yBk@&S26Cv!qr%gZ`ywKzvEyj)KdbyAj z!+q?&x)23mWL@_r90g&Hi9Ip3#^!{DH&cKt06i`J5>7r?_?Ty7W5CG*k_8iO9FYK< zE;^;)q8i9sHuTL(d1H`COLQ?1q1Gd#^wbry)ql#|TTnbvKk)~bM|!Y+i_C4BpFfXJrq zh-i|mKgBJOD+q1B;0Wuw(&2cd`@1`Oe0oyzk<$~W<;3s4`;L3`hX=Zx&pn29xzeZ4 zpLHS4X3U0{2!Vr6X63CmLDF;Q`qt7*%Tjf>1#J&#C^YW==H#xT7^*_QthLZkI;|7H zOIw?k=e1PT8`n~IAYsm#`2dDn43h_(lsh{k`EPtp8j?9}J7`i)S*I0A`gHYyld2&~ z{<+2-OXV>LdV9HCsFX}8^2;%c=p>mJxYVj8b~m?RZ!wbmyKP%3wX`Fnkc@#)ePC95 ztE;vMIeO?KjJpB$N6vAeUrH2p&g`^3L6Bk;qQ`T&7K9b5<4q|_vjq==ooBcj089}{tqf)d>scJiZI36kf>^FWxZGMh-cT{Vm`}=$P$xptfckkXYc|}fJSl*zg zfdeMQ34`>3R$6IC4i#n!9w%TB5lp2;zyR>i2??_cHLHe!4+{FMskh;At;PM zOtJGz%zvSt^1+Ln2sGwiPk>wHlSPcZ%w|IX)2!>nv0%@qlU7ARX4X|HuT?7%xPw;F z6BK2CIoj5&cEw13S*5K)jylQW(THZlNF&)u$PtyAl^li9s5N;&R8a_?X_Tgwuo6rk zJk9ge8D+-x1}6~!HiS|>hij>|XhphYuHLG=NN6j%zP}j!h<5X80ED$xs?x99q*dn} zCj~80vvppN{JpB{>U=thK&tIbTAN`_B1s7TfQ5VhpydpoTy@8S zV#O9|Ndmy%=kO+DV`hW0cgGq+$aKvk{8mw7|~+QN>||bfXl5Ie^Q)8yw0D>qDSz zS?N+P3Ow1C!kR}GDc73}?Q1PmOY5;c@;x9-pbbO0YRwgKg5vk18@c8%3^Yws_asB* z0E(?4omiPMD9}6(;>|5QqifOJH&ISvw2P4YVWCfPto99 zmeHvE1F0&YEObP4KA%(riXVqT z`tTm#bUvTeuMWnMU@ie1V;U#R1}&A+#tWmItF@3PqIFri;|myBV!!}I8NZ){L#=QO zn3m{vIdy1tAPzZ5dxM>JkbV?x0a8Fx>dCdsvXGPBoD)Q|jGl5IErmdVz{4&*(<_NV zVhA)J4l0rvz*xh^C7UN4fb2_x7mdhKsFl_YPN*!{Ns;lAW}=v}sSYBG^uocoF3YpI z7V8ht-~+z3>Ql15uwqxbLM%ZXoQ zGwC$h36-&|zg8s9HHr4%|nJ<%j=xj`1M zqt35Y)ez?9I6;l~duvT+;Fyi47->VFQY%gKtR*ynm33V-K6n}@9hqEZW{X{nj72nF znivzMn0Cpg-os12?8q2IEVU%r<*}P*@vRGy7tSIh9atS->!R{PEV5jRP8v2tA?14) zh56@o!^GF3jllgK#<4TtoTGW3D?(G62#|1Tf8{r)mWtiZ~~B&OuaXPx8#Hfrrgf7zHE4=2xXUg~?^Dl^z}*$Oj(p zpB++Gs&MhWLL|7gFV%~^1>SIn-Hj8DzVHU*aZ+B{aQQ74ibw#_Iet~UX7oY92O7sg z&`wfO2AoZ;1{vgrT1ywP$VtvSF~*XsZa~%r){doM^Z-CEFT61i!$7%Zec+>jW&np}91l%hU{7r?SCLh-Fqb_X?VfO2b`Mv=;jLQRYeokSLm!$9LODlJ<3?q_l> z&amZ>MjBDpD^bO%?gJG?HSV%x|I8OM>5_!f{%5%4Tm(Ka~80QWEs zJJXd#DqVFSHeLg&YnOk2{`5f0y6{G~ZFD-F=yJJIJP7v}r7sNcU%z=n-+c4UPR55F z1urT5$hB+&f({E@m_kZPiW5zR7a>qeUf5NGj!qzOnWtGJeM;>>nWX_j6@*h)ZGMHd zM^N>ESyn4&m&?4g38|nPNx0ohS8mKNt!G*hNg|JjxTw(?=R!jS zy*FxQS6ij!y6jY+v+px-P@^{}G9j1&6*%%teJ7HV-{pF_XeD=*mIrMJwMK8=zNN!q zrZl7;qC!ODG*U##>g0u0Fl=4vd^&YoX9eAx$|_6YMLrAzk27F?V7$Sq(L-DCWRMXQ z7Je0jdYsbd%Y{CD{G>0K{oZV5qhR4hqvx$s5?AqxS3a`vor4eLliOuk*IMZ$Bfl?5 z6sl5+>S$v9-z-A!h{3Euwy22BqJ=RyChy% zXv}jdG^9l9w$iqC6&K1M*h<;cjXCeD?2gv_u&R59Q{@|9Cr)s9mGKOdEt}Gi)GMqQ zF#tH%LmEse8Rezzy`7i-aU2Hn$79zwTiagKO4!Y8ls2Q7zRMZA>?kB6w$XMJeA=nV ztlNuxAZLar!Vv~yB23kb{>s6m9=&w zi?ZYA?_PFPy@u>`>v{}nX)$)*QDn0z&1#tGjB2r&%?&U1wrv6m^P#yci}ABt70AX0 zpKGT3`IWjd9mk_g3pSb$2Z}L93ZnG|>jtMf&~|(!#)d2=zlmaWNJ^%^2<7M(7m7564Z07yAHLPNSZytrBhR z3rp%Oo^DpJJ)}hAH0~CcMUu6TwC*J`n$*xlQ`UiA8E-0+oHJ)$%ku(O0!JQX-+AY? z4X~mhY*JthF6*KWyeY+gBFjclmaK^q{~GYo^y$p2J*@PGZ+l5gm+Xu(zq zpsdi`ODT-GeKGW6B(H!=5siojz?rq}Zc>(S@=UCCl*PMp&g?z|#isl>)(hBkC1)zK z7M>m-``5Hahk2%P9BGk_71+?>aG(fwn?m*S(ycNUi$JT5X1x)!;GinYh{VM&E?i}d z>(+JI0WW=?$nS&qj)q}WG+twfOdi30CATuT-P8mcG7qqgp1quO>GJmUSX1q8VZgsws4watw6lF=v>lhC@Xi`rk8 zTvX;e%S(!hjK-Up!&c+BjFQu)`+WTLi4KPYU9VR)hWY&Pz!YHqMn~7nwaY^V!G_Cc zHw3^9>ZTK=R+fF0Z76>6buf(yEHZWYTQ zPuF~y{)Jm80S?^oUJkmU$8Mp%vyp&3{ z7Ul3GR@h0fAO6k>gUp$%9w)#NeD46*h7jo8ySLBgT1v^QrmBjSq)vH$&LZo-^-tj5;^rWV8I`Sf-Wmzc+Qk_fIQxWqz*22y@b6ys<0b+(w z(vSj>Q(%UVU;{PkuTA;y*aWP88apL`j@~c#IX3Ug(~fJeUfANfHjaZ@O_$m&o@~#Q z5(h=1JP#q#{WR(4LMerpb{a?76q=3~Sd^@A57miC>6-b2VNc?8!GR!19kYN|Y?hz}1B)Tq(p(-SSytDvk+ zA_uLta(s`9Il85kCU(fFha72)7KUMvJZdK|_a-F$dIMrG3VPeOsIttO;p0Z7WDE=I zjX{4^^%QncJ^@x8y)fsvr&yBFIcuqIY=5S4?0vH=pk3)F)di4V{Jk|q3?}NAqmQCa z6kxd=O?l>Tm|@nR9h;%e`&!p^2T-}2*elo(XQ>jr^K_7w0MFW1J8(|jg+!S2k<0a} zCzgV>d1C-G1b&&G$+du=p_39}K0-VKu?XKwM}vvQviOMio@xv<4x?0pMRoM}S|4EW z=qUL?pSQ(+yzgI+`8cAg5dz|&&k&vZG|#%JAnh0}U`kACyGZH2HKOzRM3?iKU0~7J zZ|h3iw$kZ*rtiQ1PRBMlZP8;Th)oQWO+hLtCtw$}O0N;DZ?-{*)6glaPB(*fpN#3c z%@A002z;of;?}`^VpGH$^L4i1jXU3Jyu4MBa7JL& z$xSE*pI&IEbK|VZO z+?SLRUCtM&(xNVybzQYwg?@nVS&_*GFC@&B@lc8wETkc+_8%5bL`@7u84*v;(bLn@ zv$>Y4Q;Z^1@26f7!RAX0G!gj(GYOb#;ziUdZR-FaXs8$+p3fK6&nMB}TO{B0@L-)_ z?TskB`p2V9U_ZS?DNRayMxXxa(+a?#C#h-e(fow9F~o_H9#g>%=)cb6VGlCBFI zL15}pV5ucx3ym7Rd;9L$T#IvFrxl%RA9S3Faab}gMId!$$vMOS-?bH?PmxyP=z|3Z zdNN+h;5{|(X^?j!Z&`I7sGc!?^hjA1V2^=7QbCxLgB2CeZ~pw}G|vb1rh~fj?s(+b z3Q24n>3B&DQe z7Cbu}i(H$m3nv_eAt^wcH@-d(|8XP5M3uO18~w>I{^Z$Qi!(k50Ld^xu_LT4Z?vwP zaid}N8q6L!zPRY&(?dcV^U6ciu^F$OCP5sCi{X+_nry+P9%UPd9 zSDh&OV2jqe4AwdJM|6(j=g*(HNy?{y0fh7N{4yY1&@;wr#LTOM&6q| zAnqX>rN~M-qP>fUyD6coIIxsb=ql*86|`W-vzlQw$|Ev>9NQ{$esxExOF?Pek<+%; zo*EOot7x~`t@^??*)iEzvhHw$TMj=$3#^(6ScWRx3ith`I_>>~*md=AM4^kys8C;g zC4V?wP`GYz5OAt4%c8z@>NTFZG;UHI=;l}%b3mHtG|y_hG0z7%Rh`B+TQwleLe$pj z8C;9SWDsSAHHdMUbB+$fKzB!u|IQMj<(wm$NbR~%r9ruf%AgAI3I_!)|GF*WdDxWV zYFUl7RgK>Q@OHUy;w(5JV9!Ce&6OQ*6ph5^E(8j&oeDv<8}X~JzM|kgef;o|HMnAw zk8uV@V{7Rs^N^DE-1Z-v24wTAHL{kO4bE}M#r zYzwHLXDrDP=r{~XfNbzbB+aHZS{9z3jMK5?fY@Cx9#4 zHdrlrN4TAyz(E5cLnn?%?`u;@j1h=_-P6;Pa-@5HSylTcl$1!%1ZDx^!)8)ZlUO~$ zj~<4T%d#+iIChReiu)HF{S#t_0L#Ez?sl4><2Dmp%&|XFdrwtCp$9ca3!2)BWL#PF z$ho&8JOud>5j~ww{j+bAPqy5XVQQsPy>4)=HJXI&^<1unUz};DS-=EF-D5@PU|&wW ztjoGE1y$AwVzAr|9hwYCe3aY-Z)WXa-yy7mpKBLFrC4_d9cJz}O%}ha6;8pQub5y= z9A=S&2Z{n$+qTj9bfRy+`xO<@siS!EmIpcq3o{gA#X~fE?I2KYO*RZJEHQ=kzbg1msD4Q(()@R?zLf|;df5R1($r@ZSwM*9m*pUi0F&lAg8HT%4 z#*mPL+>hh&s6VF}!%w)TT3Tl^(ZxtMMR3MhsISlAT5un&C3Xx^U6Yn&QHiKkRsvkc zMt(RPc9nppvq)eEY{8hV*f|_7Lu5<9?Jx{&N$D z+A@tJRZ(kV6GN4HIPBxGFtSFk&!;?ZwDE8}YME_`4W;sqS8Ac{v`I21kAbe&WtReq z(^5$;Mxk>^2bo!BYOR~xgAU8BuGg2nsHb{Y@&FxGR9+;ZV9x2>(0Qs3Uf8}*1U&gqF5<%^I)O`(yQd$8&#q=pC=+umTb0E2ucz(#!2}o%0xA5m2bgrWu2z(G5-;f>+WIU9 zREU9+52|!?hl6~5P(D6<^RkIf-dR@5HD+0Bs}Y_dZPxbv@7}$o!{Ml#5^UJ-?v51a zX;R(zC?m3In&{R2E4n+fK71Rq&h{1|Z{Qb(&9h~0U6(64azZrWUI}CdWM0E7J4wHR zogL#jT)Yi0;3Um%`?Q)C0$*?Koxs4uW`Pz1sV+d#0R{$m*EybZTB#ruRn2JEyZNNw zD*zj3p_l8Gp0EL7-l5UoIE=_~{d^ zG8RuUDL&%JQQUH-k~5voXZ@mWUA4EdeKxY0aZ%dG1W(>2^^=ZrQ(A3Au2M<^g|VC8 z1K2|)U`uS<+uugSV%%X%DVz{wa?eOgY&8Lt4F#^AeS^yS0PN%dQv%#%EK2OWc5yZn z;x`Nf&GSL|(r6{BA>hE$m(km*e|KFLwI42}s!#zGV<7Qh)S(rzQ-FRSsxhr}s(!N^ zcx&p3auMJna12;mBWf5RAIePlp8=p^cB7*h2i^F7^{elm&9%T-#OmQKmmcddrGcGY zTa#$%rpA>`UUu+ISRfNRh9x+T`VFdCMCnR5)55UJkkc^B4 zt;?#RAJ|+!eE2|5rxV3?lcv%PulRhqaCVlQkhYu%A&OGY>AxW{3?V2(hZmny6;c&*xpgYymHX(BbPLfxVr@XGy=r^^W62rDW6N^j;C@{UC8mL9Q8*wadCN z%8$*dRQ>s#DHqg1w~KYWmS>mCMIWHu*dTyllgNV_CpKlwxg7%w2)$Kn*~QVl;5#sh zjSB>mX_|H>iNTtA8nQ*nnN|US&;*8w?4^E5H|ET}ubj016z*+e@ra_c56z3X)myo4)-$)wn-Ld{fMy>*17wU6YA zanr$OQjF#Vn~kMC*J2W2zz(dHVv~$8AkVymuvBuIL=#O;M?#y}G3C4wIimANN{!30#vwl|FdfPDY(a4v|cTZ4B)pc-4)f2V|cMw z5j6C%OfTDq?s+d8T#^iSj5O`$Sqw+vd_M0?44TYogOs^w$zbFGu6mVCeG>2a7^2RC zouu7F<689Vz835I*N8`Q&N)g_VS)^`ZYz1`=~4Li)~bp%5FMPhx%S?u-8{rO5HVR! zh@=W5AF$b^7n1?#<*>+grD{0&0M3b;-d7(2y?*_grfH&eU1^&5J}lRTj>jWKZ-NT@ z0_0h4@Ik%boO6`dtg0iNW*P@9y}lhgz&00jKwH9KG=lkcmBmZqqPoa6AynSF$`*sx z0%(I3lZM;1PRPN7vb_z;HM}5}q+?4fZ(c%M`rDBaz7Hz4CJP3vCyeB*T=rH{OGXKY zX+j90OMIn-kH*_?x8oZQ_NeKjA_DS((wsP>TV676j5Z*1jA+Y<1rb?FV5KPwd(HO3 zEd3NW)6y-tP;tF__3GJNixvCa3RLXZfXlE4**XrT?z7SsdLz446kaOBBxy0#*gtQ= zb-=-Zcf?Yg?V42|MFSk86)mOE=($z+_~C;pCSj!V@#9DO_~{eJCOhZo>G4rR=GSGR zM@ee2r%j9;B%ilTi>qEZXxRXp@trCh3V0`&Wga}N|!7*$2tFr1lV7ejdl2OKI!Y-)C)LG`7W zhMXwNvQk+VRhR+gMwsUD8C}b++KEx;+`LJTGS)3Sr=F8k7}nm&a^x+m6Fzs~hUA>- zd^&YSr>NpkQCOo2R6W>;K#IY=!TQX`p8UEjI?DFJ)7M{rL$6=G>IuUV=<(*wYl`zU zlMkLI$!)?eHx7folrXJRu5}39V>{Y`4LN5a6F3E%Qc8+CV^bhw$AeSXmU*o;nx>J# zw~}R^=``gs1g7RX?`gSSDGdYnZ(RRS0ew*DtVpk{LMzQ%53cJ%1v!;RrW^tgTh(Bq zn@j?1A#w^17PCVi4u>7T8fZNFOJ~G9c6M%Y1I_PB15MMYKg;_-Q5bjLv3!!vJessA zgNz>eWmuL~gZhwKijvr?pI-Mb<4Fcl8j`Zl)D$5m#cGfMdJrd4>u4yHSM zmn@?DLoc{J*}2pUY71Nn2TWQTFvf#cAOchv`elHE(0!*EDNGa1^Q^s|&CpxjYAl}8 zuIxn=6pK_m*);>4BZNT9x@wz+@zC{peKywuSu0)?xB;n1$~YTwifg31yJPp8zcFMi zrI1glI zUTTCZ;QGdK)Ss=9O`$IW%w4(UU$k`XW{I64h)olHycZW#+*c=`WBCBhjO)Pjw&t55 zMmoy9!X~~6$b``)o=NbYT8tFbo}ekc^f_G1^?Id?jFYR$;;Z6Qh$;=`yv1xljm7oZ z4Z^T8Rx6aVHLyYw9?OVFLyOT)~-}m$7 zLd*3^(W-i|1LkexWJW;&v&oIN@=81Q(ic{CrD~XSc6_FOZ_*>NyJ^+R06by)@YNJR zOa#C_LJwyXQvhb+^RkI}MhP9%$Gr+G&-dA@1A8eda&Mhrb}6ce=N&llgI!;umT1~X z%C3u&&?55K{crCPeh-j@?7g*l;AHHu?Z#?1IyEUQUGW6^>~dXpZl$)`*u)s)Y{VpL zAYyu7yjX)!k#p&q{@1TxKbvd0zrXL~88g#H6#!6fSr>DWN?Pi-`=fyLgO!o{TcuDt6X&r4S>XPA6UDIb>tN zW0E^$9u3N(f>Tlk+v{P#a8w#1PHeo;%+zzDSFSr=vyI-_mEahqmBM2i?>ZOVKP-4N-0`jYXDA;2%n}wBMH>htxRFl;+l1#g?=XYeSWV zejihSTS5p>OQt}wjFqi(oAG-KyB*%*57vkg|D&6@Wo{KXqQ}la5#a+rI-7BBt*&B- zG>n5W2w-*-CKr6FS1Ki|*(P3oFy*vzDutZ5l6bL|?tFpLLk!UCDMx@Ef)L~DoTuv* z#GR;Id!Wy#?hr_zfse-dmkCH+t>sJ<7o@W(B{gw)`}*~>xfUE)wk^cxSSl(iD9dt# zrP#VIS_R^BQI+;;EJ=vOCgu@c#kR?e9;bUXA}Q}ZoyGSaCp0qN$sU50c7~FTh)(A- zy?Omw^Vyt3^6x+?CW@!?nR3qb`1Gim(AUeA&ZiU2!YfC~TS`$o8P^VRP1C;q+Xt z1@{J{T;u@Qid5&^qK^Ox3~SgjE;nO1IYeGTspn!tuZ&&lh+4oo`pJ^zR{Y{G24#V zV@Fyjg@<7f5la7>({<@7D9Cv?L<#lR#wI2(Uz2aVqt+ZX87o-=$Rp=jp%$nYmBk?o>qh1oKB}_ zb1h&t0{^gF54_AVCStinputpfyS0sWNvz928Uu05R;(NwO_HM8+qTwtbQ}cl2_aDQ zk%oED&%D3C-@jX#*U7BbW=%syaX*iTgPKRCSm}5;&^*r+opW?J9N08M77}8UkH@2q zjx0addq-Zl-%s%YhSQd zkYh94c0iAg&fLz-&0P6HZ~HrR;M7b`V0K z(i(YV4BB(m=4W#)sx~tk@SW03B)(XuHgAuoA6r*bZsNvNs`|a{JPndL`RsZt9azb2CW*2EKVzpgld&)#>9ryg{gbh#oZcnj>LE*D=7?dQLQzq)Tox8 zv39_ zvL0u4Mr;Wtw$HiUQLQyEwCQ#Ox{dMKxq4`|;q}H=ggmHf%1dACHNemI(-`eRZC8vn zGp--DQr70m(jj|QLpx$otxdh>p&{o=rt7Y;unQIjIgRQ~&QUfaA>13zt8e6sL=|mq zr#`$~FFJ9+MhJOs5Fa*Vyz$FK9UYgK3+yWhdc60XdTQ*Tuz1xAKxX`^)+*)MTuYZN z_ll~ik?5e6-yi}ns4gx4oXF8I4;tcVt4ceD1x>pNX$b#-=DnFdy9<}R0?}A^$>2%0 zeX|uNa{U}R#n3_sG{i_B7x9c^m(HLz&tB|gqam}n#tX|kPt!ChJ1NKxY!fTzdDhd+ z=7S;4Qj=EA4Y9i^gbVhBwjdekl(y8y&48I@N>N5v$pBVfskl}mYc=L-K`b~$N`sb3 zjrxYxEc$Es@wSDqS!0N{ViSW-pzx0U!f#c0)`Zg4MdHnAaENJN;Fyyh-56w4s9&(8q15oSPni0pg&tO7dTYC z1yCMKv@MLgTX2Wq?(Po3gS)#EJh;2Ny9E#K?(P;mxI6rF?z!*%?^Jb7eN{8l(=*@h z?%lihTIeH@xwU!See{sRvfV4_p zfzyOU4PLZ8HpdjmNki)xq_W#NRs6Cv3IA5FK#!GfFA_dj9*GJG%hZRlZF^*5eNSWW0i^YE^8rAL+I$q*gL3ZKMzRYCJAYm0HyU$F-QE@lRImU~r~WeS zdrAX z0FpeR&vt2p0jhYfcSt)KKGqgo&vvVuA9?4ME$bOt9z8()KLRZ(^@o8H%@n+J2YrXl1M+- zOdJ#@=g;eq4?h8Xz4~RKd?>G4GfPC+Z+8{1;dc6Z7a3w(Xkz&?5Btycc#Ka$z!$i< zOwFp-3qY)U<&_R<^i;U~iu^-|}M4seX!)r}=KY^78&U;4*iZC1D zWP;VI)BY_r=cS&?^T6SxhP2)|pvSkY{r}sjTtPua{9z?`=2~Be4O*f@P5!-~idqE$^P43Xb~fm&5@$UoGk=6-NESmy znSPlHciq}WInhqFIF3?{udWs||Du?xVHR^zQc!8N^P0QIn=0j0SoVFlRAV58F#$ZrL;BS!QD-xocZ&F$GWmx1mPy3DpS7#j6waTx z-aB!yd*>gyQ+jw^BYG+euYzP=)hRNT*uG3&i1=?rV|w8JU?0~bdhqq!2g?8dzv8j} z?{DDfd$wxr?(Y6?bAY4Z!&%e#!A(Nv!@tFNT92$C^{naNLge+Z)@J*ki!Jg0{jmRA z*VgNQE(X@Vqk3NdQ(o)LYlE@>b1}uye=a5>MEXzFr}r=aZ#%}degEIOlC}Qx5}(>p z|GC)_`#-0f{`U=l2LdmlHTq29b^dP|&gqnx>NKhSx4f@3EDt69=hkmWx3Ujw|CU&O zFI%aT|9h`wZYNgXe@<$q08i+aS+!1)0wak-W0xt`VbM*k6vKC<&gku98K68}UMib4 zOl#a!x{0e3T5DE&zc`lyBAQV6!DpSJI_{b&z^KosvQ70PKg~|wbf%fTzVp{+lEYj9 zB31hjy1&zN;XC3L*s7s>BWefr3=w3rFZyq($ciQAy1J;yI_hFJ3tHDoAc2#F zopiWSF9A{KJcZzdj)&CsDbJ>wqAYj~oh~Jh8aHSa)rS zE5W1B@V^cF1=A>)h>n^M?Jxp)kF_FApWHlOGRAWnZ@yP}<-XJdmSt5i^{QU;bA{wo zmMRgf@?PC}64?Ec8V|2{zg)x_D$=nP-?XSMN*cc`kmF~Jn3_MST2h|qu#vGnzSw#G19E0{G$A61RZieFr+z zegPQbxP3F9Pg0zv9M5!%L}tqP&j(3=Ugvs4=P8O)3CN1zgkaE*JP3`@x&n!$}fZo2E9}jnQWf1mg>>7#Vg5 zGc`Rc7A;pdvY@7`S^geMcD>Y`kY${la|ktmc& z4mYkHeU#_`iwbyv<$#oF@V04;lq~mlm zZRhjfS_4E`m3ZAk*OoGHtA`R+d&R+_qxGG!_7;$#uX8CuxpKso3e7 zs$k8n79TN;B*c5w!4Oj)FYZ?;`$NkM#x}Zo%4;QgwrPW))lffcELek(A{|L0xE5U) zjw-luwCuA(t8kem;_H;(K^9b}3sy(NE5~^jjUX65MQvmj8?9qwV}V4m416Q`EMw+o zvg~v8=)J}Ung+%#yDSQdcVyj6S8fT~h^AoCk!_H^${?}=@j6x8$nP6dXZfDi5}nwH zK3M1lFiok-7`?x6Rza6|VR_4#dT+&Y?DJC5P3)_r8r95@TtD2E1R2nF$OrNoyPX9p zx3TIAy#izz?-Q>{hdJs&#D)LU9a4p!*xf>=Tz0LtZ?3nuhrA{~enwgb$zpoAIFi+1#>~8V3 zmfY^SFZl;`qZF>vK-Dy?XVho+=x9t3+GPjnh8tb*95iFTkF?FDsjQZ4$?oM*s}~G0 z99uSC$c}r5Ih|9~=F52RBD7QE6|n>TJeM*`58O{|LX#`qm7X9-$6!ndgkk)rQUO3!3d1R+@^-d&&2nXc zY3i-%Fb{Y-9ZtU@|LiUj`BeQC;1~pn3O(bp#IHInE1AFwfDU3ogIB;r{T8ml4UPAA zS|xUf-uC&-wyRoM!D3etPB(CxYIZHYJrNU?ap}}^P3>rUt2?~jlq0PWiT>iGN?eh$ z#=1~E0ICTs*v~R%N1#%r2!WTBO}6%I*(6Q>D>)@~@NYCd1^V;x6=lO7t~DX5Jk~RV z=$VGpa_sw5x8i)eV=5n^+{&}mow=u98Ebs}Bqwlt|_1*5=0GCcSsrv~A9T^7EQcrhLEry==q(3s>Ht9Br>mBQ55lQg8>QgH@=q@^G;SUf^P*1}GyCR3m=dMo2 z=8a}nO{wqM+n>)2`n=$3<`p&P{wc2Kk3-nsK?snY?AiK8_h-2A#?Sa}VU1=~a*PA& zaiwpJFlp-f_Ot!-S1=v9@l?y9sJ|-6a24JdA)s}{yDunR6)?k674yPF?(!0+PQ%O6 z;yoC$`NuT}H=xHX+v@@0-CjTKTiAAwiBQc!N)9@RQ$lap_V_g=CM1$qJq^Jgg9Kw+ zypX^1b`J^=M%63?nUFek*v8+4N((ui6rOPkkLTzy+ZJW&lvG5YX~Kv>qG&=q^B{~` zf{C}Md_=?k#>_U<1e*QQRQvWtA46tnu_=ApV&FZIJt;_En+sx--z!<^-bKh1Y)HvD zi&~EpeG3FVsK@kx>X>@k8yc~tWk0#*x3+8Qii5ylQPu%X{)7lQuGG7_(y84-BxLD9S59DRF1NJOwty&QTg6O^2 z%?b0WJH*EOA8cwM(ed);u--#Cc@glg!1`-=$x5f)q0FufIiVnqJu?r?-$7@ldL1o7 z<3}$;t>(5N1U0^zzUd+eQykXnbt>2NqL9(cZsYH*FWXZO2%Xlm_}Hx{o~a^*tdV5g1tG8$7^vTHY}vVIjT~%%AfhEWRklyh_HUl zOWC#R>BV;7fI5qC*XYmB_dyK9wYwrALc35p4B1xC*3-lJ4qXa*e-jfU67bFg_BjB& zj)2dL*!IUwste{)vN&RX*fU8+`J(goRwD`+;%!wa5$~dlIvR=<{I4^X-;EHDxTaA` zD%%>ry&)}()eNu90~?~ze#{BA?lT%$FyoFZ52=vhmO6%lYcP016X0MsBE$W}k@1df z)Q-5YeY-qA^YBx4LE?|3!=Jn@s^VwFKQ(*0=L%18RjOsv4lvuB41t9ep<@pgQ`px2 zu5SQtLEjji_m3HzA~9xl9?3u9wfMe{R+(CipHQMGBje(Xf=ba*$XX9~e^!%>+Kzif z`mZVu5wU1e7sF5uKl|@-UHsHj-C#+)Y!H%##Sih<+w4}>F3(XA5iE=Cyw^2194u2_ z(xPn$o=F`&0X){U2X2#xr23&(0f-8gnBFoQ&VGymbP~7y@~^HTGNCScybZ$aM)nU> zt;b~|RX)k=r{8G`f}l4xH%DFjaH-S08BsX05}am^;vM55hjH+vBwhLC(JiOi*;~%G zp=tNZijBWSnq&`p9VKg;WxIFHV5Ch4@PCK#59!Zmy&R~_=7!f-0I{l6ZSgsL1Q6+B zewT5#D9L1?L&o~wd<1OO9Q4QJob?|Q==wKetE@A%_VD?Q&uup2=u#HtiFl*mIQmhH zb%N5^obH})k8~%nVQkWo)yx%*m8Wak+j%3HXRzfHB9i)wF)2N9e8gomll5wL*MU~S4lnSAY;L9#$~;^ zyg~We_|U+Lh=>~#k!7V>u9w@1^iyY99F)zPdXjM&$Zsfxb3o`A0Mhc#-kTh?^$M!1 zKf74Y5iG37FEr0A&HT{); z$H-D>tY7)%k^g{(`VOcDg&ewn4GprdFPDHPay}%^pS)LwrtEy z1C9|R3PvTWeS`OCfKYP;LrBXu-6DS7c9R@fm24!JH|jZn6c9f;X=2I$3a-Cu#>_00 zZiQ(PCitQ0l4PN5$F4Fx;OX=7cCxAynR43~_?SawUI(5UXn_x<@k12Xsdgc281+QTZUmP)DXKYMPzs{J^O{yJblfj3)wC=Ha9| zs>m-(K?Dvj7t}aYcItmC|E7@09JHJ?Dl|9)cda~O^aD8wcP|bu4@wN-L`^j;fmPRZ z7@qk?)H(+Dy6<;)cWDNEvN}6H>5&{jnvi$v9{{haHA`5#AQ$snO^RBHHd=;u6YGbj z=iidYB;`EijDR@oUXUQs1%)W3FQsE#vSdVA>iilDgA+ROUQipoEF(f-I0u7$J|IX5 z`}=rvQq+)60*aOI?$?}MZ%fjP6}MYmKCd=4gIaL_-WW)pn9EtOKT`BBpAuavAV}9l z>i!_CF2}r8fXaOS8OU0FJ}nvrct+{ahFxDnq>?LAu0-WjMe=sYxVMjPsVR!5rsgN; zW_#$*fItgoZ|p6flC_xMp8XqQ8}Mq_WbbcBf~B=xFA*h{d9IWD?RqgIXLeVKqI_}= zIec6i zIRGTdVXDtUM}%``*-j?OnlmF&mv^RxGG-+B@`W}wqH6Kc#2 zWO`Mm>tPW4V3nmZnh7F#6;-T%&=tY*1V6sUAuBFSsbJlE1Ym z-^SfNfBY_peL=q+#xg=M_MrogQkl4OA?Q_CN( z2uIdW8!QxvVk0#uWOK>>Lvo%^`Hq!ayX3HH8a1rZm@C)lszZVXn30|I1GJcT#Q^?? zyUkkPd%z}Fk4+P~;JbfP(JwJY71*N~t19+7mzb`Pj5mZDM1)ZRwBVBnzgMfA=Vdg! z*v_A2XTA11OQ|6W4D+NXG_3QMliJN;+W^OD*&0e!pVMwvl`U`Rww<;(vyrLGaVO~S5I7ACha69SZ z>W5to2Nzat@7;_8@=Cd^1W<@-Rn`mH~nP0*m`(ONj4#b zwf4J`st&eBZy(6-k_r^1FI zA~mupRPOg58A6zyjA`uXCva!Pi(zTCsQvg84GhHZ|9~z#o+??tc7tc*Mk%~{@U{?I{cStV zDtx-wL*5M)bnb8FWi8=zkZx&xb(FB&Crg406XPZz?izlRsC%CpZdTum&}^?4+t zta;G6?d71!ybFwXJA%1#sw(r+@Mw!KW|xJ-a;WOui4A zUlugjiy*(^GC?6t?`tJ_7ekc@>x*qT^MOYzu;hl`d(s9!1aPhj=nBd%3)u z9{28V*vThyH@Tii=&n?k!4qFD3qHg8+}YRazTZnz(aBt1bjOau_h;m-J))=Kt)q48S66-b zJ7_ogMWQEPbDBXSEBG_k&p$5{TJ_ea(98F^w+!z)FR$OK@GPLWy1gVn7q>sw?|A)A z?PoJN?IG5$Fo=i<7fR3RU@-;X5Aj~kyPr8Nv1m;on`lxIr+5l9gnou~+{AVAxUInV zPu99Q|E8`yp03+iwN9(N_MvUxT78-97hcHxT z!{g+VwA-CUM&M_l7Ufu{#JAdB%wokPbx;Y&Uu|=fca+|j>Syz}dz}nU_8hk#A`eGr z2391d>}Ro~D@y&tF_(r+KJ@2@%iR~&b%z20)Bh(IfVm%qYxgjJS#7L2u83H4X(?Z= zBHFX0RkPbF$7<KXNm)$QBTU{Qawc8!}?R)XVasrCUj@Xif>}q#AB5n%F zIc588Ew(ku_2>NADt$kj+}F74)Jeba%ZudvtXYnqH^H9Fq}(lkm0F;I?H79W;|l0o zK_+~-Du#aNCdwlVaa?Ro4m%+Ef+1#_a3D*XULsdfQ>f@x1Lmi3S zB^bc&85;>}iPYtGXQ@ZdBx%BvX)95$7aVn6HP+kt1j15eGRs*a9hRaD>L0~Iol4*C z*!U$^!}4->7D75+B>!yMVHB#74MF(gdjOkGAN)6U_z3BFVk~!?8qO_%S$5b+94@_Fc~*UC)Pjq@-;+3_5TK;Dc<(_$(9!I+181 zdYjvo6i8u&y+EQ}*c7)<-k^6g#Z4`IB6M@di3sRxOgN{AltYZSbCPVa>m-H_x(^4s zi;!KJ(NK%;#=ux;x)Zs<6r21X+ZHAkJRYygqYer}T2Cwq3=N%BnO3YDX2r>1ciUCp zUG43%3J(bOg7$uYsl&D`OaSA^eg3%ZBUxJd)${g+{k^ICVfi?-wz~uy-RI>_Noh-m zHuqts?r7qKEMCoEi>aOI(5fcWZK<#Au%GWVt)`hq1wx>+B>YQUYO1B~cV@6jtq;#j z3;fa?N+UVs-2Ntv@_`o^#AaR6-z3Y+Fj8uEMTNgF1GchnB}8%EOmN=bv;gj=u%Y;6 zXKJw_P>(E1nm=?9!b!#TQ_x>EPjYG;;xU`ak5{E7LI4Ip%ESO?=Eue^5Nqw*cA;uKF!6$m+)6RVhim zdX}$&$*4d{Q$Hsx>+0;t18dwOhZ(?6w6%AyL$0jfpd8|Ot#rKxa0~B-T5e44<(G$O zS!ve1IA|^E%dopHqmsKdtCuB7I7Sd~b5JuWR`S!s>!t>O#0tKNz7z_+ zkiAT9zsY;vzpy83oqSxx%-b=3LF^YAWRpjq+#3m^G+Dy?6N)$wQLAkl8+R;I9)Ur? z$Cx#urJgFn0HHT=<1VhCT#;OJ+E-Kvc!ZVYksO6d!d>_^^@l*3|o!Yz0 z&-d<9!MA?FqVA97PoDRw%QppN`SN7I`Mt`wJn=l%HPC_y(U?jHaM3Kz6-jCzW?L;a zc(!Q#8v|ZQk&3nv6e%N~L29f+$A7>jO~T}ue3Hi?Nb2N7bNYR#eALa$R4(}sC&Y{crMfVOEqW=C6M_oq0{*(}e zdvT144{^-PppCw@=%cB}#qj-nf3(^-k&A^<5Q>UlhB_QK6CgA$0;DSVfQVp&8fnDD zv39vw&M_BJISiDtb@AV4Rwk<<_I#`QMs@k5cpTpZ#6t%z2bhSs!4dRgHY>dJmgoQ} zE733`p#=77Na)@+;=r1@6DLzUf9JbWzn9Xx?$35VNx!#YKe_*zGDg1(k~nSfOwCta zh|Sh-(EWheycqtL`-77=n`%hvXkHqUoaEQ$w=3`dowNMI2a(Wsu%w<1MscfRD^0&s zBzOnJv!a}mxxFk75+dT})$n0Fq0|B>2;C>97_!usVu#~^HyheF_kkh^ygm)~U;arl znv+w}VcW{TT`EMhe*L9jl%qKVD0A`}5`Q9GJHcyq8obbXfTL`RZS6buBk} zzP2rvP~xUA?PnEMUsGa<r|>v-fb?^ZAdgt+5C0U zK0{De{glR0jbjpa(Y&axIx-gqs0Xalmr7qhr6-j|b6SCdGwQQIA}-=VjWAqjKk@PNMU7_5>HjFfKi?3nRTUxvt) zgrA{HV2YCDDyJpHL3yr;+14+L=AtDCeed%~i`WoU;p1cb8aU_XD{SQzm(|h9jjY3*PC&lPc9C95^?BKIU=Y8Dk^=r1?2n|=-954Oa=dhxYouTUCtdbO1kV3{4 z;_F}tCPma@WP<)VK^Yp?urI-rD}m+Q3xO7ci@hwis-!3(1h=fqy~e=PoFZebxq7=n zJf`tuiLK8py>MHmpd2wF!E#*h&hlzina9+6pIlMcXLP@qbQJCTE%Zt7N_vQDD!$PI z-uL3#Sx1DrMJ8WghIE-xw(ZT?Yll3?o$I~FZ9jF+ST%g(%DZn7Fqt;Yydra6RF6Wm z6}E-)Oz5<}BliXGZ(M5*IsT06&z|vu!{eLiEGlxi zOl45Gdx`^j_7@ ze&wr|t*r#}lAouivWoOoOf@vVr%KZ(2dXMRV+XiGs|kRzNgSgHHB{UMn-iz6-NyZD zq6E(&TxeabO7~+n!J=Cv@kjS;K%-`bGJ(} zb>h*^H(RIUcEONTJ_dZKCKBZ!5k);$X8UEz#ndrcxTa6m;tbX2RFk}tm)qT?+i%a) zCl2n*6#1=lk3?OkeC8xW9RS2C#WWv?mgfP)v$t&J>e$t&eT4Wm-_lj*oMm9)7_fxq z0J^oO91qFlXSnr<+*LP@IdU;{7(Wg6W6LZ_-NpwA@TvYJ_fJvljTLHWq zCX8|J2nC({(!>TEQ8Q+p)TS&g>rBJKNbXNZVTUP)N|?Wn>)*RJy7Ag~+z(kbB;wqI ziN$TU>3`z61pVmPfp9KjZ$PrC7-}U{iFLW^=|t;&@T^9){+I9v(KAWty8ZSL$t{6!|OBP zBh>FMHmNDqUi35?4>mm>Z$t5if}K&?ywL4{+sd}zCx7UqKEvH+DDppalN#Welq^dE zejj4pFAv}Mjf-+W&&;i65h@w(K5zNP!<3wUt86}p8SWM!!;2g{h^RqnglBJ-gf}i7 zx9O?r>_#iXpyF)tHr+~u10K+Rm)CnMuE1&rPv3&p$)oS*<4O1D=C&F;RwfUYRk1YQ z$N+_%k_G{mQIQv(H_SH>%_ilxPAGeh%1`CxD@NZ-K*{8DSMcq#)5%~^ zzsSRk{xc3ueoqPrt+Bu1o%k>AU=6JSpLe1g~WVO{PhTqmu7-Nghe01>b5 zDwDgP%;aQ~C*#ka2K*}eQ<>Or-!|6Azz1dV*)Mr!_?WNvu6O;r@St8+r~MR2AOLc^ zqR#{UPwN*z%0-h?q2%3f)$7)xz2-*Y%KZW7 z!h72*p}5qenSH$8WW1TrI5Q3e76NRDng_vD4kj+nrC3VY&n1CDIa{Uy&cdPu1p%|q z!r0j6D(b68&aXO~(dNVFPWL0P>EExh?>^hBk83Ch1uB~G)q{P_cP@|o=9l(<{q}hV z6Q@(j-UK+WOjM#7SuQADPqCj=>0>zNS^oE@OVSQ%GWpw=@UAQ|#*vyS>-N_$rOM@S zml==IE>|aJ;DN>#&Y{^zJlRu<5u@o_pSLI9_F@ID{7HJ1ANJ8P^$wqSxxwO5b7J<0 zsgmQ#VY>hUNHCC^uD>)EP`0xf1yn5a$UF#DkLKevpE}lgTcfo+&O0aa_`_0vAbb+c z>|552dPrYG7~!#)?&s5P ztm!(s@hiWN^KGR3j5L-fWI%WKX%E>42G+@#{}6Ir>HCl;R?LQXj%5P7Hhnro7MCN~ zxq>85w|5{FOPO4C;NMq)mq1V?LcTDgy0Fn!XGcKe()giD^J$Z_8^`_qSaPM#7+UXj zZJE>oQBHjVTyg~85>1pkPzE0X>e!7(R0vM}3btR75}KnZ?I8Z+7@VkQVF9Dd`MinC z{?#p=->WK$#VFa-J&wEV7k^_j2$A6Bq&ivdFQv}F&-dw%i8lUu5-)OJ$&EWYjEJR1 z;+C$dMjUwtjb9*I)*Zjik+CLnL&>GDKYbq>o~}X#$gN-YO9g@-^?leu^7LwvO?d>T zah+%`YB`(@&fS=K^7;Fyd1$9^x*Q3%-+Rvfq>FfOJ44LmNzKjaIM-$_{$&3&s@J9s=LrgMU&@bE<69Du31@PlGMf`4OIR2TaW>vLpqx0$uVnrb2z-u0BzWs z(?139j01q&Z8)9$H8RmBS96vlRF3yw>Z}$Y-YMQoJ`>A`(p(RymMu3t1^)Ym{7l=& zNXDHZJbMU`j_do{;R>}%5U!_Mzenb*IuF*Im+M%^509hWmFvA9AJ0dQ7u-iXXSVAg z!@ZyHfYR+Z!5dU^>3~n*3n7@=eje0*z=2%NhBYan29qTQ&wA04G!1d{!<#Cwq zp!?-(4AJnTeHYGf3_;)$?my3vVM!3~jxF`OK?meOvz(_^gZjTieVtnhfbvw( za$|CkkdsemuShzATj5Ok1 zTnyVVNUXL2;og$~kR=6V!5sLJfg^V1vg0NoP1}^JA0ty7aH;3Vzf`4Z{A|ko$Jx}q z@BGU{DbaJ7je$Z0Trk+jo8bG`w|77t`03d1V>*Fi%dpRaL>*d&h8U=ZW+e$t9Zd@^sKauzNTfp$ZGADvF$pGS<)))7NqT$ zhn70maV##G-46oZtG4YYMBvXg&+(A3Yu2`Fg|vUF-VT6r7`JUPT&z$NA=YZ~!U^7wK~ntUt5l+QDxKwi(OAAHU?-5QMDq^Wt_!F3 z6R7I6?P)8TGb2#ptd1)@K7=|3pFcvDu@gfxWw#faNDP1YX*|{!gXq=%6VdPaiyz6} z#OGe^C$8TsryqDRhUY@!QzUR+1<;$epZC|1x^?M@s%FOo z?y)0IFL>KyU7<2faEq6CQ1T^8#A@EHV3!QpRP83M^Tp%D^ zfR?cmT{6?W#m?Gk4W10Ret4>l{f^-C6%n4FGra3S6-W8t{DxJzP{|`ePWE)z(#1~B zI}kl0pUDw^3J;Bwqw9=Y37Ql^LBep9Wf)f5CZ>%rZtB$)3kT~EVi*=44$FoIj8p6~ zow|;`(zZtmV`zWa#PgyqazNG6(2N_q7C`U`CpE+9C`mhyHZOa@ky&7_W7Q=?3IPB2-!2`tMt1GWvDk?ZYRO?tT-~$e8z0Zr6U0K zL4_9ZO^#{LD!ng?OJm8j@|yFPqUe@zATNRb7T1^F7u^3d+MNSJuF>k~mI+3HtkU+= zA!qgD5j?@7vwVs3P7mmtzTfBL&Dmqe9onJ76g!1RAxR582tK#dK$Wcx!aw5>q0bq! z^tk5z<5M`gM!g9vPiKwEuQSW59Z}?6Kd&R+VDCRYsQ1Q06mb`5*_e_-4CRos?DDqX zA8O@mn=rGn*U{#jX_94Npur1^sfLISpYNf;@A_woE+`B3ulQ?7JUa!}&N)U&(+44i zL6Iu;(km?R#%clE=LH1UXK;_QTL@}Sjes8hW0E4(;2;81%yXo? zw(2lrAiSsvWaiYh7_^s3%Wmol{s3zJZUKX)NQzfLz)txgxzYkZ9zpuSYM(qc?WaiI ztdvY%>VVN)FIdisNB{z2PEJlri8L2>-twjK^UcBU$F5h0USMF|dcEk+SgedD1gTpt zpi0Wj0F?zN#Sz~Ek!d|fehDjJa=$Z}L5SM%%R+3ADk?|CX1ljQOx1CM?E;kDjm|UJ zsUScJz0R0*t{+;!K|Y?X^+h}NQkmEV1USfr5=y9thK7DwFW2ZKr#i5IBFl)%ZFfwDwkweh zk70tR3-@kXSKiY00?Sm>5t!bhCXSnS@)@N{btMWO;%PF?B9?}{4p>JBp6nRu)1u~f3=vv{WC$YeZ6^F zI~;*I9?bnk5|yEIAMKys4DxeX&$snDwbYy)8-ZN*SEgoN@aK`u;n1ZYk#xcit^P9{ z$c`w{8}S^|07a@!z`A`m!FK0|CrHn0O`D9J`~lYww<86>S5;kVG}z+f`(+IM&%A82 z_8T@ANJxk;q5gR4CmI?;#Jd6}ZzMo*`~ACqG{C;Pr@j5bu~eg($hq1$bdahWqHWiX z=)Ub7TNS(+pul_2=HkV_;jygy`>lRlB8Vf3OwLTciOXxZe|$Ca9On|nK#m0(QI>eF zV~+^|RWp(NqT$-4_qaW=?NhW4y|7z`KgWdqhG(mg97rKF3 z_BQf>9gQW9LaQ2`$gm6qTe0oisKGe;KT?)sWlDwTbYp(Ls@de6*W)HpoHUp=ua&E7 zM;xzV?SlZ6;XV6@&VmgGY6uBjZ~&^`ueTYE;2>m5b3(xR=x^Y4|1*;>N|h|bbvnT+ zKPeLu35`rRVB4}CL%a3imMAhmbQww#L&zWTmCz4A+6-O0#cmL=bv`yUpo{(48w|k8 zVRzcg44|*|cpK^o#WxL|8j&2W@b$|c8 zy2jS~gW`k^^-rTsqHT+E*9p&gjHyK0XbxQh<65PzO6k1EqVzWQ=h23~v? zE?B}UI(p>N7|TA#SUji*f_Cg4wqy+9VB$AEe~E_hhABSuqZ}`W1ae^vajNe$T#kPr z-1r~)I_m0}S7#2KG}{7nW}t&8F7MkYBNW%hU32`Tfi z{ah(vc$>kN(v?2uxas z#d_0(6jnYbRq13-x>T8{YUKVIE%T5mgE(2@dBg8mUQ-Ze(W(c|_h~vp{M+N0Ce@d_ z8cEuOnd%jo%n)psrE#&hBcl)In>MXbMAVZ^wm(ehA8vQx!*d<0_3#pQ;QCQiSXt9V zvGi))`>_qV}EfHe5b;`9>gTq<(av!Ni zGlj$zzsRO^zg3au$izVrn1_-^-uxNaVjns$U#Xx#y_eY+uFV>#TfWyWkDr^CuYU<9 zNnjIi)j@5Ja>B=etMx8)zI$!8bJ0qBceb=Tb>UU^qm)h~J8zU2+DEaHyNb>!!Aa^H zw{!8TQYBADj{U2~EB;~0$y3@M*bB0$ha55Y0xa~5>ZpW+XFUMtH57@UPuA-pZ~L-P zgUVoQpPc4^rFaInuA1!IX}$d&$zWkTH&5)?S#+i*PE2!An?xpWOycRsa}IRwS%7Ae zaF$j%XU`=6?4Lr>^qG|r$B`dbn06dfS!bD(7lm09O;5re`a zWZqh~%sBMEBT4@nDR+H}ryKs{2h3eRx%gQF(e9j*;c1a) z8AJk4x{B=Dh@}+*qQv|ux%9xv{g>9&->FW@%OZso7a!eg?DQJHgfx85)(Su|MwK{Y zjGd+?<1K1VQKMcD-jIs%Efv>Z-kK$JFA(z(CsT$uVgltLw4yi+cV5vTl1`0;zQAlB zM|JLe#9cnu=kn!*I}?!I`=9=KKFS>~5Ra6rP_OALE)kNkA^A1TK0QTW$dzjEIqoUp zJ&BV$#iD+fkaXZF;`4`OR^rxyZBCBt;$F@?3xc$K)pGGB2LC5{461nRk6frY9_fo{ z@m|q^u+cURa~q-EFk9PVo!+M>F0E=TGhD>b{w#MUmfWYB&^soyJs@woLMF6G{C}GCRW#g zhR7V$a}_fYM=+yBo2lF(B{_wzgrf?_&$Ee}F$0vls9sFpzyz0{vNYSquK0`+6eANM z2=Qd1&QL=bc$I=g>Ocfx;(iJ8Eay>A8a?MnOgg0WPEI^gN*mvKnO%&Qb460}ke4XZ zVUTYsj@4CJu}}#jW03}dko_38lriYlVlOwS$7(!__&>P-ge|8u5dN8`X_^_H2-1 z`DSu|3g;7}Ojs2MXf~MT%gqN-$?Q)ztU&eKXl5#aNV~|sXPEz~1Qzn_c20xLCjU2K_Omwg_CKp?V+~^joS@*IDA^bsn z*k*b7mj_p#xDMqN3RKI()EtDVgA9rMk4SF#GF}r6f(xQ$0)lPw_o*a*!FF9HUU+HYz=lD@fENBMu{gD$m_V zCDOedc+_S=9?q=1Ak?JHBtK8iKFPb*AoqZy=+{RPtQ~rmNpL{yDyPCgDaHC}gFpO7 zaM-wkZc>pBE5xL7_^<0k4m%zyKkc;Z?7ert{)lNROy#6aDcfMj^DW|#rx|X$+vQM= zZaca7b9(oR+Ck}W+c!2&%-18m!-X4G-__6`BZkHUn}Zxmjqf{mBWtEEoPWLh{HBkm zHT=Hr#SCf=`XW6{N7qcIc-8038!!pA>To#qVX@S#pTi+wu_&{Z^CVJ*ymjCs+x3cf z>J8tRjz?ugFDYWoK)(wltgtb?277LJK#R*0cH(;EXOKWKP2 zog~vWV?SxDf+d5?&m4^rDjE=ob-2G#S>5v-PUprFGdb-T;`ft*s5PvzMKd1=dE~$} zyR_*7uA6Elrm8hNHS^hYl}d9)90wS5DVua0+D!OtmQ64I;B}mID5{R@?1|g#iHrF5 zrUU8ATt|?(42(&-<yu2d$!vC1sa*)rKxVQySG-k&SFj-9_Of? zLD`7g-ylBcRHT&h7W?jXu6VJL8zGjvN9l%cnyM2ILBxfZ00AbtG%4Y*U ziq&5=8cb0NJC1|an+DFGbsZZr$BzwkqJ@inb!3t|o`jTNzbesTMN9Y_7j@y2hH@9= zBqfHkjMs%?+Q37S*U8vs+II(0LCHU`Bo!C@IA)uEj%)mh@I>OmbZ z_I62<2~9uMveo2@h9hASk`NT4!o}gMVhl^oL##0)(kmE>wn>{l$l^M6T^e6(a6b(#cZFeEz4<)S^|=a{q*%uYM06HYc^@+ z8u(Zwrq@d6hP1EBXWKadg?6KeNERkO#ilQ+0{tq#G_RFieMGMlN;|QQ#TFJH*$pP()!K z_^MJpNm7t&sG3&E$HlO?ZpqO1HDl$@xeDF2n@y;0#;P#2|oI4QosSdGdn%9ANz*=jb3+LyD(E7NAotSA2BIzxe#(es*}gvslFD7z(; z#PppL6Ox{{Z5jTOz{Z@xik+`eAJ0uc*R0JL8yB~~tX@@r7zAJMbSPi>*omqi;dG^({wp7G7$7gj5LDv?^W=C8HOk^zejeX^!)Uip-Wst zKO%u>V0sz_s7F?RQV^{e3NJ>TqNNV-p3#WGGCEH92S5b~bTv=JWx|9oklm6cz?lhwM^Ra3X)0R39s5-@M$W?pRPLO0cl7J-Mnjbt0IVUQfvJCn#BsiK=#F<$vKvqsbZrtL0M zo+yamX}76aqh(Zw?}TO+N44lU<*J{{bz#5E;(Pd}u$i*Wu=8uF$BEP8qe}MfQ=wFywh_PP5!4`?dz>5gFf062v{g1air5{T zUvoC&Z5SfKl)L2SLGNwQ zBIP#5pBOGz_~ptQDG39=p-cW?#RZ>}Wh_UdygEGC;@juEASf%TQ_C`?VJ`Ldklw;%aV=Gn#y(l>fmD1`intEs5{!A?x#}sEc}vPLr8Y zl+C<&TDL{et3L@Lm)&6eXFiNEmR9?XV6={2dm#rt941YK-P>^SFPeK~Mfrmhy2vCT zqe4t`Xb9@jv72c{|6qASF8n&jIqcV9<4Q{WPg6S2B9L^k;h|z)1r3wd>E~o*3car7 zC2=iV%i@fH?b=6K*^aKGYInhO|ra{nhf^vqfGZZ!o8YoL(4+`|29 znh-=R&BubCkmwZBOXlFp`}vN>yIh=M57zNpiyB?hO9Q?DUfv&s5awh_5r3(PAAx~P zx~I&r$t7iR%&K*U8ktt8raX5`?x1}!Tpc=+V`o^G)7)U=29&Xd;>1aU6aGWSPcZ;K zY{}ztg-ieGeA5P5%ivca*1k^DCq!D8$&wF`-cjE(T_C3lLzX#nxCcN!X91hUa z{Yl7ZpWtiO+_=#D{`0OwGv;Nd>_6OqyCC#T7BVuvZ+=@(P&a-hs75g(rB>Fi6zhk1 z1PAel{a$ljJ7pavZx^$9k2eVcvD!7^Km%s7It)X7IxA7PoAJY%G=OFF%P0#A3t65p zh7#E^I|EybdEYLZ3HGHY7Jk@g&2^dZ1sOSI_OG*;Ch$4Zruv1AL_7>ZaI5{;=(h0K zCMKC2HaK{&nWp$~J;YdpXhX{5D$uir<5X+242Z*dI*fY09E$uvRcr>En6h(nBji#s%cpF#OF-X|u^B7CMwk?71=HKLAswgRC zmwJ?72!Ky`9e`k3@ot4A6S7#dKKlFYMD5vMJi-~7NDyDjVu69VXp9%lr;5(xgZeTl^BI%f|YNPaPK_q>KW+L&;C9GKllS4 z`<)8elx)q;T@*qg_d6QmfCI#f?Kbpd6-1p@`w?KU3h(U-$0>l!s${F!cAIz|&qyl$ zjb)m{?7Z6Kaiz}>Y+IHs+TjWQvpnUcQRG0g_i>HD{1=Wp(h!?)p~VJH{cf$!Eq*fB z2nrL4le`Q<*@e zs60}_@t)IoH?$R617GY+n4`%A7fNP|H$w8SNff7$wJD-;zX(hnvjPN>>Cds&)fsc_ z9(~18u>++4KrhbtlM^Bo${=ZBIJVHnfgkaA~9K%D(swwJ-vcpxG|mc(8zr?$sP zEnTK8ml>*1i6**6lW5G6lfZMoEW`0}91{>eM1>)i=~1Z+)$U=+ zz8W#cv`R1D1(z(?5^Rvxex?}#@OwOQOy1v|-aW)8GdW+hoqy&YRFf7VSXI!xgxRHK zQOY~>*N2IGT>yxX1-Q~AED28VUzC4QcWa(<8I%oDB9Ouk%)%z-aBOT#nOr=IDzbL+ z*eb|<47ESR(;bN_pg(8OZpTQI!SB(>6)Cz#M&!Tq?n&vz>2=lJ{Z@n#sjF`Mn~L_g)atY;idV>r zQ|bcxG%Jhka19oRy`Lu6AOT&ma6;j z){F<1jg>*jRdEI*AUFp!C%5{SG(L7{&##?GGxT8oY%wkhez{faEA zW~-bK2m<^lOIC$J3UQ!^hCiS^*l-OhvWozFSuI7}wrgeO-46s_`b zERKc3tT4`e=|{i9+;rrGLE93hbD#+(Bc22f2r8HL85BhXkSuZL&?}T84VoAYQt|1w z+e7A&GWaS`HpK=$+iqAjlgF$dA|VY1gZz>oi_1R~)gD-3KbeZrPd2&w@K6js8vBW1 zte_!s5KI_<>)bl1ROn#u$^q6P@UqO??^@d>h4;NZuK@7ol@8dZ%npRf5}#mT>hLo@5s8_z)VD1xt2jyif#R^w)g)b6e22V&xOywI6%XG7A zt7;AbHi~)kRk+9$7-c+}fMO*YLx3^Y?D1|nTlUFMV2}wQ3yQFB^ZBzT>J8cY=`JxE zHNpPdM$}MuNrn@O`CPtTzF$)mP^gTP%S7`~hm^97%Ty4jG8l(|TE0j3UDH;#I16ha zX(87RE&CiLADn~{Gw~;S1gh+1*%hskOi>J)jL9cUIVC%mz(q^;G4W4V22W@- z#|MDmuKjS9ufhDUHH*=_#wl-;HIs#Syv2`0d$+SgN)aKHxb8$1OVw}7?pvT;4)d!d zq}tQxvxViLwSTj_?|wvl{zPrNPVnhpb?k?YYov0^voLU8NQLFBdhH<2FwBM5)hU*x z6S+8LRW=Tj`yXKSbIr1pOjKnd78|&yTLsiPli~jLCPdvhx%404)o391=sRdm4?M8= z+}kqfHNvD>tE(tol3dq3Tf-7x@IIN=P(6GZxA+4Gt}!#UeQ@T!-HVBRhUb5}K41Nv zgzMFzCW;q+=Gq0dJRyEDL{tyRi?nN~@Ae!qqR}DN&aztn(WLJ{LMN2Ed!z-{s@MoR zY?)cvT+xq-tY4vPxzd_}iVi4)#_Us_h@uiw^v2M<1@5GOhmy!uY;hRE)Wo^QmF*B< z3{IFlsJ;nUf}&wdrGpjPVnnzxZu~NUaL9giIA|hnR|G(mF9b;E?p*Za`~i%lOU?( zUGRfMdZv~r9J(GB#7IW(iy444G_~0c0ka^AC>YtGf3wBr=H+(oFm@)#>14HLyb-0# zz!MT6wb9cV^`f`Gb_YImgY}eT_OFvD+QGG57+(;Xy7zp6yQ@}Rhd0-sqlK+fy9FjE z3T53fGW|@y;>ekz6^wk5Rgnt4>lTr!Xm%n~7Ou(O#iWoWKp5MxCwGMV$rEE>BBebY z$_!TbawG7+?jzRxxz^es(-1X+(R9~VXV56v?dDUa75fo2Ntz*YFvKnOmk%}9a%IFZ zcZY$1qUfW>DKQkZ^~HpEIU5Z(`Q>1&(4~AszYNwFF;txlxBJX?iI&bQuWP9MIodE$ zrNr?n1`7pz%!QaGE%UqL!_Z|TUy8A#|M+Lj`{8FC@tKFL@BLu3e3=HsO$l6zSY_tSVHZ`IJTO7#DF^BW{hM^0#`4TUAq1` z3>TPF2-w&pE8@|nNKs%L;B9=_VCbA;Gd$aDP(VWi!r5QmU1vCeR;T@J5E&EOWB1mt z`&sWwv}$8mUg!}LpobaTPrLw-ufZ7BzT+4N5h8*A-w(})3;%uCMY9B_xt@oE+@?9n zBF*7#kKMS5judi{(i%cXW`v|<+TpMCP=kRL0MDEger{+;kX4$83j-O=9wFp@ffr9A z^!A^GFdo@`-=Ma?vIv$!8UXm;l%Arb@NFH-z{=3d<#7j@jKxnp99Us(sryjg&NwS` zHk?-=CSQ9QTWl#iC5zyZ%VWi^Si_YonAtUG3IpS70CV6PMR#Ww{x>m048g#~ABD|3 zx6iIp{6E&a+d-+57$eF1^;+5Fv+RS8q=rx$svMQiX$Za~5$GhN!1|4Na_~ZCty!?- zyy+oyNW~o-Oonj$^`CmUA;uUv>-xES1EA43Z|};7KlY+Ym60@vtB2wra%J#)q=N)q zc(G6ML}^k43VELL-HZdLv95uQ2ZEpGvqpy!1f%o#JY>G>S@5V@JvEwr6%%vg{XCt= z_Fa%3K`xyqHIQTsod{L|Mi5TtaC_S0H0WnU)ggp%+J?ExjQ$dw%+)1Tv|>dxhDa1Bzm=M#c@M>`WK#1QC6#(#cU(MU>5WKQ6-Y7Cj)+%r(Y+ z)9&usuVh?w5C--aB(PnYGAEv-*>FezjXkjJi$dTR?AuTsve9&h^kPk`VS}c(xHqHqcEBZHnTK27(X(HEN~W=neK4Wf8y<@%S{sfxETn4BzT2uPqSTjWL^&`C7U(| zcl@5Of4a;8%6*fCVu|%`D{Si1nG}$L&VOb1)l0QQ7u4uta(3oPisM{6N?EIC&0A;p z-q-x-z@r*57Wv_G9|Bh<49IDG9xg`|w86vgA&bj|^PV+nj+1U@6CH<ECiiE&!d*(0u$vh zW(0_Fx4KJ-5+TNZmOW;b2_r`ufg%z&y?_rj3f1Te13qvXPc=f0!>AkiZyj#~1-9Ho z_Qe3F8F!(Zo#T(Fc8nU+8nZG8DF!7=B$-6pgT1b41?njx20 zREV2N=$cla)rNN3K#lcrVJ2$V+hJXx4RL{an z`~S574VvN=Tbx>YL?ucL+3{Vc_$tWHu2!<*!5xd_sr|(Jsl*!psZTeeJx5`yCaXBI zn+n526Km9J2BCsijj9FB)tE0va9?nQ}H0QmU7($_793^6ZRa`BqW*Yal6BX z5Ym32$*i~E<^}5Kx0B^}?O*mUTPCLOGQTdh?j*`P;>$1NCm}ygI(=+`maNI7vE)Ff zArcTs6F;o`Req_cF=#9zzpR64$0+@fe$IGWB{ zy%l`6>&;j{s&X&IB#Xt3(~<^_VquI(v6bm45kWO2rv%~E=QOm=nRJ9gt-$C(F&836 zNg40V`cT0z$ms$CGl6+-M%Jxcru`ML0L&seD?WTQPOBWXGK`Dahwlc?G&DP}bIghS zaSOna!jN$ZiaLkB&D*wy^VdB|Oy>&_PNg%A9E`*OLt|-4wf{&Z-_{viP=a;~lEs@Z zrZCWygipVD)*K!lYBoEPef$)Ri%1>yG)1m5n#B0&gqsv!j(FN6I6f-%SX5vy&rohoODx@~*ej6Bp$<6r~# zF1_h&4%x*xjjFK2FAAj5q770|MIPoe*}_GdiM&x=(IQ2L7!JHc3nky2F3uK;vd(@u zuvh3$AFrm%rI?s~ZnaJM`EpSu*#=diFlbf*&8$%;iyZ-`)~83t2cS{lb-uZ&yyG6Z zf+I!Mz?qcHE{pDEbQ>cpS=v4<6xW971b(KZ^*x&>%k8zoW@f(A843DQ$U-EL8>;48 z!kj!a_UN$_$-tPW*$rVPB3kz}`Mv(>ZmGfkw>F^XA5#>HtH}38y7GGH3genVr4ZzY zi_exqj|kD(^QrS@gaCLi)6rZN0kEby3bD=fYix_}y-UHE`umO0Nl^M1sq}ZipXwP5 zU6sU;C0@Qyi_TO;V}}+*-J+Ahy4cT}5X*@9O?r$LFY7i%>wq2!QA@x~duZW=+T5;% zQd+`k;^O@$Bu^|kZH)GB_t`U3r1sV8*!f(o*@X|5ow~<3;n=<{2B?34N8k{)7-4h! z+v%sDlGXotBM|MyLXmRYd6gC5<40H`OBET6_}-*JAk`tz;p;t*TWkm;pITHKEuY_3 z__fA`2cxdnuTII7j~KILyvnPPx(x5LMUyu)9;or`gY<`)rw1G-P{^XmQ!Vd|bNH?E zCQ3Z_M{pbLwm24H2XG@t26Ommf z=&hyYLs5`WO*JbpAuXQ<4Ra`YB#d>Dh8|nIIE}~USv)$`!vOtx?k_HT*_kimdR80| zq8kg4gGCrp!XPntGKXUoBTk0SrSn1zn6oY>V1qANU~UmI;`G!7JIN2-%4pal1_z(% zwDEnm`Y+DdH{ccg4quV3f+&K4;WLv-a}O`jtnF2q+EB{8eF;}(Cr+$;9F2lE7mwd- zm0~m<&P8bJ?2I)h_{>nq0r;&F%$uxuf6DCl7m2lB?f5{B4TPN*Bmj2MAvXcv^QrgH zm5RJ@y)F-v*G@OhK7WBl%8>yv^VA=Zxqg6xj4MD;x9s|_gFiNX`q#1E*XM@UT$g&^ zC+Ch9hmK>7i_I2fLQebsa#X@1U0is;9|g3l=-g_24d1KE3QbbbraXCy$4-NXwcPCy-nCUFk+Wh?ljB zkm`UY!12enIPEDQLR^Z}Qr6(7&(hELxG_Junm7{_?taZiGa?|8)z_G!QHYmDDNVC7 zVmXYv-E)a;iM+jkrinp*;kO&G#FY@BfNDDugKJW)&&9Td$@*fs6w4U1AvrpFu_gJsG{kgn(iIMQSkf8_>Qk~FD&Jk)0v3A>t4!Q+sQmJ3tatP?^F8L5N0AjxO zr<4DUp1_O=-^L&J@wUK_&**}IZs64kHmx3Sj@4?tnCHtbbV5$sM2=d`2B->$%}{V{ zA2F_hCrcy45CzccuL0fxfG&-PCmFV?$fLe8KK^t3(UbN10J?$R*PlhaKV9@*&hmZg z-De1L{r{aCN6m1w5(7qF^(^0CLsxM#7{9C4bb{kp1xq|q%Qg}_D4Hd4!rZeQ7?K3m z5c>K}AsGy2P_-FfP$Ih=v&+wPo)hN88#GBFaskpmwpO$cUD4S;lOPG4NyBcRl;(^N zIBtF{nG^oU#Q+tMO?~}J+Q%Zv;76scl4omDxY4_gQ(zd3!c|MDw=X~Owup#`$jfQI zK?a*h`E5?C5~HN}B4k$E!WW#i>$3kmv^t^v%aX0+vmObFp$?W5h?kKHIA>5*N1QPJ z&%KA5%>I1Q5Fj0;kxZJlnkoyT89*xwjZLWVj}V}m*P`z94sLs}GL;FAg;1(mQ>q~- zhAY97EyLRTpdzNeR||tA+JDFMg?nSiWH4Z+K)%i9DZsm&Ob3N?@;a?%e*tKga<;{U zshW!KHQKPpG>eQ}tgUE}uN|DPPM}dF0&+`reyuL=A zz8%QF1reef7YMRsZTwogAz4zB`M9l3(+($_OvmASen#}^S9_}Rf{S`>umY(np6XQv zd7{-)ddn&eb3v}fE6&``Ek8(>Ds{>%i?>}IRY6)Kx6hzOH=IkO4jH~njSk-tdYc^B zk3T4!Uw?U#N{8%tvuiO;n>B@duck8Nm!y4Aj6J@y$rtXM~Zfw zj3T~3Ou7{9DS5*}$l&S3N*X^_+Qc1j|HhKG6176?hhmnZTBMyyMqw^d!B$GmI`y6m zk>ngkREiJ&qr3FibU~Iz+$qxpLUTcUl=~vXj<+n{Ib6*SKWhCqAQN+s9UzH=g^ZLW zS-WZ#Mc-Ym4a+$tgkq?Y*NQA+qZ>eSJp9ur`}H#tcdSa)8hE|UfdsIMRuyS7OrCsA z6eNZZXJC8t8$&2is?jL=NmTBAw60ug6|UVP6Z|>;F?+*if)%=Vqc5QE>8E#|Fy|(g z!~9oOG)@&|CUbc?!_(P3%{KcQUGZtkTSm&QdBGLobV@N*d_mWEQ;)zapT)vkqJ&0< z+l`CVp*{l!8n3Zj2`4?K65&Y|35p~(vEnM{5Z35oq6|Y7jgn8A4CKUZ%XCrm`Zl(WB8?jgj&dtV&Hnv8q6C<5cY>Je_x0Fqa;DOSOV2CnPXO zAil=$dySAyv)hbkadge|rX>*&iijt%fMX6pn^fzDcmy0e+TWyvq4G;A`0qu-`@dp9 zj#kH5)YXE?KcmF{#RR2-BRL#%sjt(-de^D(cqbtvv8&yzNs~iOr`QXn+6O6`f@4*f z-uT~U1$gJPzaVRcixvg0-=dI+Op~b9_I!0CHN)o(u}K;H!DV7$VY_5=c*kRciQm9J zG6KLiI`%!Ev~6_#&&#d_6j|AKUS4Ve4DM;G?QoXl6#>F=qb#FXyGGjMUs=Ze-UzP2 zhqr{4(qVdTSbxffsTWVE`>zH>zr)+8L*~1JPZ(|W%iK?C3z<^@8j9`mcg>Iz?0f%J zMHO>_y%rMo*_P35l%>ABTOi`p@Kdkvvgx%SE}~U0ThYKC3W$F<}RXC=qQZ{1h_Rq3}r z{m!48>%y7ags%nTuUCiBxG-!mmGovS(%GgFkJ@BjtfV$)|6?NGNHh0pHA*sV*KPV% zrK{3e`=uN!_sJRJ5MszgOldFahG408q;~QL2I?Tjw*=x5><{BeNs!B&04_k-_Tp!t zi>6M6pE+;+ZX3FVCXrBKrA?cXl%Tp+romCFR8y+dm>F=FV;m#oGD=hYwI>+@xhPkn z*vzeCk&7OaH~P&9W=$D@8;8KpSX3dT%yQJc*SYr3z36%7QfZPnU#=TbSjzaB5>y)1 za@9(clFG0WZKaAHjiOZ0#tVxnWf+tH@JUis#Of!nviL?}d6acTK* zCKWY`&=EUg%-1*MdPbiVSM5aPoi&H#=vbih$*=0_=C*cZd5|~?t|Q%?jIUIj1_p+( z+;zQ0-M0p=`iB3ZP!DP!#-7P>qC`>U#fgzQ75q%IptY!t{@3;bVjP0hr?i4`x=+fq ztfMc-nTVp_`c;l-EII9HG?j@p!u;>}ibuCf17*^bMjxR59=@k5Ui(epO&nwm7c!72 z-V~k=hp7_C?b-`_*0)O zWvxXQH+dfKKAMLKDWaND#!6Q2AfqhPuqaM!upwx3zw1zZKc%NWtd^L~zO=+mnhG&Fm!38kciq*WjQfDTv5r?M7jLku%|( zVik7^WtcgF7;}o%Xrgr!#tR?K(WZ6n6maS^oZ&J{LNJbDP^w#l4IAw>ePPBH-E-^I z!&e54yYBqt#iVWgMTSVKU}ZaupCfV&eOetTe=R=lZ_0nt?<(<|m!YLJDkalzZyN4! zF2gqLX{=G?&+>{oQg&lVs9{yBJwctS76o&ctV1C4>{KuW$qA&i?nd(t*&LIsz*;(| zLb6(A$y*;yLL^e3&8H>1T0|5^($Wa3LK%$FT& z@;YjzM?WhUygVjzm*;;M#HUY_`Jt44>GX?>?(mQXc8;s11B_2kFy^ErXFz7H3O%sw zPyKHd>;@|}R^o3+=Jva-kOgr8=^e6O`UT6+i z{b}W5l04?OBr*o2v7P;-xExGZJe8cSna^v^5Gyh|khY$04kU7yP%bHHdZPZHa(3DI z47Rmx(SmwNY+)%l7EKTP+Qh=+p7 zQp6gQ3jg&x6HglY(2Y|tKjDbxlf@mHO%h?nL=fiYR3jN2;hayJfV1J#7gIs(((RNkaUe@LWX7R%cWl z{H;FLhBCp9oB&(f7xlW4H#A+OcKypObFL@JFiJa!j8kC!l&nd{k(5^Dmm;J%(p<0S zx)U;+WHjd{BR@{4AVpuiLHe!s9Y+ji8ZN3Yped8}LxR%c zGUrUSDBkQ#1d!frb=nfpH_k@+v~mjA3cq)y|2!YYoPp|SPBg&N%8m-L&o8&ZZ`jzp zWjZIg?!>3FiTT0$d1HCyiLD_>1Iw~HyvZ)n>cQD|l){9+*=%;e__Gs;j0h!k(+zOOv%#1|&)P zYZYT2A@K1w?NMfO6c!$jOQn)95d_ZnEuy1XYthRWa8k4L`0?~ zY2;n~?S>pgQf#g3VjEPi10*WBd~3OtKt_jVXmNSv7zCdA!uqfD7hLKn7IIes#l?&L z8RK4CKig>t$-+IX@2jP6y@ihvB<0GGPKZ*AmYfSDC`xoV%2jLorL=Fygu56k8H_nx zCP21^#_hZahUXv-K@AUN%D;-EZaV!VQ;#9HmeNibZKJOq`5hUuROhJcGE}25%(D}; z8o!w=*+v;t3Wuk{1(8y&Q2h+F zDQat7_(yM0*SOR z+{6Tx9&o6V<0I~06e!v-e#V0yoyy(8Gk`#mu8B0H6#c@?I>XbYaS(xU^I=K)4%6K@#0jGnPk%JFd=R-;Kfg8o(FiI9-kj7(YanK!~ z@S7f={6~)FIP<+P`h$&^WDoqsVz$D2K~8Z!0pNjnt=zZSk3CPeOF#8TjFp-15jz_G zQ2)DcSv&aP3ROuSp3R}P{#HuCE_sXop;;1*TTbqzmo=i2#wwlMLmT!RRbewa%AiSK zEKrs~RHc)~>JafmR>z@2tbO|Rz0AwwU%9+yoBMC2^5N?h0PS8=sL|%L$|=|g!%Q30r(u*fNs=_6mZBg0kz<7gzrR2$FUaWe7UYC7^gs^YFk#zFf z0J59h`L7`$@Ps<3WJ_-+xnX)2ni#$x&rBht*wuF;QJ_bpYDkI;iYI4gt7@e~=2Ive z6qcs9l0fMG-FY~8yg7V)o8dCq%CeAwPH|X<+P3}4w(P>EH#TeIa>HEd53J=-RL6J2_k1y_4v_#uDIQA0iC#yR zzj+|+Zgyvg7`wKqKBO?=Y6m@=>3&o!;ygUPHo0F0Y-=O)nUwH(nS^71w{^Sd)fUS* z0uf4{Q6YB!&3a(KK(^*Pg|pv$M1R-{J?H|S`EMjXD1gHtl|xZZZtt^0A5?AC^-92- zMfWrMn=o38GpN>k&WB|?b6^HgPXNz{T&T@=!x_kafn4)@=xV=MTr)iU_qY8#LTEVr zFBlR6UGNTLRuIepLW2G2vg?;AV3W>Y1qgkRzqUg>>;wpDhi>wcPfoCV^M9(MlV z0M`JR2EGydfh_DdpvIi8uS*h)ot;?~xxzSLEtNV3>J`sR@ND}w9@#&U#&*Sh+0zj< z?;{}J%u347&V0GClO}-jWiGFLGx*K2lXQ0>*wa6tV8x zhX9gE<@JE;K;Ky{i@dO>l-tmXIc6&~(=Q5gWb&$jM+E#~-vN@TV%iVv9ESRQ4+-1< zMAJh+_}pKPhyl2)L=2A69FT1V{IRfQ6!~j!G8So0n{1A%)<@XU#`a~ z5=f<0Z8y5{f$|i3NaOpwX#;ptkh&iiWq}N~9_ee`5>xsv-=-yBJELt?*()Yl)rD_r z;t3j)_@cst*2K<^rc);XZ4w!rrw<hKK%=5YattYa}#F0?2~9Ta%jj$muEm)Lu5e-DCZ_LwE|a`>+A1Pj=1F57PvKJ=JC zi8{B)A4q4L?LUx+iNzHN{F3jBRo8KZ1=E|L1LT_61UR%@u!ML2aiN=!1VK=rP7m;G zwNA)u(trw^P=x%m!@dRrLfG+V&yy^RdVt;#XNnmsRTTUS`pA_E7X6>nOQTLuzV|fv z>DKA({&%=u#WEn{ae9$KJtT-7&Y1Z5*yLrJp%sowI~AnWXQA4KElaj~f?4mc3xs&p zsEA0KsfU>!=$6G!kiUl+fe`gOfPjW=dkO?3sRIOmr9d#Td7v6Ix~uCgohaJ z12}flWImw{&}4$OOAE8;Nhvd0PMg383UQ(a*8&S!~(Ux z&zreKUw~%Up*sqg4UfvCxORia@m-fh=L~aJ8Yd>6>!;y54Y@sX#K$CQpq$j3DRk(a_jPu9wx!6FA`-t!h)D zBKS4{&&s7YH1)*acCAoTSFt&6oF5a4r2fT}*i2;PibKS<$xt>DpN|aI)H>;Yd`loa zvmR@;1%^M4C3AuJQ^4I5QA{}|xsurDkVXdO*fEpGJ>_=tBy`IVG$~X!FRR!M-<`>G z@oD|-U%pLOmluYunu(MO8&CqSWHBh;d-|F}blMzDShEc0uPVYmL0C*+ciO{X=N@?x zan2TueHD7c8^z;)|LKBt--JNA22IT40_R}RgG2(Q-{B0KkjoQNb@jsbmfF3Te63F# z#_iu>(zy+3$W8<`y7$$<7n8*IkxY;hJFKAhsl2c?ee_Uwz6vYit>GKV$co2K&;zkU z_nV1sw<9D82Fbq;i-HufWU;el>{c42j5ySG2Lh-T%=6p00Y`T6>!QCrn-2=RI1EXk zB&Vg$*VR{5^-r^Td=VbIez;#0a)q_hHTCsJN7+uD{)jL7=FFVXxhl#qAKu`d0_^p- z1frl8oSd8-i0#FIzuQ;j;eiExK-?P_*8)50=poh1QyB6iuV2>*rv3Wm*0p#|)4*VCD&uQgOiVO!6)bWl%ZLH^ z`=`+%qx5)kHo>bN&~YcTQurl7M-MW29nEM_eHYYmpF|b5^ZkXE?(>U_t*!0eMjWc| zzw?Uqjn_3(uh+?4>8(`U_Yq{=>xHlWWYc2)BmvI<*mr#1{rF$zhZsBm2=(Mer$v1K z?sT!vg7VLgzpEigQSeDzFvP{K#P$7DP1aC?+BT|F9;BQJkJEvS1r;y)G+ zakCt#g=n?RrIq~>TPB{PXEcJN<$h7C@Ax5P%2hZI#RQ|NMj8N#V3|lTm<8|8b&kI` zIbvzW1-uSmG`?#v`&~m&;nOHos6x)(qE22f!G_Is@$qE}dXlF3-t%JP(RT=3US8~- z)abN39l}vB(E^s7e9srBTpmAOr?~Uc{d-mag{+=ZpEVRmj10Bon$Z9)_428q)pZEe z0Cu&7IMdJS>1B7S8+ndh<$C5=eO6!(8O@Cys*az_n#U6f@!SdMe(9k3|y3%}~S z!#YRdmM(kLtJhYT`X(%*;YJ2fO+(M2HV}5I2{hV|rb^+R_Vt?6Y~orq%Kio@^t-^C z&ggsNpziA81`H+nJn!s1S8zl75L-H1j|Wp=%wkS$-dkCVs+fqs#Nnw=!|rrcJt%`M;PZ@7i@li`@~S_xllp^y4dmbk}+~ zJXPtU=<`k%@$SD(1w}MS-HzwQ>)N;yK>@ztn!CR-xGvymPNFrE+@{Kh+P#hj6R>Gb zN~*GLV&(NHFS-ViyDvD|6lB;*i9jZ$jozs=`SOASl36`rur`(pPKPh(ZTs(^<4CA0 z8kL%>>n2~SM9{ur;V6X$HLQtL}mn_iO{mS8L@Ou}u-|mfjZ+8-# z=XX;z5j1G-nVroYC=j^EL#wNm!K3*4T}|{?Iy>f3n5IZN3q-KkL8&`-7+0O5l3!-M z2d)@VP0NH-(q|&L`V zz89DX@r;m^PFXJBXV$2TkvI<;mkNAkMnhAz@65-+vvr5iH+MKWF7n3j2L?AVdq7?U z|LY?{-W}w}>4+62m;&ljjQ6~8ZzAaQ@0xxJ%hyyHbe|>{*G%AydPr@0nI9(%{WeZ9 z)8t1861m?Y)&9FBKNB%gQYNgGx0IIQrE1_7LzqAbSu`_2k*lw#Hq`%8uOp%z9kx3C zN1h_bgfqv;!{hsZL(o{ehsEDNgEc(2eh(x_Qsi>`6T$Td>~yA0!}ID}%<@!MSML@5 zb<5>#2^X81vSO>6SYf1zN1&vP#V4onU${eYsrjwIs_+TBUpMAOA(KHc1oe#q_&GlGzvhUjUK~ZSrgqpe91YIGLry)Ivm{rcK4+ z`e?j_$%$Pth~U8wheIqcFJm+uqN=KdjVE-H&Y?BAMOT-llH3s@)S(^=LTWPyR@>Bs z3P zH5~Rk;LD+fJE6lur(uC*!jyqYy;u+>H~pT)Vv)>8tEv(lamtC%QUL+eR+C(5i*X|q zO3G(7JTFoRTvZj;PM+9fh0OUeQ}GtcIDzwUbiBoR(s>i=uqm_Sf+(DF&Jz_TztHkR zRy&<=Ze;er9(6HKlMXa}m1(9?O}^<+TiINIMgF@BpTD-K7pNBtOvzv|amN#gDWo@u zhG3*~I)HRhQr`$&Ju)9c3b`p=@ZKW|^DXK7c@|IvV5$AcHG!IxZMr&mGpZA4m?&$S zAC$3Z6(ugd@}VCUF^EIvpeolf8umLRF^r}~gVlETj55@UKzc1XCATG9k>F)*aKxaY zz>PvYS|Wih<_k<`GXfDsEb4`{$`?%yL$wPSps4FbhEpol56$iNAp&)S5ObcaPaDp= zI27aFCrrwX!IexRS~yi83d(Rn_t#m>&=^ReFl`KyY&N+ilwWitsHeh+Bg^IT^KdK3 zQk7WjcBu-=;V&N;#@d9s>)^;4jF4&u7FA{C&}8p3Z5kPn`Tp9GlY8C^()|)APC5(| z9$rA#(3!0JhHlsunf|9dtxw|U%S|kw)tv1RL1~0@$Dbg6hjVn_`)~4^c zmKe494#HSi>6gQF&V9MB&2<_v)Km&a{2pz`=mDL`PSZ=dOTdL|7O@0LdTUqL+@Z)0 zvYIiM=O-w>emdwpMF?e4qAYugz@%i&`u#!MtBg*bepQLNA1}n+t!>=B_uG7nsC-n* z*@~9B@_zOr9s#u($Zt$F`1!?W6Zg={+uFscm<{X25j5@z`*r%qlLqBjs=ZFVn#i_l z39@5`c30I>M#KOM%Jq{EGrc%$$B#Up>Y;TDiJdSlNZ&M=OeXmHH^0I4>(_CAXQw^S z`?$nL{qWEN7;Ohzs6%l-hgV_ob)H!}z((~sd&YAB#?rE|{x%m~?dIDWXWL~L`?&~r ztg-iyvbwIi>N)lN#10k!`}|wa3o{YDX!WJbW4fEt<&a>~ZjU||Q~_*vcNd$Ro4E1K zH~9MNudzFsWRv*)Cgs0*sP6atPG8o}i{cwyh~?@t_nUzItdZlleNT5G?q}_+USRC7 z>RLxqJ7IHnaZ^{`^nf zi$|j&#-mZPj*b!0L23y;1QfY)j@;t07FEAWTx;(!nND%@=1ttba~pqjP5!_CGaL-C zw6uh(-^1$aD$YJ~21kw@X*ryjuJn{T9QENL`hdt*$=zaBmoKe}NUf+%hp<#I($USH z1NIL*7OiZw=eF!bjJn&i-+x(lx=RaY?1LexX8k+5F1-8wo^CspU#13E@%(YbT9zda z9Xf>54?m32c$8q>R3NXL8pFW=1#@v(qpK_mjK^avFD(nk`;>F&R}~&wUzadcS1@%& zRi6Zo3K?1wDJb2m&<%Y#>=g^zWS^6mY01ZpJ<3ErN#Bl&SP&I9xN{k|Cteu~e%m-q z$7D~y5}lA-#4Fhwo3D1WcRcLq$^Sojr{(;Q58Ym`hm}KzaP0VTvBd%&%@GJoLsQk3 z`|lw}6xJdjieO?kxiD}{FcKSTpis0+-XNhN0Yy@^;Z&+n@4cbctWTtQfYPp_Eb(AE zJuqWI2(VNO66F~0#Vv@{c9T-DMdJga_h?kzK+-QBS5Y96Emu`l;!&Xc@sVY#d;tYGHXL2+4-`BHcuYA}*>iOG`Yx6oZW`uG$~l z(8gk^-KK7+;1&g9YLut|BC<4)D(o<>yzKRW5YjU$NGfj#tv<^lf_!r===%y|P%>wk zY6haztDu-t^odaf3IZ(>t~Q&Pzqe1Y+QKIKtjb z@3hxTz2CwjhRg$~7YhJZY@l;Q0RqM3LSRiNIg3kjZ@jnrR zWNTs75s=%dY2;9aLVQi8Q$bsKsv0}uwd=54?4Md;DWs2k$Rx(fM5w`_kLh#@V+>Xft-$=?Z~rDDYLuA6^70|{`+aiEfJ{i? z99&t-snn2!Zd2E=>|kjOeDtX2$t^{nP~#p`Bp8je+5xX_|z@Vw>9#5E>636JdpAc{~YOcncW_4^p~D>zqVZM7ohSk^k}?aE?Qmcop@lTcWB zl{*of%xtM#j3iC6qDc1BwvY%YG!5o;4a@mIay`+jXigV09jWXZlU!v1U}tytz>FoW zKQA)j1(TwZBb2m1^Kf!!$-u%mgFc}%1EQFO@@M(r3FBT!#9~#{#pD=6?_ct9<;;`% z<&adNYa`Cz%aKmten08jal{xxz`c8$>4Gr^g;NTu+`qkd@1Cf;YUx~^KXS+}5LoWv zs{EZXsv>+ z=CoG5){f(wQBZzLM_uXwyxHjaIhxV((aeE1>OE-2A5XZLR>XWctgNgYn6a?LH-l1G z07auH+fr)T?uvB>bn#3ZhHBO1ZcB^>Ei|scD8`;sMh<$tXnlc1qCyMNsrRL3*6CE2 z*HBSaeJKhs&Nu5tlgS+wdV+F`5c(sZTv8PbWGvWZ^w7>umWF0#4?Spt&f1O)v_;`! zhT-Z8s&Zb*${nHQHknau$&I8YEqdO_8aKeOQy}hBz%wlc7NK8q51mi0$xn;i3J` zIjm6PgqnF)QdO8AxF98u^k7ytY1OM*erOHl_k4RdzR4(~7*N-ZL~PUPLTH-S*p~d1 zMzIASMEW@>cNVR3tHUMvx~k4|VJ#9hk{wgT{?`~7r`kBAo=Op!9EMq`$B6icbry5Q z56{rvI^XIh&6|&@itEYxD)@xF5(sF=LfWd9Pp>Sc_E9)Thi$^&vs@R)v5pqIMyF*M zGDsxRNUcSBx6WZ}d;7qQg*Q%1t4+ynH%gU<*>$XX>*(i&X{b^tUe`g{Rr6%sdiSYz`-z2LZ+CW{49IwbE?5(cb6;|~bfO6jH+#(`38?2 zy)?!dcTaQy$Ak=z%}$(*-Hv<|9%hdmmz>J121BU{=WVSQNH>bc zC07E1d#?*69 zoZmsycoCiG%4l14Y3Z7YQBh^GfU>Rk)nzyGjqa5kw7{!vJJRTC477adIF(S{h@keN b_a6TRGctMk(JbZ&00000NkvXXu0mjfk0`(Z literal 0 HcmV?d00001 diff --git a/plugins/stk/voices/percflute/logo.png b/plugins/stk/voices/percflute/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..20a6081015e8b76b4f4e96a40f8c624e5aaeb64c GIT binary patch literal 890 zcmV-=1BLvFP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4z z76CcTyF*|A00R0+L_t(&-tCuNXpUhR$N&4;%#hD~)Mm=ph7?Eh5h2az5iw502@WWx zq!cx3lBBlQlF|+okrS-pz)qMrkPvp_YcU@+8_TfWuaoPor^oAkpNIFrbpPw=eeUc2 z-~a2rp8LM9>wcww5H&S5In~wGIqI*dtE=n3llSoO@bK{P@bK{HKltU|4U|aQENPLX z5=p})B_w^6)GDb(Qlq5X&bb6|L(;N8@cmiR2OX`#~DrpbRZIGk}NgE{f zN!lIk90Jq>eLy0@Gsecfi^vZ@H$#(KZ}w}cq6NkQcZ|~stdOK!>&%yQUDA9>PbAe! zYL@g;Qjesek|s);Eorf&DbBeMlH{Blm%`b2NpB^6a?Xv6xFYlHw+xuRuikEHr zU{c`x?Mo+e1X!EF(P-d-iS13p+i0B2F$>tk-}JAxtk?@I$+Tzh0o#D7K%Q-xQeY48 z#yF3Ff;1C4YP`cS3)rbNoT@;IElfq|ig^9Ko9V6;sG#d&7O<@u&egSK1_biLgz5H` z&)XO7uqEpTo&y(w3LrPagxbx~ + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "engine.h" +#include "note_play_handle.h" + +#include "percflute_instrument.h" +#include "percflute_instrument_view.h" +#include "percflute_processor.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embedded_resources.h" + + +extern "C" +{ + +plugin::descriptor percflute_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "Perc Flute", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Flute noises" ), + "Danny McRae ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + +percfluteInstrument::percfluteInstrument( instrumentTrack * _channel_track ): + stkInstrument( _channel_track, &percflute_plugin_descriptor ) +{ + model()->index()->setTrack( _channel_track ); + model()->crossfade()->setTrack( _channel_track ); + model()->lfoSpeed()->setTrack( _channel_track ); + model()->lfoDepth()->setTrack( _channel_track ); + model()->adsrTarget()->setTrack( _channel_track ); +} + + + + +percfluteInstrument::~percfluteInstrument() +{ +} + + + + +QString percfluteInstrument::nodeName( void ) const +{ + return( percflute_plugin_descriptor.name ); +} + + + + +pluginView * percfluteInstrument::instantiateView( QWidget * _parent ) +{ + return( new percfluteInstrumentView( this, _parent ) ); +} + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( model * _model, void * _data ) +{ + return( new percfluteInstrument( static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/stk/voices/percflute/percflute_instrument.h b/plugins/stk/voices/percflute/percflute_instrument.h new file mode 100644 index 000000000..2db4e5e3a --- /dev/null +++ b/plugins/stk/voices/percflute/percflute_instrument.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _PERCFLUTE_INSTRUMENT_H +#define _PERCFLUTE_INSTRUMENT_H + +#include "stk_instrument.h" + +#include "percflute_processor.h" +#include "percflute_model.h" + + +class percfluteInstrument : public stkInstrument +{ +public: + percfluteInstrument( instrumentTrack * _channel_track ); + virtual ~percfluteInstrument( void ); + + QString nodeName( void ) const; + + pluginView * instantiateView( QWidget * _parent ); +}; + +#endif diff --git a/plugins/stk/voices/percflute/percflute_instrument_view.cpp b/plugins/stk/voices/percflute/percflute_instrument_view.cpp new file mode 100644 index 000000000..0d03c66b2 --- /dev/null +++ b/plugins/stk/voices/percflute/percflute_instrument_view.cpp @@ -0,0 +1,110 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include +#include +#include + +#include "percflute_instrument_view.h" + +#include +#include + +#include "engine.h" +#include "gui_templates.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +percfluteInstrumentView::percfluteInstrumentView( percfluteInstrument * _instrument, QWidget * _parent ) : + stkInstrumentView( _instrument, _parent ) +{ + QVBoxLayout * vl = new QVBoxLayout( m_topView ); + QHBoxLayout * h1 = new QHBoxLayout(); + QHBoxLayout * h2 = new QHBoxLayout(); + QHBoxLayout * h3 = new QHBoxLayout(); + + + m_index = new knob( knobSmall_17, m_topView, tr( "Index" ) ); + m_index->setLabel( tr( "Modulator Index" ) ); + m_index->setHintText( tr( "Index:" ) + " ", "" ); + + m_crossfade = new knob( knobSmall_17, m_topView, tr( "Crossfade" ) ); + m_crossfade->setLabel( tr( "Modulator Crossfade" ) ); + m_crossfade->setHintText( tr( "Crossfade:" ) + " ", "" ); + + m_lfoSpeed = new knob( knobSmall_17, m_topView, tr( "LFO Speed" ) ); + m_lfoSpeed->setLabel( tr( "LFO Speed" ) ); + m_lfoSpeed->setHintText( tr( "LFO Speed:" ) + " ", "" ); + + m_lfoDepth = new knob( knobSmall_17, m_topView, tr( "LFO Depth" ) ); + m_lfoDepth->setLabel( tr( "LFO Depth" ) ); + m_lfoDepth->setHintText( tr( "LFO Depth:" ) + " ", "" ); + + m_adsrTarget = new knob( knobSmall_17, m_topView, tr( "ADSR Target" ) ); + m_adsrTarget->setLabel( tr( "ADSR Target" ) ); + m_adsrTarget->setHintText( tr( "ADSR Target:" ) + " ", "" ); + + h1->addWidget( m_index ); + h1->addWidget( m_crossfade ); + + h2->addWidget( m_lfoSpeed ); + h2->addWidget( m_lfoDepth ); + + h3->addWidget( m_adsrTarget ); + + vl->addLayout( h1 ); + vl->addLayout( h2 ); + vl->addLayout( h3 ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); +} + + + + +percfluteInstrumentView::~percfluteInstrumentView() +{ +} + + + + +void percfluteInstrumentView::modelChanged( void ) +{ + stkInstrumentView::modelChanged(); + + percfluteInstrument * inst = castModel(); + m_index->setModel( inst->model()->index() ); + m_crossfade->setModel( inst->model()->crossfade() ); + m_lfoSpeed->setModel( inst->model()->lfoSpeed() ); + m_lfoDepth->setModel( inst->model()->lfoDepth() ); + m_adsrTarget->setModel( inst->model()->adsrTarget() ); +} + + + diff --git a/plugins/stk/voices/percflute/percflute_instrument_view.h b/plugins/stk/voices/percflute/percflute_instrument_view.h new file mode 100644 index 000000000..c4bdc6194 --- /dev/null +++ b/plugins/stk/voices/percflute/percflute_instrument_view.h @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _PERCFLUTE_INSTRUMENT_VIEW_H +#define _PERCFLUTE_INSTRUMENT_VIEW_H + +#include "knob.h" + +#include "stk_instrument_view.h" +#include "percflute_instrument.h" + + +class percfluteInstrumentView: public stkInstrumentView +{ +public: + percfluteInstrumentView( percfluteInstrument * _instrument, QWidget * _parent ); + virtual ~percfluteInstrumentView( void ); + +private: + virtual void modelChanged( void ); + + knob * m_index; + knob * m_crossfade; + knob * m_lfoSpeed; + knob * m_lfoDepth; + knob * m_adsrTarget; +}; + +#endif diff --git a/plugins/stk/voices/percflute/percflute_model.cpp b/plugins/stk/voices/percflute/percflute_model.cpp new file mode 100644 index 000000000..7eef710f6 --- /dev/null +++ b/plugins/stk/voices/percflute/percflute_model.cpp @@ -0,0 +1,88 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "percflute_model.h" + + +percfluteModel::percfluteModel( bool _monophonic, + StkFloat _portamento, + StkFloat _bend, + StkFloat _bend_range, + bool _velocity_sensitive_lpf, + StkFloat _velocity_sensitive_q, + StkFloat _volume, + StkFloat _pan, + StkFloat _spread, + StkFloat _index, + StkFloat _crossfade, + StkFloat _lfo_speed, + StkFloat _lfo_depth, + StkFloat _adsr_target ): + stkModel( _monophonic, _portamento, _bend, _bend_range, _velocity_sensitive_lpf, _velocity_sensitive_q, _volume, _pan, _spread ), + m_index( new floatModel( _index, 0.0f, 128.0f, 0.1f, this ) ), + m_crossfade( new floatModel( _crossfade, 0.0f, 128.0f, 0.1f, this ) ), + m_lfoSpeed( new floatModel( _lfo_speed, 0.0f, 128.0f, 0.1f, this ) ), + m_lfoDepth( new floatModel( _lfo_depth, 0.0f, 128.0f, 0.1f, this ) ), + m_adsrTarget( new floatModel( _adsr_target, 0.0f, 128.0f, 0.1f, this ) ) +{ +} + + + + +percfluteModel::~percfluteModel() +{ + delete m_index; + delete m_crossfade; + delete m_lfoSpeed; + delete m_lfoDepth; + delete m_adsrTarget; +} + + + + +void FASTCALL percfluteModel::saveSettings( QDomDocument & _doc, QDomElement & _parent ) +{ + stkModel::saveSettings( _doc, _parent ); + m_index->saveSettings( _doc, _parent, "index" ); + m_crossfade->saveSettings( _doc, _parent, "crossfade" ); + m_lfoSpeed->saveSettings( _doc, _parent, "lfospeed" ); + m_lfoDepth->saveSettings( _doc, _parent, "lfodepth" ); + m_adsrTarget->saveSettings( _doc, _parent, "adsrtarget" ); +} + + + + +void FASTCALL percfluteModel::loadSettings( const QDomElement & _this ) +{ + stkModel::loadSettings( _this ); + m_index->loadSettings( _this, "index" ); + m_crossfade->loadSettings( _this, "crossfade" ); + m_lfoSpeed->loadSettings( _this, "lfospeed" ); + m_lfoDepth->loadSettings( _this, "lfodepth" ); + m_adsrTarget->loadSettings( _this, "adsrtarget" ); +} + diff --git a/plugins/stk/voices/percflute/percflute_model.h b/plugins/stk/voices/percflute/percflute_model.h new file mode 100644 index 000000000..5d4c62112 --- /dev/null +++ b/plugins/stk/voices/percflute/percflute_model.h @@ -0,0 +1,86 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _PERCFLUTE_MODEL_H +#define _PERCFLUTE_MODEL_H + +#include "stk_model.h" + + +class percfluteModel: public stkModel +{ +public: + percfluteModel( bool _monophonic = FALSE, + StkFloat _portamento = 0.0f, + StkFloat _bend = 0.0f, + StkFloat _bend_range = 2.0f, + bool _velocity_sensitive_lpf = TRUE, + StkFloat _velocity_sensitive_q = 0.5f, + StkFloat _volume = 1.0f, + StkFloat _pan = 0.0f, + StkFloat _spread = 0.0f, + StkFloat _index = 64.0f, + StkFloat _crossfade = 64.0f, + StkFloat _lfo_speed = 64.0f, + StkFloat _lfo_depth = 64.0f, + StkFloat _adsr_target = 64.0f ); + ~percfluteModel(); + + inline floatModel * index( void ) const + { + return( m_index ); + } + + inline floatModel * crossfade( void ) const + { + return( m_crossfade ); + } + + inline floatModel * lfoSpeed( void ) + { + return( m_lfoSpeed ); + } + + inline floatModel * lfoDepth( void ) const + { + return( m_lfoDepth ); + } + + inline floatModel * adsrTarget( void ) const + { + return( m_adsrTarget ); + } + + void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _parent ); + + void FASTCALL loadSettings( const QDomElement & _this ); + +private: + floatModel * m_index; + floatModel * m_crossfade; + floatModel * m_lfoSpeed; + floatModel * m_lfoDepth; + floatModel * m_adsrTarget; +}; + +#endif diff --git a/plugins/stk/voices/percflute/percflute_processor.cpp b/plugins/stk/voices/percflute/percflute_processor.cpp new file mode 100644 index 000000000..74bae72fe --- /dev/null +++ b/plugins/stk/voices/percflute/percflute_processor.cpp @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include "percflute_processor.h" +#include "config_mgr.h" + + +percfluteProcessor::percfluteProcessor( sample_rate_t _sample_rate ): + stkProcessor( _sample_rate ) +{ +} + + + + +percfluteProcessor::~percfluteProcessor() +{ +} + + + + +void percfluteProcessor::setControls( percfluteModel * _model ) +{ + voice()->controlChange( 2, _model->index()->value() ); + voice()->controlChange( 4, _model->crossfade()->value() ); + voice()->controlChange( 11, _model->lfoSpeed()->value() ); + voice()->controlChange( 1, _model->lfoDepth()->value() ); + voice()->controlChange( 128, _model->adsrTarget()->value() ); + m_delayRead = m_delayWrite - static_cast( _model->spread()->value() ); +} diff --git a/plugins/stk/voices/percflute/percflute_processor.h b/plugins/stk/voices/percflute/percflute_processor.h new file mode 100644 index 000000000..19e5ab507 --- /dev/null +++ b/plugins/stk/voices/percflute/percflute_processor.h @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _PERCFLUTE_PROCESSOR_H +#define _PERCFLUTE_PROCESSOR_H + +#include "PercFlut.h" + +#include "stk_processor.h" + +#include "percflute_model.h" + +class percfluteProcessor: public stkProcessor +{ +public: + percfluteProcessor( sample_rate_t _sample_rate ); + ~percfluteProcessor( void ); + + void setControls( percfluteModel * _model ); +}; + +#endif diff --git a/plugins/stk/voices/resonate/Makefile.am b/plugins/stk/voices/resonate/Makefile.am new file mode 100644 index 000000000..58fe47db2 --- /dev/null +++ b/plugins/stk/voices/resonate/Makefile.am @@ -0,0 +1,46 @@ +AUTOMAKE_OPTIONS = foreign 1.4 + + +INCLUDES = -I@stk_includes@ -I$(top_srcdir)/include -I$(top_srcdir)/src/lib -I. -I$(top_srcdir)/plugins/stk/voices/include + + +AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="resonate" + + +%.moc: ./%.h + $(MOC) -o $@ $< + + +MOC_FILES = ./resonate_model.moc + +BUILT_SOURCES = $(MOC_FILES) ./embedded_resources.h +EMBEDDED_RESOURCES = $(wildcard *png) + +./embedded_resources.h: $(EMBEDDED_RESOURCES) + $(BIN2RES) $(EMBEDDED_RESOURCES) > $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES = libresonate.la + +libresonate_la_SOURCES = resonate_model.cpp \ + resonate_model.h \ + resonate_processor.cpp \ + resonate_processor.h \ + resonate_instrument.cpp \ + resonate_instrument.h \ + resonate_instrument_view.cpp \ + resonate_instrument_view.h \ + $(top_srcdir)/plugins/stk/voices/src/stk_model.cpp \ + stk_model.h + + + +libresonate_la_LDFLAGS = -L@stk_lib@ -lstk -Wl,-export-dynamic + +$(libresonate_la_SOURCES): ./embedded_resources.h diff --git a/plugins/stk/voices/resonate/artwork.png b/plugins/stk/voices/resonate/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..5d4eb3877a87b757c47adc55d5a96e4a81fd99dd GIT binary patch literal 71786 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 + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "engine.h" +#include "note_play_handle.h" + +#include "resonate_instrument.h" +#include "resonate_instrument_view.h" +#include "resonate_processor.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embedded_resources.h" + + +extern "C" +{ + +plugin::descriptor resonate_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "Resonate", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Filered noise" ), + "Danny McRae ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + +resonateInstrument::resonateInstrument( instrumentTrack * _channel_track ): + stkInstrument( _channel_track, &resonate_plugin_descriptor ) +{ + model()->resonanceFrequency()->setTrack( _channel_track ); + model()->poleRadii()->setTrack( _channel_track ); + model()->notchFrequency()->setTrack( _channel_track ); + model()->zeroRadii()->setTrack( _channel_track ); +} + + + + +resonateInstrument::~resonateInstrument() +{ +} + + + + +QString resonateInstrument::nodeName( void ) const +{ + return( resonate_plugin_descriptor.name ); +} + + + + +pluginView * resonateInstrument::instantiateView( QWidget * _parent ) +{ + return( new resonateInstrumentView( this, _parent ) ); +} + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( model * _model, void * _data ) +{ + return( new resonateInstrument( static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/stk/voices/resonate/resonate_instrument.h b/plugins/stk/voices/resonate/resonate_instrument.h new file mode 100644 index 000000000..5024241bd --- /dev/null +++ b/plugins/stk/voices/resonate/resonate_instrument.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _RESONATE_INSTRUMENT_H +#define _RESONATE_INSTRUMENT_H + +#include "stk_instrument.h" + +#include "resonate_processor.h" +#include "resonate_model.h" + + +class resonateInstrument : public stkInstrument +{ +public: + resonateInstrument( instrumentTrack * _channel_track ); + virtual ~resonateInstrument( void ); + + QString nodeName( void ) const; + + pluginView * instantiateView( QWidget * _parent ); +}; + +#endif diff --git a/plugins/stk/voices/resonate/resonate_instrument_view.cpp b/plugins/stk/voices/resonate/resonate_instrument_view.cpp new file mode 100644 index 000000000..ca31572e8 --- /dev/null +++ b/plugins/stk/voices/resonate/resonate_instrument_view.cpp @@ -0,0 +1,100 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include +#include +#include + +#include "resonate_instrument_view.h" + +#include +#include + +#include "engine.h" +#include "gui_templates.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +resonateInstrumentView::resonateInstrumentView( resonateInstrument * _instrument, QWidget * _parent ) : + stkInstrumentView( _instrument, _parent ) +{ + QVBoxLayout * vl = new QVBoxLayout( m_topView ); + QHBoxLayout * h1 = new QHBoxLayout; + QHBoxLayout * h2 = new QHBoxLayout; + + m_resonanceFrequency = new knob( knobSmall_17, m_topView, tr( "Resonance" ) ); + m_resonanceFrequency->setLabel( tr( "Resonance Frequency" ) ); + m_resonanceFrequency->setHintText( tr( "Frequency:" ) + " ", "" ); + + m_poleRadii = new knob( knobSmall_17, m_topView, tr( "Pole Radii" ) ); + m_poleRadii->setLabel( tr( "Pole Radii" ) ); + m_poleRadii->setHintText( tr( "Radii:" ) + " ", "" ); + + m_notchFrequency = new knob( knobSmall_17, m_topView, tr( "Notch" ) ); + m_notchFrequency->setLabel( tr( "Notch Frequency" ) ); + m_notchFrequency->setHintText( tr( "Frequency:" ) + " ", "" ); + + m_zeroRadii = new knob( knobSmall_17, m_topView, tr( "Zero Radii" ) ); + m_zeroRadii->setLabel( tr( "Zero Radii" ) ); + m_zeroRadii->setHintText( tr( "Radii:" ) + " ", "" ); + + h1->addWidget( m_resonanceFrequency ); + h1->addWidget( m_poleRadii ); + + h2->addWidget( m_notchFrequency ); + h2->addWidget( m_zeroRadii ); + + vl->addLayout( h1 ); + vl->addLayout( h2 ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); +} + + + + +resonateInstrumentView::~resonateInstrumentView() +{ +} + + + + +void resonateInstrumentView::modelChanged( void ) +{ + stkInstrumentView::modelChanged(); + + resonateInstrument * inst = castModel(); + m_resonanceFrequency->setModel( inst->model()->resonanceFrequency() ); + m_poleRadii->setModel( inst->model()->poleRadii() ); + m_notchFrequency->setModel( inst->model()->notchFrequency() ); + m_zeroRadii->setModel( inst->model()->zeroRadii() ); +} + + + diff --git a/plugins/stk/voices/resonate/resonate_instrument_view.h b/plugins/stk/voices/resonate/resonate_instrument_view.h new file mode 100644 index 000000000..811455283 --- /dev/null +++ b/plugins/stk/voices/resonate/resonate_instrument_view.h @@ -0,0 +1,50 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _RESONATE_INSTRUMENT_VIEW_H +#define _RESONATE_INSTRUMENT_VIEW_H + +#include "knob.h" + +#include "stk_instrument_view.h" +#include "resonate_instrument.h" + + +class resonateInstrumentView: public stkInstrumentView +{ +public: + resonateInstrumentView( resonateInstrument * _instrument, QWidget * _parent ); + virtual ~resonateInstrumentView( void ); + +private: + virtual void modelChanged( void ); + + knob * m_resonanceFrequency; + knob * m_poleRadii; + knob * m_notchFrequency; + knob * m_zeroRadii; +}; + +#endif diff --git a/plugins/stk/voices/resonate/resonate_model.cpp b/plugins/stk/voices/resonate/resonate_model.cpp new file mode 100644 index 000000000..cc7a383f3 --- /dev/null +++ b/plugins/stk/voices/resonate/resonate_model.cpp @@ -0,0 +1,83 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "resonate_model.h" + + +resonateModel::resonateModel( bool _monophonic, + StkFloat _portamento, + StkFloat _bend, + StkFloat _bend_range, + bool _velocity_sensitive_lpf, + StkFloat _velocity_sensitive_q, + StkFloat _volume, + StkFloat _pan, + StkFloat _spread, + StkFloat _resonance_frequency, + StkFloat _pole_radii, + StkFloat _notch_frequency, + StkFloat _zero_radii ): + stkModel( _monophonic, _portamento, _bend, _bend_range, _velocity_sensitive_lpf, _velocity_sensitive_q, _volume, _pan, _spread ), + m_resonanceFrequency( new floatModel( _resonance_frequency, 0.0f, 128.0f, 0.1f, this ) ), + m_poleRadii( new floatModel( _pole_radii, 0.0f, 128.0f, 0.1f, this ) ), + m_notchFrequency( new floatModel( _notch_frequency, 0.0f, 128.0f, 0.1f, this ) ), + m_zeroRadii( new floatModel( _zero_radii, 0.0f, 128.0f, 0.1f, this ) ) +{ +} + + + + +resonateModel::~resonateModel() +{ + delete m_resonanceFrequency; + delete m_poleRadii; + delete m_notchFrequency; + delete m_zeroRadii; +} + + + + +void FASTCALL resonateModel::saveSettings( QDomDocument & _doc, QDomElement & _parent ) +{ + stkModel::saveSettings( _doc, _parent ); + m_resonanceFrequency->saveSettings( _doc, _parent, "resonancefrequency" ); + m_poleRadii->saveSettings( _doc, _parent, "poleradii" ); + m_notchFrequency->saveSettings( _doc, _parent, "notchfrequency" ); + m_zeroRadii->saveSettings( _doc, _parent, "zeroradii" ); +} + + + + +void FASTCALL resonateModel::loadSettings( const QDomElement & _this ) +{ + stkModel::loadSettings( _this ); + m_resonanceFrequency->loadSettings( _this, "resonancefrequency" ); + m_poleRadii->loadSettings( _this, "poleradii" ); + m_notchFrequency->loadSettings( _this, "notchfrequency" ); + m_zeroRadii->loadSettings( _this, "zeroradii" ); +} + diff --git a/plugins/stk/voices/resonate/resonate_model.h b/plugins/stk/voices/resonate/resonate_model.h new file mode 100644 index 000000000..bf2b648ee --- /dev/null +++ b/plugins/stk/voices/resonate/resonate_model.h @@ -0,0 +1,79 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _RESONATE_MODEL_H +#define _RESONATE_MODEL_H + +#include "stk_model.h" + + +class resonateModel: public stkModel +{ +public: + resonateModel( bool _monophonic = FALSE, + StkFloat _portamento = 0.0f, + StkFloat _bend = 0.0f, + StkFloat _bend_range = 2.0f, + bool _velocity_sensitive_lpf = TRUE, + StkFloat _velocity_sensitive_q = 0.5f, + StkFloat _volume = 1.0f, + StkFloat _pan = 0.0f, + StkFloat _spread = 0.0f, + StkFloat _resonance_frequency = 64.0f, + StkFloat _pole_radii = 64.0f, + StkFloat _notch_frequency = 64.0f, + StkFloat _zero_radii = 64.0f ); + ~resonateModel(); + + inline floatModel * resonanceFrequency( void ) const + { + return( m_resonanceFrequency ); + } + + inline floatModel * poleRadii( void ) const + { + return( m_poleRadii ); + } + + inline floatModel * notchFrequency( void ) const + { + return( m_notchFrequency ); + } + + inline floatModel * zeroRadii( void ) const + { + return( m_zeroRadii ); + } + + void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _parent ); + + void FASTCALL loadSettings( const QDomElement & _this ); + +private: + floatModel * m_resonanceFrequency; + floatModel * m_poleRadii; + floatModel * m_notchFrequency; + floatModel * m_zeroRadii; +}; + +#endif diff --git a/plugins/stk/voices/resonate/resonate_processor.cpp b/plugins/stk/voices/resonate/resonate_processor.cpp new file mode 100644 index 000000000..6a1e86fe8 --- /dev/null +++ b/plugins/stk/voices/resonate/resonate_processor.cpp @@ -0,0 +1,50 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include "resonate_processor.h" +#include "config_mgr.h" + + +resonateProcessor::resonateProcessor( sample_rate_t _sample_rate ): + stkProcessor( _sample_rate ) +{ +} + + + + +resonateProcessor::~resonateProcessor() +{ +} + + + + +void resonateProcessor::setControls( resonateModel * _model ) +{ + voice()->controlChange( 2, _model->resonanceFrequency()->value() ); + voice()->controlChange( 4, _model->poleRadii()->value() ); + voice()->controlChange( 11, _model->notchFrequency()->value() ); + voice()->controlChange( 1, _model->zeroRadii()->value() ); + m_delayRead = m_delayWrite - static_cast( _model->spread()->value() ); +} diff --git a/plugins/stk/voices/resonate/resonate_processor.h b/plugins/stk/voices/resonate/resonate_processor.h new file mode 100644 index 000000000..1ad005825 --- /dev/null +++ b/plugins/stk/voices/resonate/resonate_processor.h @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _RESONATE_PROCESSOR_H +#define _RESONATE_PROCESSOR_H + +#include "Resonate.h" + +#include "stk_processor.h" + +#include "resonate_model.h" + +class resonateProcessor: public stkProcessor +{ +public: + resonateProcessor( sample_rate_t _sample_rate ); + ~resonateProcessor( void ); + + void setControls( resonateModel * _model ); +}; + +#endif diff --git a/plugins/stk/voices/rhodey/Makefile.am b/plugins/stk/voices/rhodey/Makefile.am new file mode 100644 index 000000000..b00bba26a --- /dev/null +++ b/plugins/stk/voices/rhodey/Makefile.am @@ -0,0 +1,46 @@ +AUTOMAKE_OPTIONS = foreign 1.4 + + +INCLUDES = -I@stk_includes@ -I$(top_srcdir)/include -I$(top_srcdir)/src/lib -I. -I$(top_srcdir)/plugins/stk/voices/include + + +AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="rhodey" + + +%.moc: ./%.h + $(MOC) -o $@ $< + + +MOC_FILES = ./rhodey_model.moc + +BUILT_SOURCES = $(MOC_FILES) ./embedded_resources.h +EMBEDDED_RESOURCES = $(wildcard *png) + +./embedded_resources.h: $(EMBEDDED_RESOURCES) + $(BIN2RES) $(EMBEDDED_RESOURCES) > $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES = librhodey.la + +librhodey_la_SOURCES = rhodey_model.cpp \ + rhodey_model.h \ + rhodey_processor.cpp \ + rhodey_processor.h \ + rhodey_instrument.cpp \ + rhodey_instrument.h \ + rhodey_instrument_view.cpp \ + rhodey_instrument_view.h \ + $(top_srcdir)/plugins/stk/voices/src/stk_model.cpp \ + stk_model.h + + + +librhodey_la_LDFLAGS = -L@stk_lib@ -lstk -Wl,-export-dynamic + +$(librhodey_la_SOURCES): ./embedded_resources.h diff --git a/plugins/stk/voices/rhodey/artwork.png b/plugins/stk/voices/rhodey/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..75b6a353a356909094d735e74a367fba87099f66 GIT binary patch literal 71756 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 N002ovPDHLkV1lXHuM+?O literal 0 HcmV?d00001 diff --git a/plugins/stk/voices/rhodey/logo.png b/plugins/stk/voices/rhodey/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..20a6081015e8b76b4f4e96a40f8c624e5aaeb64c GIT binary patch literal 890 zcmV-=1BLvFP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4z z76CcTyF*|A00R0+L_t(&-tCuNXpUhR$N&4;%#hD~)Mm=ph7?Eh5h2az5iw502@WWx zq!cx3lBBlQlF|+okrS-pz)qMrkPvp_YcU@+8_TfWuaoPor^oAkpNIFrbpPw=eeUc2 z-~a2rp8LM9>wcww5H&S5In~wGIqI*dtE=n3llSoO@bK{P@bK{HKltU|4U|aQENPLX z5=p})B_w^6)GDb(Qlq5X&bb6|L(;N8@cmiR2OX`#~DrpbRZIGk}NgE{f zN!lIk90Jq>eLy0@Gsecfi^vZ@H$#(KZ}w}cq6NkQcZ|~stdOK!>&%yQUDA9>PbAe! zYL@g;Qjesek|s);Eorf&DbBeMlH{Blm%`b2NpB^6a?Xv6xFYlHw+xuRuikEHr zU{c`x?Mo+e1X!EF(P-d-iS13p+i0B2F$>tk-}JAxtk?@I$+Tzh0o#D7K%Q-xQeY48 z#yF3Ff;1C4YP`cS3)rbNoT@;IElfq|ig^9Ko9V6;sG#d&7O<@u&egSK1_biLgz5H` z&)XO7uqEpTo&y(w3LrPagxbx~ + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "engine.h" +#include "note_play_handle.h" + +#include "rhodey_instrument.h" +#include "rhodey_instrument_view.h" +#include "rhodey_processor.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embedded_resources.h" + + +extern "C" +{ + +plugin::descriptor rhodey_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "Rhodey", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Rhodes noises" ), + "Danny McRae ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + +rhodeyInstrument::rhodeyInstrument( instrumentTrack * _channel_track ): + stkInstrument( _channel_track, &rhodey_plugin_descriptor ) +{ + model()->index()->setTrack( _channel_track ); + model()->crossfade()->setTrack( _channel_track ); + model()->lfoSpeed()->setTrack( _channel_track ); + model()->lfoDepth()->setTrack( _channel_track ); + model()->adsrTarget()->setTrack( _channel_track ); +} + + + + +rhodeyInstrument::~rhodeyInstrument() +{ +} + + + + +QString rhodeyInstrument::nodeName( void ) const +{ + return( rhodey_plugin_descriptor.name ); +} + + + + +pluginView * rhodeyInstrument::instantiateView( QWidget * _parent ) +{ + return( new rhodeyInstrumentView( this, _parent ) ); +} + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( model * _model, void * _data ) +{ + return( new rhodeyInstrument( static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/stk/voices/rhodey/rhodey_instrument.h b/plugins/stk/voices/rhodey/rhodey_instrument.h new file mode 100644 index 000000000..4fdfa7b8d --- /dev/null +++ b/plugins/stk/voices/rhodey/rhodey_instrument.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _RHODEY_INSTRUMENT_H +#define _RHODEY_INSTRUMENT_H + +#include "stk_instrument.h" + +#include "rhodey_processor.h" +#include "rhodey_model.h" + + +class rhodeyInstrument : public stkInstrument +{ +public: + rhodeyInstrument( instrumentTrack * _channel_track ); + virtual ~rhodeyInstrument( void ); + + QString nodeName( void ) const; + + pluginView * instantiateView( QWidget * _parent ); +}; + +#endif diff --git a/plugins/stk/voices/rhodey/rhodey_instrument_view.cpp b/plugins/stk/voices/rhodey/rhodey_instrument_view.cpp new file mode 100644 index 000000000..34a204cd7 --- /dev/null +++ b/plugins/stk/voices/rhodey/rhodey_instrument_view.cpp @@ -0,0 +1,110 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include +#include +#include + +#include "rhodey_instrument_view.h" + +#include +#include + +#include "engine.h" +#include "gui_templates.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +rhodeyInstrumentView::rhodeyInstrumentView( rhodeyInstrument * _instrument, QWidget * _parent ) : + stkInstrumentView( _instrument, _parent ) +{ + QVBoxLayout * vl = new QVBoxLayout( m_topView ); + QHBoxLayout * h1 = new QHBoxLayout(); + QHBoxLayout * h2 = new QHBoxLayout(); + QHBoxLayout * h3 = new QHBoxLayout(); + + + m_index = new knob( knobSmall_17, m_topView, tr( "Index" ) ); + m_index->setLabel( tr( "Modulator Index" ) ); + m_index->setHintText( tr( "Index:" ) + " ", "" ); + + m_crossfade = new knob( knobSmall_17, m_topView, tr( "Crossfade" ) ); + m_crossfade->setLabel( tr( "Modulator Crossfade" ) ); + m_crossfade->setHintText( tr( "Crossfade:" ) + " ", "" ); + + m_lfoSpeed = new knob( knobSmall_17, m_topView, tr( "LFO Speed" ) ); + m_lfoSpeed->setLabel( tr( "LFO Speed" ) ); + m_lfoSpeed->setHintText( tr( "LFO Speed:" ) + " ", "" ); + + m_lfoDepth = new knob( knobSmall_17, m_topView, tr( "LFO Depth" ) ); + m_lfoDepth->setLabel( tr( "LFO Depth" ) ); + m_lfoDepth->setHintText( tr( "LFO Depth:" ) + " ", "" ); + + m_adsrTarget = new knob( knobSmall_17, m_topView, tr( "ADSR Target" ) ); + m_adsrTarget->setLabel( tr( "ADSR Target" ) ); + m_adsrTarget->setHintText( tr( "ADSR Target:" ) + " ", "" ); + + h1->addWidget( m_index ); + h1->addWidget( m_crossfade ); + + h2->addWidget( m_lfoSpeed ); + h2->addWidget( m_lfoDepth ); + + h3->addWidget( m_adsrTarget ); + + vl->addLayout( h1 ); + vl->addLayout( h2 ); + vl->addLayout( h3 ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); +} + + + + +rhodeyInstrumentView::~rhodeyInstrumentView() +{ +} + + + + +void rhodeyInstrumentView::modelChanged( void ) +{ + stkInstrumentView::modelChanged(); + + rhodeyInstrument * inst = castModel(); + m_index->setModel( inst->model()->index() ); + m_crossfade->setModel( inst->model()->crossfade() ); + m_lfoSpeed->setModel( inst->model()->lfoSpeed() ); + m_lfoDepth->setModel( inst->model()->lfoDepth() ); + m_adsrTarget->setModel( inst->model()->adsrTarget() ); +} + + + diff --git a/plugins/stk/voices/rhodey/rhodey_instrument_view.h b/plugins/stk/voices/rhodey/rhodey_instrument_view.h new file mode 100644 index 000000000..607c3697b --- /dev/null +++ b/plugins/stk/voices/rhodey/rhodey_instrument_view.h @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _RHODEY_INSTRUMENT_VIEW_H +#define _RHODEY_INSTRUMENT_VIEW_H + +#include "knob.h" + +#include "stk_instrument_view.h" +#include "rhodey_instrument.h" + + +class rhodeyInstrumentView: public stkInstrumentView +{ +public: + rhodeyInstrumentView( rhodeyInstrument * _instrument, QWidget * _parent ); + virtual ~rhodeyInstrumentView( void ); + +private: + virtual void modelChanged( void ); + + knob * m_index; + knob * m_crossfade; + knob * m_lfoSpeed; + knob * m_lfoDepth; + knob * m_adsrTarget; +}; + +#endif diff --git a/plugins/stk/voices/rhodey/rhodey_model.cpp b/plugins/stk/voices/rhodey/rhodey_model.cpp new file mode 100644 index 000000000..472d03291 --- /dev/null +++ b/plugins/stk/voices/rhodey/rhodey_model.cpp @@ -0,0 +1,88 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "rhodey_model.h" + + +rhodeyModel::rhodeyModel( bool _monophonic, + StkFloat _portamento, + StkFloat _bend, + StkFloat _bend_range, + bool _velocity_sensitive_lpf, + StkFloat _velocity_sensitive_q, + StkFloat _volume, + StkFloat _pan, + StkFloat _spread, + StkFloat _index, + StkFloat _crossfade, + StkFloat _lfo_speed, + StkFloat _lfo_depth, + StkFloat _adsr_target ): + stkModel( _monophonic, _portamento, _bend, _bend_range, _velocity_sensitive_lpf, _velocity_sensitive_q, _volume, _pan, _spread ), + m_index( new floatModel( _index, 0.0f, 128.0f, 0.1f, this ) ), + m_crossfade( new floatModel( _crossfade, 0.0f, 128.0f, 0.1f, this ) ), + m_lfoSpeed( new floatModel( _lfo_speed, 0.0f, 128.0f, 0.1f, this ) ), + m_lfoDepth( new floatModel( _lfo_depth, 0.0f, 128.0f, 0.1f, this ) ), + m_adsrTarget( new floatModel( _adsr_target, 0.0f, 128.0f, 0.1f, this ) ) +{ +} + + + + +rhodeyModel::~rhodeyModel() +{ + delete m_index; + delete m_crossfade; + delete m_lfoSpeed; + delete m_lfoDepth; + delete m_adsrTarget; +} + + + + +void FASTCALL rhodeyModel::saveSettings( QDomDocument & _doc, QDomElement & _parent ) +{ + stkModel::saveSettings( _doc, _parent ); + m_index->saveSettings( _doc, _parent, "index" ); + m_crossfade->saveSettings( _doc, _parent, "crossfade" ); + m_lfoSpeed->saveSettings( _doc, _parent, "lfospeed" ); + m_lfoDepth->saveSettings( _doc, _parent, "lfodepth" ); + m_adsrTarget->saveSettings( _doc, _parent, "adsrtarget" ); +} + + + + +void FASTCALL rhodeyModel::loadSettings( const QDomElement & _this ) +{ + stkModel::loadSettings( _this ); + m_index->loadSettings( _this, "index" ); + m_crossfade->loadSettings( _this, "crossfade" ); + m_lfoSpeed->loadSettings( _this, "lfospeed" ); + m_lfoDepth->loadSettings( _this, "lfodepth" ); + m_adsrTarget->loadSettings( _this, "adsrtarget" ); +} + diff --git a/plugins/stk/voices/rhodey/rhodey_model.h b/plugins/stk/voices/rhodey/rhodey_model.h new file mode 100644 index 000000000..9be409fb7 --- /dev/null +++ b/plugins/stk/voices/rhodey/rhodey_model.h @@ -0,0 +1,86 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _RHODEY_MODEL_H +#define _RHODEY_MODEL_H + +#include "stk_model.h" + + +class rhodeyModel: public stkModel +{ +public: + rhodeyModel( bool _monophonic = FALSE, + StkFloat _portamento = 0.0f, + StkFloat _bend = 0.0f, + StkFloat _bend_range = 2.0f, + bool _velocity_sensitive_lpf = TRUE, + StkFloat _velocity_sensitive_q = 0.5f, + StkFloat _volume = 1.0f, + StkFloat _pan = 0.0f, + StkFloat _spread = 0.0f, + StkFloat _index = 64.0f, + StkFloat _crossfade = 64.0f, + StkFloat _lfo_speed = 64.0f, + StkFloat _lfo_depth = 64.0f, + StkFloat _adsr_target = 64.0f ); + ~rhodeyModel(); + + inline floatModel * index( void ) const + { + return( m_index ); + } + + inline floatModel * crossfade( void ) const + { + return( m_crossfade ); + } + + inline floatModel * lfoSpeed( void ) + { + return( m_lfoSpeed ); + } + + inline floatModel * lfoDepth( void ) const + { + return( m_lfoDepth ); + } + + inline floatModel * adsrTarget( void ) const + { + return( m_adsrTarget ); + } + + void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _parent ); + + void FASTCALL loadSettings( const QDomElement & _this ); + +private: + floatModel * m_index; + floatModel * m_crossfade; + floatModel * m_lfoSpeed; + floatModel * m_lfoDepth; + floatModel * m_adsrTarget; +}; + +#endif diff --git a/plugins/stk/voices/rhodey/rhodey_processor.cpp b/plugins/stk/voices/rhodey/rhodey_processor.cpp new file mode 100644 index 000000000..64a220ccf --- /dev/null +++ b/plugins/stk/voices/rhodey/rhodey_processor.cpp @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include "rhodey_processor.h" +#include "config_mgr.h" + + +rhodeyProcessor::rhodeyProcessor( sample_rate_t _sample_rate ): + stkProcessor( _sample_rate ) +{ +} + + + + +rhodeyProcessor::~rhodeyProcessor() +{ +} + + + + +void rhodeyProcessor::setControls( rhodeyModel * _model ) +{ + voice()->controlChange( 2, _model->index()->value() ); + voice()->controlChange( 4, _model->crossfade()->value() ); + voice()->controlChange( 11, _model->lfoSpeed()->value() ); + voice()->controlChange( 1, _model->lfoDepth()->value() ); + voice()->controlChange( 128, _model->adsrTarget()->value() ); + m_delayRead = m_delayWrite - static_cast( _model->spread()->value() ); +} diff --git a/plugins/stk/voices/rhodey/rhodey_processor.h b/plugins/stk/voices/rhodey/rhodey_processor.h new file mode 100644 index 000000000..77dc26069 --- /dev/null +++ b/plugins/stk/voices/rhodey/rhodey_processor.h @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _RHODEY_PROCESSOR_H +#define _RHODEY_PROCESSOR_H + +#include "Rhodey.h" + +#include "stk_processor.h" + +#include "rhodey_model.h" + +class rhodeyProcessor: public stkProcessor +{ +public: + rhodeyProcessor( sample_rate_t _sample_rate ); + ~rhodeyProcessor( void ); + + void setControls( rhodeyModel * _model ); +}; + +#endif diff --git a/plugins/stk/voices/src/stk_model.cpp b/plugins/stk/voices/src/stk_model.cpp new file mode 100644 index 000000000..1bc8d042d --- /dev/null +++ b/plugins/stk/voices/src/stk_model.cpp @@ -0,0 +1,122 @@ +/* + * stk_model.cpp - base class for stk instrument models + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include "stk_model.h" + + +stkModel::stkModel( bool _monophonic, + StkFloat _portamento, + StkFloat _bend, + StkFloat _bend_range, + bool _velocity_sensitive_lpf, + StkFloat _velocity_sensitive_q, + StkFloat _volume, + StkFloat _pan, + bool _release_triggered, + bool _randomize_attack, + StkFloat _randomize_length, + StkFloat _randomize_velocity_amount, + StkFloat _randomize_frequency_amount, + StkFloat _spread ): + model( NULL ), + m_monophonic( new boolModel( _monophonic, this ) ), + m_portamento( new floatModel( _portamento, 0.0f, 1000.0f, 1.0f, this ) ), + m_bend( new floatModel( _bend, -4096.0f, 4096.0f, 8.192f, this ) ), + m_bendRange( new floatModel( _bend_range, 0.0f, 24.0f, 0.24f, this ) ), + m_velocitySensitiveLPF( new boolModel( _velocity_sensitive_lpf, this ) ), + m_velocitySensitiveQ( new floatModel( _velocity_sensitive_q, basicFilters<>::minQ(), 10.0f, 0.01f, this ) ), + m_volume( new floatModel( _volume, 0.0f, 1.0f, 0.01f, this ) ), + m_pan( new floatModel( _pan, -1.0f, 1.0f, 0.02f, this ) ), + m_releaseTriggered( new boolModel( _release_triggered, this ) ), + m_randomizeAttack( new boolModel( _randomize_attack, this ) ), + m_randomizeLength( new floatModel( _randomize_length, 0.0f, 1000.0f, 1.0f, this ) ), + m_randomizeVelocityAmount( new floatModel( _randomize_velocity_amount, 0.0f, 1.0f, 0.01f, this ) ), + m_randomizeFrequencyAmount( new floatModel( _randomize_frequency_amount, 0.0f, 4.0f, 0.04f, this ) ), + m_spread( new floatModel( _spread, 0.0f, 255.0f, 1.0f, this ) ) +{ +} + + + + +stkModel::~stkModel() +{ + delete m_portamento; + delete m_bend; + delete m_bendRange; + delete m_velocitySensitiveLPF; + delete m_velocitySensitiveQ; + delete m_volume; + delete m_pan; + delete m_releaseTriggered; + delete m_randomizeAttack; + delete m_randomizeVelocityAmount; + delete m_randomizeFrequencyAmount; + delete m_spread; +} + + + + +void FASTCALL stkModel::saveSettings( QDomDocument & _doc, QDomElement & _parent ) +{ + m_monophonic->saveSettings( _doc, _parent, "monophonic" ); + m_portamento->saveSettings( _doc, _parent, "portamento" ); + m_bend->saveSettings( _doc, _parent, "bend" ); + m_bendRange->saveSettings( _doc, _parent, "bendrange" ); + m_velocitySensitiveLPF->saveSettings( _doc, _parent, "velocitysensitivelpf" ); + m_velocitySensitiveQ->saveSettings( _doc, _parent, "velocitysensitiveq" ); + m_volume->saveSettings( _doc, _parent, "volume" ); + m_pan->saveSettings( _doc, _parent, "pan" ); + m_releaseTriggered->saveSettings( _doc, _parent, "releasetriggered" ); + m_randomizeAttack->saveSettings( _doc, _parent, "randomizeattack" ); + m_randomizeLength->saveSettings( _doc, _parent, "randomizelength" ); + m_randomizeVelocityAmount->saveSettings( _doc, _parent, "randomizevelocityamount" ); + m_randomizeFrequencyAmount->saveSettings( _doc, _parent, "randomizefrequencyamount" ); + m_spread->saveSettings( _doc, _parent, "spread" ); +} + + + + +void FASTCALL stkModel::loadSettings( const QDomElement & _this ) +{ + m_monophonic->loadSettings( _this, "monophonic" ); + m_portamento->loadSettings( _this, "portamento" ); + m_bend->loadSettings( _this, "bend" ); + m_bendRange->loadSettings( _this, "bendrange" ); + m_velocitySensitiveLPF->loadSettings( _this, "velocitysensitivelpf" ); + m_velocitySensitiveQ->loadSettings( _this, "velocitysensitiveq" ); + m_volume->loadSettings( _this, "volume" ); + m_pan->loadSettings( _this, "pan" ); + m_releaseTriggered->loadSettings( _this, "releasetriggered" ); + m_randomizeAttack->loadSettings( _this, "randomizeattack" ); + m_randomizeLength->loadSettings( _this, "randomizelength" ); + m_randomizeVelocityAmount->loadSettings( _this, "randomizevelocityamount" ); + m_randomizeFrequencyAmount->loadSettings( _this, "randomizefrequencyamount" ); + m_spread->loadSettings( _this, "spread" ); +} + + diff --git a/plugins/stk/voices/tubebell/Makefile.am b/plugins/stk/voices/tubebell/Makefile.am new file mode 100644 index 000000000..cb68f3b4b --- /dev/null +++ b/plugins/stk/voices/tubebell/Makefile.am @@ -0,0 +1,46 @@ +AUTOMAKE_OPTIONS = foreign 1.4 + + +INCLUDES = -I@stk_includes@ -I$(top_srcdir)/include -I$(top_srcdir)/src/lib -I. -I$(top_srcdir)/plugins/stk/voices/include + + +AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="tubebell" + + +%.moc: ./%.h + $(MOC) -o $@ $< + + +MOC_FILES = ./tubebell_model.moc + +BUILT_SOURCES = $(MOC_FILES) ./embedded_resources.h +EMBEDDED_RESOURCES = $(wildcard *png) + +./embedded_resources.h: $(EMBEDDED_RESOURCES) + $(BIN2RES) $(EMBEDDED_RESOURCES) > $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES = libtubebell.la + +libtubebell_la_SOURCES = tubebell_model.cpp \ + tubebell_model.h \ + tubebell_processor.cpp \ + tubebell_processor.h \ + tubebell_instrument.cpp \ + tubebell_instrument.h \ + tubebell_instrument_view.cpp \ + tubebell_instrument_view.h \ + $(top_srcdir)/plugins/stk/voices/src/stk_model.cpp \ + stk_model.h + + + +libtubebell_la_LDFLAGS = -L@stk_lib@ -lstk -Wl,-export-dynamic + +$(libtubebell_la_SOURCES): ./embedded_resources.h diff --git a/plugins/stk/voices/tubebell/artwork.png b/plugins/stk/voices/tubebell/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..0ff9d1e97ddcd1ebc4d9942d982e0616bcbab7f6 GIT binary patch literal 71446 zcmXt91yCGIw_YT;Ltt@t2@u@f-66PhA-KD{ySoP`xCVC(8r%s4cYVWO^$M0PhGl1` zr~91GIzmZ75*Yyx0R#deOG}BV0MAb!4>%a$XZWcOKkx+Mq#`K-s+l4<27ZAtmX#C( zy?=b=ca<`YmX;TXU512&grPDk(k1{75ju-&Ig8qT z|88dM3=(xTGjcXFC2_NIwj@!rG$WCemRCAArL+ZsNI=qJ!fNiT6J6GIC7RkyPtlh# z=d5-ozQEEKgYDq^h|+#~ zql*;LCx?Rso5UY-7t#baVXLc?!a+g{gQ}ZeqE!%dtku**n349+hrq>Fk<3Wwp`?|S zBFb1-u%HG8Q8ehQw@wNDZ`!FN*979qBPUPR(Eh-yudS*R%y5%cq!OV)Xu~Y4|L)Wq zvENo+d&bXkLP@KdW^~9S$&$@z&!?vgXb`|Ara3aSYU-5d!{?LJ83tcsO)RSuN@+nP z(io4p0F#PM7)@8E}C@cPoNlU)~)Eif9n_JYq@U z_P9;8LlJ}&ru%fF_@NLB)kl4= zrk~sb-=|LQdWPSpYbQ_kmi7*(-NwK{m6dz<4{e7Yu@Xh3g44CbUNvt=ac|{xkr?V` zW&vi}WHS&Ad_furlwC&3SPdB-sicKr)%i*~8+@PgMX-iJdMYJYcrl^g_9jSGO%0ac zv`s5`<&3b}!%{l>l~PMOz~U&?Kf(UM$4o7;u_YJ=#|=CBuRTL{#x3e#nFWls%d-lD zW<)ELNM{0GbfsZ|Te#w_@1%^SIjQ3=`1tHS>S2(gA~ml@#3$(7edN9Mpj0n>fH-}g zbl9e=B}9sZe1uOks&zRC7xT-M)gdfB8aWStqlW~}5He^kwazRelBxAw`{Ak{{XYt1 zu%`h>vA4&=_2nnv9iveUUfAS~s#9DVFn6b?ylPWY*(szU30tox4QzUs^R>SfR5D~Y zvd!p>=I(n0kjywfK6u0oncP3?h{8h5vAIk~AxAtj8?!y=Lke}QW0UhWS)>dOJ%#>h zoas%~m;&b3P*)poybdka1}O;C%z1{PIkT$$lSEo669u@0*?gp z83^b6`i_pM%E~n(I8ika8)GvK!t$85m|A?E(Kz04LZ@K9p`1U-jFJpF92*tp9UY5D zoCu0jW+_diNawfQ!>hU=5}~355;&wezLZ-tZ3$FWVXF`ZS(e;r2^qXhUpUqPn{HSrWZjWWS9G@0~*lnK25bZ=GBi2QqfXlMwi zTT~ENe7jyICVU*q?3qT7u>(K8(}MyI2Uoc8A`#>){VO?$&Kgr_s$D|soKcpmhg;cU zSGnQT8r)vEfdxn~eB{iNo|h+CHZOq&K0Q0@tAhm=_989@%?475S>tzLYQlJIS9PF3 zE>{N5;e`sw3D@om*oXA~Moqyf9*wMz`MFp)Yx!FPH^rStP|RUtxJx1Rl9ZkWFXnH& zlyIk-Ha5)|h64t1A`N6-c&^J{2ux|Th3Lg zbfOX%H=iLV;N;fx=>B>6&mYmA&0%-Gp{FOF=9U%~qBu(Lbw8A4xW~glf+oKY-(I}y}|4_6K~{W!LCVdWq~ORT+|$cA);>t*mm7SZtbPjxE9@??=*GpR(e zzOQd+1RAN$!76y_?1b$aKUcUt+Fl>w4!^%_Dp@TzOnD3>3BhkDrC?LO;(z-O#pA)n zI;w`EsSR(j?|mpWn>?f!Y}uy)+$*c<;E>KmvRamq1_n^;(ymfo*Xx^iR-RpIDI850 z(-lE8Mp{&&h+Q?-PYp+KRN;UjbMMd)%v26<*!AJ`?$!P{Ffjdw%;`LJHobQSfBjDS zUh48LdtPLp&L6v8)BN7e-i6Pv`}Muvmr?|%&(~A*E#B|5CaKKL&6&S`4RS3D8VvcQ zmi!kyg&Nr)CXK2J3&Br;T+*avi?Rtl07t$@mxrLeOvW0%9R&L(j2|Nb7tMPVz=Gj= z^$E?eANs0*O&rys1NobFvN$bFpN7WO6Pv7F?hh=;>RHz)r z9G|?M^NNJDu`xuZCnxpTt)+Lwn08HB6TjoScX8peoOeIZE zI2+2*gk>%1>qK!y7W~YFe5YwlxV5phHU9n`d0OC^fynR0LATW&qDx;f8zCrb(i}5K z0k*NRaR<&Dsy8(B+GHx?HLpTg2)U&6%OBskuJZ$-g!<-1ng6!&9sCG=)wc5dh#Q%Q z#A|^^3oFr ze=$`EH`B&)rqQceIk~+!>3KVOw?(|IkMlt)nw8?PU?qZ*Y3m%-ksIQM34%ClJ0u!# zh(`6j2y&c_Dik6ZhL&8++HvHF^8bYfi4L{Tr>Ko(*|Lg}gGHo-O^J*UL=VyPf&dA{ zO=V9sJLk)W2Y-{m zNJh)PXOuQ}WR+mD!wRM0FZ(=vsb)KUo^tr9iqS}x9vuFoJQ)r$W+r&#YU1k=CEYh^ zH9oUmrCQwo@MO0Hh4azH>#LG3;{xq7pkOs-ZQb^m5YalCnkb1^CCML!AMvl>DUl%j zM@`B6MJz?Ia&Ki4p{0ug4s*RwKy{s+(U6r^a#Wbha{-tHB3GKn0R#>Nyv)<> zL8CPFP1p{JBUJn1vEI6AO~p6)$;ofYDs@94?UW^iCL+>BBz;p;Qvm#cNvvv`qR~td z{g#pv4v{F@5&kQcvZ~p#Nyl*;?0+pAczTQb%e*d@T!`rxi~S%8Ierxh+|0?X{o9KN z-`%pw!`ppN+%Ll|vJ?rZae8_#=OeV#w6uEQ17>94vSrD$;mL>n)%1st5%a+4QyCbA ziGY~on=XL**K44|drl39MIQ+Xv8$Y{aAih!1*s&I50yS67cv2W2x$xtMFr~5{(*02 zUe523usVpnlX-)%R4b!b*3Uh8hmUHw@%I7raK0WhI#I42F$!h7beK15u5NBXwKiNv z6jNp(_7~;s*%;3~dOi2+(S7=5=vQg95EH6mIgCmwZOnZk6f&j*z$4)A zPKQ$vAPo(TQXxtRs?O|5RNhz5vbfK`HJF8z_f%731fje@-PzHc4}unuyE2CAA!J{m zty?n}ckorKvoDpDls2wehe!ZeBH%@k$NS4r2TPni4|1%8@W##vOvVNiIbOT5Ki-IB zmHKOSZhI{_U-0#2{^72rCk8mPbk2Qm02G(^12YN%mp?EoCnhHg*8elQ?S-hSsVQ8s z8MFSzLme&4mNi-NBv_j=js4y;-M>|P>3*t5hFBdF{6IkWm8$P~C^Uc860TG&<+IE; zg#XU)5%pW*%=WZn8K!|Hu{Owr0H)(!EfkW*S*mT6U0HFmZ>|eZl)4j9)ltFzw8+WH zk`c`UMnZ=Ukc|ogC9!=jGEAhXV2sxsb}H{^)JH?Bv}YG@KSJfdK?7|)T<)f4Wr-`N zf^T5m&%HLID5NhE;=Bj;xk0Nuz4mN(ah0o|Cd0AY6B%Dy-`}3= zo0~&P;Oxg4Tei+R&P&%8LX>td!J7|5oEJw$aWZcXTfGo#4#R}*3-kv2C_mu$++I4P zIVY#v2v7=?_F|ot3;HbCB+P~#^B+i}heRo)MHl;WTN^&-mj$%X1Pfj@wGyb$>tNYf z>9GeRq2N=D9)gOsBblQCyyBdbf|AApQAm^elKg80&m&Cl_;i)O9Ap>Q< zeY1Fn-F@G6zRkP&h~nz%nxEV^Hil5sb*DqX>x%T_$B!!upkyE-B5G-C3zyBK_p{)| zCBzQXRQ2ub}}On-wEDqF9Jq5rR26xkgQhw-|@iLK1 zO&L_#*ElVJ2>O^}`*hgWX)xr>6{|K>&6iE|E%YSy>3 zP-AmVJH3qeydXvv_FDU1vBMRi;e62_FnGT;kPV+Um==8J6S!}iHsT`Kxvll%PgVgy z3)6WO-JUqpBSUM=-xSI_6YbaK*_ zWIJ}=)?RKw!ix&5CtdN4s5bHBVY~xt#z;X;WdKN3mno(YF3EW(Mf!6gP3i4`<74|e z)8f+7B`{TtEi7P-z&kSqqOAv+*7m1IEDTJHh4aVx>$cSObk5HccGr5nd^J*8t8&mG6TjiG%fIBd|ZFg(yRLj0u>NYZQ1m3%$e8CO}Ug#Br( zQY_U%q9&GET%I@O?$s{sN3f_wRp=sDeAz{eOiaeEt|;Q#h9)LZAZ9SqMRQ9R za;^IyeLMwx_gz!%wo~3S!Bj4Pl)>A+!O-0uhrrWp93*Jt?XG3FG|RT{<%KV@VL;Vl zdS{pTo$Ku}?;Y1|-32E^ujcLBJQ`trh_tAG=ztvKWNmAQzoDw^E&f%_ zN?NpL^(nH7%Uo~ei+v-ldn-zH<+|xQ+AQg-!qYbdgvVsX-dU*lVfzA~b>eMUrF<=s z%G-mba!vS%OaRdGQ873;IcIG+9CilaKaj=8Y`wZ-#fzZ=nuh(ug;7;i6-g{6ymC~b zSlQPg2HAvC+_8pULuL{1qAn7L#wqfv1yJ2f!G14~kB3|cTYr^P&6ugga&e?GktH8Q z^x_l~O)F0kLH*lG;a|0LNoP#4;2K81T5vUHtDs=YsM8^dLJ!qL_RsiimZ^L#Vn!1E zxyon}{oS9Y5}JCOS#VONs#>p)v-=X+`#pks#O-<~4Pe(=WcPkbJ zO+(xLVGggiOS{YUCR$orLX9f}vqh2)FAoj?G6KYiXbE!I_BrwWuYdqSl@zg;-g!vH zrV1+ELJQCgRmTgc;6~~`bS7FALY!6n0{ zLX|B?Wt=Z(m=DDW7E9=mVvO#?u~+dvWk3?muber#zxb`HxI0%O3y%4q{UZ%X|6ISR ztWiW#h_L=s$YN+k#MM(cbHtKB%*f5e;U-jy>FOf#>>^5}_%*jfCUYXdW^l8=Z-ynV zPr3>pN|g4vd%X?Yf9EJjF7v-HE`40~MXzvr9n7$em2vanL<3pc$_x(HX+QQ2{4QI1e@`fvD|_cOSx}~n0*>kUT-u@J2LF4 z>7fV?JBuce1e{GJDkdLv4|QZ9R%@T(3_+S<@A z3*=5!$9-*9FoBSTaw2K0ewmfjh4INjhQUqu!811*{m=fu9$5_{c5 zF5#lt^#5ED0zuUphz?l4*zl0y8Eve}(rp43%Ue;Tw?R;R7SjThLb{C$iRX6TZ6QH5 zJ#U_DS&WC;;aZmuCUMGd-O&nVj5zNP?87ClBR5Ou-uE3>JnHJwY!}<8ep-B}l8D-= z?T)F7t)0FZRX>WpYp7GQ&oan{Kn!iuI;F1%#SA<-{>!Myp<>2p#x^5mXki%l-O~9l z`AxDhl|q_=!L5Y-euC;)jHh+^gmriF-d?~b@p_a5t{3zj9O`KAZQK209nvG0R6a+t z-T9b|$m_)c&;x*$VCdrVx!N2vmCveZwioE!AXBTBQfP*u1IB!%RtnyQUw|g1YK-i-)tsY z?RO@K|32EY!(omaPkzat!S}ZV&P%=k2SmgupwnIx`<*)QUGzeIFnn?=wu@>zAH@50 zH{xU!_wjEVfeK|oDJh?IyS;G@9>+8<4mf*o0nP(Jk&}}XE~f(|BA*-O&O`q5ig8pd zR~<50EPeQKyDqcwVN&Z{Ga7ysB!lovccc<5Y;5e}U@T}CH>|MjQ}|c@SLJF-c~y&7 zehgUrSdAb1TJFvlJ~B>&X82dSK$j)eKu9!y(DILyeE6OOoDk^B%WG?W`{QZo&=3IV zwgZ(Y~pTT^=UU$~qom{9j2C*2ffqqo( zO-i}&dQ#a0WCIu!AMO&i0O1LL-1?C#25Jox(qC}~cdrhlv{0W) z?C(w)CVmCMmf=Biy=*g6O*i6MUg~-|f6aSD>VDb(vO8|@c7^Ec>fwRA zZtGUbG?phV!fjnbJGiPMVrLSqOC(sERF~ezR`Y%x^iw}1aI@d;@Kw1sgr7Tz%eOVB z1eflwOtStRS3uL$e93@1=MV`qOe%5=JjCzdM4HIbr=pdt$D7}y?txJ_Ux2QZzwqBS zAOUeX>_B7V5cZv^R6=2BFBbxcy-=YEea>b_rME;JEULCF0R?eP7)@Js?%Dy4kx*qU z?-SmN>X(QBiJ6G7Wg$;YPny`eqEJN|R(IrQ%iKQu0Ih91#{O(_FM}3=!zD#{p+p7N zo~I`Ga*oslDRYu)^(g>sZ=?WeeV!!ha$0%dshpC96A< z8S3gr*4DC)F5OO@2IfvqPL-M*(iryvjYyeCt~$J#h6y;1mQ#6xs371Xf|GfF&OHEV z#^Yts;N=sOerGsMWL-l;AiiBEy4!{awZKIHDhLEP>-T!nYQGIhh3UriF-@=bq}LqB z8Byvvw$=2KzTlA8ApM3z&7es^isvr=&86SQxWA1G17&g4U=wNIx1qrFCFJPc50EbM zzv%uVS_1@l@`IeYxp0iogr7eD(M6PM)7{#0s5s~*Wj}azZ=)X+H?>}@eahx_Ls`_B zn3x#(l$Vk5>+fH>SOWe?VC@#t%-C?umaVZyk`*VxYiObx0z72WT$L=91w9}gd8FXZ zl8vm}k135dk_=}m=^n+|e=c<{Ypas4k>-k^-)Iv;O)PJ}JF0;O&=P6d8~Wz&d1pmD zIfT)KFdskV9&#GdA|O^}4YO*KMPO{7qcA z5ob{#)0qc|-?oVr*uMa-3VTsqU90~|ZBO@|p{{Kuo%boKU?`jHAl|0aG{137EFrJJ z!Vf(UGiv>%7|xCGEZcTz6ufr^^4z(6g9UEZqUoK8ZO3tjakKBwykU1gJTAQIj{*$3 zx7#11>ak694LZMIlg?&1Ze?$t>#2VpN^)4o&{f00*2z-!>q>AYk4;(?N~rPAGX|S5 z6QInluMeJ`G3{^-0joV^4le{98wcl8`ChplYp!9-A90`xO-vxwblmZj3&FP@^!+ZU zs!&5C{iOD}kXfXRKd6DBT%@3cxc72l{g5B14Jbr>G%_3#_~k;XFe>5)c(J?ZG*{+BKnGV_mH?gJb+sPAUN=YRz!;sK)tns6<6S#B0n+x!+;4F< zv1^omG{o!c@Le!@>`{4IU)duoI)eH>6SId)36`r{ht#~BGio8tz?m&h*9OsqC0k{e zN4Aty-=lkt zeaVC0w@wjvKVE|=dl8Pmm_R)QjT8@A6QkaYb`3(XVH5Ks68%5N#(g6%7HF2#6ekm73}y8b9Dc9|HHv zMrbu10EcaCYQ9BYE`10v7eT!M&;xI8+lMoZ1NX0_`;7Cz{%Bksvgaf&M?;*HC5`a&RxYj)(WC|< zJv}{2+=b&g-}LPH{U^0tIjWJyiGYM%7Jy7Xy$T#09L!j??61)Xfh6-TlFV?$IoV_9 z{%czEEu}4F7R#o9>xZj0M=YH`{!IynAO){}frmf>Kw|Kb&9)wj8YWku&yCobS=^2k zlc2%X3>YgJF@%ajn-o!NDXDsdIp3M@g<(1#92A|d=#fg!?4nPAXH4W#UDwBHt^pRr zGEu58MrWt4!;znN{_8{~O@^IA83Q;8YRwqNFp`?O2c|v{Q{u8Je!}W4P}I_7ftcN= zNnpco!pFxNny?hw6+BgTHip*Lhz`(}|1*JUg;OhdDuL zEOaruYrCG!_wNNQEs}GlAyJTU&s#Ls01*YGht{+96N(1-7>5RJwHi#mfq4njUEE=G z4Nc9Gz0%}9K)JuWyW3-xMNor~CKnbVAxE?Y)U5?i=;$1X@Gd5SyzSvhxv73wAuM6# z->0kJ*^$y<)<_+0bx}~q8?Xvt?n4@JMk?jv4X9a4N>q_k8bv6hsOEmfCJh7#teq%q zjJ9Ml86X#D?=@znhxhFhVw(g&Mm7lX$b>AEHKp1XOY=BTz*ZN~(cfC-fl1{*nGy~b zVm3}&wOK_|@BT1nq(Ydr~*jMJkmpkd+U%)p3%LI58uThI?;N!JPa7+b`&jB6>(bxwZQnM_|-)tAr%=4Tf7OsAuEY?#RgNry2?fcY;{_3cJZ$Z&4)iM zo^r&+wWWf$ql0!K(#!%XE0^}H{b@lCYnd2odlw2`kT_Iu6yjS5K~31&%0d;<7m-5# z13v}@I9LBa3t+@3V{Muw_w=*+UZ)#N6-z>73SB(AP)JPb!ksOUlBngG5Mf;!FS4kM z##sdGvp+z;b3G1lb=#fcWoUt^V`Od~ItMxo2`fSe7G?-Smp(B7wYq$X#dC{XE=Y`x z;X{Y=C3PIC47SKJ}} zQRUGKmTdNKYuo@=AVU%*(9%nh$Sq_rf(%pFI*EUKGb9lr4RYT79bjVwF5EmR`16l! zoDc;Q9K_|Ijwx_2L(BG!F?z`4^z_Ww+8Q5F1t7yv2~(*Elwk^UJ<*QJl~hx{@ZA&W zRHts4m@gUH*`f0Cb}$2Yw?PS%9zBeqkG+S>dfr!RMc3xRC@0*jh8FLxPe~jIL90|g z294U>o{|>TamU+oG3(AJ-j>`>g$t;e*>VYGztJs?Nk4}mvQ+$t<{X(8^tpn?uglCY zlurI~(R%O;i^~ni6H~Pdi*9VH7Q#oSZ-pQ~uCOwNnwu2%#Z>`ntm-YjKE0T@8 zjSM}&?vf#xIBsf&#F72k<(a*UcoD9D9*0108*k0rnpUjeLB zHjQcf@i0$PT^)cz|6;Od&ko z;?XcHdo3;D=qwfhngcWz(EFOni_mhF)IUFU2}oeI>sZ&<*DGUYNu`T;j`7E*jJwr9 z*+Bs;?*q!GWs`$!H8P`NXRux~d-Ds+Y00}ir2QH4nTrJ+x~&NY8}7C!lO!C#j^A4&H4)sG{T#L+GD{3lh$YR;a$}f6z{(z+kklHqu4kxLnzvi9bAuSF6aR zWXFrKpXR^UO|ahhujwK&trHs18kf}Yi4I>O_BYJ5d(&q;a0|~fW-dK8@4N2{W-Yh+ ziJ#CQi&)O$E;cqF2?6E7`$&}7F}!Tw{M|oOEIL?)XNH*y>&r;m{L;X3>JO;(}QrwLZN6Njt}DyG+Yrj)~Ld@*Ta7-i5xVrFP62$nYR$1v4)Z^)tvL2 zB(#$u|BiZAB6zJceVEGnwbaHKz|bzdNA>Mzl4YWk$P*ry*wVod`bU>6@n-#9xX
    56)oqX=P+2ogaZ%PI>w%bxble-QAPV(sIA<9gYK|nQ|eG%6|_u;^w1e&j0QB ze{D_kBH9cIUbG7F3e0^|g6$CwY&)LLA0Teg_Zb#@aRN|qvQv#l^gao{v z1j15~MKVTZC;l{3#6K$gEV%~a|1Kl(=)7Z~z57RqTk#|;Dy4=Wh)(DkF-*)5Bh>){ zWm6uXWpK>F8!Op8OjUI?06Y%=z9zvpyET{nTyi&&{ia|w&=_x`u+O{w$1892kc6g$ zU`jMWEBA1Def{(9KIjS$$7r>wDK(h6JgvZ3;)fGowT5iy4`!T#h5vq?Dt9Fs3=oH? zxjk_~c$D}@;ShemO{w*!^u5IK{YA*II$`H?^6lZKOz^{_Ep=JGIVK&tRgdoJ2@usBy~?eVb^ajH#<$u_??AfkoGNXHk+vYv-6h zM@ZlZ5K7$tR+P;E?aPv_PDqOP>nZjGUjtdcsnXX!0GXiLt%pLk+7!a{7xRtY03u(< zP&lAUM+rmL3_~|J96(D-V@)YMu!lLxo)M*R7ea$pBJ(m+US0K1QS;rAGH1=$T5EGU zI{OE2-uKwG2}kkzvaJGuD68?ogXf(U>fz3${S;FBt)2wOlH^6>$s+*xyy0Fq{ zTVm%3WdEXz*RUqZvzm&B0xeSHqez7=uxL>xEr@2TyO1W$JGqgCSX;Z`|8-|g2=qm> z%;s^CQJT)l`MxTYR`j|n_(l$>p(jDSp=1^zR>ILP};< zR*;HN?Pk(JhC-R@{U@&+6FF}Adu_|ydu+?Ua)pV|UbF%P*)_k*Tj--=s4<~e>wk)1 zLXJh4KLo;lInZe(WQT)HOdd+ULf%@|(Xp1E^d=RPhSg3X*KJ78TTBpJc#cHuaa0@6ijKWX0#3rm~z4-E_X z;*81}JY_J@^$|bRp1QxOso1mswa~s6Gv^hLb8>J1pab|W4*4l@c!FVPC5seBuG{I3 zZZVxZI5ibpOm=KamUy`E`R88KqNN+p)tg7IZ1=h)+sv^u#pg?M%HuJ51XHn6Znrb- zM_s^j6!E1+Tf@hi>}=P5>bfVC? z-7oTg$9^$zJ^!fNfI_lRkbwnRP>Cjyz^&pnX>SIn;n;11fA0}iEnz|Q5%HH>g^{tI_ zI-CY<)>kH1S2t!s!MKo+PewUFY>q+g^H6_%=ecXoIYs}RF0fMI=0<~C4@I}}0pY3R zDyQ1?KwJECHoCl{$4!Fd#l+X?d>RC@L$=bJZRA%Qx7sKH+{Bd?ZNN!w+hc%EL?8C! zA}IXxZwD}-x%}Sv#u|zfBnVBDr|jD%@-hzQ6LRWZdR+kJ7AX|0Sya)yDbztg%tjPN zuY-?||FCi29afg>iKm?k-x06TmH|tgw7TSDuxrxGYOAWYTxz{?Y&NI`AEnh&2D3I_%s=d~4^XeJ z&gFH-An?30z4P{bKAhvW0biZGcl6^2eY)Hb2#ZO@+B$InV|8gxiZYQa!Ipt4nwj+< z%v6Z#ZvI+tc<+Mvbze*jSuS@=T&jog8VF}F*ocNy$Bh-;e{WDHa;% z(NIrYr?_JG=b;Ca&nA23*sgwY)1QzGz0H$KN z;V@906!HXOc8B9sZw?%oqC29*b4?oTPSu4?dcb@1R~SMXKYCf)r-(*0KFeUp%On%Phk0A4cI(t4v%?)g2+1-bjl2s}mtlUiv08B0EfegcA-jp;w2WLsNXbGe-nj5Q1Z zW_~OIcOcMGC#I(0UQ?QO`f0>?z=mwDtja2G2j1ydV_dN;0ABp}@4K%4H&LPRTcFWr z#=zubJ#`V~lEZAwD+)4toXG>a*@vQucpYV12eXaR>?~vs7PoBq1IRDGR)_F7I5<9H zMF5J{oGXeNf(aJH2W1QR;Fa06kD@yy2R1|eEIjU3XZal2m`irwTF-E6&o$uA`U|j_ zKh##>|Ej9ECOaFPiz)zp)&5`tH$th^;RNs#N3L~)wYl&N=Tw!kj_y6@P<#FNfTV%B zg@rh$0`0!g_i7^<$Q^gS#K28c#Tc|UuO#X`ZxtO?zvmXe4l1-_S|aZw;g`7gODn$T z(?*P|9H6vqCj0RKsWc$0Wu0a{ki$snHv>2txTu35)Ncw@miF?=($qDvg6KwLkx!nO zyA&~3d}%~>wv`D!BzmUp_P z%w+Hw1#T3J5^(!k-7gD~Vhr18Y)|$!yZ$x*xmaE5gprITs^)Dkx66iT?FCarh~~9y%RFW-8*_>F~=lfIuZBU)7*yB$GHo!hFt5~(Z! zh=MD+W19#Fqe;a@YzutbB@H6epC0&p^}yTFQ8+nN9N)kI^p7QjcNGuJ(7WeX0npa{ zd6yKwfAeFz)&qK-m2S{b4M!(75>`ExZGZ z2dT+qW(vIj&}9W^OVA|IQP8O{#nGp-xr4^jzVv|RXLWXgHtzm7ZV)?PrfA|~R-)lv zFlUlkdV7Pp;|KWK@Ed@qqfPot_qfTf`w^(Xf3bjuFD57M`G#9{6D;vp`-bUUAyEwM z^G^eDIF9(Ew0szed_ZOku%kSGdBF<%lS`uP-W+E+Tp!N^#(De;@rSO-pYlFl^;noK z0;{*e7y>U5NN;aeP)SF9KT%}A(tf#C*DDuS%I$SmHNtLpekuj~4bYS~-(NQod8X(J zWTT?AHkW&G&O1=;-23ro{^OWk|I>dk1e5Femp0pD2fp(}@4PUoTX@4uz4i7acg7UR zK)eK8cVhoJ#Qo;1-HIMmQI;yg=1xO<|D~VYm`hPJh>@?GI@Uy}lbukd@VR^0I>9j` zI4&Mth^dm*l1~1VpFUJ_epU28b|4eij7LUl7BSEWWV0lRT(;6w5F}#>NR^z$sa$IS zJ`F6hIX1UgBR31!qHVOI%hnC@TJCN(kuwg(O`~y+V{SbOdJR;tp=+<}fX5j))qX8g&j=6nEh>eR{rf+x*TK zBs^cgsyHUIQvG9@uBfF^JeO@34D`X?X&m%T!ig{-1PTn*;0 z^1sx8)-T@Mh!1@@-4}t(Yv7=~m(jcdz?n=qay0l|2fa#>hb4HpBNbh8_7E1N$m3lUmn4v{4O|dH`^e0MS$P%hh{HZ!w z*_m+ugF3MHJNL=BHYCiT51)#rIJ1Gs*U$=$;-u=6SwuurT~L6(dy|rB2y-+*fkI%3 z+(D>I>)6?V;m`mn}Boqqwrl-C0UAfjIE33qj5~+(ycIQ}Kl9^6mOne7UWl9|J9t?1I-|NXJ2R_G1C^k+ zLbYrU$sScQ*9?PEGbPEprW4N(9Mbpg-UW8!dE<jd z_!h%SRfg(%OLvsaicJhY4cDyS=rIs?4FmCdkaYm=8cqZx%kvF3;RO;UyqvI@p$e-Ri=$%MK(r6E^V zeKWY_l_L9AnU4)aMquvmY#56cvZtmV!%Y;dvS*IpvzUrDVK0np2jPt<<{tWCXky8X zy7oOti}7GydgbZV{J%tIw?4u2&!Pc9(S2tE_anIh_|>b{wS&OKm-gXgg8`D-nH0e+ zq>OjK&JuvR0q(-z4A5_!UU?SPWL-Md4WJqRFLU=-vjaeD4|`GV&gA*E~Mqcn!0*m{p{3OeDalwuwS3`+5+==fD6xoM1sR8Wekrg6CuT(0u7)HiFEioR; zX?u=P7k-V8V_$^{5}3*nj63(e@8EKKvtOfNj?K$r*_woLhni7Am!5O;9- z>*SORwk;f?vEr=&*bA?odoTB^ zQR>SU0B-_$GrQO0yrJVPJJ)HwZ!e2>uh`Knt}aaW_V|;yZ%KCjG_GjH_~6J_32~Socitr zmitL9r51H1CTG+zOV`>_S{hP?uS!*)66Lz>MKOjcU<{Al=v3-mR<|)C`MUDd+$d00y$x9a*Ih zvlV9L3}5aJ*8|-LP$j7yTN|SQYo6%*y%+YvN$}o@CJMvvn$s^RiCR%66yo^rI*8%X{s6NRP)6Dc}fyB*TXY-PTAGR>$@4SUXP- zvM%opUdU_(d~`Z5K0=B>unDNX&u1N|=kCM2fMRlStmuc=viU|Ff2a_DC3?RW6a@(E zA3+=6(_udX9c%A5M1$V<$Get(Xqflstj&SdRlK`)JqSi0R}#rEg{!vXxeCBO%Z`_k z@Obr3_DX%to{oU3q|MkVEN`k=iMoJRE?M|(=#|$_-F_rSe{&dkJ;A)+#K6OCMz1zK zGrw-WLhla3xsQ|eD%6aeEB-pAr&nXMb46PtAm#vlfJaju5#;AmCGM~>Ig2Td#S~LM zZ0O{+=9{8zq8qki$Tbjxh;uR1kGfq^mMfBb_>q#0;au|v#@je!gc(S$4aXAqznl^r zZ||qesQ`k*&65vMBO~K!@GEC#xJ)qfcXR};I=OcezS?tcxRVpTEcty(?yJC8FsfbZ zUtGklX**$G*leB+V+dMh z-)Mr21lU5P7#yF>rt4|es>~nWq-#U9<|HlVQ5R5%Il!Z-%Yh(;upA!vb^A7e#y~km`#ZNoAUD=jgIu54AkMr_ zbSU|;0)5xEhi1QyzYH1m>=U_R9mA-5&`}MRYuqq7Mz4KX1MexYJubJmh1ebRp>G$` ze1KU%4=CaCon()F<@mabr&ZH|0yyo7nhka2iqzTw39uDV5Y|c;b3WYG;p2X7#9GYb za)7+w^b@SC?E7Kx`rn>*D8QHb9`};!7L9FfZ7Ua&viJ*W#Pm(mi(S5WWtNiVvVu`U zW|uA5fbjX-ao!tz&t>i=kbD~=e)&ZVWVhf+OIQ9I^~lP}sV<_1RBKv%m=}CiUGuqL zw`|d2C3QD5)4l>6B`*{m*x0E*Hgn4+!wL4D|F8i7^#Ht`6~OFu*f!_c2Ge?8%m9e; zA_xT5iJzB;nF(U@Q$AASQ`r@VsCUm$a#GK^OJ2u2lot%*<~Dbp{E{hW=oN#|H3Z4Z zm(J6)*Y3n|j(W$*e=-n7*tw_4|cjzurfpk~m8&ZaX-nY;G*9@W~ zcw4`%1}G_QQMR9$$+upFv>MX8atk^W$dN!Zr9@tsbo)*az$Pc+x8HC+z9|sxN)(hnPYk=Z!y|=Ailj!zY_pV zDau|pG$`Oig`BoRqk~eO!@EUAp+^u%`D^f<4cgh6+J}j<7?fr6b9(8)#H42tN+uw+ zW+|ycfAcuY-|@S*u(>ATCWKaXDk{Oz8XDD531jF?;A?6oOyK9A9_@>W4s|L*Ia#)% zQ~pQH2M(2h(PcJtZ>kD8c?^}HOId9C%Ida}U`a=6a8YuC3Zo)o@>!E=03dr9fYaSK zmngc-`;}1FX_B4G^#<6<71assqZl|?qyqfNE54$aZ{y6Uep8;u3)d3&*ysPB1^Apt zF7!J<`z|X);U$zHbzw(1Dm&?$BA+TfqtivO*~sd1u)a0bnf)iw8LnyY??zRl_+?_t zqcI~CMvKfJd61tyV)?$r<8TXHCB$v5zds7{sw6jEMYI2d--Qiu^Go-gqU0NDe>syh zxUa2b2o)W*~}xR+lgl%eJd} zmb1@YSf_9nGYg8z-oA(yT}`~2OhB?%Dh&JuQqHx2w1FN{k~LOBMWhhzEAUP=V`UH_ zgRZ=VUDGRr!ZITrE3ZoYPs&S=e!t!4NEq80J!jtuQ$}RR&*^DPMtOB%)I)|!@pq@p zq6!?zh&ybs@CdB>JkJgVusQwL{;dn&^~BeYR4yR1(STNg#QNojlM0aXUt?DYt2rDW zv=9(20YQT_T13q(LOPXHQ5BGIcWimPLCGS@?NP}JRK^pa#Z1)Fn`z3|%gl;pOzVA$ zAKacsFX3MAvepR{EHP;fg&nq*wz!fJz~09~`#)ePwk#3Kg|SJVs9h~4CeD|OBdgTd zgN&;_yjvBnnoRpxBoIJ?RFS{1ZcaJbD70xt?I2eoTwf!OI8ujICp)UBvrVlF&y13P|s9E>vn*iMy{{PV;Ka3YF2{)BLQKiF4$ZcFby$dD_P<*br*(PqDpwmM@f zJ&cj+WGVzxfh7};T%1HD#0OwzlUvlQ0~APo^G~v)_@Vfs#xdpvL{MA(u1gZXRq@C! ziweUsnO^ciHoDVQMXymtF{VS*Z`DLL%^2O`niF7HL)HMM4bbS9NSnK3%kn%CrupAH z_u9XH{R-?5wtz12{=1$kGg>@d(}BU98i^+}_@nx_+zG!t(Mm zjvhIJgNF`bZf*{7~|A*vJ9*)9ULTZsNEwZ@MyY7WwJ|)wi_r(v@=iJK1l9iX}fyyMjY5vdp zgQgIK$C3H`xfN{QB& zRpLYGUtIsf?Z1%wzoz!-hkS4Uzx%K6Pe0vn5U%t)S9%}+-+ZItlg9jKHbs#ZCR-g9 zS6(TV&kNKG*HK+z$R<2O%#=Z-zh_y7R;vXa1n9KeL@ujbG~_u1Q(B9(-^bSW7QXwh z-^JsPKmG&7CH%VgehsaE&zFx}?%#M{VG{~hd=Nqj#g#V6vb~UtWcU4y&j*m#xWZ-h zC5C;kW2*|6FJHcD*0TSA`;$jl6M&_RTFoYA=jO1qw1maQMJy~VU}0eab8~ZU)GyVu z`Td520WMs)fbT!~q!Uc+b{!R!K++#{A@^UZD}Jx4&DVbK>l+OBc@%!oUBA+W_1|lM zb!7j#evlEl()vZrqbz@@(Yez5{dbG1uMto}XvKl_iV` zMOs~^v{rzv>TWc?d;B}hWhtpDzfwHJE{zByLhnn!10VRI(J$oiiLlr<5i3R-G%dxh%Q&e%<;XV*q?i1i}A{#|L{P8MS3){tj5P9Zg zE9SzR01+Y6OyUWM0L87a%;w_GMR?LxQ550$v17vSGX(bVMM%?BChuzIU2sZ5lT%zX zjnh02jX_RToj8i5Z03jgTt%o^gmoEKq|OKsWpLB4*K_5D^Ke%gq2DLvTroCOZw`Ee zECL`w{dWfaym3smQ*-4@2IYKmmyDrie1-N;WTQoG$BGl+a-{W2+5TuO>j9XoRKv{2 z(RhTJa7M5MR)P(*hKb`C&1Ms`v$G@)nP7Qo2{)WNg@wgM0g#yT=|=zNlK+)7NWhK# zsTap30B&=&l_eF+3UL&Rat+f)8Bk)P14tvCOIkjykqIVTYT?$yEYGEe@34VFYTsO+ zWJ>ws-oOn zGa2VH=Q|+sQ{Wx)j5_qRQi!~8kh|opwFph@U2sb%buBkt1r@5on^^{6I2uXA6D!2> zh-1EJ+$+Jg<%)nb6-T6`szrI%Pi0)YYW=yGzu}|WZVp{g502!EM6biIQ50o8tN}`t zd1?WV046r|kVS4u_VV}Ao24$sOgj=2JAok3b)=y+8bl)p@k%BWCq))TZs-Q!dKIE5 zLY8JkhDtEg=^!sMpi)z%U;~e&ptYjtUP_01TP(!v?xXq9Kj zMV=l3{~oWgv~`rIz5UiQlf4l9ic>dEo46BElVVM2EnorAYzFSIG%0bc(+N-3s3`2x z!o61XLfn+XVM9o4BA-0K3Lf0|T-geFk;yn^u66pQ6K-jRH~*VomrHd#s+I>A2E^A^ zx*li5GCVvsxFF^j*W}sK$}B7%u^R*k!=|i(XWaNLrEIY$G5UE*Ss4 zK7cibqP#SVIr3~|n4VfmIIQZaFQQIsgi-%tHleB$1S+Oc;tRHya1WCwPBY0?RcP zZpXsX0;m)`If5p? zL_tVB>rR3xr)CEkGS3@M;SjTtvdmFB*_#zb?u0H#xs*dHX7cI4ZEze%Xf>OXYH;(8 z>nsbrNgZxPQAMFQM;(6sRtEt>@&Lop@Tyr0A9|%U65=*EI;k5J;49czGP*o=sU(9_ zd75+-4#;!mL+zJ0;Ylo^sxT7oRo9!D-WnR?$Q!l>S#_Yj2{T4meLfh+hkrP9vc;Oi zPZDmB9&F07YheBBu%6n8EHKaL(Bq?`?*| zp)_PLVkhL7$;6djh&*G7Zdh82z!P0iN+F?Kk@>w9lU!J^Uvd-o;5e-0kk=Rk6EaXl zoo!JhC^R#$qBwNG77GjV^ikSaW>r-du)2cv#1xql>Z{-ob=>_vS#eF>U&a_@)zLsN<$CLNTrk?^h1TkN;|sy%cn*7BBa~AU5kks>B?#ZlG3{3f3RW|6v%knt<5lc*8c_@#f}6WsE?9 zRlF|NG)`v2K~gsX&cF%^+UafGq!i0yn#W~-m6OVjq@p0jZ8v970t*wRF6O9MIJFRM zWm6lZO+3<_p^{<;zFaPRvIziX4I=Exg9m13q2MQntAIjytUZNmv3cv*F#3Mru@F>& zwbD4yPQQR&c3oBl&`2Crk*tbYxh02Kg&|IlL5vxkIXP?PGM{z!US4kAbRbji493xk zu_iq3ak6jQ%5+>QWkU>{L$lUz7y|;i@23Nml9kVH4=XtOqFM+t zZcHX0y_!i#XK23by6h>@ay{s|)#pJrKeVaNH>G0KNx-IU2>uLdy=WD&G3f}e6nZD4 zG;F3Z2Kw&1@95#-fg;daJ1Xm9=(MjY?%iewqMfoypz$aCi4) zu0@4F=4(}j1xlxx-LroHkG@thQEV@H(h-}Ng@cnE$ZgK;`Ke79dQR_mS#Oq7%HHuo z(qkJ~1r5KuB2!&!{*f%x2tbqkK8ai>{)HG_Ni}M<8206ZhXSmpty?bWrAXsJB$LHvpTgFk`RHBntwdVF}`5l0tyN+7G#Mt_Hx9%lj$usI+s zpzk}~E$vH^#Q+~NS@fBuvP%ngM2vB|zN5Y$G?%(E$-I$u>sSe43@XWtQ4JxS(Oxso5$Q%u6z$3GO?8B_Tl+Q2bUvRn(W99057KGvj2&Y( zlzWqy|5L3LLZqA%4Si3m2$sMDz~>|P+j~!GS*W^(o(K8au)Ma{5;3iSML)8r-8q{~=G&ZojRvN~U zj>j7&%%N4u?sTJR{ge za)ZZd(y|nJWa#TI^Q_T67-!*nFq^iHH%wV1(K3%(n(@yU7uwp~S8>h26wr30oJGIS z4`N+bDy4l-Hs23~+&NMoy-{YhRZ#H|8xg~r^p~B#coAcXvh&bGuZ?>GyhIs=Qqsk) zqm+|q<)uG2zH#u6N2HP7XXEzcOy(GzdoPy@c~LkLS}>WgAmi=fyLV6KTG*^ZMsQNi zI5Tq8GF~=M*2K$!)kV$KQ)8CPMcV`QI+U@QhoOqtGKbhUC75L*?Zt<{Qz*>5Wwzh! z*11|kRn`xKaw3W`w^-Jd?mynQ%~f1~&*wA6yAL0zltQP+NA>=iB~uwUI~xD9w(D97 zEQ4sBq4+6R+wg_Eu4kHO<&tPiD?OevZCg_26H+v+-~)6%oV2lvnvfA<(A^!(x*h%2 z*ebiLO`{mH5Q$%VHW9+!d)frF!3#~!(PG?q=F5eg817^D)rBYkBkQ_1;V1}mOzerN zRyHThyqN-I0qAMzmvHjI!pA%t8v{-jkSv&Jp{RMSeLZ z5uJ4A1jVl5`cX{`6Tw z8v!)Zrf<2#3S``JESr?_e7Oh0!4q8M{kd^)AXj_xo6(jj&m9`2w z>LiOtBbp5(jbtMsN0duaaui0R*5moJ0WF5K8$J zuBDW$73q?=dMolGp{;28{%r6g+Rdv05SCJ?NWX5ARvnUpA(Aoe6teipyyQIlHj&vn zuSfn~(RFn`okSp2cP6dXuqKft1b@KHJ%7-0hEJ}tV?nWEi?k$x;)YD=h?g2=5az{T z3vKI4TiVD8&=7>$3ecbvs-D&Tf@X-ZNiSn1OTJkR`_7&g*0~mJG?cv);%_oFMhX5aTTj$`vAL*)R9ts$LQnK3BPJPzW`Ej*!X z(cCvtPGYo+ks^HRuwjBK3zlIu<6kvWu@Y+Usd!J(;9Qo`sQd$|DxfTMM07r%RpWtm z?!2i$(b`J2v86VKMhFNhXKhymxXYzbJRXl!iRk9td*v8o$E-#I2m`!M79HF&7a0pV zVHz=o)=}CLoiAthfs7&OrD6=WoeEtU}T8_0}y5Wehv<`!ZBc4qTA)vq1AynGb$Wqp;!R_&<1p&TWR{sNb}=#*(RgWM?5K;~F4@$3c**A-8H0$W zmL$78cJm~@bs_S?S!ARGtK+#WDlfz$OF8SLVKWp`zIRcWe_l6Cd@b4t+~0l}8UxNb znx;|ib=Aw_&dgfOHc9Of~7LS^2D`}=$HfyaAjSAhG(kN5Wi%`ddcZiyd& zT7Ov+(ayL zlJicCvE-^7kadBzV<{Lt0FX-yZ_It)Q>sZH_#h`EiC_gcBnGc07hWW#sE^?Vuq=yE ze2bLbK@A(A+#1F~q_Uz=6C*<>kwrt_)6fq}i`KsTiCl{_Y&oQnMwInRRB@{NKt)lE zyDS+wEzm-|c=&9T?5J9XVW3WY3rMC2c$TYZ8=PZ+yC3?U>B=INuDTB!uL0Gy%fCN< zxTj@Zc%$1kI-O2*xy%#~!u>_*3&Z=DuU^qtUwyTc@nJ{7OA0@7Et`O#!vYtkkW!N3 zL{s5K2-J06*j2rbP9SiZ#z`Z6a%n)Br2#?}gi}{-eucG1Q1yUWRtjgA%e=G-sh}B2 zxZO*augov4XId6XB9DifL=s>nN;kZ?NL}^Pstlsdo~DV?mc+7%b=NL8sbsd1Pa%*i zg`5wRwj@12Kbx`d^reAJ7=jPZ9dpXDwyrYg?W~^jR>ZNTP1$y!T52z92qWN&XQ^t? zs#KJuPvlwvs8!=8qdthz?rfqyLnOFO#>GZG32hEws$bPW3tYHUkGW zdV?Ypf*DYOBhS=#A}RS@=F3GZxmj8sv>{Y0y?Xtc4u^@lzH1>WL^O;8MU<>gURVXg z)|JkuQ?qqe(7mdxGG|`oec$sq1Lg|>Tv;|Lk89`y;7cr>EDSf_N=)>IyeZlPa zCNmoa3ojZyZ;_I?h*!Mwk%jLZd?4SsU6yqzg-$Z^`-DWHDy687Cf5JWBJ_?J{HwLn z*=VP+>qAP4lK>0cdWGXf#e;Mv`iguzkz6N)5joY)r%SV8s#T{C)>|%@MhV3j(y42V zumK0Io<Cq_YV*H&a9G@OD3b7D~_ydA8WeGYuSzTvD6ftnOR8QDT!TH0EnaGihu$=CacwwP2PdQWHb+m3PZEI6;q5OfZ zls(;;^S;XNXw46cx_3BLzVUV91cz4{&oJ4tsp~uS3d=?e0M2#a^`?}J^3t~6&P)F| z^ga3GvFV$wZLeu1>}EDdn~_c5<&0f+6cQ2JXgdnN+o{N`+lzc4ZAS8VP8T8lc#XV* zf(ywjNYDYoPr|;#wN{NvDrxtjW@o_i!+*VR2*I3u?}6H4H$(_SwKF;?0zc94HNBV-_B>17pamW>$1Zw(Q{)3;o2d#hH?wM`KQ9Oqiky001BWNklUCE!;O4ID zrse|(^+QB)HWonD80}q0=w!nW$4!P8dkSqFM$ysAu6N}PEu&kI-y9C?s^=bhI!z>0#fNr5rAtcyDEc3o^I zvTUT*mKnC-L5w>)XanSW`o7m0`Onk`|CfI)>52}E7HpLO$^y;3l){+XXG1SW@(Q>V z(THdOoLSrMDrNa5&%|0sS-dNy#O^atY|4LQy?{NJQ=%+u;ql?2eNC-&m?j#Affm_V zfejrF2Z~^~DO4{n-6~_T2(;R0)+;d!4yv+*NL>8l!d1q&Ze5oh@Y3dq{62W^sP6|w z<28oZq=n|3$;-cckwwDbVG)HI0Kauvc+P0h$y%#!I3T$I00BA2hBCly6AuxfAZV^Y zWGx7Z7Z3mm`t2YVNF?J9=NuIXP>@3>EkxHDYhkHMK&g!)@&TI+EUSj#vO8>%3JrV% z72}xMG)O3&fIIg4N-1=6bEDdN&`+x&WvDf=Za$t>dZD@2Y}-aJM1l7dt|bWr4b_w4 zQCoAdQEj^o9`SzH0)pHHLRT;H+G@snozW;{lhC@Xi`rl3lvUPw%0i8sjnYav!k3HE6eYAqOH@lE-1W#t(C>v8T}q*8I#8`l>9yhzm+eHnb zR4;JhUo-!{&7K(`;!#a5g)Zl_-nW!^qu#;dv{GAg9nKM~E zPJko$-T|-;A<&yQub<4dmr#smg!H zCSdi`*eL;Yw0^nGv3XY>cU*h*!WPf9Vd&LrI+tegWP7Hr90ELe-JsM87?d;+XGdST9S zOR*%QbJkMb*#3;e(E4UsK)cdUstX{!_4a8zpX26+e)YNncltoPRBMl zZP8G$u!0dFa~~pwfVI(FYBem=H|8ET z5wx_nGH8)pZf7(Jt_4_oSYwl{dzg>%#=eO|F2{qNPABCku;UC zkd_vq<|;P;A%#YANv?rB*tGEVo7@{c)y2pIblQ}Xf_!+mxG!DT(dB%RDlO`QS=Uv| zRp9m9{ki5HwVb4$tR{>gPMr-&-W#weVn_VC{`4y!ywZO<+I0j=FAC z+B5p}4Sj8XO8(Cq>P0FZ}MLQg{we5AyqD@Gt0b(wOj zMF2sz*VDeO?t~JUtp*8E=%T33h~)ogwoDQYz9w=&@+%CiL7a2&GVAYP$~G*KE=I~- zBi(2`lz>&B1m~1>vmhcG`eCQ+8>A=h`)1+XH1f@*2acrc!bT97dSqB?N!UWAN^f4j zc{11HoY!eZU(yPp$Hx-*`1*4|kGG!0~|En!4FvB-$};VG7dx6Y)2tgax~0WqGV z+EP?(G`-H(g|^5h6iH7{v;+zW!v0#2bfB)CcSJ5|>WZ^WsSqfHgBm6}<1wa5HPRC{ zGDoImPPD;9fEsPGno%BJidB$VT>ChU)WvRBAr%8Mf^^b#oswDb>})J@sj@Dda1i=V z0ot_j^?CS@8!0BL#C6-~FMs-%Pv%;j@j(Dch6#!tVQp!nb=`~`4Xf8+_Q>(YSr4BU z5?Yy89-@xTcgAmFzaYJr6wT5VZrSmQh+@5!RuJg`XsvIM9~LZwAy5_&apqD za}+;*{KzGzIpJCgXHZtp@p#akWnEV~Op`8noRm1ldGRvxUgZIC4_T>;tdt|#yLh;( z61s>3OU{{QLAR}-1v{SA469Kdkpbk`R+;mw8&aJ!O5=u{*0r?MnAluJo6T;~7q-fd z$;OgphZ|gT_z_xQ)l9%LRN@Q&G``uY0bv%RwoXsrS}Z1mC@ZW%jLV#J zbm)7!Idc4Wk_av59MMQ>*M%w#%0*NLMTl28C~*1nwut9pRf?-+HI`a5eha|c<-&=x z;DmrZ2iZ1PcDzwk5}&&eD8P0q1l4ZDFTVJKg7I~u2n$1i)_O!K*Q<1m?EUIO@X+Ek;C8M>bI zo6KWRyf9+yw6Xx%M1LMYADH~h#)t$~B$@O!v)hCZI7hqF6(G}AGNsc=TPkqHnL80$ zc`ax$yR$xxYXR8?rlsEbPXZ%Q*4xz5PAW#;9B8-BP${Imskq3tfckmHk{p4KecuU? z4gQFv+0;tQ!qbys9C+;KS;xL@t5}*#)9hlkL=)@hrK195ae*kYC6#yrxUy}7)si=a+vy1$G!Qa0 z;)wLVHkHH}f#}ygK0Yc(y5*M@wQoX6iS$fh79c)sCKa_4t0(x;!*Ft07N!r!#u4b^ z{sl+>gqR_~GVqqWo+jwH&BPXS>`&C*Q&mvtL55B{#vFSv%Nw2&>@d+JsPDEW3jaGk2RNi{I4>r{K?*O)w@7v&g{%S%Ir<+vt2c z(Kp|HOIdX4D4%TqK#CT-)@PaWsG6~X0!XquqGWM0+y|N8_Ey-rr^$?7M3ZjI)Jjz- zyDNLho6@LB7OS$FtV+y|sJwIJ*kqki^nPG3b{lOBO|?z1H1mCpry`;ccXt|aP>ex` z%5IIa$|HVbt6N(4zak z=Q+BLmSoZPeNQ*XBQa}kZ}D8I3Q>T|Tz{phUc}xwN$k(MtyJaZCb6Qj{S!t8{4xaX znZZ1=)Ir_oI6Yut4G#5ea=LBmY~OcMsyPLTiYVz|WsTB}GwBh!$jKmm*Ec5~qY&HC zJjK>4#K;LFa{YH7J}4>0OEeJB{Jv{ke=i|{9`Q%P%e@bclm0}mCB}}9$K$T$jB@y( z_r}lWRMfolLa+x|*{xyHFX+I*0BcGs{G^ zHj{hMVY$`y`m$&BRBuWipreY)izF1xIh`9iPsPCt+qa3lY(_)h>uwoCpiZK5S|UdN zB&1MNXk_LdtU3y*A;QJBHyABIFP{mp5uj(^^}5?v+2oKiYK1i1tFqdyA10kF)LN;y zB7mUup;=UfRB4(HI=jV!F2)E0eR4J@7gThl;zv#geDOtRKiBRoUetnK^Xym?KB!%;US*s$N+94SuYsJih%Mr7kS(u>;{ zbaP~V_%P z5}nRx{i1DMwYRZ-HnN#sW?+wY#twZK@!>ftSy9_z5{dUkfLRidS<8dp|%*}*em zflO!^mf$$*H>hS2xhdUD3&So$UJp16!d@rVbX{ZRp^_+~e(buA)@9Yu4{WaQ-@m8F z(}`leN>izZSA4!)I6F&DNLx;X5Jf5H^xu#eh7gpY!;8G8K+c)Y=ku;# zwtyEx=U_-gx;#P?BZx%@C}&6#sz}OIF37$#9+-l z4cQ{6M5_Qm=!4-y#^a`DN@4*?#%Xvl-rU?gnQI~9L*&BxY;8NyB5-@a>wui2X&f1R z7Sx?z#-6yytfHM5xOEej-aIdYmvE&pniN}AsF{kZwT_Uqwvk*mZaUaZveBGiv$3@2 zl1%~(*ny=`tdbE1O5s!4b8F(7UsAYXL0u@c5kVQT8!;Y0?Pj^@~VIyhDGC_LxHsDtFoHgXfNlip9 z1f~M(ypnq>NN{!30#vv*|FdHHDY(a4v|cTZ4B)pc%@x&-V|cL_5j3>1Oe@>_=6Nq0 zTqhaq7-`zgGaHV=`F!4)7*v_l1}SsVlEKIWT=gQG`Y7J>F+`mOJ4w5V#@Ol9gjzf-UJo41<149;DdU>S7RTd0bPZ-Hrx$L#1mW&b((}WO0llV#rAC0%) zZpSwq>_O8PvUqVQ4~c9IrTjQ#T_Tn8Ksct#ymD~v5SF_yw^4L!UKrAJbX8dczXrR;)#9ZAkRnRw@Q+o(tqjmlWf z&TIQ7sORuNAa6x=5Mxk<7|QjmfQ{D?9c+`vaa1tUiXfuI?nbk*6cf?p%?S>>qFgei zRXp@-p_Geq0`&Wga}N|!7*$2tFr1lVXG3`g2OKI!Y-)C)LG`7WhMXwNvQl0aRhR+g zMwsUD30=#s+KEx;+`LH-GSNpkQCOo2 zR6W>;K#IY=!TLB}#_qL(jTw1i;^^mz5^CBf zN|@Fu*E$65u^sKehLnZ&byeoqG)+(DTF~RF{8y$na3lt< z0>nJ$Ld&|SE%nXqZHtzYm%OU0FF()6$47FtQbskJ5>WxxM8Xwmx^o@Tiel8B=9lw% zm(Yrn8vKk}3av(0@uB}f^W{QYT4@?4$~Dvb_wVWSc%q05DLY;$=9Gi@fEQ)eR2Lna z3F!qdwxWSz&lF;yLdDn|=iP~AHP|SLd1Gndgthf`uH|Sac?mD)voedAQI@F`F%Br1 z<~i?>`e7KzYdqjEClVelphrSu0)?xB;n1$~YTwifg2sn`85vzcOUZIg{`D9lP)4%a`VG zsA{T;UVd3Ooiy1^os3nq<_JpJ9|9Xn91bijLvSYmO}h@TS;VfRG4eeg#*yM?=HfQ9 ztm`@&#!+24tOqw<*p>}WI~7_nvrCH@!;r#`mF(9sEivziD>?}xpSFzCg{aa{&Rfg|)L2}f-5~6XZi7R$=Qrcf zor8`?h3AZ6X1lg+UFl>DTi~6Db?XeBJH$wDUcaWBn;V%F@qIsEF0{-uMXTz;4w$x$ zlNkjCOeQzl$}8>IOJ7*om5O1`+3}hBy-AP6?xsa61Mr0H!&g%PF%ba!2tAxlOaYjM z&r2ra86|X3ANL}xJl|%o4(z3<$h~!f*`=r=p10@34|aWtTB2zmDZ4I8LW{^__rJbJ z_&q=pviH{Jfs?Vrwi~P6=+vYzH^md^v&+2f+)8b=v57Ip*@#KhK*aREc(Hn+BB$Im z{V!j>d@|Q^dwbi+GiIiZDgdC|vMz>l?e+7TS!vt2Ey#?Cl{x@l(PnoO1H_ey(F$4! zlJ+siNJlX|h3|nkvCW+U92%UXo5-a%}hNfdgZd?HQVT&T?vj+TFyMS@vd>vO>P_}1r^r7G3-v4cB+S6 zN$CZ+1SJ+MEg-)Nh=M&PvsqXv*@fMx&P7Q$sN!I8R4!Ixjs%a<>AqbBIILE{8KhEvN%4ykdTDb203iY;j&)`ltz{XV7u*MtzDmP~(s>I^~;w}=2~!I*|rd$W2va9pe)M`mSXF=XcdUhMOE6W zu}(rHHZhNADz;5#^f=v%5lMOP=`6nYIH8g8PWBKiv@?{fM07fz>D9}Zn$PAOl7D;Z zVn^|GK2u7G9v&Yw6MDYPbUvME5?(n<-kh`A*`VC*y57vssR0Y*G<(`EO1Pp}Dj$P> zBs;8A72Dx(;IFl#EcySljLpVr;=+<`J?#;g(4X;adM9T}p8w|3dM z-!Nl1943vmVgivPqC)E`a!BL)V*$j?kb!nHUX-r#88&AP7EVv)T5xYL%0&)RG6x=^M2Q9kcF;J$9spQn>GX5uvoN zIn7H;K|#*DAxfyfHa0P_q3X;%vH}Wl_ci&(JF3-Dm9df~knH^JLePA7JF2_}LGA1w zb6<^q?z-LFJ;tbrZkrG=3(rcC-$y^JVjle%F*8?we zj2*FDB2aHCx!u}EyCl|SAdP{zWh+*WjV4J^ZEahvJUR}7_k<8A`bhoM>u28H-tOP6 z#Oq{IYqP4MqPU;O!$Hj>yIAOWIM6gr6rFQ)I2_nCLKYHYlaI%vj*cup*Lz1^xZjqu zt)AysC%jb@H5zL+$i3uA=SsC?@!BpsMNbGAbLAbGz|I{lK!_U+DxgKpucrdn+Ttqd zEZF?)ZVmy9CG=QUAQr1NfOvR()R-RaM@w6nMi!G zPHo;EPd~P%Yh`9O001BWNklM=hhZzZ3-+mJeky4_^$45OB@!#ju34xq$2d>$`MHN%X2P74fluy)SK#f#oZ=8<*9l zO2Z?_(Kwb}s;OEGqcSjPEQl>zX}NP$iPm)!S!u6ccJ2Ou8?!Q$)U2y zIa3xB&NhZ@{${~=1Ms52b8fNH057eIYL8X4F_NWX+BIW0D$9_(TrN-MS|B>YOkKqz zS2k$HNMvzZX(UuFR1zjOq%KU&t1j-=m~$k?BS}eNh>NPVQlUyEw~V#(<*fepwrWF2 zg`HfWQtG8#2f1x9@#NmKhhbFf9UCP}M3;G{d7fq7$0h)_;ZFs%01tAZrn)1@udJXWi{WL~Fxs=8H}oun|I@ z8^nhV8E^bDQA5Y&zDySDgW@yi#$kMAmA|)q+@XimvOmOsdp2v}(~`!;iNu zgv}a5v=y5eGy;Wp>=%Bm!m}ov)_9|llXx1y8DxRRXb38`Z1HiB^3k5D;xqwVCj;`F;K4A3vFE$;KTQ*HKF0$Sl)_wko7elB#Jd z=#h2?sA?c;JOzQ3`Ci9%sq}H zb3wBJ))!u{d=xq96fAnBu$boNVoUwAM;Ny3ao%rZHYza^I26~IO#hX>(~wl%SB+n(6AZQHiZiS6W_`R{w{zjv)#ozuzc?vw7_Rl90`kYU|b35gc2 z-WV3$YqtyNFDk-?Q3%EwYNYrNPAt6zCrsU5tz0M%g7HThu}(2@WOS+}7}gJ@70tD6 z&0?6`7)X26Y4;hrI&Nr1d-$G8M7=3wILH3QH*em5#(3_7wNeQj(GR=y^W{hdo zuJI%!rv-Q!Xmc+`t%sTc_k|ZVD~VN;x<9)RO5jF~SuF8l1#QU%Z>O*_!yz8=*t7!m zT-Fd*4(p|1rl4WXvKJd-QW^KNh2;BMMZ?yJ1BL4XvZ)aa|--82x&FXEX|w~Vy1 zfV<7IZk&y-58pTIqRAfTd;Fpaf}2S`;sYqwXtvvFi~pCG?-Lf1dFC^-lW*4rOHCg< zjpwBkrve{rqEz0(k?=MbgA6nZUzqgcgPTDk9ZC9$NLS-~bs7f*J~ORxIw>yPs*Wo< zGZ`1%`yAYGr_TnWYO(oxnuumS9ATFHG(V<^l(i2+3GC*r*!M@n7AX8;sE{OilFx}6ObPL?a)9cLp&iNU7a?u26 zJqk~nQE~g{D>Y?{l63fZrPrRC$-%mlc_q~+oyMjC;0m0aCuS28_yLzZvkL~)dMcc& zBKAmtB|4a!^{1->p+uR-x0pZh7tr*%NvA@{sI81ak% z%xY+lm*8VOj|P~_OmPq-rIhX3Hxjp^s|<$2a8qG5H>D^F-|V0unu$kU*P|7xhhAA} zF^xI6I+P)r2iI6a#A(OPDOarJ+Fb@-ABNA?t9v%4y!L2L{Bb%+qx2}x>nn(3Km3(? z-wAS+N(|Cf-`eCRQN_n66OopT_1TvG?=2E|T4#^;%7?r@``pTM*s}JDb(AL27U2oP z6T#G5l$ST1e2H|9h{J79!;2u2nqGtlg+n5K`DXE?A-mEIgvVjj@7(%cShM^jTeFPt z_%=1FNzyJof4`p60fqd2uV3NM_4DPfUkR|1r8xQjpUQgke?9}YGd!M`0R2i1&&&Tb z#~GatZQ7YN%m1_-&nGNI9@CotH1Df5%k$>{**&1={_nqTzyJ4{t+W5{MgMaln!%UM zuBZRBHq)A;#O#KZ|1{p`i>4f$pZ|T?b?%w}-ql>6|IY&iY)`VglBIm6bv*yS_P*J$ z^3{To^WW#nyZ)bD#q<9;R>|YPj~#9MpRat{{@=Tow_g8qp||S)TokYcs7V3Ey^APYoFD-HN*vZUh;&%Exo9EsZ?&J1F)FMX+OCZ`BvGi;(*wl^IHZ zhWb~G8~;WTn>~xD%+o)8FqWfOpqGYW)?~xe;@NMo1yES%Ww^&twa)<<`~`Mi)0)q6 zqnfo~Fxj4R(5{ko#Au)SIhpA+PWudKhEs@0nX+>a>!RwWw{pTl$-~rTse1p4t$L!Y zqk^EOdL_%|SLNyHDS#6o=m}t2UpWOSSJ3ug0#CL^= zNlsX@Ef6RYqpnZgBt~{HdWUn1-TW)sk+> z8)qq?DXVK*AKik+sZHDEs#`KdLL!Vy0Gb*~LOi`$NRg*Lnb$=DS$D5B${CD6@%oQ)Izn*M z;}!*Lyh_s5+S*1LbQ^-`0atLsRdG;vs7eqwhpv3hOan@L|3-5`HA>msHE zox0ZwDNJ&<`GQnx`^YyaC-k{FjRG8u#pA@v{i4o8->NY4s@!4edgPDR5tHO>NqbG! z6-|ny$_C|$@D^#7EVNh_8)iq}dW_z3_#ckHxgt$jb(R!L9+Sm#4OX17Y>Sxm+hPE9 zhYT2A(4}za`6lCHk?~1=8&N`8h zV0&S?IV8H6qHbaXqq|egvX>$$BB~_3 zS5@Pup^fNEm7a8kGI(R;WDhk%P{)bQs1$-Lq3>Axc)AeliJiBGPwrjHwfE>2Q* z=0!TDod*_Gheio!@3N0ODSFA;7X4`9YUUHRjP=p|e!w)hbII*Q4k)bX{2ydZ4vrbM4kJ5qS?iqt{cX zwl$50T%4VmGtA=nVZlM@kq04!Ra);{&G8;sD+Y2h5Mor1pLzzxU6jj<=(Pm$3>T%P zW;6V!(9K1$GNeHSWdb&#vs&vkU~=Mw2BcX;l!d8js1EwSK^^7kI0@hOFVT@&y!Iry zO*M(5$qklIz<7qgcMgrj1jAi*5N)`U1BkC5Wvf);e>9u zwwcg4hHWm7cK?EMXu2V^Cfj3>L+OF@!@@JZkXq^W2ekIX1V9RaA*f=A$#zgzN_J7a zcQO!xC837#e!*$dN>lOQNB3)(5#^IsG*t!elcYXI_?3=v4!J4qN9l1SA+?CUXaKZT zIbDD5+t0inX6c}-D7q?Fq*g2jz#$4idJ91LPp3=(YOSQ_;EFq$UI0LG?S(`4g}Nz0 zg7YxFvYb;ZXm|s4=Z8P?9)f&#h_q4jq7#ZlfE<6_P@f+q2$4-}MTn1Ht~M)__JQkl z_d+x(_C~%5B{{P6^jdQ@U@fQgnlt@G!*$GZ0^bsEXOcLda?$OV7@(&NQ(j>QGQv&+sb#h^LKg#^BSl|Wte3QUTv%U-%W>{>P(Y1D-k z)7Rf#DK%MsT$(Z(*>uV4(P6f+D064Au&bug$J zcz4si@)r@UnQ-OGfr-duB$*2C3=q)U;#_~p-R4rk4mUG{18#6*Cr*Nkl3?HI)A_|W z`q!XGCe-KvDC^yxs@I?`?&5($17vKp0B88_pe^xBa*WVeZ@Nl+J^Hb_W;mfob2d*h zkUGuOm?;oiw5U3=+=V%8j*^ck0jINMnBP))>Sg75UWmd7K%$63Jn|rQ8-lU6C*8k< zokz?xRs@(0;`4l3k3`4jHMlr|`t* zlTkG|GIs7f+Gi*m7cBM-$UrsMuaX%y2$LIqHVCj&kE|opPvF_{O9$I-ZmSjPfy7@T|P3po!%8BWU@@Q zqFQKsA||WV+VMs|(Kokm7+P3J=rtYGkHp(YEy)g{u>N_Pn z85QZU=O;48+HJT(Wt3^rZX_X6YCjyPGxN?D3wH=>(4@gQv5uT#eo;0dlYA!Ei>mz2 zU{)VN&bH8_#-MOR#Fb-E(?M^E`g81H&s>YL)YO^2>dJa;CL z;~)p^p5mfl=onO&a~!Onr_#GoT9!q|S|}e;*V{crg!#|cI}5K4dG6U~1EKH_Q*=H8 z4Yk$O7EmIS&vVjM+3#<~!3d=}q&%OiWyN*ze)3v=#wmS8B&{pthEeJ3!~I88{MZ#R zfqdAR)``6fkBJU%#35(}b;QQpD*5_2F6@3s`E0Xs{sQm0K&g3yE#e(Tr#d6wIy2eN zWFiN%4Ws>Y%+cfP_x*L%A-aDO%rwv+B^yZ07`LrbV+jTomBbGpx?CQ?S^bs;H=xP^ zX>0A(P5+vwPH>O?Wy?-l6Rb7IZ*alC0z^a{K;ax@=9e$eJ*>oSHXJn!^w{Gs-lS9< zrocz+e0CTixU-QFS|)eaXl4}tfN%q#Yb>ai<|R%&AL~}Sahl*ctC^_vmi7&*Kh zrcpY)f2Q#iRo-^P`$t3>(o=3s(SzR#hvB+gNMz;B=5ftNujNwKv3VwHJ1PHK?jBEn zq(W8b2L&V_hn)J+DAL{NP}s5(9H;lAt)l@4QE-KM?b*X|%qLsvTFuviN%o8Lb>SlM z)B9cbA+CTDpTu0r*#^Znv z>Z(dubDAkz<&2BVsyro<^{>R{n`D|CVzTR8nr+04!1U3QALQyuI8W z(3-%4H4lcCGnF!wnXXJt!3|-Ug^@~#NbY4ew08jUs?f2`O@SEO>e8W86QeNRN{ySd z9;4K*NQ6X~y_aXnaUSom#LWnt#cgw?E2%Pk4-5oeouZvJmsE%d0dOS|!!U`Bt12fTlDh?Q_L*SdupV)K-bsn zJ>we_0SH4k?r{_OrHi0Z1@>Bisx?I+fkX#Gu6D_=yXzqD)dXXOYFBwqz(Tkx5;iN{ zq7Gp`{^zM!{`m<8!jpR?s=Nw#pcS!xOBPEiWa%sQ@7;zuPUCRqT3Cdp}EAlgcqzcOtC)LtLj{%?v;B6@r^=1JyiNPyXtIRRuBCS9F_Dh_8J^t;Uc}gI{EK5n+?a=P)vO{S=#f$i4!>jw8vuIlOV32yQm*(QVgG=P* zfH_*3YR>j^*>({s)^Lt}AhtIn2qVA${8q<>#njCg@V?#VJ~Q;&HAka8D~M6m&mO zyzZ>Rin|zeh``a}8|d_Re(*PVNOUAAml)TQ(<#PiA3f5+DF&SztP?huVwQnaQ5V4{ zcj?@-vdmA!j;y=pY(l@k5mB1|b8-_LEC*9QIMb<&73%Lm!5I%=I|ZWTj5g^h^?^Y^ zWPKPgd;=HN5LNT<&ODDj8%7wx2@Ou2rjrM;cv+kHuiDKtvTrrsH`}{lwZ7l^nBgQC zA?P`lR2N|I@No0aIL$%m`6H=Be)?k7JCacDUF6J*5~Vr zN|XwSI=$`I9@g-G{&1>}?Hk%++T!A*xK*lZ20jZUB{)s7JFkJ#JQ#y^oJ zcI+-IB-1@~grcFp?*b2S22n7SZjy~w*zWF62-1j%MJx)m;lOMe&NiCRmVb(Q0E*VO zozKi6{EN@b5tvd{Ne8(@6LaNshEbU=4J1dMnfUmxTX8Vuk#Pa8C^biZe@es%2|Y~t zYm$HecJ(?J-E%w?%%!!{5QqULTb+iu#iJ`46_wvGKU@WZhp##3q@-AAu2P2ip?-B8 zX%D^U0IASOuEb)AUBr%{xS*LSM`m15_M>XDS!ylibd{%O#O&i;n35&qqlMaK3TLFi z%zm0CLko{mlK1_6b7u#8oTg!$In5F0)%8j}0rrY}p66X3;heU*9w07MCDTk^6C3x2 zVLpLP0(^UHT%?(j6^w?Ur3Yo^&KxI9kHTWY91@L3N<8lapsv3G%9z=vumWS^+Z>b* z76(9fqML;erV9}LeWGH<2B`rs4jO8JWomD%-N~TDr1Rul#UfhzlPw5M^*@5qKI28k z#fAy{DGCxgPj=^_{tB+OYnt-FbM2K}&{?<@ecKRcG}E`TsbEH+>r;MOCG)E9cGLlF zY6c9b@s)a@UPc9MWMW)jbktRg*IKM}+8xDu>2o{IqMKJeB)V97S@p5i0R%J-IgX0= zz*YuNCxU+RQ5<@psr0%hb-PEN}N~rp2A+F~7If^GhF@<%S|OxpzrA zr#o6&{aB{>JG8)+g(g~UCZ8&bI7Za_)aZ9{mT|v+I$6+jUY=ZTdX$!*S3Ab+XRz5m zKy2^qEXeu3DS13!Wg$snvDo<%Wx@H-;|nrs+QlTI%aVShnCF8%Y?#Grjf*TmCfsu= z0W$_5T8f)rx&dAJMaJy(X;QGQ7eon84s^Ku9c-!)p1&wgH?wd%wm{qKl!UtEM(ePb zf-Z8&Ioe_OPsgS#!%fPfE;YsVIewlrAG(n|9+btEqsk7RwA}M*_pCnt+HY{3TT{ym zwT8n04JC7+k?d9kUC5;)yyD3A7bQ!Z8Sv;z7WC}Pu*#{TGgx-QJJkK2v!z?)!F;HEkA)%pFxI`3k;I9*nM3{26vIJQz& zoYvHCu34r=-g-}TY_Gjd4G1h|)Vf-1)B0>rySblT6ZW{8 zCVBxuHc2OXMrZ2;QaKcpSAj&q=s6csu5Yw^+qb zs4EEhgS#`J_olf%RpYz1Vqh5Z%dUS)sHP&(`j>=2NM)4}jWT7Ev}1$M68BQ&c^2!o z9>1&`sS7ip=v?1j|7iMzNM`S%r5BpCw2G9{SA;t50z3_YQC=5nlh3dSoS6`or z@qPU2`rQBF@%b0E%j+@1CPoa8>6Kq(SRcn-S!FKp#~O!xjuF=rh}<2bEkADbNtZf?j^_LBSaExvdVQ;5}>r zpy)@@4#{vr@-oVN)5z{KMj5NOU3R>sOk{6LjCdDosi@=&78*gzsV)M&AeX#4U-$`L+2e*jot{jxGw zM!ZR`pZ-}?BM9W9n|#nk0P>2|SlW2W$jQ&|x-&Wku=VC7#gK0=Wq7_?fk30LIQO5@ z@o|Ct73?}QH%4aqMR0m>g0CbT2zK5I7{M3=ATz6j2YUd*4uDwvig9)ni9QLgj)qmN zP*t@LkY0}*U?^Z^6*xVusOiqH>3)j{3!_c>kpki^S9k9GbIn<}%!nkYv$ab_3I~BF zzQEP*6yC~wAsFNd7uhx_b{FUMFZq$+c{+J3<(n1hso$pjV3cha zpf(bV{y-_ot9a1T{3 z%oYk7H|fklwXHmmyN?Yp*;Vd?NC}T1>h<*AozL`1zAk<^>-gLnd0pE0kFw> z_8$TW#$}ZYeG;neC787J{mEcF9SL!Jv(JrVg}a|yxLxkIg6_{6-1h-EhjTFy2wN7W zDJ2WxK414a3mGdl&MksL=Z{vO>BStQQgK0LpaGDj+5FH;hkZ{405wo2N6&^IwJk@#CYhdUz3;&t1Nxs2YBNTJl;D~c>nGnFGYt>E z8?76QgwMH^&eG4Jkhm@!heL2OP%uiD@KS=0jq|<_$oTU3zVG=;bl;nF3()Cw z6={P3!f))CPY!eRu*%W^dI~eFw3(nu*Ds${dYPMcl_#k1>cn#KxxV}U@JeIn=|jQY zA!^^0BjO@OGaYnNT%I^f4HAt;tRij6@CxuJ!@`Kay`B-Ei*}qhug1gcp0e`p=*!@LHa>ONq})(VwzH6<(=AnxAT@+!s#C6wxfEG zg%Wk0@G?A9NLh?Wm*==4+{a>M_< z;`;*s;QM`~JD;NKBf&O;-L6f`^_-B1G?fxb`v%}8Gj|e3o`=8q7T|+_vJZ=Y&MHX+ zhnUmrqe{TR>~wjS3};P0gzbV2Vz^uDbz2=DFo=45e|;vjp>b=Gk$;8P-gRi7MN%wmy=3aE(v3%?YY+X;rxXBDS%jy;htZO-54#sAu2%J^h=n5Kq7rP zAW-jjtbp37Q(BtVF3#tLDPIA={`1@OEwbn3$J?Ho?i_sg3vk@QvON}=Gg(CPkx3uX zsmnF5*Y4JZQ$7Y!mK+&sY*4QYU*A1kU_)s7#t+;lWO)$B9$LjIk%>1;S9L#2J+da| zB(#%8=vSb+DOv7qpmrk`0<->5eT>%5sWc(i}9tAUG+@W=6F zkrLv3fC`v@=hpXK311PwA~gh{Pf=`8oOyct<-cTmE_uGpKG&qoGFKb) z>jcL-iLDL+B&p~E$4NoPDS(N2r@8VkuV+_GYqTKANQu;arDd+-)*AB0s;N~js}Gs2T-0sd@o!4NzjI8N6DS?W0deczBX=epw~1(3nH;`J%i^}7GzUHl7d>*atv1ZfRH10faY^Tl|Bd|XIp zIf*u&CoJG<=xr+A-a66ZiAdu7e{=2L$6cC2x(lRAnjlMz5Ht&glM3uA7jcR@l;>^6@7!v{7TO4NyJ05z6|DU-GuGIqAL4)#s04R z5M)tOQj8YKF;mgNE~Z>m{@bBuuTtAR_dtZz$x__`mnDhV3}qL4nF!ya5E706PbWn% z4x$P@6_np3L1I($}<0goScXt*s>bO868*4A&;fz!rcbJn3~%X zOTS@q&el1<3@$$2d_w2J{ANv&)41x8SYE(;?68P%3`y-C@+^2YEkrp5$6yg#t*~a! z9=2|Y-p6M=+(DLkYjgJ2E;sMw_MpQRe`(4Pb!3(BGl8(5RBJLO_5p94XEwrO!wh+H zFhVyXN+I*Pahj>3V-OyvfNX=ZH&{f5%2+%2FJ#7ObM^Q(s7b(se3nBP7c5Sg9)`Q|vLy`));-kr(fsdZBznCTW@H@SwY`fir2Iwi+U-zF> zwK4>v9`W(e%SgcjfY?HddasL?L1Rz^S75CJ!%~U5nJ?8 znmJJf*Ms{`zQ6+=2MJ?_r5>J(^8IbPgNWt()x3Lht6VIps=GP&r)qH3ew>5CgKn0Bv7JMdMuUi0D`~s^Eng7Fk5k%Me?;;g0tQ z|3>qi2rS{B5m4`En?h=HtT}R*N=Fzl>QR)2=EfB(2FnpJJ@7t9Hy|2%L62=k^5s%{ z*=fJt&x{x}qj?I;{nO6Fk!sRA(Hs?nk*+#>gre~ViWfO?TkXhsGp zv`p}J*LU@8W-!J*fLsMY5^Z<+$^l;RVteH(dQGAr9(L^<#+yq-pj$jg z=wj5J%y7VL)L|1%UufviXhaa%5a|TBh^8)05cV)asbs}i!{=<}rbUIr&np>8%@+Va z2lzj`!piBvQqCgYE&!_7BCG2tz#55{q>^R4qMTJ3>4P)(B1iG3EV0GF$Rn2Xd|}i} zFI7w${01%#szd0NzQDzwb3I=x4?AB4zJ=IQ)r^pA{a#cmfE62qum`&D8{IkIZ@I7V z`loqkvo3q0UrY{x*f29=GO&&-3(WPnPaUq;>{ee6d4S?U$^C2PFxDz_T;0>{0p#0L zhV9shxbFAMh{YUi1?|K40`pjyf~+?vh|I6c9zTc9t%tKGK-NBtJvJY9Wa z#}zkvfFH1^#t!SmcqL)AvYhJ2QvyPAbSSuS9<0C&3+nvIpA|I_@CvS1FhCF!1zEoE z#aTs#`ig)L(xwO~fV>^>eHp&heE0F?veoF6{TTk|%{=RS5C5H4?jvs^`0D8CDW#Ih zDUoXTeW&{oiR<>r_toGl`n|ySee%HfvEcg#UDKUzxjko%xD<2)1FYbekCvlS{PuT= z3Twn4Z^jhB<4blf3LO!5|>_w~Zmt*9I^_J^N>bW|Me`S4g{J?24sMncU(9lSUujKg^34c~W$ zZ$Z-d_4n8Hg72;CcePFRwkIGNq0HKBo+6*n{6G_BA32ErTU}>^(wCBO`E7hXRdCrp z&egZGX4-o1eJzokeZ01;Cy`8|)qI4x5dEO znn5qldmsh;M=B{a_lhJH*r@HjqtbxAYNghthn)&x?Gmv>l%zRCVeM&w)9Bk_{vP{J zfGcq_?eB<^93L#~<(g1M7&)Ftlw?}15SI=^EU)UwQOD5vF^9HHLk|i!pkCeYCEf57 zfX%=Q-}kX?h`fw6=0~XS3*^V`2yX~jTOHngz-1|wA)lN6At=9oI zVk-nG)v-U3Q4DiP;=T`YfAlOYV0Jp5G&4J_ zGbXcnR7ElC#_PF8ag6)%bk)l(p168r;taoAmIGz!TFMRRsxdHe3FvL$_@jh#v~fC!;a zCn9ViT~cGLZe{18bmWghMVOLmEr2&(8>FfA7R(X*YJ)4?w%zSeYI=5m^v*YLK6yVj zT?cH1YE?YkqD3<`U?qYZU;upkD<#GEWwGSu_K%M;>n8#1?b(bML@p8#(AS0BH;U); z<-i}G2ckiVfFE?72xK*y!GZ{Yb(l|TS-wvv?#D%?mj*d61E@STTC_NmwA{}`2L(zr zkqQ~)bSYMzDHV&NBJC$9F& zP%yf-AJa5Ds7CreKJO!i74N_A^svD0y1|<1dDS*Lk21skPHofi>5}PnHzvfkQJtbQ zD8se|2IO|0u@j|Ip$cqwqx*GbYyVa(+HlIMp1fuBE-S{qF}4p2P@|K?%ZWggDTAB>rgj$=cQ(0@%5$M#PX`<425dpS;JJ zPDqIddefO4Vfj!Eq@;y=7()#C^ulH8%(2@Rs6WtYnT@di)~i*h6ex(v@Yp}yZ2lrc zDnijN{iVEG!gr6kc<$W!X>B{9;Gq#B2N-;IUlviSyPh&FrTIFr)^&Ge{tF?MiY(&5koe zCw$-T|4u)!%rrCD(sPfi?bZkGKGLHeRDkleK*k5X@_2Jo@JDZ_+dIr0?Q=lOrZ2<~SGGlUmlGP(NZoEM_-eidG=m*zGhg6k&wn-@)NMpEcj8-)D4Rg2QRw zBf6icU&l4ySb#yklun=W0zU!GpcVIA~up;3&6Wt!jYYS%-RpaI%g6e4jP^H7!&))2q-{yjU;4VFq~!MU+RIej zB@8;M8XGO`&fR_T&O zqDRO6NBsJ9RwBuuc?3V^77u7SJ;|_{cNs7{cX|VYhP3co?>nC#B>ra1C*;pu)rvlQ z9PW=%qJJ*oM>CC@G#cNXW9~QJJB0y@+!m}E?0`-yFR_2BWs`8X$fO~BjciIZzR-*r z>(q&B*80A3P z9{iEgoG$MHm_m=llSs{;IgT6E2m#zCJ&6^FAozh@6+YR?X+t*@{+|8GjRnkDJiL4-|LCt zQ3NWOAWYGpSn~p<=jNSP+)AA;ENJjZp7$sHvH2ngiJSDp9VwE=4eNh#_RkoaM-xs_q7>gFKJB5soH;tc_~Uf$1e z!Sl60sw%X;-l(XJNu9cM2&ubmcRm7)g);B_4>SPW<#b~81{1jIuVJ>>Vv6dw*`(H+ zfFE`%S+4tU=QSzqSqs1C8YdWyg7oG!v0r~9otCOplp^8Ap2SfrrfJA;2eE@>$&M6m z8vM+)ziPH_eNEQ738wRgo=Bz{cs)>bvjCNu%sO6bL4W-JF73MF9yFq-s`*Eu>W#D z(LV@@e(6u?4q}$M9l`%*2MptW**9ZteVeH?v8%krVMANV@cI#x4op+JW59A@eu zamTo!`eCE##P&JSWIsfAvQU!0ACPlqxh*{Y?BF@K;@_kOtF&zk=7 zshT4}1RJSu##C`U(iC1aG9!A+Hl+@+LKKr!5{<^PHdXk#FZfH`7OqQb*r`yax1l?= z%-gaiwn@`m6?b_(c#se10O?^B$WfwR0*^w6DT%%4Iqum#9>}vd>Odjk@r28i`_oJ_ z^(|BxwYlwffoysXerkVRxn`iGv-T0a=#8Dn=xms)*Jtz?LN)Vi<9rzLc^y+ zYrLt9!`?x$a-TXNgK(jDlofSIyo)^e2`y-sl0p*Sw0!E+ZifSTB*}4IxiBjGMJxK* zH9oam3_V;SVH%E5Vw_>sk#r}sV(v=K)Gz&H6z4UkbDqwbHEpQ_x-wslK}6WnZnC%; zcDRTTJDHuT-l&@Vt3@FO7QtZE180QY>kum2<4%G(T_)3g7?b@Z(-9B_0B^-M#lG8v zk-Ga=^xf#_=&=yml!+H+UY2O(BzA9sL88P?w6osPT2xV_ce4{4+2>H+dA78z{y;^`~ekeE^z^K z3&%7EQ=P^a{z;7r1?EN~&Qv@Jl^;ihotGszEe%szM&{Q9BVdk!4d{d8P0!nDRV&r~ zsZwYX8Z-Ce3M9)r_1lyUth_NomN}W6AOf{P(tdW-uR4;_TNYC0RE!*g{C(A_Cb0B| zAIaamTWwUV3j3Ao&KK;JDJI*@cWpAk@*-{?Vm?4*S(gK;EB+B>`M4enriKxcnx58& zQ-9-8Ww~Bw2&r17Npi)wsb~Cp&ny+n7%GjU+_bnEe#EoO?sp9-wCY+tF;t&+?m^~i zH&qW?c0gdvMKTkt$Uznu2pEQPg^%IA^4uG*y?4YIpmsZ|^J3UCWZJqsx^!&lq_(=r zVdDxZ#*ZRujS~-Y<=q~!vkG?ToC+5DFLI=mv`RMO-k2o%am-6t7)e9r4FhZ+n5S}4 zbnFW@42uZMyxf#))+z30+UGd7aA6@%pFHFfm(e3dP$EU3DWj$>nX%a2ZU}U?yRbif z@P`C}?@7rNC{iebm&2@a-8ECZ3*ag6q9^Cvl}&6nC&%p?NtRgFH|;aEpJ$%AUyRTv z^I`WFCA)xauENpqamRy(MPr1918W=_?2nChtX%MqgsX?(LBIrGy)G>^YxVr=YDr&7 zIubGNKx=WWtu0B8`blK?uNFm7!Y=ta*4ntN7SH9)b6+v9SQ}^&+j*|oZHy^Sedo(9JzinBAPL*2l-!1A;?!p0{+#m=kA;Ze3x@vPTLlG$~P;;Bo+pXBR~|+V{rd2lQKP zXyEXOM5N~iS#`j{M9ob}4&Vm|2mc(b&6({o`SC9vQ4tMfZa%vIuvjkZou`=^I5@bk=LRH^v8OV6Ro6f4g2ViI|D+6ft5Ezu?%*G z=~VP*RMghBO9#}z4Js|yq{=Au{*-0g8ZlH(ZxcO6*^*UvH48wEDaxP@48b_Hp$U)( zC5{{0OX~BZ7!qSm6`$ggAN{ODCJG=dF^`xuSO(@NeA3GX^Qpe&XmCo}a~~wmLnDLc zW=+IcBZB?yk`EPZ0PKT6pzrHcEufS>bSH$Gu}2-4k#;K+KYaQ;xtXA3k0#?JE}f@N zF5aG(XsEGdB=3VqEer)LdK0sd*c;Gfq1b1{W3!?H1;VzHqQn7!_J*LjvS}<#Q>2ib z+9jT7amN_83J_@9@M3UpG@=To;;K}v$k!~@x$fv(taYG|loT65Sk3UBOlL*@yMJr* zMHu+_4V%U|exr<=)~IRbBLr1QAqkq(?5vD7)0=HVQ{uE05P|*xb@UHb$FD#^0fN*e zNpL{tC74zWt&ljHV_F9nvR2QU1%$@9m;C>*0P&~E4?H{j{yohZQ^~Hp3YK#kq%h(& zrZUI4knScK|E8L$JPiJf{t2sjDD@t5DX=9{MEwv20P%l+69c1Bw`2%?~&vEjs z46VMfAIr$*E0=|-*a=Vs>ErvK{JP^#e^1a0&X1N12)4>QBp0iN?!HdA@}PtjxzC1u z*3tOO2Vmo42!=)8hKH-^MuMB0AVkopjw?>4|J=A3lbFom!*7xlf#OA!;pit9>{$ss zX*VMdXHZ<^Z&IX}Ss-Sa;#zNze!`UZ?I#J=3cbj{JtApXZp6n8QJF>F>Iio zlBY%sF{%Jeh$gdHun~EvW}N39y#{ngjZ>g1rmRYshdN*H;f6g-u((_=`vG}3iO6eP z&#KCiX{+@IH5=;tiO$~QoukiMsN1N%;o#N~t3u=F?gKze&x!4?SHJJf>5RHB*+I;Z z#*oj?r;*k~{x)q^hki81>WxbnSTsgO<}%I%@{o^C9C({PkuIH)JL8F{ z^yp=Ilv&76-uP8!`u9L!W)!o;Ia#QL)h{LSORShIdY3f&f}S!KLqp+yZSf-L_jJHYs}FMNBr*DP|Z&5znwgJ zlq*n`Em1xes$1&muTiWsn^*mTdD20vXu#pG z7ngl5SVDS_@$f!hwA9D}`-h_!@s4_iybBvv(1{Bd7Am?VG5$Dz8H;IB#_soI2HOlX zaQMd{-W{+pO2ApMk8I7#K<>_nDc>{4$DWGXXGOIL2+z{W_vb=RUyj$u0n(_F#a|Ul zR3Q=@)}yw&1~$LC&P~bF=LTw_f~EesfzUkWBAK*l`S8?pYipd3368WewCLjk&p*oAczY2xr^beAux&&CgV7vHq}&#_A+~AFXBXzms6r- zXxh1^wFY}M%r8cMQDOWwQS(8ri7(GY%Zm~WCF*DtgP*t0M{Dqk5xu4dwL%9z0qvj zVN~1q*?D&b+O$7}Y`nZa)asL|BX-+pdB20{pwi9&cDBQBN^-cGk@bgN;BjR0<8AyD zhSLSa0^!B7pMCs?ePBl`*YH`Psog>?Yr^rw>}Q1uQ84lr%g;$QK1+57=JAEv=y-aoGJj9Sd=3zX_SHFtTJJrBbN- zUS8M%Ppf4H zc-;QsXzaNEL(^FX#nm-icyM=u2Zs#qE(z{VaCZ+Lg1fux;1FIUXmAPc?!nz%gWbbd zb*uPAafXpS`*g4MtllMb?q@4>+hV$k5jAfn|9v5a0>DO7Q`0LBzvs)i&B^?prpLwp6%8 z<6;u~jKxbAK%3c>HAj>i9j9zDktL0zD7xVgEZJ$Uq+JnEVo3xC;=>|N;|^cP(?mop z0==Q6BI0y(79>+Nn_8>WBxFV2nxs&bIje?Z?%O0Ga&pU6b_x<6rwm zDj96Ot56=J-Qkql#>}x2Olid(9Y8x_Wb^?CQj&1Sk_tt(p0%K;&CCE7#|d9y8ADco z?B{sAhTvCQ&(PW}H%txBVJCDw zN>YYDAf|4Ieg<>|K!tN9Bpbku2<;IgDW-Y~HH5=40vxH;KUzQu2M6`x#*-bzyqx+s zb0p$(!pN1ywBMF??l@?`%}lKJ2?fSRt33t(3>;Fwj(;tvo70nioAGz$)3p>Yx@wDp z8E#5R_@Q5BaZH`MUAor2LNl^rHpkfmt>vIarnN^s^L)*|!)F9S#p^|^UMF0Nzk1DZ zb_^CX_3Xl?(Mf(+Wu@^6kPho|@&Yi&-kT zLrV;)vgty$c-GVwl&}TKlybBSTy(W_SQfl%H#eL>lU_atZ`9N;@3_I1=2+V2KA)n% zvU*Mt*lsPoLyau@-HE=O0ucV65c^M}T{Kx>uqfjVdA7SdqKbYf4I>(xp zUjnVi0w=KEQF!hF1Eo*|h{@X|2r>|KLpAkTg&i1EHuVoCdEXK^=p zdEK9R_gJ+2IfpQ**jv_|qDf;sl1r(ptI5*0(@(8j>KpVSHVuIWzjA~Ac)X6!kEK=zqrq-J`pW(` z&6p3yuNe)Y!`Zm;v#@{%T*~EVRWn`7FY2iUV0QSz4D8nyY0nr%$9hS5+o?%{;C{qj zVlrZ!gb39#>THeF7+Grztvo^j-8W|+;7+f?l%`Upt_+49tZ&Yk;glckML0}Y;ZI;AB;IK=1q$} zCo$U0bA;*5KOY$M{MmY?_1s*0T!~tlA7>+ota!L2l;0=MIRxmjmyD%c2Qp&_>jgfl z9Tm|5CK0#YN;p8HP{o?QOJX0LeOBGixEb}TF+29rA{48;#6*QcaGLRi!QEe|M&Uv7 z(Q(^Lxv#jyJa(K0n~+cc;QCZ$*y&Rn?}DJ!3DA(ju7pif<``$hM6O$FwwJB4ld^F|oWaZz*f;Xm)34D%ERDpuhZyGm7rk0W; zHZC#ft6-fW8gxD=Jq34%G5=N<9^OUX8|OpnGa-yEl%PoA8vW6)OOFS)Vl?Tzx5lDD zKi#l^S3BNhX|>cwxi?|*R24;B2zzY3TDh)+H!M%(bjTiD^n^;vQ>~ zgXx2u*ij8PdO-WE(1KWlUOrk@_$B;z^Ni8$E)kimeG_388dNu>+DzHzXxZYx%NjNk zA!k^kuIXaA{D%IlwHw-%s~)m~DJwuTecbnBUa!-sRE-G2>A>?{=reH|w487v(Q_W6 zX}Ydzy#U1Z+3KeUOrlsW+{nJIi<2zQ*S_8)t1cOvr?ci@ebyEvCL8e8=@>$cpU>HK zZkpd~4~E~O71fGQ;|%X?7!dFa9dB3#NBvNGBdLWlGOtOT)iI$0xwu)HtJz z>*)nTnB_Q-GzdQF>egV7)-Z`I_~8^wAh0M;c@3SiJ7|o=Sq%^IFcL^7AnvKquImDK zQID`5+{R z(aot1OW=kqcD{iip8u@t0UgqP*_!w5`5G?sm^b!v)?@}WU6ppjBqJV~8Dx$LYt{Jo z00Z8!Y`zW+@sY1pgX-7%`SxG})#ByzH7_8&4i{tpwp$8JVbB}~JDYfSa~elXXR3nC z2@h2Giovmp4>}(3rwCB_oMDf!-g(zXKV?#v64pRUEZ*xNP!kuus7S_+4 z?VWzHSbUhGlDgh=gKcEiE=kT3Y$(>1cL{rWDDcJo|i@~U( z>ci&p<5@iFJw@7~!c%%cHO3_P;e@vb{-sN*LFWT3W}y%Jh?>rTx|$cV_J3jZJ8H-M zJG1j5RUH)S!uAGcHR|FGI$US8$+bUpdh(Y)MVnAN@tS$E5};yAVjVRQ(Wl5d5XjJk z)lPc-{)b@t)NEjRugLA9j19}xO`V7aROr|_sLejkU7P3H%z)a%O}j1pyTO4w>)_Ut zofKPBxp*UOL|GA?D55|bn%!y!0SbosSfJ!T}hyR)$yRe{fKQ1@-3V;UzU?fMVH>RdS88>E~ZCV3RfKp zbt+A!xn>&|FL&-vV#?!?cqRS%@gP^Vf)mw4!<{ZH^?i9W;#r70J)6 zBbcyoAoS%^yi<%k4L7K?6+h$p`M;;=I+e8U=W9V}-_IrMmc%PHdRCfUHoyomlBNgH z4Q^A??8GMNQSb|%1cHe&U+P{)FisQ|0frA$)i4FJ^y9~U4l;%p^Hrow4icpK~2KI9N+qA~dYWCBfU$W0PRn3h_? z#xPUZi(u!)JMUVKsdZ9D%-ib7cC#P>p2E!#iim;LE;$q2&L4 z#J1r~?2C16>{H8ewsz;SZu|@E&XfE-w>&Fg1n(K^Qsc4Axn{V!-RuPG?Sx&e3*EmY zs^ZLy^F-Gt4WVD7_!8N8V}rn`?{E!4Frqic3xwg&4p*u`WlyIu718True9GP)%?P` zf=h^lYSLmJK0FClg+SJ?KpAZGc(tq5?%8lK>jjBplr>E25^MY`bZJY`4*HAiDcu(; z)mV7aYrHnazzbhzIl(>AvD7;{ipn;mnm-N9|7;}Z6xRnm?GyBnJ5}@j9!;i2OUz#5fSDqb33j1^3273p3oku|qM7qx2XMzM2 zNSSycqEJAAH>ZO}5uonDy>xo7Fm}wlg-6r}-$pjV$cAOEN?f>dcnfSW5(CfozdSIK zot*%5Y30X)zE+)QLprNfxl4{VR~iT90LQFTBma$4A^cY+DD!f)!j?O zEnNHDSRHlQ`kbG?3CEHOgbJLs;Q%Xy$D~GsT5(1m5d~1nOE}lLL9U1#$#@IA)EyiX-GhI@{8!F=Kq&JM?qpxb$N_TOH7**`8M`d?rm-Vd(FcY{%F zdh`^iVt^P3b!0|)XN<1ZZXi{uf#d1Oi`a+YZ+j!J>w_zI?jInf+S)4nMYD`6xAC;L zzTrM)oBZTHjIkw|JyO{zvCEWam^Zd}V5rIzp`G+!k$X2r$;>GcYv8z~a3*$izPAD0)y6(ar zI=_9QlpAHF2nu6H^4}^qd?Er+I&IxXlb(OK@cFm9ET*T+4ITgj=Lk@7yrv^~X4;|p zEFIxqXYKeSsmy&<_=dd*Yxlz7V#k9E;}xI#RbchvXZr!{r#Ah(X0+wTSOpT@!l@e; zx+vi}Yi(?b4R6*E;~%)YQMKWK^A@q;Qg)YORWZg)ef&>j5VU?hN7^e-I8t%PE7+>y zFWOLPUfg-~EX~pTb(OZ{OXMk`H8eSuBq5ic`rdFB08uj}MY9-4-qkiF!>Ch_=yqhx zr+B70k%ZYX*BsX6Pvpg(aEOW=8{W#g9p|OSSe@8Aq}(%ao+Cu-pi+6}McU@S?;@Lz ziA#M&Ka!y)DSor%no8Jyz)Rsqus+DvOs`Z&cp<`}2S4hl({FfVGku~F8#Kb~MWweO z0WhYffD01<|B%2Xfs z;bRT30rybJ(pdBna#Xk)1Y2(oSbC@EG>=AGRNS6FUotYcm5#QDB{?bG(= zb1qiC)H?>GGUqF_nVR-~BqeFpn7}!--)bO%;)L%2(c#4NQexUX>Cee)FVmTr^*+ zSLl8vXs9`fQlzMo*pU@6A(5_^g#o(TzjUe2GAs1Z$cQMTCs3@zJ6goV9pU z2P^X+SW|cUlXr+5HGvkX--ZiDt+e*H7Gs`HCBRH|9b*}+jz$+!up*Luu~t{sIe+xw zrzTamGtfhpH4ir#a$ICoz_KJV=EY=%Dlf~NeL;rph!YD#-+VO%r-XC-HVyxk&ScE68ty-+#Ag(L=6G2ykxUw{bza+JwAjbTu!rmz$Cou3zxo~HyEfBT+==T~g-HJ*jml?Rk;H{h((JgHexbZF`O00x9~fAQJB%wiwOjQBsw)x1Ti0zp%xMH+=h-(V5OVYsXFF#D0NmNckoS|K;cF-2pJ?u=!=d zYyaDG?sSddQ$?M$?dl&1VAZ#tcMvzO`U+@s`bc*hWEM;Js4J^yjK4pLm8(KBW5U&f z9CyI8UkBI5vx)?Gf?~JH2~mrF?CK~autrYWa64UeK>>hOPgV&GKK7vL+<#v^b`qqV z#(~Wbz_XezpVskRQ>FHxvcEch*<#x}%;Me*IQ?7W_$P3MK*Tn?!Ht2``$B}Uto{1C z--1zj*&zqtx3x|gEKJf7;FQgsTa-jcZY(LM*#AhdKGCHNzl%Qo1O0=MbP4U{AYMO@ zxv!ZDv$;R+2nAnzaR8lovB?-_Zz3x!$znn>7x6yZ^Ecwd7Pd%-G{WGmUedU3nO}CV z6}Rp?bq(=*{Q;<&?^{zAw?pqv+mFO8Te*f=h}*JT`s$8xc-a`^71CorG5rh?@FuJp zU;y=w9&@1CD2OD=z2U3#D9udH|#5rg!WRnR`Ncuo~ zgbYlQ#x6D@C6)D_2ya(Sp;QcDX2;wEu@IxpKsZTuont=% zN^(KI#|H8t78>b9^GAZaxn7xAmG!L^mx-WINs|7badVCblN5G-2NZ?J;|-xgfyUl7 z>3l_WF~00Nfc`m({VWxVF3+r%mU}s9mUjio1ljPdR?lKm?D}IV04gd!V9-* z%}1)uhD_Ay&5eIqqd>I4c*=P_SrhyXt}=_(s;^1oLpU33+L@x)V)<2`<#VF87Vz&5 zgF5|B4SINd`2;V3l-=wJb2?dMZ5_O993q)2`+Mq z5#tb!L{0^#KCd;7mGoNnRQFbRE7hmFO&3@9CG4CQ6RA=@CuzT zHbelQ+_l9%X|9hAxv$``$qPc!P_2~qTbw$bfk_nU1WWPIxLBu;@wl4ovoH-EoRk>6 zE9-_a@NLrSbokhRWGV@#=AFNq{UAzJY)J3cm>()$ngf(f1whBTgjtr?8@a+wDuf8l zX!slTc)qe{h0n!I@r9-MtiMx8@{XnG3?gA@mU(P-boP@(IiCcf)xbM}mI|pG9Qb$u zL-_wJz;O$~4MO;q^yuw0=SO;C5AOr*%;T+(7JMC7jH&w0W5#TC216H&{}qqXM!oslf zm}no&8~^qJ!WZ=_0NT87j0IraC~8bk%lQf<+(@{xq^5ELTx9sm5)KkRXIQB?62i=g z*ng5PM}2w@_CuU}8uP{@+(Tm%9X75Ejz`pb?))I2qTqCDa@cC9jTb4M0e%vyDnIVp zhiTadsAJpW(8<)@#N%^!HkpY>%016`5MwoVC?$3S{9&&(F%LA1Sm##~4``yEsU8{W zJ|1MMCGTjz{g}b&>4-iQWjyMeqhEd>vlIo;j_0dF3UPg}MmaqG9hP1O+;+ZG!8#&s=~8jcLePjMB~3#hUkT)by`RXpi7`JkaPpp1=8!TKxz#d(7q7 z4Ee-cO*E7!V@3qI+Q5#S-ovy~ZFQrgLSwuhT*P)tcFhh<;QO3G(@_u~Kc`m0MPlz@ zGOr<*sE(U9`a1D3z6YFG`*Y4=KU%TG-xh5GaV%q(gwLCx%5s|FPV3CQ6#&i`8^4hm zP)Fvi`nVeO+4uhUUsxB^I2aT-ldAcYk>C{m8<@|`HHvSDmUr=AUgA_koOdc(y`%3q zkz|gr-@N5tEAXN}nr(Z9nGPeK%hEbE9J>^Wa3L6*fk80^M{!dEwTA>XZ4?vmQz9f; zeh(GSX9z~(8+sz?HadjN6M5a8BqWN}5TVX>l$>#miKbnw&=MPOcQ4f7flN)^>dKgM zTsEy{iZ56ycQJmo*qAXnoyjQL{6|7gz(a|UX!Oh52sg!|zv&MSm%$mJLV8qn=Fv&) z%XN+0?YLW5st>OrhkSu9AmB&*!H|YrXFLVC)gk0x*4?lqv4~~XiBjt$>F^EM>QA_n>|+V+drd_KsZ8LN(=XTQW*YO7b{s-Un6I7`=LPW+}{UY9K!W%je~O6@eF>nfF}q9f_$r z-UPZGsdt0wWTgS+Jun3z{U59ox4J|)WM@I+{MYiMS-{_^KFkBW`G=7-)AJ6WMfbZU ztq$+zmF31YPh!B5j<_YBH{Je+2C#51Pj^7MN(v%D_$zHWrh;tP`p+iYd6;go;eY8L zmglfvJ}<{jS3zXrnda#kkba^2)iCQs@7E0k;dnVOEUBQnVR=hRw336nS$-VjXn9-M zVV*Du(GTva;pa{$A81ZQ+vnel~a#BgQ3mbdL=};To(ZvX8hwWh-XI zjzmfH+72_UvGg|fv{Qix)1BQhH`ns*YC_rG!$~Z+N^sTqih3w zx-4e8s`UBur3N7s$>r&<9p_OK1U%)OqbO!jN^0}q2ZQlCi`c;9jzrR|aD4$`rn6pdh{>{H`a{$H~BB)du5xTH^^1LT0o2*1~ho2TXM%N4g$9f-l zkLs5~kIb%kREV>Et~z3^JM?YPFrNqN0JZG1~6Z zP}D=qR?g%hrvRkX%zEsvsMuK13Ob#GQ0Q#Rp=k<90TJIK(T(6mbr%UO~pKLyty!;r&?1sIeW|xG+=$mcl z<3k`vC&Cx$IubLgTE5y3thmh3$8-iH`vH3BzpuP4bB8M^e6Ky#j?U|im$qol_Dd8^sI5>*{?>%3s%Ycu?G31Rh#9gn%6;CrXsUC`vL$&mA;|aofAUIISIO5GM zuzPWik0QIqW~ri=HUf^XRiBdH8I3>qZzV6f06ajGo;+s-2N(|1vrSE`9+4R4XF!bY z3u%U8pEGU2UQj_$WqM$#8qpy^ey>eK=E&%@-*&Pt7G&kSeD94AnRP0;jI)Y3TUV5+ zhk+9!#~6{b#TawFqIprjB&Lel=)W!A5O*YQf>6n^)OjrIc>nzay14duiVGBRf41YT zrSjtzX#^NkA6U3ueiJm3QY7!)c$VKtp|Q@OEm+$eqHt=8C3ZA0cGbmT1$kj|)aSTP zmpJtLy&=)md}T2ConVg?<~2f!?YZ1XY3M83i&sto|5`m=(TpXn6vPb;^T`ehcHuTy z);5h>&mw}X(XHn)W7%~Y}cDj@iNeP+@6`%_&Q&%q282jTc&on^HW1OONv>_P;H7#GLRL`qxnT-*Z z(=X)&yPzVf9N%;NgiRAf&MHsKf06C*)Pa#>A)O+L_vxY*m91EiIZm}!JzKpfA)y#M z-cCCI!8k${eK4#nII6naGJF z6lQ4!oUs(W?=0>nl@uUK#lRr?xC0!V93`H<86E`d@TQj}=yQ;o(#-7kSTb4!u_I2{ zfVX$h#h3v(zWScX8+#Vn&aP0)qfhzyWmHw)Y&U5Hd~>P=g+P%w7#5be#C5UZt9K=Q z#iihVo<8&@tOK*-P@$6QvlA0*^6?XRN_$!dNKD!3PiAHhv$!3c``)HnL!B_9(FwH3y?68l3#UY$qyaYYL4V@K>q1lE5!Xre z1TvTTN0tO{92@2b5pjDS*3$h2p7;5C=SXFp?4UrA@v$^S`6Lo)SJjEqHrn(t!-ui% z{W(}rB5G;H>=f1CWL0Eqro~AOmxOKa*1r|pG3bBoRgcf)oSEUU!g3JdL+?LwyLsxz z8TEw}#`IBuV)wd|(L_Xx1FSOe=#Q(Lsy?w=y}DOr*(O~}zL|5sg?+xs*Ia$pPVLxh z=z`h`HyU%GkT8zec%o7kzq8NenHe5)5huJeLj_8J4i$0+W?x5@13O^QI z?GXhMxuUgQFJYF*1HsTjjp_vyL+ag2?uuWb~Hm*C-~K<%AYexfK)D!@qdr)am>h zcTWGbO$Ufg7Og^6bwcAxJA1jtl%uv?JFswXRm2HV|9c znF6~5c7N040QM~*)*5L^8&0;`0fS+i#N|k_yjvR~#&kl7smbD9Eq+Js)W|25+~`&#?Gp8dS`t5Bn+yqZU^D!YX6U0eb-jK#d4d&0RFYUkiW4Gv-n1~z& zlglK&+mFHd;(8A57eVnbJ^C&=QO`{d9oBXuL>-$1o(HPm`5O33Yiq)bD7gj9wyYLX zvispwm290p{TckT?Z-n`hlC0l2>3+ycQG&ny;vvKId}zTL_au-r+U9^Iza(TDuIGg zd0=fbAtnpUl|VJ?@7Tu$XV9FiE|i_e>o+p_GiaBj6n#;UwJ%npu< zYuaqPvr#NG=22isVEfr}Y&T!#zB}QhN_=>TU2TdF-t4DK)n(*~tJU(RhgcheK)HIA z=$ArUUCf{l@sUq=Nc#}uKI_cLO7%o)c)~QDK~e#x`3y;M1KSGCmIobOITe zZ8vUVNZbzigXImnZ31!WPyp8QNG%0C@q|~3kh9U_Cpl^*f38$7I!1)ASqYZqv&&rx znng97Be+(NU;U80aQ}9HV`_gO%~UU~(t16lDCK zlCb5_xq#!xX0dLbk=5#^g*Q`BB&z~Z^UaDkjf=es%|@dB?Tn^N__ve2rdYTp%g@g4 znd?{IE4m(Xlfl_v3!X>G5Ndl++CH#;3Kt|}$coB=!`zY_!553!?!>I7Y4zEOC=Wxb z$dMq;8A4QR!d1)69Bu$YZ&57U!WM5}Ii)5{ZVXG2 z?-a2oXBL2fMzgYmkN*wU3Vw*$Ca`z@Y@CGPOYWn}Ua3ysEyE4+EzC0x(wnA+8a96v zT&pijL8s^WR^6l_YsX_q5;bEl!RPQunY_8E@VoK&2^P$wD$1*F8JPnc;_y*d;MA-~$` zHpXEr9rO#RWaV~Vf4{s1N>W8DOFVU_qBi*2 zP3OMX>`sjxvR=nN3W%#DTT0gRC2x0Kk`N|1j_DyHi^Y(JPSmD@vZ#kcO_&3>$xG_f zRgApDC1A$>Svoxxm1xU4aKb+q=H*1&+_jY`)}cb2i|P8a7S^J%4r?2iPYs9m8WSQr z4|JNaY{@o^U%I2cFS9jaOGWdI9O3ED*Qu>3t+@MjmkBVwP{k%ueC}c;!Hk|u+t{*_ zV#h4T6|?~@UwbML!2O+xdwk$-p9?)Kp>9)QObPx?gbojgGFR<##n=E~I8Dvw0VCjM zULCy%MF)fGM1phMvseTl#JZ56R<$%bC)+1Zp4m`mW1R*?miki8ltT<$-l)^hN{PzG z_x(({Fhm5A`|U5uPPC2a+4FHiz4OC_OFYy^()D|+=%Qae`aUk#Oa6#uL)KK049J@U zb&N1pVvbak?masRkmw!8BM4<5c7J^--T}-`a)w1lb^CvF^jo|MY?(g(b{xVG5Lou! zez9uX3N%k3O<0WU(wxYbZ@Xly(!Jk8depG|%j{aN?3!r4yXtqxomop)ygC9m_T-+$ z7rSOv+thF8gi~bXhR|3Pgqg$X?0wv@<~MpKYDP?K5mRe27(X;}&TreGx{;NB|7zvv z{`za~I6YfnA-jxKyjd%_prmX7L|`$sc$E5#PaDBT=_;f&eX==b(qZRgHwu!>+rZYG zFM93Bdk7;dQGs$olAgBWo+3j9EF_ikh0P+m*T+m-@murj5(TXWo0K_0S4>z)b%>;` zVpq{C9pA4=e7>bsM}4L;<^YYwksQmjT~!%RnBS@qY*5iI&XHeRQI?~fMySD;$iHl5 zTkUZ(#g@H?i86|<>Gj=X_kw&4zlg+2n8`>=dP2b=%D5r%Z0H;?ow+P#zcG$UgQ)ij zE<6imHfA#!DIWH@s{CC%zX7@-F48eKI zjO?D{L6kI#4vMVZ;WVk;tjUz0qvc)3t5O~|`*yB@Au50jv^<9Q&un%h+8=unn=tk5 zYa%rOk6OjX7~9#&8!Wc2Jt_hg#3tnFtfxRCN(BrXzAbJMBiqb}q21j4UpS23OU$od90rD@}N7SLBEuzEgwBg+=?3*2U z=~()r;X|+bryde7I9#tx)lhUctg0oG2wTS91ml!jGb>N? z)eoA|_Q;_1=lRBq^QtBjt5pko>Pm4VdZ*Vh&M(@5<$6Py;->>{+79S+Bp$J!WaXx{ zil)+#rXyL8EHZmVJX~dy;>NNm*wrM@n6nRy33cVBPI94PZINw`Q{xb;Qzo-J){p;O z3$2T@i1s&&$KMBm09`;5OgfjNhhm<(WDKA-Fk}G50>jQF|Fa*Ai!64ij0wBtJ@k{K zV-*ORXG0e>ja+AT_x1;D#r1lm7)cnG^EIYdhdmCA zZQrXPfw#76$E)EK>1kZU$0N-ei(8u$>d#H@4=`f*LJ!&i>|5-#G$F5h6Ci#8?SGl1 zTPx20D_U%WSZKug>snhh>k@o@B8DEMy;RYY}Eu5^4^%GQA3fVI` zU~q?$tvI9nhB$?CvOY>OO^)^FxGcCSE$)41G6*7C5`!FXQIWl}l7Moby74a(FbpML z;-9&dfSCrshzRK!#{FY8qFf7|MXPA+ll!N{fX9wFaMaGVQ~-y2oMd(sK^Vl`aW(L{ z{Wqm%dq{Cqe7@&bZ>nw zS4QmpH{Z~Yx58GoOcb8Ed?C&Pae{raxcW%Md|( zvzC-vPFitqHZuc(7u5B8r<+AK!JCU7065K3`uq{FGg1_YBx#BHoOcj?z0cdjw+R5u zMmUv8pFZnN&hQZ#;PZg=Q-yXr5$IxeM#*&GdV&g7tnL2Zk8D_F@w-u{_c)M6hO6K*ch+|QTbS_98NJ1}-wEFY)0uxYNmp|Shzy$b9 z&i1meo^(&954!1dSnhX#j;++_$9b(mO0;rGqY4JKupQ@U zKZ@%-_qLS;1NIF)L{!@frQ(JwHOn;2#WgF{;d*C)j{^kwUfta$z2u$#0CZW12|LS0 z7P{=*zI5vTzUX*mH(yWxhJh2@@3Y-w!I>9+ENPLBUztVBj!(>!kvt%l%7McTM;cNW zm+1L~gp6h=D9h*jUJLqBIt>6h)Q$^mMEoP~mnFfc3uzW zjqnLL-~KId*0sE@%j6YJ@#{GonUfOEe~8b;@ov7-83zv;?trmJ31Ym7VswADdL<0; zxzn~2c(O|v*kHr`#oUzZNxDu9R@z4A?2zjrLi_3v^t;7)B(Wsy$8c zRF~%LJg;`7OXjJ@V#CfxfE_S<)~g!c@B_AjOp`fHrCdE;Mf)p72CpWaY3-n&F@Z#& z=Gpxdz)&IvLMQSDlHqQ&L<+VxXmu|VPqDx@e?)uyK|HG|85#~DpC;jDKllb1j~)-K zEvpVyef_~W7DY=xe{zZdIE%p+ttS14L-jf*aRSM}O-N=Y5WWt9*?3O@03sW$Ri)E4 z#y21l+2sA^Tt>Z3?4>wPFVLWa28<&d033HQ7qe)PdlUNJ&2XuhE^}JV+lI&wy6Lg+ z<*RBidn+&khQ=samWCJo;sHl#>(hiF6`g&h zMi2}jDtR&c{#$YJxGYY)nCIyv1OO1=`aNBTp%BWfF-;QiU+<*crsIW4Qq z_3$k@==}q4op)8Yjj`J;Zx$B!XFds(AB5=HbW^6o0nVp^;k!1UC^PoVj{0O z%FSd5BfH-1pKX8;n0h7h;S8lLX^>miwX}`Uc2)2!il|?{>E@ z9@LI!m+AiaX6d(1G%{#|R?iP{IRasg>yMVtY(I)=HrrK^ot~WsTw7tftaxFg|KxT) zvkO05hb40aMwe<9QmtF9k{;5xUXDM3JyDG`DZeJ4MLw>*y#C;5Ez{|?Y04#H9~R3!0F&k%x34E^YHI^SLf|U&+rn`^DIvS-Y7TKd|5l~v z_&O&?7crFLZi_0p%|>eXZN%kH+QgfaXmjlwxAG*1qic0jQ~3VEyrYG=1hO$S+NYBr zN6nvN;r6du=8a-L$ivp%P79CQbi)7#QIfA+=>_kyk`_?pE(Ji-XpT1EU9p+*u`|zq z=uX|j3#<*UjWC@S8n=h>M`juF+dOO3+9p9fRd34aN`8K)nML?gaio0=>rasEl~F;@)1$9! zkFBr&xDKB>U4MK`1CSKO8=~^^a*x~L6n7_;DbofcD2|c`+n4{kJ$Of_Rm}SL+tUj4 z@ZpCi^{E=ai|l;plfS5z$MuEJ5=fO3$8%xTPEW#!zTgj ztg9`<_eJsYyx%RjbAKsiIkDA#zdleHC%9a|@HV5QR&#Z5#jcpm8z9md2fX7KL!WX7 zEgh@ulh59wZICLYdzlt}BHKWaAOEbMN4(CBcWV(-bsjDp3jumV>_Q{Mi}Y-!>Hx{ zVOX;ytDGRSS~T2>0p*nxv2sz6*Mkcj1z**tP9Fa7yzUnP4CXVEr#L!PE3Iy;4<70X z0}p+1V$VQygnUyD%^j!nURz!Iv$H8ywo|u|(WNzX>h#?bq49j>Po-{SHBW{SE5SzD zr`+D=I!l~|bO#cL&%5|JOL8sW$3O^9GGEthp3}aXw+PzBpiN##iG5g=o>wu~mi?U4 zUZ+J#FS+_FM)YFxLU{~jp&EyZQ z(IEjeqr9e}R8dKI5&^);9LR6(+wiYfDVjRHWxDI$K@-AHsOx^aAEpT%6J;-3jT*93 zWrkAIln z-+T2%{v#6?)60-E7K|+fUm3Ly<{~OIpl_U?7G*BJ*cSUzS%b_BV^N*ILtmh>YZELg-75`!O%) zm3#vWz!%fIZZ!?ekPiHCu(_`42D=UPT__ zHE!I>M4AJGPjh^34hENRIty^|{k=i#oY)>76nPc&IX!769~ithlD;on9M-of>hqWAMv67sr51enO_D7o2Vz*Qu@wom<~-qx=)y&h}t@dR- zhysVw9($~J@fb{&v;_zix58C^L=(Wr--rdvNTT!O7N^Y4CRYDPhqoIR>)VnacxJX5me=)-BywN|Fj7QXQZBTS5unc0Ms zq~O2*f@40pCXVNGHA`rw6(_D>QO@R*qKMjXAZYxZ4Mv4$uby=sX^J%}k~g@NMWO|t zbM@Qd4__;+TRf9=&lY6m;B&3>N+ck&Bn`o~*M^m4A?Y|twitIH)k|YD{a*kL4f66- z3l5l0k5-4wWl^B68)@r_x(+WqQW#}nMX0L3uWK?72(27d&%gdU7c39USoF=A4_PAz z0=L1^+Gqqb!jxlHcQK}2W9jwEl)h2Xm~{-Qs-g;bM8S~&Vd~=nH5~Rk;LD+fJE6lu zr(uC*!jyqYJ)aXLH~pUZe4flltEv(lamtC%QUL+eR+C(5i*X|qO3G(7JTFoRTvZiT zPM_Lmh0OUeQ}O1?IDzwUbiBoR(s>i=uqm_Sf+(DF&Jz_TztHkRRy&<=Ze;es9(6HK zlMXa}m1(9?O}^<+TiINIMgF@BpT9P*=cwm%Ovqp{amN#gDWo@uhG3*KI)HRhQr`$& zJu)9c3b`p=@ZKW|^DXK7c@|IvV5$AcHG!IxZMr&mQ>qham?&$SAC|Fb6(ugd@}VCU zF^EIvpeolf8umLRF^r}~gVlETj55@UKzc1XCATG9k>F)*aKxaYz>PvYS|WkXXLC%Z zQvwl1%&=^ReFl`KyY&N+ilwWitsHeh+Bg^IT^KdK3Qk7WjcBu-=;V&N; z#@d9s>)^;4jF4&u7FA{C&}8p3Z5kPn`Tp9GlY8EC()|)APC5(|9$rA#( z3!0JhHlsunf|9dtxw|U%S|kw)tv1RL1~0@$Dbg6hjVn_`)~4^cmKe494#QYj>6gQF z&V9MB&2<_v)Km&a{2pz`=mDL`PSZ=dOTdL|7O@0LdTUqL+@Z)0vYIiM=O-w>emdwp zMF?e4qAYugz@%i&`u#!MtBg*bepQLNA1}n+t!-@F|4qI{R6eTZY(-05c|Us*kAT_? zW<42xP_0YP7#7>wNq;DGR?d{>~U;i36Z{Ea%ot^ePAK(%j^}|C8V6+`< zp$^4^9A1UR*Lh~`02|fk>>JM^7)#5-`rBM|wVQ8ioNbp~9ONS0vBus<%Ido6s^`@6 z6FXP{9Pn>FFU&;rqSco!kI8OImqUU{yM6jtPzA8v-Cb;MZsOKA-{9-7zsBy~UN(t8 zXj1;0hw6UMZ}nyEyePiWg;=gW^PmYh$Qn6*+xK)A;z8EV>IKFQtFETOb-p0lsY-ax-{P~}{7mr3mj7Otn9UUX0 zgVYjy2q<#p9J$3~EvkN%xYpidZ!*E{+qZG|-d+5`HTnPk&u}on!omWoeh+JiARC%$48c}@(mC`o_r8QqIC|lhg0~N z@Ei;RdpMouI**3n##BENcOhC=%uYlIcv#nnb*jSq5E9m%d(BIWi&$M<#ksR*ab{&j z^7Dm-1)Ms590h^!eF)?=24UL-(ot`eDyw6K*jB-e3>0TG7~=p7Q6XXF62#7Sx+@ z2_Z(&Y%I$X4<00Sr@Coyba@HIa5$97KYro_j-5Dxi&8y>4o` zEz__~a(D$$^-9vGGjPSQb*pp5bWR>&(s3Y4ZUik>MHA#j;Rt&#z0+PV^?nPB7%~r_ zp3ebTv4PGJ1qc+A3xPGAWC`YP{`#*XqDF~1EG`~Fzuzav49J8O&cT(XoJtKz=r(l? z%MO;tz(a z+ZY)BnWjldEVj7~0ip5mF%ec+mdBHjh37DjO%v%w$qS^&q9H`ybT$)T_drCS!lp1V z_y(>lVd?i;Zkxo2UcZk)zk+i`)>bQ0j%BTr-mWZ0Whu5I1l+&BnJyS(P&lQa%Kh8>_wS3ktCr5y`6Gwy0)gcouFBsTL*66KFdr7& zo6L-={Nf_@ubEKLC_5#A3NkCn=$u)%O+ZL1C!50S@e|T1ou-+u-B7B)?L-dawNIOt z24=NbA&{tokK~0)WyD$wLmSsxi&}{SPG>Xh?pVQ7bDL4mxxRIDYffv`Ywb9`83pC1 zbkwB|z?+SppQ9NqAI%(SquzsN{PBc~X+_MJ!_v~yp&1KHd^0G81yD4KvMr^S?XFmN zKo`%nVW?J3?zY5O&_d%1jAHCLW#pjOi`ExNBr3EJoqAttW}QxTc?}g+)t90G<9xGT zG@0B{p(iM}2%$gn$t6|6K*oYiMi1@mWNBz-_RxbS=&bF?KwA_pW*DxnpepB;tlSY= zZj%|smfT2c(xT^$tZ@SjI|bqa1w7MIU=jKy_t5!tKfsMupT^o?Fw-fsU<4mT3<_cP z9WNm78yK6Fc?}s1XfHVJgu)0#+p#h3j?aexC_+XX`yVA`2q7dmClgiZMv0xjjO9=0 z!Nh%kNc{Q3Fcv|ksc~o@wu36;mey;pr~34r;;#sBDtmDK`?VN|NMbQ?2SBWAx!{a3 zV#O7dmtY7^xaB|;V2_4owx=QboGunH9v<57oWlwwPNn&sudC`j7uF(CBiS)U?0=1cajK0&>Zufw$zhn4dW?vFSZ6U){O}Czt@EvJ(!BYY zs<@u4uYym=D}jJ^ETpY!`Si+CY9EDjbl4{RJSa{>KwAz&HcB52zm|e%Jw~l^Zn1(8a;&mOAT{VBERTN;2Tkplw88XX9^dG*Sb$a$0Fm|yX?xlECa?hTzh2|ijAWYehAOZ#zY zmKaa4_f4|up$*iv$nlCy!rtn-U13$9Q4R%l6Z0n0&ZyevnQ!pe(Mw~TarZS6ZDamlI7YA}?VaNgE>fpnv2Ouos#U7m?IkyUdd zZl)9(vgKBnQODBKIz05s@r5D4Y`vuAr!#Wz_dgb04lqPgVN5;u#Q7aGjTh00u8g)- zmzJ)X7!_3}3n<%qUtM-1-{@Y+K?}Uvwj+(M#z4!Lj#CNMjRPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4z z76CcTyF*|A00R0+L_t(&-tCuNXpUhR$N&4;%#hD~)Mm=ph7?Eh5h2az5iw502@WWx zq!cx3lBBlQlF|+okrS-pz)qMrkPvp_YcU@+8_TfWuaoPor^oAkpNIFrbpPw=eeUc2 z-~a2rp8LM9>wcww5H&S5In~wGIqI*dtE=n3llSoO@bK{P@bK{HKltU|4U|aQENPLX z5=p})B_w^6)GDb(Qlq5X&bb6|L(;N8@cmiR2OX`#~DrpbRZIGk}NgE{f zN!lIk90Jq>eLy0@Gsecfi^vZ@H$#(KZ}w}cq6NkQcZ|~stdOK!>&%yQUDA9>PbAe! zYL@g;Qjesek|s);Eorf&DbBeMlH{Blm%`b2NpB^6a?Xv6xFYlHw+xuRuikEHr zU{c`x?Mo+e1X!EF(P-d-iS13p+i0B2F$>tk-}JAxtk?@I$+Tzh0o#D7K%Q-xQeY48 z#yF3Ff;1C4YP`cS3)rbNoT@;IElfq|ig^9Ko9V6;sG#d&7O<@u&egSK1_biLgz5H` z&)XO7uqEpTo&y(w3LrPagxbx~ + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "engine.h" +#include "note_play_handle.h" + +#include "tubebell_instrument.h" +#include "tubebell_instrument_view.h" +#include "tubebell_processor.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embedded_resources.h" + + +extern "C" +{ + +plugin::descriptor tubebell_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "Tube Bell", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Bell noises" ), + "Danny McRae ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + +tubebellInstrument::tubebellInstrument( instrumentTrack * _channel_track ): + stkInstrument( _channel_track, &tubebell_plugin_descriptor ) +{ + model()->index()->setTrack( _channel_track ); + model()->crossfade()->setTrack( _channel_track ); + model()->lfoSpeed()->setTrack( _channel_track ); + model()->lfoDepth()->setTrack( _channel_track ); + model()->adsrTarget()->setTrack( _channel_track ); +} + + + + +tubebellInstrument::~tubebellInstrument() +{ +} + + + + +QString tubebellInstrument::nodeName( void ) const +{ + return( tubebell_plugin_descriptor.name ); +} + + + + +pluginView * tubebellInstrument::instantiateView( QWidget * _parent ) +{ + return( new tubebellInstrumentView( this, _parent ) ); +} + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( model * _model, void * _data ) +{ + return( new tubebellInstrument( static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/stk/voices/tubebell/tubebell_instrument.h b/plugins/stk/voices/tubebell/tubebell_instrument.h new file mode 100644 index 000000000..c79aff760 --- /dev/null +++ b/plugins/stk/voices/tubebell/tubebell_instrument.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _TUBEBELL_INSTRUMENT_H +#define _TUBEBELL_INSTRUMENT_H + +#include "stk_instrument.h" + +#include "tubebell_processor.h" +#include "tubebell_model.h" + + +class tubebellInstrument : public stkInstrument +{ +public: + tubebellInstrument( instrumentTrack * _channel_track ); + virtual ~tubebellInstrument( void ); + + QString nodeName( void ) const; + + pluginView * instantiateView( QWidget * _parent ); +}; + +#endif diff --git a/plugins/stk/voices/tubebell/tubebell_instrument_view.cpp b/plugins/stk/voices/tubebell/tubebell_instrument_view.cpp new file mode 100644 index 000000000..03e5489d6 --- /dev/null +++ b/plugins/stk/voices/tubebell/tubebell_instrument_view.cpp @@ -0,0 +1,110 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include +#include +#include + +#include "tubebell_instrument_view.h" + +#include +#include + +#include "engine.h" +#include "gui_templates.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +tubebellInstrumentView::tubebellInstrumentView( tubebellInstrument * _instrument, QWidget * _parent ) : + stkInstrumentView( _instrument, _parent ) +{ + QVBoxLayout * vl = new QVBoxLayout( m_topView ); + QHBoxLayout * h1 = new QHBoxLayout(); + QHBoxLayout * h2 = new QHBoxLayout(); + QHBoxLayout * h3 = new QHBoxLayout(); + + + m_index = new knob( knobSmall_17, m_topView, tr( "Index" ) ); + m_index->setLabel( tr( "Modulator Index" ) ); + m_index->setHintText( tr( "Index:" ) + " ", "" ); + + m_crossfade = new knob( knobSmall_17, m_topView, tr( "Crossfade" ) ); + m_crossfade->setLabel( tr( "Modulator Crossfade" ) ); + m_crossfade->setHintText( tr( "Crossfade:" ) + " ", "" ); + + m_lfoSpeed = new knob( knobSmall_17, m_topView, tr( "LFO Speed" ) ); + m_lfoSpeed->setLabel( tr( "LFO Speed" ) ); + m_lfoSpeed->setHintText( tr( "LFO Speed:" ) + " ", "" ); + + m_lfoDepth = new knob( knobSmall_17, m_topView, tr( "LFO Depth" ) ); + m_lfoDepth->setLabel( tr( "LFO Depth" ) ); + m_lfoDepth->setHintText( tr( "LFO Depth:" ) + " ", "" ); + + m_adsrTarget = new knob( knobSmall_17, m_topView, tr( "ADSR Target" ) ); + m_adsrTarget->setLabel( tr( "ADSR Target" ) ); + m_adsrTarget->setHintText( tr( "ADSR Target:" ) + " ", "" ); + + h1->addWidget( m_index ); + h1->addWidget( m_crossfade ); + + h2->addWidget( m_lfoSpeed ); + h2->addWidget( m_lfoDepth ); + + h3->addWidget( m_adsrTarget ); + + vl->addLayout( h1 ); + vl->addLayout( h2 ); + vl->addLayout( h3 ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); +} + + + + +tubebellInstrumentView::~tubebellInstrumentView() +{ +} + + + + +void tubebellInstrumentView::modelChanged( void ) +{ + stkInstrumentView::modelChanged(); + + tubebellInstrument * inst = castModel(); + m_index->setModel( inst->model()->index() ); + m_crossfade->setModel( inst->model()->crossfade() ); + m_lfoSpeed->setModel( inst->model()->lfoSpeed() ); + m_lfoDepth->setModel( inst->model()->lfoDepth() ); + m_adsrTarget->setModel( inst->model()->adsrTarget() ); +} + + + diff --git a/plugins/stk/voices/tubebell/tubebell_instrument_view.h b/plugins/stk/voices/tubebell/tubebell_instrument_view.h new file mode 100644 index 000000000..c3e8ae03a --- /dev/null +++ b/plugins/stk/voices/tubebell/tubebell_instrument_view.h @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _TUBEBELL_INSTRUMENT_VIEW_H +#define _TUBEBELL_INSTRUMENT_VIEW_H + +#include "knob.h" + +#include "stk_instrument_view.h" +#include "tubebell_instrument.h" + + +class tubebellInstrumentView: public stkInstrumentView +{ +public: + tubebellInstrumentView( tubebellInstrument * _instrument, QWidget * _parent ); + virtual ~tubebellInstrumentView( void ); + +private: + virtual void modelChanged( void ); + + knob * m_index; + knob * m_crossfade; + knob * m_lfoSpeed; + knob * m_lfoDepth; + knob * m_adsrTarget; +}; + +#endif diff --git a/plugins/stk/voices/tubebell/tubebell_model.cpp b/plugins/stk/voices/tubebell/tubebell_model.cpp new file mode 100644 index 000000000..a8df61bc6 --- /dev/null +++ b/plugins/stk/voices/tubebell/tubebell_model.cpp @@ -0,0 +1,88 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "tubebell_model.h" + + +tubebellModel::tubebellModel( bool _monophonic, + StkFloat _portamento, + StkFloat _bend, + StkFloat _bend_range, + bool _velocity_sensitive_lpf, + StkFloat _velocity_sensitive_q, + StkFloat _volume, + StkFloat _pan, + StkFloat _spread, + StkFloat _index, + StkFloat _crossfade, + StkFloat _lfo_speed, + StkFloat _lfo_depth, + StkFloat _adsr_target ): + stkModel( _monophonic, _portamento, _bend, _bend_range, _velocity_sensitive_lpf, _velocity_sensitive_q, _volume, _pan, _spread ), + m_index( new floatModel( _index, 0.0f, 128.0f, 0.1f, this ) ), + m_crossfade( new floatModel( _crossfade, 0.0f, 128.0f, 0.1f, this ) ), + m_lfoSpeed( new floatModel( _lfo_speed, 0.0f, 128.0f, 0.1f, this ) ), + m_lfoDepth( new floatModel( _lfo_depth, 0.0f, 128.0f, 0.1f, this ) ), + m_adsrTarget( new floatModel( _adsr_target, 0.0f, 128.0f, 0.1f, this ) ) +{ +} + + + + +tubebellModel::~tubebellModel() +{ + delete m_index; + delete m_crossfade; + delete m_lfoSpeed; + delete m_lfoDepth; + delete m_adsrTarget; +} + + + + +void FASTCALL tubebellModel::saveSettings( QDomDocument & _doc, QDomElement & _parent ) +{ + stkModel::saveSettings( _doc, _parent ); + m_index->saveSettings( _doc, _parent, "index" ); + m_crossfade->saveSettings( _doc, _parent, "crossfade" ); + m_lfoSpeed->saveSettings( _doc, _parent, "lfospeed" ); + m_lfoDepth->saveSettings( _doc, _parent, "lfodepth" ); + m_adsrTarget->saveSettings( _doc, _parent, "adsrtarget" ); +} + + + + +void FASTCALL tubebellModel::loadSettings( const QDomElement & _this ) +{ + stkModel::loadSettings( _this ); + m_index->loadSettings( _this, "index" ); + m_crossfade->loadSettings( _this, "crossfade" ); + m_lfoSpeed->loadSettings( _this, "lfospeed" ); + m_lfoDepth->loadSettings( _this, "lfodepth" ); + m_adsrTarget->loadSettings( _this, "adsrtarget" ); +} + diff --git a/plugins/stk/voices/tubebell/tubebell_model.h b/plugins/stk/voices/tubebell/tubebell_model.h new file mode 100644 index 000000000..ab10f05cd --- /dev/null +++ b/plugins/stk/voices/tubebell/tubebell_model.h @@ -0,0 +1,86 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _TUBEBELL_MODEL_H +#define _TUBEBELL_MODEL_H + +#include "stk_model.h" + + +class tubebellModel: public stkModel +{ +public: + tubebellModel( bool _monophonic = FALSE, + StkFloat _portamento = 0.0f, + StkFloat _bend = 0.0f, + StkFloat _bend_range = 2.0f, + bool _velocity_sensitive_lpf = TRUE, + StkFloat _velocity_sensitive_q = 0.5f, + StkFloat _volume = 1.0f, + StkFloat _pan = 0.0f, + StkFloat _spread = 0.0f, + StkFloat _index = 64.0f, + StkFloat _crossfade = 64.0f, + StkFloat _lfo_speed = 64.0f, + StkFloat _lfo_depth = 64.0f, + StkFloat _adsr_target = 64.0f ); + ~tubebellModel(); + + inline floatModel * index( void ) const + { + return( m_index ); + } + + inline floatModel * crossfade( void ) const + { + return( m_crossfade ); + } + + inline floatModel * lfoSpeed( void ) + { + return( m_lfoSpeed ); + } + + inline floatModel * lfoDepth( void ) const + { + return( m_lfoDepth ); + } + + inline floatModel * adsrTarget( void ) const + { + return( m_adsrTarget ); + } + + void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _parent ); + + void FASTCALL loadSettings( const QDomElement & _this ); + +private: + floatModel * m_index; + floatModel * m_crossfade; + floatModel * m_lfoSpeed; + floatModel * m_lfoDepth; + floatModel * m_adsrTarget; +}; + +#endif diff --git a/plugins/stk/voices/tubebell/tubebell_processor.cpp b/plugins/stk/voices/tubebell/tubebell_processor.cpp new file mode 100644 index 000000000..8c39a717c --- /dev/null +++ b/plugins/stk/voices/tubebell/tubebell_processor.cpp @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include "tubebell_processor.h" +#include "config_mgr.h" + + +tubebellProcessor::tubebellProcessor( sample_rate_t _sample_rate ): + stkProcessor( _sample_rate ) +{ +} + + + + +tubebellProcessor::~tubebellProcessor() +{ +} + + + + +void tubebellProcessor::setControls( tubebellModel * _model ) +{ + voice()->controlChange( 2, _model->index()->value() ); + voice()->controlChange( 4, _model->crossfade()->value() ); + voice()->controlChange( 11, _model->lfoSpeed()->value() ); + voice()->controlChange( 1, _model->lfoDepth()->value() ); + voice()->controlChange( 128, _model->adsrTarget()->value() ); + m_delayRead = m_delayWrite - static_cast( _model->spread()->value() ); +} diff --git a/plugins/stk/voices/tubebell/tubebell_processor.h b/plugins/stk/voices/tubebell/tubebell_processor.h new file mode 100644 index 000000000..7cff391d1 --- /dev/null +++ b/plugins/stk/voices/tubebell/tubebell_processor.h @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _TUBEBELL_PROCESSOR_H +#define _TUBEBELL_PROCESSOR_H + +#include "TubeBell.h" + +#include "stk_processor.h" + +#include "tubebell_model.h" + +class tubebellProcessor: public stkProcessor +{ +public: + tubebellProcessor( sample_rate_t _sample_rate ); + ~tubebellProcessor( void ); + + void setControls( tubebellModel * _model ); +}; + +#endif diff --git a/plugins/stk/voices/wurley/Makefile.am b/plugins/stk/voices/wurley/Makefile.am new file mode 100644 index 000000000..d7c5cdeec --- /dev/null +++ b/plugins/stk/voices/wurley/Makefile.am @@ -0,0 +1,46 @@ +AUTOMAKE_OPTIONS = foreign 1.4 + + +INCLUDES = -I@stk_includes@ -I$(top_srcdir)/include -I$(top_srcdir)/src/lib -I. -I$(top_srcdir)/plugins/stk/voices/include + + +AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="wurley" + + +%.moc: ./%.h + $(MOC) -o $@ $< + + +MOC_FILES = ./wurley_model.moc + +BUILT_SOURCES = $(MOC_FILES) ./embedded_resources.h +EMBEDDED_RESOURCES = $(wildcard *png) + +./embedded_resources.h: $(EMBEDDED_RESOURCES) + $(BIN2RES) $(EMBEDDED_RESOURCES) > $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES = libwurley.la + +libwurley_la_SOURCES = wurley_model.cpp \ + wurley_model.h \ + wurley_processor.cpp \ + wurley_processor.h \ + wurley_instrument.cpp \ + wurley_instrument.h \ + wurley_instrument_view.cpp \ + wurley_instrument_view.h \ + $(top_srcdir)/plugins/stk/voices/src/stk_model.cpp \ + stk_model.h + + + +libwurley_la_LDFLAGS = -L@stk_lib@ -lstk -Wl,-export-dynamic + +$(libwurley_la_SOURCES): ./embedded_resources.h diff --git a/plugins/stk/voices/wurley/artwork.png b/plugins/stk/voices/wurley/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..378c980fd0c37cdf83629155c390cd222e5338f6 GIT binary patch literal 71568 zcmXt915}>x`+u|jX17|lZQIMX&1Em!T3*JoU2Ex^T}#X6>i_gR=YJN?-V>hg`?{~| zqdQtfNg4%_01*TNp~%Wer~#j!Ki=VCfsawAx`Mzb2sbrpF;MMqqGRAcu%`0T5}@~w ze}&!UDZncT&N4b~AP^GP$2$ZlI~Nal5zbv!Q4($$5)u-Peqtv72zZIuUGj^&xRZl} zg`+!2+||Ow-NKyA%f{WBOvBoOOj=e^<-(lG5dgHtvB$tKSjQUio@aqS(I|lz0SanlfB@;*nd`vPQiY)x3QMY9TG5mi zwn*h4!VjX4;Av>Wl!8;$64kD!;mOHLB{VhRLxSFGTBNee;6p&7=!I2uV9EYK2(n2w zn$pMTW+`1go%FFABH-s7KHEVDk-ZUm|pn{++&Um7c(e zg3ORhQi0!Op>utAEC`l_sNt+rhYzl*dh~U7@SVQ(Q3Z?2MRO=ZfLw@fre_R`56Qzs z@(*Wpzca{#C4sN=R@}SFy!e(6bB0g~7PbnUo_Uv64J)QeJmgJPdnIXP5Qic2x){I< z6_{2ffKpF?^^aqPA9Oy*z7;4<9lOcxg#%XQWqks3;%jdeT|oYA(_2?QW6FMkC{#-yiOCtlBeVYwQ>S^OBBaSGXa^_fF?^1)0UxD6p|bhSnEz$ z#2_E=*nCh-k%R=Yza}r6qBK$N}~LuNpUEMxcSQ_yO;*?-q9!j zW>QP8Xf~=SRVur@tA}B7eG-hWMmDLYkU~qRUbNx3!D3f*IH;P+|I0_Uo}6ZKPS8qZ z%y&;EEZqX15W9wx&{8;iM)y-pF@9azA+M9rb@IKSR^s_g6rz7yIC|k&(idUMN6_iPAR&@UBLxV8ibsXo{ zJPLv>mbrIrQ0n3EIFBtZ_K^sbrh~v~cN$GxLqvTu>T<308YjICF*IF(r#q>pCV32n zJ0CFv14H4wjW}&wcekMRHON9|;EOn9i#Ddf=S`<5 z+A19ZmCa4b0Rk3#SBRnyl05kr7OwbA=SK`>D8|m+f^6EA```Yt_d6vnGKGRm#3># zt{~>+Zf;s(7l|2KSM1vqU`2|m{&G-GvUOf<2<T6I|vjWWe*(8$|u!-hgc z43aYsXr;k3!hStO`lox3Bjn@sMFpHQ?9nxpI!&`7(2I%%ryoL2MkUr0Pni z?+Pf8a`3Ev%lCe#U#Z~+@a@cy%W--z9+q~bVcy;zSdnV(emxuqoLJZ8u57UvwKY6q z^JZ%E{dwC`Di1Xqjo(SvbL{UAg`0J3ZRqZH_}q{%j@8bNb0vmSg$lB#4e6mZguXu}8gurYm!6UJ;=+ix!y(%)zMq=l|?tXo%! z^1vi2I3p;yu-eE0PuS3quFZ`kvu%g7)(l*)DY#qFn_@r_VQr-vtqNi znp@Dv9Q9PDJiIW=wf+Q9}B=k)Q{#>F5A1(DAL4-^e(@^i6xQatj6$0L% z_JlAKsI9v@4}tgB8}IuSE0?oXPD5?5WM)CZ==C*QdV2cInL9c+fi(vKFt363Paob# z>^(pTt|6a?p&n9KeIHmENc3XUx7&ot`@S&UhL zj8D?1f<+5PCPDcAQekrF*q=p?$8+(O;;0{Ad_QR7iqN9 zB=y2~q9Ag`*P{AUsbV>-TXg-m;e&4EL;l<$^nb38rx2m*$8eS;`-IO>3I^I6lR-yV zc|icdwD7xt)b}J0$T(OnEp3;h8S?7tYGVrvm<>nVDNC$4srlk(>_Vuikpl5AxGu?} z6e8@?ZZcGik0*;t(^#lr`WVQVOPUO&ITN~TNc5m&M7|kzayOmysJ+ZO+2azBN?YIy z$%b&BoE&W1v7x_laxTNypYJa|`O~Qo$Gj>q{mf_tW;2ehv&ZiC76aX_!01r;jAeZd zX@Yl!qH=Vwy;>~|p_q5^(VV_m!m&H~7R zGU9VTQFO8yf{=;2&7H|6WSjK<%(>llR8ir;Hvy7>M-%-n@1&D1I8>s(oxw<#?LLTK z)6-@F0VHQyNOo|j#tsfBQhYaw~~7wwi!yz1}eEy=8O&Ai?_OR(UYu|DijOGtg z1@C+!eHug7vE(7z{pc28$;UgRcMnS05Tkz!Mv~~zk68sz_^*S)uTVcf9s&W_zN;Oy zKs-W1LQs%+Bx=!$wU|vf3oQ%z~V}kc-!)Sd=3yc{uDluOech6PaV=(C>1gH;A z_)%29-4*6xD^OS|UmzM0`!fKN*oTeY_KkLDrAddg*sU%%A9`?8j`3X9x1Hk!TrB8B zenWZ$qn`G=*j;ghhTX-~uxzC76)!psSc!n@&6 z5(GjvHVoj&>pMDPQmB=8mmAE!=;`hC%FD}t(bpgP`f%Rec~rWO|AXj}V}8COT&6U6M|yt?*?&-2Cg z0rWwJ+=eL{DJajl5_vL1uJUZw%2^>fLsxDM%5d1BIL=)a4oU|PD22$LvE#V)o=5j-hJK@8F!!@9`0 zI23`q|J0W^Hh@azaX&&=%H;_*lTI+P@j=K_f&=&inlD)L=-~yJxia(rNpetKcjZS|n=K`?G8a%YQ0#&a|~2l{H%5=;=RDiY7QbZaW5&PJ>1vxR?e)X2=D~S;^AP z4C(t7yt2R*^hdMFf^YAcy?+9fg@b0{1vf`?Qy)|Rdzk# z2ne3 z0B}|!_pBUw)!mSC7c3Efh<{hqEOOmyB`>UzTuPOZZzP9JRW73RWh6FUEs@K@_aua1 zy=7`%L`P?-u+P-R|9w*up1s?@rCO-w!_%j*?rN`5&b?pG%>-3N-7k)u%IcS`itCFHTB57W2_Nu zlU>As6f1=VEjl$!W+u5g6NsBKZXR(Z{h%x?tqRgiXk-Xogt+b!S-1Z(fcw|ipJ@TXC#;D8JC3sR$#G+v87_uW}Ng zbc!Mp5(qwShk}Cq&f7;>SBkTAUwdCCd!3gJaj0qyn@GGJ9OA?k8oSok*0}!r>ppXF zx1#6OY4F-v@Z^=5QxM7u`+XK(O$IpvDt6Q?zy~Qv!f zqvI*m5FlJ8{h&oeRq*ajK_L86t-&C$Zvoc^7h>SiMKSvDZy8KF%w}{$am)M)m}PAK zpp%LyU%09)HcXeM=mZ4}4I;^(s7x?n@D4I?A~sWo>5CNW5Ss<`Yj^k>B!s_GscxE@ z7(!j`xvvA7Vd?5z&UMq%kF_+32(VzXQ7gcZeDMuEJ@MuFzK9t$Id;8LC=m`bZ-03dT7eXLbq6iz$lH_m z+%S_VT}X7r*{0egga&D8tc2Fe_mhJ$&=W~oT2}0T&v<fzDfA!MK`#LyiObGJLm$7-1K4FjD%-NL$c4UnMbkHIc@u3;r>c|V)B zxy+k++ox3F87X~j&l6o5(`B=_kIM^2TI`l)&OBYt*LmSpxy^wc&~I~wNEsiBa2$;< zVn9S4U0PhU3@V+#6FT~7=rD8f00FA=+c>FjYaWB^Sg{tN4Y&Jkod~er-C>%0MAyjT`%RZiJ+#Ox&lj==Zk} z_OF7CN3iA%QQY5^ zvMPJ!kRQcho0vHt0@5J4+;rP_IdMJM67!YjCk9#!k3;F0fWvaThwm&NLUk8 z&008t&O=4M_fuH$ing}p3i`S$vr-36wC^H&qA-9lPtFlo>j{^|v%8behnJI+0}9$3 zO#noYKa!5z^~v4`Symv>w{PFz2NKbqcjqYd${8l{WPF|mU_gBXuL3DhM_vJEO94{{ z8MU9YEoj;M!qAsDnt1<2V~sX+c7FSY%ltvMW#+-Ho4)jpoo8HSp0=gD_KXuDI*xC; zJR7W@H~-OemnLdy-Z3tTkrSSklEJTFsSx|W>+bR#)UT&6p7P7jh4HtIonY=wJva+} zO}>^b1;ZDjgamQNPfxYB=#fpcmsH-#0QEXNKP?anz-~amsjjIhTCgABQC_v?0N@Ow z8M3FR=i}x5%U57vAU}VNrN%N;E}uWR1;x*_un3Q;D*Uy5=H<+k8Rvm2U$ZYXCc_FHI<^C7JJ*Ej}Bjh8Vm^w4$<{S5{f$I;MTu!9*c951zN#(8ytu4RyXZq^{lTHsO}_jot$p#CDQ2N&mtRZ9sRpT3zZ% zKPeoFdY;gJgK_em&q0TV0RFzq?NBt=ih#>L2#y>@WB^D^lM2P`?_<+wdQqy@;DD62 z{Mpkp05tUD$B(vve|$Z+rOZ1HPJV<39R{~>P#?-jIIdwIJFtocFYN_;gHM083;Mq& z2t@?G9R`k!jKGGF^(ns&DLWHdXs&c=!v_x!OEQt48GR!adY(=dGv13L4A)k=SqmCR zRDaC1!k0@ZYzkzw$<{r&Na7iDZq{X-9B?DtD(BGF`00}WW6W)HNGxa`nH1^r3clB& zan`zU>%z>=j&P~YC{hg(cuF3Rzu~WDxTc=;-N@q zexAoa=M|X}tHl_-x`dkWGN1~jBN&n7a>pCPz(Dyz9~T8;AElUVT5ljgLJfGGs~`(# zhwAeW;EmkY{WOQs8_4!{%XCDnoQnalpMf7?k1bC$F@;cPL3&VTbV4aOgh3k#g?e0lg#FyxoJ-`r;4&`5G^;0rG!2QmewZ41Z4?f>I{-45j(v#de{rV~3n z?f${Tx?953$@+nzq2UNHs7buHAp|b_pickMcF@E?PH7_Tm-VN>YK;a zt|Y7yzzjj#icY>*Z?DtuL`IJTxR>F~{yRAX_i1U^r>CdRM_(T=O+dy&@0)%XlC5j| zP$DL}`&_8qWB=@m2s)IROVyABjZo?1c3|<%XYa7_1lyV~D6A*(c5U5P>e&0%`aNitPj&pp}9MJ7%Y+IcF{zse3 z=Yc3Mk7FY2|Hy($!qb-&PKyYfrKL(P(QK-yJ-o?D`I%K!6G9Z4axWGSldpA4gXU~m zHlh}&ki z>-<%o_i2hLwwafilxnx>p|fTz-{S=MSS@t1p^e2CM>r!FX=|vbUX_ch)yIn+xWlf6;47 zcjh4ir~r)cmD5`s$`8eH=0FYt9q|kc_AsnK#u2=}@S|p&-Vr&tynqamPX`kGzSO}U zI4uk5dvAz#eick*o9<z17Bt0=!hzrZze#p3Z9v@s=O#>kW(nf z!ZpA@IDW~q4))`gqm_{k2tIuBKzA;Wg9vMP;q+hjqNNJN!K#dbtkJ@9b94L6LMTy-TfAZ~=6`BN`h!lL zHCt{9@T(d`f-F3An$>7w{vl2w{n~cn9wLdIP^{I;w>(z(x;c&Y&+u%5p8shdwKrc* zSU!rH`$*d(Ug3z{&lFVJa8}s-6WF;uw6|@vL<{`Qm(7RW+v9n5O3V(NXcB+!rN-WG zHoc8ey*Q96|MIQNm^;UQT|9htxRyu3c- z%^_w8KH`}cE{ghnr}oHURHa5G8-j$(w2fr+2bKlh3N?@e*J_Y1Em=&PzjcJQ4Fr# z9;#rOa&?)Sl|dYf=)4UB1||lwc(cggIa&Vth{2AnNTB7-P0LRLBne3t_#=C)OH2Po zh!DSi9sF~+DyMrc{(W}4@jK|0-z`(RX#rq&Rl}dU*7>L1fGInYnoKF0Z-En=t2BFZ z$3le4DlD9!)H(Gc1w!U|4l7`o)OT0kqp8uF6q@Fc#Dk97#S=v@Ua%MS;>+uR9wdVn zeJK?O0gT^D3RA~B2WkNtwIv~6ru)<{>(ta|Rr z9M6u`;S^LmKDQUmIHp)^q9u(OA$80m?bgTt8L2Fs^|=r=ZHF58lLIV{6j<_$fx$4KTsI9J;NsYS;lnQq5lt?^i<1HjMW6JK;Y>4$8QR|`>BH;W zEp+eeml;c)UV8#homy356SJ{FZ13Q(vryNw;^~U7*BE0kkKSS@C2A}yqGsB{ZOV0@Z$wJJ{K>0U&L7o54 z0yv7n1MsDI>*B`b09*mND;2vO981{-Y=zMY2D&FK*>%UGe*`HfJ7dE{IDmwHU$=1bd%c?|rGm*Xs`#iL!nZ|eUsHN?_p3kY zxtAZAwyaZ@jo$**UQp7Hg1TkG$cH>*&9z({`lpc)kQB%K4> zt!m%xv#azIg8;-hy>_j$_Ui5~MLG^HZ>de|n)OhFg{>$BJ@VY~e_EI^m^W^2xk5uO zu?&g;=C%@ShYHb~`aCiB3zVV?hC~M%0bq8q0jkfAJ5qn6dg_U|?s1t-c0FzeQ!lC@ zl&&T=ARm;ZYCT!9^!@&gTJG$VueY4afvW`TSKbXW*F4LsxspxW_}BWbRQYC_>K zc+-swIboIP<8P7dB~n~$MSVCiWB}*}2>iM=>GVGk56IBbMBrc6f#WbQj_|O&)sEA_ zrUjT$rQdKr9CtE!XJdyrLZ6t%FfE)PEF%>E24|y!#UPK%Dq&UttnJJqQn%F9-kF-7 zgtu0OaOOu2on3?Td7jqu;l94RI}{LUcP@(t*TV)UL~6@PP~E{5l@l4gS116|9%;VK zm+IXbJwGS89Tr_KNno&e2gTbxB><_JW+~42* z`R_NAKU>~!6{hyuV`NG6Fs-sN^}i}}4T&)W5t+3=Vo4GU0-yh&u^DrUO7f`+?Ym4Z zAoF;Bst!kH`X?+YJ?#Eh!*&Q6J0sIlZ84~-rqZr2mHiJ5+wX`t$?Z)2#kPyn^X=EC z8$8rVfO&oaQ1SX}*IHY0X=1pCG%^9K?sr!uv$~~FEyO*Zk&%PXpHo=v5VR^Jv62DJ zl@ibz!Qn?d<7YKBj6{OI;L&(u@$}MI8TwM7?_x+|Xxp_h91n>S#KGRcrtanIQROjR z7xx_;zyfQ?EIzAWOt+>aS^R@i$ zlT_ckf?uk0G6rNsBqXGt0VL2255wCP?0Ek*ZCP_LJPa8W_<&yrSJBF&z*R$xI@GT+A@l#@JLvXFeacpJ6>O7VPtwR!P>f zK;4A-9~IqyV)(0^+F#1@peFRc!(wP{pTjZu>+m6#PuWH1CV!@-`|s$-#@aX<0E5MgQ=@0D=^ zjy1q5fy98>I1Q?DMHS*;KROm}2Z0$dWOcA|a#>&=QvJy2(=P1cHa`Q|0zjd%MCFwP z{a2l;Af3qcydd}8RaO1q@t_pS93r^k1gpGBN|nI|?XyjcVO;{SiNHtztQipzve{M7 zDSR`lMyQ!&F6?+G%_TWnE7qzw%+5blnnjdgFDkYiO~7Bh$y-o;@mjzj$*_ZF%N4J zOnQ7Lo+4Bj)W?zaTLMl^4rthgBz5IgfcoeRFg9dZD4Z0ao`1d>fw`8T1qlH zDk+Vj*!B%C?8~&btgaFID(4COqKKj``SM(4)9K(e_bJ=O_2z#!A>Z8GDB1PX?WpxA zmZUJq`=HE0E$#A*Ok5)hix2R?M=3Oc=QQ#B9bWs5`%3Epm1q8s29gC1`vfZp*qp)C zZNO^oHY^~v|Fi5u*-ebYyW6(&pZ}Q~kV9dgThiE}i-F|xG^Ack=Y)YvRJES^Pti#i z{@-<1lZ-6ez9Si;!?@{e#4ajrIpc_6e}1;TrY1W{EUHi#%%2LI0zDgpH=K4%64sG9 z$_9l}0TV8Kmxna%nBBP~e*ZYBP)&vV6e&44I@E|kLQ6&q)nXd8rAyVuU&+eHsqs)s z+lJ>p{)CtWKd{dce4oXMUttk;%Z%E*F*2BqB2qEw>FIe~|Gh9kvqRaQQ(x?4Ac}+Vko{Ob_~d5n(z>q04nc+ z&s-q}TlULj)PIEafUGLon;m&Y>Q5j~3N?rdOQ7|kP zj;56C%l$+lM+*eK!BaFv7NzV*T>}$+L}9G`DNba)&WS<9YQGkR8xlxav1F-X7g)w; z_0!z9Tk0_KE&yQ|+ZM*ezol&w?JcPXQR)dS&1qQ-6`6hbmvFn#eS$#k}H8liro_HQ!@_L_uSd=7y= zTtAww->k*CWiJdIQ-11m9-rHj!<2XK=APXujEd`43zxb+D z*W|fO)gA~2J$bqD$}HwEYjGj=L6O@vt!O#Ab@J1P7w@N6AN?-pq@2hP@8pwo{PuP* z)E8aDk!URH8C$LmU#btcmwym-*_U}emGso^c*jJyZ&L`**&Epl^u6AL1>HwYXb8l++nE{z` ze7IuQ!-xbUBL%qm1tJT~@e?+vjxL1!;KSu`IC$fk)_PXfem zx7e%18fzVR&=Ath+ylDT6s@qTVqS=)3enOT# z{R6Kdj9XbTR{5H>A?z+G`uV=svR$v&lQb~{Np1w}&zGzJ?CZ7$XYiAO;LwsTzASHCL1Hvd8zMX6U+ zK!+wOzDxcSp(CGNHj`?bB#i|r3ih8j$IbWu`{uCXR@Cr*H(G&wnG%`=Olt4GD~MLQkVCfgW5jkNfRY!)0FLfnw~sg1|m0DS|Ft17OGsiVC40c2%x+d^k&G79O3Agl_~t2%gcQLXaoqyY+g=NQ5{lH z*$NowI3F3C58t~MI+x!Il^ZxV07_m`F>jNwVVE_RN~ooAO@ClQBxH54w>P%)%i)Cu z!XXWHjSN6C;=>s~%=e3j;qTaB`kgQM4KNxykEZtYt^IJm2}n0Oooeok1k66sUt@}B z{piE&P$C)Az?P# zGzi}yAT+ihQdYTK-!4vS-I+UM`Zk2x=5MMDq@#q$J}i;OVophktddPg^*H?qRM{&_ z_Hzi(Z>?)iBFLSRD~$e95(QsECjYIa`hoqUP-dx3j0ki#BAFy}IQ;D+v2$>E=<;U_ z<0Dw)SUY*EJr{#E06Mk~8~<-Y!et}t+5~r8QZ>x6^;=#ZvA&T}q-)e2K$x@RV9B5( zLLqu~@VpPF3l0Sye(E_5Gq$dW42M(ke;M3CEo&CBM2`S^%ksv`@bdv57dLl9V`B&) zd+W`)!NnoNZxDiV1^sZWoI0m4UBZGm5Y>22E9fl6T&g5g69~uEfWx4W0u2bsZN7JO zI5;@<9k!e|6LaxpxX#0fqsd>H!L!jF+1` z5;$Fpaadx;EJV6}ZIl3=mBzfxIW_ns;mFL!nRfCY2Kx^20{=fg)^A@};9<_O@5A40 z`-R(bXX=M@@X<~O{GN#$b0ua9HG*WQf5sOqv&?XQ0x+o^y-n&N?}N9xI*Kry^dmYY zo+yE#rp4e8p*bUwLwl8k!w&u70(3=q95iu_>O!?+%6|Kgmoyc?4vbxV5{$?BgnNK|Wj z^Cg{b&UxaqW|tgWoL?VZ0M;$=?-x4{5J3Cc+S+@(Do0Di>xySJy&1nYoj(k8vcvZZ zx@O(8tk(joDcpTzKI=(G+U9JQT9LHys;cUB_V8u%4Qt2Dxu)+nuSKU4H@AMXH^0(H z?eS~QtCHh04Ddr^7c^N?tW>PP_}~ew%Az3mrYPNU(-#i2Nn#w^A+o=fF60CPsj1Hy zI~c4qU&-pjM;;_pq3c^cb8caEkTNED{Gk&-jhRtW>N2C7?DpOzdVbrwaUb*?R$c~Q zdRGTHb}7m_m-6tz9}85L<2bOoN~e6P&+q)VE0O%LLb9qCD!(jk(Ia@p+1{O%0eKZ3gXJ%5n1`{R%Ur3X?nLUTzu#G64g|D?v zMcdS}plP2k6xZ{qStWy1)fO_$oi0x`43V2vOO~34mg?Z( z!1?}E2T)K!fKMfmCnKY$MCB6SvcSo}#JHG}geY&On7e4S&kn1T``xi#E(KZ@kHS?= zCv2v5)d30CvQ{=P3^5b+L=3Xm^JJdMha&nUv9XGZlOXeux0t2T7z;v0DY%R>F+ohN zwLPwZ)59n}GN@#|B`iWUj3(YeT?)^&O~IcKx6vkPz*nh%#ly@_jyTq z!yW7Qy6Xsj97t02;(KvD`DyPv+B-zS;}A7bry`3dxB_H?SLph0_a}bI5HKfG^@n!E zBlRWzOeFR!!x5WbhZq_Zob05^(IMXfSkOQ=8z84VKG)FkB!adUtsMrxm>Is%9;RUf zf+KLL#sh^w*KTMEk51*zIiAeC#)B>gW9pt;_&UdX>t!?2^9NMnfVV*ZsL&hh>oxN` z+a!LujU^hv-$e@&?NqDW$pfDeq6DMIaHH+<9;d*Uwac$t5C85&ugB=Ym7aWgS+bHN zNm(NM%A@ka?{o5xo$qg34Gj&!rKMC|`;1Qg?QUK?{|VkS6F_=uaENazx4y3WtAcUD zJcvV8iLSO2MBp5g>*D4>+cP`jGVDKU`AHI3xrNb)p|w_5YEq(jEOf-sV4>iqGuU@Z zn0X}xjP`AF1_)ux)1=TNaI&NY=hCYwytdjdF(IS&V4b{ehbp=V4-M@fzD`80P^5E4 zi?_|-F|999CY{)1Ke=j(qU$Q|hwc~CKn z`J!Gvu0j=gAKHH`Sij;!%}ZDy{Z=RRs+r5{2CHM~ z_lz)J{!;ShO@*zNa4x^sLl_6E{P;8zDHJxD!L&2|zRT?Vva$r+j+li$>-$Qouaea8pivL2z9<`#A#>PGVjao71lvB(;j`MdneL`}G8gX94$p`{=5Oo^ z#a0Uu|E7tl#uH6i`&KN*mGx^(?x~{06Xjh4vRGfEt*e|y9^Q&FEEQf{p0wrb{9*?| zLgbo8y7Py<^bPdAL#e;hh~--VcO>q&JG)&T47_%n-tL{Q%DB4`D(F5! zmfkOGn-S&t{)mBhOMxgL?`glyP#}xgu=7w3x9{Usx;% z3ia&0rtgKU;oN*)Y~8J0>Lszz*$pLqB|GoBQ4+XcHfsY=^JS=$|0ne%RZT9!G|;A(+!`iT`rkG4g;89=t_YM_agNg2AHoKKzP_|HNrpp^k-WDny(7K_>t zF`A=k;9h81oZNc5nl~ZaMO`t<)sBCCLKk*CN9kCe?P&nT1J{L=LJ3Z%+~ULNK5RsGUi9RAYFX+! z;QY8+wHGLG333$nOYgp%{VwgY_4Ps2E)D>wy`!C5{~Q5B|MiOWofW7Qzr;hW#OqJJ zPdRPAX9RDz%J1O1-V-Jn+AHqBm)6Hywh8NxfY&bAG+pwgnok0q25kj$8OjiHBkVk^YEHU53G)#Gx$$*_s zv+G1eWqxpZr(&b_C5Y)S>EXRZ9hfTbH;;$MN@Mg?dBroj6nT^#SxGZv0{56M^!^4| zusv#^4C4;Z{x9cp9ovtVGZw_ppLx}Nj%txYu#o5GKk zp@zNDdKT`B+e=qU*%+H-fS{NHdR@50xC+c_9Qz_7_QG@CNDdW=4wM%V+SqN7CWQ&> z%hLN@D2!+9=SN7blq+IE2Xxg1ieeBB4sPxrFc0`MAG2~Z%w_cZvk@_G<)R7@5rw;) z5l3SkOY{tcsp>r;YNUB&bCly@)0V zT~V!s7HO?g@^*11Sc6hkFGb*Q?nVLQxt}+I+1~eJ4xK@`Vt+|Z)0X{sEQKQHbPFOT zB)-fMW43%}FWqC5=}wGANDU(1hQ$IX*vUD3C!UTUNS)>L(Vw_h6julzJ}ye^?9>Hd z<1!gasDgnQaX-*BY>9+j1{$|I4A%Nw=M@3R=AbJ%j2OY(KwtllqmZ1aOlDYCJcCQ# zLXx@W|84{x6-BCOVsBnXaFb250dQ;^XgEQvumFr;ugU-K6e9xSnnFBzvHP?#=UV=I zcl7MCHHQig%tt73_pP9pblyB>>nU$b^v8m!m_pOS?mvJHYfCGms-&sy&KJCKoOfOb zHR~|~r+#U>Y2fKK&B-51jZXg1foo&gY%;0d_Y4+**xsZ3o54+1(~Spy*=3Kfhr$UD z-52j-s;Q6NTQ7n@W=V#;zP>)ls^Dup%A7Ng*lzQMP4`l*A=H!_<;a0COTET%FriOL z8Y7$q(|=fEY*(9b$krw3I`(|a$UUhM`@XSWB9*BkT}N|vg~q}DxY&veeN*S?CT-68P%UbtrhTGsl_M zO}E7PU?zNT_IT3!X6JvMQUDF|Kka?R1$g8|`;F4;=EXmu^PU&SA1dqi6wHXPV+pVD zZ@bKIkRK<>$9UYEqtU=tNv>+a(Io{XuO@ZwA|dc~4?E89YK;(Ky-4NP5-s(#q9Kr$ z+8z0~8~XoQ0843;F{pFQC9tSgK3~Pr%Ui4i0VQ=>b{64Ocb|aL&s{$Aowz@hEoVe4 z^EbIY%R&n-;pJx32GO?f+x=uSg%G&Vc$+kKMZP_rpVH*a*6^eGon$$%Q<#rtP^3RG z6(z;cW0)!x2*nKojLc_+;xx~3RB1raH`b<1($E<2)a?9_04dZbzx`E@EqJ1!$y^2B9Q zYwJl997gKw9|e%uKJfy~iMYH0FRg)uq>sw)280biL&X3H^ zVaAj2hV1WKK$`?rF(jGeUvmr_^Ej_NOyUNi)5!TH&QY3}!6q(tWzPy9-j3RpQ79{5 zDbx6pzef4K19x9XlL(nDzIYjQwp)OyfEzM1;cL2fg)8QCm0-_B9k8UobLCE?lyZtY z$5g7-VnxP)>Oz>SIVjWUOQwzY&XZ@pS<^&!GPaY7CJ-r-NY~@FCl5=ja-H|Cj;e|q zI_fBqm7Y)lZq*)n^2sFs$CAh$>#AAvdSFM*MPL_Vxb({Xhc0rm8j2U5Kw_opX_AfM;<@V%kUO0sB2) zD!E0fvkrSG+=dHCJkNnyaJeUs+;tY4F$2efyCK%%HnYz#qmWoS;A%V`qu=Y<4zZ05 zoPX&heB;U$&UL%pE{+^If@8;yVQp;<%gf6=gPgS822Q-d6a{*N0k$?bv9q&-k<&^i zkc`4qIBHZC3Z%9=F>cC_2mDe?Cg&-yK(|vsf zdam?!ns8dHD;dtKeI7~W4I1_P(tUB%4}9PQ7`SpCMPmL$7&p zTd7!axZ(QTwbtl#+FY#(!T?oPp&2wV3#P~Oj3XkpYv zL>pG?z$(;~6~^h^-U!K8YE~+8lMa9VJ6xwJz%n|J}JN#RGmtrohS4pvrIv9z?rx_{I+eg38M*xB8|XgHi{up#i) zPd9v8rr(&fUu~9Z|NDQ(|17^Bz@IbcV$mG+C+_gv}US(c&IYC$T6PP^^MWtEMFJcpo5V~`Gq*xuR3 z*B<>Eo_XdOZa~=o$FFOj(Obs+a2s#pA4RhzH<-q$x6_I?Du)meX~1M6RF ze|2R4y1tbWd8PHUm`7QDTch(z*ZbEPD?c6kPWR*+urLg9;J^VaEiT%qJPvL1lOtcz z2xm?6l()9GSn;yaXw*|vzRg3J8NT-l57Ymeuhs2`dj6>2{SSm|&hDW2(oHjrG#1In zOhiECt5*sYsh015o?qkMe|YF?d%L?g%v$`f(=Z5sWEM$Ax0+2iSuMQi$w_z{WFTL>aC;wOar8s8&uOl<;)QeM&JI z3{sY@`}W}oOosa={1lT$5&N}$dJlxw*LxM*fK!L{B%WG&UL989#zjNKbvM4}r`d32 z39SQ`R_7_L6=15m8;#B$3$qX-l{!7$X9hulg~dh8&COvn8e3rvVj#w`ofMO%&^@Q= zH5%Dobn4ALeE2YzC5%_z@HM8H&_O@rEU>E)fdxF^W|t{#=dd%Y$(#4a zJ=+e|X02=wDDj)`$umheQ~~ZFk$^wX{uW@Sn$lJ~+y^4deF7X-WTU8uKi&XqA-hNl zyu`^C#D&)ip+lyL#G@Pmidtcb%|)Gy@I*kuFvRg=$C%wm>Oyo7(lq7CyOMYpl#;l~ zDYlu$D*gsqv&v8uhFmuD!+feD)GWff49iky4iF`9)34W4<%aTbTN!b`@04@d*tmML z@(nTzfT;T41p0a7m};kH%a;Vo`Q$DhLrwUKdwwh%&1yS_odA_1jaSO{M`IZez$B#_ zVm?l$6Lf4E%JMR9IdcY!OG^wO5#`g4{>?f6E8QRg zJNBnu9F+j5&DB)KsaRHs!ibe?h&D=q5)mEXG}5W0<9Q+ARsc1BdfZqZ0n?;(nuKEgXpG~bUK|IW-X))L<1$Lmzp-H@_5gJ`QKJm zl$vXjY0h)Ll_NhXZ#8R9FQiW&?%`(R^Ihf8QZQ}-xu*Wd{o=cp;PtXNIFRFbLcY)(pqr2 zH7WDd0v-xF()ExD^}@(*Vn4rRAkMyXYal8P zcM7NdZl__^Ub-ksdrenoW#rW@l14d`h2$ZJUbDZQz#-73A%iTmUymT7j<`m%$zdIV zX3EVxD_S)fhPeAg0XD`Cl9=~qiv6Eni*_M)r`@h4rd_xhx*6GYa9DTGdA-upre~df z_q;9eGrOtDPzZ0NQ{rZTOGc&zw~~_QPt%O6D|wzVIf!`)QnIEyvFg}sN1;=bO*smr z!%FpTp91Qm>ogdICg%`;gUBnkRA-n3#2tlhKhiTRik$y#>)OH@98*hu6NV%tb4Dmy zrP*X!YH4tx za(rze>v2XT!$VVI3dbCynmk!ro`pptc9lX9Gr825auBi8ga;_DIEkX%T30C@CkZ8 zB!Oici*lQSxTYgpp|DQPxH@}Tm2AkV=C9r4meeWlGGo%cS9&JOi&|-K5ZOs-Z95>f z;;KsS44v{Yn*(cWn46!+bZpDn!WlXn`MJX?9XpP!Gd(j_oW{-lPsYqNsAAH$@$O{Z=Z4z{96rPUUIRxp08rD{X4Oya`WY2~~v&d#}3QO!U@3YfIiRHOMNJ^d`(`X7%}C9Buyb z*vb}53O}821NUHi3Pj}f^CFv3D5lX*MBX92I^Qr-R05YDQ(HAXtI8Ai48joYK+jCT z0ql4rDJ66KDR=hg$Qh>&YxZdY@W^bXEk@(WJN0y4`@E=@pS!NT)REJeZcJdeQr0

    a_`(G5#upghq9Ap~NVD-yrAB9aRU_H%AxUmS&%6!L1V zp#uVnTxVMtG73!$tT3`8n+T-h>7(w!6052*fRPo9C#Fc0P+tYdQOE7?J1Z_-_m|ch znK2M~&SRmdN^v8s#R_^jF-@=0h}Pmb7gkr!Nfd=q$a%KbiU}mM0*6Jdl}6*DU5DOG zMTO?4mF54>-kbE;k|pV3b|xS0jd){LW_4GCb1y~k?}&Q}pcbS63ZOu(#U05exZ@At z9}s_nxY3?s3yl^;s!QFKm2ZlOJGlE9v@rYZnBSMpp$T!xd@@7I3au28sk@L<(j>!{;tSPo& zv!#@z4BiKfz}^X!B_yawCdE5}mdKm6x(UM*-ydV*%_A4?y%88`*l!SmY1*ye3pW34 z%Zz0Ou~`pNC6-up1GTbLu>Mf~kK?G-1jH`KJGSADcXxLxV+0DU;&rj6aWWeYlDY|S zrka3;5Ik+`CZ$*r(>yNwo19d3BozfI?z_2@I3`}0D0MMM#lmToXsesrAZ_B2?hKU_ zJMiUl;gd}OC~FX5Po8X|r8I&{5bAIfPzaB;=Ws37M;{x;FpNAFf-0~znnv2`7tqVD z%c=kxiK8l#RWU2K zhf+4gz&T{w+Bdaax`)23U!E>7HiR)Cko#diP_0Gz?DnvNqc5t3Amhet^3j`_gd{`r zUDst#iI(d@&#gWWviYG+b-pVVqfP=gZA0*9Nb5zbh>b}{c(u|88Kq$}jWN&0gr)P65Dg-iLt12u| zI?e2!{R4RPwTg*if623s*t{$poa8`mOX<%~ZNkuVdcVthvy@Wyjt`O^+rcVm_}vYe z>Q?iQWSLF?n&tP&)zv_wp+7(VQH`*AYL8bH{^l zX5sJt@bI7>W!BWtInpRs{BS6Q@ZyqT_*6mJLyT)M4OYS|QM@`1K(6_ZLfD-2>%Xt~$mpOei9mxoburs5pEfB*j3TuYXP zJWZ46+r7?P5daBQl`i-qeYaFeDmj)-JR-kc+KRd?tb>=zViG-s^}S1y@adiJL=XuQ z1lgk)t1`S8Fn)yB8*H+?ca+2vZs&Sr*qPji&+0~uxpOnJPQE^_7O@eJN}B278CaX+ zz#`{pku=!a8hQDB0i;2s+Y`HGGUVCM0V?( z=S(%JD(u==*H!TZ%bbLloDYGTY$~N>ig(8&iyZEbG!6q@Wi~rb6OGfTCVb71{P7@R z`q-rG9C)RwiiyFWKREh{}eKJtho#hnt!>a@|{A*RQffCFp}2n!g7q`RekNs1WY zLnezpvo>~V!H$SAP8t#o!>GB`jY;O6tRts%5c{M%Nqhwkv2B}ruA}@`P%;-CD9kg?QF7LDZx-`^YK=mO zR7$3C7-$v25_kake8g^f?=Jp{_nCIQKz{LpCQ+qAYkK0gg z!X-+RR-0Ne<3-%$%U}v=jRjzbG>TavqoK8*?zQgBBZpz2!(rAW&j@yr+~8@RwJb#* z8Tz`*^{UZ67-!*nFq^iHH%wV1(K1h3n(@yU7uwd{S8>h26wr3$QbfPc4`N+bs59 z4*v0oG}8NQ+%jU_N zcsa0A)LcC^X1QFnJy5Sh8Jl?+s)#Lfh<#InStin6yd)dx%v)yr-EN($HB@E8I4UQi z8gq+fUFqS=L*HD*_4j-}Q~dP#Gu2w@^z@|OUsuUg#?6k#|E%x2mIBKlS~3(rGM|v5VFe$c^Wmh8DQZGSh(ULEFza^oTVt#2ZZ?f-$U-E3 z?Zre0d+%uz&;~CwIY*0e8UGz{n~ap zM;H473Gnn>t_9&DS?1ut6)bxWWwhc}L^O;8RVmq1jI^vP19VblVZ$1wy0Iy{*JYtx zvP6wn0ZWBl2(wH0_TvDNP2CaEBw2roTL=XfAU1G>bzSLjJktH$9X&ohsrkt1iPLi8 z4?q0CJ^I4~UC!qo!@6AQ^OrBWkY+Px!%Kv~K_|2FR+}K{xpRGM>7`|79x49zZ~d0q{2cG@sMbdJ z_xJR(pM6X3-o0b;ik!Bvyg^R`2TX_)2I&K>w9<|oD$Eo-PQV}{m`aO)3+Ty%c*}Vc z1q^!ax~=+xE8;kemx=tJm z_Ix^NRTN}qU6t}$wGx3lXcav{QTCUkZOv*|jO3S9+A8FzlPn&MXf}*Al8uBMQK?zU zQ5cO{lLtfXCDCKjwmRgHeq)X=Nt;&mpwxa9% zi@}d*H?IajSZk#!{klzBbw~<^NXE2N$l@dOlJo4_L}u%}9{GD!*VXxS5`k3PnY1>; znnaQi`~eI1{6WhZKDp|S1;vUj(vk#<8#1LMUTTyj!e6t$%ojonAb1m3tD0?y10=1JsBgQDHF-gS+6lNn7!D)e?1EPw< z2lfKVHjwdrtV3G$^jHxLprfCV^E-Z9K@Sjct+Qvxo@JJ#Ap{IMflWV!vs|p zEW>8TziOmnCDh(i^`4@^xh$hm`3F)}Kw0RB=zKn_#sllzc~gO+wUugP%Y6)u5D-+( z+O7z2S8AnrJRYeL(cOoS$}z@{*^C4b26#yp9o#Y(84EdK8Zm{|QQk70FK70FlV1P| zuOJUMr9@sHcua{_35p+wLHh6>-*i5o)vpf5kzg(X9Ag?M%LXl#(#8v;oU65vC!%#( zy5kENSz^EdL>a%IgF~%w449Vab~$xubs!EoNPB~wc94D)Z2?k1QtHXI%d(J@-kcLe zvy7f{A1#GIfxyEqJ<}_RL1G9r9}XNgV>#wD949DwXgf)|a*QK*&H4Nj;m*h!J` zl4hcqv8fIsi}b?5xGu}HxfbgW(B#=`O0cwQdE5HfO3Ho!ov1dQ;Vsxhrs%a&53hiE zrR7GTT9h=}+8Vuo|6We~Dw|2C$xf(@W&O2UIYCAahg=G^oar#n%(jF7fdqdBA1DI3 zzFx0Nhb*Pg>FJ3kVapA&cpY_qt*VAFH^&KTyx&`EIs?aSJjF;G`jlE}nrAJc0j#X+ zqVd7gIO)jbDl=Q`Vq`3$@zTVYD8;l(HuWA}@?}THAY!Q{$u5uGJd1B#h`ewX8R@|4 z_*xg07h;j+QgqU=844-iyC}>*uNx-57HtIX?=X&?0p}de^Cb7W>UhT+PxmZ{tO}5< zXh`mP2#{s=&4|Rq&bB|+w8Gke4MWmOqSH_V1*s;Q%$uP%$7~yv;pcKKO5W0(fI>;M?3DqKZX$qbCOuUv08zv_v2zZhI(w35W(_=Smcl3) z88*Kv)hSFaYpwL~@IXHBcn|FgaG&_);X$DJg*MqO@dHrnFU!I%t{_;*35qgRwdKR0 z>Y7RZ%ptp4{u}J6?j*{4uW=)iZbAAYBk6pH*oHIcM&Dsi7}R3bpx_4uy!m3qXz(T zdEt$D7zWBM>jNLvOB0@1C(3iG>TMK6l!8* z=p?de90nSPQEAcIcR!PBafU62G}4H&UWqDBbswlGs&SVkBc}ygh!+o^jglQz%Q%jd z#J7NCihyUiinhTy2DpcD*qN>@Qt7Juu<;sDUAz4I%jXAL)`d5^ZKKoaM3>8z;z78- zD1Bjg|N6}v`tG~$b}~NfD0oTXN3LZP5Oi4J!W2?UQk-Ziya<6(^1`kfbaVoN%RJ2* z=~HS4$}9~Ksvw-YYV#|sJ%XwS%(7ZJyIkg_O-KdZNW$%2x^iQFX+6`5ND_HG)FqMt zD^a@P#YO6>msVvIZT39Rl(#IFMXbAarAsA?jeH7$T&?7MpuA=2`T5yQL(-Q9GGPcl zICsn`$J)BeoVT-j&RY@3mN#YFfoiF}s3DAiFJ7doL95bGl0K7b0if25n~eG(O1ra( z`YcL&W|MKTQIF$DITsot=)F-ZyV@!(*JY>roPD2xgBra-kqN;JsKAkD>N}B?{4Uqa zMJu_hv^;1-s5N@?_AMO_Go>N*5EUXCr;#E`Rwpm4f??}Q=hLa%IxFbjR90CEFY;j+ zc$@+A1LF-=jUL*9CxeWju<)xG)Z>&sUoQ0d(`S9b?Du9f8wCq58a;27lDLXjyz-HS z?;Ly}pWH6Xy4Ff38ToxhqEMAmR7Vr*|7H<-M-2Y8*63`s)7bSPCB;dA1#Z2<@uK2E zIum_GzMn`g31LJ|we#uHZJ1iq>4Wu_E45QXF@|*N8Y67Lk*lYPCIfbLLj*NU6a}8* zAPAk5Klk3#t;BKj& zu$O}KhaEGKBN<^i-6iqDLSvpwp&=z&x0SZFtGH19z*fqhZp?XKWp}jZhgID>oGRb= zI&p%-tBhxuY}u5Cq+VgghylR49@1b+$tW*v@9n(wkK-_qKOVcj+1mD+R>E#(qqG^t z^j*%_Wk(?qv5mH);L}b;X5C)o18Fmo$8)|2>Bnp26%<@ZUO|Em5PlN&9j>j3m6A6T zfG7clF~x2tHFn}K`9+@>Rqo_x?Hb97~sVN{5sdHClol{;9;kfXb|MP zwZ;jSFf5SX1P>l08)RWQ>Pe807Fzpa2m!!?vYFdB9j)%zp%YEe001BWNkl{^^D*?BbPRMy&!EXt0bzkAtH^%}C%t?MzQrN!8JN0H5@G^=5zGpfaAHaEQ3 z+qMZP%!lT(EXL1nRUjK1e6E@9=U3{=bR3T|E!b#294N*ZDTvk=tQ(x_K-=-bIAI`N zZKixyn`7bZc8)r!=yGdET$uqImQ5NsY zIkWo=6r1wjSTA7Dm7J-_T6lVV>|fIw9p;(Faim2yR$xPi!+|2$Z3@-POSj5cECQ`I zn)OD^f`h6oBN7+CxNwy*u3Oh-2fXxoBEJvbI~s;j(Rhs^Hff=y6!P-#L1d9IcvwWC z2EcD!7M?R2bh5Rk8xBY=06;*_v7rob+r&czC5LpXC;spdif_^)Q1ro`)!#PJ4 z0uWa#5M@EH5c0G8%7Y4qJ`iGD=RH?(^yMXF41XbiH2H80O2v z15<$c8y#IQ*Deng1RE}&-4FmbsGCldT4^%W*G<_)LS$&9Gs;Sxn~l;+Il`BV(iA1M zMoUynBi!}KM$qqt7hP+mc|K5UOzE}a5SRvrVb~$*K<0H!Q;GsEAn8~|Q!r?)Ca#Ei z19ohSSEz-u2`=c)xm7HKJYDmZat?x;j&j?GmYk6fR}#~cSFc`C2$9~sd&j5X)03LY>Bx(SmSv?RNOdk* zPesh@SPMJr%z0VZ28bC#Nka-iPJtOdf(_KDzc%H+V-v9YY3!5$I(om{=h(a}Pdl!? zdSQ#_+BgnsHC<}Ac(OfHN*ol4@;rn{_tT`G3#AlZ+G!kRQ)oIeoV`hNL8^$UT)=N9 zp$>cJDGf=-bgh!oA8Tz?TiID0!{kC)QmS_kVuskIw|pwb&YY4>Ze3R`V^OlgJya(m zrEBI7hCPYXjTb(@bU1NKDT?zvhiidR>GgVLVu>6sDMnhil|@%3byZ0#!HYK_AGpjX z$(^wWi{_iaMGLAn`8~i50SMe$rFojaN`NJDG^Sx^e_gHjfFa;SVT2y$SsiWEsj2dm zB0fAkP@_hVPfxT+uY$5Ri5#@n%JDra=IEAEn%E(y9&)5HS{Q~w@~EA>+?$Z}>kWv( zDClk9qRKLBhL0PSk})i-HwOJx)l=9(`2<*X^unCuo?=Nx=d7i=vHh9GvG>igfOe&y zR2M*c@%PpcF_@@djy{SyQGn%gH07DUVTM_Mc5H?=?`vJx9YE!7Vy|FFoTW&Uj=8XZ&5cp+!Cf5RfhE7U^`3Ug{#3Fnz9StTH%i<&6 zd#W+eIE+#W7S++?Ykh#hqod>pecl%P@xFgO=HrN}MhJ+9K0|cs(>&{@g0y3_fGIJl z?INZ7)`-sM6J5?{c7a7>zpX26+e)YNnLd2@LB}>YZP8;Th)oQWO+hLtCtw$}O0N;D zZ?-{*)6glaPB(*fpN#3c%@A002z;of;?}`^VpGH$ z^L4i1jXU3Jyu4MBa7JL&$xSE*pI&IEbK|VZO+?SLRUCtM&(xNVybzQYwg?@nVS&_*GFC@&B@lc8wETkc+ z_8%5bL`@7u84*v;(bLn@v$>Y4Q;Z^1@26f7!RAX0G!gj(GYOb#;ziUdZR-FaXs8$+ zp3fK6&nMB}TO{B0@L-)_?TskB`p2V9U_ZS?DNRayMxXxq^Jm(`921j{$EQceKA;*x z^A3c497j6L2Yv0+a?#C#h-e(fow9F~ zo_H9#g>%=)cb6VGlCBFIL15}pV5ucx3ym7Rd;9L$T#IvFrxl%RA9S3Faab}gMId!$ z$vMOS-?bH?PmxyP=z|3ZdNN+h;5{|(X^?j!Z&`I7sGc!?^hjA1V2^=7QbCxLgB2Ce z@BHEyG|vb1rh~fj?s(+b3Q24n>3B&DQe7Cbu}i(H$m3nv_eAt^wcH@-d(|8XP5M3uO18~xEQ|LECV zi!(k50Ld^xu_LT4Z?vwPaid}N8q6L!zPRY&(?dcV^U6ciu^F$OCP5sCi{X+_nry+P9%UPd9SDh&OV2jqe4AwdJM|6(jmoHzqNy?{y0fh7 zN{4yY1&@;wr#LTOM&6q|AnqX>rN~M-qP>fUyD6coIIxsb=ql*86|`W-vzlQw$|Ev> z9NQ{$esxExOF?Pek<+%;o*EOot7x~`t@^??*)iEzvhHw$TMj=$3#^(6ScWRx3ith` zI_>>~*md=AM4^kys8C;gC4V?wP`GYz5OAt4%c8z@>NTFZG;UHI=;l}%b3mHtG|y_h zG0z7%Rh`B+TQwleLe$pj8C;9SWDsSAHHdMUbB+$fKzB!u|IQMj<(wm$NbR~%r9ruf z%AgAI3I_!)|GF*WdDxWVYFUl7RgK>Q@OHUy;w(5JV9!Ce&6OQ*6ph5^E(8j&oeDv< z8}XZOzM4w zTAHL{kO4bE}M#rYzwHLXDrDP=r{~XfNbzbB+aHZS{9z3jMK5?fY@Cx9#4HdrlrN4TAyz(E5cLnn?%?`u;@j1h=_-P6;Pa-@5HSylTc zl$1!%1ZDx^!)8)ZlUO~$j~<4T%d#+iIChReiu)HF{S#t_0L#Ez?sl4><2Dmp%&|XF zdrwtCp$9ca3!2)BWL#PF$ho&8JOud>5j~ww{j+bAPqy5XVQQsPy>4)=HJXI&^<1un zUz};DS-=EF-D5@PU|&wWtjoGE1y$AwVzAr|9hwYCe3aY-Z)WXa-yy7mpKBLFrC4_d z9cJz}O%}ha6;8pQub5y=9A=S&2Z{n$+qTj9bfWKn_%#*LsiS!EmIpcq3o{gA#X~fE?I2KYO*RZJEHQ=kzbg1msD4Q(()@R?zLf|;df5R1($r@ZS zwM*9m*pUi0F&lAg8HT%4#*mPL+>hh&s6VF}!%w)TT3Tl^(ZxtMMR3MhsISlAT5un& zC3Xx^U6Yn&QHiKkRsvkcMt(RPc9nppvq)eEY{8hV*f|_7Lu5<9?Jx{&N$D+A@tJRZ(kV6GN4HIPBxGFtSFk&!;?ZwDE8}YME_`4W;sq zS8Ac{v`I21kAbe&WtReq(^5$;Mxk>^2bo!BYOR~xgAU8BuGg2nsHb{Y@&FxGR9+;Z zV9x2>(0Qs3Uf8}*1U&gqF5<*SfFO`(yQd$8&#q=pC=+umTb0E2uc zz(#!2}o%0xA5m z2bgrWu2z(G5-;f>+WIU9REU9+52|!?hl6~5P(D6<^RkIf-dR@5HD+0Bs}Y_dZPxbv z@7}$o!{Ml#5^UJ-?v51aX;R(zC?m3In&{R2E4n+fK71Rq&h{1|Z{Qb(&9h~0U6(64 zazZrWUI}CdWM0E7J4wHRogL#jT)Yi0;3Um%`?Q)C0$*?Koxs4uW`Pz1sV+d#0R{$m z*EybZTB#ruRn2JEyZNNwD*zj3p_l8Gp0EL7-l5UoIE=^!YQbG8RuUDL&%JQQUH-k~5voXZ@mWUA4EdeKxY0aZ%dG1W(>2 z^^=ZrQ(A3Au2M<^g|VC81K2|)U`uS<+uugSV%%X%DVz{wa?eOgY&8Lt4F#^AeS^yS z0PN%dQv%#%EK2OWc5yZn;x`Nf&GSL|(r6{BA>hE$m(km*e|KFLwI42}s!#zGV<7Qh z)S(rzQ-FRSsxhr}s(!N^cx&p3auMJna12;mBWf5RAIePlp8=p^cB7*h2i^F7{p%l| z&9%T-#OmQKmmcddrGcGYTa#$%rpA>`UUu+ISRfNRh9x+T`VFdCMCnR5)55UJkkc^B4t;?#RAJ|+!e*8#JrxV3?lcv%PulRhqaCVlQkhYu%A&OGY z>AxW{3?V2(hZmny6;c&*xpgYymHX(BbPLfxVr@XGy=r^^W62rDW6N z^j;C@{UC8mL9Q8*wadCN%8$*dRQ>s#DHqg1w~KYWmS>mCMIWHu*dTyllgNV_CpKlw zxg7%w2)$Kn*~QVl;5#shjSB>mX_|H>iNTtA8nQ*nnN|US&;*8w?4^E5H|ET}ubj016z*+e@ra_c56z3X)myo4)- z$)wn-Ld{fMy>*17wU6YAanr$OQjF#Vn~kMC*J2W2zz(dHVv~$8AkVymuvBuIL=#O; zM?#y}G3C4wIimANN{!30#vwl|FdfPDY(a4 zv|cTZ4B)pc-4)f2V|cMw5j6C%OfTDq?s+d8T#^iSj5O`$Sqw+vd_M0?44TYogOs^w z$zbFGu6mVCeG>2a7^2RCouu7F<688az835I*N8`Q&N)g_VS)^`ZYz1`=~4Li)~bp% z5FMPhx%S?u-8{rO5HVR!h@=W5AF$b^7n1?#<*>+grD{0&0M3b;-d7(2y?*_grfH&e zU1^&5J}lRTj>jWKZ-NT@0_0h4@Ik%boO6`dtg0iNW*P@9y}lhgz&00jKwH9KG=lkc zmBmZqqPoa6AynSF$`*sx0%(I3lZM;1PRPN7vb_z;HM}5}q+?4fZ(c%M`rDBaz7Hz4 zCJP3vCyeB*T=rH{OGXKYX+j90OMIn-kH*_?x8oZQ_NeKjA_DS((wsP>TV676j5Z*1 zjA+Y<1rb?FV5KPwd(HO3Ed3NW)6y-tP;tF__3GJNixvCa3RLXZfXlE4**XrT?z7Ss zdLz446kaOBBxy0#*gtQ=b-=-Zcf?Yg?V42|MFSk86)mOE=($z+^zoxACSj!V>C-3r z^!YQ#COhZo>G4rR=GSGRM@ee2r%j9;B%ilTi>qEZXxRXp@trCh3V0`&Wga}N|!7*$2tFr1lV z7ejdl2OKI!Y-)C)LG`7WhMXwNvQk+VRhR+gMwsUD8C}b++KEx;+`LJTGS)3Sr=F8k z7}nm&a^x+m6Fzs~hUA>-d^&YSr>NpkQCOo2R6W>;K#IY=!TQX`p8UEjI?DFJ)3@J# zN3UPK>IuUV=<(*wYl`zUlMkLI$!)?eHx7folrXJRu5}39V>{Y`4LN5a6F3E%Qc8+C zV^bhw$AeSXmU*o;nx>J#w~}R^=``gs1g7RX?`gSSDGdYnZ(RRS0ew*DtVpk{LMzQ% z53cJ%1v!;RrW^tgTh(Bqn@j?1A#w^17PCVi4u>7T8fZNFOJ~G9c6M%Y1I_PB15MMY zKg;_-Q5bjLv3!!vJessAgNz>eWmuL~gZhwKijvr?pI-Mb<4Fcl8j`Zl)D$5m#cGfM zdJrd4>uoReCyL0Bvg3tnPC1AVcu_V@b4y zHSMmn@?DV=uTp*}2pUY71Nn2TWQTFvf#cAOchv`elHE(0!*E zDNGa1^Q^s|&CpxjYAl}8uIxn=6pK_m*);>4BZNT9x@wz+@zC{peKywuSu0)?xB;n1 z$~YTwifg31yJPp8zcFMirI1glIUTTCZ;QGdK)Ss=9O`$IW%w4(UU$k`XW{I64h)olHycZW# z+*c=`WBCBhjO)Pjw&t55Mmoy9!X~~6$b``)o=NbYT8tFbo}ekc^f_G1^?Id?jFYR$ z;;Z6Qh$;=`yv1xljm7oZ4Z^T8Rx6aVH zLyYw9?OVFLyOT)~-}m$7Ld*3^(W-i|1LkexWJW;&v&oIN@=81Q(ic{CrD~XSc6_FO zZ_*>NyJ^+R06by)@YNJROa#C_LJwyXQvhb+^RkI}MhP9%$Gr+G&-dA@1A8eda&Mhr zb}6ce=N&llgI!;umT1~X%C3u&&?55K{crCPeh-j@?7g*l;AHHu?Z#?1IyEUQUGW6^ z>~dXpZl$)`*u)s)Y{VpLAYyu7yjX)!k#p&q{@1TxKbvd0zrXL~88g#H6#!6fSr>DWN?Pi-`=fyLgO!o{Tcu zDt6X&r4S>XPA6UDIb>tNW0E^$9u3N(f>Tlk+v{P#a8w#1PHeo;%+zzDSFSr=vyI-_ zmEahqmBM2i?>ZOVKP-4N-0`jYXDA;2%n}wBYX;~I}_39PMH> zhtxRFl;+l1#g?=XYeSWVejihSTS5p>OQt}wjFqi(oAG-KyB*%*57vkg|D&6@Wo{KX zqQ}la5#a+rI-7BBt*&B-G>n5W2w-*-CKr6FS1Ki|*(P3oFy*vzDutZ5l6bL|?tFpL zLk!UCDMx@Ef)L~DoTuv*#GR;Id!Wy#?hr_zfse-dmkCH+t>sJ<7o@W(B{gw)`}*~> zxfUE)wk^cxSSl(iD9dt#rP#VIS_R^BQI+;;EJ=vOCgu@c#kR?e9;bUXA}Q}ZoyGSa zCp0qN$sU50c7~FTh)(A-y?Omw^Vyt3^6x+?CW@!?nR3qb`1Gim(AUeA&ZiU2!YfC~ zTS`$o8P^VRP1C;q+Xt1@{J{T;u@Qid5&^qK^Ox3~SgjE;nO1IYeGTspn!tuZ&& zlh+4oo`pJ^zR{Y{G24#VV@Fyjg@<7f5la7>({<@7D9Cv?L<#lR#wI2( zUz2aVqt+ZX87o-=$Rp= zjp%$nYmBk?o>qh1oKB}_b1h&t0{^gF54_AVCStinputpfyS0sWNvz928Uu05R;(Nw zO_HM8+qTwtbQ}cl2_aDQk%oED&%D3C-@jX#*U7BbW=%syaX*iTgPKRCSm}5;&^*r+ zopW?J9N08M77}8UkH@2qjx0addq-Zl-%s%YhSQdkYh94c0iAg&fLz-&0P6HZ~HrR;M7b`V0K(i(YV4BB(m=4W#)sx~tk@SW03B)(XuHgAuoA6r*bZsNvN zs`|a{JPndL`RsZt9azb2CW*2EKVzpgld&)#>9ryg{gbh#oZcn zj>LE*D=7?dQLQzq)Tox8v39_vL0u4Mr;Wtw$HiUQLQyEwCQ#Ox{dMKxq4`|;q}H=ggmHf z%1dACHNemI(-`eRZC8vnGp--DQr70m(jj|QLpx$otxdh>p&{o=rt7Y;unQIjIgRQ~ z&QUfaA>13zt8e6sL=|mqr#`$~FFJ9+MhJOs5Fa*Vyz$FK9UYgK3+yWhdc60XdTQ*T zuz1xAKxX`^)+*)MTuYZN_ll~ik?5e6-yi}ns4gx4oXF8I4;tcVt4ceD1x>pNX$b#- z=DnFdy9<}R0?}A^$>2%0eX|uNa{U}R#n3_sG{i`s7V(T@m(HLz&tB|gqam}n#tX|k zPt!ChJ1NKxY!fTzdDhd+=7S;4Qj=EA4Y9i^gbVhBwjdekl(y8y&48I@N>N5v$pBVf zskl}mYc=L-K`b~$N`sb3jrxYxEc$Es@wSDqS!0N{ViSW-pzx0U!f#c0)`Zg$R3fc|XBT;SZNA(4-PsF04ir&PTIaArZ%HXPf@#gSo^H7zA(#P35a#bieBxY*v{4reCAv-kV8+&Wg)UmQoqKgQjpVcZQ(hF(H1jz-!G zrQ+R^l~9!x)4Y6|&cG9CAfZ^6R3FE%9t5hECQcFd`^RMr9R&cX4nni5s%<#;>aG3* zL;j7_2+zyER|G-pH%~^(RhWrc*%(CUcx~LM%f>3D4u-s9YvY3mQMqD4I{VSx-5p@z zpOZn6X|APRC>I4yi4q1U5{>JSow5Xtg!Y%QH?${Iffw%xtNV*CU&)dwgs89gQnEOJ zYucdnuQUlfF^%*+Z?Cs_Y(%81RV|mxdFdyFwWpoibQ9+qY-qA(%%DwAGP;7MHXG&i zge&fXnj8`n_(Q37jy&@WFw@4VA~v67n{itXv8*}Qod#w$fUJP7Zzn4Bl2Z{rQp2aE zap=$u6qExAUvSb%q@T1SEO}yXl$YhW#-Q#Smcm_1>Y^zCnLJPC)-Kt0;eoFUHims( z?ai1x%vvdYwYJwNQ9)IizuP>_3ZVX!KQrrDkXIJ)cUaYpb1?J~d~>Z?EwFx;ty$r@ zo93du0uzqq{+6;RMDpSFf)8Vz_QGE9)qP4|*$v6=0%Y+s$CRLMnm=Fh6lf@>xRKf!Nc%A7d71Jvw^IB?6I9Drd1D5 zoTWG|h-E5c<3kmob-uX{P19knJ(ORH!zi2<0=`&Qa=9R1og?^^Zu1=-HwIYI67>!T z3q+~|jE8H&UH~N`CM5QJ?mh(L_U!je$bih#I-ulGdC?6^-d%09sA?Ci#Kf?|fdVM% z7>+p=u{rJ5()5KAqo=vnrI$nWy$~N7F<~{55L}fqMYp{?xwD)zgK~^q+L8m6XI#vt z3bNNgob^MtN&gUODMe2br&v9o&8z64i`C%LZ>fp8$|7M_(y>`*35Nohda1&Ib}DVx z&bMuT%-WXbY{T#y7V7zafByf2x|&FV3_svJr$1gojP^Pj;H@yjMUs|LwQt{8+={X> z91g`xh124dq$+%~hk|IP9d+A|QnDR-Wv9n7;o|9Fg=ijJV+)p~AGe@hu~BIE8F+md zK3lI5xH9d&O}-b5{)HjVnB=mih9ddZOSStO2@sy0TAbo@P2&U}&&+ZnYooa;_ekb- z1t>GIUF=h+Ij4PIZ!c#Fj$1a~u}-pNI%0f*_+nW4i%N=SlP?u6;cdenIeUJ!gjN8}WXO~TT6_;#cUEi?vE0$%6!Fv)7E4_W+b(d^Nl)D5m zmraBjD)dMH+ht-`a?8KI|5Hi;dkDZ4AK&%#pQ19O+o40xux9n2BJg<0M(jDJ>-9h7 zz09npYU6)v0_p=QXAIx{cU#9@zW-hMSItVwWz&C3j^~qB=>Ms#?&$O1l|TFTZvW3X zbZh>598H}^|EI08|D6z^d%z@~dPZLU`(~Vwz5gDUy7qr&0J#2}L{g?+{fh4Y6rb}o ztHaIzY!1LxfzQiE_UylJeRAgSF|O(QpYplbuo9g3pBn*JpTBEXM4kWr&twx1Ko1d# zU8Z5ANFY>71*+p@3odQagUBiQShTbv*7ZI%QP_CFQX6<=h*+?NHrh)!+tH2wU}n8a zquXAiE-5A+>?{2&k5T>@;b+UL5H{K*8?YO4&=hp*f9fMf^1o=apmYnvgPV#_eilp$Q{-E5$dKWK0EoQh*Qa=LgpImHHr_eX#KGcfoF!FLueWMogE z5FJH3zpO=N3m%*D$_9K7c77ONGkDtGGV=3IyCaxTy!!4yW~y2(JGK>X@)iHa%+mF5 z-7Evy@g?=esAXyCwh#L8#rynI-mGa$x}nL5;zd(iRQh&ceb96CEdvTCb-qAb9lTQ+ zDk?^PIhG2EAw-9C^0$v8*r|QS0cd_ecp$1BD`4aKGS#n0(^JpZewa=yNI<6z7v6hY zHCnX6nfs!(vQXf#pXk)vstSf*S>rG;Q&$VIvs!-%i3ztZ{lJN!H5XhZ%O#fQN6^^rend}bNB|K(en}QVD{1KMNWD@;2;Dj? z{#kvxYT21*jcl~8s18!d;ddZKg*GguEV?0rMz^l*)?_?@Ws0@Ka}l41Mc=6k^Di=6 ze?Td|zWe?o-|wj};`U0P9zR#x&<729~zDeaQu zKAnnO3Ak|-&eUcOEky14K)=q)^nO~@iu0mH*Aa4Qs`9)$O&0Woiw-@;mg+55seENZ zH605b_ogk1g>^R9^$&U8TO8Y~I!58ZeXIDXmo}XU4(LXy{MyQ-b;IN3+9=>6RjcK?`pY`wu^R->A`ouXW|pt2}h%!&47faRRGsIYLk&$sZCYc zoF#10-p(tQiwgxS|)87&2T&9G-qx zLTvyHDzC!fD}*PP(9>|ZsJ6+m;)yTD;{h?SyfB>fJI_hOn+*|9J4Ne*G6U94>oPXi znsG2u+1IBocjdt_587@MFrU!=!sOTMNWt*@eAX%3+odv(bZZaB;`I$ z{0y`%_SVp0Q?bzH!goYndFDXtvTSVEyubicZnE*`Q2HB)Iv8~@-j5$wSWtX@&1m&w zfk>omqgP0tG95v?&{Cq4g-)VLXe1 zBQM_>nU|83chfZeHY3WEzi(02QwE=On+uzavA=w>J3@f+1sB>3pnOKWhKWa3t9o#C zeiKT-B7&>{{M_Kcl|Z3;LJ&Ja@Uj|6KQ)AI2}6PUVGc$;Qi7Ju8BKCHOapW4LFPt! zgeHP4z|FgrIAMQ_E}AqoyC`;oHRvKExoDPP+DT_3)0Q|MFGC4je0}MjObhW|bLH@! zxhRpiNHm4FiSw-@Av@1v1R|Y!xAA6Joz?3SK5mVjcy>{1xN_;aRhqAFTDFy@B$hTEn6rYK53EIVThK$Mymv-9Z55JtIQu#%NrFH#MI zh*xtjap$HLD&#Evsv0|K)$OdQ(ncjhIMVP|H10#q>qp(N3^|-Ov}gdZ6KiRrBW&H( zR1~pSKH48B1so^+2$2sytH4UGjl=xU?{daw14%3!Ryg$mTa4Dz-uL;1Fn1DV$*V7F zr18O78e?BZR2=}6My1i+w6x}%0WQ$&z3yyT1e?wr+7eyE^g!hKCflqcKplZ`bwIikPyghWLeewx`Bfmst%o4 z%avx6uPAN)gl%^2R71WX4!Z8+`j=# z^skL{h1Dq|{z+=~Is+n&=UtiAsKsc12dK5@{x@KV1YD~PM%5hG1~+0PtE974+Fipw zOfL{_yskK>@fl396x*`dD)sQFbnNk;LSVr9s!WTZWJn!!V6U#%IKrxKk=ZVItN~Ny zp6xIBipDoqT` zwBfjK`|~JrdpO+V1^W%h#hudGX|1E+DrhTBnA{RsuT^l}1KAvrY2h~m&Sp|qfs&d} z1v=LZR{vmNx^7`{{qAOA3_$E)A{1QNpcS}4{NsucEy5Ei>m#6=@J0U8$4zx`V+cjf zRwVA6fRY?W7@B*JB%u43BY~z>(#ocxGuQ0R2<^8)e5N0@Jw}pO= zV|qighO7WazY=j)`2z&VTAc?3Ze~Vv0yH3jn7PPI6mz|BZ`>(=NTu*dO&h!&0 zO)p)}<*C~X2Nb%Cd|iuXu&Ln;cvO@?4NI7?%oxB|F`>ib!zma^84%(0xDPUT!ERC!feGfX~unF8% z+G;|+W9FBP!U+f3)$Uu=tjw1c=%Y&DbqwjXw8GC!f!Bv$9?5K~x`Bk{O{#ALEXAo~CJ-0-|bFL zJMO+F(+qAS&|G0}8s_pGUSDe`(xk1(;CID-wFxE~ZiQm9I6R$5VdzL@LRw`eD4)(9 zF3kP~NI8RMl*^P(`hzM+hU)wpQlW=faKO`YIM6EJbnL zKL9=vF_>egtQGyG@zfTyuK%NYewWIR0w@voYFIHqzzs^Ig%bf_^YJ@UV;k4nr1?7? zihi|KM}U|wE2ryKch&IA|JcQJ56c;7T79=VXzmo%*8cu&vW_*ooV?XgSY*8+K60SM z9#CvbAsXH9_ec~jLj*3h9)*0w?K0g#^5meGTw%GC@kYg&Wo}Yua4&pCM*LQ_^F}xK z=meMKxZM(!pA7cb;DB?M6#))yXf;kCK$QRim&ChE=aC%#fUt;hL0!Z?(FsxN6h+{; zQJaU=zZmW_6)M3?0@8WoGKT_91R>!W(wbbVNpJsTQ!g#<@r+W_v{`cule!cEKK?660G zS#b|=@z9+FLEi8wO&dbeL(Xx+wevUjjC`Umj9omALU)0%2DNNL#!&+CQbaZrV zqeL8~(aoI<_;vagr~!#`w^3qc*M9-3l^KH!zRh#8^^#71Z+S(7iEn0ZFcqZ=AWpyjj}iZT58$+x6a+E~7a z#AVjbgAbmCh^CV}AO7TCWa>CrB`h7LWudBd*4#TWufow)k_eJCj}|xx1wn|L?`jy? z&Z#!6iT%3Uc;1&!Z+aZQ$+C-(EChivO38qJ4Qd}tO0g3wE=?7C@27Ru6VY>b)FNN5 zp7s26wE++=%l_855T2jsNl%-}d?7HhF8KB6SEG}TFOSdWa#g8r%&U`-xS19Aj_R625Kt<)^nr&(t24QO;;PX}p<&$|5rbY5r;rm!K z5185z<{3uM3;6H*DGpXS&?+nPokvGeQ@4N|+|LqX{I@sHsz_L@!_Iv4{bK$wXh>J zu4bQL573KK(4o_^MDfM?#Fp$%StjSWi7w7b$ow>;u)oO`*@)$};rxoSoqN_+#X8&( z4w6z=L%iN|i4O-{-UfRK{@8acHBrS5g~}Dt#x*N6kW_%sU&X8_HoRknlgHLTd9t}jz zBnvs`4+>^UiQROjYrZABtMacDwOASPHjFce5hkSy@Ajm0x65{$UtX5dB<20E8ZB}) zS9fPpBh+HvmvjU0jg!=>g9exy`82S^CsDkQUsY5JgxDk6X>;R`I`k=9qWPiN*UpB& z?djiF%_&g!0O@axac*#r?ln1TF+ocl#>bcoMJp6NufhVAF|l;1z_0`LMW`VRy=wY+ z(vRcvbH>(~+01@N3l`!HyrKo1uqlTn+r+)2EQUixYMPEij8QyEh_J5 z9jHW*lplwf_WoDaNH=#{71m%?IpWdqx3{;-(yC5*Hri$C=(W7Oss||jM+o`mO2wAT z?9vW|g~d&rIr8J;Di~U6HY@E6b9G+Z(Q_})VXE3puXbXW>0HqgbNkAk>@B>iiQZ4o z9`5dpiQ1-J7R)ECcQ=_D32@iE^L!x=XczR=^?-1(X7-`{PGNCu!@?@-MDW25dYY!@ zOWMXis~{qR69r+U{&}TL1x(ftj6`uy7gHN8fWWC+ULz=J@xRkbNh&yye^~a(iv%** zkr3FqsZj^eRAVRF=O5ck6+ko7V(T3@P*^P!L7cX2a)TZz7f(x+y-c~;seG`K4owhS z3~;erATz2Ue;`#&v?t82)nQ-S#BT57-UMn2vgdBWwUQ+@uZI{RPj;b1l*Jl@VfiFaU*|O}re$&0q16?ErIirGE#Jwxmrz7g4HV9yV1X@l4 z^YjM3a>sxR{9f;dxefTu+J~sKY32Im)&$j2c{$9kOHRnnIXll;6_1z`f}C1JW8~*6 zcWe&emp9*1-wWe-Yx#cK0R&y%?bl38Ixk~=Z)@b2Ke8$em22_tl66jXw6y+Vn-c8U z08Io@O_ne zyWI;wk>O^u_a(`K_hBRuX4bNgPQ;KW|3_D8mow77By zy8aUpz0;>f<+ffBDLgsQ;c`CMR3SQlS)6We>3(d9zSk)Yb;XO`;h+Fr!|B(K zLtTcKlto)=hUaq}Gifn&D}6jDkEei>9W-gR=iTmAef+iG;5N6$kr(nC9uqVK07IAV zRt8`D^$>dUassm>|7$l-|oymx80eb9HbZ7CkhTyJ+BqQ6vM z1dn~*$oY)yet**Te7~;hjEGLqx<&asf4@2NedqWN?*9Jr@_aox%1QD4GW@zv`I^_u z?|E$bLI+@j$1LvvS6EJwZdSR^m$4sJ)j zCa=DCFLG=YNItAHl?9$AZL41eo=yZjV|)(@ymIVnt~h?v%@VA#sreqhXO*G(R?^kZ zd{kVpSdCRz5&T;59q)K3xVRChv(3eG|Gviio4@&r>Jb6}SCFj-RJ^_26?2*! zNL4>RI&MyDJ|BDJ8#IV$O4Zt|?U#{IQT%ZGDhJ9^+pUh zv$Ejm`I6I%h{6i)h2}u)s#b0eA_d2)Z$_w6wpnDEntD^aS8b?vTkjH3f%|`00QUf3 zuD!I?x!SjliMQr)w%2;7XjaUbq^8jt-4B!!xmVEnoWq}vT55?h&40vj?z&vg7 z`Ev67p5l0Tn!@q?Jci%Gi{Ul>>sKB*!1=edEFTi1-l_aSlx(HT#;GdN=H@ID1){QR zVLGe{rR~%L@y_~E!Lnh++WY||?B%~LUDfoD!7J44ran>YLk>tunK6DzBnCJI3-_*S| zdfXtx#3$6Yie#8g)2^MFX{~N$qCt*v-5=#}q!8>Qt;hG@k&V@`GICuBclv7%P?tJf z!Gc1^Uz(Iv0K?FdO0|cd-|Zzv&Nqx`wz(=1_T!|$^TiJyoAf?r(n&u)5*JKs=*}~k zLIjcK3djm+oMFuG&qYK(ki7K0f~Fh$H|%WVf4c@B_nQdu99vRLROmJ0buD-r4M`Ij!8gWv+8phI0{RlJ*i+K`qD>L~JqrTcM#T%CV1kp$SO z*aF3_BPecdc1@e_gzipbu7NSXcfVbAyeT%u&yv2=YT^lY=S^H~ilh{I3lBk*dF80m zT_Ir7Lg3>TG%Gv%bn0T|A?5q8Uhz%$XR@K}!|OeTn1@r9_qxbPHcLs2sJfrWz-51G zMVsxqChSEz;(eu2`+B)7^2*Nd(KhfL4(P$oWagcapNlnWBp zRoAfHU>!XYLbbNI=>2Y3Pq%3tc#G9IliPc%szqrcYzf_&A|x!xLx=Rz&;}$hrQ~sL zf=uHgul9a1_0{-XGYTxM=mEhDSr~qwH_;p2F6Hgt$TOXUkRFW%z@jbdYe#3!`2w#A z0(owBJLk4RP%9g2Z*+1_i7CXeDv)4^ihO=3oR0^hrcr-eo%tT<8R@`8XisEI7NpX+)W)fOS#GpfqS(XmZTI;?#7fzRP-Kkx z`pdD5obUV!>P^@P2#L69C+fYV=sbXvKp9ZFJ+$fH3;`jNNe#A1y0F+b^l8miDGPG` zREp(miga@K^&VTbV%yM~~ep5e(W)CyDqJkr{ZKhp1|Be24sN&&W2%z=)_ImUE zI*mEqu>wqjO650$9gnzejrB-5vdt5@mTOnMP6;#d~dzEY_4v!%|hL>R6&K8!E~ISTXsi< zB~tu#J}rc?B#M%m_ul+N?Ro9OWzYtVnv4HeyV)yZd}BkJ1h6+>#S9UBOjo#M@}Om+bPw@G;7#{pN4cMVFpj>?L7m8b$e=A z312$`Uq)|xD?P;%N5VPX-g$bzziECK6M=2L9FPX13?XSEr2>7vm~2pvi|8%`+;k1A z++sq}9(Cj+>_dHp@(>4LhI+b1fu2+f`YD0n=Bm~ckJJ>Nq!Llh^9vFV>6%Y!)0$yC zSKq1N9i!>tk^!(r@uj&RBr0Ia(#1<= z1^GZ(?nvo2ZpvrkB#1peipa{?5amIm5_@YnXBJD%>TeBH;j?z>Pf6EU+8pWk0 zs!^OWolNbc)5R6PO>6clbv$wp)YzS^G#qi*lE}=_c5#+T2rLUB;R*3|Q-tFnsxVSP z1x*t~Ml~HtvJ^-n+Vnx7CEz2i@-HbVNeF{3s&Q>F@U&%$nkp{==q(dkUMp;ahRHcQ zvbjYFsj)^AhBww1YpSezHb<1w+-~E)%5lbF6|Vsg!k4ll~S`~lDZ%#!OrrykC5CjIgysM&_ov#=7LeB zX~1ddSE-I{NX+_a@|gbgq{(G8&9Dv+!iZlae8E-wX%(0*yRqqKSK(F)o!_~CFqGqR zx-py*F-9BdSs6A3X}%pf<`MfqOtdRwqYSm&Y>yAPIQzPll*QNR_7nqBq5M05IrHpN zj>jqO)Z)Sddj093S_NV~D|Z>4egiFmGtF{q!lTFV_r$%;OV~7A3KU|AkU1hImD|!) z5$UM)DBrB1qo8CaP03)n<|hmjC1!o)1-&nJ(e2E3Pl?+Oz&)AyBh%Z(x29@}a`;U_ zLBWz5db{rNkBD74`x?1_`ALvlFI9?c4!^H@+aV(ywT@tW>CvP1K_IPVAGx`6RZ=*( z@8k<2&~c|FF2PCB*;<*~V`>}L%Q~fcs~{u*q(JuWXV06i+oggY|3b5kGjhP_ z!JVLhcWS9*x;Se%-bE$|Ff8*>CEXRB_T)MfFu?VOi!X>68Jpdr9!_VOneeQu=So8> zcm{e9M#v%!u1E?V%t0cNL@npAI8QmCN8@N=BVn=4<@x=^_c_hrBNWonK@UBZ#P9u) zcb^%Ac@K!0&`J&h{FF?Y2s*Y605DI0OPC?K!3Wlt7_4>FQo;S3SE|pAkhlIz3bukiX+xg;|i)Ql93)_c>8UkU?(d5z&>&ydyG#+mN z6*B*tLH|YpdwhWDvzbGcZTe%QBia%wGEe1v%(ViCwrJZ`IV$l>d zbd^>b!l?8GF8;jty<<4-`R?%j$&oy7j9?r1s$TBdrArko`Tg+xh4mTpy-Pr8#jq2+ zjKhJ#Ov2HccbmC6$XMcc9ClR;5J|lT_bITSw|67}kQ>`_Z*f>;69Zs@YI?reUjH3) zeQsFJ!Bx;deBbj_sU;A!BXx zG~J7bd2nYPc6)ucVe_x0bN2(hcF$k00wv!7va;W5Ms;OIdFttnezH3I=s`;cMB?o& zeId7CjLSP3G`DmbDQYxD8&icTvYvbX13dg1I<>&Xg-kk5V+gEhCkD{sYtCO#UyfhZ^u(OfZ(g_ zX|wd=uw<8_krIk)n;|>&nLhZB?9yG2B;N}df!%WM-1Nr zPuslf_2r!ypH*$?TQ^SfKh#Rz@XHy(sVQ?$!6U=St1>LPTssPZ{o1#A5BbQE@LA2 zm8*DNHywW*uY9BjXw>Qh`y8zJ;w?$5*^+L&_(?EjpX3n?4W}jhGu80?{Oe+TIgkry z;W#h!(l78;U`%b6=>V}@qfODLMiu1K!>~BU8BJ%ZY1=bIk||w8-D$PWG2d5`0S_0Q zH-+cQ4Pa;$p&~c){GKV{4+3Nsh71OiSxZn*bx%9EIfN1wcjt}{$W;}OCw=+A=mr96 zJwC63eO*v6*y(A-Oiz__+Y8>^Q7pxob)T891_ zWtG}(Q`aIA^vTG{z>aP(+_GE=s6g?nB9}5$m1ZFf5+f)QS*E~%A90wyc&v3kQ|7&& zWLa$mWU5qle>*Fwb6#U^+`wDdb^0Zm&66mfJaL4(Akzm5^z~NrCCxihPdo7a%Hhir zXlXdU`;WG7H-`U#h;%gSF%`pF;uqG1Ca2@QN3qnhb(1lQ{r(_yBM;u$$6xsT(Ol*x zgz}sBQ$z?(_glj7A!72A>7lOY?TEDo(>=H9R*>h9UC7lsBS_uvw-pk5cvE4o z3ltHm0BKw}2mqCeh#-vmE%bmQIV5{w>QUU+Ehs_n;v!nN%jYAf-MecVpI2ohvtg2n zTP#;;Enj0Z5P`tOlsZXHtx{LO_ou@5Vmsdgkr%0t#O4DnTKIA!VN3UPBbFS!MlFz* zRcE6aBKl-b2&vTFx6d)l%WVihsny#cg+SP|o)bJ!u5JyY3Aexmwj=d51Ba9Tl`9i> z9$!BdH_go7ZU?-dmD#wQx2-r+j|4m7Mn*=M1UM2!%0(hp-2UOBAMPZWl6uq@L_HcF zV`=CZl0|5MO%vjE-GyOhw*hg)x!PezpzAh9mYSa3FSqlGkWblv!O(+Sp$X1_MwF7``?5N6yNBqb$o@$PcXy}Y4U&rj1Oy;f{Q`S`x*2)y`Tjj9IXI zUAkqNH)o!!!J6Up9Ko<3PE#!yPpZ-4N>|;p2VuR_{cAj%GkWgIHOdrE6Mjlop2br`hJ=RQ8Rsi?Ie5P3c%;AqQK{JYP#_`AJO`HoB<5f^E%97 zxKyqNg!{45^RAs)=fRTwx`*iS<#DpNdUxQy7ldJd&2_SSX|n+|()ayY7qh3p{}-85 z%K!WBE(X!W<{R)uK>@n`o6XmHR-Az(hD_h{;aJIa#TsB$;`yr$hT(cUDhh|a*X0+0 z?R7$Z&g?#I4Iz12ME)(mC^EOLbc|geufXK_Vb2=J%_q3y8ugpD>UO0+CU=rkNKnTv)N; zCnqO+A9(>+{Yu>tc#h3KD|$X$)JZVizYn4`8cd^(QjS7rlD42*^j34c4@v6%xTvVn zU|t#kU+&xI@6Vot0sv9AOtSq9qR$_W?z<=`e;|%+_X4S3Wwu#7W(eDEk4xqWHBFqw zt@NH<_|ikf`=oK=p`*Y`(7EEcrW%`eNWtcA>rewoM~+yZJ_JtkT;SsljAqlgqDq09 zsHpSyk^7iRnE9%-*phZl;X$w%*v#-QYZXi7bEO5v*_>YP*RiN!$}secNYs}HIWJ)6 zkKEPn_Zd!!y2*Pa08@>Vi7n`&rUzfU#WtzOXf9t&qs11l`)$FyfWc0lMvR-e5F0orD)e3^8P>LYeLwaDn7@wE&qFnBlp{*omX!TuZ%Rr^?jG&DjU-(|apE%AZBSM) z5SV#8j#r8VEAnCb;HDe}EJb4rRK-q;GKte@DHD|{zU9wE{?AZT^U!TrO zBpb8{7sT4)11)DH8#e!42F%Hu-hiYjE9yDZu@ex2zwQSLiI}fm(dU56`}efK9WcVf z832E{=6C0q$L;T(LjOfxOZE(n9v{9$<<_HRZSc-TYj&ph#5KuyGyvIPmMvtvP4=Tk z7kzGJ63x%_`r@4s@_96%2T0Jl{him3`+u_RP8&cwZQhtJnSi#y!qR$uq1UpV!{Dqs z!OLD^K)mSVdwtuL@E#0N}_&L@MbfR{oyEbLvtO|rq2kT`$rfBDV^EU&H;tI z{#ZQO=|g*bUwuj6Kn$<{_f^&n+TSoxiNzSK6v1{GXLVfQwnB8#71pL-Yd!2;%j(XC z)-sYaWvbLfxNwol`Ix?`Co2SSvxp)I?HQr*1JA9&r;l&uEgPf}#^@Me;GC+bkkVlf z%&=!gn%rOpCgu4yls&dv+?VdBM1oeCZrcDN$OuhrM>-=a>8?+=LZOIX z1`(`TNrC_yFmK};U`WJ~T~JXejU~Q%d1;ke`&pguAj(X-RuPw=V+aD{Cr(1;r;8FH z1qthJ2n)^3>h9^Ol}^5=|3|kc2B3u>d_m&(f}doCyc4(sS*h2sdjbvWM&v8nT0+pm zhZ>`KfKndi3!IXK_ixSx2(d8we><>WGRGH->(4G0u<1CCk^OtnBkOEdiclcDcY~;{ zf3NHyfdCZWJ>i~R^ahsR-qw3=i8stU4G!m`M-CSLUf# z9P!0d#)B@|w%q@b+|3SvL^K?U#&f^W-U+vCvc!&8BLM8V)?0trTE`(65Tc-YiP6Tn zGOv5PZ+7(>-KaqSq3zH2I^#3tHd1%Fzc)oF>sRdf9uG<%*MJsSFd{FUSTFqwC zgSI-{j24EYO4Y1HVy|WByD@jVj?g~iXe1ZVRyuDib)5HtTHmWXZm;Zo zwa;DU-NY8?Ct{KPrL1fY-K260)T{EPodvTc>LpD~g*;IAp#c2s362q5e}+9aS`L!6 z?S{2dsfA$KJ$M_k~| zC`xjCxUYM@eRKfQSEIv~uG@9X1@O0uu(oiA2}<@|-MjTfkV@SiG5BHu-R2?sAX#AU z$IH<7{iA)h+i@oW+Wq}gkFKTI5%*h&p zG1b@U0KxDuJkD*}j1Rg+`u^vNP5{8=b%3+;LB3qAnZU8uIDC}yD|q9&74&)AEvGVQ z%U_=7k=5CYZ}ayIU+YKxgm@r(B#Er4Tob3)-oV6K#1+;JlD;f6B)kmaeCGip9I|Et z>2<@Mao=f2LjT`?!Zuw(Zsy}Q#QmXegprBKuS&aFzt0~$RlpAajdrkxt)0|=S7VvI zz_MB=A~YS&Ms(*sawwK=U(#Z{RH@*KcHGxTHH(zvZo)W{gZhW{d&S!N3Hy6!$51m{ z{b!cD4&V!j983fg7RHl$?=4VGDS7Z@*tn)d)5KyZj|AQ)vEtYh)d5eaCd-CU7t5` zRPPMlmWv1_vwh(rhnClvgv`x9CV-QI`V;PNaAmZG(fX>zHm|H8)7QB)lB+d%B}+jq zG8q3-p5_-)X;19D**R;_jhFB-1DIc7_mdn4CLCBi^>1)t)+1+ej*&Gp2=$4bfX^kE zAP{fmLo8(za3l$2d09CFQ&R{P6_wF?H~@3|FyQq&Tx+k6_(7w-du}oTkPz;NrSa5u z8uUq++62LQP1A5$eS|53#RJu}Pnpn@*k$7<=S*#XJiAk9MzwYZ>L^=y*{f7(457@o z6^IB<;u5YDI@TQF`IXZR)^A6(E>HR}Py`ONy4XqkegqR0o0>9)(01xxq`O{khN)Gk zhjqYlXlQ=%PR-{{5}`t>(XqK1dLVKl?7sIQJ!M@u)>$97Z;#>WG|-Bib4sqsk2&S3 zPLJ&Z@>4=k#=U~-nd4u1?K~^NfxJ{(l^#r)s@T@()}(AqD7P@ch>%)@JGK#9V;yl) zqUnB$pPW9kY@Grq=T7DUX%}4!zhvVXCDtvXBFBgpQ+ILrwLO0&8P0P<7h*LzP#r`6D>t(5W^qbCdg0J4_Q-q4b2 zvzJ1Rq;2{k_j*P?Re}f9R3A=dir`K8bejO$0o6 zQBSzV&p}s)U>Q39h((~MsaEL($;kO7t_thNSY>Bvi#yQoJS0CxzNEA8XPH!;;gWKJUzGLjE2+|o` z#C?()8erXXugBQjU}ze!LI$IJiE&nwwnjaSNA0DF6PP#zB4w(%fpqQX85814$e=aga6;L^A?> z0Em;(#vaEGe6(K`GgumuRH9WUT0e zPb&%qEPflkkl5?rWU1U|%xAlz1_i>glA^*TL_!jb?#7|HFin+0c50t^qRks^)GCCP z=$QKdumFTQw)~j98;w7NQ}NU)RupTN>g>MxFSl9{DT<4YA*^TkPo}dX*sPZI*XD~b z2?!cCO>qB=GH=@aNV6CrtU?J+(3<9CXSSW*Y!jK1q_2Po@M{yJ{a|{v>uJuIN_OMdw3^c-hmjPRNuT6F_&doy zp;)HM=w%3E0zy$ILZv@FNeG855x4h4@p&`&hp4m{hVQ~viJ$bDx-;L1*<=lN7pw@mm6#s1v*>4%gG@J|Hh*Rr2eR}A0kg2 z;VzJ7JWRCv=&Ik*A9z@2D3xi>FX^_(*ZX5EI-Ybduj~-zvOwt~f6nk)w;SC{0LBVL zUVk)2`!IG?AZv_0pbrR7dT5tZWVDr$HKW2V>Pn+r+iaMJ4+;eM%{<@5vpS;g&S5em zQ?yJOxnkE}8ESwZWJcuBgY}uB4@L|p2@G~kcuXl;AJuz@V(U>AGyIqj>$OQz?a`LDICe0INdQ&DbS||a>iv&62+*n z)X%a=KfPGWGTp7wEbWpd_bX5arUhY*gJ)dmJhfOyHrDiOjWc@4H+sZWGd)j(7H&*E zX6Yi8&x)PcQ$714|Kc^cCw77!Sv_M--Xh%N{sbrTagx>bYCGyzhpSZhUlrfFig5+| zjTb3f>Zh5m{<5Qzk9x$r*n#2DjtHB4^Y^~9xTc9y+r`(w@9eppx-a=*yoiSIPu$BK zoL?Dq&>uefobK+pG@*>5O$+Hhy5z8W)-?yO1lvy?SurZ~8}gc10geBxAARROM0T zBEJ15t+UX7f&?`ON|OE&T`+6OJ{R!@FdWIJ7O@ffa@xYiZdF~|kD{3y@V|d*z{bF+ ztQ`zvs+wU5wmN1jE}pwg<_Hi7=^yqEa0W{Nm76wLU>lA5{pCfrK6CCkeex_-rzu^w zR5o1A(JZlMBeDTQkhh2@B+ErD;9B$N3O^u9Kp<&7&tJI8UpNcz?${H3DDr@wNkkfD zUWjaP8NgMZIeaSwnB;?DsH+Wb3<&t#4>U#1zn-G-3GmMkt-s8R<@Z(5H# z9huny8F{oN&EA-428&k&8A(I~j(}w4>A~=ciQBk0pBpV^ptfIq+ zZ*P(~z!cF+{EQc+L7M~{E?Bu=JX^s87qO!xZIu1c#Dt9o@6^Auvh8{G@_e~dBGAZ6ecibn}e5kdeRQ{(m%`b5!MDpvBYVnrv&bZM%unWZSlF+wRxIn{C^+ zn>^K2lis)Y*88{Bz3bxKgS|g{p9ZCjM3hpxsNXzSICqmO$!R%ASBg!X;Sqje%7!(6 zc3ai#%iCb{EsPdsK;Luv;yYkrd<#uj34f|kOps4*!&c3uz361lNfJmpu|;}@N(d%E zN;1+`l=_@|=fOp!*=wcM|4=mYfMNe`#h&ePwPvnNn=0R>Fca{@mH0!LGp8)v2w^84D#;jTruz#H9$sRkO>826tX!< z6;v)#_(6 zzewYoxg+-`ULu{ts7=X2MMWmnR*Pp&VzQ^jdv-=h2w)2%Q>~2TBy&vr1hfa^xY(q^ zGbJHE*Sg|4W`r_a6SR>VU2Hp$g``B}T4#=^qis?mAyPJEeU;NMRXF%i5)y3+)dp(r zB2X!{hsnD13++fCl`tgGjK23f3sJbdf`IIAC;VQywV&pIpU;AFR*aXfV# zB`qUY!euChpGZvl%-lnM%voEZ)jdy-LK%t)7NvwH<%CoY4IPAzz8aH*Qi97Rz!AzV zQ)f5?-l=kg!xCCP|8%d;xV#5% zAMbt@|AJK$Gbd-5>d)%_xNxHW;aL2_reTB*H^Y~7s{}_PGfs{$wonPrfru$iw z(zRs687l0=y28rBVrY0KhKjLQ;CQjhvI+2Sfb$TxjOYIp_!ai~v!w}$+^*zY_e5N^BCY`CFmek9$+O;lv$>~Q_~ z0w}+!*UIpXA}GDq?0895U#0UhG}UP&ILxpxX{cfUD_BX^q}HYcxhjkA#_ObUCBLK3 z{Bwckt|7-y+S12S8u(q^=^#Z@^46Vkvi6%`xN2teSTIwl-!Wm{maO;#jc<@0rwZ4QHQLNIFh(x*tO$v1_N!D?6TBbT;rTq zRYjrLnEQK$WJa+2T* z{Fs_baY||hReGIPuxc~aVV+Aje7c`igXTgXJe_B;_Tr^FeJysaMCLZz^wq<+AQs5h zsO02!tewZ*M4@eSp+_DJ_%AvheP3Ahy3VgUKyH^>Hk)-K9?0u|(DVU|!mj%WE2rDB z_`>&l_Q7|UF1>s;V*-yFmUs4d$herj$-Mi)i;_8;qK(Ta{p|DO3#DbBM<3#^{5N2J zZ%Fn5C!SAN3@ru^mgO>>Z5Df?z{PKv-OhJY+|Co~meW=P+c8Db(|RDa{tL|p zX>t~HQj}5*P1d#=nZ)Wi=7HO?@^VxORIO@GumKLUAjtT(5I%7Ybrz z-;`0>qg6GLM1*hU=Rh`gY;rw0=kD7m7aBCJmUvs1asri_S~X>WA^WZ zD3J-nNt}C#GrqSNEas;S41Mb*7%`CoKv#-4ObmE2v$UKohn379E~>dN{SW`l!U)lV zm}FEwHLn@L7y77DH1%qoNOo_^6=M2wr~;MhBFU7!McF@;ktZ8?=f{G?H<#Ju-hH>WWkwAxml5zw{{6C<}lKV4jU$6mn7MKTFr=%Pm!hE zYpk~c{MrGCsnxZA>F3c#pa`qB7^l)8QBvWusi~YYnto<+`&p^VHCFwM0+5Y)3Bwg1 z@qe2-GnA1V{J+?4!btNF^-ZDEpPv`AW=@R$WiA6-bL#X7YE1Yb^0Y*Go8Kkh%Y!Y% z9TKJ}o$}qB>oRGEL(ohW=yfI@>98*wLZAr#D!WsVm^6;zQV#?ctXvkYS!5h55)`jo z<2%5XmihjBf3+#5PEr_m)|U(b73`w41^eZ%DJPC1^A+(e+e{X0on@$eQ<%Gc1UW8H zU95s29SMv96X!JH{QU1-v+-U~=#7BAv`f$zBDCK$Ig?E{BB;=KhMZsqMm_{HZ>LhL zjgHB;@Q?g+Ow?(zNy?zkCSr_&ehX>tltR@3cq%m)|U}jKgPi*zK#V_!s9iu@U|51{Rm=6#tK8 z`GQD%k-6+3gdUi?np`Q`7;*Mo@ElD%Gc36!#$k9$3_R>3LmR;w^zVoCp{LedS36N0KXfb2rWA|3)if6&n7RtV0zr%VUL`@08p!QRRt4eplIWpP{@6np3b)7E83Z7qoaiSIvKKe7z&?{CJbZ z-^=qZ@xKixehR=vN2_;UY{_Lp+2LA8Y1WX>DwE_2644LG#@O!- z4EFe!X%3uA90C96AP9jG#iHhbdssDE0aCg{Z@z^BmBtDP;Gq<3*%b@n^pQ{|{9QM`#9emSU4F!XXvRM>_2Ocwf-d)%ZFn#eM>LeI zC=lB9^0!cj)^K9ETBF-$ZPtBdcAt%e&GopkgRzbHnKh|VH^>HEa@ya1Fn9_5j zXX20w>XOw`Yqrw(u_aQtRX%f6;^1DwS)T#3Fpk83D^|dkvCWVom0(=-dhIuH%;kw! z?iSzLq=*d4B5blWXTV9jvpVN#tWf?O~pfLqTJ z@b1b-X?VtY&a4d^!eTN4Vw`8yrm0J3i+#t^zbMi_-8h^L#9A&iam9?QRHUFwf?>c* zfH0#EaHb?7nYv$Dk%@VNxZ_wr4y4C9PVm6C)@d@*)SxJ`r7*%J*{p(^&#|CELe0jM za-$>un@~~rAR^aqF(?tRQ$!+kxR8pWVx$?iW1FbcJd^sLw5fnXC~?=NK~FZNa_{ZS zo~1yJKiC9Wic_ir7fdZ$z9m_^GSKOHCoUJ4t(t>LfkAqS5!zE%&6->y69?1Gd`hYH z6^wg5fL*0%)T}E{L@4ncFa9iv0*i(k>=X&w0@#b0nc>}0oyb^KR9lK#?WGT4rjDY; z6;m%b78Hayn#xg`Vkru%dckK_l+VxZwfWTUNHwepV+@705PF=tc#YO$0RCDKDc20m z3F(L>eN-XM1MNOV-{L*{rtydpeX4Rz%2ZC?Hk-Z<8Oftq0?)L;&? zb}bhEU`@XeS`Xh5ikr6W+-I#gK;|=got@?YUqWTogm*lh3n|58!Hy?}{a>~9=$fnn zoGjwp5JUesbx2PBRKh6ih6JDFes(O5?@ahldaP2r{jZCSq%e@hm?K4@IwKT=BMS2v zQ)cLFQ&iBw;OxawIMPNEg|ZbPRNw-@ZlcbiFNkyzk7*tHk8?;x?2y zPL8TDEQ8Yzcr5U9HcbGlQjj9rq%KyiMfqR#nG8p^0s*%Nic~xihdANP!2VD)$Y+gp z@z;;rbbk(X>4gZ+%vxjR!6~S)9OM5U_dSWcw)7agj@!)S*NCOpcySP!U0+*S%t{a& z=WOsWSAkc|@_g>bD~jwuU-YGTG)Oc+)hwSZu~><^V9ur>i-H;pfedSGE~(mk6;YW+ zOx8f*{@lJ*r054Q2c)r0_eLE}IAi?C%EC|jtyfkMWMd)WnP$giE{>yLWe;1lPFg5Q zu6ZHtuFbzhlWyjo42(m!4y0-}pO@k6!vK51Hy6OL;cYQ!&S7J<<*z3|@UzYqiy93b z(lXBLTCTHVkz$1&aYP9v1q=%4U=-k>v*S#e8@n&fKCW}VjArvt1W{;b8y^_sa$lsKEAyqUdpQ+(HwX6kJYB2oeE&0PYM zLx%f3d|V&k6ihYPbF#3piOJWi{nucKBdc1aMr-(7Zwk!ixH?Dh(Xn#us$|@(Sq)Pn zY`J~T0%%4ontC9Of|UHMX%WstON-qD+LIy}@Lx??P;I@B3JYifBQ5eE4N;IQj`!aI*FEP{5(8Uz3iQ@C=D6wUJ_Xf~47ATUD56f`B)fEKkOMY%mM{Kk7= zVnsm#>@u@wZY;1cWZl>EvBLyUfFcSRj=a|gLoA*|vFbO?qamBM`QdWeq|sr9q_^6H z0PsH{3iwQ|bF}p@!9%Df)$>BKrW02u`+yhIO64PW+GeTlXj$ zo80Jbp&UfP(|&q4)QYR)-)38Y*$fu3@O{7gbl>$n_P%^#anqaan3`#ZpYY!H%hf=A zsT}BK2>UkAy$eB>hCt8>>T%QgD=?FXV&}vIpKjCx<^iq;o3-e;tG8}Qu+lJJOqFpd z-n1F3oI{|%U5e9g$5q0gibl_8o2^I#V2oXFQsh_7Vao@gs71yunP0{BX) z={m!AYs(x7HVLu=t4Y)9as3`$jNK4y08?{VjAkQ(Vz7NkfyJN|!uwE1@a?hkL!*p(TmDmj6!@ywd&g6%1PhPmnR+xy zLr&)9$U70E=aQ4a8)JW%p_5v^hWJ!~%Lr-4&2Yfv#bD`1H_~^M-a}M#4#=bXwrM56$20lyKj?n$d$(+bA)T*~E2#26A11e+7DXpe!MXK3kpbwH zvDxtH;+!FFNFm8zgIN18Vam8$v}?E6KqGD(>AS=Hnl7v*D@<%%4^pH3EAQ@j_nvcI z3y$p8Bk!GoERM=AEBy9OXmsjTy|yh|RN%Xy5n}A~ye+0~>GlhjtBw!99Ou7l)ELpN zkK5iXJnkwK5sj{p$k3!Jtf5a562dq)?B0KE7MKYU<;jy9?}A8#6OV5`o&MW{5&Z^O zSn|R5pBfW0bkhA5e*gw5?>@)S$-G0SLYOAB0{xoqTnIMqXRPSO%6$2ImpqT?q?u}Q-PcF6t3s}T{7$rQ+lx1(feB?+N z%xvuRAQjvq4ORk9In}{TNgQM-`ChAERIWYnf!7B&djp^2m-&OiUZjiz01G|^gg>Gh z8fakOb(_Xf5cf62q4~BLu_m*>5xTG374UxzRT(?2L{$$k&xkAis!tgZBoJ@L^9|J+ z>gMIz=NpmttK+?wF1-dbG4F!M{p|?I`Q-cAuXB2HS_b{*3rvgufJ1AW^YOU(m%uZY z#tqv|*BOBUU3EFkp}S81bTX2PA9NqG35O@>6u9saLLxaOO4J5NQJ8>ph@B%_p(BYQ z@t=BSTS`jrWmV54Wxu2(mtKxISwy~A!s&72k>rKeQb(OSQ^L4A1~fQn0M&;C_1I%* zN@o-Z3xJI{CLlu3cRE#5CQHG1Q_J}|4xm$Kab%6ptX6Q zdkxDwL4F4|P0LMki*pwpcH= z&-)i&daXv-Y%bgW!%okneQPX(j zsU%}e6w*ni&p3aV24&(@clJB)ro+P|35NfRUvhZ5F}(12GAuryZVD3!GV}pu@RZQR z`mwT%8XNfo!@WXDyig+`I3ngPfH`K?ss(t!-X^F-W3VU`L75nzJiD;h#U}D&BIqw! zR(hGFp0su1_z@mel&E1MDVsE_8C7IG>;ias`J4qiVEiKHB5&RTrEIYyK$G-ecV|K0?FQ^EQr7H}4031flkj<@3y#gWL!%0gR2ks30cNHZKu z8v0LdykBntiyx#!UmzULmG5eGmQ=S;^7<_|`CG4XJ$vYJxTx-fdS&SHB;u#VP@$$& zt%k^$LG~zL97rw|w+kdvog%OqH3G)kocHET`jz2{dQP1@r5EE>`AT&>@~nkL(+1$p zDFDLkmwTsiD~qWq{iU0>Gy~%FXrm-Z>D8SEf_2N{6_}E+F(~$AzHr^^DdZf^7K#CC z+^Ne3Rb{j>MwG;Y<0HSAm0>=kZKO2wPpuHNRq~v9u?W1-|7QUPWSgQimkos+jbv5e zj0u?0DLX?4> z2FvMJl%d3o^HNJ*HO`x-*#`ENA-+i`pCe8Bj>D`0BeSlgJxw*a>>pU)B4=sYvf!+v zIW4tO-n47KENhGtjhV_oj1)CH1?O8It?yDou2138ZyISr$Yz?b_2Sa1CaCRD8r37aDMqJY*}Z8GVZl0aP|*}3XN!i#l$X6l{LFe zhZZZO_xCiX3AG+)B{mJVedDR9a0)Qkj3AH>>iQF?td@m)0Ij&_(UxvnaM1Q1RECku z1kTrxxRIHwOyf<50Rb0bbV_nqtwTE*CgILYh!F(lyCMNB@a%YHf4@ya$6E{3SbFG< zjWdWSq4=Hy&bC66a?CZbG5OeCRG}q>g)pkcMIU-E2v?_LN@Y#MDBIXFXo?*TuGC2c zKUiZK;Id_nS-UX{R`~vXe?;h=rGNtnT*U(v2k)lrUT>k8$L{+J_()$U06{!p8VWpg)3D*PUbRf ziaoLb#~+)b)Mx*2acL3@IsHxVh0TxH5nuW0SYt%)UX6NFf}378A0zU5Azo^wRE>)8 z#Zc~6j|H{`vew?I26~0LOV?SOCV-X)`2L}2Y~w0DF18I+)>n>4LI$>HIPbs=LD zSEtmUFJ+Aj4EQ$%^o4NX;>^@WAyqS9x6NE{5f{v2*IHVuey`s`rmv)HLyW?+v(QWrlx5fXzO;$Cww|;< z_4z&;US@G{197$?v}|h|0U*iyi}iUid>g1-yIWtMVc0s}3W{L!A7cE(m=3nK_ z5u5}^m)HNL^aBXDa^;G03|ZzvnjEBZ5TPs_F0tYpvbStOgS^WFl>PO>XbKcAc!7Ft zp%#ZYk|ax-EM+e^kZnk-)d-}Hav0HdM|z;bV$vj|f_%;8%SAq(%!EX;b=j}tPy|px zdGiwDbZy02ttR+!lQgYMPAn!pL_kp3Aap08#weN81`a83iQ*~a=qnqJg|1_+j-lKgUD6=txssbn;8*ORjJk zbJ@0{1j#}fgLSpCfgsP!KZd-n6Hmaz1N=u;SBFTvoTMsl{~oJ0MEfc|Y-G0zHP&6| zc8TGU5f8HDGdFS-nB{N!mJ{U z3MJHODi-|-Jmo~RukaooEQPrlCwA~gbp>z8ah)=0K4cy(;EO?mY>8?bC9Z*FDOCYA z+ss1>Osq`=dI7Vr1PkFI zK%m45*6i4Z5_JQM7S{|Hl!khCJ&KsQS`g;$@DU&|@M1XNlmcQC$bLr+?vPy;GBe>;gSV=O4_Gtjtmb>UM8%J)#sF8>u|(vAhsad( zxM7VZ+`mUd=}#O_^nSaJWME2Zlq8vXnE1~lXj2Rc9>%_sDoMIJ4e_M1;i1qzRUc|+ zsjmW1e@0zs)7Vfsh%pFlhA{YZ=cPwrDb*{Nbj;G;@yj=(ZVtPR$;z&ur5m7RlA_6? z!1V|Q?xMspESD45tlbJ-X~{V_gCfX`m$64^8s+NxnAxqG8{-lJp!lT}JugBL1NBKD zVl=U5^mJDwcyVyf$*HMVP_1{l6?W;ueLxD#E-8>G-!#q_g(=|1(kz7&9YUqdzTlSX zyn4Rodb<>GC}PzkhKhoNPH+W-GK7FD;q-qCkF&Z!uTX_5+Ye7qua>P0pE(bcu^L%M zMKiU-wru(FH7>Wl&dcq2=b2b^K0oVH$^_lD*pF-pJ%NMm*2^(TG-)MY-A^!G_W^;v z5IM#+6Y1@Y{K&4f6EPbC+{YgbdBvy_oivnQLl=pl_Hw8Ir7c z9mpnxTm?>SW?J78Qm-;?giE}y^W5BG`5xclemy*Wk}uVyHPGH<&0;=HqrvPi$Unmt z_K1ZLUFxa{mc+9|AhC)NmC6B4F*?)2UtGHSkBXEZ_k|H{-p5=txDS`wqnpm!L_8ho zH*N^2&IqU*J;5aMR_H`QSY^yHXZJ{e$@se4HzOmX7ubL#41zR}SZ=~o&8A|7z3>`Q zakvc;NLp*YscCgI?y<_fwpQcE+4Gyxw%5?{Ue-20+afs)6Wx#=qg~#8JjHwLEdA^; zy4w)Q&v#|WYx=6Q!d9n=pnR-RuPf=xk*~H&D-g57yjDqL$?>2oUQajm$7X!;Jj^qK!5lP6CJa0zE)?FVq zM&b~l1%B=*j_*3;1V%8b#6*QQJvK^qw-`7Ds#E}qa#rwVhE^PxT|aI9VqYvYB*3-j zTR1jPa}#6n#m4W$))a>nkc6*1Qp!S$7-Y!1?DA~=^(E$=N}!FU|GsOAYb5KbLsV)~ z!CfIuPA*4DvX&rvJAhV7kRT!Ug<{-agu?ZN2U;%;d4$<8Q%9$Kh0Vq ziz{=%j!BU&Hp(brNgx*C4#2qNQt?Gv)p#%{z;&2y^l9Ss?W6Sk za>}38Syw)3A!!_VUWs%-^}}uI>?TR&mpmP48Bni0Di<}BG!gw?TLn)57yc`)sGZ@T zI4bMx&vnEt8L;#(lRJ)*ZY-8Y*93X$cVgwWN2!qvS$egfa)nyNag1`7I62c8P|wPft3AK2rvv%LOFI(o+!p6 zL(0U(dNsV%1;Wc1K5~elGDbO5QG=b7q752ZhK&&apD6EgL%ODjLkbUg~hIP@TlSN87wV z_FVhcwm&z}`%YO0LJp$#Wo?PunP8ED77QgPXpWNX{(D`TeE935Rl~tWw7=DhI7WS zO`2)MKCEWe7C3VoCqo^?(gX?w5a45d$DRzSLVC|# zI#`RS6V5u@T**{Smc-D6bLLkg*f@iCVWu^~vv(sC-bOtp1J9z?T{Wy^(7&;~^kyOr z=QFLr-^H5-A68UWVz8US!1bxyZn5i?*Gn3>rEh~7=KO>L7o3DlYOS~I63f#~^QvL6 z&7r7334Ee5YtqX-VpbehbqFw?a`V?@C#sXu=E^K40?EU}lRdDwLZ5 zxd1neVm=lNKHpM0$_v!`u&M(-cOm`O!J@qyu#1Avv$t|yVN++1J1EHLmR&4^4yt&Q zzpq|7$HB)(=gS`4|K|Lg4^}L)b@O5uh7=~OTHfVKt4zXMp8?w)D!$%JsXc zF{+G&joawpTn!yhEJ8`%^8WXr#Nd$+I~6l@9R7GnMZsp!7dArKCW0f_Hkh;yST1{m z8P!tqY_d2qF^z(_t^sm_jgpJ%cr#FDQ<$=7rvQ<6=~ikuNgl}>aHFxSpz z8wYN~JifZASLlQWNUk)KK+}<6K3-!_3k*apuw!ahP{<&%GBza$xM@|f#YS{4?~2Xm zQN$%8E^V-|BtZ|K+xYMkk15kmpAs&UaeYsQByUVN6+`6Ad!+R~?ERydCY=XnP5-E( zf&7b;d`7(jxH7s{+SoFUh779P-lR;2GRIt*05tEGUI%{GYcYl2l%ah^KD6am`|aImvU`G+%l*8LzDz1IOx=Rl9C(tn!Vx*RtrVqY8dgCKklzT;`C57~_Sb0t50W^{JM*iMWW&Q9W74Ynp2?(iC0LkaYMg z`D68xuUnGd7_V#1cErT>bFuFAoI>WpwXO_p3z6hmUz~ti59WGybeJuEg%wt#hNctU zd5&FIHnn9eWmDezipo24BgkrsSq&uf4U&bcqtzIxVGoOmoZuneeQHr|9N1{ZPH@Ya z$A7*6I>1&oy-*=P%(gkYhisQcAxh$~OA<#ObgJw^@hktt`@bKRIEc_n<0P&9vl<92 z7&GE3Fn+re>5jVCswH3zCbwu$B{6sssQgTdTLj#&uK@utL!Hw_9RrfZxBNe8q}24E z-Q*cUwGEAPwn2jfluwvK03|p+rMxJk`m#=UApj8$Th>|Kay3A;i~Pz zC7(C7Z`$ZdnX)Ix^j~grAYT^j9rzcD`@GLn3;R7(v~L$tZM#QiUVPRjrlpaEC_s|n zo0wmKAvXz5B~#zfT$~AsERDw^SmVh<7BhTvIq}`Ctyd+|f`W`ku?8)iEe8SOtOfg_ zce*SkAm5kB7~Md-{T?^K1wpDn<0v>MH6k{lkW8`$TStyARjAHZN!ZV7y6teleLT-6O23p;+=HdxlHWrSATl}z-f zig)MS6EXxd&qm+fJfu>uas}`dYj{)*Bb-365(=vE;LMXnpe2T9CV4bt@l&t7lC^>C zA)hrMRSq5_+(%hcCG+Mha{E0vTC)pzW*YpLi$RM(~R&1_DTCf!5Zl%g3!;G7&{RJvgU z?X_t#O8c04D=BUp)a>Dn&nXY(d>GgX0Ucghvl79ir&)F%#Fh0qKUTWmT{|zU?FB5e^KUn5O&R{SE+D(SPDnnjf#G(8@q2wB zXWFsK|IGWQfQ`t`mu!=^!*@r*{bZg7R=P#e$b-s{D?M-WAMvit+0gIiHn32OeNAle zi5|y_DFLz`CE-F1llvSP3E7;@9D@*4Ir>mTY6(A_%;Owgy4!*1v6BiV>fWzDjoA$M zWB>Kxf>YK}veJK4QULD1%Pax@0066X*0pp!R09@7f7jzqJdmy|R)R$tiJZhsb#f-E zcXIxL3e)0&1I5=_IzDfYlu4n8L-oBMQxDu=k08{;9?77b0^ozYJ?JdGOi-`@;?1vt+L;zwgKux{Jv zb8g%4<@@XTT}A8vLj&9Gy7t3vTz&!&u22>DPbaFPQeDJ4*1zqFw@UC*?ZWSt@)Mo_ z_#eIP2C3JrNpqq;$U_+SzUPyJ#Zh#1ltVdG+X?VDoFh3qK8ZM2d>P$Pq+Urd5 z8zE(J{x4)e<<5&9fzbc82-)!6$y*xyiPb8|j^#V4InQgHy4LE1=BN+nUm1eg{_x`l z6MV>=*@e9B3HwL-Y@1g`BY5*}olvGZy;9CDIMrA;heNq~{YVLU=S!@NHFgpYVSYgr z%Z<%~EHJU#{^i-*R>7k?#djv1g>6G%15vgc%$A$w5&mMw8J33Y^eZAwI28RFHe*?L zvQbdFB(eeM((U;d{=mzVylDD~n^!b=2J=LKWbMT_r757zQYg?{yCbsNu#Uj1=1DZJuhi3 zBonN_8o~ef=>P~fU~$I3X4j#ta%gv+g2D1nV1WPu+&A2)OftRQ5_)qc)cqJkL<>NGr3$$ca+srew zu8qzWOWg*)T!|5k{BJ`E!1k=Y=D+k~1AJb!cFX4|0t@&oz5+%lks;20ZqK8)Qe6Lg zFwCLzH19e6WPZ*!e%~+|XA(X~BY41A)CNkPfR3B}(saH4RC{my_oMc6ho#h?5MX~V zwxXqod@+Dg-=8Po{rN{x>sV}kFSvMtcWx|3oro^)$9?ymKUm_15ys!X0~iXCSW?+) zy(b%h;=qn5KOH};7z22O$JtT(EuXz#!!DELn7Z4uS^4vNe|ve_wr*NkQT%@qMAa#5 zAps#v{D-@vX;U&uQ7B*dx{#qEp+o|{mm6oTPmVfLlQBau#F0gz!2RnI6y-u2)!Y6u zNty=)$ri2(gm7S?*o&yr&djjGhQ({nvv~L(zi3Eht2hqJK=%IlsmBAQA~Txk`rhez z?A)O%W@2dfCyDaL*M5{PcZn_Et^tl}l(? zSme;pUp~X3p(F)0&&-Qy=Tm?!2C%4rWBV1rVZTC0lcG*+nOnmC!N&{`v$aAd={0Fz}^IV zUk@3L7YWZu(u97FK69W;qxbQ4SM00dRSwUe?V9#KvH;S%>H4^((djlWwmCE=y`OaR)9(aCO@4S?A&adoL#3xEo_eK z_e77N59a;%BJuHd(|N}5h36zf2P*WSg z$M*_SAFzX`RJ>shoJgkRwp;VNQN{*De3dlF2EUmyw{K~pRa4{!Z>>&kFILAi6Z`$OZ|o9QULep%)m*N!%RLUDNzbHe#H70m8(sqLb^OFmb{-C4e=4E>Z47i zB>?+O0rb3E+XpP;wfJ1C$Hd1^JObPvYd7fRu&Q1a@N^vqpydJSlU-^U)*$@c;CrnP zZzIq*27^qPluowg14Cv$NqEkTICt(E>Q4kTWZ<(&8ztX*jB{{%G=Hi8;cS6nxy%xS zzH2`A2IHM&VBEFiG=%xI*D$mH1Tr=l*)nU01jbkbJ$QCC3=>ye33NSFN za2atCHPOWE><-Qp&YeR~A*VxXs^phH@_c-J5vZ$c+r#toNiL@I$6#($=s6lZiGOat z3MRCj;pt7AwS~GHxpFK?9yjPvsQt%FdPj{w>sJeBl>J3pbaEArhD0^GQEK~&WiTYQ zu7+~gGNv!(?|)ClGiDiFu_%Ffzj0DbBaPVc`e5SwF(ZA1@m++i{);|9Eo;!ED@SMX zcCEad>h5X^J@fgV#BGXjKO0KVs`IeDjAggo9-5m=i1_cVu?}LF-cxiX)*vXEKYn0+ zt>I~Cgm?fa*gW4;vfmF2{Lrgcto-{PaLe?bST9{V<6fa^xx;g=e?M{3Pc5`A%8 zCU@}`J}^XVEHLAnZ!<#iUj<)Lh?64w6}NpZ}hC)MioK&!5<&P)^!a{EgU zG~dv!+UioS+-%5JOsf50Dy5+Mxn9kJ6DQf)(nd40Mjm;)=Mb^c(;Xa?7g!uTG$g^_ z)f|RSN2dadZozFhqdFttNY9P?|AXP*ND^cUmh}GW?3|ovcH+Y(=uOw0~U4j{BMC{It+xj;5@t ztpz%FAhYrDZ?=s+J#oX4iHG}1Y}4tim}dh{p5y$KP5iDT zSHHgr{L1>D@9Jlna(V&~PG$yp!m;zbiFAse#_;Wv=s|tJHzJ*(=>Pb;GD(ks-vfo| zeHX^biS6z*RW5z-@cLmzFSYx_8GHHwc&7PCJ!4l_OeX!#RYpcyuPQ8hgJBH+YW*KL z4D=>v)T{@0+j7b^2#}_yHHjM?B!8le2;e*Dl-{))c}dF^^M_L_e}bBu!^&5dZ_di| zjjUhvla3zf{ON2}^b+~+I%|x@#IFUPNbtZoJcOk zeEN8Mzm6yPe2D&xINcOG|CX=J5QrJs`lUlI5xW;XUMSAr?^>XWKz%)9vT(O9&19S-IqQdpol4@-kj3$1?@*Bco|`{a1?y`));bku$&^txz&v-=sV9 zwZtToQsO~mnd+L3QyY$!wIW;1^O4lRoHY?&55pxx^z~n5?XVh2MC-rn{DbjSIvnK) zuh&%;dL{-#rw>6{R;3(yDu|pD{FJ?NXZZYl8X3*Lw6k4(m|+QyLVuX9Qg zTuH8KnrZWjrq}do5mCyI*2O6N?EGqX{T$UPmHpGa73JYYy%A@G z9tjG+Aiya!k$_JS@gdJx+UVrN(iiO2zk4Ed79%@c?cvqqK|~UsE|W;v@Q6-$gk5XB zPPgr}KDCiNZN!8IQciLkhml7oV@U+o_PpbLcpbsNzYbw*4_2J-_(cP;O+==yC$cj{ zZkf_2-8!xB6H>w=>aL_U=VSvfA=Y5Fs`1oXPbNxX?RL!hGpyp8)yjVQh;%!vtG(&^ zzM;97wmCe`(2BXfN!#whp`qZMT%5N<>H0;|w$R8&PDK3K3M`rOz|Ry_G~`i6LqvPn z2{YGwL?G#-;ukzH-D-S`KALlgxb>i?rCvD0ILF6t^?l*I+H6bqdK%sx9Ebl-AQY$f zqlsmtJFux{38A{8cJ!ZJ=CKUxFxi!PsH<7*kPYv|FT$!fiAy-&0_Gn|C&9xw@?{Gp zn`chn&vi(B?XIrNQF88Ar90=>yUzJDa*1zU_JJaobn{N879ZyME1wO2% z@}E(=9U`jz+kH886vT`!H&gSngz_%&wili6+w1dYdlAye1I&rd?=CtIyNgv`&2tJ< z415#XPSA8PW;o$aI|c5S3`RIn*rerP#uQc|A;{3ACZ6aloaBO|zVhqpUxGRyG2U=A zT3+5u!ttWsegkk|sx02CGiB|~aWqFSU!eh)p2iLvFkD~cvNO2b7TD}`Mfh-hYcKHp zT{djPY44qz%Nr`>b%;u!qnE}ksaNw~$RdL!*(d@ih~5|sDtu7pk_z5lFTda)v*9&k z7`K*nav~XD0X1t_&412&l-LbUn2i%7%S?z7)nBH6xGcLG6Lw%#P(rwF71XpSCyxo- zE%TtwatW&yW$-`d47h3Y^TII7F7HezDX9+}xmh_ipP~BYkEA9Bzk2>#UNJVjf>{0X z;Ln5A9qLK%gd579md>Py@lfz=!$>oIUfV@woJW^R^w;dkM<5m56^YJMgqbY9ui&0s?Db--$|?tHu{}Ev|1;JWwL@v zj=d@trWfnWc$_t|^(711EHwx=LRsN|0{;yF@~(;aSzC=IKMPP4ruDA&!&thkK7Aks zrANqXid}^1hu~a+UX{c8!Jsdq7@Dl(eFNWkL7Vah_LS}xw01P?TwH)Vq9hqP=unha zQd3L9s@e;|IR{rd7*n9^^-xt6t!I-qx)y=w5JTKP*(5+sgobf4ONpt4h(Jx7io^Bc zXpEg>+hP#GgI`!!z~bT}h6@X*sw!dQ37w>KXiaX>)n%z9cZ3LasKuG zfeb7)-7>Bt7%7uiyi$S*%6pA5+lBIc)3+HvhcLD1X6HrCH%?Kc!pmebL9gs#>Slsg zoRMyrZvrinL<`k|1E$lX)gg0P6sYS)+Ipg{!wZiTMp;-9s_O6Sn#==2D@WDyufNU( z%l$GIeRJkR*2satZLqX98o`V(<(So7jA_?cdc88GZ&Wm99fPW>r~)2Qa3nyO`nX38 zhy4!ta%kaB=&;afSYVkjWnfaz=S0a(zh^$5C-c#&ssu-zaw4=;K)|%sBv;yE+z5q| z@>vbfixdJ^RfUz~$97pEbAHTJyty(?;5-~1Z*iV<-h?`A%Ivrx3a6a&M1{#Ow7ihj zPA8ljnO(3)UCh&@15ICLnrT#%Z#vXgHWy%#|L(%)ug&W@>iHZKGFVL9@dRQD=?$VG z80m}-AYGKyH$qpB%!iOdZb}!t_lUxLOZtAE1rz~TYCm#KpeALTt`6Rm>I51l%9`f; zWh`1niHom%=to5i;*dG0%5{u}{SHYCqiNA#wcS0V47DPVUQ15NZ3$N-cv%}9F=!}o zqY#glNMQ5X9FyskKtvJqdM>TUy5xluGqObGvPP07aa-esW9Tma=H9G+zPT( zB^J9~s)BO(%Lj(BHlgl1IC2Ifq?&<6RarSS+51eJMh0ZQzjoy0p7)$|zr=}?4#R|p zR~6|Pad&+ko12@0X5_rhDA9zVrDb9LT`s!X&9^nqw#zQ|auM!W zWA7qmbzODUbL#nt9V`I$__v-HW+Hmg>Pwf$WILtHA;F~GE`2Ph0@(KUHrChIasAtG z@y$2iV0&jLo5b%mDgVtwb-(8~`m%Oj6yNAVELWeo*97ckjU2!0d%6p8FKcJ@0%M0& z*IK%!y=e2#spW6lp6@NWX-0PuFr?S(VP4m`efth>-M)ou*RJ9Aojbp`nf-t8=YQ&6 zJRB}yG#n=D=ok?lq?X`AK#?ow$SodgQT40Dwe}u6lL>CzxPe=@Z{hc@$^Z9%76t>1 z$759e9+sDvar&WCICSVx%i+XyrKi;4s1Fa(2Sm0??iRDUd}&QYYDH~2gr$O!j&61x zu)pK6Xl0{aw`C_{)ZL!F{>!q{U0N_>9}Gz~>)+9J;oa-^bla)?GBvo0=Z_=SvMh1n zzyX|m@Ieem!vyQ50(srkSQrdYFc+6Ky2_%!Xf(p&cu_FkC!9mSs_?+-s)V7sf~hO2 z`Xq2v$k38VLFrzFZs^NluUOC~`<%o~OFnMwQ6}<9`gT;rf~c^;oy)jA@yb~6yT)NU zCVK*w=!E1VUdi6re6^e1<6%cn{{P84E$4rH==OR&EFCz2BS(*lEf(-_jzCx%nyR+k ze-AODuoeMP1QWB#g@I#&k=RfJg`!>Z1_=!bD3YoTr&5J_?+vwPeIm^Rly((miTjhu zz8MQbfTdcHD93m&Zb7WJo0Nhr8Xpk7N2BTnl78{HiUN^rxvHuXj{@C~k1Si|8z6u@ z`5=fy>l|kHr|>c1IT!?Xe>%-|9u2{bseUBxLbR@!orn-{zpfGMRE75;B&<94nwJ(A zvAVj7QzuX2#L9}~=i~7h#||GxK_Gk|0(p%=*fxQ5)ElMB>R2JRRWKt1#n}wTIKV@cpp?Dc>U(laVZDsKp_KFcD4d~?m|`wC-FGH01; z2BOrfpqNthiBSX!0xc4*Hk+8gw@)ar(t4J=cmJark5TP^j7c|DevMHk~M9$`Ou^-Ehx~3&bUaKDe zfJ`mh{(+$d^=4c`h*2~f%d*71dr94?ZWOcXeht{ zZy3v-X4E5WLV&Xd^Ts3ihHkn5ZybVe62x;*G3?g1Zh#O% zwiZ?$0lA%;Mh;ad#MjPbB4{g5RbxlIb{&?B{ZlI}h4gU`eeZkwW-M}0Qr*N;+pSgn z<9WAMEQq5*Y9?WnRNa!b)Cc>29#29Rp2IvgO{5nkFOVXOh7ftv z*-U)h0}*`+o5H~08@RHBrQd70Z4x7T{XPc$3eFW-TdhbrmbFfLyRsOSr7$D!BotO& z$Je=HFGO#etpik(`fG8%R{8>JD!nhX_u~-##F*(N2`oZALxk`qt5{ zIjvQ%wd43^6qKLRQI|RZZ#H^V2u1bvo7M zHB?kpUy1^Z^UZqEWO7G^o}kK#tks+6o`8i@JvgAMd+8@L+8_d4>wkQ8f$~W zOsC9(5quCaD1_N}ynwuKU~E?AHDoZLz2LMH3L_M4$HurjJ|6<02pMhcf0UFVgplBz zOjMy8C3gNYmOr5f6Zic-@#pu$SOl4-#-V-K_Nt6qTCcsH>eF|Mzaqe??7{W#*J2kN3bWtnlsZizEo`&dix>&$?cxbTAqZ!*d#2Gn&U5!+-k7n-Iuwk1EM zQEb5nk$w)!okgqM>TpTEuB!7~Sc^oBWXBY-|1}22sWuL&r&2^FhhbLgF(Uq9oyAP? z!!xwE&bPWr^X6l!;(D^a3O*sP1OnQzkhZGj(<@7SMYE!b?jZ)=db{(tUI{JBG8mbhE*L6^K)%=-OQGhjW zy*nR1%wZa%Sedz{=qS3i$_%7yC=x?*LuOfObRgvB<%<_1=S_}de#PJBGDR}FH+1qO z_-IX#O`}dP?Z>5AVm!g#H_57pHc;0h$15@kd#meqg;jkxjpYkWhghuI~^C8sj0!BA?#d0XoR(v6}q z`6mB%c_!XOR?UgHnNn!TmRns$9ZO5=@X#yA7lr_{^^%sK&d9yr{aAE4zz|7=G4E%0jFjx@R&11(=VP9;<~BB*`n by~lq6=P$(*N6pAY00000NkvXXu0mjfSN>)3 literal 0 HcmV?d00001 diff --git a/plugins/stk/voices/wurley/logo.png b/plugins/stk/voices/wurley/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..20a6081015e8b76b4f4e96a40f8c624e5aaeb64c GIT binary patch literal 890 zcmV-=1BLvFP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4z z76CcTyF*|A00R0+L_t(&-tCuNXpUhR$N&4;%#hD~)Mm=ph7?Eh5h2az5iw502@WWx zq!cx3lBBlQlF|+okrS-pz)qMrkPvp_YcU@+8_TfWuaoPor^oAkpNIFrbpPw=eeUc2 z-~a2rp8LM9>wcww5H&S5In~wGIqI*dtE=n3llSoO@bK{P@bK{HKltU|4U|aQENPLX z5=p})B_w^6)GDb(Qlq5X&bb6|L(;N8@cmiR2OX`#~DrpbRZIGk}NgE{f zN!lIk90Jq>eLy0@Gsecfi^vZ@H$#(KZ}w}cq6NkQcZ|~stdOK!>&%yQUDA9>PbAe! zYL@g;Qjesek|s);Eorf&DbBeMlH{Blm%`b2NpB^6a?Xv6xFYlHw+xuRuikEHr zU{c`x?Mo+e1X!EF(P-d-iS13p+i0B2F$>tk-}JAxtk?@I$+Tzh0o#D7K%Q-xQeY48 z#yF3Ff;1C4YP`cS3)rbNoT@;IElfq|ig^9Ko9V6;sG#d&7O<@u&egSK1_biLgz5H` z&)XO7uqEpTo&y(w3LrPagxbx~ + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "engine.h" +#include "note_play_handle.h" + +#include "wurley_instrument.h" +#include "wurley_instrument_view.h" +#include "wurley_processor.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embedded_resources.h" + + +extern "C" +{ + +plugin::descriptor wurley_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "Wurley", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Wurlitzer noises" ), + "Danny McRae ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + +wurleyInstrument::wurleyInstrument( instrumentTrack * _channel_track ): + stkInstrument( _channel_track, &wurley_plugin_descriptor ) +{ + model()->index()->setTrack( _channel_track ); + model()->crossfade()->setTrack( _channel_track ); + model()->lfoSpeed()->setTrack( _channel_track ); + model()->lfoDepth()->setTrack( _channel_track ); + model()->adsrTarget()->setTrack( _channel_track ); +} + + + + +wurleyInstrument::~wurleyInstrument() +{ +} + + + + +QString wurleyInstrument::nodeName( void ) const +{ + return( wurley_plugin_descriptor.name ); +} + + + + +pluginView * wurleyInstrument::instantiateView( QWidget * _parent ) +{ + return( new wurleyInstrumentView( this, _parent ) ); +} + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( model * _model, void * _data ) +{ + return( new wurleyInstrument( static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/stk/voices/wurley/wurley_instrument.h b/plugins/stk/voices/wurley/wurley_instrument.h new file mode 100644 index 000000000..fd654ba79 --- /dev/null +++ b/plugins/stk/voices/wurley/wurley_instrument.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _WURLEY_INSTRUMENT_H +#define _WURLEY_INSTRUMENT_H + +#include "stk_instrument.h" + +#include "wurley_processor.h" +#include "wurley_model.h" + + +class wurleyInstrument : public stkInstrument +{ +public: + wurleyInstrument( instrumentTrack * _channel_track ); + virtual ~wurleyInstrument( void ); + + QString nodeName( void ) const; + + pluginView * instantiateView( QWidget * _parent ); +}; + +#endif diff --git a/plugins/stk/voices/wurley/wurley_instrument_view.cpp b/plugins/stk/voices/wurley/wurley_instrument_view.cpp new file mode 100644 index 000000000..12cd275db --- /dev/null +++ b/plugins/stk/voices/wurley/wurley_instrument_view.cpp @@ -0,0 +1,110 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include +#include +#include + +#include "wurley_instrument_view.h" + +#include +#include + +#include "engine.h" +#include "gui_templates.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +wurleyInstrumentView::wurleyInstrumentView( wurleyInstrument * _instrument, QWidget * _parent ) : + stkInstrumentView( _instrument, _parent ) +{ + QVBoxLayout * vl = new QVBoxLayout( m_topView ); + QHBoxLayout * h1 = new QHBoxLayout(); + QHBoxLayout * h2 = new QHBoxLayout(); + QHBoxLayout * h3 = new QHBoxLayout(); + + + m_index = new knob( knobSmall_17, m_topView, tr( "Index" ) ); + m_index->setLabel( tr( "Modulator Index" ) ); + m_index->setHintText( tr( "Index:" ) + " ", "" ); + + m_crossfade = new knob( knobSmall_17, m_topView, tr( "Crossfade" ) ); + m_crossfade->setLabel( tr( "Modulator Crossfade" ) ); + m_crossfade->setHintText( tr( "Crossfade:" ) + " ", "" ); + + m_lfoSpeed = new knob( knobSmall_17, m_topView, tr( "LFO Speed" ) ); + m_lfoSpeed->setLabel( tr( "LFO Speed" ) ); + m_lfoSpeed->setHintText( tr( "LFO Speed:" ) + " ", "" ); + + m_lfoDepth = new knob( knobSmall_17, m_topView, tr( "LFO Depth" ) ); + m_lfoDepth->setLabel( tr( "LFO Depth" ) ); + m_lfoDepth->setHintText( tr( "LFO Depth:" ) + " ", "" ); + + m_adsrTarget = new knob( knobSmall_17, m_topView, tr( "ADSR Target" ) ); + m_adsrTarget->setLabel( tr( "ADSR Target" ) ); + m_adsrTarget->setHintText( tr( "ADSR Target:" ) + " ", "" ); + + h1->addWidget( m_index ); + h1->addWidget( m_crossfade ); + + h2->addWidget( m_lfoSpeed ); + h2->addWidget( m_lfoDepth ); + + h3->addWidget( m_adsrTarget ); + + vl->addLayout( h1 ); + vl->addLayout( h2 ); + vl->addLayout( h3 ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); +} + + + + +wurleyInstrumentView::~wurleyInstrumentView() +{ +} + + + + +void wurleyInstrumentView::modelChanged( void ) +{ + stkInstrumentView::modelChanged(); + + wurleyInstrument * inst = castModel(); + m_index->setModel( inst->model()->index() ); + m_crossfade->setModel( inst->model()->crossfade() ); + m_lfoSpeed->setModel( inst->model()->lfoSpeed() ); + m_lfoDepth->setModel( inst->model()->lfoDepth() ); + m_adsrTarget->setModel( inst->model()->adsrTarget() ); +} + + + diff --git a/plugins/stk/voices/wurley/wurley_instrument_view.h b/plugins/stk/voices/wurley/wurley_instrument_view.h new file mode 100644 index 000000000..a021833f4 --- /dev/null +++ b/plugins/stk/voices/wurley/wurley_instrument_view.h @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _WURLEY_INSTRUMENT_VIEW_H +#define _WURLEY_INSTRUMENT_VIEW_H + +#include "knob.h" + +#include "stk_instrument_view.h" +#include "wurley_instrument.h" + + +class wurleyInstrumentView: public stkInstrumentView +{ +public: + wurleyInstrumentView( wurleyInstrument * _instrument, QWidget * _parent ); + virtual ~wurleyInstrumentView( void ); + +private: + virtual void modelChanged( void ); + + knob * m_index; + knob * m_crossfade; + knob * m_lfoSpeed; + knob * m_lfoDepth; + knob * m_adsrTarget; +}; + +#endif diff --git a/plugins/stk/voices/wurley/wurley_model.cpp b/plugins/stk/voices/wurley/wurley_model.cpp new file mode 100644 index 000000000..8d12e23ed --- /dev/null +++ b/plugins/stk/voices/wurley/wurley_model.cpp @@ -0,0 +1,88 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "wurley_model.h" + + +wurleyModel::wurleyModel( bool _monophonic, + StkFloat _portamento, + StkFloat _bend, + StkFloat _bend_range, + bool _velocity_sensitive_lpf, + StkFloat _velocity_sensitive_q, + StkFloat _volume, + StkFloat _pan, + StkFloat _spread, + StkFloat _index, + StkFloat _crossfade, + StkFloat _lfo_speed, + StkFloat _lfo_depth, + StkFloat _adsr_target ): + stkModel( _monophonic, _portamento, _bend, _bend_range, _velocity_sensitive_lpf, _velocity_sensitive_q, _volume, _pan, _spread ), + m_index( new floatModel( _index, 0.0f, 128.0f, 0.1f, this ) ), + m_crossfade( new floatModel( _crossfade, 0.0f, 128.0f, 0.1f, this ) ), + m_lfoSpeed( new floatModel( _lfo_speed, 0.0f, 128.0f, 0.1f, this ) ), + m_lfoDepth( new floatModel( _lfo_depth, 0.0f, 128.0f, 0.1f, this ) ), + m_adsrTarget( new floatModel( _adsr_target, 0.0f, 128.0f, 0.1f, this ) ) +{ +} + + + + +wurleyModel::~wurleyModel() +{ + delete m_index; + delete m_crossfade; + delete m_lfoSpeed; + delete m_lfoDepth; + delete m_adsrTarget; +} + + + + +void FASTCALL wurleyModel::saveSettings( QDomDocument & _doc, QDomElement & _parent ) +{ + stkModel::saveSettings( _doc, _parent ); + m_index->saveSettings( _doc, _parent, "index" ); + m_crossfade->saveSettings( _doc, _parent, "crossfade" ); + m_lfoSpeed->saveSettings( _doc, _parent, "lfospeed" ); + m_lfoDepth->saveSettings( _doc, _parent, "lfodepth" ); + m_adsrTarget->saveSettings( _doc, _parent, "adsrtarget" ); +} + + + + +void FASTCALL wurleyModel::loadSettings( const QDomElement & _this ) +{ + stkModel::loadSettings( _this ); + m_index->loadSettings( _this, "index" ); + m_crossfade->loadSettings( _this, "crossfade" ); + m_lfoSpeed->loadSettings( _this, "lfospeed" ); + m_lfoDepth->loadSettings( _this, "lfodepth" ); + m_adsrTarget->loadSettings( _this, "adsrtarget" ); +} + diff --git a/plugins/stk/voices/wurley/wurley_model.h b/plugins/stk/voices/wurley/wurley_model.h new file mode 100644 index 000000000..949b1f0cf --- /dev/null +++ b/plugins/stk/voices/wurley/wurley_model.h @@ -0,0 +1,86 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _WURLEY_MODEL_H +#define _WURLEY_MODEL_H + +#include "stk_model.h" + + +class wurleyModel: public stkModel +{ +public: + wurleyModel( bool _monophonic = FALSE, + StkFloat _portamento = 0.0f, + StkFloat _bend = 0.0f, + StkFloat _bend_range = 2.0f, + bool _velocity_sensitive_lpf = TRUE, + StkFloat _velocity_sensitive_q = 0.5f, + StkFloat _volume = 1.0f, + StkFloat _pan = 0.0f, + StkFloat _spread = 0.0f, + StkFloat _index = 64.0f, + StkFloat _crossfade = 64.0f, + StkFloat _lfo_speed = 64.0f, + StkFloat _lfo_depth = 64.0f, + StkFloat _adsr_target = 64.0f ); + ~wurleyModel(); + + inline floatModel * index( void ) const + { + return( m_index ); + } + + inline floatModel * crossfade( void ) const + { + return( m_crossfade ); + } + + inline floatModel * lfoSpeed( void ) + { + return( m_lfoSpeed ); + } + + inline floatModel * lfoDepth( void ) const + { + return( m_lfoDepth ); + } + + inline floatModel * adsrTarget( void ) const + { + return( m_adsrTarget ); + } + + void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _parent ); + + void FASTCALL loadSettings( const QDomElement & _this ); + +private: + floatModel * m_index; + floatModel * m_crossfade; + floatModel * m_lfoSpeed; + floatModel * m_lfoDepth; + floatModel * m_adsrTarget; +}; + +#endif diff --git a/plugins/stk/voices/wurley/wurley_processor.cpp b/plugins/stk/voices/wurley/wurley_processor.cpp new file mode 100644 index 000000000..7d989e880 --- /dev/null +++ b/plugins/stk/voices/wurley/wurley_processor.cpp @@ -0,0 +1,51 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include "wurley_processor.h" +#include "config_mgr.h" + + +wurleyProcessor::wurleyProcessor( sample_rate_t _sample_rate ): + stkProcessor( _sample_rate ) +{ +} + + + + +wurleyProcessor::~wurleyProcessor() +{ +} + + + + +void wurleyProcessor::setControls( wurleyModel * _model ) +{ + voice()->controlChange( 2, _model->index()->value() ); + voice()->controlChange( 4, _model->crossfade()->value() ); + voice()->controlChange( 11, _model->lfoSpeed()->value() ); + voice()->controlChange( 1, _model->lfoDepth()->value() ); + voice()->controlChange( 128, _model->adsrTarget()->value() ); + m_delayRead = m_delayWrite - static_cast( _model->spread()->value() ); +} diff --git a/plugins/stk/voices/wurley/wurley_processor.h b/plugins/stk/voices/wurley/wurley_processor.h new file mode 100644 index 000000000..e84a8ac46 --- /dev/null +++ b/plugins/stk/voices/wurley/wurley_processor.h @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _WURLEY_PROCESSOR_H +#define _WURLEY_PROCESSOR_H + +#include "Wurley.h" + +#include "stk_processor.h" + +#include "wurley_model.h" + +class wurleyProcessor: public stkProcessor +{ +public: + wurleyProcessor( sample_rate_t _sample_rate ); + ~wurleyProcessor( void ); + + void setControls( wurleyModel * _model ); +}; + +#endif From 5d5ad19021fab8cf82542baebf2daf71ae23d4d2 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 16 Feb 2008 02:04:58 +0000 Subject: [PATCH 51/87] finally splitted rest of LMMS, i.e. tracks, track-containers, track-content-objects, whole instrument-track/instrument-track-window and so on - still a bit unstable but I'm sure we'll manage to get this one very stable\! git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@691 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 91 + Makefile.am | 24 +- configure.in | 6 +- include/arp_and_chords_tab_widget.h | 138 -- include/automation_track.h | 34 +- include/bb_editor.h | 73 +- include/bb_track.h | 116 +- include/dummy_instrument.h | 10 +- include/engine.h | 31 +- include/envelope_and_lfo_parameters.h | 109 +- include/envelope_and_lfo_view.h | 98 + include/file_browser.h | 15 +- include/instrument_function_views.h | 91 + include/instrument_functions.h | 141 ++ include/instrument_midi_io.h | 55 +- include/instrument_midi_io_view.h | 76 + include/instrument_sound_shaping.h | 78 +- include/instrument_sound_shaping_view.h | 63 + include/instrument_track.h | 300 ++-- include/journalling_object.h | 49 +- include/main_window.h | 4 +- include/mmp.h | 44 +- include/mv_base.h | 1 - include/name_label.h | 3 +- include/pattern.h | 146 +- include/piano_widget.h | 56 +- include/sample_track.h | 44 +- include/song.h | 270 +++ include/song_editor.h | 223 +-- include/timeline.h | 46 +- include/track.h | 469 ++--- include/track_container.h | 165 +- .../audio_file_processor.cpp | 8 +- plugins/ladspa_effect/ladspa_controls.cpp | 3 +- plugins/stk/Makefile.am | 3 +- src/core/arp_and_chords_tab_widget.cpp | 667 ------- src/core/automation_editor.cpp | 70 +- src/core/automation_pattern.cpp | 3 +- src/core/bb_editor.cpp | 532 +++--- src/core/engine.cpp | 14 +- src/core/envelope_and_lfo_parameters.cpp | 693 +------- src/core/export_project_dialog.cpp | 23 +- src/core/file_browser.cpp | 104 +- src/core/import_filter.cpp | 1 + src/core/instrument.cpp | 7 +- src/core/instrument_functions.cpp | 540 ++++++ src/core/instrument_midi_io.cpp | 305 +--- src/core/instrument_sound_shaping.cpp | 279 +-- src/core/main.cpp | 6 +- src/core/main_window.cpp | 31 +- src/core/mixer.cpp | 16 +- src/core/mv_base.cpp | 2 +- src/core/name_label.cpp | 10 +- src/core/note_play_handle.cpp | 14 +- src/core/piano_roll.cpp | 87 +- src/core/piano_widget.cpp | 670 +++---- src/core/preset_preview_play_handle.cpp | 5 +- src/core/song.cpp | 1019 +++++++++++ src/core/song_editor.cpp | 1008 +---------- src/core/timeline.cpp | 40 +- src/core/track.cpp | 1570 +++++++++-------- src/core/track_container.cpp | 455 +++-- src/lib/journalling_object.cpp | 19 +- src/lib/mmp.cpp | 66 +- src/lib/project_journal.cpp | 8 +- src/midi/midi_alsa_seq.cpp | 8 +- src/tracks/automation_track.cpp | 23 +- src/tracks/bb_track.cpp | 402 +++-- src/tracks/instrument_track.cpp | 952 +++++----- src/tracks/pattern.cpp | 1111 ++++++------ src/tracks/sample_track.cpp | 10 +- src/widgets/automatable_button.cpp | 5 +- src/widgets/effect_rack_view.cpp | 2 +- src/widgets/envelope_and_lfo_view.cpp | 600 +++++++ src/widgets/instrument_function_views.cpp | 254 +++ src/widgets/instrument_midi_io_view.cpp | 207 +++ src/widgets/instrument_sound_shaping_view.cpp | 150 ++ src/widgets/project_notes.cpp | 20 +- src/widgets/tempo_sync_knob.cpp | 18 +- 79 files changed, 8453 insertions(+), 6656 deletions(-) delete mode 100644 include/arp_and_chords_tab_widget.h create mode 100644 include/envelope_and_lfo_view.h create mode 100644 include/instrument_function_views.h create mode 100644 include/instrument_functions.h create mode 100644 include/instrument_midi_io_view.h create mode 100644 include/instrument_sound_shaping_view.h create mode 100644 include/song.h delete mode 100644 src/core/arp_and_chords_tab_widget.cpp create mode 100644 src/core/instrument_functions.cpp create mode 100644 src/core/song.cpp create mode 100644 src/widgets/envelope_and_lfo_view.cpp create mode 100644 src/widgets/instrument_function_views.cpp create mode 100644 src/widgets/instrument_midi_io_view.cpp create mode 100644 src/widgets/instrument_sound_shaping_view.cpp diff --git a/ChangeLog b/ChangeLog index dad6c29e6..2f7c0fd0a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,93 @@ +2008-02-16 Tobias Doerffel + + * plugins/ladspa_effect/ladspa_controls.cpp: + * plugins/audio_file_processor/audio_file_processor.cpp: + * plugins/stk/Makefile.am: + * include/mmp.h: + * include/instrument_midi_io_view.h: + * include/track.h: + * include/engine.h: + * include/name_label.h: + * include/instrument_track.h: + * include/instrument_functions.h: + * include/piano_widget.h: + * include/song.h: + * include/pattern.h: + * include/file_browser.h: + * include/envelope_and_lfo_parameters.h: + * include/envelope_and_lfo_view.h: + * include/instrument_sound_shaping.h: + * include/instrument_function_views.h: + * include/instrument_midi_io.h: + * include/bb_track.h: + * include/song_editor.h: + * include/dummy_instrument.h: + * include/journalling_object.h: + * include/sample_track.h: + * include/timeline.h: + * include/main_window.h: + * include/mv_base.h: + * include/bb_editor.h: + * include/arp_and_chords_tab_widget.h: + * include/automation_track.h: + * include/track_container.h: + * include/instrument_sound_shaping_view.h: + * configure.in: + * src/midi/midi_alsa_seq.cpp: + * src/lib/project_journal.cpp: + * src/lib/mmp.cpp: + * src/lib/journalling_object.cpp: + * src/widgets/instrument_sound_shaping_view.cpp: + * src/widgets/envelope_and_lfo_view.cpp: + * src/widgets/instrument_function_views.cpp: + * src/widgets/instrument_midi_io_view.cpp: + * src/widgets/project_notes.cpp: + * src/widgets/effect_rack_view.cpp: + * src/widgets/automatable_button.cpp: + * src/widgets/tempo_sync_knob.cpp: + * src/tracks/automation_track.cpp: + * src/tracks/sample_track.cpp: + * src/tracks/bb_track.cpp: + * src/tracks/instrument_track.cpp: + * src/tracks/pattern.cpp: + * src/core/arp_and_chords_tab_widget.cpp: + * src/core/preset_preview_play_handle.cpp: + * src/core/note_play_handle.cpp: + * src/core/track_container.cpp: + * src/core/song.cpp: + * src/core/import_filter.cpp: + * src/core/file_browser.cpp: + * src/core/envelope_and_lfo_parameters.cpp: + * src/core/mixer.cpp: + * src/core/main.cpp: + * src/core/export_project_dialog.cpp: + * src/core/instrument_sound_shaping.cpp: + * src/core/piano_roll.cpp: + * src/core/instrument_functions.cpp: + * src/core/instrument_midi_io.cpp: + * src/core/track.cpp: + * src/core/engine.cpp: + * src/core/timeline.cpp: + * src/core/instrument.cpp: + * src/core/piano_widget.cpp: + * src/core/main_window.cpp: + * src/core/song_editor.cpp: + * src/core/mv_base.cpp: + * src/core/automation_pattern.cpp: + * src/core/name_label.cpp: + * src/core/automation_editor.cpp: + * src/core/bb_editor.cpp: + * Makefile.am: + finally splitted rest of LMMS, i.e. tracks, track-containers, + track-content-objects, whole instrument-track/instrument-track-window + and so on - still a bit unstable but I'm sure we'll manage to get this + one very stable! + + diffstat says: + 79 files changed, 8019 insertions(+), 6226 deletions(-) + 2008-02-01 Danny McRae + * Makefile.am: * src/tracks/instrument_track.cpp: * src/core/note_play_handle.cpp: @@ -209,6 +298,7 @@ Makefile.am in plugins/stk to get them to build. 2007-01-30 Paul Giblock + * plugins/organic/organic.cpp: * plugins/organic/organic.h: Began split on Organic. But doesn't show in instrument list @@ -217,6 +307,7 @@ Fixed comments 2008-01-28 Paul Giblock + * plugins/lb302/lb302.cpp: * plugins/lb302/lb302.h: finished LB302 M/V-split. however, more changes can be made to meet diff --git a/Makefile.am b/Makefile.am index b94147635..772d18160 100644 --- a/Makefile.am +++ b/Makefile.am @@ -47,7 +47,6 @@ man1_MANS = lmms.1 lmms_MOC = \ ./about_dialog.moc \ - ./arp_and_chords_tab_widget.moc \ ./automatable_button.moc \ ./automatable_slider.moc \ ./automation_editor.moc \ @@ -64,11 +63,13 @@ lmms_MOC = \ ./effect_label.moc \ ./effect_select_dialog.moc \ ./envelope_and_lfo_parameters.moc \ - ./instrument_sound_shaping.moc \ + ./envelope_and_lfo_view.moc \ ./export_project_dialog.moc \ ./fade_button.moc \ ./file_browser.moc \ ./group_box.moc \ + ./instrument_midi_io.moc \ + ./instrument_midi_io_view.moc \ ./kmultitabbar.moc \ ./knob.moc \ ./ladspa_control.moc \ @@ -97,6 +98,7 @@ lmms_MOC = \ ./setup_dialog.moc \ ./side_bar.moc \ ./side_bar_widget.moc \ + ./song.moc \ ./song_editor.moc \ ./surround_area.moc \ ./tab_bar.moc \ @@ -150,7 +152,6 @@ lmms_SOURCES = \ $(srcdir)/src/audio/audio_sample_recorder.cpp \ $(srcdir)/src/audio/audio_sdl.cpp \ $(srcdir)/src/core/about_dialog.cpp \ - $(srcdir)/src/core/arp_and_chords_tab_widget.cpp \ $(srcdir)/src/core/automation_editor.cpp \ $(srcdir)/src/core/automation_pattern.cpp \ $(srcdir)/src/core/bb_editor.cpp \ @@ -166,6 +167,7 @@ lmms_SOURCES = \ $(srcdir)/src/core/file_browser.cpp \ $(srcdir)/src/core/import_filter.cpp \ $(srcdir)/src/core/instrument.cpp \ + $(srcdir)/src/core/instrument_functions.cpp \ $(srcdir)/src/core/ladspa_2_lmms.cpp \ $(srcdir)/src/core/ladspa_manager.cpp \ $(srcdir)/src/core/ladspa_control.cpp \ @@ -185,7 +187,7 @@ lmms_SOURCES = \ $(srcdir)/src/core/preset_preview_play_handle.cpp \ $(srcdir)/src/core/sample_play_handle.cpp \ $(srcdir)/src/core/setup_dialog.cpp \ - $(srcdir)/src/core/song_editor.cpp \ + $(srcdir)/src/core/song.cpp \ $(srcdir)/src/core/tool.cpp \ $(srcdir)/src/core/track.cpp \ $(srcdir)/src/core/track_container.cpp \ @@ -212,7 +214,6 @@ lmms_SOURCES = \ $(srcdir)/src/tracks/bb_track.cpp \ $(srcdir)/src/tracks/instrument_track.cpp \ $(srcdir)/src/tracks/pattern.cpp \ - $(srcdir)/src/tracks/sample_track.cpp \ $(srcdir)/src/widgets/automatable_button.cpp \ $(srcdir)/src/widgets/automatable_slider.cpp \ $(srcdir)/src/widgets/caption_menu.cpp \ @@ -223,6 +224,10 @@ lmms_SOURCES = \ $(srcdir)/src/widgets/effect_view.cpp \ $(srcdir)/src/widgets/fade_button.cpp \ $(srcdir)/src/widgets/group_box.cpp \ + $(srcdir)/src/widgets/envelope_and_lfo_view.cpp \ + $(srcdir)/src/widgets/instrument_function_views.cpp \ + $(srcdir)/src/widgets/instrument_midi_io_view.cpp \ + $(srcdir)/src/widgets/instrument_sound_shaping_view.cpp \ $(srcdir)/src/widgets/kmultitabbar.cpp \ $(srcdir)/src/widgets/knob.cpp \ $(srcdir)/src/widgets/ladspa_control_view.cpp \ @@ -234,6 +239,7 @@ lmms_SOURCES = \ $(srcdir)/src/widgets/rubberband.cpp \ $(srcdir)/src/widgets/rename_dialog.cpp \ $(srcdir)/src/widgets/side_bar_widget.cpp \ + $(srcdir)/src/core/song_editor.cpp \ $(srcdir)/src/widgets/tab_bar.cpp \ $(srcdir)/src/widgets/tab_widget.cpp \ $(srcdir)/src/widgets/text_float.cpp \ @@ -270,6 +276,7 @@ lmms_SOURCES = \ $(srcdir)/include/note.h \ $(srcdir)/include/volume.h \ $(srcdir)/include/panning.h \ + $(srcdir)/include/song.h \ $(srcdir)/include/song_editor.h \ $(srcdir)/include/plugin.h \ $(srcdir)/include/plugin_view.h \ @@ -284,11 +291,14 @@ lmms_SOURCES = \ $(srcdir)/include/note_play_handle.h \ $(srcdir)/include/piano_roll.h \ $(srcdir)/include/basic_filters.h \ + $(srcdir)/include/envelope_and_lfo_parameters.h \ $(srcdir)/include/instrument_sound_shaping.h \ $(srcdir)/include/envelope_and_lfo_parameters.h \ $(srcdir)/include/about_dialog.h \ $(srcdir)/include/oscillator.h \ - $(srcdir)/include/arp_and_chords_tab_widget.h \ + $(srcdir)/include/instrument_functions.h \ + $(srcdir)/include/instrument_function_views.h \ + $(srcdir)/include/instrument_sound_shaping_view.h \ $(srcdir)/include/export.h \ $(srcdir)/include/mv_base.h \ $(srcdir)/include/automatable_model.h \ @@ -351,6 +361,7 @@ lmms_SOURCES = \ $(srcdir)/include/instrument_play_handle.h \ $(srcdir)/include/string_pair_drag.h \ $(srcdir)/include/instrument_midi_io.h \ + $(srcdir)/include/instrument_midi_io_view.h \ $(srcdir)/include/audio_port.h \ $(srcdir)/include/tool.h \ $(srcdir)/include/tool_button.h \ @@ -390,6 +401,7 @@ lmms_SOURCES = \ $(THIRD_PARTY_CODE) +# $(srcdir)/src/tracks/sample_track.cpp EXTRA_DIST = $(lmms_EMBEDDED_RESOURCES) lmms.1 diff --git a/configure.in b/configure.in index 0c8b1edc7..3ad0b608e 100644 --- a/configure.in +++ b/configure.in @@ -2,8 +2,8 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.50) -AC_INIT(lmms, 0.4.0-svn20080114-mv, lmms-devel/at/lists/dot/sf/dot/net) -AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080114-mv) +AC_INIT(lmms, 0.4.0-svn20080215-mv, lmms-devel/at/lists/dot/sf/dot/net) +AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080215-mv) AM_CONFIG_HEADER(config.h) @@ -574,7 +574,7 @@ lmmsdatadir="$datadir/$PACKAGE" AC_SUBST(lmmsdatadir) -EXTRA_WARNINGS="-Wextra -Wno-unused-parameter -Wunsafe-loop-optimizations -Wdisabled-optimization" +EXTRA_WARNINGS="-Wno-unused-parameter -Wunsafe-loop-optimizations -Wdisabled-optimization" if test "x$CXX" == "xg++" ; then CXXFLAGS="-ansi -Wall $EXTRA_WARNINGS $CXXFLAGS -fno-exceptions" fi diff --git a/include/arp_and_chords_tab_widget.h b/include/arp_and_chords_tab_widget.h deleted file mode 100644 index 21797cedb..000000000 --- a/include/arp_and_chords_tab_widget.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * arp_and_chords_tab_widget.h - declaration of class arpAndChordWidget which - * provides code for using arpeggio and chords - * - * Copyright (c) 2004-2007 Tobias Doerffel - * - * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net - * - * 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 _ARP_AND_CHORDS_TAB_WIDGET_H -#define _ARP_AND_CHORDS_TAB_WIDGET_H - -#include - -#include "journalling_object.h" -#include "types.h" -#include "automatable_model.h" - - -class QLabel; -class QPixmap; - -class automatableButtonGroup; -class flpImport; -class instrumentTrack; -class comboBox; -class groupBox; -class knob; -class notePlayHandle; -class tempoSyncKnob; -class comboBoxModel; - - -const int MAX_CHORD_POLYPHONY = 10; - - -class arpAndChordsTabWidget : public QWidget, public journallingObject -{ - Q_OBJECT -public: - enum arpDirections - { - UP, - DOWN, - UP_AND_DOWN, - RANDOM - } ; - - arpAndChordsTabWidget( instrumentTrack * _channel_track ); - virtual ~arpAndChordsTabWidget(); - - static struct chord - { - const QString name; - Sint8 interval[MAX_CHORD_POLYPHONY]; - } s_chords[]; - - void FASTCALL processNote( notePlayHandle * _n ); - static inline int getChordSize( chord & _c ) - { - int idx = 0; - while( _c.interval[idx] != -1 ) - { - ++idx; - } - return( idx ); - } - - - virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _parent ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); - inline virtual QString nodeName( void ) const - { - return( "arpandchords" ); - } - - -private: - enum arpModes - { - FREE, - SORT, - SYNC - } ; - - // chord-stuff - groupBox * m_chordsGroupBox; - boolModel * m_chordsEnabledModel; - comboBox * m_chordsComboBox; - comboBoxModel * m_chordsModel; - knob * m_chordRangeKnob; - floatModel * m_chordRangeModel; - - // arpeggio-stuff - groupBox * m_arpGroupBox; - boolModel * m_arpEnabledModel; - comboBox * m_arpComboBox; - comboBoxModel * m_arpModel; - knob * m_arpRangeKnob; - floatModel * m_arpRangeModel; - tempoSyncKnob * m_arpTimeKnob; - floatModel * m_arpTimeModel; - knob * m_arpGateKnob; - floatModel * m_arpGateModel; - - QLabel * m_arpDirectionLbl; - - automatableButtonGroup * m_arpDirectionBtnGrp; - intModel * m_arpDirectionModel; - - comboBox * m_arpModeComboBox; - comboBoxModel * m_arpModeModel; - - - friend class flpImport; - -} ; - - -#endif diff --git a/include/automation_track.h b/include/automation_track.h index d5c421da7..2f97a2391 100644 --- a/include/automation_track.h +++ b/include/automation_track.h @@ -2,7 +2,7 @@ * automation_track.h - declaration of class automationTrack, which handles * automation of objects without a track * - * Copyright (c) 2006 Javier Serrano Polo + * Copyright (c) 2006-2008 Javier Serrano Polo * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -30,34 +30,30 @@ #include "track.h" -class automationTrack : public QWidget, public track +class automationTrack : public track { - Q_OBJECT public: automationTrack( trackContainer * _tc ); virtual ~automationTrack(); - -private: - inline QString nodeName( void ) const - { - return( "automation-track" ); - } - - virtual trackTypes type( void ) const; - - virtual bool FASTCALL play( const midiTime & _start, - const fpp_t _frames, + virtual bool play( const midiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, Sint16 _tco_num = -1 ); - virtual trackContentObject * FASTCALL createTCO( const midiTime & - _pos ); + virtual QString nodeName( void ) const + { + return( "automationtrack" ); + } - virtual void FASTCALL saveTrackSpecificSettings( QDomDocument & _doc, + virtual trackView * createView( trackContainerView * ) + { + return( NULL ); + } + virtual trackContentObject * createTCO( const midiTime & _pos ); + + virtual void saveTrackSpecificSettings( QDomDocument & _doc, QDomElement & _parent ); - virtual void FASTCALL loadTrackSpecificSettings( const QDomElement & - _this ); + virtual void loadTrackSpecificSettings( const QDomElement & _this ); } ; diff --git a/include/bb_editor.h b/include/bb_editor.h index e9df4580f..340d05a48 100644 --- a/include/bb_editor.h +++ b/include/bb_editor.h @@ -1,7 +1,7 @@ /* * bb_editor.h - declaration of class bbEditor, a basic-component of LMMS * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -35,39 +35,36 @@ class QPixmap; class toolButton; -class bbEditor : public trackContainer +class bbTrackContainer : public trackContainer { Q_OBJECT - mapPropertyFromModelPtr(int,currentBB,setCurrentBB,m_bbComboBoxModel); + mapPropertyFromModel(int,currentBB,setCurrentBB,m_bbComboBoxModel); public: - virtual bool FASTCALL play( midiTime _start, const fpp_t _frames, + bbTrackContainer( void ); + virtual ~bbTrackContainer(); + + virtual bool play( midiTime _start, const fpp_t _frames, const f_cnt_t _frame_base, Sint16 _tco_num = -1 ); - virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _parent ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); +// virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); +// virtual void loadSettings( const QDomElement & _this ); virtual void updateAfterTrackAdd( void ); inline virtual QString nodeName( void ) const { - return( "bbeditor" ); + return( "bbtrackcontainer" ); } - virtual inline bool fixedTCOs( void ) const - { - return( TRUE ); - } - - tact FASTCALL lengthOfBB( const int _bb ); + tact lengthOfBB( int _bb ); inline tact lengthOfCurrentBB( void ) { return( lengthOfBB( currentBB() ) ); } - void FASTCALL removeBB( const int _bb ); int numOfBBs( void ) const; + void removeBB( int _bb ); - void FASTCALL swapBB( const int _bb1, const int _bb2 ); + void swapBB( int _bb1, int _bb2 ); void updateBBTrack( trackContentObject * _tco ); @@ -79,27 +76,49 @@ public slots: void currentBBChanged( void ); -protected: - virtual void keyPressEvent( QKeyEvent * _ke ); +private: + void createTCOsForBB( int _bb ); + + comboBoxModel m_bbComboBoxModel; + + + friend class bbEditor; + +} ; + + + +class bbEditor : public trackContainerView +{ + Q_OBJECT +public: + bbEditor( bbTrackContainer * _tc ); + virtual ~bbEditor(); + + virtual inline bool fixedTCOs( void ) const + { + return( TRUE ); + } + + void removeBBView( int _bb ); + + +public slots: + void play( void ); + void stop( void ); + void updatePosition( void ); private: - bbEditor( void ); - //bbEditor( const bbEditor & ); - virtual ~bbEditor(); - - void FASTCALL createTCOsForBB( const int _bb ); - + virtual void keyPressEvent( QKeyEvent * _ke ); + bbTrackContainer * m_bbtc; QWidget * m_toolBar; toolButton * m_playButton; toolButton * m_stopButton; comboBox * m_bbComboBox; - comboBoxModel * m_bbComboBoxModel; - - friend class engine; } ; diff --git a/include/bb_track.h b/include/bb_track.h index cc65cd96d..028604672 100644 --- a/include/bb_track.h +++ b/include/bb_track.h @@ -2,7 +2,7 @@ * bb_track.h - class bbTrack, a wrapper for using bbEditor * (which is a singleton-class) as track * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -38,27 +38,51 @@ class trackContainer; class bbTCO : public trackContentObject { - Q_OBJECT public: - bbTCO( track * _track, const QColor & _c = QColor() ); + bbTCO( track * _track, unsigned int _color = 0 ); virtual ~bbTCO(); - virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _parent ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); inline virtual QString nodeName( void ) const { return( "bbtco" ); } - const QColor & color( void ) const + inline unsigned int color( void ) const { return( m_color ); } + virtual trackContentObjectView * createView( trackView * _tv ); + + +private: + QString m_name; + unsigned int m_color; + + + friend class bbTCOView; + +} ; + + + +class bbTCOView : public trackContentObjectView +{ + Q_OBJECT +public: + bbTCOView( trackContentObject * _tco, trackView * _tv ); + virtual ~bbTCOView(); + + QColor color( void ) const + { + return( m_bbTCO->m_color ); + } + void setColor( QColor _new_color ); + protected slots: - void openInBBEditor( bool _c ); void openInBBEditor( void ); void resetName( void ); void changeName( void ); @@ -72,62 +96,48 @@ protected: private: - QString m_name; - QColor m_color; - - void setColor( QColor _new_color ); + bbTCO * m_bbTCO; } ; -class bbTrack : public QObject, public track + +class bbTrack : public track { - Q_OBJECT public: bbTrack( trackContainer * _tc ); virtual ~bbTrack(); - virtual trackTypes type( void ) const; - virtual bool FASTCALL play( const midiTime & _start, + virtual bool play( const midiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, Sint16 _tco_num = -1 ); - virtual trackContentObject * FASTCALL createTCO( const midiTime & - _pos ); + virtual trackView * createView( trackContainerView * _tcv ); + virtual trackContentObject * createTCO( const midiTime & _pos ); - virtual void FASTCALL saveTrackSpecificSettings( QDomDocument & _doc, + virtual void saveTrackSpecificSettings( QDomDocument & _doc, QDomElement & _parent ); - virtual void FASTCALL loadTrackSpecificSettings( const QDomElement & - _this ); + virtual void loadTrackSpecificSettings( const QDomElement & _this ); - static bbTrack * FASTCALL findBBTrack( int _bb_num ); - static int FASTCALL numOfBBTrack( track * _track ); - static void FASTCALL swapBBTracks( track * _track1, track * _track2 ); - - inline nameLabel * trackLabel( void ) - { - return( m_trackLabel ); - } + static bbTrack * findBBTrack( int _bb_num ); + static int numOfBBTrack( track * _track ); + static void swapBBTracks( track * _track1, track * _track2 ); bool automationDisabled( track * _track ) { - return( m_disabled_tracks.contains( _track ) ); + return( m_disabledTracks.contains( _track ) ); } void disableAutomation( track * _track ) { - m_disabled_tracks.append( _track ); + m_disabledTracks.append( _track ); } void enableAutomation( track * _track ) { - m_disabled_tracks.removeAll( _track ); + m_disabledTracks.removeAll( _track ); } -public slots: - void clickedTrackLabel( void ); - - protected: inline virtual QString nodeName( void ) const { @@ -136,13 +146,43 @@ protected: private: - nameLabel * m_trackLabel; - QList m_disabled_tracks; + QList m_disabledTracks; typedef QMap infoMap; static infoMap s_infoMap; + + friend class bbTrackView; + } ; + +class bbTrackView : public trackView +{ + Q_OBJECT +public: + bbTrackView( bbTrack * _bbt, trackContainerView * _tcv ); + virtual ~bbTrackView(); + + inline nameLabel * trackLabel( void ) + { + return( m_trackLabel ); + } + + virtual bool close( void ); + + +public slots: + void clickedTrackLabel( void ); + + +private: + bbTrack * m_bbTrack; + nameLabel * m_trackLabel; + +} ; + + + #endif diff --git a/include/dummy_instrument.h b/include/dummy_instrument.h index b2bb5f8db..78435c227 100644 --- a/include/dummy_instrument.h +++ b/include/dummy_instrument.h @@ -33,25 +33,25 @@ class dummyInstrument : public instrument { public: - inline dummyInstrument( instrumentTrack * _instrument_track ) : + dummyInstrument( instrumentTrack * _instrument_track ) : instrument( _instrument_track, NULL ) { } - inline virtual ~dummyInstrument() + virtual ~dummyInstrument() { } - inline virtual void saveSettings( QDomDocument &, QDomElement & ) + virtual void saveSettings( QDomDocument &, QDomElement & ) { } - inline virtual void loadSettings( const QDomElement & ) + virtual void loadSettings( const QDomElement & ) { } - inline virtual QString nodeName( void ) const + virtual QString nodeName( void ) const { return( "dummyinstrument" ); } diff --git a/include/engine.h b/include/engine.h index 3750f4179..3e87bf49d 100644 --- a/include/engine.h +++ b/include/engine.h @@ -34,11 +34,13 @@ class automationEditor; class bbEditor; +class bbTrackContainer; class projectJournal; class mainWindow; class mixer; class pianoRoll; class projectNotes; +class song; class songEditor; class ladspa2LMMS; @@ -54,11 +56,28 @@ public: return( s_hasGUI ); } + // core static mixer * getMixer( void ) { return( s_mixer ); } + static song * getSong( void ) + { + return( s_song ); + } + + static bbTrackContainer * getBBTrackContainer( void ) + { + return( s_bbTrackContainer ); + } + + static projectJournal * getProjectJournal( void ) + { + return( s_projectJournal ); + } + + // GUI static mainWindow * getMainWindow( void ) { return( s_mainWindow ); @@ -84,11 +103,6 @@ public: return( s_projectNotes ); } - static projectJournal * getProjectJournal( void ) - { - return( s_projectJournal ); - } - static automationEditor * getAutomationEditor( void ) { return( s_automationEditor ); @@ -115,14 +129,19 @@ private: static bool s_hasGUI; static float s_framesPerTact64th; + // core static mixer * s_mixer; + static song * s_song; + static bbTrackContainer * s_bbTrackContainer; + static projectJournal * s_projectJournal; + + // GUI static mainWindow * s_mainWindow; static songEditor * s_songEditor; static automationEditor * s_automationEditor; static bbEditor * s_bbEditor; static pianoRoll * s_pianoRoll; static projectNotes * s_projectNotes; - static projectJournal * s_projectJournal; static ladspa2LMMS * s_ladspaManager; static QMap s_sampleExtensions; diff --git a/include/envelope_and_lfo_parameters.h b/include/envelope_and_lfo_parameters.h index a2e501141..c0efcd1c5 100644 --- a/include/envelope_and_lfo_parameters.h +++ b/include/envelope_and_lfo_parameters.h @@ -1,9 +1,7 @@ /* - * envelope_and_lfo_widget.h - declaration of class envelopeAndLFOWidget which - * is used by envelope/lfo/filter-tab of - * channel-window + * envelope_and_lfo_parameters.h - class envelopeAndLFOParameters * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -25,12 +23,10 @@ */ -#ifndef _ENVELOPE_AND_LFO_WIDGET_H -#define _ENVELOPE_AND_LFO_WIDGET_H +#ifndef _ENVELOPE_AND_LFO_PARAMETERS_H +#define _ENVELOPE_AND_LFO_PARAMETERS_H #include -#include - #include "journalling_object.h" #include "automatable_model.h" @@ -38,28 +34,18 @@ #include "types.h" -class QPaintEvent; -class QPixmap; - -class automatableButtonGroup; -class envelopeTabWidget; -class knob; -class ledCheckBox; -class pixmapButton; -class tempoSyncKnob; class track; -class flpImport; - -class envelopeAndLFOWidget : public QWidget, public journallingObject +class envelopeAndLFOParameters : public model, public journallingObject { Q_OBJECT public: - envelopeAndLFOWidget( float _value_for_zero_amount, QWidget * _parent, - track * _track ); - virtual ~envelopeAndLFOWidget(); + envelopeAndLFOParameters( float _value_for_zero_amount, + track * _track, + model * _parent ); + virtual ~envelopeAndLFOParameters(); static inline float expKnobVal( float _val ) { @@ -69,7 +55,7 @@ public: static void triggerLFO( void ); static void resetLFO( void ); - void FASTCALL fillLevel( float * _buf, f_cnt_t _frame, + void fillLevel( float * _buf, f_cnt_t _frame, const f_cnt_t _release_begin, const fpp_t _frames ); @@ -79,52 +65,38 @@ public: } - virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _parent ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); - inline virtual QString nodeName( void ) const + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); + virtual QString nodeName( void ) const { return( "el" ); } + inline f_cnt_t PAHD_Frames( void ) const + { + return( m_pahdFrames ); + } + + inline f_cnt_t releaseFrames( void ) const + { + return( m_rFrames ); + } + public slots: void updateSampleVars( void ); protected: - virtual void dragEnterEvent( QDragEnterEvent * _dee ); - virtual void dropEvent( QDropEvent * _de ); - virtual void mousePressEvent( QMouseEvent * _me ); - virtual void paintEvent( QPaintEvent * _pe ); - - void FASTCALL fillLFOLevel( float * _buf, f_cnt_t _frame, - const fpp_t _frames ); - - -protected slots: - void lfoUserWaveChanged( void ); + void fillLFOLevel( float * _buf, f_cnt_t _frame, const fpp_t _frames ); private: - static QPixmap * s_envGraph; - static QPixmap * s_lfoGraph; + static QVector s_EaLParametersInstances; - static QVector s_EaLWidgets; - - bool m_used; + bool m_used; - // envelope-stuff - knob * m_predelayKnob; - knob * m_attackKnob; - knob * m_holdKnob; - knob * m_decayKnob; - knob * m_sustainKnob; - knob * m_releaseKnob; - knob * m_amountKnob; - - // models floatModel m_predelayModel; floatModel m_attackModel; floatModel m_holdModel; @@ -143,18 +115,6 @@ private: sample_t * m_rEnv; - // LFO-stuff - knob * m_lfoPredelayKnob; - knob * m_lfoAttackKnob; - tempoSyncKnob * m_lfoSpeedKnob; - knob * m_lfoAmountKnob; - pixmapButton * m_userLfoBtn; - automatableButtonGroup * m_lfoWaveBtnGrp; - - ledCheckBox * m_x100Cb; - ledCheckBox * m_controlEnvAmountCb; - - // models floatModel m_lfoPredelayModel; floatModel m_lfoAttackModel; floatModel m_lfoSpeedModel; @@ -175,13 +135,14 @@ private: bool m_bad_lfoShapeData; sampleBuffer m_userWave; - enum lfoShapes + enum LfoShapes { - SIN, - TRIANGLE, - SAW, - SQUARE, - USER + SineWave, + TriangleWave, + SawWave, + SquareWave, + UserDefinedWave, + NumLfoShapes } ; sample_t lfoShapeSample( fpp_t _frame_offset ); @@ -189,8 +150,8 @@ private: - friend class envelopeTabWidget; - friend class flpImport; + friend class envelopeAndLFOView; +// friend class flpImport; } ; diff --git a/include/envelope_and_lfo_view.h b/include/envelope_and_lfo_view.h new file mode 100644 index 000000000..199edee83 --- /dev/null +++ b/include/envelope_and_lfo_view.h @@ -0,0 +1,98 @@ +/* + * envelope_and_lfo_view.h - declaration of class envelopeAndLFOWidget which + * is used by envelope/lfo/filter-tab of + * channel-window + * + * Copyright (c) 2004-2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _ENVELOPE_AND_LFO_VIEW_H +#define _ENVELOPE_AND_LFO_VIEW_H + +#include + +#include "mv_base.h" + +class QPaintEvent; +class QPixmap; + +class envelopeAndLFOParameters; + +class automatableButtonGroup; +class knob; +class ledCheckBox; +class pixmapButton; +class tempoSyncKnob; + + + +class envelopeAndLFOView : public QWidget, public modelView +{ + Q_OBJECT +public: + envelopeAndLFOView( QWidget * _parent ); + virtual ~envelopeAndLFOView(); + + +protected: + virtual void modelChanged( void ); + + virtual void dragEnterEvent( QDragEnterEvent * _dee ); + virtual void dropEvent( QDropEvent * _de ); + virtual void mousePressEvent( QMouseEvent * _me ); + virtual void paintEvent( QPaintEvent * _pe ); + + +protected slots: + void lfoUserWaveChanged( void ); + + +private: + static QPixmap * s_envGraph; + static QPixmap * s_lfoGraph; + + envelopeAndLFOParameters * m_params; + + + // envelope-stuff + knob * m_predelayKnob; + knob * m_attackKnob; + knob * m_holdKnob; + knob * m_decayKnob; + knob * m_sustainKnob; + knob * m_releaseKnob; + knob * m_amountKnob; + + // LFO-stuff + knob * m_lfoPredelayKnob; + knob * m_lfoAttackKnob; + tempoSyncKnob * m_lfoSpeedKnob; + knob * m_lfoAmountKnob; + pixmapButton * m_userLfoBtn; + automatableButtonGroup * m_lfoWaveBtnGrp; + + ledCheckBox * m_x100Cb; + ledCheckBox * m_controlEnvAmountCb; + +} ; + +#endif diff --git a/include/file_browser.h b/include/file_browser.h index 4ed9abeed..d2a6479c8 100644 --- a/include/file_browser.h +++ b/include/file_browser.h @@ -173,13 +173,18 @@ public: text( 0 ) ); } - enum fileTypes + enum FileTypes { - PROJECT_FILE, PRESET_FILE, SAMPLE_FILE, MIDI_FILE, FLP_FILE, - UNKNOWN + ProjectFile, + PresetFile, + SampleFile, + MidiFile, + FlpFile, + UnknownFile, + NumFileTypes } ; - inline fileTypes type( void ) + inline FileTypes type( void ) { return( m_type ); } @@ -200,7 +205,7 @@ private: static QPixmap * s_unknownFilePixmap; QString m_path; - fileTypes m_type; + FileTypes m_type; } ; diff --git a/include/instrument_function_views.h b/include/instrument_function_views.h new file mode 100644 index 000000000..0b3f200ff --- /dev/null +++ b/include/instrument_function_views.h @@ -0,0 +1,91 @@ +/* + * instrument_function_views.h - views for instrument-functions-tab + * + * Copyright (c) 2004-2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _INSTRUMENT_FUNCTION_VIEWS_H +#define _INSTRUMENT_FUNCTION_VIEWS_H + +#include "mv_base.h" + + +class automatableButtonGroup; +class comboBox; +class groupBox; +class knob; +class tempoSyncKnob; + +class arpeggiator; +class chordCreator; + + + +class chordCreatorView : public QWidget, public modelView +{ +public: + chordCreatorView( chordCreator * _cc, QWidget * _parent ); + virtual ~chordCreatorView(); + + +private: + virtual void modelChanged( void ); + + chordCreator * m_cc; + + groupBox * m_chordsGroupBox; + comboBox * m_chordsComboBox; + knob * m_chordRangeKnob; + +} ; + + + + + +class arpeggiatorView : public QWidget, public modelView +{ +public: + arpeggiatorView( arpeggiator * _arp, QWidget * _parent ); + virtual ~arpeggiatorView(); + + +private: + virtual void modelChanged( void ); + + arpeggiator * m_a; + groupBox * m_arpGroupBox; + comboBox * m_arpComboBox; + knob * m_arpRangeKnob; + tempoSyncKnob * m_arpTimeKnob; + knob * m_arpGateKnob; + + QLabel * m_arpDirectionLbl; + + automatableButtonGroup * m_arpDirectionBtnGrp; + + comboBox * m_arpModeComboBox; + +} ; + + +#endif diff --git a/include/instrument_functions.h b/include/instrument_functions.h new file mode 100644 index 000000000..fdb779437 --- /dev/null +++ b/include/instrument_functions.h @@ -0,0 +1,141 @@ +/* + * instrument_functions.h - models for instrument-functions-tab + * + * Copyright (c) 2004-2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _INSTRUMENT_FUNCTIONS_H +#define _INSTRUMENT_FUNCTIONS_H + +#include "journalling_object.h" +#include "types.h" +#include "automatable_model.h" +#include "combobox.h" + + +class instrumentTrack; +class notePlayHandle; + + +const int MAX_CHORD_POLYPHONY = 10; + + +class chordCreator : public model, public journallingObject +{ +public: + chordCreator( instrumentTrack * _instrument_track ); + virtual ~chordCreator(); + + void processNote( notePlayHandle * _n ); + + + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); + + inline virtual QString nodeName( void ) const + { + return( "chordcreator" ); + } + + + static struct chord + { + const QString name; + Sint8 interval[MAX_CHORD_POLYPHONY]; + } s_chordTable[]; + + + static inline int getChordSize( chord & _c ) + { + int idx = 0; + while( _c.interval[idx] != -1 ) + { + ++idx; + } + return( idx ); + } + + +private: + boolModel m_chordsEnabledModel; + comboBoxModel m_chordsModel; + floatModel m_chordRangeModel; + + + friend class chordCreatorView; + +} ; + + + + +class arpeggiator : public model, public journallingObject +{ +public: + enum ArpDirections + { + ArpDirUp, + ArpDirDown, + ArpDirUpAndDown, + ArpDirRandom + } ; + + arpeggiator( instrumentTrack * _instrument_track ); + virtual ~arpeggiator(); + + void processNote( notePlayHandle * _n ); + + + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); + + inline virtual QString nodeName( void ) const + { + return( "arpeggiator" ); + } + + +private: + enum ArpModes + { + FreeMode, + SortMode, + SyncMode + } ; + + boolModel m_arpEnabledModel; + comboBoxModel m_arpModel; + floatModel m_arpRangeModel; + floatModel m_arpTimeModel; + floatModel m_arpGateModel; + intModel m_arpDirectionModel; + comboBoxModel m_arpModeModel; + + +// friend class flpImport; + friend class instrumentTrack; + friend class arpeggiatorView; + +} ; + + +#endif diff --git a/include/instrument_midi_io.h b/include/instrument_midi_io.h index 3a042f097..131183ed8 100644 --- a/include/instrument_midi_io.h +++ b/include/instrument_midi_io.h @@ -1,8 +1,7 @@ /* - * midi_tab_widget.h - tab-widget in channel-track-window for setting up - * MIDI-related stuff + * instrument_midi_io.h - class instrumentMidiIO * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -24,37 +23,33 @@ */ -#ifndef _MIDI_TAB_WIDGET_H -#define _MIDI_TAB_WIDGET_H +#ifndef _INSTRUMENT_MIDI_IO_H +#define _INSTRUMENT_MIDI_IO_H -#include +#include #include "automatable_model.h" -class QMenu; -class QPixmap; -class QAction; - class instrumentTrack; -class tabWidget; -class ledCheckBox; -class lcdSpinBox; class midiPort; -class midiTabWidget : public QWidget, public journallingObject +class instrumentMidiIO : public model, public journallingObject { Q_OBJECT public: - midiTabWidget( instrumentTrack * _channel_track, midiPort * _port ); - virtual ~midiTabWidget(); + typedef QPair descriptiveMidiPort; + typedef QList midiPortMap; + + instrumentMidiIO( instrumentTrack * _instrument_track, + midiPort * _port ); + virtual ~instrumentMidiIO(); - virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _parent ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); - inline virtual QString nodeName( void ) const + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); + virtual QString nodeName( void ) const { return( "midi" ); } @@ -71,20 +66,15 @@ protected slots: void defaultVelOutChanged( void ); void readablePortsChanged( void ); void writeablePortsChanged( void ); - void activatedReadablePort( QAction * _item ); - void activatedWriteablePort( QAction * _item ); + + void activatedReadablePort( const descriptiveMidiPort & _port ); + void activatedWriteablePort( const descriptiveMidiPort & _port ); + private: instrumentTrack * m_instrumentTrack; midiPort * m_midiPort; - tabWidget * m_setupTabWidget; - lcdSpinBox * m_inputChannelSpinBox; - lcdSpinBox * m_outputChannelSpinBox; - ledCheckBox * m_receiveCheckBox; - ledCheckBox * m_sendCheckBox; - ledCheckBox * m_defaultVelocityInCheckBox; - ledCheckBox * m_defaultVelocityOutCheckBox; intModel m_inputChannelModel; intModel m_outputChannelModel; boolModel m_receiveEnabledModel; @@ -92,10 +82,11 @@ private: boolModel m_defaultVelocityInEnabledModel; boolModel m_defaultVelocityOutEnabledModel; - QMenu * m_readablePorts; - QMenu * m_writeablePorts; + midiPortMap m_readablePorts; + midiPortMap m_writeablePorts; - friend class instrumentTrack; + + friend class instrumentMidiIOView; } ; diff --git a/include/instrument_midi_io_view.h b/include/instrument_midi_io_view.h new file mode 100644 index 000000000..9662ebd06 --- /dev/null +++ b/include/instrument_midi_io_view.h @@ -0,0 +1,76 @@ +/* + * instrument_midi_io_view.h - tab-widget in instrument-track-window for setting + * up MIDI-related stuff + * + * Copyright (c) 2005-2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _INSTRUMENT_MIDI_IO_VIEW_H +#define _INSTRUMENT_MIDI_IO_VIEW_H + +#include + +#include "mv_base.h" + + +class QMenu; +class QAction; + +class tabWidget; +class ledCheckBox; +class lcdSpinBox; + + +class instrumentMidiIOView : public QWidget, public modelView +{ + Q_OBJECT +public: + instrumentMidiIOView( QWidget * _parent ); + virtual ~instrumentMidiIOView(); + + +protected slots: + void activatedReadablePort( QAction * _item ); + void activatedWriteablePort( QAction * _item ); + + +private: + virtual void modelChanged( void ); + + tabWidget * m_setupTabWidget; + lcdSpinBox * m_inputChannelSpinBox; + lcdSpinBox * m_outputChannelSpinBox; + ledCheckBox * m_receiveCheckBox; + ledCheckBox * m_sendCheckBox; + ledCheckBox * m_defaultVelocityInCheckBox; + ledCheckBox * m_defaultVelocityOutCheckBox; + + QMenu * m_readablePorts; + QMenu * m_writeablePorts; + + + friend class instrumentTrackWindow; + +} ; + + +#endif diff --git a/include/instrument_sound_shaping.h b/include/instrument_sound_shaping.h index 65f92cd7e..5a8b4e622 100644 --- a/include/instrument_sound_shaping.h +++ b/include/instrument_sound_shaping.h @@ -1,9 +1,7 @@ /* - * envelope_tab_widget.h - declaration of class envelopeTabWidget which - * provides UI- and DSP-code for using envelopes, LFOs - * and a filter + * instrument_sound_shaping.h - class instrumentSoundShaping * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -25,58 +23,44 @@ */ -#ifndef _ENVELOPE_TAB_WIDGET_H -#define _ENVELOPE_TAB_WIDGET_H - -#include +#ifndef _INSTRUMENT_SOUND_SHAPING_H +#define _INSTRUMENT_SOUND_SHAPING_H #include "mixer.h" #include "automatable_model.h" +#include "combobox.h" -class QLabel; - -class comboBoxModel; class instrumentTrack; -class comboBox; -class envelopeAndLFOWidget; -class groupBox; -class knob; +class envelopeAndLFOParameters; class notePlayHandle; -class pixmapButton; -class tabWidget; -class envelopeTabWidget : public QWidget, public journallingObject +class instrumentSoundShaping : public model, public journallingObject { - Q_OBJECT public: - envelopeTabWidget( instrumentTrack * _channel_track ); - virtual ~envelopeTabWidget(); + instrumentSoundShaping( instrumentTrack * _instrument_track ); + virtual ~instrumentSoundShaping(); - void FASTCALL processAudioBuffer( sampleFrame * _ab, - const fpp_t _frames, + void processAudioBuffer( sampleFrame * _ab, const fpp_t _frames, notePlayHandle * _n ); - enum targets + enum Targets { - VOLUME, -/* PANNING, - PITCH,*/ - CUT, - RES, - TARGET_COUNT + Volume, + Cut, + Resonance, + NumTargets } ; - f_cnt_t envFrames( const bool _only_vol = FALSE ); - f_cnt_t releaseFrames( const bool _only_vol = FALSE ); + f_cnt_t envFrames( const bool _only_vol = FALSE ) const; + f_cnt_t releaseFrames( const bool _only_vol = FALSE ) const; - float FASTCALL volumeLevel( notePlayHandle * _n, const f_cnt_t _frame ); + float volumeLevel( notePlayHandle * _n, const f_cnt_t _frame ); - virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _parent ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); inline virtual QString nodeName( void ) const { return( "eldata" ); @@ -84,23 +68,21 @@ public: private: - tabWidget * m_targetsTabWidget; - envelopeAndLFOWidget * m_envLFOWidgets[TARGET_COUNT]; + envelopeAndLFOParameters * m_envLFOParameters[NumTargets]; instrumentTrack * m_instrumentTrack; - // filter-stuff - groupBox * m_filterGroupBox; - comboBox * m_filterComboBox; - knob * m_filterCutKnob; - knob * m_filterResKnob; + boolModel m_filterEnabledModel; + comboBoxModel m_filterModel; + floatModel m_filterCutModel; + floatModel m_filterResModel; - boolModel * m_filterEnabledModel; - comboBoxModel * m_filterModel; - floatModel * m_filterCutModel; - floatModel * m_filterResModel; - friend class flpImport; + friend class instrumentSoundShapingView; } ; + +extern const QString __targetNames[instrumentSoundShaping::NumTargets][2]; + + #endif diff --git a/include/instrument_sound_shaping_view.h b/include/instrument_sound_shaping_view.h new file mode 100644 index 000000000..1a35af912 --- /dev/null +++ b/include/instrument_sound_shaping_view.h @@ -0,0 +1,63 @@ +/* + * instrument_sound_shaping_view.h - view for instrumentSoundShaping-class + * + * Copyright (c) 2004-2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _INSTRUMENT_SOUND_SHAPING_VIEW_H +#define _INSTRUMENT_SOUND_SHAPING_VIEW_H + +#include + +#include "instrument_sound_shaping.h" + +class envelopeAndLFOView; +class comboBox; +class groupBox; +class knob; +class tabWidget; + + +class instrumentSoundShapingView : public QWidget, public modelView +{ +public: + instrumentSoundShapingView( QWidget * _parent ); + virtual ~instrumentSoundShapingView(); + + +private: + virtual void modelChanged( void ); + + + instrumentSoundShaping * m_ss; + tabWidget * m_targetsTabWidget; + envelopeAndLFOView * m_envLFOViews[instrumentSoundShaping::NumTargets]; + + // filter-stuff + groupBox * m_filterGroupBox; + comboBox * m_filterComboBox; + knob * m_filterCutKnob; + knob * m_filterResKnob; + +} ; + +#endif diff --git a/include/instrument_track.h b/include/instrument_track.h index 3bf047f23..0d1242fd0 100644 --- a/include/instrument_track.h +++ b/include/instrument_track.h @@ -28,13 +28,16 @@ #define _INSTRUMENT_TRACK_H #include -#include #include "audio_port.h" #include "automatable_model.h" +#include "instrument_functions.h" +#include "instrument_midi_io.h" +#include "instrument_sound_shaping.h" #include "lcd_spinbox.h" #include "midi_event_processor.h" #include "mixer.h" +#include "piano_widget.h" #include "effect_chain.h" #include "surround_area.h" #include "tab_widget.h" @@ -42,23 +45,23 @@ class QLineEdit; -class arpAndChordsTabWidget; +class arpeggiatorView; +class chordCreatorView; class effectRackView; -class envelopeTabWidget; +class instrumentSoundShapingView; class fadeButton; class instrument; +class instrumentMidiIOView; class instrumentTrackButton; -class lcdSpinBox; +class instrumentTrackWindow; class midiPort; -class midiTabWidget; class notePlayHandle; -class pianoWidget; +class pluginView; class presetPreviewPlayHandle; -class surroundArea; class volumeKnob; -class instrumentTrack : public QWidget, public track, public midiEventProcessor +class instrumentTrack : public track, public midiEventProcessor { Q_OBJECT mapPropertyFromModel(int,getVolume,setVolume,m_volumeModel); @@ -66,29 +69,22 @@ public: instrumentTrack( trackContainer * _tc ); virtual ~instrumentTrack(); - inline virtual trackTypes type( void ) const - { - return( m_trackType ); - } - - // used by instrument - void FASTCALL processAudioBuffer( sampleFrame * _buf, - const fpp_t _frames, + void processAudioBuffer( sampleFrame * _buf, const fpp_t _frames, notePlayHandle * _n ); - virtual void FASTCALL processInEvent( const midiEvent & _me, + virtual void processInEvent( const midiEvent & _me, const midiTime & _time ); - virtual void FASTCALL processOutEvent( const midiEvent & _me, + virtual void processOutEvent( const midiEvent & _me, const midiTime & _time ); - f_cnt_t FASTCALL beatLen( notePlayHandle * _n ) const; + f_cnt_t beatLen( notePlayHandle * _n ) const; // for capturing note-play-events -> need that for arpeggio, // filter and so on - void FASTCALL playNote( notePlayHandle * _n, bool _try_parallelizing ); + void playNote( notePlayHandle * _n, bool _try_parallelizing ); QString instrumentName( void ) const; inline const instrument * getInstrument( void ) const @@ -96,68 +92,36 @@ public: return( m_instrument ); } - void FASTCALL deleteNotePluginData( notePlayHandle * _n ); + void deleteNotePluginData( notePlayHandle * _n ); // name-stuff - inline const QString & name( void ) const - { - return( m_name ); - } - void FASTCALL setName( const QString & _new_name ); + virtual void setName( const QString & _new_name ); - // volume & surround-position-stuff -/* void FASTCALL setVolume( volume _new_volume ); - volume getVolume( void ) const;*/ - -// void FASTCALL setBaseNote( Uint32 _new_note, bool _modified = TRUE ); - -/* inline tones baseTone( void ) const - { - return( m_baseTone ); - } - - inline octaves baseOctave( void ) const - { - return( m_baseOctave ); - }*/ - - int FASTCALL masterKey( notePlayHandle * _n ) const; + int masterKey( notePlayHandle * _n ) const; // play everything in given frame-range - creates note-play-handles - virtual bool FASTCALL play( const midiTime & _start, - const fpp_t _frames, - const f_cnt_t _frame_base, + virtual bool play( const midiTime & _start, const fpp_t _frames, + const f_cnt_t _frame_base, Sint16 _tco_num = -1 ); + // create new view for me + virtual trackView * createView( trackContainerView * _tcv ); + // create new track-content-object = pattern - virtual trackContentObject * FASTCALL createTCO( const midiTime & - _pos ); + virtual trackContentObject * createTCO( const midiTime & _pos ); // called by track - virtual void FASTCALL saveTrackSpecificSettings( QDomDocument & _doc, + virtual void saveTrackSpecificSettings( QDomDocument & _doc, QDomElement & _parent ); - virtual void FASTCALL loadTrackSpecificSettings( const QDomElement & - _this ); + virtual void loadTrackSpecificSettings( const QDomElement & _this ); using track::setJournalling; // load instrument whose name matches given one - instrument * FASTCALL loadInstrument( const QString & - _instrument_name ); + instrument * loadInstrument( const QString & _instrument_name ); - // parent for all internal tab-widgets - QWidget * tabWidgetParent( void ) - { - return( m_tabWidget ); - } - - pianoWidget * getPianoWidget( void ) - { - return( m_pianoWidget ); - } - inline audioPort * getAudioPort( void ) { return( &m_audioPort ); @@ -168,14 +132,146 @@ public: return( &m_baseNoteModel ); } + piano * getPiano( void ) + { + return( &m_piano ); + } + + bool arpeggiatorEnabled( void ) const + { + return( m_arpeggiator.m_arpEnabledModel.value() ); + } + + +signals: + void instrumentChanged( void ); + void newNote( void ); + void noteDone( const note & _n ); + void nameChanged( void ); + + +protected: + virtual QString nodeName( void ) const + { + return( "instrumenttrack" ); + } + // invalidates all note-play-handles linked to this instrument + void invalidateAllMyNPH( void ); + + +protected slots: + void updateBaseNote( void ); + + +private: + midiPort * m_midiPort; + audioPort m_audioPort; + + notePlayHandle * m_notes[NOTES_PER_OCTAVE * OCTAVES]; + + intModel m_baseNoteModel; + + QList m_processHandles; + + + floatModel m_volumeModel; + surroundAreaModel m_surroundAreaModel; + lcdSpinBoxModel m_effectChannelModel; + + + instrument * m_instrument; + instrumentSoundShaping m_soundShaping; + arpeggiator m_arpeggiator; + chordCreator m_chordCreator; + instrumentMidiIO m_midiIO; + + piano m_piano; + + + friend class instrumentTrackView; + friend class instrumentTrackWindow; + friend class notePlayHandle; + friend class presetPreviewPlayHandle; + friend class flpImport; + +} ; + + + + +class instrumentTrackView : public trackView +{ + Q_OBJECT +public: + instrumentTrackView( instrumentTrack * _it, trackContainerView * _tc ); + virtual ~instrumentTrackView(); + + instrumentTrackWindow * getInstrumentTrackWindow( void ) + { + return( m_window ); + } + + instrumentTrack * model( void ) + { + return( castModel() ); + } + + const instrumentTrack * model( void ) const + { + return( castModel() ); + } + + +private slots: + void activityIndicatorPressed( void ); + void activityIndicatorReleased( void ); + + void updateName( void ); + + +private: + instrumentTrackWindow * m_window; + + // widgets in track-settings-widget + volumeKnob * m_tswVolumeKnob; + fadeButton * m_tswActivityIndicator; + instrumentTrackButton * m_tswInstrumentTrackButton; + + QMenu * m_tswMidiMenu; + + + friend class instrumentTrackButton; + friend class instrumentTrackWindow; + +} ; + + + + +class instrumentTrackWindow : public QWidget, public modelView, + public journallingObjectHook +{ + Q_OBJECT +public: + instrumentTrackWindow( instrumentTrackView * _tv ); + virtual ~instrumentTrackWindow(); + + // parent for all internal tab-widgets + QWidget * tabWidgetParent( void ) + { + return( m_tabWidget ); + } + public slots: void textChanged( const QString & _new_name ); void toggledInstrumentTrackButton( bool _on ); + void updateName( void ); + void updateInstrumentView( void ); - -signals: - void noteDone( const note & _n ); + void midiInSelected( void ); + void midiOutSelected( void ); + void midiConfigChanged( bool ); protected: @@ -185,40 +281,19 @@ protected: virtual void dropEvent( QDropEvent * _de ); virtual void focusInEvent( QFocusEvent * _fe ); - inline virtual QString nodeName( void ) const - { - return( "instrumenttrack" ); - } - // invalidates all note-play-handles linked to this instrument - void invalidateAllMyNPH( void ); + virtual void saveSettings( QDomDocument & _doc, QDomElement & _this ); + virtual void loadSettings( const QDomElement & _this ); protected slots: void saveSettingsBtnClicked( void ); - void activityIndicatorPressed( void ); - void activityIndicatorReleased( void ); - void midiInSelected( void ); - void midiOutSelected( void ); - void midiConfigChanged( bool ); - - void updateBaseNote( void ); private: - trackTypes m_trackType; - - midiPort * m_midiPort; - - audioPort m_audioPort; - - - notePlayHandle * m_notes[NOTES_PER_OCTAVE * OCTAVES]; - - - intModel m_baseNoteModel; - - QList m_processHandles; + virtual void modelChanged( void ); + instrumentTrack * m_track; + instrumentTrackView * m_itv; // widgets on the top of an instrument-track-window tabWidget * m_generalSettingsWidget; @@ -228,44 +303,23 @@ private: lcdSpinBox * m_effectChannelNumber; QPushButton * m_saveSettingsBtn; - floatModel m_volumeModel; - surroundAreaModel m_surroundAreaModel; - lcdSpinBoxModel m_effectChannelModel; - // tab-widget with all children tabWidget * m_tabWidget; - instrument * m_instrument; - envelopeTabWidget * m_envWidget; - arpAndChordsTabWidget * m_arpWidget; - midiTabWidget * m_midiWidget; - pluginView * m_instrumentView; - effectRackView * m_effectRack; - -// effectChain m_effects; + instrumentSoundShapingView * m_ssView; + chordCreatorView * m_chordView; + arpeggiatorView * m_arpView; + instrumentMidiIOView * m_midiView; + effectRackView * m_effectView; // test-piano at the bottom of every instrument-settings-window - pianoWidget * m_pianoWidget; + pianoView * m_pianoView; - - // widgets in track-settings-widget - volumeKnob * m_tswVolumeKnob; - fadeButton * m_tswActivityIndicator; - instrumentTrackButton * m_tswInstrumentTrackButton; - - QMenu * m_tswMidiMenu; QAction * m_midiInputAction; QAction * m_midiOutputAction; friend class instrumentTrackButton; - friend class notePlayHandle; - friend class presetPreviewPlayHandle; - friend class flpImport; - -/* // base-tone stuff - void FASTCALL setBaseTone( tones _new_tone ); - void FASTCALL setBaseOctave( octaves _new_octave );*/ } ; @@ -275,14 +329,14 @@ private: class instrumentTrackButton : public QPushButton { public: - instrumentTrackButton( instrumentTrack * _instrument_track ); + instrumentTrackButton( instrumentTrackView * _instrument_track_view ); virtual ~instrumentTrackButton(); protected: // since we want to draw a special label (instrument- and instrument- // name) on our button, we have to re-implement this for doing so - virtual void drawButtonLabel( QPainter * _p ); + virtual void paintEvent( QPaintEvent * _pe ); // allow drops on this button - we simply forward them to // instrument-track @@ -291,7 +345,7 @@ protected: private: - instrumentTrack * m_instrumentTrack; + instrumentTrackView * m_instrumentTrackView; } ; diff --git a/include/journalling_object.h b/include/journalling_object.h index a0316548e..ced51b774 100644 --- a/include/journalling_object.h +++ b/include/journalling_object.h @@ -1,7 +1,7 @@ /* * journalling_object.h - declaration of class journallingObject * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -37,15 +37,15 @@ #include - class QDomDocument; class QDomElement; -typedef Uint32 t_action_id; +typedef uint32_t t_action_id; class journallingObject; +class journallingObjectHook; class journalEntry @@ -98,7 +98,6 @@ private: typedef QVector journalEntryVector; - class journallingObject { public: @@ -138,10 +137,10 @@ public: m_journalling = m_journallingStateStack.pop(); } - virtual QDomElement FASTCALL saveState( QDomDocument & _doc, + virtual QDomElement saveState( QDomDocument & _doc, QDomElement & _parent ); - virtual void FASTCALL restoreState( const QDomElement & _this ); + virtual void restoreState( const QDomElement & _this ); // to be implemented by actual object @@ -164,18 +163,23 @@ public: return( old_journalling ); } + void setHook( journallingObjectHook * _hook ); + + journallingObjectHook * getHook( void ) + { + return( m_hook ); + } protected: void addJournalEntry( const journalEntry & _je ); // to be implemented by sub-objects - virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _this ) + virtual void saveSettings( QDomDocument & _doc, QDomElement & _this ) { } - virtual void FASTCALL loadSettings( const QDomElement & _this ) + virtual void loadSettings( const QDomElement & _this ) { } @@ -201,9 +205,36 @@ private: QStack m_journallingStateStack; + journallingObjectHook * m_hook; + } ; +class journallingObjectHook +{ +public: + journallingObjectHook() : + m_hookedIn( NULL ) + { + } + virtual ~journallingObjectHook() + { + if( m_hookedIn != NULL ) + { + m_hookedIn->setHook( NULL ); + } + } + + virtual void saveSettings( QDomDocument & _doc, QDomElement & _this ) = 0; + virtual void loadSettings( const QDomElement & _this ) = 0; + +private: + journallingObject * m_hookedIn; + + friend class journallingObject; + +} ; + #endif diff --git a/include/main_window.h b/include/main_window.h index a9550e584..95bc66409 100644 --- a/include/main_window.h +++ b/include/main_window.h @@ -58,7 +58,7 @@ public: int addWidgetToToolBar( QWidget * _w, int _row = -1, int _col = -1 ); void addSpacingToToolBar( int _size ); - void resetWindowTitle( bool _modified = FALSE ); + void resetWindowTitle( void ); // every function that replaces current file (e.g. creates new file, @@ -158,8 +158,6 @@ private: QMenu * m_toolsMenu; QList m_tools; - bool m_modified; - friend class engine; diff --git a/include/mmp.h b/include/mmp.h index 97d1eb1de..508f6bb63 100644 --- a/include/mmp.h +++ b/include/mmp.h @@ -1,7 +1,7 @@ /* * mmp.h - class for reading and writing multimedia-project-files * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -34,27 +34,27 @@ class multimediaProject : public QDomDocument { public: - enum projectTypes + enum ProjectTypes { - UNKNOWN, - SONG_PROJECT, - SONG_PROJECT_TEMPLATE, - INSTRUMENT_TRACK_SETTINGS, - DRAG_N_DROP_DATA, - CLIPBOARD_DATA, - JOURNAL_DATA, - EFFECT_SETTINGS, - VIDEO_PROJECT, // might come later... - BURN_PROJECT, // might come later... - PLAYLIST, // might come later... - PROJ_TYPE_COUNT + UnknownType, + SongProject, + SongProjectTemplate, + InstrumentTrackSettings, + DragNDropData, + ClipboardData, + JournalData, + EffectSettings, + VideoProject, // might come later... + BurnProject, // might come later... + Playlist, // might come later... + NumProjectTypes } ; multimediaProject( const QString & _in_file_name, bool _is_filename = TRUE, bool _upgrade = TRUE ); - multimediaProject( projectTypes _project_type ); + multimediaProject( ProjectTypes _project_type ); ~multimediaProject(); QString nameWithExtension( const QString & _fn ) const; @@ -70,17 +70,17 @@ public: return( m_head ); } - inline projectTypes type( void ) const + inline ProjectTypes type( void ) const { return( m_type ); } - static projectTypes typeOfFile( const QString & _fn ); + static ProjectTypes typeOfFile( const QString & _fn ); private: - static projectTypes type( const QString & _type_name ); - static QString typeName( projectTypes _project_type ); + static ProjectTypes type( const QString & _type_name ); + static QString typeName( ProjectTypes _project_type ); void cleanMetaNodes( QDomElement _de ); @@ -89,14 +89,14 @@ private: struct typeDescStruct { - projectTypes m_type; + ProjectTypes m_type; QString m_name; } ; - static typeDescStruct s_types[PROJ_TYPE_COUNT]; + static typeDescStruct s_types[NumProjectTypes]; QDomElement m_content; QDomElement m_head; - projectTypes m_type; + ProjectTypes m_type; } ; diff --git a/include/mv_base.h b/include/mv_base.h index 7e38aa73e..ee3ac4c90 100644 --- a/include/mv_base.h +++ b/include/mv_base.h @@ -54,7 +54,6 @@ public: private: bool m_defaultConstructed; - signals: // emitted if actual data of the model (e.g. values) have changed void dataChanged( void ); diff --git a/include/name_label.h b/include/name_label.h index 099d4dfe8..04a3ae360 100644 --- a/include/name_label.h +++ b/include/name_label.h @@ -2,7 +2,7 @@ * name_label.h - class nameLabel, a label which is renamable by * double-clicking it * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -58,7 +58,6 @@ public slots: signals: void clicked( void ); - void nameChanged( void ); void nameChanged( const QString & _new_name ); void pixmapChanged( void ); diff --git a/include/pattern.h b/include/pattern.h index b42f27b84..ecc6a1586 100644 --- a/include/pattern.h +++ b/include/pattern.h @@ -2,7 +2,7 @@ * pattern.h - declaration of class pattern, which contains all informations * about a pattern * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -56,12 +56,13 @@ class pattern : public trackContentObject { Q_OBJECT public: - enum patternTypes + enum PatternTypes { - BEAT_PATTERN, MELODY_PATTERN/*, AUTOMATION_PATTERN*/ + BeatPattern, + MelodyPattern } ; - pattern( instrumentTrack * _channel_track ); + pattern( instrumentTrack * _instrument_track ); pattern( const pattern & _pat_to_copy ); virtual ~pattern(); @@ -70,13 +71,12 @@ public: virtual midiTime length( void ) const; - note * FASTCALL addNote( const note & _new_note, - const bool _quant_pos = TRUE ); + note * addNote( const note & _new_note, const bool _quant_pos = TRUE ); - void FASTCALL removeNote( const note * _note_to_del ); + void removeNote( const note * _note_to_del ); - note * FASTCALL rearrangeNote( const note * _note_to_proc, - const bool _quant_pos = TRUE ); + note * rearrangeNote( const note * _note_to_proc, + const bool _quant_pos = TRUE ); void clearNotes( void ); @@ -86,11 +86,11 @@ public: } // pattern-type stuff - inline patternTypes type( void ) const + inline PatternTypes type( void ) const { return( m_patternType ); } - void FASTCALL setType( patternTypes _new_pattern_type ); + void setType( PatternTypes _new_pattern_type ); void checkType( void ); @@ -103,7 +103,7 @@ public: inline void setName( const QString & _name ) { m_name = _name; - update(); + emit dataChanged(); } @@ -124,9 +124,8 @@ public: } // settings-management - virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _parent ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); inline virtual QString nodeName( void ) const { return( "pattern" ); @@ -140,57 +139,32 @@ public: bool empty( void ); -public slots: - virtual void update( void ); - - -protected slots: - void openInPianoRoll( bool _c ); - void openInPianoRoll( void ); - - void clear( void ); - void resetName( void ); - void changeName( void ); - void freeze( void ); - void unfreeze( void ); - void abortFreeze( void ); - - void addSteps( QAction * _item ); - void removeSteps( QAction * _item ); void addSteps( int _n ); void removeSteps( int _n ); + virtual trackContentObjectView * createView( trackView * _tv ); + + + using model::dataChanged; + protected: - virtual void constructContextMenu( QMenu * ); - virtual void mouseDoubleClickEvent( QMouseEvent * _me ); - virtual void mousePressEvent( QMouseEvent * _me ); - virtual void paintEvent( QPaintEvent * _pe ); - virtual void resizeEvent( QResizeEvent * _re ) - { - m_needsUpdate = TRUE; - trackContentObject::resizeEvent( _re ); - } - virtual void wheelEvent( QWheelEvent * _we ); - void ensureBeatNotes( void ); void updateBBTrack( void ); + void abortFreeze( void ); + + +protected slots: + void clear( void ); + void freeze( void ); + void unfreeze( void ); + private: - static QPixmap * s_stepBtnOn; - static QPixmap * s_stepBtnOverlay; - static QPixmap * s_stepBtnOff; - static QPixmap * s_stepBtnOffLight; - static QPixmap * s_frozen; - - QPixmap m_paintPixmap; - bool m_needsUpdate; - - // general stuff instrumentTrack * m_instrumentTrack; - patternTypes m_patternType; + PatternTypes m_patternType; QString m_name; // data-stuff @@ -203,25 +177,77 @@ private: volatile bool m_freezeAborted; - // as in Qt4 QThread is inherits from QObject and our base - // trackContentObject is a QWidget (=QObject), we cannot inherit from - // QThread. That's why we have to put pattern-freezing into separate - // thread-class -> patternFreezeThread + friend class patternView; friend class patternFreezeThread; } ; +class patternView : public trackContentObjectView +{ + Q_OBJECT +public: + patternView( pattern * _pattern, trackView * _parent ); + virtual ~patternView(); + + +public slots: + virtual void update( void ); + + +protected slots: + void openInPianoRoll( bool _c ); + void openInPianoRoll( void ); + + void resetName( void ); + void changeName( void ); + + void addSteps( QAction * _item ); + void removeSteps( QAction * _item ); + + +protected: + virtual void constructContextMenu( QMenu * ); + virtual void mouseDoubleClickEvent( QMouseEvent * _me ); + virtual void mousePressEvent( QMouseEvent * _me ); + virtual void paintEvent( QPaintEvent * _pe ); + virtual void resizeEvent( QResizeEvent * _re ) + { + m_needsUpdate = TRUE; + trackContentObjectView::resizeEvent( _re ); + } + virtual void wheelEvent( QWheelEvent * _we ); + + +private: + static QPixmap * s_stepBtnOn; + static QPixmap * s_stepBtnOverlay; + static QPixmap * s_stepBtnOff; + static QPixmap * s_stepBtnOffLight; + static QPixmap * s_frozen; + + pattern * m_pat; + QPixmap m_paintPixmap; + bool m_needsUpdate; + +} ; + + + + +// TODO: move to own header-files +// + class patternFreezeStatusDialog : public QDialog { Q_OBJECT public: patternFreezeStatusDialog( QThread * _thread ); - ~patternFreezeStatusDialog(); + virtual ~patternFreezeStatusDialog(); - void FASTCALL setProgress( int _p ); + void setProgress( int _p ); protected: diff --git a/include/piano_widget.h b/include/piano_widget.h index 9f6668db2..e3544e8ef 100644 --- a/include/piano_widget.h +++ b/include/piano_widget.h @@ -1,8 +1,8 @@ /* - * piano_widget.h - declaration of class pianoWidget, a widget which provides + * piano_widget.h - declaration of class pianoView, a widget which provides * an interactive piano/keyboard-widget * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -37,35 +37,54 @@ class instrumentTrack; -class knob; +class instrumentTrackView; class notePlayHandle; -enum keyTypes +enum KeyTypes { - WHITE_KEY, - BLACK_KEY + WhiteKey, + BlackKey } ; -class pianoWidget : public QWidget +class piano : public model +{ +public: + piano( instrumentTrack * _it ); + virtual ~piano(); + + void setKeyState( int _key, bool _on = FALSE ); + static int getKeyFromKeycode( int _kc ); + + +private: + instrumentTrack * m_instrumentTrack; + bool m_pressedKeys[NOTES_PER_OCTAVE * OCTAVES]; + + + friend class pianoView; + +} ; + + + +class pianoView : public QWidget, public modelView { Q_OBJECT public: - pianoWidget( instrumentTrack * _channel_track ); - virtual ~pianoWidget(); + pianoView( QWidget * _parent ); + virtual ~pianoView(); - void setKeyState( int _key, bool _on = FALSE ); +protected: + virtual void modelChanged( void ); virtual void keyPressEvent( QKeyEvent * ke ); virtual void keyReleaseEvent( QKeyEvent * ke ); #ifndef BUILD_WIN32 virtual bool x11Event( XEvent * _xe ); #endif - -protected: virtual void contextMenuEvent( QContextMenuEvent * _me ); - virtual void customEvent( QEvent * ); virtual void paintEvent( QPaintEvent * ); virtual void mousePressEvent( QMouseEvent * me ); virtual void mouseReleaseEvent( QMouseEvent * me ); @@ -74,19 +93,17 @@ protected: private: - int FASTCALL getKeyFromMouse( const QPoint & _p ) const; - int FASTCALL getKeyFromKeyboard( int _k ) const; - int FASTCALL getKeyX( int _key_num ) const; + int getKeyFromMouse( const QPoint & _p ) const; + int getKeyX( int _key_num ) const; static QPixmap * s_whiteKeyPm; static QPixmap * s_blackKeyPm; static QPixmap * s_whiteKeyPressedPm; static QPixmap * s_blackKeyPressedPm; - - bool m_pressedKeys[NOTES_PER_OCTAVE * OCTAVES]; + + piano * m_piano; QScrollBar * m_pianoScroll; - instrumentTrack * m_instrumentTrack; tones m_startTone; // first key when drawing octaves m_startOctave; @@ -94,7 +111,6 @@ private: unsigned int m_keyCode; - private slots: void pianoScrolled( int _new_pos ); diff --git a/include/sample_track.h b/include/sample_track.h index 507f5e332..0502a908c 100644 --- a/include/sample_track.h +++ b/include/sample_track.h @@ -47,12 +47,12 @@ public: sampleTCO( track * _track ); virtual ~sampleTCO(); - virtual void FASTCALL changeLength( const midiTime & _length ); + virtual void changeLength( const midiTime & _length ); const QString & sampleFile( void ) const; - virtual void FASTCALL saveSettings( QDomDocument & _doc, + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); + virtual void loadSettings( const QDomElement & _this ); inline virtual QString nodeName( void ) const { return( "sampletco" ); @@ -110,26 +110,23 @@ private: -class sampleTrack : public QObject, public track +class sampleTrack : public track { Q_OBJECT public: sampleTrack( trackContainer * _tc ); virtual ~sampleTrack(); - virtual trackTypes type( void ) const; - virtual bool FASTCALL play( const midiTime & _start, - const fpp_t _frames, + virtual bool play( const midiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, Sint16 _tco_num = -1 ); - virtual trackContentObject * FASTCALL createTCO( const midiTime & - _pos ); + virtual trackView * createView( trackContainerView * _tcv ); + virtual trackContentObject * createTCO( const midiTime & _pos ); - virtual void FASTCALL saveTrackSpecificSettings( QDomDocument & _doc, + virtual void saveTrackSpecificSettings( QDomDocument & _doc, QDomElement & _parent ); - virtual void FASTCALL loadTrackSpecificSettings( const QDomElement & - _this ); + virtual void loadTrackSpecificSettings( const QDomElement & _this ); inline audioPort * getAudioPort( void ) { @@ -143,13 +140,30 @@ public: private: - effectLabel * m_trackLabel; audioPort m_audioPort; - - volumeKnob * m_volumeKnob; knobModel m_volumeModel; + + friend class sampleTrackView; + } ; + +class sampleTrackView : public track +{ +public: + sampleTrackView( sampleTrack * _track, trackContainerView * _tcv ); + virtual ~sampleTrackView(); + + +private: + effectLabel * m_trackLabel; + + volumeKnob * m_volumeKnob; + +} ; + + + #endif diff --git a/include/song.h b/include/song.h new file mode 100644 index 000000000..a9bf070e5 --- /dev/null +++ b/include/song.h @@ -0,0 +1,270 @@ +/* + * song.h - class song - the root of the model-tree + * + * Copyright (c) 2004-2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _SONG_H +#define _SONG_H + +#include "track_container.h" +#include "automatable_model.h" +#include "automatable_slider.h" +#include "lcd_spinbox.h" + + +class pattern; +class timeLine; + + +const bpm_t MIN_BPM = 10; +const bpm_t DEFAULT_BPM = 140; +const bpm_t MAX_BPM = 999; +const Uint16 MAX_SONG_LENGTH = 9999; + + +class song : public trackContainer +{ + Q_OBJECT + mapPropertyFromModel(int,masterPitch,setMasterPitch,m_masterPitchModel); + mapPropertyFromModel(int,masterVolume,setMasterVolume, + m_masterVolumeModel); +public: + enum PlayModes + { + Mode_PlaySong, + Mode_PlayTrack, + Mode_PlayBB, + Mode_PlayPattern, + Mode_PlayAutomationPattern, + Mode_Count + } ; + + + class playPos : public midiTime + { + public: + playPos( Sint32 _abs = 0 ) : + midiTime( _abs ), + m_timeLine( NULL ), + m_timeLineUpdate( TRUE ), + m_currentFrame( 0.0f ) + { + } + inline void setCurrentFrame( const float _f ) + { + m_currentFrame = _f; + } + inline float currentFrame( void ) const + { + return( m_currentFrame ); + } + timeLine * m_timeLine; + bool m_timeLineUpdate; + + private: + float m_currentFrame; + + } ; + + + + void processNextBuffer( void ); + + + inline bool paused( void ) const + { + return( m_paused ); + } + + inline bool playing( void ) const + { + return( m_playing && m_exporting == FALSE ); + } + + inline bool exporting( void ) const + { + return( m_exporting ); + } + + bool realTimeTask( void ) const; + + inline bool exportDone( void ) const + { + return( m_exporting == TRUE && + m_playPos[Mode_PlaySong].getTact() >= + lengthInTacts() + 1 ); + } + + inline PlayModes playMode( void ) const + { + return( m_playMode ); + } + + inline playPos & getPlayPos( PlayModes _pm ) + { + return( m_playPos[_pm] ); + } + + tact lengthInTacts( void ) const; + + + bpm_t getTempo( void ); + virtual automationPattern * tempoAutomationPattern( void ); + + + // file management + void createNewProject( void ); + void createNewProjectFromTemplate( const QString & _template ); + void loadProject( const QString & _file_name ); + bool saveProject( void ); + bool saveProjectAs( const QString & _file_name ); + inline const QString & projectFileName( void ) const + { + return( m_fileName ); + } + inline bool isLoadingProject( void ) const + { + return( m_loadingProject ); + } + inline bool isModified( void ) const + { + return( m_modified ); + } + + inline virtual QString nodeName( void ) const + { + return( "song" ); + } + + virtual inline bool fixedTCOs( void ) const + { + return( FALSE ); + } + + +public slots: + void play( void ); + void stop( void ); + void playTrack( track * _trackToPlay ); + void playBB( void ); + void playPattern( pattern * _patternToPlay, bool _loop = TRUE ); + void pause( void ); + void resumeFromPause( void ); + + void importProject( void ); + void exportProject( void ); + + void startExport( void ); + void stopExport( void ); + + + void setModified( void ); + + void clearProject( void ); + + +private slots: + void insertBar( void ); + void removeBar( void ); + void addBBTrack( void ); + void addSampleTrack( void ); + + void setTempo( void ); + + void masterVolumeChanged( void ); + + void doActions( void ); + + void updateFramesPerTact64th( void ); + + + +private: + song( void ); + song( const song & ); + virtual ~song(); + + + inline tact currentTact( void ) const + { + return( m_playPos[m_playMode].getTact() ); + } + + midiTime length( void ) const; + inline tact64th currentTact64th( void ) const + { + return( m_playPos[m_playMode].getTact64th() ); + } + void setPlayPos( tact _tact_num, tact64th _t_64th, PlayModes + _play_mode ); + + + + track * m_automationTrack; + + lcdSpinBoxModel m_tempoModel; + sliderModel m_masterVolumeModel; + sliderModel m_masterPitchModel; + + + QString m_fileName; + QString m_oldFileName; + bool m_modified; + + volatile bool m_exporting; + volatile bool m_playing; + volatile bool m_paused; + + bool m_loadingProject; + + PlayModes m_playMode; + playPos m_playPos[Mode_Count]; + + track * m_trackToPlay; + pattern * m_patternToPlay; + bool m_loopPattern; + + + enum Actions + { + ActionStop, + ActionPlaySong, + ActionPlayTrack, + ActionPlayBB, + ActionPlayPattern, + ActionPause, + ActionResumeFromPause + } ; + QVector m_actions; + + + friend class engine; + friend class songEditor; + +signals: + void tempoChanged( bpm_t _new_bpm ); + +} ; + + +#endif diff --git a/include/song_editor.h b/include/song_editor.h index 592cd82e6..f6bf430ba 100644 --- a/include/song_editor.h +++ b/include/song_editor.h @@ -2,7 +2,7 @@ * song_editor.h - declaration of class songEditor, a window where you can * setup your songs * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -36,166 +36,24 @@ class QLabel; class QScrollBar; class comboBox; -class pattern; +class song; class textFloat; -class timeLine; class toolButton; -const bpm_t MIN_BPM = 10; -const bpm_t DEFAULT_BPM = 140; -const bpm_t MAX_BPM = 999; -const Uint16 MAX_SONG_LENGTH = 9999; - -class songEditor : public trackContainer +class songEditor : public trackContainerView { Q_OBJECT - mapPropertyFromModel(int,masterPitch,setMasterPitch,m_masterPitchModel); - mapPropertyFromModel(int,masterVolume,setMasterVolume,m_masterVolumeModel); public: - enum playModes - { - PLAY_SONG, - PLAY_TRACK, - PLAY_BB, - PLAY_PATTERN, - PLAY_AUTOMATION_PATTERN, - PLAY_MODE_CNT - } ; + songEditor( song * _song ); + virtual ~songEditor(); - class playPos : public midiTime - { - public: - playPos( Sint32 _abs = 0 ) : - midiTime( _abs ), - m_timeLine( NULL ), - m_timeLineUpdate( TRUE ), - m_currentFrame( 0.0f ) - { - } - inline void setCurrentFrame( const float _f ) - { - m_currentFrame = _f; - } - inline float currentFrame( void ) const - { - return( m_currentFrame ); - } - timeLine * m_timeLine; - bool m_timeLineUpdate; - - private: - float m_currentFrame; - } ; - - - - void processNextBuffer( void ); - - - inline bool paused( void ) const - { - return( m_paused ); - } - - inline bool playing( void ) const - { - return( m_playing && m_exporting == FALSE ); - } - - inline bool exporting( void ) const - { - return( m_exporting ); - } - - bool realTimeTask( void ) const; - - inline bool exportDone( void ) const - { - return( m_exporting == TRUE && - m_playPos[PLAY_SONG].getTact() >= lengthInTacts() + 1 ); - } - - inline playModes playMode( void ) const - { - return( m_playMode ); - } - - inline playPos & getPlayPos( playModes _pm ) - { - return( m_playPos[_pm] ); - } - - tact lengthInTacts( void ) const; - - - bpm_t getTempo( void ); - virtual automationPattern * tempoAutomationPattern( void ); - - - // file management - void createNewProject( void ); - void FASTCALL createNewProjectFromTemplate( const QString & _template ); - void FASTCALL loadProject( const QString & _file_name ); - bool saveProject( void ); - bool FASTCALL saveProjectAs( const QString & _file_name ); - inline const QString & projectFileName( void ) const - { - return( m_fileName ); - } - - inline virtual QString nodeName( void ) const - { - return( "songeditor" ); - } - - virtual inline bool fixedTCOs( void ) const - { - return( FALSE ); - } - - -public slots: - void play( void ); - void stop( void ); - void playTrack( track * _trackToPlay ); - void playBB( void ); - void playPattern( pattern * _patternToPlay, bool _loop = TRUE ); - void pause( void ); - void resumeFromPause( void ); - - void importProject( void ); - void exportProject( void ); - - void startExport( void ); - void stopExport( void ); - - - void setModified( void ); - - void clearProject( void ); - - -protected: - virtual void keyPressEvent( QKeyEvent * _ke ); - virtual void wheelEvent( QWheelEvent * _we ); - virtual void paintEvent( QPaintEvent * _pe ); - - virtual bool allowRubberband( void ) const; - - -protected slots: - void insertBar( void ); - void removeBar( void ); - void addBBTrack( void ); - void addSampleTrack( void ); +private slots: void scrolled( int _new_pos ); void updateTimeLinePosition( void ); - void setTempo( void ); - void masterVolumeChanged( int _new_val ); void masterVolumePressed( void ); void masterVolumeMoved( int _new_val ); @@ -209,31 +67,18 @@ protected slots: void zoomingChanged( void ); - void doActions( void ); - private: - songEditor( void ); - songEditor( const songEditor & ); - virtual ~songEditor(); + virtual void keyPressEvent( QKeyEvent * _ke ); + virtual void wheelEvent( QWheelEvent * _we ); + virtual void paintEvent( QPaintEvent * _pe ); + + virtual bool allowRubberband( void ) const; + +// virtual void modelChanged( void ); - inline tact currentTact( void ) const - { - return( m_playPos[m_playMode].getTact() ); - } - - midiTime length( void ) const; - inline tact64th currentTact64th( void ) const - { - return( m_playPos[m_playMode].getTact64th() ); - } - void FASTCALL setPlayPos( tact _tact_num, tact64th _t_64th, playModes - _play_mode ); - - - - track * m_automationTrack; + song * m_s; QScrollBar * m_leftRightScroll; @@ -242,12 +87,9 @@ private: toolButton * m_playButton; toolButton * m_stopButton; lcdSpinBox * m_tempoSpinBox; - lcdSpinBoxModel m_tempoModel; automatableSlider * m_masterVolumeSlider; automatableSlider * m_masterPitchSlider; - sliderModel m_masterVolumeModel; - sliderModel m_masterPitchModel; textFloat * m_mvsStatus; textFloat * m_mpsStatus; @@ -261,45 +103,10 @@ private: comboBox * m_zoomingComboBox; - QString m_fileName; - QString m_oldFileName; - - volatile bool m_exporting; - volatile bool m_playing; - volatile bool m_paused; - - bool m_loadingProject; - - playModes m_playMode; - playPos m_playPos[PLAY_MODE_CNT]; - - track * m_trackToPlay; - pattern * m_patternToPlay; - bool m_loopPattern; - bool m_scrollBack; - - - enum ACTIONS - { - ACT_STOP_PLAY, ACT_PLAY_SONG, ACT_PLAY_TRACK, ACT_PLAY_BB, - ACT_PLAY_PATTERN, ACT_PAUSE, ACT_RESUME_FROM_PAUSE - } ; - QVector m_actions; - - - friend class engine; - - -private slots: - void updateFramesPerTact64th( void ); - - -signals: - void tempoChanged( bpm_t _new_bpm ); - } ; + #endif diff --git a/include/timeline.h b/include/timeline.h index d100146f0..9a7c8ef5f 100644 --- a/include/timeline.h +++ b/include/timeline.h @@ -1,7 +1,7 @@ /* * timeline.h - class timeLine, representing a time-line with position marker * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -28,7 +28,7 @@ #include -#include "song_editor.h" +#include "song.h" class QPixmap; @@ -40,39 +40,43 @@ class timeLine : public QWidget, public journallingObject { Q_OBJECT public: - enum autoScrollStates + enum AutoScrollStates { - AUTOSCROLL_ENABLED, AUTOSCROLL_DISABLED + AutoScrollEnabled, + AutoScrollDisabled } ; - enum loopPointStates + enum LoopPointStates { - LOOP_POINTS_DISABLED, LOOP_POINTS_ENABLED + LoopPointsDisabled, + LoopPointsEnabled } ; - enum behaviourAtStopStates + enum BehaviourAtStopStates { - BACK_TO_ZERO, BACK_TO_START, KEEP_STOP_POSITION + BackToZero, + BackToStart, + KeepStopPosition } ; - timeLine( int _xoff, int _yoff, float _ppt, songEditor::playPos & _pos, + timeLine( int _xoff, int _yoff, float _ppt, song::playPos & _pos, const midiTime & _begin, QWidget * _parent ); virtual ~timeLine(); - inline songEditor::playPos & pos( void ) + inline song::playPos & pos( void ) { return( m_pos ); } - behaviourAtStopStates behaviourAtStop( void ) const + BehaviourAtStopStates behaviourAtStop( void ) const { return( m_behaviourAtStop ); } bool loopPointsEnabled( void ) const { - return( m_loopPoints == LOOP_POINTS_ENABLED ); + return( m_loopPoints == LoopPointsEnabled ); } inline const midiTime & loopBegin( void ) const @@ -105,9 +109,8 @@ public: void addToolButtons( QWidget * _tool_bar ); - virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _parent ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); inline virtual QString nodeName( void ) const { return( "timeline" ); @@ -145,16 +148,16 @@ private: static QPixmap * s_loopPointPixmap; static QPixmap * s_loopPointDisabledPixmap; - autoScrollStates m_autoScroll; - loopPointStates m_loopPoints; - behaviourAtStopStates m_behaviourAtStop; + AutoScrollStates m_autoScroll; + LoopPointStates m_loopPoints; + BehaviourAtStopStates m_behaviourAtStop; bool m_changedPosition; int m_xOffset; int m_posMarkerX; float m_ppt; - songEditor::playPos & m_pos; + song::playPos & m_pos; const midiTime & m_begin; midiTime m_loopPos[2]; @@ -166,7 +169,10 @@ private: enum actions { - NONE, MOVE_POS_MARKER, MOVE_LOOP_BEGIN, MOVE_LOOP_END + NoAction, + MovePositionMarker, + MoveLoopBegin, + MoveLoopEnd } m_action; int m_moveXOff; diff --git a/include/track.h b/include/track.h index b8bd94e64..0d2fc2d40 100644 --- a/include/track.h +++ b/include/track.h @@ -2,7 +2,7 @@ * track.h - declaration of classes concerning tracks -> neccessary for all * track-like objects (beat/bassline, sample-track...) * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -44,6 +44,7 @@ #include "midi_time.h" #include "rubberband.h" #include "journalling_object.h" +#include "automatable_model.h" class QMenu; @@ -54,26 +55,27 @@ class bbTrack; class pixmapButton; class textFloat; class track; +class trackContentObjectView; class trackContainer; +class trackContainerView; class trackContentWidget; -class trackWidget; +class trackView; typedef QWidget trackSettingsWidget; -const Uint16 DEFAULT_SETTINGS_WIDGET_WIDTH = 224; -const Uint16 TRACK_OP_WIDTH = 70; -const Uint16 TCO_BORDER_WIDTH = 1; +const int DEFAULT_SETTINGS_WIDGET_WIDTH = 224; +const int TRACK_OP_WIDTH = 70; +const int TCO_BORDER_WIDTH = 1; -class trackContentObject : public selectableObject, - public journallingObject +class trackContentObject : public model, public journallingObject { Q_OBJECT public: trackContentObject( track * _track ); - trackContentObject( const trackContentObject & _copy ); +// trackContentObject( const trackContentObject & _copy ); virtual ~trackContentObject(); inline track * getTrack( void ) { @@ -94,17 +96,71 @@ public: bool muted( void ) const { - return( m_muted ); + return( m_mutedModel.value() ); } + virtual void movePosition( const midiTime & _pos ); + virtual void changeLength( const midiTime & _length ); + + virtual trackContentObjectView * createView( trackView * _tv ) = 0; + + + +protected: + virtual void undoStep( journalEntry & _je ); + virtual void redoStep( journalEntry & _je ); + + +protected slots: + void cut( void ); + void copy( void ); + void paste( void ); + void toggleMute( void ); + + +signals: + void lengthChanged( void ); + void positionChanged( void ); + + +private: + enum Actions + { + NoAction, + Move, + Resize + } ; + + track * m_track; + midiTime m_startPosition; + midiTime m_length; + + boolModel m_mutedModel; + + + friend class trackContentObjectView; + +} ; + + + +class trackContentObjectView : public selectableObject, public modelView +{ + Q_OBJECT +public: + trackContentObjectView( trackContentObject * _tco, trackView * _tv ); + virtual ~trackContentObjectView(); + bool fixedTCOs( void ); - virtual void FASTCALL movePosition( const midiTime & _pos ); - virtual void FASTCALL changeLength( const midiTime & _length ); + inline trackContentObject * getTrackContentObject( void ) + { + return( m_tco ); + } public slots: - virtual void close( void ); + virtual bool close( void ); protected: @@ -123,34 +179,34 @@ protected: void setAutoResizeEnabled( bool _e = FALSE ); float pixelsPerTact( void ); - virtual void undoStep( journalEntry & _je ); - virtual void redoStep( journalEntry & _je ); + inline trackView * getTrackView( void ) + { + return( m_trackView ); + } protected slots: - void cut( void ); - void copy( void ); - void paste( void ); - void toggleMute( void ); + void updateLength( void ); + void updatePosition( void ); private: - enum actions + enum Actions { - NONE, MOVE, MOVE_SELECTION, RESIZE + NoAction, + Move, + MoveSelection, + Resize } ; static textFloat * s_textFloat; - track * m_track; - midiTime m_startPosition; - midiTime m_length; - actions m_action; + trackContentObject * m_tco; + trackView * m_trackView; + Actions m_action; bool m_autoResize; Sint16 m_initialMouseX; - bool m_muted; - textFloat * m_hint; midiTime m_oldTime;// used for undo/redo while mouse-button is pressed @@ -160,39 +216,30 @@ private: + class trackContentWidget : public QWidget, public journallingObject { Q_OBJECT public: - trackContentWidget( trackWidget * _parent ); + trackContentWidget( trackView * _parent ); virtual ~trackContentWidget(); - trackContentObject * FASTCALL getTCO( int _tco_num ); - int numOfTCOs( void ); - trackContentObject * FASTCALL addTCO( trackContentObject * _tco ); - void FASTCALL removeTCO( int _tco_num, bool _also_delete = TRUE ); - void FASTCALL removeTCO( trackContentObject * _tco, - bool _also_delete = TRUE ); - void removeAllTCOs( void ); - void FASTCALL swapPositionOfTCOs( int _tco_num1, int _tco_num2 ); - - inline Uint16 pixelsPerTact( void ) const + void addTCOView( trackContentObjectView * _tcov ); + void removeTCOView( trackContentObjectView * _tcov ); + void removeTCOView( int _tco_num ) { - return( m_pixelsPerTact ); + if( _tco_num >= 0 && _tco_num < m_tcoViews.size() ) + { + removeTCOView( m_tcoViews[_tco_num] ); + } } - inline void setPixelsPerTact( Uint16 _ppt ) - { - m_pixelsPerTact = _ppt; - } - - tact length( void ) const; + midiTime endPosition( const midiTime & _pos_start ); public slots: - void insertTact( const midiTime & _pos ); - void removeTact( const midiTime & _pos ); void update( void ); + void changePosition( const midiTime & _new_pos = -1 ); protected: @@ -212,19 +259,21 @@ protected: private: - enum actions + enum Actions { - ADD_TCO, REMOVE_TCO + AddTrackContentObject, + RemoveTrackContentObject } ; track * getTrack( void ); midiTime getPosition( int _mouse_x ); - typedef QVector tcoVector; + trackView * m_trackView; - tcoVector m_trackContentObjects; - trackWidget * m_trackWidget; - Uint16 m_pixelsPerTact; + typedef QVector tcoViewVector; + tcoViewVector m_tcoViews; + + int m_pixelsPerTact; } ; @@ -236,7 +285,7 @@ class trackOperationsWidget : public QWidget { Q_OBJECT public: - trackOperationsWidget( trackWidget * _parent ); + trackOperationsWidget( trackView * _parent ); ~trackOperationsWidget(); bool muted( void ) const; @@ -267,7 +316,7 @@ private: static QPixmap * s_muteOnDisabled; static QPixmap * s_muteOnEnabled; - trackWidget * m_trackWidget; + trackView * m_trackView; QPushButton * m_trackOps; pixmapButton * m_muteBtn; @@ -283,14 +332,137 @@ private: +// base-class for all tracks +class track : public model, public journallingObject +{ + Q_OBJECT + mapPropertyFromModel(bool,muted,setMuted,m_mutedModel); +public: + enum TrackTypes + { + InstrumentTrack, + BBTrack, + SampleTrack, + EventTrack, + VideoTrack, + AutomationTrack, + NumTrackTypes + } ; -// actual widget shown in trackContainer -class trackWidget : public QWidget, public journallingObject + track( TrackTypes _type, trackContainer * _tc ); + virtual ~track(); + + static track * create( TrackTypes _tt, trackContainer * _tc ); + static track * create( const QDomElement & _this, + trackContainer * _tc ); + void clone( void ); + + + // pure virtual functions + TrackTypes type( void ) const + { + return( m_type ); + } + + virtual bool play( const midiTime & _start, const fpp_t _frames, + const f_cnt_t _frame_base, + Sint16 _tco_num = -1 ) = 0; + + + virtual trackView * createView( trackContainerView * _view ) = 0; + virtual trackContentObject * createTCO( const midiTime & _pos ) = 0; + + virtual void saveTrackSpecificSettings( QDomDocument & _doc, + QDomElement & _parent ) = 0; + virtual void loadTrackSpecificSettings( const QDomElement & _this ) = 0; + + + virtual void saveSettings( QDomDocument & _doc, QDomElement & _this ); + virtual void loadSettings( const QDomElement & _this ); + + + // -- for usage by trackContentObject only --------------- + trackContentObject * addTCO( trackContentObject * _tco ); + void removeTCO( trackContentObject * _tco ); + // ------------------------------------------------------- + + int numOfTCOs( void ); + trackContentObject * getTCO( int _tco_num ); + int getTCONum( trackContentObject * _tco ); + + void getTCOsInRange( QList & _tco_v, + const midiTime & _start, + const midiTime & _end ); + void swapPositionOfTCOs( int _tco_num1, int _tco_num2 ); + + void insertTact( const midiTime & _pos ); + void removeTact( const midiTime & _pos ); + + tact length( void ) const; + + inline trackContainer * getTrackContainer( void ) const + { + return( m_trackContainer ); + } + + void addAutomationPattern( automationPattern * _pattern ); + void removeAutomationPattern( automationPattern * _pattern ); + + // name-stuff + virtual const QString & name( void ) const + { + return( m_name ); + } + + inline const QPixmap * pixmap( void ) + { + return( m_pixmap ); + } + + using model::dataChanged; + + +public slots: + virtual void setName( const QString & _new_name ) + { + m_name = _new_name; + } + + +protected: + void sendMidiTime( const midiTime & _time ); + + +private: + trackContainer * m_trackContainer; + TrackTypes m_type; + QString m_name; + QPixmap * m_pixmap; + boolModel m_mutedModel; + + typedef QVector tcoVector; + tcoVector m_trackContentObjects; + + QList m_automationPatterns; + + + friend class trackView; + + +signals: + void trackContentObjectAdded( trackContentObject * ); + +} ; + + + + +class trackView : public QWidget, public modelView, public journallingObject { Q_OBJECT public: - trackWidget( track * _track, QWidget * _parent ); - virtual ~trackWidget(); + trackView( track * _track, trackContainerView * _tcv ); + virtual ~trackView(); inline const track * getTrack( void ) const { @@ -302,56 +474,46 @@ public: return( m_track ); } - inline const trackOperationsWidget & getTrackOperationsWidget( void ) - const + inline trackContainerView * getTrackContainerView( void ) { - return( m_trackOperationsWidget ); + return( m_trackContainerView ); } - inline const trackSettingsWidget & getTrackSettingsWidget( void ) const + inline trackOperationsWidget * getTrackOperationsWidget( void ) { - return( m_trackSettingsWidget ); + return( &m_trackOperationsWidget ); } - inline const trackContentWidget & getTrackContentWidget( void ) const + inline trackSettingsWidget * getTrackSettingsWidget( void ) { - return( m_trackContentWidget ); + return( &m_trackSettingsWidget ); } - inline trackOperationsWidget & getTrackOperationsWidget( void ) + inline trackContentWidget * getTrackContentWidget( void ) { - return( m_trackOperationsWidget ); - } - - inline trackSettingsWidget & getTrackSettingsWidget( void ) - { - return( m_trackSettingsWidget ); - } - - inline trackContentWidget & getTrackContentWidget( void ) - { - return( m_trackContentWidget ); + return( &m_trackContentWidget ); } bool isMovingTrack( void ) const { - return( m_action == MOVE_TRACK ); + return( m_action == MoveTrack ); } - + virtual void update( void ); public slots: - void changePosition( const midiTime & _new_pos = -1 ); + virtual bool close( void ); protected: + virtual void modelChanged( void ); virtual void undoStep( journalEntry & _je ); virtual void redoStep( journalEntry & _je ); virtual QString nodeName( void ) const { - return( "trackwidget" ); + return( "trackview" ); } @@ -363,153 +525,30 @@ protected: virtual void paintEvent( QPaintEvent * _pe ); virtual void resizeEvent( QResizeEvent * _re ); - midiTime FASTCALL endPosition( const midiTime & _pos_start ); - private: - enum actions + enum Actions { - NONE, MOVE_TRACK, RESIZE_TRACK + NoAction, + MoveTrack, + ResizeTrack } ; + track * m_track; + trackContainerView * m_trackContainerView; trackOperationsWidget m_trackOperationsWidget; trackSettingsWidget m_trackSettingsWidget; trackContentWidget m_trackContentWidget; - actions m_action; + Actions m_action; + + +private slots: + void createTCOView( trackContentObject * _tco ); } ; - -// base-class for all tracks -class track : public journallingObject -{ -public: - enum trackTypes - { - INSTRUMENT_TRACK, - BB_TRACK, - SAMPLE_TRACK, - EVENT_TRACK, - VIDEO_TRACK, - AUTOMATION_TRACK, - TOTAL_TRACK_TYPES - } ; - - track( trackContainer * _tc, bool _create_widget = TRUE ); - virtual ~track(); - - static track * FASTCALL create( trackTypes _tt, trackContainer * _tc ); - static void FASTCALL create( const QDomElement & _this, - trackContainer * _tc ); - void FASTCALL clone( void ); - - tact length( void ) const; - - inline bool muted( void ) const - { - return( m_trackWidget->getTrackOperationsWidget().muted() ); - } - - inline void setMuted( bool _muted ) - { - m_trackWidget->getTrackOperationsWidget().setMuted( _muted ); - } - - - // pure virtual functions - virtual trackTypes type( void ) const = 0; - - virtual bool FASTCALL play( const midiTime & _start, - const fpp_t _frames, - const f_cnt_t _frame_base, - Sint16 _tco_num = -1 ) = 0; - - - virtual trackContentObject * FASTCALL createTCO( - const midiTime & _pos ) = 0; - - virtual void FASTCALL saveTrackSpecificSettings( QDomDocument & _doc, - QDomElement & _parent ) = 0; - virtual void FASTCALL loadTrackSpecificSettings( - const QDomElement & _this ) = 0; - - - virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _this ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); - - - trackContentObject * FASTCALL addTCO( trackContentObject * _tco ); - void FASTCALL removeTCO( int _tco_num ); - int numOfTCOs( void ); - trackContentObject * FASTCALL getTCO( int _tco_num ); - int FASTCALL getTCONum( trackContentObject * _tco ); - void FASTCALL getTCOsInRange( QList & _tco_v, - const midiTime & _start, - const midiTime & _end ); - void FASTCALL swapPositionOfTCOs( int _tco_num1, int _tco_num2 ); - - inline trackWidget * getTrackWidget( void ) - { - return( m_trackWidget ); - } - - inline trackContainer * getTrackContainer( void ) const - { - return( m_trackContainer ); - } - - inline const trackSettingsWidget * getTrackSettingsWidget( void ) const - { - return( &m_trackWidget->getTrackSettingsWidget() ); - } - - inline const trackContentWidget * getTrackContentWidget( void ) const - { - return( &m_trackWidget->getTrackContentWidget() ); - } - - inline trackSettingsWidget * getTrackSettingsWidget( void ) - { - return( &m_trackWidget->getTrackSettingsWidget() ); - } - - inline trackContentWidget * getTrackContentWidget( void ) - { - return( &m_trackWidget->getTrackContentWidget() ); - } - - void addAutomationPattern( automationPattern * _pattern ); - void removeAutomationPattern( automationPattern * _pattern ); - - // name-stuff - inline virtual const QString & name( void ) const - { - return( m_name ); - } - inline virtual void setName( const QString & _new_name ) - { - m_name = _new_name; - } - - -protected: - void sendMidiTime( const midiTime & _time ); - QString m_name; - - -private: - trackContainer * m_trackContainer; - trackWidget * m_trackWidget; - QList m_automation_patterns; - -} ; - - - - #endif diff --git a/include/track_container.h b/include/track_container.h index b02a87791..e46b78cba 100644 --- a/include/track_container.h +++ b/include/track_container.h @@ -2,7 +2,7 @@ * track_container.h - base-class for all track-containers like Song-Editor, * BB-Editor... * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -36,65 +36,98 @@ #include "journalling_object.h" +class trackContainerView; class QVBoxLayout; - -class trackContainer : public QWidget, public journallingObject +class trackContainer : public model, public journallingObject { Q_OBJECT public: trackContainer( void ); virtual ~trackContainer(); + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + + virtual void loadSettings( const QDomElement & _this ); + + + virtual automationPattern * tempoAutomationPattern( void ) + { + return( NULL ); + } + + int countTracks( track::TrackTypes _tt = track::NumTrackTypes ) const; + + void setMutedOfAllTracks( bool _muted ); + + + virtual void updateAfterTrackAdd( void ); + void addTrack( track * _track ); + void removeTrack( track * _track ); + + void clearAllTracks( void ); + + const QList & tracks( void ) const + { + return( m_tracks ); + } + + static const QString classNodeName( void ) + { + return( "trackcontainer" ); + } + + + //const QList tracks( void ) const; + + +signals: + void trackAdded( track * _track ); + + +private: + QList m_tracks; + + + friend class trackContainerView; + + +} ; + + + +class trackContainerView : public QWidget, public modelView, + public journallingObject +{ + Q_OBJECT +public: + trackContainerView( trackContainer * _tc ); + virtual ~trackContainerView(); + QWidget * contentWidget( void ) { return( m_scrollArea ); } - virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _parent ); - - virtual void FASTCALL loadSettings( const QDomElement & _this ); - - - inline float pixelsPerTact( void ) const - { - return( m_ppt ); - } - inline const midiTime & currentPosition( void ) const { return( m_currentPosition ); } - virtual automationPattern * tempoAutomationPattern( void ) - { - return( NULL ); - } - virtual bool fixedTCOs( void ) const { return( FALSE ); } - Uint16 FASTCALL countTracks( track::trackTypes _tt = - track::TOTAL_TRACK_TYPES ) const; + inline float pixelsPerTact( void ) const + { + return( m_ppt ); + } - void FASTCALL setMutedOfAllTracks( bool _muted ); + void setPixelsPerTact( int _ppt ); - - virtual void updateAfterTrackAdd( void ); - void FASTCALL setPixelsPerTact( Uint16 _ppt ); - void FASTCALL addTrack( track * _track ); - void FASTCALL removeTrack( track * _track ); - void FASTCALL moveTrackUp( track * _track ); - void FASTCALL moveTrackDown( track * _track ); - - void FASTCALL realignTracks( void ); - void clearAllTracks( void ); - - const trackWidget * trackWidgetAt( const int _y ) const; + const trackView * trackViewAt( const int _y ) const; virtual bool allowRubberband( void ) const; @@ -110,73 +143,101 @@ public: return( m_rubberBand->selectedObjects() ); } return( QVector() ); -/* QVector foo; - return( foo );*/ } - QList tracks( void ); - static const QString classNodeName( void ) + trackContainer * model( void ) { - return( "trackcontainer" ); + return( m_tc ); + } + + const trackContainer * model( void ) const + { + return( m_tc ); + } + + void moveTrackViewUp( trackView * _tv ); + void moveTrackViewDown( trackView * _tv ); + + // -- for usage by trackView only --------------- + trackView * addTrackView( trackView * _tv ); + void removeTrackView( trackView * _tv ); + // ------------------------------------------------------- + + void clearAllTracks( void ); + + virtual QString nodeName( void ) const + { + return( "trackcontainerview" ); } -signals: - void positionChanged( const midiTime & _pos ); +public slots: + void realignTracks( void ); + void createTrackView( track * _t ); protected: - static const Uint16 DEFAULT_PIXELS_PER_TACT = 16; + static const int DEFAULT_PIXELS_PER_TACT = 16; - virtual void undoStep( journalEntry & _je ); - virtual void redoStep( journalEntry & _je ); + const QList & trackViews( void ) const + { + return( m_trackViews ); + } virtual void dragEnterEvent( QDragEnterEvent * _dee ); virtual void dropEvent( QDropEvent * _de ); - virtual void mousePressEvent( QMouseEvent * _me ); virtual void mouseMoveEvent( QMouseEvent * _me ); virtual void mouseReleaseEvent( QMouseEvent * _me ); - virtual void resizeEvent( QResizeEvent * ); - const QList tracks( void ) const; + virtual void undoStep( journalEntry & _je ); + virtual void redoStep( journalEntry & _je ); midiTime m_currentPosition; private: - enum actions + enum Actions { - ADD_TRACK, REMOVE_TRACK + AddTrack, + RemoveTrack } ; class scrollArea : public QScrollArea { public: - scrollArea( trackContainer * _parent ); + scrollArea( trackContainerView * _parent ); virtual ~scrollArea(); protected: virtual void wheelEvent( QWheelEvent * _we ); private: - trackContainer * m_trackContainer; + trackContainerView * m_trackContainerView; } ; + trackContainer * m_tc; + typedef QList trackViewList; + trackViewList m_trackViews; scrollArea * m_scrollArea; QVBoxLayout * m_scrollLayout; - QList m_tracks; float m_ppt; rubberBand * m_rubberBand; QPoint m_origin; + +signals: + void positionChanged( const midiTime & _pos ); + + } ; + #endif diff --git a/plugins/audio_file_processor/audio_file_processor.cpp b/plugins/audio_file_processor/audio_file_processor.cpp index 25fc3fc39..4574cd99f 100644 --- a/plugins/audio_file_processor/audio_file_processor.cpp +++ b/plugins/audio_file_processor/audio_file_processor.cpp @@ -33,7 +33,7 @@ #include "audio_file_processor.h" #include "automatable_model_templates.h" #include "engine.h" -#include "song_editor.h" +#include "song.h" #include "instrument_track.h" #include "note_play_handle.h" #include "interpolation.h" @@ -447,7 +447,7 @@ void audioFileProcessorView::dragEnterEvent( QDragEnterEvent * _dee ) QString txt = _dee->mimeData()->data( stringPairDrag::mimeType() ); if( txt.section( ':', 0, 0 ) == QString( "tco_%1" ).arg( - track::SAMPLE_TRACK ) ) + track::SampleTrack ) ) { _dee->acceptProposedAction(); } @@ -479,7 +479,7 @@ void audioFileProcessorView::dropEvent( QDropEvent * _de ) _de->accept(); return; } - else if( type == QString( "tco_%1" ).arg( track::SAMPLE_TRACK ) ) + else if( type == QString( "tco_%1" ).arg( track::SampleTrack ) ) { multimediaProject mmp( value, FALSE ); castModel()->setAudioFile( mmp.content(). @@ -572,7 +572,7 @@ void audioFileProcessorView::openAudioFile( void ) if( af != "" ) { castModel()->setAudioFile( af ); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } } diff --git a/plugins/ladspa_effect/ladspa_controls.cpp b/plugins/ladspa_effect/ladspa_controls.cpp index e956e19da..746b8d9e6 100644 --- a/plugins/ladspa_effect/ladspa_controls.cpp +++ b/plugins/ladspa_effect/ladspa_controls.cpp @@ -34,8 +34,7 @@ ladspaControls::ladspaControls( ladspaEffect * _eff, m_processors( _eff->getProcessorCount() ), m_track( _track ), m_noLink( FALSE ), - m_stereoLinkModel( TRUE, FALSE, TRUE, boolModel::defaultRelStep(), - this ) + m_stereoLinkModel( TRUE, this ) { multi_proc_t controls = m_effect->getPortControls(); m_controlCount = controls.count(); diff --git a/plugins/stk/Makefile.am b/plugins/stk/Makefile.am index 4eb93be39..2a02d9518 100644 --- a/plugins/stk/Makefile.am +++ b/plugins/stk/Makefile.am @@ -1,2 +1 @@ -SUBDIRS = mallets -# voices \ No newline at end of file +SUBDIRS = mallets voices diff --git a/src/core/arp_and_chords_tab_widget.cpp b/src/core/arp_and_chords_tab_widget.cpp deleted file mode 100644 index 859451fad..000000000 --- a/src/core/arp_and_chords_tab_widget.cpp +++ /dev/null @@ -1,667 +0,0 @@ -#ifndef SINGLE_SOURCE_COMPILE - -/* - * arp_and_chords_tab_widget.cpp - widget for use in arp/chord-tab of - * instrument-track-window - * - * Copyright (c) 2004-2008 Tobias Doerffel - * - * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net - * - * 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. - * - */ - - -#include -#include - - -#include "arp_and_chords_tab_widget.h" -#include "combobox.h" -#include "embed.h" -#include "engine.h" -#include "group_box.h" -#include "gui_templates.h" -#include "instrument_track.h" -#include "knob.h" -#include "led_checkbox.h" -#include "note_play_handle.h" -#include "song_editor.h" -#include "pixmap_button.h" -#include "preset_preview_play_handle.h" -#include "tempo_sync_knob.h" -#include "tooltip.h" - - - -arpAndChordsTabWidget::chord arpAndChordsTabWidget::s_chords[] = -{ - { arpAndChordsTabWidget::tr( "octave" ), { 0, -1 } }, - { arpAndChordsTabWidget::tr( "Major" ), { 0, 4, 7, -1 } }, - { arpAndChordsTabWidget::tr( "Majb5" ), { 0, 4, 6, -1 } }, - { arpAndChordsTabWidget::tr( "minor" ), { 0, 3, 7, -1 } }, - { arpAndChordsTabWidget::tr( "minb5" ), { 0, 3, 6, -1 } }, - { arpAndChordsTabWidget::tr( "sus2" ), { 0, 2, 7, -1 } }, - { arpAndChordsTabWidget::tr( "sus4" ), { 0, 5, 7, -1 } }, - { arpAndChordsTabWidget::tr( "aug" ), { 0, 4, 8, -1 } }, - { arpAndChordsTabWidget::tr( "augsus4" ), { 0, 5, 8, -1 } }, - { arpAndChordsTabWidget::tr( "tri" ), { 0, 3, 6, 9, -1 } }, - - { arpAndChordsTabWidget::tr( "6" ), { 0, 4, 7, 9, -1 } }, - { arpAndChordsTabWidget::tr( "6sus4" ), { 0, 5, 7, 9, -1 } }, - { arpAndChordsTabWidget::tr( "6add9" ), { 0, 4, 7, 12, -1 } }, - { arpAndChordsTabWidget::tr( "m6" ), { 0, 3, 7, 9, -1 } }, - { arpAndChordsTabWidget::tr( "m6add9" ), { 0, 3, 7, 9, 14, -1 } }, - - { arpAndChordsTabWidget::tr( "7" ), { 0, 4, 7, 10, -1 } }, - { arpAndChordsTabWidget::tr( "7sus4" ), { 0, 5, 7, 10, -1 } }, - { arpAndChordsTabWidget::tr( "7#5" ), { 0, 4, 8, 10, -1 } }, - { arpAndChordsTabWidget::tr( "7b5" ), { 0, 4, 6, 10, -1 } }, - { arpAndChordsTabWidget::tr( "7#9" ), { 0, 4, 7, 10, 13, 18, -1 } }, - { arpAndChordsTabWidget::tr( "7b9" ), { 0, 4, 7, 10, 13, 16, -1 } }, - { arpAndChordsTabWidget::tr( "7#5#9" ), { 0, 4, 8, 12, 14, 19, -1 } }, - { arpAndChordsTabWidget::tr( "7#5b9" ), { 0, 4, 8, 12, 14, 17, -1 } }, - { arpAndChordsTabWidget::tr( "7b5b9" ), { 0, 4, 6, 10, 12, 15, -1 } }, - { arpAndChordsTabWidget::tr( "7add11" ), { 0, 4, 7, 10, 17, -1 } }, - { arpAndChordsTabWidget::tr( "7add13" ), { 0, 4, 7, 10, 21, -1 } }, - { arpAndChordsTabWidget::tr( "7#11" ), { 0, 4, 7, 10, 18, -1 } }, - { arpAndChordsTabWidget::tr( "Maj7" ), { 0, 4, 7, 11, -1 } }, - { arpAndChordsTabWidget::tr( "Maj7b5" ), { 0, 4, 6, 11, -1 } }, - { arpAndChordsTabWidget::tr( "Maj7#5" ), { 0, 4, 8, 11, -1 } }, - { arpAndChordsTabWidget::tr( "Maj7#11" ), { 0, 4, 7, 11, 18, -1 } }, - { arpAndChordsTabWidget::tr( "Maj7add13" ), { 0, 4, 7, 11, 21, -1 } }, - { arpAndChordsTabWidget::tr( "m7" ), { 0, 3, 7, 10, -1 } }, - { arpAndChordsTabWidget::tr( "m7b5" ), { 0, 3, 6, 10, -1 } }, - { arpAndChordsTabWidget::tr( "m7b9" ), { 0, 3, 7, 10, 13, -1 } }, - { arpAndChordsTabWidget::tr( "m7add11" ), { 0, 3, 7, 10, 17, -1 } }, - { arpAndChordsTabWidget::tr( "m7add13" ), { 0, 3, 7, 10, 21, -1 } }, - { arpAndChordsTabWidget::tr( "m-Maj7" ), { 0, 3, 7, 11, -1 } }, - { arpAndChordsTabWidget::tr( "m-Maj7add11" ), { 0, 3, 7, 11, 17, -1 } }, - { arpAndChordsTabWidget::tr( "m-Maj7add13" ), { 0, 3, 7, 11, 21, -1 } }, - - { arpAndChordsTabWidget::tr( "9" ), { 0, 4, 7, 10, 14, -1 } }, - { arpAndChordsTabWidget::tr( "9sus4" ), { 0, 5, 7, 10, 14, -1 } }, - { arpAndChordsTabWidget::tr( "add9" ), { 0, 4, 7, 14, -1 } }, - { arpAndChordsTabWidget::tr( "9#5" ), { 0, 4, 8, 10, 14, -1 } }, - { arpAndChordsTabWidget::tr( "9b5" ), { 0, 4, 6, 10, 14, -1 } }, - { arpAndChordsTabWidget::tr( "9#11" ), { 0, 4, 7, 10, 14, 18, -1 } }, - { arpAndChordsTabWidget::tr( "9b13" ), { 0, 4, 7, 10, 14, 20, -1 } }, - { arpAndChordsTabWidget::tr( "Maj9" ), { 0, 4, 7, 11, 14, -1 } }, - { arpAndChordsTabWidget::tr( "Maj9sus4" ), { 0, 5, 7, 11, 15, -1 } }, - { arpAndChordsTabWidget::tr( "Maj9#5" ), { 0, 4, 8, 11, 14, -1 } }, - { arpAndChordsTabWidget::tr( "Maj9#11" ), { 0, 4, 7, 11, 14, 18, -1 } }, - { arpAndChordsTabWidget::tr( "m9" ), { 0, 3, 7, 10, 14, -1 } }, - { arpAndChordsTabWidget::tr( "madd9" ), { 0, 3, 7, 14, -1 } }, - { arpAndChordsTabWidget::tr( "m9b5" ), { 0, 3, 6, 10, 14, -1 } }, - { arpAndChordsTabWidget::tr( "m9-Maj7" ), { 0, 3, 7, 11, 14, -1 } }, - - { arpAndChordsTabWidget::tr( "11" ), { 0, 4, 7, 10, 14, 17, -1 } }, - { arpAndChordsTabWidget::tr( "11b9" ), { 0, 4, 7, 10, 13, 17, -1 } }, - { arpAndChordsTabWidget::tr( "Maj11" ), { 0, 4, 7, 11, 14, 17, -1 } }, - { arpAndChordsTabWidget::tr( "m11" ), { 0, 3, 7, 10, 14, 17, -1 } }, - { arpAndChordsTabWidget::tr( "m-Maj11" ), { 0, 3, 7, 11, 14, 17, -1 } }, - - { arpAndChordsTabWidget::tr( "13" ), { 0, 4, 7, 10, 14, 21, -1 } }, - { arpAndChordsTabWidget::tr( "13#9" ), { 0, 4, 7, 10, 15, 21, -1 } }, - { arpAndChordsTabWidget::tr( "13b9" ), { 0, 4, 7, 10, 13, 21, -1 } }, - { arpAndChordsTabWidget::tr( "13b5b9" ), { 0, 4, 6, 10, 13, 21, -1 } }, - { arpAndChordsTabWidget::tr( "Maj13" ), { 0, 4, 7, 11, 14, 21, -1 } }, - { arpAndChordsTabWidget::tr( "m13" ), { 0, 3, 7, 10, 14, 21, -1 } }, - { arpAndChordsTabWidget::tr( "m-Maj13" ), { 0, 3, 7, 11, 14, 21, -1 } }, - - { arpAndChordsTabWidget::tr( "Major" ), { 0, 2, 4, 5, 7, 9, 11, -1 } }, - { arpAndChordsTabWidget::tr( "Harmonic minor" ), { 0, 2, 3, 5, 7, 8, - 11, -1 } }, - { arpAndChordsTabWidget::tr( "Melodic minor" ), { 0, 2, 3, 5, 7, 9, - 11, -1 } }, - { arpAndChordsTabWidget::tr( "Whole tone" ), { 0, 2, 4, 6, 8, 10, - -1 } }, - { arpAndChordsTabWidget::tr( "Diminished" ), { 0, 2, 3, 5, 6, 8, 9, - 11, -1 } }, - { arpAndChordsTabWidget::tr( "Major pentatonic" ), { 0, 2, 4, 7, 10, - -1 } }, - { arpAndChordsTabWidget::tr( "Minor pentatonic" ), { 0, 3, 5, 7, 10, - -1 } }, - { arpAndChordsTabWidget::tr( "Jap in sen" ), { 0, 1, 5, 7, 10, -1 } }, - { arpAndChordsTabWidget::tr( "Major bebop" ), { 0, 2, 4, 5, 7, 8, 9, - 11, -1 } }, - { arpAndChordsTabWidget::tr( "Dominant bebop" ), { 0, 2, 4, 5, 7, 9, - 10, 11, -1 } }, - { arpAndChordsTabWidget::tr( "Blues" ), { 0, 3, 5, 6, 7, 10, -1 } }, - { arpAndChordsTabWidget::tr( "Arabic" ), { 0, 1, 4, 5, 7, 8, 11, -1 } }, - { arpAndChordsTabWidget::tr( "Enigmatic" ), { 0, 1, 4, 6, 8, 10, 11, - -1 } }, - { arpAndChordsTabWidget::tr( "Neopolitan" ), { 0, 1, 3, 5, 7, 9, 11, - -1 } }, - { arpAndChordsTabWidget::tr( "Neopolitan minor" ), { 0, 1, 3, 5, 7, 9, - 11, -1 } }, - { arpAndChordsTabWidget::tr( "Hungarian minor" ), { 0, 2, 3, 6, 7, 9, - 11, -1 } }, - { arpAndChordsTabWidget::tr( "Dorian" ), { 0, 2, 3, 5, 7, 9, 10, -1 } }, - { arpAndChordsTabWidget::tr( "Phrygolydian" ), { 0, 1, 3, 5, 7, 8, 10, - -1 } }, - { arpAndChordsTabWidget::tr( "Lydian" ), { 0, 2, 4, 6, 7, 9, 11, -1 } }, - { arpAndChordsTabWidget::tr( "Mixolydian" ), { 0, 2, 4, 5, 7, 9, 10, - -1 } }, - { arpAndChordsTabWidget::tr( "Aeolian" ), { 0, 2, 3, 5, 7, 8, 10, - -1 } }, - { arpAndChordsTabWidget::tr( "Locrian" ), { 0, 1, 3, 5, 6, 8, 10, - -1 } }, - - { "", { -1, -1 } } - -} ; - - -const int CHORDS_GROUPBOX_X = 4; -const int CHORDS_GROUPBOX_Y = 5; -const int CHORDS_GROUPBOX_WIDTH = 238; -const int CHORDS_GROUPBOX_HEIGHT = 65; -const int ARP_GROUPBOX_X = CHORDS_GROUPBOX_X; -const int ARP_GROUPBOX_Y = 10 + CHORDS_GROUPBOX_Y + CHORDS_GROUPBOX_HEIGHT; -const int ARP_GROUPBOX_WIDTH = CHORDS_GROUPBOX_WIDTH; -const int ARP_GROUPBOX_HEIGHT = 240 - ARP_GROUPBOX_Y; - - - -arpAndChordsTabWidget::arpAndChordsTabWidget( - instrumentTrack * _instrument_track ) : - QWidget( _instrument_track->tabWidgetParent() ), - m_chordsEnabledModel( new boolModel( FALSE ) ), - m_chordsModel( new comboBoxModel( /* this */ ) ), - m_chordRangeModel( new floatModel( 1.0f, 1.0f, 9.0f, 1.0f - /* this */ ) ), - m_arpEnabledModel( new boolModel( FALSE ) ), - m_arpModel( new comboBoxModel( /* this */ ) ), - m_arpRangeModel( new floatModel( 1.0f, 1.0f, 9.0f, 1.0f - /* this */ ) ), - m_arpTimeModel( new floatModel( 100.0f, 25.0f, 2000.0f, 1.0f - /* this */ ) ), - m_arpGateModel( new floatModel( 100.0f, 1.0f, 200.0f, 1.0f - /* this */ ) ), - m_arpDirectionModel( new intModel( /* this */ ) ), - m_arpModeModel( new comboBoxModel( /* this */ ) ) -{ - m_chordsEnabledModel->setTrack( _instrument_track ); - m_chordsGroupBox = new groupBox( tr( "CHORDS" ), this ); - m_chordsGroupBox->setGeometry( CHORDS_GROUPBOX_X, CHORDS_GROUPBOX_Y, - CHORDS_GROUPBOX_WIDTH, - CHORDS_GROUPBOX_HEIGHT ); - m_chordsGroupBox->setModel( m_chordsEnabledModel ); - - - m_chordsModel->setTrack( _instrument_track ); - m_chordsComboBox = new comboBox( m_chordsGroupBox, tr( "Chord type" ) ); - m_chordsComboBox->setGeometry( 10, 25, 140, 22 ); - - for( int i = 0; s_chords[i].interval[0] != -1; ++i ) - { - m_chordsModel->addItem( tr( s_chords[i].name.toAscii(). - constData() ) ); - } - m_chordsComboBox->setModel( m_chordsModel ); - - - m_chordRangeModel->setTrack( _instrument_track ); - m_chordRangeModel->setInitValue( 1.0f ); - m_chordRangeKnob = new knob( knobBright_26, m_chordsGroupBox, - tr( "Chord range" ) ); - m_chordRangeKnob->setModel( m_chordRangeModel ); - m_chordRangeKnob->setLabel( tr( "RANGE" ) ); - m_chordRangeKnob->move( 164, 24 ); - m_chordRangeKnob->setHintText( tr( "Chord range:" ) + " ", " " + - tr( "octave(s)" ) ); - m_chordRangeKnob->setWhatsThis( - tr( "Use this knob for setting the chord range in octaves. " - "The selected chord will be played within specified " - "amount of octaves." ) ); - - - - m_arpEnabledModel->setTrack( _instrument_track ); - m_arpGroupBox = new groupBox( tr( "ARPEGGIO" ), this ); - m_arpGroupBox->setModel( m_arpEnabledModel ); - m_arpGroupBox->setGeometry( ARP_GROUPBOX_X, ARP_GROUPBOX_Y, - ARP_GROUPBOX_WIDTH, - ARP_GROUPBOX_HEIGHT ); - - m_arpGroupBox->setWhatsThis( - tr( "An arpeggio is a type of playing (especially plucked) " - "instruments, which makes the music much livelier. " - "The strings of such instruments (e.g. harps) are " - "plucked like chords, the only difference is, that " - "this is done in a sequential order, so the notes are " - "not played at the same time. Typical arpeggios are " - "major or minor triads. But there're a lot of other " - "possible chords, you can select." ) ); - - - m_arpModel->setTrack( _instrument_track ); - m_arpComboBox = new comboBox( m_arpGroupBox, tr( "Arpeggio type" ) ); - m_arpComboBox->setGeometry( 10, 25, 140, 22 ); - - for( int i = 0; s_chords[i].interval[0] != -1; ++i ) - { - m_arpModel->addItem( tr( s_chords[i].name.toAscii(). - constData() ) ); - } - m_arpComboBox->setModel( m_arpModel ); - - - m_arpRangeModel->setTrack( _instrument_track ); - m_arpRangeModel->setInitValue( 1.0f ); - m_arpRangeKnob = new knob( knobBright_26, m_arpGroupBox, - tr( "Arpeggio range" ) ); - m_arpRangeKnob->setModel( m_arpRangeModel ); - m_arpRangeKnob->setLabel( tr( "RANGE" ) ); - m_arpRangeKnob->move( 164, 24 ); - m_arpRangeKnob->setHintText( tr( "Arpeggio range:" ) + " ", " " + - tr( "octave(s)" ) ); - m_arpRangeKnob->setWhatsThis( - tr( "Use this knob for setting the arpeggio range in octaves. " - "The selected arpeggio will be played within specified " - "amount of octaves." ) ); - - - m_arpTimeModel->setTrack( _instrument_track ); - m_arpTimeModel->setInitValue( 100.0f ); - m_arpTimeKnob = new tempoSyncKnob( knobBright_26, m_arpGroupBox, - tr( "Arpeggio time" ) ); - m_arpTimeKnob->setModel( m_arpTimeModel ); - m_arpTimeKnob->setLabel( tr( "TIME" ) ); - m_arpTimeKnob->move( 164, 70 ); - m_arpTimeKnob->setHintText( tr( "Arpeggio time:" ) + " ", " " + - tr( "ms" ) ); - m_arpTimeKnob->setWhatsThis( - tr( "Use this knob for setting the arpeggio time in " - "milliseconds. The arpeggio time specifies how long " - "each arpeggio-tone should be played." ) ); - - - m_arpGateModel->setTrack( _instrument_track ); - m_arpGateModel->setInitValue( 100.0f ); - m_arpGateKnob = new knob( knobBright_26, m_arpGroupBox, - tr( "Arpeggio gate" ) ); - m_arpGateKnob->setModel( m_arpGateModel ); - m_arpGateKnob->setLabel( tr( "GATE" ) ); - m_arpGateKnob->move( 204, 70 ); - m_arpGateKnob->setHintText( tr( "Arpeggio gate:" ) + " ", tr( "%" ) ); - m_arpGateKnob->setWhatsThis( - tr( "Use this knob for setting the arpeggio gate. The " - "arpeggio gate specifies the percent of a whole " - "arpeggio-tone that should be played. With this you " - "can make cool staccato-arpeggios." ) ); - - m_arpDirectionLbl = new QLabel( tr( "Direction:" ), m_arpGroupBox ); - m_arpDirectionLbl->setGeometry( 10, 60, 64, 10 ); - m_arpDirectionLbl->setFont( pointSize<7>( m_arpDirectionLbl->font() ) ); - - - - pixmapButton * arp_up_btn = new pixmapButton( m_arpGroupBox, NULL ); - arp_up_btn->move( 10, 74 ); - arp_up_btn->setActiveGraphic( embed::getIconPixmap( "arp_up_on" ) ); - arp_up_btn->setInactiveGraphic( embed::getIconPixmap( "arp_up_off" ) ); - toolTip::add( arp_up_btn, tr( "arpeggio direction = up" ) ); - - - pixmapButton * arp_down_btn = new pixmapButton( m_arpGroupBox, NULL ); - arp_down_btn->move( 30, 74 ); - arp_down_btn->setActiveGraphic( embed::getIconPixmap( "arp_down_on" ) ); - arp_down_btn->setInactiveGraphic( embed::getIconPixmap( - "arp_down_off" ) ); - toolTip::add( arp_down_btn, tr( "arpeggio direction = down" ) ); - - - pixmapButton * arp_up_and_down_btn = new pixmapButton( m_arpGroupBox, - NULL ); - arp_up_and_down_btn->move( 50, 74 ); - arp_up_and_down_btn->setActiveGraphic( embed::getIconPixmap( - "arp_up_and_down_on" ) ); - arp_up_and_down_btn->setInactiveGraphic( embed::getIconPixmap( - "arp_up_and_down_off" ) ); - toolTip::add( arp_up_and_down_btn, - tr( "arpeggio direction = up and down" ) ); - - - pixmapButton * arp_random_btn = new pixmapButton( m_arpGroupBox, NULL ); - arp_random_btn->move( 70, 74 ); - arp_random_btn->setActiveGraphic( embed::getIconPixmap( - "arp_random_on" ) ); - arp_random_btn->setInactiveGraphic( embed::getIconPixmap( - "arp_random_off" ) ); - toolTip::add( arp_random_btn, tr( "arpeggio direction = random" ) ); - - m_arpDirectionBtnGrp = new automatableButtonGroup( this, - tr( "Arpeggio direction" ) ); - m_arpDirectionBtnGrp->setModel( m_arpDirectionModel ); - m_arpDirectionBtnGrp->addButton( arp_up_btn ); - m_arpDirectionBtnGrp->addButton( arp_down_btn ); - m_arpDirectionBtnGrp->addButton( arp_up_and_down_btn ); - m_arpDirectionBtnGrp->addButton( arp_random_btn ); - - m_arpDirectionModel->setTrack( _instrument_track ); - m_arpDirectionModel->setInitValue( UP ); - - - QLabel * mode_lbl = new QLabel( tr( "Mode:" ), m_arpGroupBox ); - mode_lbl->setGeometry( 10, 104, 64, 10 ); - mode_lbl->setFont( pointSize<7>( mode_lbl->font() ) ); - - m_arpModeComboBox = new comboBox( m_arpGroupBox, - tr( "Arpeggio mode" ) ); - m_arpModeComboBox->setGeometry( 10, 118, 128, 22 ); - - m_arpModeModel->setTrack( _instrument_track ); - m_arpModeModel->addItem( tr( "Free" ), new QPixmap( - embed::getIconPixmap( "arp_free" ) ) ); - m_arpModeModel->addItem( tr( "Sort" ), new QPixmap( - embed::getIconPixmap( "arp_sort" ) ) ); - m_arpModeModel->addItem( tr( "Sync" ), new QPixmap( - embed::getIconPixmap( "arp_sync" ) ) ); - m_arpModeComboBox->setModel( m_arpModeModel ); -} - - - - -arpAndChordsTabWidget::~arpAndChordsTabWidget() -{ -} - - - - -void arpAndChordsTabWidget::processNote( notePlayHandle * _n ) -{ - const int base_note_key = _n->key(); - // we add chord-subnotes to note if either note is a base-note and - // arpeggio is not used or note is part of an arpeggio - // at the same time we only add sub-notes if nothing of the note was - // played yet, because otherwise we would add chord-subnotes every - // time an audio-buffer is rendered... - if( ( ( _n->baseNote() && m_arpEnabledModel->value() == FALSE ) || - _n->arpNote() ) && - _n->totalFramesPlayed() == 0 && - m_chordsEnabledModel->value() == TRUE ) - { - // then insert sub-notes for chord - const int selected_chord = m_chordsComboBox->value(); - - for( int octave_cnt = 0; - octave_cnt < m_chordRangeKnob->value(); ++octave_cnt ) - { - const int sub_note_key_base = base_note_key + - octave_cnt * NOTES_PER_OCTAVE; - // if octave_cnt == 1 we're in the first octave and - // the base-note is already done, so we don't have to - // create it in the following loop, then we loop until - // there's a -1 in the interval-array - for( int i = ( octave_cnt == 0 ) ? 1 : 0; - s_chords[selected_chord].interval[i] != -1; - ++i ) - { - // add interval to sub-note-key - const int sub_note_key = sub_note_key_base + - (int) s_chords[ - selected_chord].interval[i]; - // maybe we're out of range -> let's get outta - // here! - if( sub_note_key > NOTES_PER_OCTAVE*OCTAVES ) - { - break; - } - // create copy of base-note - note note_copy( _n->length(), 0, - (tones)( sub_note_key % - NOTES_PER_OCTAVE ), - (octaves)( sub_note_key / - NOTES_PER_OCTAVE ), - _n->getVolume(), - _n->getPanning(), - _n->detuning() ); - // create sub-note-play-handle, only note is - // different - new notePlayHandle( _n->getInstrumentTrack(), - _n->offset(), - _n->frames(), note_copy, - _n ); - } - } - } - - - // now follows code for arpeggio - - if( _n->baseNote() == FALSE || - !m_arpEnabledModel->value() || - ( _n->released() && _n->releaseFramesDone() >= - _n->actualReleaseFramesToDo() ) ) - { - return; - } - - - const int selected_arp = m_arpComboBox->value(); - - constNotePlayHandleVector cnphv = notePlayHandle::nphsOfInstrumentTrack( - _n->getInstrumentTrack() ); - if( m_arpModeComboBox->value() != FREE && cnphv.size() == 0 ) - { - // maybe we're playing only a preset-preview-note? - cnphv = presetPreviewPlayHandle::nphsOfInstrumentTrack( - _n->getInstrumentTrack() ); - if( cnphv.size() == 0 ) - { - // still nothing found here, so lets return - //return; - cnphv.push_back( _n ); - } - } - - const int cur_chord_size = getChordSize( s_chords[selected_arp] ); - const int range = (int)( cur_chord_size * m_arpRangeKnob->value() ); - const int total_range = range * cnphv.size(); - - // number of frames that every note should be played - const f_cnt_t arp_frames = (f_cnt_t)( m_arpTimeKnob->value() / 1000.0f * - engine::getMixer()->sampleRate() ); - const f_cnt_t gated_frames = (f_cnt_t)( m_arpGateKnob->value() * - arp_frames / 100.0f ); - - // used for calculating remaining frames for arp-note, we have to add - // arp_frames-1, otherwise the first arp-note will not be setup - // correctly... -> arp_frames frames silence at the start of every note! - int cur_frame = ( ( m_arpModeComboBox->value() != FREE ) ? - cnphv.first()->totalFramesPlayed() : - _n->totalFramesPlayed() ) + arp_frames - 1; - // used for loop - f_cnt_t frames_processed = 0; - - while( frames_processed < engine::getMixer()->framesPerPeriod() ) - { - const f_cnt_t remaining_frames_for_cur_arp = arp_frames - - ( cur_frame % arp_frames ); - // does current arp-note fill whole audio-buffer? - if( remaining_frames_for_cur_arp > - engine::getMixer()->framesPerPeriod() ) - { - // then we don't have to do something! - break; - } - - frames_processed += remaining_frames_for_cur_arp; - - // init with zero - int cur_arp_idx = 0; - - // in sorted mode: is it our turn or do we have to be quiet for - // now? - if( m_arpModeComboBox->value() == SORT && - ( ( cur_frame / arp_frames ) % total_range ) / - range != (f_cnt_t) _n->index() ) - { - // update counters - frames_processed += arp_frames; - cur_frame += arp_frames; - continue; - } - - const int dir = m_arpDirectionBtnGrp->value(); - // process according to arpeggio-direction... - if( dir == UP ) - { - cur_arp_idx = ( cur_frame / arp_frames ) % range; - } - else if( dir == DOWN ) - { - cur_arp_idx = range - ( cur_frame / arp_frames ) % - range - 1; - } - else if( dir == UP_AND_DOWN && range > 1 ) - { - // imagine, we had to play the arp once up and then - // once down -> makes 2 * range possible notes... - // because we don't play the lower and upper notes - // twice, we have to subtract 2 - cur_arp_idx = ( cur_frame / arp_frames ) % - ( range * 2 - 2 ); - // if greater than range, we have to play down... - // looks like the code for arp_dir==DOWN... :) - if( cur_arp_idx >= range ) - { - cur_arp_idx = range - cur_arp_idx % - ( range - 1 ) - 1; - } - } - else if( dir == RANDOM ) - { - // just pick a random chord-index - cur_arp_idx = (int)( range * ( (float) rand() / - (float) RAND_MAX ) ); - } - - // now calculate final key for our arp-note - const int sub_note_key = base_note_key + (cur_arp_idx / - cur_chord_size ) * - NOTES_PER_OCTAVE + - s_chords[selected_arp].interval[cur_arp_idx % cur_chord_size]; - - // range-checking - if( sub_note_key >= NOTES_PER_OCTAVE * OCTAVES || - sub_note_key < 0 || - engine::getMixer()->criticalXRuns() ) - { - continue; - } - - float vol_level = 1.0f; - if( _n->released() ) - { - vol_level = _n->volumeLevel( cur_frame + gated_frames ); - } - - // create new arp-note - note new_note( midiTime( 0 ), midiTime( 0 ), - static_cast( sub_note_key % - NOTES_PER_OCTAVE ), - static_cast( sub_note_key / - NOTES_PER_OCTAVE ), - static_cast( _n->getVolume() * - vol_level ), - _n->getPanning(), _n->detuning() ); - - // create sub-note-play-handle, only ptr to note is different - // and is_arp_note=TRUE - new notePlayHandle( _n->getInstrumentTrack(), - ( ( m_arpModeComboBox->value() != FREE ) ? - cnphv.first()->offset() : - _n->offset() ) + - frames_processed, - gated_frames, - new_note, - _n, TRUE ); - - // update counters - frames_processed += arp_frames; - cur_frame += arp_frames; - } - - // make sure, note is handled as arp-base-note, even if we didn't add a - // sub-note so far - if( m_arpModeComboBox->value() != FREE ) - { - _n->setArpNote( TRUE ); - } -} - - - - -void arpAndChordsTabWidget::saveSettings( QDomDocument & _doc, - QDomElement & _this ) -{ - m_chordsEnabledModel->saveSettings( _doc, _this, "chord-enabled" ); - m_chordsModel->saveSettings( _doc, _this, "chord" ); - m_chordRangeModel->saveSettings( _doc, _this, "chordrange" ); - - m_arpEnabledModel->saveSettings( _doc, _this, "arp-enabled" ); - m_arpModel->saveSettings( _doc, _this, "arp" ); - m_arpRangeModel->saveSettings( _doc, _this, "arprange" ); - m_arpTimeModel->saveSettings( _doc, _this, "arptime" ); - m_arpGateModel->saveSettings( _doc, _this, "arpgate" ); - m_arpDirectionModel->saveSettings( _doc, _this, "arpdir" ); - - m_arpModeModel->saveSettings( _doc, _this, "arpmode" ); -} - - - - -void arpAndChordsTabWidget::loadSettings( const QDomElement & _this ) -{ - m_chordsEnabledModel->loadSettings( _this, "chord-enabled" ); - m_chordsModel->loadSettings( _this, "chord" ); - m_chordRangeModel->loadSettings( _this, "chordrange" ); - - m_arpEnabledModel->loadSettings( _this, "arp-enabled" ); - m_arpModel->loadSettings( _this, "arp" ); - m_arpRangeModel->loadSettings( _this, "arprange" ); - m_arpTimeModel->loadSettings( _this, "arptime" ); - m_arpGateModel->loadSettings( _this, "arpgate" ); - m_arpDirectionModel->loadSettings( _this, "arpdir" ); - - // Keep compatibility with version 0.2.1 file format - if( _this.hasAttribute( "arpsyncmode" ) ) - { - m_arpTimeKnob->setSyncMode( - ( tempoSyncKnob::tempoSyncMode ) _this.attribute( - "arpsyncmode" ).toInt() ); - } - - m_arpModeModel->loadSettings( _this, "arpmode" ); -} - - - - - - -#include "arp_and_chords_tab_widget.moc" - - -#endif diff --git a/src/core/automation_editor.cpp b/src/core/automation_editor.cpp index e18170ed6..be1ad3462 100644 --- a/src/core/automation_editor.cpp +++ b/src/core/automation_editor.cpp @@ -4,7 +4,7 @@ * automation_editor.cpp - implementation of automationEditor which is used for * actual setting of dynamic values * - * Copyright (c) 2006-2007 Javier Serrano Polo + * Copyright (c) 2006-2008 Javier Serrano Polo * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -115,8 +115,8 @@ automationEditor::automationEditor( void ) : // add time-line m_timeLine = new timeLine( VALUES_WIDTH, 32, m_ppt, - engine::getSongEditor()->getPlayPos( - songEditor::PLAY_AUTOMATION_PATTERN ), + engine::getSong()->getPlayPos( + song::Mode_PlayAutomationPattern ), m_currentPosition, this ); connect( this, SIGNAL( positionChanged( const midiTime & ) ), m_timeLine, SLOT( updatePosition( const midiTime & ) ) ); @@ -612,7 +612,7 @@ void automationEditor::keyPressEvent( QKeyEvent * _ke ) break; case Qt::Key_Space: - if( engine::getSongEditor()->playing() ) + if( engine::getSong()->playing() ) { stop(); } @@ -728,7 +728,7 @@ void automationEditor::mousePressEvent( QMouseEvent * _me ) QCursor c( Qt::SizeAllCursor ); QApplication::setOverrideCursor( c ); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } else if( ( _me->button() == Qt::RightButton && m_editMode == DRAW ) || @@ -739,7 +739,7 @@ void automationEditor::mousePressEvent( QMouseEvent * _me ) if( it != time_map.end() ) { m_pattern->removeValue( -it.key() ); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } } else if( _me->button() == Qt::LeftButton && @@ -773,7 +773,7 @@ void automationEditor::mousePressEvent( QMouseEvent * _me ) m_action = MOVE_SELECTION; - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } else if( _me->button() == Qt::RightButton && m_editMode == MOVE ) @@ -849,7 +849,7 @@ void automationEditor::mouseMoveEvent( QMouseEvent * _me ) level ); } - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } else if( _me->buttons() & Qt::NoButton && m_editMode == DRAW ) @@ -1533,10 +1533,9 @@ void automationEditor::resizeEvent( QResizeEvent * ) m_topBottomScroll->setValue( m_scroll_level ); - if( engine::getSongEditor() ) + if( engine::getSong() ) { - engine::getSongEditor()->getPlayPos( - songEditor::PLAY_AUTOMATION_PATTERN + engine::getSong()->getPlayPos( song::Mode_PlayAutomationPattern ).m_timeLine->setFixedWidth( width() ); } m_toolBar->setFixedWidth( width() ); @@ -1614,7 +1613,7 @@ int automationEditor::getLevel( int _y ) inline bool automationEditor::inBBEditor( void ) { return( m_pattern->getTrack()->getTrackContainer() - == engine::getBBEditor() ); + == engine::getBBTrackContainer() ); } @@ -1629,23 +1628,22 @@ void automationEditor::play( void ) if( !m_pattern->getTrack() ) { - if( engine::getSongEditor()->playMode() != - songEditor::PLAY_PATTERN ) + if( engine::getSong()->playMode() != song::Mode_PlayPattern ) { - engine::getSongEditor()->stop(); - engine::getSongEditor()->playPattern( (pattern *) + engine::getSong()->stop(); + engine::getSong()->playPattern( (pattern *) engine::getPianoRoll()->currentPattern() ); m_playButton->setIcon( embed::getIconPixmap( "pause" ) ); } - else if( engine::getSongEditor()->playing() ) + else if( engine::getSong()->playing() ) { - engine::getSongEditor()->pause(); + engine::getSong()->pause(); m_playButton->setIcon( embed::getIconPixmap( "play" ) ); } - else if( engine::getSongEditor()->paused() ) + else if( engine::getSong()->paused() ) { - engine::getSongEditor()->resumeFromPause(); + engine::getSong()->resumeFromPause(); m_playButton->setIcon( embed::getIconPixmap( "pause" ) ); } @@ -1653,13 +1651,13 @@ void automationEditor::play( void ) { m_playButton->setIcon( embed::getIconPixmap( "pause" ) ); - engine::getSongEditor()->playPattern( (pattern *) + engine::getSong()->playPattern( (pattern *) engine::getPianoRoll()->currentPattern() ); } } else if( inBBEditor() ) { - if( engine::getSongEditor()->playing() ) + if( engine::getSong()->playing() ) { m_playButton->setIcon( embed::getIconPixmap( "play" ) ); } @@ -1668,18 +1666,18 @@ void automationEditor::play( void ) m_playButton->setIcon( embed::getIconPixmap( "pause" ) ); } - engine::getBBEditor()->play(); + engine::getBBTrackContainer()->play(); } else { - if( engine::getSongEditor()->playing() ) + if( engine::getSong()->playing() ) { - engine::getSongEditor()->pause(); + engine::getSong()->pause(); m_playButton->setIcon( embed::getIconPixmap( "play" ) ); } - else if( engine::getSongEditor()->paused() ) + else if( engine::getSong()->paused() ) { - engine::getSongEditor()->resumeFromPause(); + engine::getSong()->resumeFromPause(); m_playButton->setIcon( embed::getIconPixmap( "pause" ) ); } @@ -1687,7 +1685,7 @@ void automationEditor::play( void ) { m_playButton->setIcon( embed::getIconPixmap( "pause" ) ); - engine::getSongEditor()->play(); + engine::getSong()->play(); } } } @@ -1703,11 +1701,11 @@ void automationEditor::stop( void ) } if( m_pattern->getTrack() && inBBEditor() ) { - engine::getBBEditor()->stop(); + engine::getBBTrackContainer()->stop(); } else { - engine::getSongEditor()->stop(); + engine::getSong()->stop(); } m_playButton->setIcon( embed::getIconPixmap( "play" ) ); m_playButton->update(); @@ -1901,7 +1899,7 @@ void automationEditor::cutSelectedValues( void ) if( !selected_values.isEmpty() ) { - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); for( timeMap::iterator it = selected_values.begin(); it != selected_values.end(); ++it ) @@ -1936,7 +1934,7 @@ void automationEditor::pasteValues( void ) // we only have to do the following lines if we pasted at // least one value... - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); update(); engine::getSongEditor()->update(); } @@ -1965,7 +1963,7 @@ void automationEditor::deleteSelectedValues( void ) if( update_after_delete == TRUE ) { - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); update(); engine::getSongEditor()->update(); } @@ -1976,9 +1974,9 @@ void automationEditor::deleteSelectedValues( void ) void automationEditor::updatePosition( const midiTime & _t ) { - if( ( engine::getSongEditor()->playing() && - engine::getSongEditor()->playMode() == - songEditor::PLAY_AUTOMATION_PATTERN ) || + if( ( engine::getSong()->playing() && + engine::getSong()->playMode() == + song::Mode_PlayAutomationPattern ) || m_scrollBack == TRUE ) { const int w = width() - VALUES_WIDTH; diff --git a/src/core/automation_pattern.cpp b/src/core/automation_pattern.cpp index 3ec6033e5..ead23b6a7 100644 --- a/src/core/automation_pattern.cpp +++ b/src/core/automation_pattern.cpp @@ -4,7 +4,7 @@ * automation_pattern.cpp - implementation of class automationPattern which * holds dynamic values * - * Copyright (c) 2006-2007 Javier Serrano Polo + * Copyright (c) 2006-2008 Javier Serrano Polo * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -31,6 +31,7 @@ #include "automation_pattern.h" #include "automation_editor.h" +#include "automatable_model_templates.h" #include "engine.h" #include "level_object.h" #include "note.h" diff --git a/src/core/bb_editor.cpp b/src/core/bb_editor.cpp index 5f758358e..38138a446 100644 --- a/src/core/bb_editor.cpp +++ b/src/core/bb_editor.cpp @@ -40,17 +40,280 @@ #include "engine.h" #include "main_window.h" #include "name_label.h" -#include "song_editor.h" +#include "song.h" #include "templates.h" #include "tool_button.h" #include "tooltip.h" #include "track_container.h" +bbTrackContainer::bbTrackContainer( void ) : + trackContainer(), + m_bbComboBoxModel( this ) +{ + connect( &m_bbComboBoxModel, SIGNAL( dataChanged() ), + this, SLOT( currentBBChanged() ), + Qt::QueuedConnection ); + // we *always* want to receive updates even in case BB actually did + // not change upon setCurrentBB()-call + connect( &m_bbComboBoxModel, SIGNAL( dataUnchanged() ), + this, SLOT( currentBBChanged() ), + Qt::QueuedConnection ); +} -bbEditor::bbEditor( void ) : - trackContainer() + + +bbTrackContainer::~bbTrackContainer() +{ +} + + + + +bool bbTrackContainer::play( midiTime _start, fpp_t _frames, + f_cnt_t _offset, + Sint16 _tco_num ) +{ + bool played_a_note = FALSE; + if( lengthOfBB( _tco_num ) <= 0 ) + { + return( played_a_note ); + } + + _start = ( _start.getTact() % lengthOfBB( _tco_num ) ) * 64 + + _start.getTact64th(); + QList tl = tracks(); + for( int i = 0; i < tl.size(); ++i ) + { + if( tl[i]->play( _start, _frames, _offset, _tco_num ) == TRUE ) + { + played_a_note = TRUE; + } + } + + return( played_a_note ); +} + + + +/* +void bbTrackContainer::saveSettings( QDomDocument & _doc, QDomElement & _parent ) +{ + trackContainer::saveSettings( _doc, _parent ); +} + + + + +void bbTrackContainer::loadSettings( const QDomElement & _this ) +{ + trackContainer::loadSettings( _this ); +} +*/ + + + +void bbTrackContainer::updateAfterTrackAdd( void ) +{ + // make sure, new track(s) have TCOs for every beat/bassline + for( int i = 0; i < tMax( 1, numOfBBs() ); ++i ) + { + createTCOsForBB( i ); + } +} + + + + +tact bbTrackContainer::lengthOfBB( int _bb ) +{ + midiTime max_length; + + QList tl = tracks(); + for( int i = 0; i < tl.size(); ++i ) + { + trackContentObject * tco = tl[i]->getTCO( _bb ); + max_length = tMax( max_length, tco->length() ); + } + if( max_length.getTact64th() == 0 ) + { + return( max_length.getTact() ); + } + + return( max_length.getTact() + 1 ); +} + + + + +int bbTrackContainer::numOfBBs( void ) const +{ + return( engine::getSong()->countTracks( track::BBTrack ) ); +} + + + + +void bbTrackContainer::removeBB( int _bb ) +{ + QList tl = tracks(); + for( int i = 0; i < tl.size(); ++i ) + { + delete tl[i]->getTCO( _bb ); + tl[i]->removeTact( _bb * 64 ); + } + if( _bb <= currentBB() ) + { + setCurrentBB( tMax( currentBB() - 1, 0 ) ); + } +} + + + + +void bbTrackContainer::swapBB( int _bb1, int _bb2 ) +{ + QList tl = tracks(); + for( int i = 0; i < tl.size(); ++i ) + { + tl[i]->swapPositionOfTCOs( _bb1, _bb2 ); + } + updateComboBox(); +} + + + + +void bbTrackContainer::updateBBTrack( trackContentObject * _tco ) +{ + bbTrack * t = bbTrack::findBBTrack( _tco->startPosition() / 64 ); + if( t != NULL ) + { + t->dataChanged(); + //t->getTrackContentWidget()->update(); + } +} + + + + +void bbTrackContainer::play( void ) +{ + if( engine::getSong()->playing() ) + { + if( engine::getSong()->playMode() != song::Mode_PlayBB ) + { + engine::getSong()->stop(); + engine::getSong()->playBB(); + } + else + { + engine::getSong()->pause(); + } + } + else if( engine::getSong()->paused() ) + { + engine::getSong()->resumeFromPause(); + } + else + { + engine::getSong()->playBB(); + } + +} + + + + +void bbTrackContainer::stop( void ) +{ + engine::getSong()->stop(); +} + + + + +void bbTrackContainer::updateComboBox( void ) +{ + const int cur_bb = currentBB(); + + m_bbComboBoxModel.clear(); + + for( int i = 0; i < numOfBBs(); ++i ) + { + bbTrack * bbt = bbTrack::findBBTrack( i ); + m_bbComboBoxModel.addItem( bbt->name(), + bbt->pixmap() ? new QPixmap( *bbt->pixmap() ) + : NULL ); + } + setCurrentBB( cur_bb ); +} + + + + +void bbTrackContainer::currentBBChanged( void ) +{ + // first make sure, all channels have a TCO at current BB + createTCOsForBB( currentBB() ); + + // now update all track-labels (the current one has to become white, + // the others green) + for( int i = 0; i < numOfBBs(); ++i ) + { + bbTrack::findBBTrack( i )->dataChanged(); +//trackLabel()->update(); + } + + //emit dataChanged(); + //emit positionChanged( NULL ); +} + + + + +void bbTrackContainer::createTCOsForBB( int _bb ) +{ + if( numOfBBs() == 0 || engine::getSong()->isLoadingProject() ) + { + return; + } + + QList tl = tracks(); + for( int i = 0; i < tl.size(); ++i ) + { + while( tl[i]->numOfTCOs() < _bb + 1 ) + { + midiTime position = midiTime( tl[i]->numOfTCOs(), 0 ); + trackContentObject * tco = tl[i]->addTCO( + tl[i]->createTCO( position ) ); + tco->movePosition( position ); + tco->changeLength( midiTime( 1, 0 ) ); + } + } +} + + + + + + + + + + + + + + + + + + +bbEditor::bbEditor( bbTrackContainer * _tc ) : + trackContainerView( _tc ), + m_bbtc( _tc ) { // create toolbar m_toolBar = new QWidget; @@ -85,7 +348,7 @@ bbEditor::bbEditor( void ) : toolButton * add_bb_track = new toolButton( embed::getIconPixmap( "add_bb_track" ), tr( "Add beat/bassline" ), - engine::getSongEditor(), SLOT( addBBTrack() ), + engine::getSong(), SLOT( addBBTrack() ), m_toolBar ); @@ -102,15 +365,7 @@ bbEditor::bbEditor( void ) : m_bbComboBox = new comboBox( m_toolBar ); m_bbComboBox->setFixedSize( 200, 22 ); - - m_bbComboBoxModel = new comboBoxModel( /* this */ ); - m_bbComboBox->setModel( m_bbComboBoxModel ); - connect( m_bbComboBoxModel, SIGNAL( dataChanged() ), - this, SLOT( currentBBChanged() ) ); - // we *always* want to receive updates even in case BB actually did - // not change upon setCurrentBB()-call - connect( m_bbComboBoxModel, SIGNAL( dataUnchanged() ), - this, SLOT( currentBBChanged() ) ); + m_bbComboBox->setModel( &_tc->m_bbComboBoxModel ); tb_layout->addSpacing( 5 ); tb_layout->addWidget( m_playButton ); @@ -144,6 +399,12 @@ bbEditor::bbEditor( void ) : } w->show(); + + + setModel( _tc ); + connect( &_tc->m_bbComboBoxModel, SIGNAL( dataChanged() ), + this, SLOT( updatePosition() ), + Qt::QueuedConnection ); } @@ -156,123 +417,66 @@ bbEditor::~bbEditor() -void bbEditor::currentBBChanged( void ) +void bbEditor::removeBBView( int _bb ) { - // first make sure, all channels have a TCO at current BB - createTCOsForBB( currentBB() ); - - realignTracks(); - - // now update all track-labels (the current one has to become white, - // the others green) - for( int i = 0; i < numOfBBs(); ++i ) + QList tl = trackViews(); + for( int i = 0; i < tl.size(); ++i ) { - bbTrack::findBBTrack( i )->trackLabel()->update(); + tl[i]->getTrackContentWidget()->removeTCOView( _bb ); } - - emit positionChanged( NULL ); } -tact bbEditor::lengthOfBB( int _bb ) +void bbEditor::play( void ) { - midiTime max_length; - - QList tl = tracks(); - for( int i = 0; i < tl.size(); ++i ) + if( engine::getSong()->playing() ) { - trackContentObject * tco = tl[i]->getTCO( _bb ); - max_length = tMax( max_length, tco->length() ); - } - if( max_length.getTact64th() == 0 ) - { - return( max_length.getTact() ); - } - - return( max_length.getTact() + 1 ); -} - - - - -bool FASTCALL bbEditor::play( midiTime _start, fpp_t _frames, - f_cnt_t _offset, - Sint16 _tco_num ) -{ - bool played_a_note = FALSE; - if( lengthOfBB( _tco_num ) <= 0 ) - { - return( played_a_note ); - } - - _start = ( _start.getTact() % lengthOfBB( _tco_num ) ) * 64 + - _start.getTact64th(); - QList tl = tracks(); - for( int i = 0; i < tl.size(); ++i ) - { - if( tl[i]->play( _start, _frames, _offset, _tco_num ) == TRUE ) + if( engine::getSong()->playMode() != song::Mode_PlayBB ) { - played_a_note = TRUE; + engine::getSong()->stop(); + engine::getSong()->playBB(); + m_playButton->setIcon( embed::getIconPixmap( + "pause" ) ); + } + else + { + engine::getSong()->pause(); + m_playButton->setIcon( embed::getIconPixmap( + "play" ) ); } } + else if( engine::getSong()->paused() ) + { + engine::getSong()->resumeFromPause(); + m_playButton->setIcon( embed::getIconPixmap( "pause" ) ); + } + else + { + m_playButton->setIcon( embed::getIconPixmap( "pause" ) ); + engine::getSong()->playBB(); + } - return( played_a_note ); } -int bbEditor::numOfBBs( void ) const +void bbEditor::stop( void ) { - return( engine::getSongEditor()->countTracks( track::BB_TRACK ) ); + engine::getSong()->stop(); + m_playButton->setIcon( embed::getIconPixmap( "play" ) ); + m_playButton->update(); } -void bbEditor::removeBB( int _bb ) +void bbEditor::updatePosition( void ) { - QList tl = tracks(); - for( int i = 0; i < tl.size(); ++i ) - { - tl[i]->removeTCO( _bb ); - tl[i]->getTrackContentWidget()->removeTact( _bb * 64 ); - } - if( _bb <= currentBB() ) - { - setCurrentBB( tMax( currentBB() - 1, 0 ) ); - } -} - - - -void bbEditor::updateBBTrack( trackContentObject * _tco ) -{ - bbTrack * t = bbTrack::findBBTrack( _tco->startPosition() / 64 ); - if( t != NULL ) - { - t->getTrackContentWidget()->update(); - } -} - - - - -void bbEditor::updateComboBox( void ) -{ - const int cur_bb = currentBB(); - - m_bbComboBoxModel->clear(); - - for( int i = 0; i < numOfBBs(); ++i ) - { - bbTrack * bbt = bbTrack::findBBTrack( i ); - m_bbComboBoxModel->addItem( bbt->trackLabel()->text(), - new QPixmap( bbt->trackLabel()->pixmap() ) ); - } - setCurrentBB( cur_bb ); + //realignTracks(); + emit positionChanged( m_currentPosition ); } @@ -282,7 +486,7 @@ void bbEditor::keyPressEvent( QKeyEvent * _ke ) { if ( _ke->key() == Qt::Key_Space ) { - if( engine::getSongEditor()->playing() ) + if( engine::getSong()->playing() ) { stop(); } @@ -293,16 +497,16 @@ void bbEditor::keyPressEvent( QKeyEvent * _ke ) } else if ( _ke->key() == Qt::Key_Plus ) { - if( currentBB()+ 1 < numOfBBs() ) + if( m_bbtc->currentBB()+ 1 < m_bbtc->numOfBBs() ) { - setCurrentBB( currentBB() + 1 ); + m_bbtc->setCurrentBB( m_bbtc->currentBB() + 1 ); } } else if ( _ke->key() == Qt::Key_Minus ) { - if( currentBB() > 0 ) + if( m_bbtc->currentBB() > 0 ) { - setCurrentBB( currentBB() - 1 ); + m_bbtc->setCurrentBB( m_bbtc->currentBB() - 1 ); } } else @@ -316,116 +520,6 @@ void bbEditor::keyPressEvent( QKeyEvent * _ke ) -void bbEditor::play( void ) -{ - if( engine::getSongEditor()->playing() ) - { - if( engine::getSongEditor()->playMode() != songEditor::PLAY_BB ) - { - engine::getSongEditor()->stop(); - engine::getSongEditor()->playBB(); - m_playButton->setIcon( embed::getIconPixmap( - "pause" ) ); - } - else - { - engine::getSongEditor()->pause(); - m_playButton->setIcon( embed::getIconPixmap( - "play" ) ); - } - } - else if( engine::getSongEditor()->paused() ) - { - engine::getSongEditor()->resumeFromPause(); - m_playButton->setIcon( embed::getIconPixmap( "pause" ) ); - } - else - { - m_playButton->setIcon( embed::getIconPixmap( "pause" ) ); - engine::getSongEditor()->playBB(); - } - -} - - - - -void bbEditor::stop( void ) -{ - engine::getSongEditor()->stop(); - m_playButton->setIcon( embed::getIconPixmap( "play" ) ); - m_playButton->update(); -} - - - - - - -void bbEditor::saveSettings( QDomDocument & _doc, QDomElement & _parent ) -{ - trackContainer::saveSettings( _doc, _parent ); -} - - - - -void bbEditor::loadSettings( const QDomElement & _this ) -{ - trackContainer::loadSettings( _this ); -} - - - - -void bbEditor::updateAfterTrackAdd( void ) -{ - // make sure, new track(s) have TCOs for every beat/bassline - for( int i = 0; i < tMax( 1, numOfBBs() ); ++i ) - { - createTCOsForBB( i ); - } -} - - - - -void bbEditor::createTCOsForBB( int _bb ) -{ - if( numOfBBs() == 0 ) - { - return; - } - - QList tl = tracks(); - for( int i = 0; i < tl.size(); ++i ) - { - while( tl[i]->numOfTCOs() < _bb + 1 ) - { - midiTime position = midiTime( tl[i]->numOfTCOs(), 0 ); - trackContentObject * tco = tl[i]->addTCO( - tl[i]->createTCO( position ) ); - tco->movePosition( position ); - tco->changeLength( midiTime( 1, 0 ) ); - } - } -} - - - - -void bbEditor::swapBB( int _bb1, int _bb2 ) -{ - QList tl = tracks(); - for( int i = 0; i < tl.size(); ++i ) - { - tl[i]->swapPositionOfTCOs( _bb1, _bb2 ); - } - updateComboBox(); -} - - - #include "bb_editor.moc" diff --git a/src/core/engine.cpp b/src/core/engine.cpp index 919571e89..fbfd03d3c 100644 --- a/src/core/engine.cpp +++ b/src/core/engine.cpp @@ -38,12 +38,15 @@ #include "project_journal.h" #include "project_notes.h" #include "song_editor.h" +#include "song.h" bool engine::s_hasGUI = TRUE; float engine::s_framesPerTact64th; mixer * engine::s_mixer; mainWindow * engine::s_mainWindow; +bbTrackContainer * engine::s_bbTrackContainer; +song * engine::s_song; songEditor * engine::s_songEditor; automationEditor * engine::s_automationEditor; bbEditor * engine::s_bbEditor; @@ -63,11 +66,14 @@ void engine::init( const bool _has_gui ) loadExtensions(); s_projectJournal = new projectJournal; - s_mainWindow = new mainWindow; s_mixer = new mixer; - s_songEditor = new songEditor; + s_song = new song; + s_bbTrackContainer = new bbTrackContainer; + + s_mainWindow = new mainWindow; + s_songEditor = new songEditor( s_song ); s_projectNotes = new projectNotes; - s_bbEditor = new bbEditor; + s_bbEditor = new bbEditor( s_bbTrackContainer ); s_pianoRoll = new pianoRoll; s_automationEditor = new automationEditor; s_ladspaManager = new ladspa2LMMS; @@ -120,7 +126,7 @@ void engine::destroy( void ) void engine::updateFramesPerTact64th( void ) { s_framesPerTact64th = s_mixer->sampleRate() * 60.0f * BEATS_PER_TACT - / 64.0f / s_songEditor->getTempo(); + / 64.0f / s_song->getTempo(); } diff --git a/src/core/envelope_and_lfo_parameters.cpp b/src/core/envelope_and_lfo_parameters.cpp index 9af4fef9c..eaddca887 100644 --- a/src/core/envelope_and_lfo_parameters.cpp +++ b/src/core/envelope_and_lfo_parameters.cpp @@ -1,8 +1,7 @@ #ifndef SINGLE_SOURCE_COMPILE /* - * envelope_and_lfo_widget.cpp - widget which is m_used by envelope/lfo/filter- - * tab of channel-window + * envelope_and_lfo_parameters.cpp - class envelopeAndLFOParameters * * Copyright (c) 2004-2008 Tobias Doerffel * @@ -29,25 +28,12 @@ #include "envelope_and_lfo_parameters.h" -#include -#include #include - #include "debug.h" -#include "embed.h" #include "engine.h" -#include "gui_templates.h" -#include "knob.h" -#include "led_checkbox.h" #include "mmp.h" #include "oscillator.h" -#include "pixmap_button.h" -#include "song_editor.h" -#include "string_pair_drag.h" -#include "tempo_sync_knob.h" -#include "text_float.h" -#include "tooltip.h" #include "automatable_model_templates.h" @@ -58,383 +44,99 @@ const float SECS_PER_ENV_SEGMENT = 5.0f; const float SECS_PER_LFO_OSCILLATION = 20.0f; -const int ENV_GRAPH_X = 6; -const int ENV_GRAPH_Y = 6; - -const int ENV_KNOBS_Y = 43; -const int ENV_KNOBS_LBL_Y = ENV_KNOBS_Y+35; -const int KNOB_X_SPACING = 32; -const int PREDELAY_KNOB_X = 6; -const int ATTACK_KNOB_X = PREDELAY_KNOB_X+KNOB_X_SPACING; -const int HOLD_KNOB_X = ATTACK_KNOB_X+KNOB_X_SPACING; -const int DECAY_KNOB_X = HOLD_KNOB_X+KNOB_X_SPACING; -const int SUSTAIN_KNOB_X = DECAY_KNOB_X+KNOB_X_SPACING; -const int RELEASE_KNOB_X = SUSTAIN_KNOB_X+KNOB_X_SPACING; -const int AMOUNT_KNOB_X = RELEASE_KNOB_X+KNOB_X_SPACING; - -const float TIME_UNIT_WIDTH = 36.0; - - -const int LFO_GRAPH_X = 6; -const int LFO_GRAPH_Y = ENV_KNOBS_LBL_Y+14; -const int LFO_KNOB_Y = LFO_GRAPH_Y-2; -const int LFO_PREDELAY_KNOB_X = LFO_GRAPH_X + 100; -const int LFO_ATTACK_KNOB_X = LFO_PREDELAY_KNOB_X+KNOB_X_SPACING; -const int LFO_SPEED_KNOB_X = LFO_ATTACK_KNOB_X+KNOB_X_SPACING; -const int LFO_AMOUNT_KNOB_X = LFO_SPEED_KNOB_X+KNOB_X_SPACING; -const int LFO_SHAPES_X = LFO_GRAPH_X;//PREDELAY_KNOB_X; -const int LFO_SHAPES_Y = LFO_GRAPH_Y + 50; - - -QPixmap * envelopeAndLFOWidget::s_envGraph = NULL; -QPixmap * envelopeAndLFOWidget::s_lfoGraph = NULL; - -QVector envelopeAndLFOWidget::s_EaLWidgets; +QVector envelopeAndLFOParameters::s_EaLParametersInstances; -envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount, - QWidget * _parent, - track * _track ) : - QWidget( _parent ), +envelopeAndLFOParameters::envelopeAndLFOParameters( + float _value_for_zero_amount, + track * _track, + model * _parent ) : + model( _parent ), m_used( FALSE ), - m_predelayModel(), - m_attackModel(), - m_holdModel(), - m_decayModel(), - m_sustainModel(), - m_releaseModel(), - m_amountModel(), - m_lfoPredelayModel(), - m_lfoAttackModel(), - m_lfoSpeedModel(), - m_lfoAmountModel(), - m_lfoWaveModel(), - m_x100Model( FALSE, FALSE, TRUE ), - m_controlEnvAmountModel( FALSE, FALSE, TRUE ), + m_predelayModel( 0.0, 0.0, 1.0, 0.001, this ), + m_attackModel( 0.0, 0.0, 1.0, 0.001, this ), + m_holdModel( 0.5, 0.0, 1.0, 0.001, this ), + m_decayModel( 0.5, 0.0, 1.0, 0.001, this ), + m_sustainModel( 0.5, 0.0, 1.0, 0.001, this ), + m_releaseModel( 0.1, 0.0, 1.0, 0.001, this ), + m_amountModel( 0.0, -1.0, 1.0, 0.005, this ), m_valueForZeroAmount( _value_for_zero_amount ), m_pahdEnv( NULL ), m_rEnv( NULL ), + m_lfoPredelayModel( 0.0, 0.0, 1.0, 0.001, this ), + m_lfoAttackModel( 0.0, 0.0, 1.0, 0.001, this ), + m_lfoSpeedModel( 0.1, 0.01, 1.0, 0.0001, this ), + m_lfoAmountModel( 0.0, -1.0, 1.0, 0.005, this ), + m_lfoWaveModel( SineWave, 0, NumLfoShapes, 1, this ), + m_x100Model( FALSE, this ), + m_controlEnvAmountModel( FALSE, this ), m_lfoFrame( 0 ), m_lfoAmountIsZero( FALSE ), m_lfoShapeData( NULL ) { - if( s_envGraph == NULL ) - { - s_envGraph = new QPixmap( embed::getIconPixmap( - "envelope_graph" ) ); - } - if( s_lfoGraph == NULL ) - { - s_lfoGraph = new QPixmap( embed::getIconPixmap( "lfo_graph" ) ); - } + s_EaLParametersInstances.push_back( this ); - s_EaLWidgets.push_back( this ); m_predelayModel.setTrack( _track ); - m_predelayModel.setRange( 0.0, 1.0, 0.001 ); - m_predelayModel.setInitValue( 0.0 ); - m_predelayKnob = new knob( knobBright_26, this, tr( "Predelay-time" ) ); - m_predelayKnob->setModel( &m_predelayModel ); - m_predelayKnob->setLabel( tr( "DEL" ) ); - m_predelayKnob->move( PREDELAY_KNOB_X, ENV_KNOBS_Y ); - m_predelayKnob->setHintText( tr( "Predelay:" ) + " ", "" ); - m_predelayKnob->setWhatsThis( - tr( "Use this knob for setting predelay of the current " - "envelope. The bigger this value the longer the time " - "before start of actual envelope." ) ); + m_attackModel.setTrack( _track ); + m_holdModel.setTrack( _track ); + m_decayModel.setTrack( _track ); + m_sustainModel.setTrack( _track ); + m_releaseModel.setTrack( _track ); + m_amountModel.setTrack( _track ); + + m_lfoPredelayModel.setTrack( _track ); + m_lfoAttackModel.setTrack( _track ); + m_lfoSpeedModel.setTrack( _track ); + m_lfoAmountModel.setTrack( _track ); + m_lfoWaveModel.setTrack( _track ); + m_x100Model.setTrack( _track ); + m_controlEnvAmountModel.setTrack( _track ); + + connect( &m_predelayModel, SIGNAL( dataChanged() ), this, SLOT( updateSampleVars() ) ); - - - m_attackModel.setTrack( _track ); - m_attackModel.setRange( 0.0, 1.0, 0.001 ); - m_attackModel.setInitValue( 0.0 ); - m_attackKnob = new knob( knobBright_26, this, tr( "Attack-time" ) ); - m_attackKnob->setModel( &m_attackModel ); - m_attackKnob->setLabel( tr( "ATT" ) ); - m_attackKnob->move( ATTACK_KNOB_X, ENV_KNOBS_Y ); - m_attackKnob->setHintText( tr( "Attack:" )+" ", "" ); - m_attackKnob->setWhatsThis( - tr( "Use this knob for setting attack-time of the current " - "envelope. The bigger this value the longer the " - "envelope needs to increase to attack-level. " - "Choose a small value for instruments like pianos " - "and a big value for strings." ) ); connect( &m_attackModel, SIGNAL( dataChanged() ), this, SLOT( updateSampleVars() ) ); - - m_holdModel.setTrack( _track ); - m_holdModel.setRange( 0.0, 1.0, 0.001 ); - m_holdModel.setInitValue( 0.5 ); - m_holdKnob = new knob( knobBright_26, this, tr( "Hold-time" ) ); - m_holdKnob->setModel( &m_holdModel ); - m_holdKnob->setLabel( tr( "HOLD" ) ); - m_holdKnob->move( HOLD_KNOB_X, ENV_KNOBS_Y ); - m_holdKnob->setHintText( tr( "Hold:" ) + " ", "" ); - m_holdKnob->setWhatsThis( - tr( "Use this knob for setting hold-time of the current " - "envelope. The bigger this value the longer the " - "envelope holds attack-level before it begins to " - "decrease to sustain-level." ) ); connect( &m_holdModel, SIGNAL( dataChanged() ), this, SLOT( updateSampleVars() ) ); - - - m_decayModel.setTrack( _track ); - m_decayModel.setRange( 0.0, 1.0, 0.001 ); - m_decayModel.setInitValue( 0.5 ); - m_decayKnob = new knob( knobBright_26, this, tr( "Decay-time" ) ); - m_decayKnob->setModel( &m_decayModel ); - m_decayKnob->setLabel( tr( "DEC" ) ); - m_decayKnob->move( DECAY_KNOB_X, ENV_KNOBS_Y ); - m_decayKnob->setHintText( tr( "Decay:" ) + " ", "" ); - m_decayKnob->setWhatsThis( - tr( "Use this knob for setting decay-time of the current " - "envelope. The bigger this value the longer the " - "envelope needs to decrease from attack-level to " - "sustain-level. Choose a small value for instruments " - "like pianos." ) ); connect( &m_decayModel, SIGNAL( dataChanged() ), this, SLOT( updateSampleVars() ) ); - - - m_sustainModel.setTrack( _track ); - m_sustainModel.setRange( 0.0, 1.0, 0.001 ); - m_sustainModel.setInitValue( 0.5 ); - m_sustainKnob = new knob( knobBright_26, this, tr( "Sustain-level" ) ); - m_sustainKnob->setModel( &m_sustainModel ); - m_sustainKnob->setLabel( tr( "SUST" ) ); - m_sustainKnob->move( SUSTAIN_KNOB_X, ENV_KNOBS_Y ); - m_sustainKnob->setHintText( tr( "Sustain:" ) + " ", "" ); - m_sustainKnob->setWhatsThis( - tr( "Use this knob for setting sustain-level of the current " - "envelope. The bigger this value the higher the level " - "on which the envelope stays before going down to " - "zero." ) ); connect( &m_sustainModel, SIGNAL( dataChanged() ), this, SLOT( updateSampleVars() ) ); - - - - m_releaseModel.setTrack( _track ); - m_releaseModel.setRange( 0.0, 1.0, 0.001 ); - m_releaseModel.setInitValue( 0.1 ); - m_releaseKnob = new knob( knobBright_26, this, tr( "Release-time" ) ); - m_releaseKnob->setModel( &m_releaseModel ); - m_releaseKnob->setLabel( tr( "REL" ) ); - m_releaseKnob->move( RELEASE_KNOB_X, ENV_KNOBS_Y ); - m_releaseKnob->setHintText( tr( "Release:" ) + " ", "" ); - m_releaseKnob->setWhatsThis( - tr( "Use this knob for setting release-time of the current " - "envelope. The bigger this value the longer the " - "envelope needs to decrease from sustain-level to " - "zero. Choose a big value for soft instruments like " - "strings." ) ); connect( &m_releaseModel, SIGNAL( dataChanged() ), this, SLOT( updateSampleVars() ) ); - - - m_amountModel.setTrack( _track ); - m_amountModel.setRange( -1.0, 1.0, 0.005 ); - m_amountModel.setInitValue( 0.0 ); - m_amountKnob = new knob( knobBright_26, this, - tr( "Modulation amount" ) ); - m_amountKnob->setModel( &m_amountModel ); - m_amountKnob->setLabel( tr( "AMT" ) ); - m_amountKnob->move( AMOUNT_KNOB_X, ENV_GRAPH_Y ); - m_amountKnob->setHintText( tr( "Modulation amount:" ) + " ", "" ); - m_amountKnob->setWhatsThis( - tr( "Use this knob for setting modulation amount of the " - "current envelope. The bigger this value the more the " - "according size (e.g. volume or cutoff-frequency) " - "will be influenced by this envelope." ) ); connect( &m_amountModel, SIGNAL( dataChanged() ), this, SLOT( updateSampleVars() ) ); - - - - m_lfoPredelayModel.setTrack( _track ); - m_lfoPredelayModel.setRange( 0.0, 1.0, 0.001 ); - m_lfoPredelayModel.setInitValue( 0.0 ); - m_lfoPredelayKnob = new knob( knobBright_26, this, - tr( "LFO-predelay-time" ) ); - m_lfoPredelayKnob->setModel( &m_lfoPredelayModel ); - m_lfoPredelayKnob->setLabel( tr( "DEL" ) ); - m_lfoPredelayKnob->move( LFO_PREDELAY_KNOB_X, LFO_KNOB_Y ); - m_lfoPredelayKnob->setHintText( tr( "LFO-predelay:" ) + " ", "" ); - m_lfoPredelayKnob->setWhatsThis( - tr( "Use this knob for setting predelay-time of the current " - "LFO. The bigger this value the the time until the " - "LFO starts to oscillate." ) ); connect( &m_lfoPredelayModel, SIGNAL( dataChanged() ), this, SLOT( updateSampleVars() ) ); - - - m_lfoAttackModel.setTrack( _track ); - m_lfoAttackModel.setRange( 0.0, 1.0, 0.001 ); - m_lfoAttackModel.setInitValue( 0.0 ); - m_lfoAttackKnob = new knob( knobBright_26, this, - tr( "LFO-attack-time" ) ); - m_lfoAttackKnob->setModel( &m_lfoAttackModel ); - m_lfoAttackKnob->setLabel( tr( "ATT" ) ); - m_lfoAttackKnob->move( LFO_ATTACK_KNOB_X, LFO_KNOB_Y ); - m_lfoAttackKnob->setHintText( tr( "LFO-attack:" ) + " ", "" ); - m_lfoAttackKnob->setWhatsThis( - tr( "Use this knob for setting attack-time of the current LFO. " - "The bigger this value the longer the LFO needs to " - "increase its amplitude to maximum." ) ); connect( &m_lfoAttackModel, SIGNAL( dataChanged() ), this, SLOT( updateSampleVars() ) ); - - - m_lfoSpeedModel.setTrack( _track ); - m_lfoSpeedModel.setRange( 0.01, 1.0, 0.0001 ); - m_lfoSpeedModel.setInitValue( 0.1 ); - m_lfoSpeedKnob = new tempoSyncKnob( knobBright_26, this, - tr( "LFO-speed" ), 20000.0 ); - m_lfoSpeedKnob->setModel( &m_lfoSpeedModel ); - m_lfoSpeedKnob->setLabel( tr( "SPD" ) ); - m_lfoSpeedKnob->move( LFO_SPEED_KNOB_X, LFO_KNOB_Y ); - m_lfoSpeedKnob->setHintText( tr( "LFO-speed:" ) + " ", "" ); - m_lfoSpeedKnob->setWhatsThis( - tr( "Use this knob for setting speed of the current LFO. The " - "bigger this value the faster the LFO oscillates and " - "the faster will be your effect." ) ); connect( &m_lfoSpeedModel, SIGNAL( dataChanged() ), this, SLOT( updateSampleVars() ) ); - - - m_lfoAmountModel.setTrack( _track ); - m_lfoAmountModel.setRange( -1.0, 1.0, 0.005 ); - m_lfoAmountModel.setInitValue( 0.0 ); - m_lfoAmountKnob = new knob( knobBright_26, this, - tr( "LFO-modulation-amount" ) ); - m_lfoAmountKnob->setModel( &m_lfoAmountModel ); - m_lfoAmountKnob->setLabel( tr( "AMT" ) ); - m_lfoAmountKnob->move( LFO_AMOUNT_KNOB_X, LFO_KNOB_Y ); - m_lfoAmountKnob->setHintText( tr( "Modulation amount:" ) + " ", "" ); - m_lfoAmountKnob->setWhatsThis( - tr( "Use this knob for setting modulation amount of the " - "current LFO. The bigger this value the more the " - "selected size (e.g. volume or cutoff-frequency) will " - "be influenced by this LFO." ) ); connect( &m_lfoAmountModel, SIGNAL( dataChanged() ), this, SLOT( updateSampleVars() ) ); - - - pixmapButton * sin_lfo_btn = new pixmapButton( this, NULL ); - sin_lfo_btn->move( LFO_SHAPES_X, LFO_SHAPES_Y ); - sin_lfo_btn->setActiveGraphic( embed::getIconPixmap( - "sin_wave_active" ) ); - sin_lfo_btn->setInactiveGraphic( embed::getIconPixmap( - "sin_wave_inactive" ) ); - sin_lfo_btn->setWhatsThis( - tr( "Click here if you want a sine-wave for current " - "oscillator." ) ); - - pixmapButton * triangle_lfo_btn = new pixmapButton( this, NULL ); - triangle_lfo_btn->move( LFO_SHAPES_X+15, LFO_SHAPES_Y ); - triangle_lfo_btn->setActiveGraphic( embed::getIconPixmap( - "triangle_wave_active" ) ); - triangle_lfo_btn->setInactiveGraphic( embed::getIconPixmap( - "triangle_wave_inactive" ) ); - triangle_lfo_btn->setWhatsThis( - tr( "Click here if you want a triangle-wave for current " - "oscillator." ) ); - - pixmapButton * saw_lfo_btn = new pixmapButton( this, NULL ); - saw_lfo_btn->move( LFO_SHAPES_X+30, LFO_SHAPES_Y ); - saw_lfo_btn->setActiveGraphic( embed::getIconPixmap( - "saw_wave_active" ) ); - saw_lfo_btn->setInactiveGraphic( embed::getIconPixmap( - "saw_wave_inactive" ) ); - saw_lfo_btn->setWhatsThis( - tr( "Click here if you want a saw-wave for current " - "oscillator." ) ); - - pixmapButton * sqr_lfo_btn = new pixmapButton( this, NULL ); - sqr_lfo_btn->move( LFO_SHAPES_X+45, LFO_SHAPES_Y ); - sqr_lfo_btn->setActiveGraphic( embed::getIconPixmap( - "square_wave_active" ) ); - sqr_lfo_btn->setInactiveGraphic( embed::getIconPixmap( - "square_wave_inactive" ) ); - sqr_lfo_btn->setWhatsThis( - tr( "Click here if you want a square-wave for current " - "oscillator." ) ); - - m_userLfoBtn = new pixmapButton( this, NULL ); - m_userLfoBtn->move( LFO_SHAPES_X+60, LFO_SHAPES_Y ); - m_userLfoBtn->setActiveGraphic( embed::getIconPixmap( - "usr_wave_active" ) ); - m_userLfoBtn->setInactiveGraphic( embed::getIconPixmap( - "usr_wave_inactive" ) ); - m_userLfoBtn->setWhatsThis( - tr( "Click here if you want a user-defined wave for current " - "oscillator. Afterwards drag an according sample-" - "file into LFO-graph." ) ); - - connect( m_userLfoBtn, SIGNAL( toggled( bool ) ), - this, SLOT( lfoUserWaveChanged() ) ); - - m_lfoWaveBtnGrp = new automatableButtonGroup( this, - tr( "LFO wave shape" ) ); - m_lfoWaveBtnGrp->setModel( &m_lfoWaveModel ); - m_lfoWaveBtnGrp->addButton( sin_lfo_btn ); - m_lfoWaveBtnGrp->addButton( triangle_lfo_btn ); - m_lfoWaveBtnGrp->addButton( saw_lfo_btn ); - m_lfoWaveBtnGrp->addButton( sqr_lfo_btn ); - m_lfoWaveBtnGrp->addButton( m_userLfoBtn ); - - m_lfoWaveModel.setTrack( _track ); - m_lfoWaveModel.setInitValue( SIN ); - connect( &m_lfoWaveModel, SIGNAL( dataChanged() ), this, SLOT( updateSampleVars() ) ); - - m_x100Model.setTrack( _track ); - m_x100Cb = new ledCheckBox( tr( "FREQ x 100" ), this, - tr( "Freq x 100" ) ); - m_x100Cb->setModel( &m_x100Model ); - m_x100Cb->setFont( pointSize<6>( m_x100Cb->font() ) ); - m_x100Cb->move( LFO_PREDELAY_KNOB_X, LFO_GRAPH_Y + 36 ); - m_x100Cb->setWhatsThis( - tr( "Click here if the frequency of this LFO should be " - "multiplied with 100." ) ); - toolTip::add( m_x100Cb, tr( "multiply LFO-frequency with 100" ) ); connect( &m_x100Model, SIGNAL( dataChanged() ), this, SLOT( updateSampleVars() ) ); + connect( engine::getMixer(), SIGNAL( sampleRateChanged() ), + this, SLOT( updateSampleVars() ) ); - m_controlEnvAmountModel.setTrack( _track ); - m_controlEnvAmountCb = new ledCheckBox( tr( "MODULATE ENV-AMOUNT" ), - this, tr( "Modulate Env-Amount" ) ); - m_controlEnvAmountCb->setModel( &m_controlEnvAmountModel ); - m_controlEnvAmountCb->move( LFO_PREDELAY_KNOB_X, LFO_GRAPH_Y + 54 ); - m_controlEnvAmountCb->setFont( pointSize<6>( - m_controlEnvAmountCb->font() ) ); - m_controlEnvAmountCb ->setWhatsThis( - tr( "Click here to make the envelope-amount controlled by this " - "LFO." ) ); - toolTip::add( m_controlEnvAmountCb, - tr( "control envelope-amount by this LFO" ) ); - - - setAcceptDrops( TRUE ); - - connect( engine::getMixer(), SIGNAL( sampleRateChanged() ), this, - SLOT( updateSampleVars() ) ); m_lfoShapeData = new sample_t[engine::getMixer()->framesPerPeriod()]; + updateSampleVars(); } -envelopeAndLFOWidget::~envelopeAndLFOWidget() +envelopeAndLFOParameters::~envelopeAndLFOParameters() { m_predelayModel.disconnect( this ); m_attackModel.disconnect( this ); @@ -454,19 +156,17 @@ envelopeAndLFOWidget::~envelopeAndLFOWidget() delete[] m_rEnv; delete[] m_lfoShapeData; - QVector & v = s_EaLWidgets; + QVector & v = s_EaLParametersInstances; if( qFind( v.begin(), v.end(), this ) != v.end() ) { v.erase( qFind( v.begin(), v.end(), this ) ); } - - delete m_lfoWaveBtnGrp; } -inline sample_t envelopeAndLFOWidget::lfoShapeSample( fpp_t _frame_offset ) +inline sample_t envelopeAndLFOParameters::lfoShapeSample( fpp_t _frame_offset ) { f_cnt_t frame = ( m_lfoFrame + _frame_offset ) % m_lfoOscillationFrames; const float phase = frame / static_cast( @@ -474,19 +174,19 @@ inline sample_t envelopeAndLFOWidget::lfoShapeSample( fpp_t _frame_offset ) sample_t shape_sample; switch( m_lfoWaveModel.value() ) { - case TRIANGLE: + case TriangleWave: shape_sample = oscillator::triangleSample( phase ); break; - case SQUARE: + case SquareWave: shape_sample = oscillator::squareSample( phase ); break; - case SAW: + case SawWave: shape_sample = oscillator::sawSample( phase ); break; - case USER: + case UserDefinedWave: shape_sample = m_userWave.userWaveSample( phase ); break; - case SIN: + case SineWave: default: shape_sample = oscillator::sinSample( phase ); break; @@ -497,7 +197,7 @@ inline sample_t envelopeAndLFOWidget::lfoShapeSample( fpp_t _frame_offset ) -void envelopeAndLFOWidget::updateLFOShapeData( void ) +void envelopeAndLFOParameters::updateLFOShapeData( void ) { const fpp_t frames = engine::getMixer()->framesPerPeriod(); for( fpp_t offset = 0; offset < frames; ++offset ) @@ -510,10 +210,10 @@ void envelopeAndLFOWidget::updateLFOShapeData( void ) -void envelopeAndLFOWidget::triggerLFO( void ) +void envelopeAndLFOParameters::triggerLFO( void ) { - QVector & v = s_EaLWidgets; - for( QVector::iterator it = v.begin(); + QVector & v = s_EaLParametersInstances; + for( QVector::iterator it = v.begin(); it != v.end(); ++it ) { ( *it )->m_lfoFrame += @@ -525,10 +225,10 @@ void envelopeAndLFOWidget::triggerLFO( void ) -void envelopeAndLFOWidget::resetLFO( void ) +void envelopeAndLFOParameters::resetLFO( void ) { - QVector & v = s_EaLWidgets; - for( QVector::iterator it = v.begin(); + QVector & v = s_EaLParametersInstances; + for( QVector::iterator it = v.begin(); it != v.end(); ++it ) { ( *it )->m_lfoFrame = 0; @@ -539,7 +239,7 @@ void envelopeAndLFOWidget::resetLFO( void ) -inline void FASTCALL envelopeAndLFOWidget::fillLFOLevel( float * _buf, +inline void FASTCALL envelopeAndLFOParameters::fillLFOLevel( float * _buf, f_cnt_t _frame, const fpp_t _frames ) { @@ -573,7 +273,7 @@ inline void FASTCALL envelopeAndLFOWidget::fillLFOLevel( float * _buf, -void FASTCALL envelopeAndLFOWidget::fillLevel( float * _buf, f_cnt_t _frame, +void FASTCALL envelopeAndLFOParameters::fillLevel( float * _buf, f_cnt_t _frame, const f_cnt_t _release_begin, const fpp_t _frames ) { @@ -619,7 +319,7 @@ void FASTCALL envelopeAndLFOWidget::fillLevel( float * _buf, f_cnt_t _frame, -void envelopeAndLFOWidget::saveSettings( QDomDocument & _doc, +void envelopeAndLFOParameters::saveSettings( QDomDocument & _doc, QDomElement & _parent ) { m_predelayModel.saveSettings( _doc, _parent, "pdel" ); @@ -642,7 +342,7 @@ void envelopeAndLFOWidget::saveSettings( QDomDocument & _doc, -void envelopeAndLFOWidget::loadSettings( const QDomElement & _this ) +void envelopeAndLFOParameters::loadSettings( const QDomElement & _this ) { m_predelayModel.loadSettings( _this, "pdel" ); m_attackModel.loadSettings( _this, "att" ); @@ -658,14 +358,15 @@ void envelopeAndLFOWidget::loadSettings( const QDomElement & _this ) m_lfoAmountModel.loadSettings( _this, "lamt" ); m_x100Model.loadSettings( _this, "x100" ); m_controlEnvAmountModel.loadSettings( _this, "ctlenvamt" ); - - // Keep compatibility with version 2.1 file format + + // ### TODO: +/* // Keep compatibility with version 2.1 file format if( _this.hasAttribute( "lfosyncmode" ) ) { m_lfoSpeedKnob->setSyncMode( ( tempoSyncKnob::tempoSyncMode ) _this.attribute( "lfosyncmode" ).toInt() ); - } + }*/ m_userWave.setAudioFile( _this.attribute( "userwavefile" ) ); @@ -675,229 +376,7 @@ void envelopeAndLFOWidget::loadSettings( const QDomElement & _this ) -void envelopeAndLFOWidget::mousePressEvent( QMouseEvent * _me ) -{ - if( _me->button() != Qt::LeftButton ) - { - return; - } - - if( QRect( ENV_GRAPH_X, ENV_GRAPH_Y, s_envGraph->width(), - s_envGraph->height() ).contains( _me->pos() ) == TRUE ) - { - if( m_amountKnob->value() < 1.0f ) - { - m_amountKnob->setValue( 1.0f ); - } - else - { - m_amountKnob->setValue( 0.0f ); - } - updateSampleVars(); - } - else if( QRect( LFO_GRAPH_X, LFO_GRAPH_Y, s_lfoGraph->width(), - s_lfoGraph->height() ).contains( _me->pos() ) == TRUE ) - { - if( m_lfoAmountKnob->value() < 1.0f ) - { - m_lfoAmountKnob->setValue( 1.0f ); - } - else - { - m_lfoAmountKnob->setValue( 0.0f ); - } - updateSampleVars(); - } -} - - - - -void envelopeAndLFOWidget::dragEnterEvent( QDragEnterEvent * _dee ) -{ - stringPairDrag::processDragEnterEvent( _dee, - QString( "samplefile,tco_%1" ).arg( - track::SAMPLE_TRACK ) ); -} - - - - -void envelopeAndLFOWidget::dropEvent( QDropEvent * _de ) -{ - QString type = stringPairDrag::decodeKey( _de ); - QString value = stringPairDrag::decodeValue( _de ); - if( type == "samplefile" ) - { - m_userWave.setAudioFile( stringPairDrag::decodeValue( _de ) ); - m_userLfoBtn->model()->setValue( TRUE ); - _de->accept(); - } - else if( type == QString( "tco_%1" ).arg( track::SAMPLE_TRACK ) ) - { - multimediaProject mmp( value, FALSE ); - m_userWave.setAudioFile( mmp.content().firstChild().toElement(). - attribute( "src" ) ); - m_userLfoBtn->model()->setValue( TRUE ); - _de->accept(); - } -} - - - - -void envelopeAndLFOWidget::paintEvent( QPaintEvent * ) -{ - QPainter p( this ); - p.setRenderHint( QPainter::Antialiasing ); - - // set smaller font - p.setFont( pointSize<6>( p.font() ) ); - - // draw envelope-graph - p.drawPixmap( ENV_GRAPH_X, ENV_GRAPH_Y, *s_envGraph ); - // draw LFO-graph - p.drawPixmap( LFO_GRAPH_X, LFO_GRAPH_Y, *s_lfoGraph ); - - - p.setFont( pointSize<8>( p.font() ) ); - - const float gray_amount = 1.0f - fabsf( m_amountKnob->value() ); - - p.setPen( QPen( QColor( static_cast( 96 * gray_amount ), - static_cast( 255 - 159 * gray_amount ), - static_cast( 128 - 32 * gray_amount ) ), - 2 ) ); - - const QColor end_points_color( 0xFF, 0xBF, 0x22 ); - const QColor end_points_bg_color( 0, 0, 2 ); - - const int y_base = ENV_GRAPH_Y + s_envGraph->height() - 3; - const int avail_height = s_envGraph->height() - 6; - - int x1 = ENV_GRAPH_X + 2 + static_cast( m_predelayKnob->value() * - TIME_UNIT_WIDTH ); - int x2 = x1 + static_cast( m_attackKnob->value() * - TIME_UNIT_WIDTH ); - - p.drawLine( x1, y_base, x2, y_base - avail_height ); - p.fillRect( x1 - 1, y_base - 2, 4, 4, end_points_bg_color ); - p.fillRect( x1, y_base - 1, 2, 2, end_points_color ); - x1 = x2; - x2 = x1 + static_cast( m_holdKnob->value() * TIME_UNIT_WIDTH ); - - p.drawLine( x1, y_base - avail_height, x2, y_base - avail_height ); - p.fillRect( x1 - 1, y_base - 2 - avail_height, 4, 4, - end_points_bg_color ); - p.fillRect( x1, y_base-1-avail_height, 2, 2, end_points_color ); - x1 = x2; - x2 = x1 + static_cast( ( m_decayKnob->value() * - m_sustainKnob->value() ) * - TIME_UNIT_WIDTH ); - - p.drawLine( x1, y_base-avail_height, x2, static_cast( y_base - - avail_height + - m_sustainKnob->value() * avail_height ) ); - p.fillRect( x1 - 1, y_base - 2 - avail_height, 4, 4, - end_points_bg_color ); - p.fillRect( x1, y_base - 1 - avail_height, 2, 2, end_points_color ); - x1 = x2; - x2 = x1 + static_cast( m_releaseKnob->value() * TIME_UNIT_WIDTH ); - - p.drawLine( x1, static_cast( y_base - avail_height + - m_sustainKnob->value() * - avail_height ), x2, y_base ); - p.fillRect( x1-1, static_cast( y_base - avail_height + - m_sustainKnob->value() * - avail_height ) - 2, 4, 4, - end_points_bg_color ); - p.fillRect( x1, static_cast( y_base - avail_height + - m_sustainKnob->value() * - avail_height ) - 1, 2, 2, - end_points_color ); - p.fillRect( x2 - 1, y_base - 2, 4, 4, end_points_bg_color ); - p.fillRect( x2, y_base - 1, 2, 2, end_points_color ); - - - int LFO_GRAPH_W = s_lfoGraph->width() - 6; // substract border - int LFO_GRAPH_H = s_lfoGraph->height() - 6; // substract border - int graph_x_base = LFO_GRAPH_X + 3; - int graph_y_base = LFO_GRAPH_Y + 3 + LFO_GRAPH_H / 2; - - const float frames_for_graph = SECS_PER_LFO_OSCILLATION * - engine::getMixer()->sampleRate() / 10; - - const float lfo_gray_amount = 1.0f - fabsf( m_lfoAmountKnob->value() ); - p.setPen( QPen( QColor( static_cast( 96 * lfo_gray_amount ), - static_cast( 255 - 159 * lfo_gray_amount ), - static_cast( 128 - 32 * - lfo_gray_amount ) ), - 1.5 ) ); - - - float osc_frames = m_lfoOscillationFrames; - - if( m_x100Model.value() ) - { - osc_frames *= 100.0f; - } - - float old_y = 0; - for( int x = 0; x <= LFO_GRAPH_W; ++x ) - { - float val = 0.0; - float cur_sample = x * frames_for_graph / LFO_GRAPH_W; - if( static_cast( cur_sample ) > m_lfoPredelayFrames ) - { - float phase = ( cur_sample -= m_lfoPredelayFrames ) / - osc_frames; - switch( m_lfoWaveModel.value() ) - { - case SIN: - val = oscillator::sinSample( phase ); - break; - case TRIANGLE: - val = oscillator::triangleSample( - phase ); - break; - case SAW: - val = oscillator::sawSample( phase ); - break; - case SQUARE: - val = oscillator::squareSample( phase ); - break; - case USER: - val = m_userWave.userWaveSample( - phase ); - } - if( static_cast( cur_sample ) <= - m_lfoAttackFrames ) - { - val *= cur_sample / m_lfoAttackFrames; - } - } - float cur_y = -LFO_GRAPH_H / 2.0f * val; - p.drawLine( QLineF( graph_x_base + x - 1, graph_y_base + old_y, - graph_x_base + x, - graph_y_base + cur_y ) ); - old_y = cur_y; - } - - p.setPen( QColor( 255, 192, 0 ) ); - int ms_per_osc = static_cast( SECS_PER_LFO_OSCILLATION * - m_lfoSpeedKnob->value() * - 1000.0f ); - p.drawText( LFO_GRAPH_X + 4, LFO_GRAPH_Y + s_lfoGraph->height() - 6, - tr( "ms/LFO:" ) ); - p.drawText( LFO_GRAPH_X + 52, LFO_GRAPH_Y + s_lfoGraph->height() - 6, - QString::number( ms_per_osc ) ); - -} - - - - -void envelopeAndLFOWidget::updateSampleVars( void ) +void envelopeAndLFOParameters::updateSampleVars( void ) { engine::getMixer()->lock(); @@ -906,20 +385,20 @@ void envelopeAndLFOWidget::updateSampleVars( void ) // TODO: Remove the expKnobVals, time should be linear const f_cnt_t predelay_frames = static_cast( frames_per_env_seg * - expKnobVal( m_predelayKnob->value() ) ); + expKnobVal( m_predelayModel.value() ) ); const f_cnt_t attack_frames = static_cast( frames_per_env_seg * - expKnobVal( m_attackKnob->value() ) ); + expKnobVal( m_attackModel.value() ) ); const f_cnt_t hold_frames = static_cast( frames_per_env_seg * - expKnobVal( m_holdKnob->value() ) ); + expKnobVal( m_holdModel.value() ) ); const f_cnt_t decay_frames = static_cast( frames_per_env_seg * - expKnobVal( m_decayKnob->value() * - m_sustainKnob->value() ) ); + expKnobVal( m_decayModel.value() * + m_sustainModel.value() ) ); - m_sustainLevel = 1.0f - m_sustainKnob->value(); - m_amount = m_amountKnob->value(); + m_sustainLevel = 1.0f - m_sustainModel.value(); + m_amount = m_amountModel.value(); if( m_amount >= 0 ) { m_amountAdd = ( 1.0f - m_amount ) * m_valueForZeroAmount; @@ -932,7 +411,7 @@ void envelopeAndLFOWidget::updateSampleVars( void ) m_pahdFrames = predelay_frames + attack_frames + hold_frames + decay_frames; m_rFrames = static_cast( frames_per_env_seg * - expKnobVal( m_releaseKnob->value() ) ); + expKnobVal( m_releaseModel.value() ) ); if( static_cast( floorf( m_amount * 1000.0f ) ) == 0 ) { @@ -988,17 +467,17 @@ void envelopeAndLFOWidget::updateSampleVars( void ) const float frames_per_lfo_oscillation = SECS_PER_LFO_OSCILLATION * engine::getMixer()->sampleRate(); m_lfoPredelayFrames = static_cast( frames_per_lfo_oscillation * - expKnobVal( m_lfoPredelayKnob->value() ) ); + expKnobVal( m_lfoPredelayModel.value() ) ); m_lfoAttackFrames = static_cast( frames_per_lfo_oscillation * - expKnobVal( m_lfoAttackKnob->value() ) ); + expKnobVal( m_lfoAttackModel.value() ) ); m_lfoOscillationFrames = static_cast( frames_per_lfo_oscillation * - m_lfoSpeedKnob->value() ); + m_lfoSpeedModel.value() ); if( m_x100Model.value() ) { m_lfoOscillationFrames /= 100; } - m_lfoAmount = m_lfoAmountKnob->value() * 0.5f; + m_lfoAmount = m_lfoAmountModel.value() * 0.5f; m_used = TRUE; if( static_cast( floorf( m_lfoAmount * 1000.0f ) ) == 0 ) @@ -1016,7 +495,7 @@ void envelopeAndLFOWidget::updateSampleVars( void ) m_bad_lfoShapeData = TRUE; - update(); + emit dataChanged(); engine::getMixer()->unlock(); } @@ -1024,22 +503,6 @@ void envelopeAndLFOWidget::updateSampleVars( void ) -void envelopeAndLFOWidget::lfoUserWaveChanged( void ) -{ - if( m_lfoWaveModel.value() == USER ) - { - if( m_userWave.frames() <= 1 ) - { - textFloat::displayMessage( tr( "Hint" ), - tr( "Drag a sample from somewhere and drop " - "it in this window." ), - embed::getIconPixmap( "hint" ), 3000 ); - } - } -} - - - #include "envelope_and_lfo_parameters.moc" diff --git a/src/core/export_project_dialog.cpp b/src/core/export_project_dialog.cpp index 02e7f460b..192de0da5 100644 --- a/src/core/export_project_dialog.cpp +++ b/src/core/export_project_dialog.cpp @@ -35,7 +35,7 @@ #include "export_project_dialog.h" -#include "song_editor.h" +#include "song.h" #include "main_window.h" #include "combobox.h" #include "led_checkbox.h" @@ -243,7 +243,7 @@ void exportProjectDialog::keyPressEvent( QKeyEvent * _ke ) { if( _ke->key() == Qt::Key_Escape ) { - if( engine::getSongEditor()->exporting() == FALSE ) + if( engine::getSong()->exporting() == FALSE ) { accept(); } @@ -259,7 +259,7 @@ void exportProjectDialog::keyPressEvent( QKeyEvent * _ke ) void exportProjectDialog::closeEvent( QCloseEvent * _ce ) { - if( engine::getSongEditor()->exporting() == TRUE ) + if( engine::getSong()->exporting() == TRUE ) { abortProjectExport(); _ce->ignore(); @@ -359,21 +359,20 @@ void exportProjectDialog::exportBtnClicked( void ) engine::getMixer()->setAudioDevice( dev, m_hqmCb->model()->value() ); - engine::getSongEditor()->startExport(); + engine::getSong()->startExport(); delete m_hqmCb; - songEditor::playPos & pp = engine::getSongEditor()->getPlayPos( - songEditor::PLAY_SONG ); + song::playPos & pp = engine::getSong()->getPlayPos( + song::Mode_PlaySong ); - while( engine::getSongEditor()->exportDone() == FALSE && - engine::getSongEditor()->exporting() == TRUE + while( engine::getSong()->exportDone() == FALSE && + engine::getSong()->exporting() == TRUE && !m_deleteFile ) { dev->processNextBuffer(); int pval = pp * 100 / - ( ( engine::getSongEditor()->lengthInTacts() + 1 ) - * 64 ); + ( ( engine::getSong()->lengthInTacts() + 1 ) * 64 ); m_exportProgressBar->setValue( pval ); // update lmms-main-win-caption engine::getMainWindow()->setWindowTitle( tr( "Rendering:" ) @@ -391,7 +390,7 @@ void exportProjectDialog::exportBtnClicked( void ) void exportProjectDialog::cancelBtnClicked( void ) { // is song-export-thread active? - if( engine::getSongEditor()->exporting() == TRUE ) + if( engine::getSong()->exporting() == TRUE ) { // then dispose abort of export abortProjectExport(); @@ -425,7 +424,7 @@ void exportProjectDialog::finishProjectExport( void ) // restore window-title engine::getMainWindow()->resetWindowTitle(); - engine::getSongEditor()->stopExport(); + engine::getSong()->stopExport(); // if we rendered file from command line, quit after export if( file_to_render != "" ) diff --git a/src/core/file_browser.cpp b/src/core/file_browser.cpp index e32c57b4b..0f413daa3 100644 --- a/src/core/file_browser.cpp +++ b/src/core/file_browser.cpp @@ -48,7 +48,7 @@ #include "mmp.h" #include "preset_preview_play_handle.h" #include "sample_play_handle.h" -#include "song_editor.h" +#include "song.h" #include "string_pair_drag.h" #include "text_float.h" @@ -261,14 +261,14 @@ void listView::activateListItem( QTreeWidgetItem * _item, int _column ) return; } - if( f->type() == fileItem::SAMPLE_FILE ) + if( f->type() == fileItem::SampleFile ) { // samples are per default opened in bb-editor because they're // likely drum-samples etc. engine::getMixer()->lock(); instrumentTrack * it = dynamic_cast( - track::create( track::INSTRUMENT_TRACK, - engine::getBBEditor() ) ); + track::create( track::InstrumentTrack, + engine::getBBTrackContainer() ) ); #ifdef LMMS_DEBUG assert( it != NULL ); #endif @@ -278,31 +278,31 @@ void listView::activateListItem( QTreeWidgetItem * _item, int _column ) { afp->setParameter( "samplefile", f->fullName() ); } - it->toggledInstrumentTrackButton( TRUE ); + //it->toggledInstrumentTrackButton( TRUE ); engine::getMixer()->unlock(); } - else if( f->type() == fileItem::PRESET_FILE ) + else if( f->type() == fileItem::PresetFile ) { // presets are per default opened in bb-editor multimediaProject mmp( f->fullName() ); engine::getMixer()->lock(); instrumentTrack * it = dynamic_cast( - track::create( track::INSTRUMENT_TRACK, - engine::getBBEditor() ) ); + track::create( track::InstrumentTrack, + engine::getBBTrackContainer() ) ); if( it != NULL ) { it->loadTrackSpecificSettings( mmp.content(). firstChild(). toElement() ); - it->toggledInstrumentTrackButton( TRUE ); + //it->toggledInstrumentTrackButton( TRUE ); } engine::getMixer()->unlock(); } - else if( f->type() == fileItem::PROJECT_FILE ) + else if( f->type() == fileItem::ProjectFile ) { if( engine::getMainWindow()->mayChangeProject() ) { - engine::getSongEditor()->loadProject( f->fullName() ); + engine::getSong()->loadProject( f->fullName() ); } } } @@ -326,16 +326,16 @@ void listView::sendToActiveInstrumentTrack( void ) // instrument-track while( w.hasPrevious() ) { - instrumentTrack * ct = dynamic_cast( + instrumentTrackView * itv = dynamic_cast( w.previous()->widget() ); - if( ct != NULL && ct->isHidden() == FALSE ) + if( itv != NULL && itv->isHidden() == FALSE ) { // ok, it's an instrument-track, so we can apply the // sample or the preset engine::getMixer()->lock(); - if( m_contextMenuItem->type() == fileItem::SAMPLE_FILE ) + if( m_contextMenuItem->type() == fileItem::SampleFile ) { - instrument * afp = ct->loadInstrument( + instrument * afp = itv->model()->loadInstrument( engine::sampleExtensions() [m_contextMenuItem ->extension()] ); @@ -346,15 +346,15 @@ void listView::sendToActiveInstrumentTrack( void ) } } else if( m_contextMenuItem->type() == - fileItem::PRESET_FILE ) + fileItem::PresetFile ) { multimediaProject mmp( m_contextMenuItem->fullName() ); - ct->loadTrackSpecificSettings( mmp.content(). - firstChild(). + itv->model()->loadTrackSpecificSettings( + mmp.content().firstChild(). toElement() ); } - ct->toggledInstrumentTrackButton( TRUE ); + //ct->toggledInstrumentTrackButton( TRUE ); engine::getMixer()->unlock(); break; } @@ -367,10 +367,10 @@ void listView::sendToActiveInstrumentTrack( void ) void listView::openInNewInstrumentTrack( trackContainer * _tc ) { engine::getMixer()->lock(); - if( m_contextMenuItem->type() == fileItem::SAMPLE_FILE ) + if( m_contextMenuItem->type() == fileItem::SampleFile ) { instrumentTrack * ct = dynamic_cast( - track::create( track::INSTRUMENT_TRACK, _tc ) ); + track::create( track::InstrumentTrack, _tc ) ); #ifdef LMMS_DEBUG assert( ct != NULL ); #endif @@ -383,19 +383,19 @@ void listView::openInNewInstrumentTrack( trackContainer * _tc ) afp->setParameter( "samplefile", m_contextMenuItem->fullName() ); } - ct->toggledInstrumentTrackButton( TRUE ); + //ct->toggledInstrumentTrackButton( TRUE ); } - else if( m_contextMenuItem->type() == fileItem::PRESET_FILE ) + else if( m_contextMenuItem->type() == fileItem::PresetFile ) { multimediaProject mmp( m_contextMenuItem->fullName() ); - track * t = track::create( track::INSTRUMENT_TRACK, _tc ); + track * t = track::create( track::InstrumentTrack, _tc ); instrumentTrack * ct = dynamic_cast( t ); if( ct != NULL ) { ct->loadTrackSpecificSettings( mmp.content(). firstChild(). toElement() ); - ct->toggledInstrumentTrackButton( TRUE ); + //ct->toggledInstrumentTrackButton( TRUE ); } } engine::getMixer()->unlock(); @@ -406,7 +406,7 @@ void listView::openInNewInstrumentTrack( trackContainer * _tc ) void listView::openInNewInstrumentTrackBBE( void ) { - openInNewInstrumentTrack( engine::getBBEditor() ); + openInNewInstrumentTrack( engine::getBBTrackContainer() ); } @@ -414,7 +414,7 @@ void listView::openInNewInstrumentTrackBBE( void ) void listView::openInNewInstrumentTrackSE( void ) { - openInNewInstrumentTrack( engine::getSongEditor() ); + openInNewInstrumentTrack( engine::getSong() ); } @@ -435,8 +435,8 @@ void listView::updateDirectory( QTreeWidgetItem * _item ) void listView::contextMenuEvent( QContextMenuEvent * _e ) { fileItem * f = dynamic_cast( itemAt( _e->pos() ) ); - if( f != NULL && ( f->type() == fileItem::SAMPLE_FILE || - f->type() == fileItem::PRESET_FILE ) ) + if( f != NULL && ( f->type() == fileItem::SampleFile || + f->type() == fileItem::PresetFile ) ) { m_contextMenuItem = f; QMenu contextMenu( this ); @@ -495,7 +495,7 @@ void listView::mousePressEvent( QMouseEvent * _me ) m_previewPlayHandle ); m_previewPlayHandle = NULL; } - if( f->type() == fileItem::SAMPLE_FILE ) + if( f->type() == fileItem::SampleFile ) { textFloat * tf = textFloat::displayMessage( tr( "Loading sample" ), @@ -510,7 +510,7 @@ void listView::mousePressEvent( QMouseEvent * _me ) m_previewPlayHandle = s; delete tf; } - else if( f->type() == fileItem::PRESET_FILE ) + else if( f->type() == fileItem::PresetFile ) { m_previewPlayHandle = new presetPreviewPlayHandle( f->fullName() ); @@ -539,7 +539,7 @@ void listView::mouseMoveEvent( QMouseEvent * _me ) { switch( f->type() ) { - case fileItem::PRESET_FILE: + case fileItem::PresetFile: new stringPairDrag( "presetfile", f->fullName(), embed::getIconPixmap( @@ -547,7 +547,7 @@ void listView::mouseMoveEvent( QMouseEvent * _me ) this ); break; - case fileItem::SAMPLE_FILE: + case fileItem::SampleFile: new stringPairDrag( "samplefile", f->fullName(), embed::getIconPixmap( @@ -555,7 +555,7 @@ void listView::mouseMoveEvent( QMouseEvent * _me ) this ); break; - case fileItem::MIDI_FILE: + case fileItem::MidiFile: new stringPairDrag( "midifile", f->fullName(), embed::getIconPixmap( @@ -842,22 +842,22 @@ void fileItem::initPixmapStuff( void ) switch( m_type ) { - case PROJECT_FILE: + case ProjectFile: setIcon( 0, *s_projectFilePixmap ); break; - case PRESET_FILE: + case PresetFile: setIcon( 0, *s_presetFilePixmap ); break; - case SAMPLE_FILE: + case SampleFile: setIcon( 0, *s_sampleFilePixmap ); break; - case MIDI_FILE: + case MidiFile: setIcon( 0, *s_midiFilePixmap ); break; - case FLP_FILE: + case FlpFile: setIcon( 0, *s_flpFilePixmap ); break; - case UNKNOWN: + case UnknownFile: default: setIcon( 0, *s_unknownFilePixmap ); break; @@ -872,44 +872,44 @@ void fileItem::determineFileType( void ) QString ext = extension(); if( ext == "mmp" || ext == "mpt" || ext == "mmpz" ) { - m_type = PROJECT_FILE; + m_type = ProjectFile; } else if( ext == "xml" ) { - multimediaProject::projectTypes t = + multimediaProject::ProjectTypes t = multimediaProject::typeOfFile( fullName() ); - if( t == multimediaProject::SONG_PROJECT ) + if( t == multimediaProject::SongProject ) { - m_type = PROJECT_FILE; + m_type = ProjectFile; } - else if( t == multimediaProject::INSTRUMENT_TRACK_SETTINGS ) + else if( t == multimediaProject::InstrumentTrackSettings ) { - m_type = PRESET_FILE; + m_type = PresetFile; } else { - m_type = UNKNOWN; + m_type = UnknownFile; } } else if( ext == "csf" ) { - m_type = PRESET_FILE; + m_type = PresetFile; } else if( engine::sampleExtensions().contains( ext ) ) { - m_type = SAMPLE_FILE; + m_type = SampleFile; } else if( ext == "mid" ) { - m_type = MIDI_FILE; + m_type = MidiFile; } else if( ext == "flp" ) { - m_type = FLP_FILE; + m_type = FlpFile; } else { - m_type = UNKNOWN; + m_type = UnknownFile; } } diff --git a/src/core/import_filter.cpp b/src/core/import_filter.cpp index 640b26e4d..1a5a18ebc 100644 --- a/src/core/import_filter.cpp +++ b/src/core/import_filter.cpp @@ -31,6 +31,7 @@ #include "engine.h" #include "track_container.h" #include "project_journal.h" +#include "automatable_model_templates.h" diff --git a/src/core/instrument.cpp b/src/core/instrument.cpp index aedb4fb9d..e2037e3a6 100644 --- a/src/core/instrument.cpp +++ b/src/core/instrument.cpp @@ -82,7 +82,7 @@ f_cnt_t instrument::beatLen( notePlayHandle * ) const instrument * instrument::instantiate( const QString & _plugin_name, instrumentTrack * _instrument_track ) { - plugin * p = plugin::instantiate( _plugin_name, /*_instrument_track*/ NULL, + plugin * p = plugin::instantiate( _plugin_name, _instrument_track, _instrument_track ); // check whether instantiated plugin is an instrument if( dynamic_cast( p ) != NULL ) @@ -155,9 +155,10 @@ void instrumentView::setModel( ::model * _model, bool ) if( dynamic_cast( _model ) != NULL ) { modelView::setModel( _model ); - if( dynamic_cast( parentWidget() ) != NULL ) + if( dynamic_cast( parentWidget() ) != + NULL ) { - dynamic_cast( parentWidget() )-> + dynamic_cast( parentWidget() )-> setWindowIcon( *( model()-> getDescriptor()->logo ) ); } diff --git a/src/core/instrument_functions.cpp b/src/core/instrument_functions.cpp new file mode 100644 index 000000000..f2369766e --- /dev/null +++ b/src/core/instrument_functions.cpp @@ -0,0 +1,540 @@ +#ifndef SINGLE_SOURCE_COMPILE + +/* + * instrument_functions.cpp - models for instrument-function-tab + * + * Copyright (c) 2004-2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include + + +#include "instrument_functions.h" +#include "embed.h" +#include "engine.h" +#include "instrument_track.h" +#include "note_play_handle.h" +#include "preset_preview_play_handle.h" + + + +chordCreator::chord chordCreator::s_chordTable[] = +{ + { chordCreator::tr( "octave" ), { 0, -1 } }, + { chordCreator::tr( "Major" ), { 0, 4, 7, -1 } }, + { chordCreator::tr( "Majb5" ), { 0, 4, 6, -1 } }, + { chordCreator::tr( "minor" ), { 0, 3, 7, -1 } }, + { chordCreator::tr( "minb5" ), { 0, 3, 6, -1 } }, + { chordCreator::tr( "sus2" ), { 0, 2, 7, -1 } }, + { chordCreator::tr( "sus4" ), { 0, 5, 7, -1 } }, + { chordCreator::tr( "aug" ), { 0, 4, 8, -1 } }, + { chordCreator::tr( "augsus4" ), { 0, 5, 8, -1 } }, + { chordCreator::tr( "tri" ), { 0, 3, 6, 9, -1 } }, + + { chordCreator::tr( "6" ), { 0, 4, 7, 9, -1 } }, + { chordCreator::tr( "6sus4" ), { 0, 5, 7, 9, -1 } }, + { chordCreator::tr( "6add9" ), { 0, 4, 7, 12, -1 } }, + { chordCreator::tr( "m6" ), { 0, 3, 7, 9, -1 } }, + { chordCreator::tr( "m6add9" ), { 0, 3, 7, 9, 14, -1 } }, + + { chordCreator::tr( "7" ), { 0, 4, 7, 10, -1 } }, + { chordCreator::tr( "7sus4" ), { 0, 5, 7, 10, -1 } }, + { chordCreator::tr( "7#5" ), { 0, 4, 8, 10, -1 } }, + { chordCreator::tr( "7b5" ), { 0, 4, 6, 10, -1 } }, + { chordCreator::tr( "7#9" ), { 0, 4, 7, 10, 13, 18, -1 } }, + { chordCreator::tr( "7b9" ), { 0, 4, 7, 10, 13, 16, -1 } }, + { chordCreator::tr( "7#5#9" ), { 0, 4, 8, 12, 14, 19, -1 } }, + { chordCreator::tr( "7#5b9" ), { 0, 4, 8, 12, 14, 17, -1 } }, + { chordCreator::tr( "7b5b9" ), { 0, 4, 6, 10, 12, 15, -1 } }, + { chordCreator::tr( "7add11" ), { 0, 4, 7, 10, 17, -1 } }, + { chordCreator::tr( "7add13" ), { 0, 4, 7, 10, 21, -1 } }, + { chordCreator::tr( "7#11" ), { 0, 4, 7, 10, 18, -1 } }, + { chordCreator::tr( "Maj7" ), { 0, 4, 7, 11, -1 } }, + { chordCreator::tr( "Maj7b5" ), { 0, 4, 6, 11, -1 } }, + { chordCreator::tr( "Maj7#5" ), { 0, 4, 8, 11, -1 } }, + { chordCreator::tr( "Maj7#11" ), { 0, 4, 7, 11, 18, -1 } }, + { chordCreator::tr( "Maj7add13" ), { 0, 4, 7, 11, 21, -1 } }, + { chordCreator::tr( "m7" ), { 0, 3, 7, 10, -1 } }, + { chordCreator::tr( "m7b5" ), { 0, 3, 6, 10, -1 } }, + { chordCreator::tr( "m7b9" ), { 0, 3, 7, 10, 13, -1 } }, + { chordCreator::tr( "m7add11" ), { 0, 3, 7, 10, 17, -1 } }, + { chordCreator::tr( "m7add13" ), { 0, 3, 7, 10, 21, -1 } }, + { chordCreator::tr( "m-Maj7" ), { 0, 3, 7, 11, -1 } }, + { chordCreator::tr( "m-Maj7add11" ), { 0, 3, 7, 11, 17, -1 } }, + { chordCreator::tr( "m-Maj7add13" ), { 0, 3, 7, 11, 21, -1 } }, + + { chordCreator::tr( "9" ), { 0, 4, 7, 10, 14, -1 } }, + { chordCreator::tr( "9sus4" ), { 0, 5, 7, 10, 14, -1 } }, + { chordCreator::tr( "add9" ), { 0, 4, 7, 14, -1 } }, + { chordCreator::tr( "9#5" ), { 0, 4, 8, 10, 14, -1 } }, + { chordCreator::tr( "9b5" ), { 0, 4, 6, 10, 14, -1 } }, + { chordCreator::tr( "9#11" ), { 0, 4, 7, 10, 14, 18, -1 } }, + { chordCreator::tr( "9b13" ), { 0, 4, 7, 10, 14, 20, -1 } }, + { chordCreator::tr( "Maj9" ), { 0, 4, 7, 11, 14, -1 } }, + { chordCreator::tr( "Maj9sus4" ), { 0, 5, 7, 11, 15, -1 } }, + { chordCreator::tr( "Maj9#5" ), { 0, 4, 8, 11, 14, -1 } }, + { chordCreator::tr( "Maj9#11" ), { 0, 4, 7, 11, 14, 18, -1 } }, + { chordCreator::tr( "m9" ), { 0, 3, 7, 10, 14, -1 } }, + { chordCreator::tr( "madd9" ), { 0, 3, 7, 14, -1 } }, + { chordCreator::tr( "m9b5" ), { 0, 3, 6, 10, 14, -1 } }, + { chordCreator::tr( "m9-Maj7" ), { 0, 3, 7, 11, 14, -1 } }, + + { chordCreator::tr( "11" ), { 0, 4, 7, 10, 14, 17, -1 } }, + { chordCreator::tr( "11b9" ), { 0, 4, 7, 10, 13, 17, -1 } }, + { chordCreator::tr( "Maj11" ), { 0, 4, 7, 11, 14, 17, -1 } }, + { chordCreator::tr( "m11" ), { 0, 3, 7, 10, 14, 17, -1 } }, + { chordCreator::tr( "m-Maj11" ), { 0, 3, 7, 11, 14, 17, -1 } }, + + { chordCreator::tr( "13" ), { 0, 4, 7, 10, 14, 21, -1 } }, + { chordCreator::tr( "13#9" ), { 0, 4, 7, 10, 15, 21, -1 } }, + { chordCreator::tr( "13b9" ), { 0, 4, 7, 10, 13, 21, -1 } }, + { chordCreator::tr( "13b5b9" ), { 0, 4, 6, 10, 13, 21, -1 } }, + { chordCreator::tr( "Maj13" ), { 0, 4, 7, 11, 14, 21, -1 } }, + { chordCreator::tr( "m13" ), { 0, 3, 7, 10, 14, 21, -1 } }, + { chordCreator::tr( "m-Maj13" ), { 0, 3, 7, 11, 14, 21, -1 } }, + + { chordCreator::tr( "Major" ), { 0, 2, 4, 5, 7, 9, 11, -1 } }, + { chordCreator::tr( "Harmonic minor" ), { 0, 2, 3, 5, 7, 8, + 11, -1 } }, + { chordCreator::tr( "Melodic minor" ), { 0, 2, 3, 5, 7, 9, + 11, -1 } }, + { chordCreator::tr( "Whole tone" ), { 0, 2, 4, 6, 8, 10, + -1 } }, + { chordCreator::tr( "Diminished" ), { 0, 2, 3, 5, 6, 8, 9, + 11, -1 } }, + { chordCreator::tr( "Major pentatonic" ), { 0, 2, 4, 7, 10, + -1 } }, + { chordCreator::tr( "Minor pentatonic" ), { 0, 3, 5, 7, 10, + -1 } }, + { chordCreator::tr( "Jap in sen" ), { 0, 1, 5, 7, 10, -1 } }, + { chordCreator::tr( "Major bebop" ), { 0, 2, 4, 5, 7, 8, 9, + 11, -1 } }, + { chordCreator::tr( "Dominant bebop" ), { 0, 2, 4, 5, 7, 9, + 10, 11, -1 } }, + { chordCreator::tr( "Blues" ), { 0, 3, 5, 6, 7, 10, -1 } }, + { chordCreator::tr( "Arabic" ), { 0, 1, 4, 5, 7, 8, 11, -1 } }, + { chordCreator::tr( "Enigmatic" ), { 0, 1, 4, 6, 8, 10, 11, + -1 } }, + { chordCreator::tr( "Neopolitan" ), { 0, 1, 3, 5, 7, 9, 11, + -1 } }, + { chordCreator::tr( "Neopolitan minor" ), { 0, 1, 3, 5, 7, 9, + 11, -1 } }, + { chordCreator::tr( "Hungarian minor" ), { 0, 2, 3, 6, 7, 9, + 11, -1 } }, + { chordCreator::tr( "Dorian" ), { 0, 2, 3, 5, 7, 9, 10, -1 } }, + { chordCreator::tr( "Phrygolydian" ), { 0, 1, 3, 5, 7, 8, 10, + -1 } }, + { chordCreator::tr( "Lydian" ), { 0, 2, 4, 6, 7, 9, 11, -1 } }, + { chordCreator::tr( "Mixolydian" ), { 0, 2, 4, 5, 7, 9, 10, + -1 } }, + { chordCreator::tr( "Aeolian" ), { 0, 2, 3, 5, 7, 8, 10, + -1 } }, + { chordCreator::tr( "Locrian" ), { 0, 1, 3, 5, 6, 8, 10, + -1 } }, + + { "", { -1, -1 } } + +} ; + + +const int CHORDS_GROUPBOX_X = 4; +const int CHORDS_GROUPBOX_Y = 5; +const int CHORDS_GROUPBOX_WIDTH = 238; +const int CHORDS_GROUPBOX_HEIGHT = 65; +const int ARP_GROUPBOX_X = CHORDS_GROUPBOX_X; +const int ARP_GROUPBOX_Y = 10 + CHORDS_GROUPBOX_Y + CHORDS_GROUPBOX_HEIGHT; +const int ARP_GROUPBOX_WIDTH = CHORDS_GROUPBOX_WIDTH; +const int ARP_GROUPBOX_HEIGHT = 240 - ARP_GROUPBOX_Y; + + + +chordCreator::chordCreator( instrumentTrack * _instrument_track ) : + model( _instrument_track ), + m_chordsEnabledModel( FALSE, this ), + m_chordsModel( this ), + m_chordRangeModel( 1.0f, 1.0f, 9.0f, 1.0f, this ) +{ + m_chordsEnabledModel.setTrack( _instrument_track ); + + m_chordsModel.setTrack( _instrument_track ); + for( int i = 0; s_chordTable[i].interval[0] != -1; ++i ) + { + m_chordsModel.addItem( tr( s_chordTable[i].name.toAscii(). + constData() ) ); + } + + m_chordRangeModel.setTrack( _instrument_track ); + +} + + + + +chordCreator::~chordCreator() +{ +} + + + + +void chordCreator::processNote( notePlayHandle * _n ) +{ + const int base_note_key = _n->key(); + // we add chord-subnotes to note if either note is a base-note and + // arpeggio is not used or note is part of an arpeggio + // at the same time we only add sub-notes if nothing of the note was + // played yet, because otherwise we would add chord-subnotes every + // time an audio-buffer is rendered... + if( ( ( _n->baseNote() && + _n->getInstrumentTrack()->arpeggiatorEnabled() == FALSE ) || + _n->arpNote() ) && + _n->totalFramesPlayed() == 0 && + m_chordsEnabledModel.value() == TRUE ) + { + // then insert sub-notes for chord + const int selected_chord = m_chordsModel.value(); + + for( int octave_cnt = 0; + octave_cnt < m_chordRangeModel.value(); ++octave_cnt ) + { + const int sub_note_key_base = base_note_key + + octave_cnt * NOTES_PER_OCTAVE; + // if octave_cnt == 1 we're in the first octave and + // the base-note is already done, so we don't have to + // create it in the following loop, then we loop until + // there's a -1 in the interval-array + for( int i = ( octave_cnt == 0 ) ? 1 : 0; + s_chordTable[selected_chord].interval[i] != -1; + ++i ) + { + // add interval to sub-note-key + const int sub_note_key = sub_note_key_base + + (int) s_chordTable[ + selected_chord].interval[i]; + // maybe we're out of range -> let's get outta + // here! + if( sub_note_key > NOTES_PER_OCTAVE*OCTAVES ) + { + break; + } + // create copy of base-note + note note_copy( _n->length(), 0, + (tones)( sub_note_key % + NOTES_PER_OCTAVE ), + (octaves)( sub_note_key / + NOTES_PER_OCTAVE ), + _n->getVolume(), + _n->getPanning(), + _n->detuning() ); + // create sub-note-play-handle, only note is + // different + new notePlayHandle( _n->getInstrumentTrack(), + _n->offset(), + _n->frames(), note_copy, + _n ); + } + } + } + + +} + + + + +void chordCreator::saveSettings( QDomDocument & _doc, QDomElement & _this ) +{ + m_chordsEnabledModel.saveSettings( _doc, _this, "chord-enabled" ); + m_chordsModel.saveSettings( _doc, _this, "chord" ); + m_chordRangeModel.saveSettings( _doc, _this, "chordrange" ); +} + + + + +void chordCreator::loadSettings( const QDomElement & _this ) +{ + m_chordsEnabledModel.loadSettings( _this, "chord-enabled" ); + m_chordsModel.loadSettings( _this, "chord" ); + m_chordRangeModel.loadSettings( _this, "chordrange" ); +} + + + + + + + +arpeggiator::arpeggiator( instrumentTrack * _instrument_track ) : + model( _instrument_track ), + m_arpEnabledModel( FALSE ), + m_arpModel( this ), + m_arpRangeModel( 1.0f, 1.0f, 9.0f, 1.0f, this ), + m_arpTimeModel( 100.0f, 25.0f, 2000.0f, 1.0f, this ), + m_arpGateModel( 100.0f, 1.0f, 200.0f, 1.0f, this ), + m_arpDirectionModel( 0, 0, 0, intModel::defaultRelStep(), this ), + m_arpModeModel( this ) +{ + m_arpEnabledModel.setTrack( _instrument_track ); + + m_arpModel.setTrack( _instrument_track ); + for( int i = 0; chordCreator::s_chordTable[i].interval[0] != -1; ++i ) + { + m_arpModel.addItem( tr( chordCreator::s_chordTable[i]. + name.toAscii().constData() ) ); + } + + m_arpRangeModel.setTrack( _instrument_track ); + + m_arpTimeModel.setTrack( _instrument_track ); + + m_arpGateModel.setTrack( _instrument_track ); + + m_arpDirectionModel.setTrack( _instrument_track ); + m_arpDirectionModel.setInitValue( ArpDirUp ); + + m_arpModeModel.setTrack( _instrument_track ); + m_arpModeModel.addItem( tr( "Free" ), new QPixmap( + embed::getIconPixmap( "arp_free" ) ) ); + m_arpModeModel.addItem( tr( "Sort" ), new QPixmap( + embed::getIconPixmap( "arp_sort" ) ) ); + m_arpModeModel.addItem( tr( "Sync" ), new QPixmap( + embed::getIconPixmap( "arp_sync" ) ) ); +} + + + + +arpeggiator::~arpeggiator() +{ +} + + + + +void arpeggiator::processNote( notePlayHandle * _n ) +{ + const int base_note_key = _n->key(); + if( _n->baseNote() == FALSE || + !m_arpEnabledModel.value() || + ( _n->released() && _n->releaseFramesDone() >= + _n->actualReleaseFramesToDo() ) ) + { + return; + } + + + const int selected_arp = m_arpModel.value(); + + constNotePlayHandleVector cnphv = notePlayHandle::nphsOfInstrumentTrack( + _n->getInstrumentTrack() ); + if( m_arpModeModel.value() != FreeMode && cnphv.size() == 0 ) + { + // maybe we're playing only a preset-preview-note? + cnphv = presetPreviewPlayHandle::nphsOfInstrumentTrack( + _n->getInstrumentTrack() ); + if( cnphv.size() == 0 ) + { + // still nothing found here, so lets return + //return; + cnphv.push_back( _n ); + } + } + + const int cur_chord_size = chordCreator::getChordSize( + chordCreator::s_chordTable[selected_arp] ); + const int range = (int)( cur_chord_size * m_arpRangeModel.value() ); + const int total_range = range * cnphv.size(); + + // number of frames that every note should be played + const f_cnt_t arp_frames = (f_cnt_t)( m_arpTimeModel.value() / 1000.0f * + engine::getMixer()->sampleRate() ); + const f_cnt_t gated_frames = (f_cnt_t)( m_arpGateModel.value() * + arp_frames / 100.0f ); + + // used for calculating remaining frames for arp-note, we have to add + // arp_frames-1, otherwise the first arp-note will not be setup + // correctly... -> arp_frames frames silence at the start of every note! + int cur_frame = ( ( m_arpModeModel.value() != FreeMode ) ? + cnphv.first()->totalFramesPlayed() : + _n->totalFramesPlayed() ) + arp_frames - 1; + // used for loop + f_cnt_t frames_processed = 0; + + while( frames_processed < engine::getMixer()->framesPerPeriod() ) + { + const f_cnt_t remaining_frames_for_cur_arp = arp_frames - + ( cur_frame % arp_frames ); + // does current arp-note fill whole audio-buffer? + if( remaining_frames_for_cur_arp > + engine::getMixer()->framesPerPeriod() ) + { + // then we don't have to do something! + break; + } + + frames_processed += remaining_frames_for_cur_arp; + + // init with zero + int cur_arp_idx = 0; + + // in sorted mode: is it our turn or do we have to be quiet for + // now? + if( m_arpModeModel.value() == SortMode && + ( ( cur_frame / arp_frames ) % total_range ) / + range != (f_cnt_t) _n->index() ) + { + // update counters + frames_processed += arp_frames; + cur_frame += arp_frames; + continue; + } + + const int dir = m_arpDirectionModel.value(); + // process according to arpeggio-direction... + if( dir == ArpDirUp ) + { + cur_arp_idx = ( cur_frame / arp_frames ) % range; + } + else if( dir == ArpDirDown ) + { + cur_arp_idx = range - ( cur_frame / arp_frames ) % + range - 1; + } + else if( dir == ArpDirUpAndDown && range > 1 ) + { + // imagine, we had to play the arp once up and then + // once down -> makes 2 * range possible notes... + // because we don't play the lower and upper notes + // twice, we have to subtract 2 + cur_arp_idx = ( cur_frame / arp_frames ) % + ( range * 2 - 2 ); + // if greater than range, we have to play down... + // looks like the code for arp_dir==DOWN... :) + if( cur_arp_idx >= range ) + { + cur_arp_idx = range - cur_arp_idx % + ( range - 1 ) - 1; + } + } + else if( dir == ArpDirRandom ) + { + // just pick a random chord-index + cur_arp_idx = (int)( range * ( (float) rand() / + (float) RAND_MAX ) ); + } + + // now calculate final key for our arp-note + const int sub_note_key = base_note_key + (cur_arp_idx / + cur_chord_size ) * + NOTES_PER_OCTAVE + + chordCreator::s_chordTable[selected_arp]. + interval[cur_arp_idx % cur_chord_size]; + + // range-checking + if( sub_note_key >= NOTES_PER_OCTAVE * OCTAVES || + sub_note_key < 0 || + engine::getMixer()->criticalXRuns() ) + { + continue; + } + + float vol_level = 1.0f; + if( _n->released() ) + { + vol_level = _n->volumeLevel( cur_frame + gated_frames ); + } + + // create new arp-note + note new_note( midiTime( 0 ), midiTime( 0 ), + static_cast( sub_note_key % + NOTES_PER_OCTAVE ), + static_cast( sub_note_key / + NOTES_PER_OCTAVE ), + static_cast( _n->getVolume() * + vol_level ), + _n->getPanning(), _n->detuning() ); + + // create sub-note-play-handle, only ptr to note is different + // and is_arp_note=TRUE + new notePlayHandle( _n->getInstrumentTrack(), + ( ( m_arpModeModel.value() != FreeMode ) ? + cnphv.first()->offset() : + _n->offset() ) + + frames_processed, + gated_frames, + new_note, + _n, TRUE ); + + // update counters + frames_processed += arp_frames; + cur_frame += arp_frames; + } + + // make sure, note is handled as arp-base-note, even if we didn't add a + // sub-note so far + if( m_arpModeModel.value() != FreeMode ) + { + _n->setArpNote( TRUE ); + } +} + + + + +void arpeggiator::saveSettings( QDomDocument & _doc, QDomElement & _this ) +{ + m_arpEnabledModel.saveSettings( _doc, _this, "arp-enabled" ); + m_arpModel.saveSettings( _doc, _this, "arp" ); + m_arpRangeModel.saveSettings( _doc, _this, "arprange" ); + m_arpTimeModel.saveSettings( _doc, _this, "arptime" ); + m_arpGateModel.saveSettings( _doc, _this, "arpgate" ); + m_arpDirectionModel.saveSettings( _doc, _this, "arpdir" ); + + m_arpModeModel.saveSettings( _doc, _this, "arpmode" ); +} + + + + +void arpeggiator::loadSettings( const QDomElement & _this ) +{ + m_arpEnabledModel.loadSettings( _this, "arp-enabled" ); + m_arpModel.loadSettings( _this, "arp" ); + m_arpRangeModel.loadSettings( _this, "arprange" ); + m_arpTimeModel.loadSettings( _this, "arptime" ); + m_arpGateModel.loadSettings( _this, "arpgate" ); + m_arpDirectionModel.loadSettings( _this, "arpdir" ); +/* + // Keep compatibility with version 0.2.1 file format + if( _this.hasAttribute( "arpsyncmode" ) ) + { + m_arpTimeKnob->setSyncMode( + ( tempoSyncKnob::tempoSyncMode ) _this.attribute( + "arpsyncmode" ).toInt() ); + }*/ + + m_arpModeModel.loadSettings( _this, "arpmode" ); +} + + +#endif diff --git a/src/core/instrument_midi_io.cpp b/src/core/instrument_midi_io.cpp index 5767cf5aa..ca7e88bd6 100644 --- a/src/core/instrument_midi_io.cpp +++ b/src/core/instrument_midi_io.cpp @@ -1,10 +1,9 @@ #ifndef SINGLE_SOURCE_COMPILE /* - * midi_tab_widget.cpp - tab-widget in channel-track-window for setting up - * MIDI-related stuff + * instrument_midi_io.cpp - class instrumentMidiIO * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -27,123 +26,56 @@ #include -#include -#include #include "instrument_midi_io.h" -#include "embed.h" #include "engine.h" -#include "gui_templates.h" #include "instrument_track.h" #include "midi_client.h" #include "midi_port.h" -#include "led_checkbox.h" -#include "lcd_spinbox.h" -#include "song_editor.h" -#include "tab_widget.h" -#include "tooltip.h" +#include "song.h" #include "automatable_model_templates.h" -midiTabWidget::midiTabWidget( instrumentTrack * _instrument_track, +instrumentMidiIO::instrumentMidiIO( instrumentTrack * _instrument_track, midiPort * _port ) : - QWidget( _instrument_track->tabWidgetParent() ), + model( _instrument_track ), m_instrumentTrack( _instrument_track ), m_midiPort( _port ), - m_inputChannelModel(), - m_outputChannelModel(), - m_receiveEnabledModel( FALSE, FALSE, TRUE ), - m_sendEnabledModel( FALSE, FALSE, TRUE ), - m_defaultVelocityInEnabledModel( FALSE, FALSE, TRUE ), - m_defaultVelocityOutEnabledModel( FALSE, FALSE, TRUE ), - m_readablePorts( NULL ), - m_writeablePorts( NULL ) + m_inputChannelModel( m_midiPort->inputChannel() + 1, + 0, MIDI_CHANNEL_COUNT, + intModel::defaultRelStep(), this ), + m_outputChannelModel( m_midiPort->outputChannel() + 1, + 1, MIDI_CHANNEL_COUNT, + intModel::defaultRelStep(), this ), + m_receiveEnabledModel( FALSE, this ), + m_sendEnabledModel( FALSE, this ), + m_defaultVelocityInEnabledModel( FALSE, this ), + m_defaultVelocityOutEnabledModel( FALSE, this ) { - m_setupTabWidget = new tabWidget( tr( "MIDI-SETUP FOR THIS CHANNEL" ), - this ); - m_setupTabWidget->setGeometry( 4, 5, 238, 200 ); - m_inputChannelModel.setTrack( m_instrumentTrack ); - m_inputChannelModel.setRange( 0, MIDI_CHANNEL_COUNT ); - m_inputChannelModel.setValue( m_midiPort->inputChannel() + 1 ); + m_outputChannelModel.setTrack( m_instrumentTrack ); + m_receiveEnabledModel.setTrack( m_instrumentTrack ); + m_defaultVelocityInEnabledModel.setTrack( m_instrumentTrack ); + m_sendEnabledModel.setTrack( m_instrumentTrack ); + m_defaultVelocityOutEnabledModel.setTrack( m_instrumentTrack ); + connect( &m_inputChannelModel, SIGNAL( dataChanged() ), this, SLOT( inputChannelChanged() ) ); - - m_inputChannelSpinBox = new lcdSpinBox( 3, m_setupTabWidget, - tr( "Input channel" ) ); - m_inputChannelSpinBox->setModel( &m_inputChannelModel ); - m_inputChannelSpinBox->addTextForValue( 0, "---" ); - m_inputChannelSpinBox->setLabel( tr( "CHANNEL" ) ); - m_inputChannelSpinBox->move( 28, 52 ); - m_inputChannelSpinBox->setEnabled( FALSE ); - inputChannelChanged(); - - - - m_outputChannelModel.setTrack( m_instrumentTrack ); - m_outputChannelModel.setRange( 1, MIDI_CHANNEL_COUNT ); - m_outputChannelModel.setValue( m_midiPort->outputChannel() + 1 ); connect( &m_outputChannelModel, SIGNAL( dataChanged() ), this, SLOT( outputChannelChanged() ) ); - - m_outputChannelSpinBox = new lcdSpinBox( 3, m_setupTabWidget, - tr( "Output channel" ) ); - m_outputChannelSpinBox->setLabel( tr( "CHANNEL" ) ); - m_outputChannelSpinBox->move( 28, 132 ); - m_outputChannelSpinBox->setEnabled( FALSE ); - outputChannelChanged(); - - - m_receiveEnabledModel.setTrack( m_instrumentTrack ); - m_receiveCheckBox = new ledCheckBox( tr( "Receive MIDI-events" ), - m_setupTabWidget, - tr( "Receive MIDI-events" ) ); - m_receiveCheckBox->setModel( &m_receiveEnabledModel ); - m_receiveCheckBox->move( 10, 34 ); - // enabling/disabling widgets is UI-stuff thus we do not use model here - connect( m_receiveCheckBox, SIGNAL( toggled( bool ) ), - m_inputChannelSpinBox, SLOT( setEnabled( bool ) ) ); connect( &m_receiveEnabledModel, SIGNAL( dataChanged() ), - this, SLOT( midiPortModeChanged() ) ); - - - m_defaultVelocityInEnabledModel.setTrack( m_instrumentTrack ); - m_defaultVelocityInCheckBox = new ledCheckBox( tr( "Default velocity " - "for all input-events" ), - m_setupTabWidget, - tr( "Default input velocity" ) ); - m_defaultVelocityInCheckBox->setModel( - &m_defaultVelocityInEnabledModel ); - m_defaultVelocityInCheckBox->move( 28, 84 ); + this, SLOT( midiPortModeChanged() ) ); connect( &m_defaultVelocityInEnabledModel, SIGNAL( dataChanged() ), - this, SLOT( defaultVelInChanged() ) ); - - - m_sendEnabledModel.setTrack( m_instrumentTrack ); - m_sendCheckBox = new ledCheckBox( tr( "Send MIDI-events" ), - m_setupTabWidget, - tr( "Send MIDI-events" ) ); - m_sendCheckBox->setModel( &m_sendEnabledModel ); - m_sendCheckBox->move( 10, 114 ); - connect( m_sendCheckBox, SIGNAL( toggled( bool ) ), - m_outputChannelSpinBox, SLOT( setEnabled( bool ) ) ); + this, SLOT( defaultVelInChanged() ) ); connect( &m_sendEnabledModel, SIGNAL( dataChanged() ), - this, SLOT( midiPortModeChanged() ) ); - - - m_defaultVelocityOutEnabledModel.setTrack( m_instrumentTrack ); - m_defaultVelocityOutCheckBox = new ledCheckBox( tr( "Default velocity " - "for all output-events" ), - m_setupTabWidget, - tr( "Default output velocity" ) ); - m_defaultVelocityOutCheckBox->setModel( - &m_defaultVelocityOutEnabledModel ); - m_defaultVelocityOutCheckBox->move( 28, 164 ); + this, SLOT( midiPortModeChanged() ) ); connect( &m_defaultVelocityOutEnabledModel, SIGNAL( dataChanged() ), this, SLOT( defaultVelOutChanged() ) ); + inputChannelChanged(); + outputChannelChanged(); const midiPort::modes m = m_midiPort->mode(); @@ -157,38 +89,9 @@ midiTabWidget::midiTabWidget( instrumentTrack * _instrument_track, midiClient * mc = engine::getMixer()->getMIDIClient(); if( mc->isRaw() == FALSE ) { - m_readablePorts = new QMenu( m_setupTabWidget ); - m_readablePorts->setFont( pointSize<9>( - m_readablePorts->font() ) ); - connect( m_readablePorts, SIGNAL( triggered( QAction * ) ), - this, SLOT( activatedReadablePort( QAction * ) ) ); - - m_writeablePorts = new QMenu( m_setupTabWidget ); - m_writeablePorts->setFont( pointSize<9>( - m_writeablePorts->font() ) ); - connect( m_writeablePorts, SIGNAL( triggered( QAction * ) ), - this, SLOT( activatedWriteablePort( QAction * ) ) ); - - // fill menus readablePortsChanged(); writeablePortsChanged(); - QToolButton * rp_btn = new QToolButton( m_setupTabWidget ); - rp_btn->setText( tr( "MIDI-devices to receive " - "MIDI-events from" ) ); - rp_btn->setIcon( embed::getIconPixmap( "midi_in" ) ); - rp_btn->setGeometry( 186, 34, 40, 40 ); - rp_btn->setMenu( m_readablePorts ); - rp_btn->setPopupMode( QToolButton::InstantPopup ); - - QToolButton * wp_btn = new QToolButton( m_setupTabWidget ); - wp_btn->setText( tr( "MIDI-devices to send MIDI-events " - "to" ) ); - wp_btn->setIcon( embed::getIconPixmap( "midi_out" ) ); - wp_btn->setGeometry( 186, 114, 40, 40 ); - wp_btn->setMenu( m_writeablePorts ); - wp_btn->setPopupMode( QToolButton::InstantPopup ); - // we want to get informed about port-changes! mc->connectRPChanged( this, SLOT( readablePortsChanged() ) ); mc->connectWPChanged( this, SLOT( writeablePortsChanged() ) ); @@ -198,14 +101,14 @@ midiTabWidget::midiTabWidget( instrumentTrack * _instrument_track, -midiTabWidget::~midiTabWidget() +instrumentMidiIO::~instrumentMidiIO() { } -void midiTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) +void instrumentMidiIO::saveSettings( QDomDocument & _doc, QDomElement & _this ) { m_inputChannelModel.saveSettings( _doc, _this, "inputchannel" ); m_outputChannelModel.saveSettings( _doc, _this, "outputchannel" ); @@ -214,17 +117,15 @@ void midiTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) m_defaultVelocityInEnabledModel.saveSettings( _doc, _this, "defvelin" ); m_defaultVelocityOutEnabledModel.saveSettings( _doc, _this, "defvelout" ); - if( m_readablePorts != NULL && m_receiveEnabledModel.value() == TRUE ) + if( m_receiveEnabledModel.value() == TRUE ) { - // TODO: M/V-split! QString rp; - QList actions = m_readablePorts->actions(); - for( QList::iterator it = actions.begin(); - it != actions.end(); ++it ) + for( midiPortMap::iterator it = m_readablePorts.begin(); + it != m_readablePorts.end(); ++it ) { - if( ( *it )->isChecked() ) + if( it->second ) { - rp += ( *it )->text() + ","; + rp += it->first + ","; } } // cut off comma @@ -235,17 +136,15 @@ void midiTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "inports", rp ); } - if( m_writeablePorts != NULL && m_sendEnabledModel.value() == TRUE ) + if( m_sendEnabledModel.value() == TRUE ) { - // TODO: M/V-split! QString wp; - QList actions = m_writeablePorts->actions(); - for( QList::iterator it = actions.begin(); - it != actions.end(); ++it ) + for( midiPortMap::iterator it = m_writeablePorts.begin(); + it != m_writeablePorts.end(); ++it ) { - if( ( *it )->isChecked() ) + if( it->second ) { - wp += ( *it )->text() + ","; + wp += it->first + ","; } } // cut off comma @@ -260,7 +159,7 @@ void midiTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) -void midiTabWidget::loadSettings( const QDomElement & _this ) +void instrumentMidiIO::loadSettings( const QDomElement & _this ) { m_inputChannelModel.loadSettings( _this, "inputchannel" ); m_outputChannelModel.loadSettings( _this, "outputchannel" ); @@ -271,35 +170,29 @@ void midiTabWidget::loadSettings( const QDomElement & _this ) // restore connections - if( m_readablePorts != NULL && m_receiveEnabledModel.value() == TRUE ) + if( m_receiveEnabledModel.value() == TRUE ) { - // TODO: M/V-split! QStringList rp = _this.attribute( "inports" ).split( ',' ); - QList actions = m_readablePorts->actions(); - for( QList::iterator it = actions.begin(); - it != actions.end(); ++it ) + for( midiPortMap::iterator it = m_readablePorts.begin(); + it != m_readablePorts.end(); ++it ) { - if( ( *it )->isChecked() != - ( rp.indexOf( ( *it )->text() ) != -1 ) ) + if( it->second != ( rp.indexOf( it->first ) != -1 ) ) { - ( *it )->setChecked( TRUE ); + it->second = TRUE; activatedReadablePort( *it ); } } } - if( m_writeablePorts != NULL && m_sendEnabledModel.value() == TRUE ) + if( m_sendEnabledModel.value() == TRUE ) { - // TODO: M/V-split! QStringList wp = _this.attribute( "outports" ).split( ',' ); - QList actions = m_writeablePorts->actions(); - for( QList::iterator it = actions.begin(); - it != actions.end(); ++it ) + for( midiPortMap::iterator it = m_writeablePorts.begin(); + it != m_writeablePorts.end(); ++it ) { - if( ( *it )->isChecked() != - ( wp.indexOf( ( *it )->text() ) != -1 ) ) + if( it->second != ( wp.indexOf( it->first ) != -1 ) ) { - ( *it )->setChecked( TRUE ); + it->second = TRUE; activatedWriteablePort( *it ); } } @@ -309,25 +202,25 @@ void midiTabWidget::loadSettings( const QDomElement & _this ) -void midiTabWidget::inputChannelChanged( void ) +void instrumentMidiIO::inputChannelChanged( void ) { m_midiPort->setInputChannel( m_inputChannelModel.value() - 1 ); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } -void midiTabWidget::outputChannelChanged( void ) +void instrumentMidiIO::outputChannelChanged( void ) { m_midiPort->setOutputChannel( m_outputChannelModel.value() - 1 ); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } -void midiTabWidget::defaultVelInChanged( void ) +void instrumentMidiIO::defaultVelInChanged( void ) { m_midiPort->enableDefaultVelocityForInEvents( m_defaultVelocityInEnabledModel.value() ); @@ -336,7 +229,7 @@ void midiTabWidget::defaultVelInChanged( void ) -void midiTabWidget::defaultVelOutChanged( void ) +void instrumentMidiIO::defaultVelOutChanged( void ) { m_midiPort->enableDefaultVelocityForOutEvents( m_defaultVelocityOutEnabledModel.value() ); @@ -345,7 +238,7 @@ void midiTabWidget::defaultVelOutChanged( void ) -void midiTabWidget::midiPortModeChanged( void ) +void instrumentMidiIO::midiPortModeChanged( void ) { // this small lookup-table makes everything easier static const midiPort::modes modeTable[2][2] = @@ -357,130 +250,122 @@ void midiTabWidget::midiPortModeChanged( void ) [m_sendEnabledModel.value()] ); // check whether we have to dis-check items in connection-menu - if( m_readablePorts != NULL && m_receiveEnabledModel.value() == FALSE ) + if( m_receiveEnabledModel.value() == FALSE ) { - QList actions = m_readablePorts->actions(); - for( QList::iterator it = actions.begin(); - it != actions.end(); ++it ) + for( midiPortMap::iterator it = m_readablePorts.begin(); + it != m_readablePorts.end(); ++it ) { - if( ( *it )->isChecked() == TRUE ) + if( it->second == TRUE ) { - ( *it )->setChecked( FALSE ); + it->second = FALSE; activatedReadablePort( *it ); } } } - if( m_writeablePorts != NULL && m_sendEnabledModel.value() == FALSE ) + if( m_sendEnabledModel.value() == FALSE ) { - QList actions = m_writeablePorts->actions(); - for( QList::iterator it = actions.begin(); - it != actions.end(); ++it ) + for( midiPortMap::iterator it = m_writeablePorts.begin(); + it != m_writeablePorts.end(); ++it ) { - if( ( *it )->isChecked() == TRUE ) + if( it->second == TRUE ) { - ( *it )->setChecked( FALSE ); + it->second = FALSE; activatedWriteablePort( *it ); } } } - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } -void midiTabWidget::readablePortsChanged( void ) +void instrumentMidiIO::readablePortsChanged( void ) { // first save all selected ports QStringList selected_ports; - QList actions = m_readablePorts->actions(); - for( QList::iterator it = actions.begin(); - it != actions.end(); ++it ) + for( midiPortMap::iterator it = m_readablePorts.begin(); + it != m_readablePorts.end(); ++it ) { - if( ( *it )->isChecked() == TRUE ) + if( it->second == TRUE ) { - selected_ports.push_back( ( *it )->text() ); + selected_ports.push_back( it->first ); } } - m_readablePorts->clear(); - const QStringList & rp = engine::getMixer()->getMIDIClient()-> + m_readablePorts.clear(); + const QStringList & wp = engine::getMixer()->getMIDIClient()-> readablePorts(); // now insert new ports and restore selections - for( QStringList::const_iterator it = rp.begin(); it != rp.end(); ++it ) + for( QStringList::const_iterator it = wp.begin(); it != wp.end(); ++it ) { - QAction * item = m_readablePorts->addAction( *it ); - item->setCheckable( TRUE ); - if( selected_ports.indexOf( *it ) != -1 ) - { - item->setChecked( TRUE ); - } + m_readablePorts.push_back( qMakePair( *it, + selected_ports.indexOf( *it ) != -1 ) ); } + emit dataChanged(); } -void midiTabWidget::writeablePortsChanged( void ) +void instrumentMidiIO::writeablePortsChanged( void ) { // first save all selected ports QStringList selected_ports; - QList actions = m_writeablePorts->actions(); - for( QList::iterator it = actions.begin(); - it != actions.end(); ++it ) + for( midiPortMap::iterator it = m_writeablePorts.begin(); + it != m_writeablePorts.end(); ++it ) { - if( ( *it )->isChecked() == TRUE ) + if( it->second == TRUE ) { - selected_ports.push_back( ( *it )->text() ); + selected_ports.push_back( it->first ); } } - m_writeablePorts->clear(); + m_writeablePorts.clear(); const QStringList & wp = engine::getMixer()->getMIDIClient()-> writeablePorts(); // now insert new ports and restore selections for( QStringList::const_iterator it = wp.begin(); it != wp.end(); ++it ) { - QAction * item = m_writeablePorts->addAction( *it ); - item->setCheckable( TRUE ); - if( selected_ports.indexOf( *it ) != -1 ) - { - item->setChecked( TRUE ); - } + m_writeablePorts.push_back( qMakePair( *it, + selected_ports.indexOf( *it ) != -1 ) ); } + emit dataChanged(); } -void midiTabWidget::activatedReadablePort( QAction * _item ) +void instrumentMidiIO::activatedReadablePort( + const descriptiveMidiPort & _port ) { // make sure, MIDI-port is configured for input - if( _item->isChecked() == TRUE && + if( _port.second == TRUE && m_midiPort->mode() != midiPort::INPUT && m_midiPort->mode() != midiPort::DUPLEX ) { m_receiveEnabledModel.setValue( TRUE ); } engine::getMixer()->getMIDIClient()->subscribeReadablePort( m_midiPort, - _item->text(), !_item->isChecked() ); + _port.first, !_port.second ); } -void midiTabWidget::activatedWriteablePort( QAction * _item ) +void instrumentMidiIO::activatedWriteablePort( + const descriptiveMidiPort & _port ) { // make sure, MIDI-port is configured for output - if( _item->isChecked() == TRUE && + if( _port.second == TRUE && m_midiPort->mode() != midiPort::OUTPUT && m_midiPort->mode() != midiPort::DUPLEX ) { m_sendEnabledModel.setValue( TRUE ); } engine::getMixer()->getMIDIClient()->subscribeWriteablePort( m_midiPort, - _item->text(), !_item->isChecked() ); + _port.first, !_port.second ); } diff --git a/src/core/instrument_sound_shaping.cpp b/src/core/instrument_sound_shaping.cpp index 803f4a185..0f386ba20 100644 --- a/src/core/instrument_sound_shaping.cpp +++ b/src/core/instrument_sound_shaping.cpp @@ -1,8 +1,7 @@ #ifndef SINGLE_SOURCE_COMPILE /* - * envelope_tab_widget.cpp - widget for use in envelope/lfo/filter-tab of - * instrument-track-window + * instrument_sound_shaping.cpp - class instrumentSoundShaping * * Copyright (c) 2004-2008 Tobias Doerffel * @@ -30,29 +29,14 @@ #include "instrument_sound_shaping.h" -#include "combobox.h" #include "embed.h" #include "engine.h" #include "envelope_and_lfo_parameters.h" -#include "group_box.h" -#include "gui_templates.h" #include "instrument_track.h" -#include "knob.h" #include "note_play_handle.h" -#include "tab_widget.h" -const int TARGETS_TABWIDGET_X = 4; -const int TARGETS_TABWIDGET_Y = 5; -const int TARGETS_TABWIDGET_WIDTH = 238; -const int TARGETS_TABWIDGET_HEIGTH = 175; - -const int FILTER_GROUPBOX_X = TARGETS_TABWIDGET_X; -const int FILTER_GROUPBOX_Y = TARGETS_TABWIDGET_Y+TARGETS_TABWIDGET_HEIGTH+5; -const int FILTER_GROUPBOX_WIDTH = TARGETS_TABWIDGET_WIDTH; -const int FILTER_GROUPBOX_HEIGHT = 245-FILTER_GROUPBOX_Y; - const float CUT_FREQ_MULTIPLIER = 6000.0f; const float RES_MULTIPLIER = 2.0f; const float RES_PRECISION = 1000.0f; @@ -60,149 +44,75 @@ const float RES_PRECISION = 1000.0f; // names for env- and lfo-targets - first is name being displayed to user // and second one is used internally, e.g. for saving/restoring settings -static const QString targetNames[envelopeTabWidget::TARGET_COUNT][2] = +const QString __targetNames[instrumentSoundShaping::NumTargets][2] = { - { envelopeTabWidget::tr( "VOLUME" ), "vol" }, -/* envelopeTabWidget::tr( "Pan" ), - envelopeTabWidget::tr( "Pitch" ),*/ - { envelopeTabWidget::tr( "CUTOFF" ), "cut" }, - { envelopeTabWidget::tr( "Q/RESO" ), "res" } + { instrumentSoundShaping::tr( "VOLUME" ), "vol" }, +/* instrumentSoundShaping::tr( "Pan" ), + instrumentSoundShaping::tr( "Pitch" ),*/ + { instrumentSoundShaping::tr( "CUTOFF" ), "cut" }, + { instrumentSoundShaping::tr( "Q/RESO" ), "res" } } ; -envelopeTabWidget::envelopeTabWidget( instrumentTrack * _instrument_track ) : - QWidget( _instrument_track->tabWidgetParent() ), +instrumentSoundShaping::instrumentSoundShaping( + instrumentTrack * _instrument_track ) : + model( _instrument_track ), m_instrumentTrack( _instrument_track ), - m_filterEnabledModel( new boolModel( FALSE /* this */ ) ), - m_filterModel( new comboBoxModel( /* this */ ) ), - m_filterCutModel( new floatModel( /* this */ ) ), - m_filterResModel( new floatModel( /* this */ ) ) + m_filterEnabledModel( FALSE, this ), + m_filterModel( this ), + m_filterCutModel( 16000.0, 0.0, 14000.0, 1.0, this ), + m_filterResModel( 0.5, basicFilters<>::minQ(), 10.0, 0.01, this ) { - m_targetsTabWidget = new tabWidget( tr( "TARGET" ), this ); - m_targetsTabWidget->setGeometry( TARGETS_TABWIDGET_X, - TARGETS_TABWIDGET_Y, - TARGETS_TABWIDGET_WIDTH, - TARGETS_TABWIDGET_HEIGTH ); - m_targetsTabWidget->setWhatsThis( - tr( "These tabs contain envelopes. They're very important for " - "modifying a sound, for not saying that they're almost " - "always neccessary for substractive synthesis. For " - "example if you have a volume-envelope, you can set " - "when the sound should have which volume-level. " - "Maybe you want to create some soft strings. Then your " - "sound has to fade in and out very softly. This can be " - "done by setting a large attack- and release-time. " - "It's the same for other envelope-targets like " - "panning, cutoff-frequency of used filter and so on. " - "Just monkey around with it! You can really make cool " - "sounds out of a saw-wave with just some " - "envelopes...!" ) ); - - for( int i = 0; i < TARGET_COUNT; ++i ) + for( int i = 0; i < NumTargets; ++i ) { float value_for_zero_amount = 0.0; - if( i == VOLUME ) + if( i == Volume ) { value_for_zero_amount = 1.0; } - m_envLFOWidgets[i] = new envelopeAndLFOWidget( - value_for_zero_amount, - m_targetsTabWidget, - _instrument_track ); - m_targetsTabWidget->addTab( m_envLFOWidgets[i], - tr( targetNames[i][0] - .toAscii().constData() ) ); + m_envLFOParameters[i] = new envelopeAndLFOParameters( + value_for_zero_amount, + _instrument_track, + this ); } + m_filterEnabledModel.setTrack( _instrument_track ); - m_filterEnabledModel->setTrack( _instrument_track ); - m_filterGroupBox = new groupBox( tr( "FILTER" ), this ); - m_filterGroupBox->setModel( m_filterEnabledModel ); - m_filterGroupBox->setGeometry( FILTER_GROUPBOX_X, FILTER_GROUPBOX_Y, - FILTER_GROUPBOX_WIDTH, - FILTER_GROUPBOX_HEIGHT ); - - - m_filterModel->addItem( tr( "LowPass" ), new QPixmap( + m_filterModel.addItem( tr( "LowPass" ), new QPixmap( embed::getIconPixmap( "filter_lp" ) ) ); - m_filterModel->addItem( tr( "HiPass" ), new QPixmap( + m_filterModel.addItem( tr( "HiPass" ), new QPixmap( embed::getIconPixmap( "filter_hp" ) ) ); - m_filterModel->addItem( tr( "BandPass csg" ), new QPixmap( + m_filterModel.addItem( tr( "BandPass csg" ), new QPixmap( embed::getIconPixmap( "filter_bp" ) ) ); - m_filterModel->addItem( tr( "BandPass czpg" ), new QPixmap( + m_filterModel.addItem( tr( "BandPass czpg" ), new QPixmap( embed::getIconPixmap( "filter_bp" ) ) ); - m_filterModel->addItem( tr( "Notch" ), new QPixmap( + m_filterModel.addItem( tr( "Notch" ), new QPixmap( embed::getIconPixmap( "filter_notch" ) ) ); - m_filterModel->addItem( tr( "Allpass" ), new QPixmap( + m_filterModel.addItem( tr( "Allpass" ), new QPixmap( embed::getIconPixmap( "filter_ap" ) ) ); - m_filterModel->addItem( tr( "Moog" ), new QPixmap( + m_filterModel.addItem( tr( "Moog" ), new QPixmap( embed::getIconPixmap( "filter_lp" ) ) ); - m_filterModel->addItem( tr( "2x LowPass" ), new QPixmap( + m_filterModel.addItem( tr( "2x LowPass" ), new QPixmap( embed::getIconPixmap( "filter_2lp" ) ) ); - m_filterModel->setTrack( _instrument_track ); - m_filterComboBox = new comboBox( m_filterGroupBox, tr( "Filter type" ) ); - m_filterComboBox->setModel( m_filterModel ); - m_filterComboBox->setGeometry( 14, 22, 120, 22 ); - m_filterComboBox->setFont( pointSize<8>( m_filterComboBox->font() ) ); - - m_filterComboBox->setWhatsThis( - tr( "Here you can select the built-in filter you want to use " - "for this instrument-track. Filters are very important " - "for changing the characteristics of a sound." ) ); - - - m_filterCutModel->setTrack( _instrument_track ); - m_filterCutModel->setRange( 0.0, 14000.0, 1.0 ); - m_filterCutModel->setInitValue( 16000.0 ); - - m_filterCutKnob = new knob( knobBright_26, m_filterGroupBox, - tr( "cutoff-frequency" ) ); - m_filterCutKnob->setModel( m_filterCutModel ); - m_filterCutKnob->setLabel( tr( "CUTOFF" ) ); - m_filterCutKnob->move( 140, 18 ); - m_filterCutKnob->setHintText( tr( "cutoff-frequency:" ) + " ", " " + - tr( "Hz" ) ); - m_filterCutKnob->setWhatsThis( - tr( "Use this knob for setting the cutoff-frequency for the " - "selected filter. The cutoff-frequency specifies the " - "frequency for cutting the signal by a filter. For " - "example a lowpass-filter cuts all frequencies above " - "the cutoff-frequency. A highpass-filter cuts all " - "frequencies below cutoff-frequency and so on..." ) ); - - - - m_filterResModel->setTrack( _instrument_track ); - m_filterResModel->setRange( basicFilters<>::minQ(), 10.0, 0.01 ); - m_filterResModel->setInitValue( 0.5 ); - - m_filterResKnob = new knob( knobBright_26, m_filterGroupBox, - tr( "Q/Resonance" ) ); - m_filterResKnob->setModel( m_filterResModel ); - m_filterResKnob->setLabel( tr( "Q/RESO" ) ); - m_filterResKnob->move( 190, 18 ); - m_filterResKnob->setHintText( tr( "Q/Resonance:" ) + " ", "" ); - m_filterResKnob->setWhatsThis( - tr( "Use this knob for setting Q/Resonance for the selected " - "filter. Q/Resonance tells the filter, how much it " - "should amplify frequencies near Cutoff-frequency." ) ); + m_filterModel.setTrack( _instrument_track ); + m_filterCutModel.setTrack( _instrument_track ); + m_filterResModel.setTrack( _instrument_track ); } -envelopeTabWidget::~envelopeTabWidget() +instrumentSoundShaping::~instrumentSoundShaping() { - delete m_targetsTabWidget; } -float FASTCALL envelopeTabWidget::volumeLevel( notePlayHandle * _n, +float instrumentSoundShaping::volumeLevel( notePlayHandle * _n, const f_cnt_t _frame ) { f_cnt_t release_begin = _frame - _n->releaseFramesDone() + @@ -214,7 +124,7 @@ float FASTCALL envelopeTabWidget::volumeLevel( notePlayHandle * _n, } float volume_level; - m_envLFOWidgets[VOLUME]->fillLevel( &volume_level, _frame, + m_envLFOParameters[Volume]->fillLevel( &volume_level, _frame, release_begin, 1 ); return( volume_level ); @@ -223,7 +133,7 @@ float FASTCALL envelopeTabWidget::volumeLevel( notePlayHandle * _n, -void envelopeTabWidget::processAudioBuffer( sampleFrame * _ab, +void instrumentSoundShaping::processAudioBuffer( sampleFrame * _ab, const fpp_t _frames, notePlayHandle * _n ) { @@ -244,7 +154,7 @@ void envelopeTabWidget::processAudioBuffer( sampleFrame * _ab, // only use filter, if it is really needed - if( m_filterEnabledModel->value() ) + if( m_filterEnabledModel.value() ) { int old_filter_cut = 0; int old_filter_res = 0; @@ -254,33 +164,34 @@ void envelopeTabWidget::processAudioBuffer( sampleFrame * _ab, _n->m_filter = new basicFilters<>( engine::getMixer()->sampleRate() ); } - _n->m_filter->setFilterType( m_filterComboBox->value() ); + _n->m_filter->setFilterType( m_filterModel.value() ); float * cut_buf = NULL; float * res_buf = NULL; - if( m_envLFOWidgets[CUT]->used() ) + if( m_envLFOParameters[Cut]->used() ) { cut_buf = new float[_frames]; - m_envLFOWidgets[CUT]->fillLevel( cut_buf, total_frames, + m_envLFOParameters[Cut]->fillLevel( cut_buf, total_frames, release_begin, _frames ); } - if( m_envLFOWidgets[RES]->used() ) + if( m_envLFOParameters[Resonance]->used() ) { res_buf = new float[_frames]; - m_envLFOWidgets[RES]->fillLevel( res_buf, total_frames, - release_begin, _frames ); + m_envLFOParameters[Resonance]->fillLevel( res_buf, + total_frames, release_begin, + _frames ); } - if( m_envLFOWidgets[CUT]->used() && - m_envLFOWidgets[RES]->used() ) + if( m_envLFOParameters[Cut]->used() && + m_envLFOParameters[Resonance]->used() ) { for( fpp_t frame = 0; frame < _frames; ++frame ) { - float new_cut_val = envelopeAndLFOWidget::expKnobVal( cut_buf[frame] ) * CUT_FREQ_MULTIPLIER + - m_filterCutKnob->value(); + float new_cut_val = envelopeAndLFOParameters::expKnobVal( cut_buf[frame] ) * CUT_FREQ_MULTIPLIER + + m_filterCutModel.value(); - float new_res_val = m_filterResKnob->value() + RES_MULTIPLIER * + float new_res_val = m_filterResModel.value() + RES_MULTIPLIER * res_buf[frame]; if( static_cast( new_cut_val ) != old_filter_cut || @@ -297,16 +208,16 @@ void envelopeTabWidget::processAudioBuffer( sampleFrame * _ab, } } } - else if( m_envLFOWidgets[CUT]->used() ) + else if( m_envLFOParameters[Cut]->used() ) { for( fpp_t frame = 0; frame < _frames; ++frame ) { - float new_cut_val = envelopeAndLFOWidget::expKnobVal( cut_buf[frame] ) * CUT_FREQ_MULTIPLIER + - m_filterCutKnob->value(); + float new_cut_val = envelopeAndLFOParameters::expKnobVal( cut_buf[frame] ) * CUT_FREQ_MULTIPLIER + + m_filterCutModel.value(); if( static_cast( new_cut_val ) != old_filter_cut ) { - _n->m_filter->calcFilterCoeffs( new_cut_val, m_filterResKnob->value() ); + _n->m_filter->calcFilterCoeffs( new_cut_val, m_filterResModel.value() ); old_filter_cut = static_cast( new_cut_val ); } @@ -316,16 +227,16 @@ void envelopeTabWidget::processAudioBuffer( sampleFrame * _ab, } } } - else if( m_envLFOWidgets[RES]->used() ) + else if( m_envLFOParameters[Resonance]->used() ) { for( fpp_t frame = 0; frame < _frames; ++frame ) { - float new_res_val = m_filterResKnob->value() + RES_MULTIPLIER * + float new_res_val = m_filterResModel.value() + RES_MULTIPLIER * res_buf[frame]; if( static_cast( new_res_val*RES_PRECISION ) != old_filter_res ) { - _n->m_filter->calcFilterCoeffs( m_filterCutKnob->value(), new_res_val ); + _n->m_filter->calcFilterCoeffs( m_filterCutModel.value(), new_res_val ); old_filter_res = static_cast( new_res_val*RES_PRECISION ); } @@ -337,7 +248,7 @@ void envelopeTabWidget::processAudioBuffer( sampleFrame * _ab, } else { - _n->m_filter->calcFilterCoeffs( m_filterCutKnob->value(), m_filterResKnob->value() ); + _n->m_filter->calcFilterCoeffs( m_filterCutModel.value(), m_filterResModel.value() ); for( fpp_t frame = 0; frame < _frames; ++frame ) { @@ -352,10 +263,10 @@ void envelopeTabWidget::processAudioBuffer( sampleFrame * _ab, delete[] res_buf; } - if( m_envLFOWidgets[VOLUME]->used() ) + if( m_envLFOParameters[Volume]->used() ) { float * vol_buf = new float[_frames]; - m_envLFOWidgets[VOLUME]->fillLevel( vol_buf, total_frames, + m_envLFOParameters[Volume]->fillLevel( vol_buf, total_frames, release_begin, _frames ); for( fpp_t frame = 0; frame < _frames; ++frame ) @@ -371,7 +282,7 @@ void envelopeTabWidget::processAudioBuffer( sampleFrame * _ab, delete[] vol_buf; } -/* else if( m_envLFOWidgets[VOLUME]->used() == FALSE && m_envLFOWidgets[PANNING]->used() ) +/* else if( m_envLFOParameters[Volume]->used() == FALSE && m_envLFOParameters[PANNING]->used() ) { // only use panning-envelope... for( fpp_t frame = 0; frame < _frames; ++frame ) @@ -389,18 +300,18 @@ void envelopeTabWidget::processAudioBuffer( sampleFrame * _ab, -f_cnt_t envelopeTabWidget::envFrames( const bool _only_vol ) +f_cnt_t instrumentSoundShaping::envFrames( const bool _only_vol ) const { - f_cnt_t ret_val = m_envLFOWidgets[VOLUME]->m_pahdFrames; + f_cnt_t ret_val = m_envLFOParameters[Volume]->PAHD_Frames(); if( _only_vol == FALSE ) { - for( int i = VOLUME+1; i < TARGET_COUNT; ++i ) + for( int i = Volume+1; i < NumTargets; ++i ) { - if( m_envLFOWidgets[i]->used() && - m_envLFOWidgets[i]->m_pahdFrames > ret_val ) + if( m_envLFOParameters[i]->used() && + m_envLFOParameters[i]->PAHD_Frames() > ret_val ) { - ret_val = m_envLFOWidgets[i]->m_pahdFrames; + ret_val = m_envLFOParameters[i]->PAHD_Frames(); } } } @@ -410,10 +321,10 @@ f_cnt_t envelopeTabWidget::envFrames( const bool _only_vol ) -f_cnt_t envelopeTabWidget::releaseFrames( const bool _only_vol ) +f_cnt_t instrumentSoundShaping::releaseFrames( const bool _only_vol ) const { - f_cnt_t ret_val = m_envLFOWidgets[VOLUME]->used() ? - m_envLFOWidgets[VOLUME]->m_rFrames : 0; + f_cnt_t ret_val = m_envLFOParameters[Volume]->used() ? + m_envLFOParameters[Volume]->releaseFrames() : 0; if( m_instrumentTrack->getInstrument()->desiredReleaseFrames() > ret_val ) { @@ -421,14 +332,15 @@ f_cnt_t envelopeTabWidget::releaseFrames( const bool _only_vol ) desiredReleaseFrames(); } - if( m_envLFOWidgets[VOLUME]->used() == FALSE ) + if( m_envLFOParameters[Volume]->used() == FALSE ) { - for( int i = VOLUME+1; i < TARGET_COUNT; ++i ) + for( int i = Volume+1; i < NumTargets; ++i ) { - if( m_envLFOWidgets[i]->used() && - m_envLFOWidgets[i]->m_rFrames > ret_val ) + if( m_envLFOParameters[i]->used() && + m_envLFOParameters[i]->releaseFrames() > + ret_val ) { - ret_val = m_envLFOWidgets[i]->m_rFrames; + ret_val = m_envLFOParameters[i]->releaseFrames(); } } } @@ -438,43 +350,44 @@ f_cnt_t envelopeTabWidget::releaseFrames( const bool _only_vol ) -void envelopeTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) +void instrumentSoundShaping::saveSettings( QDomDocument & _doc, QDomElement & _this ) { - m_filterModel->saveSettings( _doc, _this, "ftype" ); - m_filterCutModel->saveSettings( _doc, _this, "fcut" ); - m_filterResModel->saveSettings( _doc, _this, "fres" ); - m_filterEnabledModel->saveSettings( _doc, _this, "fwet" ); + m_filterModel.saveSettings( _doc, _this, "ftype" ); + m_filterCutModel.saveSettings( _doc, _this, "fcut" ); + m_filterResModel.saveSettings( _doc, _this, "fres" ); + m_filterEnabledModel.saveSettings( _doc, _this, "fwet" ); - for( int i = 0; i < TARGET_COUNT; ++i ) + for( int i = 0; i < NumTargets; ++i ) { - m_envLFOWidgets[i]->saveState( _doc, _this ).setTagName( - m_envLFOWidgets[i]->nodeName() + - QString( targetNames[i][1] ).toLower() ); + m_envLFOParameters[i]->saveState( _doc, _this ).setTagName( + m_envLFOParameters[i]->nodeName() + + QString( __targetNames[i][1] ).toLower() ); } } -void envelopeTabWidget::loadSettings( const QDomElement & _this ) +void instrumentSoundShaping::loadSettings( const QDomElement & _this ) { - m_filterModel->loadSettings( _this, "ftype" ); - m_filterCutModel->loadSettings( _this, "fcut" ); - m_filterResModel->loadSettings( _this, "fres" ); - m_filterEnabledModel->loadSettings( _this, "fwet" ); + m_filterModel.loadSettings( _this, "ftype" ); + m_filterCutModel.loadSettings( _this, "fcut" ); + m_filterResModel.loadSettings( _this, "fres" ); + m_filterEnabledModel.loadSettings( _this, "fwet" ); QDomNode node = _this.firstChild(); while( !node.isNull() ) { if( node.isElement() ) { - for( int i = 0; i < TARGET_COUNT; ++i ) + for( int i = 0; i < NumTargets; ++i ) { if( node.nodeName() == - m_envLFOWidgets[i]->nodeName() + - QString( targetNames[i][1] ).toLower() ) + m_envLFOParameters[i]->nodeName() + + QString( __targetNames[i][1] ). + toLower() ) { - m_envLFOWidgets[i]->restoreState( + m_envLFOParameters[i]->restoreState( node.toElement() ); } } @@ -486,9 +399,7 @@ void envelopeTabWidget::loadSettings( const QDomElement & _this ) -#include "instrument_sound_shaping.moc" - - +//#include "instrument_sound_shaping.moc" /* diff --git a/src/core/main.cpp b/src/core/main.cpp index c9211f392..449b8c665 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -41,7 +41,7 @@ #include "engine.h" #include "config_mgr.h" #include "export_project_dialog.h" -#include "song_editor.h" +#include "song.h" #include "gui_templates.h" #include "automatable_model_templates.h" @@ -200,11 +200,11 @@ int main( int argc, char * * argv ) // we try to load given file if( file_to_load != "" ) { - engine::getSongEditor()->loadProject( file_to_load ); + engine::getSong()->loadProject( file_to_load ); } else { - engine::getSongEditor()->createNewProject(); + engine::getSong()->createNewProject(); } // MDI-mode? diff --git a/src/core/main_window.cpp b/src/core/main_window.cpp index 34d9e98d3..8b1248fa2 100644 --- a/src/core/main_window.cpp +++ b/src/core/main_window.cpp @@ -48,6 +48,7 @@ #include "bb_editor.h" #include "song_editor.h" +#include "song.h" #include "piano_roll.h" #include "embed.h" #include "engine.h" @@ -77,8 +78,7 @@ mainWindow::mainWindow( void ) : m_workspace( NULL ), m_templatesMenu( NULL ), m_recentlyOpenedProjectsMenu( NULL ), - m_toolsMenu( NULL ), - m_modified( FALSE ) + m_toolsMenu( NULL ) { setAttribute( Qt::WA_DeleteOnClose ); @@ -514,24 +514,23 @@ void mainWindow::addSpacingToToolBar( int _size ) -void mainWindow::resetWindowTitle( bool _modified ) +void mainWindow::resetWindowTitle( void ) { QString title = ""; - if( engine::getSongEditor()->projectFileName() != "" ) + if( engine::getSong()->projectFileName() != "" ) { - title = QFileInfo( engine::getSongEditor()->projectFileName() + title = QFileInfo( engine::getSong()->projectFileName() ).completeBaseName(); } if( title == "" ) { title = tr( "Untitled" ); } - if( _modified ) + if( engine::getSong()->isModified() ) { title += '*'; } setWindowTitle( title + " - " + tr( "LMMS %1" ).arg( VERSION ) ); - m_modified = _modified; } @@ -539,7 +538,7 @@ void mainWindow::resetWindowTitle( bool _modified ) bool mainWindow::mayChangeProject( void ) { - if( !m_modified ) + if( !engine::getSong()->isModified() ) { return( TRUE ); } @@ -626,7 +625,7 @@ void mainWindow::createNewProject( void ) { if( mayChangeProject() ) { - engine::getSongEditor()->createNewProject(); + engine::getSong()->createNewProject(); } } @@ -641,7 +640,7 @@ void mainWindow::createNewProjectFromTemplate( QAction * _idx ) >= m_custom_templates_count ? configManager::inst()->factoryProjectsDir() : configManager::inst()->userProjectsDir(); - engine::getSongEditor()->createNewProjectFromTemplate( + engine::getSong()->createNewProjectFromTemplate( dir_base + "templates/" + _idx->text() + ".mpt" ); } } @@ -661,7 +660,7 @@ void mainWindow::openProject( void ) if( ofd.exec () == QDialog::Accepted && !ofd.selectedFiles().isEmpty() ) { - engine::getSongEditor()->loadProject( + engine::getSong()->loadProject( ofd.selectedFiles()[0] ); } } @@ -686,7 +685,7 @@ void mainWindow::updateRecentlyOpenedProjectsMenu( void ) void mainWindow::openRecentlyOpenedProject( QAction * _action ) { const QString & f = _action->text(); - engine::getSongEditor()->loadProject( f ); + engine::getSong()->loadProject( f ); configManager::inst()->addRecentlyOpenedProject( f ); } @@ -695,13 +694,13 @@ void mainWindow::openRecentlyOpenedProject( QAction * _action ) bool mainWindow::saveProject( void ) { - if( engine::getSongEditor()->projectFileName() == "" ) + if( engine::getSong()->projectFileName() == "" ) { return( saveProjectAs() ); } else { - engine::getSongEditor()->saveProject(); + engine::getSong()->saveProject(); } return( TRUE ); } @@ -716,7 +715,7 @@ bool mainWindow::saveProjectAs( void ) "MultiMedia Project Template (*.mpt)" ) ); sfd.setAcceptMode( QFileDialog::AcceptSave ); sfd.setFileMode( QFileDialog::AnyFile ); - QString f = engine::getSongEditor()->projectFileName(); + QString f = engine::getSong()->projectFileName(); if( f != "" ) { sfd.selectFile( QFileInfo( f ).fileName() ); @@ -730,7 +729,7 @@ bool mainWindow::saveProjectAs( void ) if( sfd.exec () == QFileDialog::Accepted && !sfd.selectedFiles().isEmpty() && sfd.selectedFiles()[0] != "" ) { - engine::getSongEditor()->saveProjectAs( + engine::getSong()->saveProjectAs( sfd.selectedFiles()[0] ); return( TRUE ); } diff --git a/src/core/mixer.cpp b/src/core/mixer.cpp index c11940acf..9b421c204 100644 --- a/src/core/mixer.cpp +++ b/src/core/mixer.cpp @@ -29,7 +29,7 @@ #include "mixer.h" #include "play_handle.h" -#include "song_editor.h" +#include "song.h" #include "templates.h" #include "envelope_and_lfo_parameters.h" #include "debug.h" @@ -177,7 +177,7 @@ void mixer::stopProcessing( void ) bool mixer::criticalXRuns( void ) const { return( ( m_cpuLoad >= 99 && - engine::getSongEditor()->realTimeTask() == TRUE ) ); + engine::getSong()->realTimeTask() == TRUE ) ); } @@ -230,11 +230,11 @@ void mixer::setClipScaling( bool _state ) const surroundSampleFrame * mixer::renderNextBuffer( void ) { microTimer timer; - static songEditor::playPos last_metro_pos = -1; + static song::playPos last_metro_pos = -1; - songEditor::playPos p = engine::getSongEditor()->getPlayPos( - songEditor::PLAY_PATTERN ); - if( engine::getSongEditor()->playMode() == songEditor::PLAY_PATTERN && + song::playPos p = engine::getSong()->getPlayPos( + song::Mode_PlayPattern ); + if( engine::getSong()->playMode() == song::Mode_PlayPattern && engine::getPianoRoll()->isRecording() == TRUE && p != last_metro_pos && p.getTact64th() % 16 == 0 ) { @@ -288,7 +288,7 @@ const surroundSampleFrame * mixer::renderNextBuffer( void ) //printf("---------------------------next period\n"); // if( criticalXRuns() == FALSE ) { - engine::getSongEditor()->processNextBuffer(); + engine::getSong()->processNextBuffer(); lockPlayHandles(); int idx = 0; @@ -382,7 +382,7 @@ const surroundSampleFrame * mixer::renderNextBuffer( void ) emit nextAudioBuffer(); // and trigger LFOs - envelopeAndLFOWidget::triggerLFO(); + envelopeAndLFOParameters::triggerLFO(); const float new_cpu_load = timer.elapsed() / 10000.0f * sampleRate() / m_framesPerPeriod; diff --git a/src/core/mv_base.cpp b/src/core/mv_base.cpp index 3eb7ded89..f9089d073 100644 --- a/src/core/mv_base.cpp +++ b/src/core/mv_base.cpp @@ -35,6 +35,7 @@ void modelView::setModel( model * _model, bool _old_model_valid ) QWidget * w = dynamic_cast( this ); assert( w != NULL ); +//printf("w: %x m_model:%x _model:%x\n", w, m_model, _model); if( _old_model_valid && m_model != NULL ) { if( m_model->defaultConstructed() ) @@ -46,7 +47,6 @@ void modelView::setModel( model * _model, bool _old_model_valid ) m_model->disconnect( w ); } } - m_model = _model; QObject::connect( _model, SIGNAL( dataChanged() ), w, SLOT( update() ) ); diff --git a/src/core/name_label.cpp b/src/core/name_label.cpp index c3d313dce..c3f4a6296 100644 --- a/src/core/name_label.cpp +++ b/src/core/name_label.cpp @@ -4,7 +4,7 @@ * name_label.cpp - implementation of class nameLabel, a label which * is renamable by double-clicking it * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -148,7 +148,6 @@ void nameLabel::rename( void ) { setText( txt ); emit nameChanged( txt ); - emit nameChanged(); } } @@ -222,13 +221,14 @@ void nameLabel::paintEvent( QPaintEvent * ) text() ); p.setPen( QColor( 0, 224, 0 ) ); - bbTrack * bbt = bbTrack::findBBTrack( - engine::getBBEditor()->currentBB() ); +#warning: TODO +/* bbTrack * bbt = bbTrack::findBBTrack( + engine::getBBTrackContainer()->currentBB() ); if( bbt != NULL && bbt->getTrackSettingsWidget() == dynamic_cast( parentWidget() ) ) { p.setPen( QColor( 255, 255, 255 ) ); - } + }*/ p.drawText( x, height() / 2 + p.fontMetrics().height() / 2 - 4, text() ); diff --git a/src/core/note_play_handle.cpp b/src/core/note_play_handle.cpp index af3ca2e42..826dc7782 100644 --- a/src/core/note_play_handle.cpp +++ b/src/core/note_play_handle.cpp @@ -4,7 +4,7 @@ * note_play_handle.cpp - implementation of class notePlayHandle, part of * play-engine * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -33,7 +33,7 @@ #include "instrument_sound_shaping.h" #include "instrument_track.h" #include "midi_port.h" -#include "song_editor.h" +#include "song.h" inline notePlayHandle::baseDetuning::baseDetuning( @@ -85,7 +85,7 @@ notePlayHandle::notePlayHandle( instrumentTrack * _it, #if SINGERBOT_SUPPORT m_patternIndex( 0 ), #endif - m_orig_bpm( engine::getSongEditor()->getTempo() ) + m_orig_bpm( engine::getSong()->getTempo() ) { if( m_baseNote ) { @@ -306,7 +306,7 @@ void notePlayHandle::noteOff( const f_cnt_t _s ) // then set some variables indicating release-state m_framesBeforeRelease = _s; m_releaseFramesToDo = tMax( 0, // 10, - m_instrumentTrack->m_envWidget->releaseFrames() ); + m_instrumentTrack->m_soundShaping.releaseFrames() ); // send MIDI-note-off-event m_instrumentTrack->processOutEvent( midiEvent( NOTE_OFF, m_instrumentTrack->m_midiPort->outputChannel(), @@ -322,7 +322,7 @@ void notePlayHandle::noteOff( const f_cnt_t _s ) f_cnt_t notePlayHandle::actualReleaseFramesToDo( void ) const { - return( m_instrumentTrack->m_envWidget->releaseFrames( + return( m_instrumentTrack->m_soundShaping.releaseFrames( arpBaseNote() ) ); } @@ -344,7 +344,7 @@ void notePlayHandle::setFrames( const f_cnt_t _frames ) float notePlayHandle::volumeLevel( const f_cnt_t _frame ) { - return( m_instrumentTrack->m_envWidget->volumeLevel( this, _frame ) ); + return( m_instrumentTrack->m_soundShaping.volumeLevel( this, _frame ) ); } @@ -441,7 +441,7 @@ void notePlayHandle::updateFrequency( void ) const int base_octave = m_instrumentTrack->baseNoteModel()->value() / NOTES_PER_OCTAVE; const float pitch = (float)( tone() - base_tone + - engine::getSongEditor()->masterPitch() ) / 12.0f + + engine::getSong()->masterPitch() ) / 12.0f + (float)( octave() - base_octave ) + m_base_detuning->value() / 12.0f; m_frequency = BASE_FREQ * powf( 2.0f, pitch ); diff --git a/src/core/piano_roll.cpp b/src/core/piano_roll.cpp index da0e136d6..727fffee0 100644 --- a/src/core/piano_roll.cpp +++ b/src/core/piano_roll.cpp @@ -4,7 +4,7 @@ * piano_roll.cpp - implementation of piano-roll which is used for actual * writing of melodies * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -61,6 +61,7 @@ #include "pattern.h" #include "piano_widget.h" #include "pixmap_button.h" +#include "song.h" #include "song_editor.h" #include "templates.h" #include "text_float.h" @@ -189,8 +190,8 @@ pianoRoll::pianoRoll( void ) : // add time-line m_timeLine = new timeLine( WHITE_KEY_WIDTH, 32, m_ppt, - engine::getSongEditor()->getPlayPos( - songEditor::PLAY_PATTERN ), + engine::getSong()->getPlayPos( + song::Mode_PlayPattern ), m_currentPosition, this ); connect( this, SIGNAL( positionChanged( const midiTime & ) ), m_timeLine, SLOT( updatePosition( const midiTime & ) ) ); @@ -641,8 +642,9 @@ void pianoRoll::keyPressEvent( QKeyEvent * _ke ) { if( validPattern() ) { - m_pattern->getInstrumentTrack()->getPianoWidget() - ->keyPressEvent( _ke ); + // TODO: move this to instrumentTrack-class +/* m_pattern->getInstrumentTrack()->getPianoWidget() + ->keyPressEvent( _ke );*/ } switch( _ke->key() ) { @@ -768,7 +770,7 @@ void pianoRoll::keyPressEvent( QKeyEvent * _ke ) break; case Qt::Key_Space: - if( engine::getSongEditor()->playing() ) + if( engine::getSong()->playing() ) { stop(); } @@ -806,8 +808,8 @@ void pianoRoll::keyReleaseEvent( QKeyEvent * _ke ) { if( validPattern() ) { - m_pattern->getInstrumentTrack()->getPianoWidget() - ->keyReleaseEvent( _ke ); +/* m_pattern->getInstrumentTrack()->getPianoWidget() + ->keyReleaseEvent( _ke );*/ } switch( _ke->key() ) { @@ -934,7 +936,7 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) if( it == notes.end() ) { m_pattern->setType( - pattern::MELODY_PATTERN ); + pattern::MelodyPattern ); // then set new note midiTime note_pos( pos_tact_64th ); @@ -991,7 +993,7 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) QApplication::setOverrideCursor( c ); } - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } else if( ( _me->button() == Qt::RightButton && m_editMode == DRAW ) || @@ -1009,9 +1011,9 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) else { ( *it )->setLength( 0 ); - m_pattern->update(); + m_pattern->dataChanged(); } - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } } else if( _me->button() == Qt::LeftButton && @@ -1050,7 +1052,7 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) m_action = MOVE_SELECTION; play_note = FALSE; - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } else if( _me->button() == Qt::RightButton && m_editMode == MOVE ) @@ -1066,7 +1068,7 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) // was there an action where should be played the note? if( play_note == TRUE && m_recording == FALSE && - engine::getSongEditor()->playing() == FALSE ) + engine::getSong()->playing() == FALSE ) { m_lastKey = key_num; m_pattern->getInstrumentTrack()->processInEvent( @@ -1144,7 +1146,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) m_action != SELECT_NOTES && m_action != MOVE_SELECTION && m_recording == FALSE && - engine::getSongEditor()->playing() == FALSE ) + engine::getSong()->playing() == FALSE ) { m_lastKey = key_num; m_pattern->getInstrumentTrack()->processInEvent( @@ -1171,7 +1173,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) MIN_VOLUME, MAX_VOLUME ); m_currentNote->setVolume( vol ); - m_pattern->update(); + m_pattern->dataChanged(); m_pattern->getInstrumentTrack()->processInEvent( midiEvent( KEY_PRESSURE, 0, key_num, vol * 127 / 100 ), @@ -1219,10 +1221,10 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) tact_64th_diff ) ); m_currentNote->quantizeLength( quantization() ); m_lenOfNewNotes = m_currentNote->length(); - m_pattern->update(); + m_pattern->dataChanged(); } - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } else if( _me->buttons() == Qt::NoButton && m_editMode == DRAW ) @@ -1974,7 +1976,7 @@ void pianoRoll::resizeEvent( QResizeEvent * ) } m_topBottomScroll->setValue( m_totalKeysToScroll - m_startKey ); - engine::getSongEditor()->getPlayPos( songEditor::PLAY_PATTERN + engine::getSong()->getPlayPos( song::Mode_PlayPattern ).m_timeLine->setFixedWidth( width() ); m_toolBar->setFixedWidth( width() ); update(); @@ -2052,31 +2054,30 @@ void pianoRoll::play( void ) return; } - if( engine::getSongEditor()->playing() ) + if( engine::getSong()->playing() ) { - if( engine::getSongEditor()->playMode() != - songEditor::PLAY_PATTERN ) + if( engine::getSong()->playMode() != song::Mode_PlayPattern ) { - engine::getSongEditor()->stop(); - engine::getSongEditor()->playPattern( m_pattern ); + engine::getSong()->stop(); + engine::getSong()->playPattern( m_pattern ); m_playButton->setIcon( embed::getIconPixmap( "pause" ) ); } else { - engine::getSongEditor()->pause(); + engine::getSong()->pause(); m_playButton->setIcon( embed::getIconPixmap( "play" ) ); } } - else if( engine::getSongEditor()->paused() ) + else if( engine::getSong()->paused() ) { - engine::getSongEditor()->resumeFromPause(); + engine::getSong()->resumeFromPause(); m_playButton->setIcon( embed::getIconPixmap( "pause" ) ); } else { m_playButton->setIcon( embed::getIconPixmap( "pause" ) ); - engine::getSongEditor()->playPattern( m_pattern ); + engine::getSong()->playPattern( m_pattern ); } } @@ -2085,7 +2086,7 @@ void pianoRoll::play( void ) void pianoRoll::record( void ) { - if( engine::getSongEditor()->playing() ) + if( engine::getSong()->playing() ) { stop(); } @@ -2095,7 +2096,7 @@ void pianoRoll::record( void ) } m_recording = TRUE; - engine::getSongEditor()->playPattern( m_pattern, FALSE ); + engine::getSong()->playPattern( m_pattern, FALSE ); } @@ -2103,7 +2104,7 @@ void pianoRoll::record( void ) void pianoRoll::stop( void ) { - engine::getSongEditor()->stop(); + engine::getSong()->stop(); m_playButton->setIcon( embed::getIconPixmap( "play" ) ); m_playButton->update(); m_recording = FALSE; @@ -2117,14 +2118,14 @@ void pianoRoll::recordNote( const note & _n ) { if( m_recording == TRUE && validPattern() == TRUE ) { - note n( _n.length(), engine::getSongEditor()->getPlayPos( - songEditor::PLAY_PATTERN ) - _n.length(), + note n( _n.length(), engine::getSong()->getPlayPos( + song::Mode_PlayPattern ) - _n.length(), _n.tone(), _n.octave(), _n.getVolume(), _n.getPanning() ); n.quantizeLength( quantization() ); m_pattern->addNote( n ); update(); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } } @@ -2301,7 +2302,7 @@ void pianoRoll::getSelectedNotes( noteVector & _selected_notes ) void pianoRoll::copy_to_clipboard( const noteVector & _notes ) const { - multimediaProject mmp( multimediaProject::CLIPBOARD_DATA ); + multimediaProject mmp( multimediaProject::ClipboardData ); QDomElement note_list = mmp.createElement( "note-list" ); mmp.content().appendChild( note_list ); @@ -2356,7 +2357,7 @@ void pianoRoll::cutSelectedNotes( void ) { copy_to_clipboard( selected_notes ); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); for( noteVector::iterator it = selected_notes.begin(); it != selected_notes.end(); ++it ) @@ -2401,7 +2402,7 @@ void pianoRoll::pasteNotes( void ) // we only have to do the following lines if we pasted at // least one note... - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); update(); engine::getSongEditor()->update(); } @@ -2430,7 +2431,7 @@ void pianoRoll::deleteSelectedNotes( void ) if( update_after_delete == TRUE ) { - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); update(); engine::getSongEditor()->update(); } @@ -2441,9 +2442,9 @@ void pianoRoll::deleteSelectedNotes( void ) void pianoRoll::updatePosition( const midiTime & _t ) { - if( ( engine::getSongEditor()->playing() && - engine::getSongEditor()->playMode() == - songEditor::PLAY_PATTERN ) || + if( ( engine::getSong()->playing() && + engine::getSong()->playMode() == + song::Mode_PlayPattern ) || m_scrollBack == TRUE ) { const int w = width() - WHITE_KEY_WIDTH; @@ -2564,8 +2565,8 @@ bool pianoRoll::x11Event( XEvent * _xe ) { if( validPattern() ) { - return( m_pattern->getInstrumentTrack()->getPianoWidget() - ->x11Event( _xe ) ); +/* return( m_pattern->getInstrumentTrack()->getPianoWidget() + ->x11Event( _xe ) );*/ } return( FALSE ); } diff --git a/src/core/piano_widget.cpp b/src/core/piano_widget.cpp index 0511c0f27..0fe5a7627 100644 --- a/src/core/piano_widget.cpp +++ b/src/core/piano_widget.cpp @@ -4,7 +4,7 @@ * piano_widget.cpp - implementation of piano-widget used in channel-window * for testing channel * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -52,25 +52,25 @@ #endif -const keyTypes KEY_ORDER[] = +const KeyTypes KEY_ORDER[] = { // C CIS D DIS E F - WHITE_KEY, BLACK_KEY, WHITE_KEY, BLACK_KEY, WHITE_KEY, WHITE_KEY, + WhiteKey, BlackKey, WhiteKey, BlackKey, WhiteKey, WhiteKey, // FIS G GIS A B H - BLACK_KEY, WHITE_KEY, BLACK_KEY, WHITE_KEY, BLACK_KEY, WHITE_KEY + BlackKey, WhiteKey, BlackKey, WhiteKey, BlackKey, WhiteKey } ; -tones WHITE_KEYS[] = +tones WhiteKeyS[] = { C, D, E, F, G, A, H } ; -QPixmap * pianoWidget::s_whiteKeyPm = NULL; -QPixmap * pianoWidget::s_blackKeyPm = NULL; -QPixmap * pianoWidget::s_whiteKeyPressedPm = NULL; -QPixmap * pianoWidget::s_blackKeyPressedPm = NULL; +QPixmap * pianoView::s_whiteKeyPm = NULL; +QPixmap * pianoView::s_blackKeyPm = NULL; +QPixmap * pianoView::s_whiteKeyPressedPm = NULL; +QPixmap * pianoView::s_blackKeyPressedPm = NULL; const int PIANO_BASE = 11; @@ -81,287 +81,41 @@ const int PW_BLACK_KEY_HEIGHT = 38; const int LABEL_TEXT_SIZE = 7; -pianoWidget::pianoWidget( instrumentTrack * _parent ) : - QWidget( _parent ), - m_instrumentTrack( _parent ), - m_startTone( C ), - m_startOctave( OCTAVE_3 ), - m_lastKey( -1 ), - m_keyCode( 0 ) + + +piano::piano( instrumentTrack * _it ) : + model( _it ), + m_instrumentTrack( _it ) { - connect( m_instrumentTrack->baseNoteModel(), SIGNAL( dataChanged() ), - this, SLOT( update( void ) ) ); - - - setFocusPolicy( Qt::StrongFocus ); - - if( s_whiteKeyPm == NULL ) - { - s_whiteKeyPm = new QPixmap( embed::getIconPixmap( - "white_key" ) ); - } - if( s_blackKeyPm == NULL ) - { - s_blackKeyPm = new QPixmap( embed::getIconPixmap( - "black_key" ) ); - } - if( s_whiteKeyPressedPm == NULL ) - { - s_whiteKeyPressedPm = new QPixmap( embed::getIconPixmap( - "white_key_pressed" ) ); - } - if ( s_blackKeyPressedPm == NULL ) - { - s_blackKeyPressedPm = new QPixmap( embed::getIconPixmap( - "black_key_pressed" ) ); - } - for( int i = 0; i < NOTES_PER_OCTAVE * OCTAVES; ++i ) { m_pressedKeys[i] = FALSE; } - m_pianoScroll = new QScrollBar( Qt::Horizontal, this ); - m_pianoScroll->setRange( 0, WHITE_KEYS_PER_OCTAVE * ( OCTAVES - 3 ) - - 4 ); - m_pianoScroll->setSingleStep( 1 ); - m_pianoScroll->setPageStep( 20 ); - m_pianoScroll->setValue( OCTAVE_3 * WHITE_KEYS_PER_OCTAVE ); - m_pianoScroll->setGeometry( 0, PIANO_BASE + PW_WHITE_KEY_HEIGHT, 250, - 16 ); - // ...and connect it to this widget... - connect( m_pianoScroll, SIGNAL( valueChanged( int ) ), this, - SLOT( pianoScrolled( int ) ) ); - } -pianoWidget::~pianoWidget() +piano::~piano() { } -// gets the key from the given mouse-position -int pianoWidget::getKeyFromMouse( const QPoint & _p ) const +void piano::setKeyState( int _key, bool _on ) { - - int key_num = (int)( (float) _p.x() / (float) PW_WHITE_KEY_WIDTH ); - - for( int i = 0; i <= key_num; ++i ) - { - if( KEY_ORDER[( m_startOctave * NOTES_PER_OCTAVE + - m_startTone +i ) % NOTES_PER_OCTAVE] == - BLACK_KEY ) - { - ++key_num; - } - } - - key_num += m_startOctave * NOTES_PER_OCTAVE + m_startTone; - - // is it a black key? - if( _p.y() < PIANO_BASE + PW_BLACK_KEY_HEIGHT ) - { - // then do extra checking whether the mouse-cursor is over - // a black key - if( key_num > 0 && - KEY_ORDER[( key_num - 1 ) % NOTES_PER_OCTAVE] == - BLACK_KEY && - _p.x() % PW_WHITE_KEY_WIDTH <= - ( PW_WHITE_KEY_WIDTH / 2 ) - - ( PW_BLACK_KEY_WIDTH / 2 ) ) - { - --key_num; - } - if( key_num < NOTES_PER_OCTAVE * OCTAVES - 1 && - KEY_ORDER[( key_num + 1 ) % NOTES_PER_OCTAVE] == - BLACK_KEY && - _p.x() % PW_WHITE_KEY_WIDTH >= - ( PW_WHITE_KEY_WIDTH - - PW_BLACK_KEY_WIDTH / 2 ) ) - { - ++key_num; - } - } - - // some range-checking-stuff - return( tLimit( key_num, 0, NOTES_PER_OCTAVE * OCTAVES - 1 ) ); + m_pressedKeys[tLimit( _key, 0, NOTES_PER_OCTAVE * OCTAVES - 1 )] = _on; + emit dataChanged(); } -// handler for scrolling-event -void pianoWidget::pianoScrolled( int _new_pos ) +int piano::getKeyFromKeycode( int _k ) { - m_startTone = WHITE_KEYS[_new_pos % WHITE_KEYS_PER_OCTAVE]; - m_startOctave = (octaves)( _new_pos / WHITE_KEYS_PER_OCTAVE ); - - update(); -} - - - - -void pianoWidget::contextMenuEvent( QContextMenuEvent * _me ) -{ - if( _me->pos().y() > PIANO_BASE ) - { - QWidget::contextMenuEvent( _me ); - return; - } - - captionMenu contextMenu( tr( "Base note" ) ); - contextMenu.addAction( embed::getIconPixmap( "automation" ), - tr( "&Open in automation editor" ), - m_instrumentTrack->baseNoteModel()->getAutomationPattern(), - SLOT( openInAutomationEditor() ) ); - contextMenu.exec( QCursor::pos() ); -} - - - - -// handler for mouse-click-event -void pianoWidget::mousePressEvent( QMouseEvent * _me ) -{ - if( _me->button() == Qt::LeftButton ) - { - // get pressed key - Uint32 key_num = getKeyFromMouse( _me->pos() ); - if( _me->pos().y() > PIANO_BASE ) - { - int y_diff = _me->pos().y() - PIANO_BASE; - volume vol = (volume)( ( float ) y_diff / - ( ( KEY_ORDER[key_num % NOTES_PER_OCTAVE] == - WHITE_KEY ) ? - PW_WHITE_KEY_HEIGHT : PW_BLACK_KEY_HEIGHT ) * - (float) DEFAULT_VOLUME); - if( y_diff < 0 ) - { - vol = 0; - } - else if( y_diff > ( ( KEY_ORDER[key_num % - NOTES_PER_OCTAVE] == - WHITE_KEY ) ? - PW_WHITE_KEY_HEIGHT : PW_BLACK_KEY_HEIGHT ) ) - { - vol = DEFAULT_VOLUME; - } - // set note on - m_instrumentTrack->processInEvent( - midiEvent( NOTE_ON, 0, key_num, - vol * 127 / 100 ), - midiTime() ); - m_pressedKeys[key_num] = TRUE; - m_lastKey = key_num; - } - else - { - m_instrumentTrack->baseNoteModel()-> - setInitValue( key_num ); - } - - // and let the user see that he pressed a key... :) - update(); - } -} - - - - -// handler for mouse-release-event -void pianoWidget::mouseReleaseEvent( QMouseEvent * _me ) -{ - if( m_lastKey != -1 ) - { - m_instrumentTrack->processInEvent( - midiEvent( NOTE_OFF, 0, m_lastKey, 0 ), midiTime() ); - m_pressedKeys[m_lastKey] = FALSE; - - // and let the user see that he released a key... :) - update(); - - m_lastKey = -1; - } -} - - - - -// handler for mouse-move-event -void pianoWidget::mouseMoveEvent( QMouseEvent * _me ) -{ - int key_num = getKeyFromMouse( _me->pos() ); - int y_diff = _me->pos().y() - PIANO_BASE; - volume vol = (volume)( (float) y_diff / - ( ( KEY_ORDER[key_num % NOTES_PER_OCTAVE] == WHITE_KEY ) ? - PW_WHITE_KEY_HEIGHT : PW_BLACK_KEY_HEIGHT ) * - (float)DEFAULT_VOLUME ); - // maybe the user moved the mouse-cursor above or under the - // piano-widget while holding left button so check that and - // correct volume if necessary - if( y_diff < 0 ) - { - vol = 0; - } - else if( y_diff > - ( ( KEY_ORDER[key_num % NOTES_PER_OCTAVE] == WHITE_KEY ) ? - PW_WHITE_KEY_HEIGHT : PW_BLACK_KEY_HEIGHT ) ) - { - vol = DEFAULT_VOLUME; - } - - // is the calculated key different from current key? (could be the - // user just moved the cursor one pixel left but on the same key) - if( key_num != m_lastKey ) - { - if( m_lastKey != -1 ) - { - m_instrumentTrack->processInEvent( - midiEvent( NOTE_OFF, 0, m_lastKey, 0 ), - midiTime() ); - m_pressedKeys[m_lastKey] = FALSE; - m_lastKey = -1; - } - if( _me->buttons() & Qt::LeftButton ) - { - if( _me->pos().y() > PIANO_BASE ) - { - m_instrumentTrack->processInEvent( - midiEvent( NOTE_ON, 0, key_num, vol ), - midiTime() ); - m_pressedKeys[key_num] = TRUE; - m_lastKey = key_num; - } - else - { - m_instrumentTrack->baseNoteModel()-> - setInitValue( key_num ); - } - } - // and let the user see that he pressed a key... :) - update(); - } - else if( m_pressedKeys[key_num] == TRUE ) - { - m_instrumentTrack->processInEvent( - midiEvent( KEY_PRESSURE, 0, key_num, vol ), - midiTime() ); - } - -} - - - - -int pianoWidget::getKeyFromKeyboard( int _k ) const -{ - switch( m_keyCode ) + switch( _k ) { case 52: return( 0 ); // Y case 39: return( 1 ); // S @@ -400,80 +154,367 @@ int pianoWidget::getKeyFromKeyboard( int _k ) const -void pianoWidget::keyPressEvent( QKeyEvent * _ke ) -{ - int key_num = getKeyFromKeyboard( _ke->key() ) + - ( DEFAULT_OCTAVE - 1 ) * NOTES_PER_OCTAVE; - if( _ke->isAutoRepeat() == FALSE && key_num > -1 ) + +pianoView::pianoView( QWidget * _parent ) : + QWidget( _parent ), + modelView( NULL ), + m_piano( NULL ), + m_startTone( C ), + m_startOctave( OCTAVE_3 ), + m_lastKey( -1 ), + m_keyCode( 0 ) +{ + if( s_whiteKeyPm == NULL ) { - m_instrumentTrack->processInEvent( - midiEvent( NOTE_ON, 0, key_num, DEFAULT_VOLUME ), - midiTime() ); - m_pressedKeys[key_num] = TRUE; - update(); + s_whiteKeyPm = new QPixmap( embed::getIconPixmap( + "white_key" ) ); } - else + if( s_blackKeyPm == NULL ) { - _ke->ignore(); + s_blackKeyPm = new QPixmap( embed::getIconPixmap( + "black_key" ) ); } + if( s_whiteKeyPressedPm == NULL ) + { + s_whiteKeyPressedPm = new QPixmap( embed::getIconPixmap( + "white_key_pressed" ) ); + } + if ( s_blackKeyPressedPm == NULL ) + { + s_blackKeyPressedPm = new QPixmap( embed::getIconPixmap( + "black_key_pressed" ) ); + } + + setFocusPolicy( Qt::StrongFocus ); + + m_pianoScroll = new QScrollBar( Qt::Horizontal, this ); + m_pianoScroll->setRange( 0, WHITE_KEYS_PER_OCTAVE * ( OCTAVES - 3 ) - + 4 ); + m_pianoScroll->setSingleStep( 1 ); + m_pianoScroll->setPageStep( 20 ); + m_pianoScroll->setValue( OCTAVE_3 * WHITE_KEYS_PER_OCTAVE ); + m_pianoScroll->setGeometry( 0, PIANO_BASE + PW_WHITE_KEY_HEIGHT, 250, + 16 ); + // ...and connect it to this widget... + connect( m_pianoScroll, SIGNAL( valueChanged( int ) ), + this, SLOT( pianoScrolled( int ) ) ); + } -void pianoWidget::keyReleaseEvent( QKeyEvent * _ke ) +pianoView::~pianoView() { - int key_num = getKeyFromKeyboard( _ke->key() ) + - ( DEFAULT_OCTAVE - 1 ) * NOTES_PER_OCTAVE; - if( _ke->isAutoRepeat() == FALSE && key_num > -1 ) - { - m_instrumentTrack->processInEvent( - midiEvent( NOTE_OFF, 0, key_num, 0 ), - midiTime() ); - m_pressedKeys[key_num] = FALSE; - update(); - } - else - { - _ke->ignore(); - } } -void pianoWidget::setKeyState( int _key, bool _on ) +void pianoView::modelChanged( void ) { - m_pressedKeys[tLimit( _key, 0, NOTES_PER_OCTAVE * OCTAVES - 1 )] = _on; - QApplication::postEvent( this, new updateEvent() ); + m_piano = castModel(); + if( m_piano != NULL ) + { + connect( m_piano->m_instrumentTrack->baseNoteModel(), + SIGNAL( dataChanged() ), this, SLOT( update() ) ); + } + } - -void pianoWidget::customEvent( QEvent * ) +// gets the key from the given mouse-position +int pianoView::getKeyFromMouse( const QPoint & _p ) const { + int key_num = (int)( (float) _p.x() / (float) PW_WHITE_KEY_WIDTH ); + + for( int i = 0; i <= key_num; ++i ) + { + if( KEY_ORDER[( m_startOctave * NOTES_PER_OCTAVE + + m_startTone +i ) % NOTES_PER_OCTAVE] == + BlackKey ) + { + ++key_num; + } + } + + key_num += m_startOctave * NOTES_PER_OCTAVE + m_startTone; + + // is it a black key? + if( _p.y() < PIANO_BASE + PW_BLACK_KEY_HEIGHT ) + { + // then do extra checking whether the mouse-cursor is over + // a black key + if( key_num > 0 && + KEY_ORDER[( key_num - 1 ) % NOTES_PER_OCTAVE] == + BlackKey && + _p.x() % PW_WHITE_KEY_WIDTH <= + ( PW_WHITE_KEY_WIDTH / 2 ) - + ( PW_BLACK_KEY_WIDTH / 2 ) ) + { + --key_num; + } + if( key_num < NOTES_PER_OCTAVE * OCTAVES - 1 && + KEY_ORDER[( key_num + 1 ) % NOTES_PER_OCTAVE] == + BlackKey && + _p.x() % PW_WHITE_KEY_WIDTH >= + ( PW_WHITE_KEY_WIDTH - + PW_BLACK_KEY_WIDTH / 2 ) ) + { + ++key_num; + } + } + + // some range-checking-stuff + return( tLimit( key_num, 0, NOTES_PER_OCTAVE * OCTAVES - 1 ) ); +} + + + + +// handler for scrolling-event +void pianoView::pianoScrolled( int _new_pos ) +{ + m_startTone = WhiteKeyS[_new_pos % WHITE_KEYS_PER_OCTAVE]; + m_startOctave = (octaves)( _new_pos / WHITE_KEYS_PER_OCTAVE ); + update(); } -void pianoWidget::focusOutEvent( QFocusEvent * ) +void pianoView::contextMenuEvent( QContextMenuEvent * _me ) { + if( _me->pos().y() > PIANO_BASE || m_piano == NULL ) + { + QWidget::contextMenuEvent( _me ); + return; + } + + captionMenu contextMenu( tr( "Base note" ) ); + contextMenu.addAction( embed::getIconPixmap( "automation" ), + tr( "&Open in automation editor" ), + m_piano->m_instrumentTrack->baseNoteModel()-> + getAutomationPattern(), + SLOT( openInAutomationEditor() ) ); + contextMenu.exec( QCursor::pos() ); +} + + + + +// handler for mouse-click-event +void pianoView::mousePressEvent( QMouseEvent * _me ) +{ + if( _me->button() == Qt::LeftButton && m_piano != NULL ) + { + // get pressed key + Uint32 key_num = getKeyFromMouse( _me->pos() ); + if( _me->pos().y() > PIANO_BASE ) + { + int y_diff = _me->pos().y() - PIANO_BASE; + volume vol = (volume)( ( float ) y_diff / + ( ( KEY_ORDER[key_num % NOTES_PER_OCTAVE] == + WhiteKey ) ? + PW_WHITE_KEY_HEIGHT : PW_BLACK_KEY_HEIGHT ) * + (float) DEFAULT_VOLUME); + if( y_diff < 0 ) + { + vol = 0; + } + else if( y_diff > ( ( KEY_ORDER[key_num % + NOTES_PER_OCTAVE] == + WhiteKey ) ? + PW_WHITE_KEY_HEIGHT : PW_BLACK_KEY_HEIGHT ) ) + { + vol = DEFAULT_VOLUME; + } + // set note on + m_piano->m_instrumentTrack->processInEvent( + midiEvent( NOTE_ON, 0, key_num, + vol * 127 / 100 ), + midiTime() ); + m_piano->m_pressedKeys[key_num] = TRUE; + m_lastKey = key_num; + } + else + { + m_piano->m_instrumentTrack->baseNoteModel()-> + setInitValue( key_num ); + } + + // and let the user see that he pressed a key... :) + update(); + } +} + + + + +// handler for mouse-release-event +void pianoView::mouseReleaseEvent( QMouseEvent * _me ) +{ + if( m_lastKey != -1 ) + { + if( m_piano != NULL ) + { + m_piano->m_instrumentTrack->processInEvent( + midiEvent( NOTE_OFF, 0, m_lastKey, 0 ), + midiTime() ); + m_piano->m_pressedKeys[m_lastKey] = FALSE; + } + + // and let the user see that he released a key... :) + update(); + + m_lastKey = -1; + } +} + + + + +// handler for mouse-move-event +void pianoView::mouseMoveEvent( QMouseEvent * _me ) +{ + if( m_piano == NULL ) + { + return; + } + + int key_num = getKeyFromMouse( _me->pos() ); + int y_diff = _me->pos().y() - PIANO_BASE; + volume vol = (volume)( (float) y_diff / + ( ( KEY_ORDER[key_num % NOTES_PER_OCTAVE] == WhiteKey ) ? + PW_WHITE_KEY_HEIGHT : PW_BLACK_KEY_HEIGHT ) * + (float)DEFAULT_VOLUME ); + // maybe the user moved the mouse-cursor above or under the + // piano-widget while holding left button so check that and + // correct volume if necessary + if( y_diff < 0 ) + { + vol = 0; + } + else if( y_diff > + ( ( KEY_ORDER[key_num % NOTES_PER_OCTAVE] == WhiteKey ) ? + PW_WHITE_KEY_HEIGHT : PW_BLACK_KEY_HEIGHT ) ) + { + vol = DEFAULT_VOLUME; + } + + // is the calculated key different from current key? (could be the + // user just moved the cursor one pixel left but on the same key) + if( key_num != m_lastKey ) + { + if( m_lastKey != -1 ) + { + m_piano->m_instrumentTrack->processInEvent( + midiEvent( NOTE_OFF, 0, m_lastKey, 0 ), + midiTime() ); + m_piano->m_pressedKeys[m_lastKey] = FALSE; + m_lastKey = -1; + } + if( _me->buttons() & Qt::LeftButton ) + { + if( _me->pos().y() > PIANO_BASE ) + { + m_piano->m_instrumentTrack->processInEvent( + midiEvent( NOTE_ON, 0, key_num, vol ), + midiTime() ); + m_piano->m_pressedKeys[key_num] = TRUE; + m_lastKey = key_num; + } + else + { + m_piano->m_instrumentTrack->baseNoteModel()-> + setInitValue( key_num ); + } + } + // and let the user see that he pressed a key... :) + update(); + } + else if( m_piano->m_pressedKeys[key_num] == TRUE ) + { + m_piano->m_instrumentTrack->processInEvent( + midiEvent( KEY_PRESSURE, 0, key_num, vol ), + midiTime() ); + } + +} + + + + +void pianoView::keyPressEvent( QKeyEvent * _ke ) +{ + int key_num = piano::getKeyFromKeycode( m_keyCode ) + + ( DEFAULT_OCTAVE - 1 ) * NOTES_PER_OCTAVE; + + if( _ke->isAutoRepeat() == FALSE && key_num > -1 ) + { + if( m_piano != NULL ) + { + m_piano->m_instrumentTrack->processInEvent( + midiEvent( NOTE_ON, 0, key_num, + DEFAULT_VOLUME ), midiTime() ); + m_piano->m_pressedKeys[key_num] = TRUE; + } + update(); + } + else + { + _ke->ignore(); + } +} + + + + +void pianoView::keyReleaseEvent( QKeyEvent * _ke ) +{ + int key_num = piano::getKeyFromKeycode( m_keyCode ) + + ( DEFAULT_OCTAVE - 1 ) * NOTES_PER_OCTAVE; + if( _ke->isAutoRepeat() == FALSE && key_num > -1 ) + { + if( m_piano != NULL ) + { + m_piano->m_instrumentTrack->processInEvent( + midiEvent( NOTE_OFF, 0, key_num, 0 ), + midiTime() ); + m_piano->m_pressedKeys[key_num] = FALSE; + } + update(); + } + else + { + _ke->ignore(); + } +} + + + + +void pianoView::focusOutEvent( QFocusEvent * ) +{ + if( m_piano == NULL ) + { + return; + } // if we loose focus, we HAVE to note off all running notes because // we don't receive key-release-events anymore and so the notes would // hang otherwise for( int i = 0; i < NOTES_PER_OCTAVE * OCTAVES; ++i ) { - if( m_pressedKeys[i] == TRUE ) + if( m_piano->m_pressedKeys[i] == TRUE ) { - m_instrumentTrack->processInEvent( + m_piano->m_instrumentTrack->processInEvent( midiEvent( NOTE_OFF, 0, i, 0 ), midiTime() ); - m_pressedKeys[i] = FALSE; + m_piano->m_pressedKeys[i] = FALSE; } } update(); @@ -482,7 +523,7 @@ void pianoWidget::focusOutEvent( QFocusEvent * ) -int pianoWidget::getKeyX( int _key_num ) const +int pianoView::getKeyX( int _key_num ) const { int k = m_startOctave*NOTES_PER_OCTAVE + m_startTone; if( _key_num < k ) @@ -495,7 +536,7 @@ int pianoWidget::getKeyX( int _key_num ) const while( k <= _key_num ) { - if( KEY_ORDER[k % NOTES_PER_OCTAVE] == WHITE_KEY ) + if( KEY_ORDER[k % NOTES_PER_OCTAVE] == WhiteKey ) { ++white_cnt; if( white_cnt > 1 ) @@ -524,7 +565,7 @@ int pianoWidget::getKeyX( int _key_num ) const -void pianoWidget::paintEvent( QPaintEvent * ) +void pianoView::paintEvent( QPaintEvent * ) { QPainter p( this ); @@ -544,8 +585,9 @@ void pianoWidget::paintEvent( QPaintEvent * ) p.setPen( QColor ( 0xFF, 0xFF, 0xFF ) ); - int base_key = m_instrumentTrack->baseNoteModel()->value(); - if( KEY_ORDER[base_key % NOTES_PER_OCTAVE] == WHITE_KEY ) + const int base_key = ( m_piano != NULL ) ? + m_piano->m_instrumentTrack->baseNoteModel()->value() : 0; + if( KEY_ORDER[base_key % NOTES_PER_OCTAVE] == WhiteKey ) { p.fillRect( QRect( getKeyX( base_key ), 1, PW_WHITE_KEY_WIDTH-1, PIANO_BASE-2 ), @@ -564,14 +606,14 @@ void pianoWidget::paintEvent( QPaintEvent * ) // draw all white keys... for( int x = 0; x < width(); ) { - while( KEY_ORDER[cur_key%NOTES_PER_OCTAVE] != WHITE_KEY ) + while( KEY_ORDER[cur_key%NOTES_PER_OCTAVE] != WhiteKey ) { ++cur_key; } // draw pressed or not pressed key, depending on state of // current key - if( m_pressedKeys[cur_key] == TRUE ) + if( m_piano && m_piano->m_pressedKeys[cur_key] == TRUE ) { p.drawPixmap( x, PIANO_BASE, *s_whiteKeyPressedPm ); } @@ -600,9 +642,9 @@ void pianoWidget::paintEvent( QPaintEvent * ) int s_key = m_startOctave*NOTES_PER_OCTAVE+m_startTone; if( s_key > 0 && - KEY_ORDER[(tones)( --s_key ) % NOTES_PER_OCTAVE] == BLACK_KEY ) + KEY_ORDER[(tones)( --s_key ) % NOTES_PER_OCTAVE] == BlackKey ) { - if( m_pressedKeys[s_key] == TRUE ) + if( m_piano && m_piano->m_pressedKeys[s_key] == TRUE ) { p.drawPixmap( 0 - PW_WHITE_KEY_WIDTH / 2, PIANO_BASE, *s_blackKeyPressedPm ); @@ -617,11 +659,11 @@ void pianoWidget::paintEvent( QPaintEvent * ) // now draw all black keys... for( int x = 0; x < width(); ) { - if( KEY_ORDER[cur_key%NOTES_PER_OCTAVE] == BLACK_KEY ) + if( KEY_ORDER[cur_key%NOTES_PER_OCTAVE] == BlackKey ) { // draw pressed or not pressed key, depending on // state of current key - if( m_pressedKeys[cur_key] == TRUE ) + if( m_piano && m_piano->m_pressedKeys[cur_key] == TRUE ) { p.drawPixmap( x + PW_WHITE_KEY_WIDTH / 2, PIANO_BASE, @@ -653,7 +695,7 @@ void pianoWidget::paintEvent( QPaintEvent * ) #ifdef BUILD_LINUX -bool pianoWidget::x11Event( XEvent * _xe ) +bool pianoView::x11Event( XEvent * _xe ) { switch( _xe->type ) { diff --git a/src/core/preset_preview_play_handle.cpp b/src/core/preset_preview_play_handle.cpp index 1d2091a4f..47f9231d7 100644 --- a/src/core/preset_preview_play_handle.cpp +++ b/src/core/preset_preview_play_handle.cpp @@ -53,10 +53,9 @@ public: { setJournalling( FALSE ); m_previewInstrumentTrack = dynamic_cast( - track::create( track::INSTRUMENT_TRACK, + track::create( track::InstrumentTrack, this ) ); m_previewInstrumentTrack->setJournalling( FALSE ); - hide(); } virtual ~previewTrackContainer() @@ -134,7 +133,7 @@ presetPreviewPlayHandle::presetPreviewPlayHandle( mmp.content().firstChild().toElement() ); // preset also contains information about window-states etc. that's why // here we have to make sure that the instrument-track-window is hidden - s_previewTC->previewInstrumentTrack()->hide(); +// s_previewTC->previewInstrumentTrack()->hide(); // make sure, our preset-preview-track does not appear in any MIDI- // devices list, so just disable receiving/sending MIDI-events at all diff --git a/src/core/song.cpp b/src/core/song.cpp new file mode 100644 index 000000000..a208d0b75 --- /dev/null +++ b/src/core/song.cpp @@ -0,0 +1,1019 @@ +#ifndef SINGLE_SOURCE_COMPILE + +/* + * song.cpp - root of the model-tree + * + * Copyright (c) 2004-2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "song.h" + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + + +#include +#include +#include +#include + + +#include "automation_track.h" +#include "bb_editor.h" +#include "bb_track.h" +#include "config_mgr.h" +#include "embed.h" +#include "envelope_and_lfo_parameters.h" +#include "export_project_dialog.h" +#include "import_filter.h" +#include "instrument_track.h" +#include "main_window.h" +#include "midi_client.h" +#include "mmp.h" +#include "note_play_handle.h" +#include "pattern.h" +#include "piano_roll.h" +#include "project_journal.h" +#include "project_notes.h" +#include "rename_dialog.h" +#include "song_editor.h" +#include "templates.h" +#include "text_float.h" +#include "timeline.h" + + + + +song::song( void ) : + trackContainer(), + m_automationTrack( track::create( track::AutomationTrack, this ) ), + m_tempoModel( DEFAULT_BPM, MIN_BPM, MAX_BPM, intModel::defaultRelStep(), + this ), + m_masterVolumeModel( 100, 0, 200, 1, this ), + m_masterPitchModel( 0, -12, 12, 1, this ), + m_fileName(), + m_oldFileName(), + m_modified( FALSE ), + m_exporting( FALSE ), + m_playing( FALSE ), + m_paused( FALSE ), + m_loadingProject( FALSE ), + m_playMode( Mode_PlaySong ), + m_trackToPlay( NULL ), + m_patternToPlay( NULL ), + m_loopPattern( FALSE ) +{ + m_tempoModel.setTrack( m_automationTrack ); + connect( &m_tempoModel, SIGNAL( dataChanged() ), + this, SLOT( setTempo() ) ); + connect( &m_tempoModel, SIGNAL( dataUnchanged() ), + this, SLOT( setTempo() ) ); + + + connect( engine::getMixer(), SIGNAL( sampleRateChanged() ), this, + SLOT( updateFramesPerTact64th() ) ); + + + m_masterVolumeModel.setTrack( m_automationTrack ); + m_masterPitchModel.setTrack( m_automationTrack ); + + connect( &m_masterVolumeModel, SIGNAL( dataChanged() ), + this, SLOT( masterVolumeChanged() ) ); +/* connect( &m_masterPitchModel, SIGNAL( dataChanged() ), + this, SLOT( masterPitchChanged() ) );*/ + +} + + + + +song::~song() +{ + m_playing = FALSE; + delete m_automationTrack; +} + + + + +void song::masterVolumeChanged( void ) +{ + engine::getMixer()->setMasterGain( m_masterVolumeModel.value() / + 100.0f ); +} + + + + +void song::setTempo( void ) +{ + const bpm_t tempo = m_tempoModel.value(); + playHandleVector & phv = engine::getMixer()->playHandles(); + for( playHandleVector::iterator it = phv.begin(); it != phv.end(); + ++it ) + { + notePlayHandle * nph = dynamic_cast( *it ); + if( nph && !nph->released() ) + { + nph->resize( tempo ); + } + } + +// m_bpmSpinBox->setInitValue( _new_bpm ); + engine::updateFramesPerTact64th(); + emit tempoChanged( tempo ); +} + + + + +void song::doActions( void ) +{ + while( !m_actions.empty() ) + { + switch( m_actions.front() ) + { + case ActionStop: + { + timeLine * tl = + m_playPos[m_playMode].m_timeLine; + m_playing = FALSE; + if( tl != NULL ) + { + + switch( tl->behaviourAtStop() ) + { + case timeLine::BackToZero: + m_playPos[m_playMode].setTact( 0 ); + m_playPos[m_playMode].setTact64th( 0 ); + break; + + case timeLine::BackToStart: + if( tl->savedPos() >= 0 ) + { + m_playPos[m_playMode].setTact( + tl->savedPos().getTact() ); + m_playPos[m_playMode].setTact64th( + tl->savedPos().getTact64th() ); + tl->savePos( -1 ); + } + break; + + case timeLine::KeepStopPosition: + default: + break; + } + + } + else + { + m_playPos[m_playMode].setTact( 0 ); + m_playPos[m_playMode].setTact64th( 0 ); + } + + m_playPos[m_playMode].setCurrentFrame( 0 ); + + // remove all note-play-handles that are active + engine::getMixer()->clear(); + + break; + } + + case ActionPlaySong: + m_playMode = Mode_PlaySong; + m_playing = TRUE; + break; + + case ActionPlayTrack: + m_playMode = Mode_PlayTrack; + m_playing = TRUE; + break; + + case ActionPlayBB: + m_playMode = Mode_PlayBB; + m_playing = TRUE; + break; + + case ActionPlayPattern: + m_playMode = Mode_PlayPattern; + m_playing = TRUE; + break; + + case ActionPause: + m_playing = FALSE;// just set the play-flag + m_paused = TRUE; + break; + + case ActionResumeFromPause: + m_playing = TRUE;// just set the play-flag + m_paused = FALSE; + break; + } + + // a second switch for saving pos when starting to play + // anything (need pos for restoring it later in certain + // timeline-modes) + switch( m_actions.front() ) + { + case ActionPlaySong: + case ActionPlayTrack: + case ActionPlayBB: + case ActionPlayPattern: + { + timeLine * tl = + m_playPos[m_playMode].m_timeLine; + if( tl != NULL ) + { + tl->savePos( m_playPos[m_playMode] ); + } + break; + } + + // keep GCC happy... + default: + break; + } + + m_actions.erase( m_actions.begin() ); + + } + +} + + + + +void song::processNextBuffer( void ) +{ + doActions(); + + if( m_playing == FALSE ) + { + return; + } + + QList trackList; + Sint16 tco_num = -1; + + switch( m_playMode ) + { + case Mode_PlaySong: + trackList = tracks(); + // at song-start we have to reset the LFOs + if( m_playPos[Mode_PlaySong] == 0 ) + { + envelopeAndLFOParameters::resetLFO(); + } + break; + + case Mode_PlayTrack: + trackList.push_back( m_trackToPlay ); + break; + + case Mode_PlayBB: + if( engine::getBBTrackContainer()->numOfBBs() > 0 ) + { + tco_num = engine::getBBTrackContainer()-> + currentBB(); + trackList.push_back( bbTrack::findBBTrack( + tco_num ) ); + } + break; + + case Mode_PlayPattern: + if( m_patternToPlay != NULL ) + { + tco_num = m_patternToPlay->getTrack()-> + getTCONum( m_patternToPlay ); + trackList.push_back( + m_patternToPlay->getTrack() ); + } + break; + + default: + return; + + } + + if( trackList.empty() == TRUE ) + { + return; + } + + // check for looping-mode and act if neccessary + timeLine * tl = m_playPos[m_playMode].m_timeLine; + bool check_loop = tl != NULL && m_exporting == FALSE && + tl->loopPointsEnabled() && + !( m_playMode == Mode_PlayPattern && + m_patternToPlay->freezing() == TRUE ); + if( check_loop ) + { + if( m_playPos[m_playMode] < tl->loopBegin() || + m_playPos[m_playMode] >= tl->loopEnd() ) + { + m_playPos[m_playMode].setTact( + tl->loopBegin().getTact() ); + m_playPos[m_playMode].setTact64th( + tl->loopBegin().getTact64th() ); + } + } + + f_cnt_t total_frames_played = 0; + float frames_per_tact64th = engine::framesPerTact64th(); + + while( total_frames_played + < engine::getMixer()->framesPerPeriod() ) + { + f_cnt_t played_frames = engine::getMixer() + ->framesPerPeriod() - total_frames_played; + + float current_frame = m_playPos[m_playMode].currentFrame(); + // did we play a 64th of a tact? + if( current_frame >= frames_per_tact64th ) + { + int tact64th = m_playPos[m_playMode].getTact64th() + + (int)( current_frame / frames_per_tact64th ); + // did we play a whole tact? + if( tact64th >= 64 ) + { + // per default we just continue playing even if + // there's no more stuff to play + // (song-play-mode) + int max_tact = m_playPos[m_playMode].getTact() + + 2; + + // then decide whether to go over to next tact + // or to loop back to first tact + if( m_playMode == Mode_PlayBB ) + { + max_tact = engine::getBBTrackContainer() + ->lengthOfCurrentBB(); + } + else if( m_playMode == Mode_PlayPattern && + m_loopPattern == TRUE && + tl != NULL && + tl->loopPointsEnabled() == FALSE ) + { + max_tact = m_patternToPlay->length() + .getTact(); + } + if( m_playPos[m_playMode].getTact() + 1 + < max_tact ) + { + // next tact + m_playPos[m_playMode].setTact( + m_playPos[m_playMode].getTact() + + 1 ); + } + else + { + // first tact + m_playPos[m_playMode].setTact( 0 ); + } + } + m_playPos[m_playMode].setTact64th( tact64th % 64 ); + + if( check_loop ) + { + if( m_playPos[m_playMode] >= tl->loopEnd() ) + { + m_playPos[m_playMode].setTact( + tl->loopBegin().getTact() ); + m_playPos[m_playMode].setTact64th( + tl->loopBegin().getTact64th() ); + } + } + + current_frame = fmodf( current_frame, + frames_per_tact64th ); + m_playPos[m_playMode].setCurrentFrame( current_frame ); + } + + f_cnt_t last_frames = (f_cnt_t)frames_per_tact64th + - (f_cnt_t)current_frame; + // skip last frame fraction + if( last_frames == 0 ) + { + ++total_frames_played; + m_playPos[m_playMode].setCurrentFrame( current_frame + + 1.0f ); + continue; + } + // do we have some samples left in this tact64th but this are + // less then samples we have to play? + if( last_frames < played_frames ) + { + // then set played_samples to remaining samples, the + // rest will be played in next loop + played_frames = last_frames; + } + + if( (f_cnt_t)current_frame == 0 ) + { + if( m_playMode == Mode_PlaySong ) + { + m_automationTrack->play( m_playPos[m_playMode], + played_frames, + total_frames_played, tco_num ); + } + + // loop through all tracks and play them + for( int i = 0; i < trackList.size(); ++i ) + { + trackList[i]->play( m_playPos[m_playMode], + played_frames, + total_frames_played, tco_num ); + } + } + + // update frame-counters + total_frames_played += played_frames; + m_playPos[m_playMode].setCurrentFrame( played_frames + + current_frame ); + } +} + + + + +bool song::realTimeTask( void ) const +{ + return( !( m_exporting == TRUE || ( m_playMode == Mode_PlayPattern && + m_patternToPlay != NULL && + m_patternToPlay->freezing() == TRUE ) ) ); +} + + + + +void song::play( void ) +{ + if( m_playing == TRUE ) + { + if( m_playMode != Mode_PlaySong ) + { + // make sure, bb-editor updates/resets it play-button + engine::getBBTrackContainer()->stop(); + //pianoRoll::inst()->stop(); + } + else + { + pause(); + return; + } + } + m_actions.push_back( ActionPlaySong ); +} + + + + +void song::playTrack( track * _trackToPlay ) +{ + if( m_playing == TRUE ) + { + stop(); + } + m_trackToPlay = _trackToPlay; + + m_actions.push_back( ActionPlayTrack ); +} + + + + +void song::playBB( void ) +{ + if( m_playing == TRUE ) + { + stop(); + } + m_actions.push_back( ActionPlayBB ); +} + + + + +void song::playPattern( pattern * _patternToPlay, bool _loop ) +{ + if( m_playing == TRUE ) + { + stop(); + } + m_patternToPlay = _patternToPlay; + m_loopPattern = _loop; + if( m_patternToPlay != NULL ) + { + m_actions.push_back( ActionPlayPattern ); + } +} + + + + +tact song::lengthInTacts( void ) const +{ + tact len = 0; + const QList & ctl = tracks(); + for( int i = 0; i < ctl.size(); ++i ) + { + len = tMax( ctl[i]->length(), len ); + } + return( len ); +} + + + + +void song::setPlayPos( tact _tact_num, tact64th _t_64th, PlayModes _play_mode ) +{ + m_playPos[_play_mode].setTact( _tact_num ); + m_playPos[_play_mode].setTact64th( _t_64th ); + m_playPos[_play_mode].setCurrentFrame( 0.0f ); +} + + + + +void song::stop( void ) +{ + m_actions.push_back( ActionStop ); +} + + + + + + +void song::pause( void ) +{ + m_actions.push_back( ActionPause ); +} + + + + +void song::resumeFromPause( void ) +{ + m_actions.push_back( ActionResumeFromPause ); +} + + + + +void song::startExport( void ) +{ + stop(); + doActions(); + + play(); + doActions(); + + m_exporting = TRUE; +} + + + + +void song::stopExport( void ) +{ + stop(); + m_exporting = FALSE; +} + + + + + + +void song::insertBar( void ) +{ + QList tl = tracks(); + for( int i = 0; i < tl.size(); ++i ) + { + tl[i]->insertTact( m_playPos[Mode_PlaySong] ); + } +} + + + + +void song::removeBar( void ) +{ + QList tl = tracks(); + for( int i = 0; i < tl.size(); ++i ) + { + tl[i]->removeTact( m_playPos[Mode_PlaySong] ); + } +} + + + + +void song::addBBTrack( void ) +{ + track * t = track::create( track::BBTrack, this ); + engine::getBBTrackContainer()->setCurrentBB( + bbTrack::numOfBBTrack( t ) ); +} + + + + +void song::addSampleTrack( void ) +{ + (void) track::create( track::SampleTrack, this ); +} + + + + +bpm_t song::getTempo( void ) +{ + return( m_tempoModel.value() ); +} + + + + +automationPattern * song::tempoAutomationPattern( void ) +{ + return( m_tempoModel.getAutomationPattern() ); +} + + + + +void song::clearProject( void ) +{ + engine::getProjectJournal()->setJournalling( FALSE ); + + if( m_playing ) + { + stop(); + } + + engine::getMixer()->lock(); + if( engine::getBBEditor() ) + { + engine::getBBEditor()->clearAllTracks(); + } + if( engine::getSongEditor() ) + { + engine::getSongEditor()->clearAllTracks(); + } + QCoreApplication::sendPostedEvents(); + engine::getBBTrackContainer()->clearAllTracks(); + clearAllTracks(); + + engine::getAutomationEditor()->setCurrentPattern( NULL ); + m_tempoModel.getAutomationPattern()->clear(); + m_masterVolumeModel.getAutomationPattern()->clear(); + m_masterPitchModel.getAutomationPattern()->clear(); + + engine::getMixer()->unlock(); + + engine::getProjectNotes()->clear(); + + engine::getProjectJournal()->clearInvalidJournallingObjects(); + engine::getProjectJournal()->clearJournal(); + + engine::getProjectJournal()->setJournalling( TRUE ); +} + + + + + +// create new file +void song::createNewProject( void ) +{ + QString default_template = configManager::inst()->userProjectsDir() + + "templates/default.mpt"; + if( QFile::exists( default_template ) ) + { + createNewProjectFromTemplate( default_template ); + return; + } + + default_template = configManager::inst()->factoryProjectsDir() + + "templates/default.mpt"; + if( QFile::exists( default_template ) ) + { + createNewProjectFromTemplate( default_template ); + return; + } + + m_loadingProject = TRUE; + + clearProject(); + + engine::getProjectJournal()->setJournalling( FALSE ); + + m_fileName = m_oldFileName = ""; + + engine::getMainWindow()->resetWindowTitle(); + + track * t; + t = track::create( track::InstrumentTrack, this ); + dynamic_cast< instrumentTrack * >( t )->loadInstrument( + "tripleoscillator" ); +// track::create( track::SampleTrack, this ); + t = track::create( track::InstrumentTrack, + engine::getBBTrackContainer() ); + dynamic_cast< instrumentTrack * >( t )->loadInstrument( + "tripleoscillator" ); + track::create( track::BBTrack, this ); + + m_tempoModel.setInitValue( DEFAULT_BPM ); + m_masterVolumeModel.setInitValue( 100 ); + m_masterPitchModel.setInitValue( 0 ); + + engine::getProjectJournal()->setJournalling( TRUE ); + + m_loadingProject = FALSE; +} + + + + +void FASTCALL song::createNewProjectFromTemplate( const QString & + _template ) +{ + loadProject( _template ); + // clear file-name so that user doesn't overwrite template when + // saving... + m_fileName = m_oldFileName = ""; +} + + + + +// load given song +void FASTCALL song::loadProject( const QString & _file_name ) +{ + m_loadingProject = TRUE; + + clearProject(); + + engine::getProjectJournal()->setJournalling( FALSE ); + + m_fileName = _file_name; + m_oldFileName = _file_name; + + multimediaProject mmp( m_fileName ); + // if file could not be opened, head-node is null and we create + // new project + if( mmp.head().isNull() ) + { + createNewProject(); + return; + } + + engine::getMainWindow()->resetWindowTitle(); + + // get the header information from the DOM + m_tempoModel.loadSettings( mmp.head(), "bpm" ); + m_masterVolumeModel.loadSettings( mmp.head(), "mastervol" ); + m_masterPitchModel.loadSettings( mmp.head(), "masterpitch" ); + + // reset loop-point-state + m_playPos[Mode_PlaySong].m_timeLine->toggleLoopPoints( 0 ); + + QDomNode node = mmp.content().firstChild(); + while( !node.isNull() ) + { + if( node.isElement() ) + { + if( node.nodeName() == "trackcontainer" ) + { + ( (journallingObject *)( this ) )-> + restoreState( node.toElement() ); + } + else if( node.nodeName() == + engine::getPianoRoll()->nodeName() ) + { + engine::getPianoRoll()->restoreState( + node.toElement() ); + } + else if( node.nodeName() == + engine::getAutomationEditor()->nodeName() ) + { + engine::getAutomationEditor()->restoreState( + node.toElement() ); + } + else if( node.nodeName() == + engine::getProjectNotes()->nodeName() ) + { + ( (journallingObject *)( engine:: + getProjectNotes() ) )-> + restoreState( node.toElement() ); + } + else if( node.nodeName() == + m_playPos[Mode_PlaySong].m_timeLine->nodeName() ) + { + m_playPos[Mode_PlaySong].m_timeLine->restoreState( + node.toElement() ); + } + } + node = node.nextSibling(); + } + + configManager::inst()->addRecentlyOpenedProject( _file_name ); + + engine::getProjectJournal()->setJournalling( TRUE ); + + m_loadingProject = FALSE; +} + + + + +// save current song +bool song::saveProject( void ) +{ + multimediaProject mmp( multimediaProject::SongProject ); + + m_tempoModel.saveSettings( mmp, mmp.head(), "bpm" ); + m_masterVolumeModel.saveSettings( mmp, mmp.head(), "mastervol" ); + m_masterPitchModel.saveSettings( mmp, mmp.head(), "masterpitch" ); + + + ( (journallingObject *)( this ) )->saveState( mmp, mmp.content() ); + + engine::getPianoRoll()->saveState( mmp, mmp.content() ); + engine::getAutomationEditor()->saveState( mmp, mmp.content() ); + ( (journallingObject *)( engine::getProjectNotes() ) )->saveState( mmp, + mmp.content() ); + m_playPos[Mode_PlaySong].m_timeLine->saveState( mmp, mmp.content() ); + + m_fileName = mmp.nameWithExtension( m_fileName ); + if( mmp.writeFile( m_fileName, m_oldFileName == "" || + m_fileName != m_oldFileName ) == TRUE ) + { + textFloat::displayMessage( tr( "Project saved" ), + tr( "The project %1 is now saved." + ).arg( m_fileName ), + embed::getIconPixmap( "project_save", 24, 24 ), + 2000 ); + configManager::inst()->addRecentlyOpenedProject( m_fileName ); + engine::getMainWindow()->resetWindowTitle(); + } + else + { + textFloat::displayMessage( tr( "Project NOT saved." ), + tr( "The project %1 was not saved!" ).arg( + m_fileName ), + embed::getIconPixmap( "error" ), 4000 ); + return( FALSE ); + } + return( TRUE ); +} + + + + +// save current song in given filename +bool FASTCALL song::saveProjectAs( const QString & _file_name ) +{ + QString o = m_oldFileName; + m_oldFileName = m_fileName; + m_fileName = _file_name; + if( saveProject() == FALSE ) + { + m_fileName = m_oldFileName; + m_oldFileName = o; + return( FALSE ); + } + m_oldFileName = m_fileName; + return( TRUE ); +} + + + + +void song::importProject( void ) +{ + QFileDialog ofd( NULL, tr( "Import file" ) ); + ofd.setDirectory( configManager::inst()->userProjectsDir() ); + ofd.setFileMode( QFileDialog::ExistingFiles ); + if( ofd.exec () == QDialog::Accepted && !ofd.selectedFiles().isEmpty() ) + { + importFilter::import( ofd.selectedFiles()[0], this ); + } +} + + +#warning TODO: move somewhere else +static inline QString baseName( const QString & _file ) +{ + return( QFileInfo( _file ).absolutePath() + "/" + + QFileInfo( _file ).completeBaseName() ); +} + + +void song::exportProject( void ) +{ + QString base_filename; + + if( m_fileName != "" ) + { + base_filename = baseName( m_fileName ); + } + else + { + base_filename = tr( "untitled" ); + } + base_filename += fileEncodeDevices[0].m_extension; + + QFileDialog efd( engine::getMainWindow() ); + efd.setFileMode( QFileDialog::AnyFile ); + + int idx = 0; + QStringList types; + while( fileEncodeDevices[idx].m_fileType != NULL_FILE ) + { + types << tr( fileEncodeDevices[idx].m_description ); + ++idx; + } + efd.setFilters( types ); + efd.selectFile( base_filename ); + efd.setWindowTitle( tr( "Select file for project-export..." ) ); + + if( efd.exec() == QDialog::Accepted && + !efd.selectedFiles().isEmpty() && efd.selectedFiles()[0] != "" + ) + { + const QString export_file_name = efd.selectedFiles()[0]; + if( QFileInfo( export_file_name ).exists() == TRUE && + QMessageBox::warning( engine::getMainWindow(), + tr( "File already exists" ), + tr( "The file \"%1\" already " + "exists. Do you want " + "to overwrite it?" + ).arg( QFileInfo( + export_file_name ).fileName() ), + QMessageBox::Yes, + QMessageBox::No | + QMessageBox::Escape | + QMessageBox::Default ) + == QMessageBox::No ) + { + return; + } + exportProjectDialog epd( export_file_name, + engine::getMainWindow() ); + epd.exec(); + } +} + + + + +void song::updateFramesPerTact64th( void ) +{ + engine::updateFramesPerTact64th(); +} + + + + +void song::setModified( void ) +{ + if( !m_loadingProject ) + { + m_modified = TRUE; + engine::getMainWindow()->resetWindowTitle(); + } +} + + + + +#include "song.moc" + + +#endif diff --git a/src/core/song_editor.cpp b/src/core/song_editor.cpp index a4695b986..655d82d39 100644 --- a/src/core/song_editor.cpp +++ b/src/core/song_editor.cpp @@ -1,9 +1,9 @@ #ifndef SINGLE_SOURCE_COMPILE /* - * song_editor.cpp - basic window for editing song + * song_editor.cpp - basic window for song-editing * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -80,21 +80,9 @@ -songEditor::songEditor( void ) : - m_automationTrack( track::create( track::AUTOMATION_TRACK, this ) ), - m_tempoModel( DEFAULT_BPM, MIN_BPM, MAX_BPM ), - m_masterVolumeModel( 100, 0, 200, 1 ), - m_masterPitchModel( 0, -12, 12, 1 ), - m_fileName( "" ), - m_oldFileName( "" ), - m_exporting( FALSE ), - m_playing( FALSE ), - m_paused( FALSE ), - m_loadingProject( FALSE ), - m_playMode( PLAY_SONG ), - m_trackToPlay( NULL ), - m_patternToPlay( NULL ), - m_loopPattern( FALSE ), +songEditor::songEditor( song * _song ) : + trackContainerView( _song ), + m_s( _song ), m_scrollBack( FALSE ) { setWindowTitle( tr( "Song-Editor" ) ); @@ -106,10 +94,11 @@ songEditor::songEditor( void ) : // create time-line timeLine * tl = new timeLine( TRACK_OP_WIDTH + DEFAULT_SETTINGS_WIDGET_WIDTH, 32, - pixelsPerTact(), m_playPos[PLAY_SONG], + pixelsPerTact(), + m_s->m_playPos[song::Mode_PlaySong], m_currentPosition, this ); connect( this, SIGNAL( positionChanged( const midiTime & ) ), - m_playPos[PLAY_SONG].m_timeLine, + m_s->m_playPos[song::Mode_PlaySong].m_timeLine, SLOT( updatePosition( const midiTime & ) ) ); connect( tl, SIGNAL( positionChanged( const midiTime & ) ), this, SLOT( updatePosition( const midiTime & ) ) ); @@ -120,19 +109,11 @@ songEditor::songEditor( void ) : engine::getMainWindow()->addSpacingToToolBar( 10 ); - m_tempoModel.setTrack( m_automationTrack ); m_tempoSpinBox = new lcdSpinBox( 3, tb, tr( "Tempo" ) ); - m_tempoSpinBox->setModel( &m_tempoModel ); + m_tempoSpinBox->setModel( &m_s->m_tempoModel ); m_tempoSpinBox->setLabel( tr( "TEMPO/BPM" ) ); toolTip::add( m_tempoSpinBox, tr( "tempo of song" ) ); - connect( &m_tempoModel, SIGNAL( dataChanged() ), - this, SLOT( setTempo() ) ); - connect( &m_tempoModel, SIGNAL( dataUnchanged() ), - this, SLOT( setTempo() ) ); - connect( m_tempoSpinBox, SIGNAL( manualChange() ), this, - SLOT( setModified() ) ); - m_tempoSpinBox->setWhatsThis( tr( "The tempo of a song is specified in beats per minute " "(BPM). If you want to change the tempo of your " @@ -155,7 +136,8 @@ songEditor::songEditor( void ) : engine::getMainWindow()->addWidgetToToolBar( hq_btn, 1, col ); - toolButton * cp_btn = new toolButton( embed::getIconPixmap( "auto_limit" ), + toolButton * cp_btn = new toolButton( + embed::getIconPixmap( "auto_limit" ), tr( "Auto limiter" ), NULL, NULL, tb ); cp_btn->setCheckable( TRUE ); @@ -175,9 +157,9 @@ songEditor::songEditor( void ) : QLabel * master_vol_lbl = new QLabel( tb ); master_vol_lbl->setPixmap( embed::getIconPixmap( "master_volume" ) ); - m_masterVolumeModel.setTrack( m_automationTrack ); - m_masterVolumeSlider = new automatableSlider( tb, tr( "Master volume" ) ); - m_masterVolumeSlider->setModel( &m_masterVolumeModel ); + m_masterVolumeSlider = new automatableSlider( tb, + tr( "Master volume" ) ); + m_masterVolumeSlider->setModel( &m_s->m_masterVolumeModel ); m_masterVolumeSlider->setOrientation( Qt::Vertical ); m_masterVolumeSlider->setPageStep( 1 ); m_masterVolumeSlider->setTickPosition( QSlider::TicksLeft ); @@ -209,9 +191,8 @@ songEditor::songEditor( void ) : master_pitch_lbl->setPixmap( embed::getIconPixmap( "master_pitch" ) ); master_pitch_lbl->setFixedHeight( 64 ); - m_masterPitchModel.setTrack( m_automationTrack ); m_masterPitchSlider = new automatableSlider( tb, tr( "Master pitch" ) ); - m_masterPitchSlider->setModel( &m_masterPitchModel ); + m_masterPitchSlider->setModel( &m_s->m_masterPitchModel ); m_masterPitchSlider->setOrientation( Qt::Vertical ); m_masterPitchSlider->setPageStep( 1 ); m_masterPitchSlider->setTickPosition( QSlider::TicksLeft ); @@ -272,22 +253,22 @@ songEditor::songEditor( void ) : // fill own tool-bar m_playButton = new toolButton( embed::getIconPixmap( "play" ), tr( "Play song (Space)" ), - this, SLOT( play() ), m_toolBar ); + m_s, SLOT( play() ), m_toolBar ); m_stopButton = new toolButton( embed::getIconPixmap( "stop" ), tr( "Stop song (Space)" ), - this, SLOT( stop() ), m_toolBar ); + m_s, SLOT( stop() ), m_toolBar ); m_addBBTrackButton = new toolButton( embed::getIconPixmap( "add_bb_track" ), tr( "Add beat/bassline" ), - this, SLOT( addBBTrack() ), + m_s, SLOT( addBBTrack() ), m_toolBar ); m_addSampleTrackButton = new toolButton( embed::getIconPixmap( "add_sample_track" ), tr( "Add sample-track" ), - this, SLOT( addSampleTrack() ), + m_s, SLOT( addSampleTrack() ), m_toolBar ); m_drawModeButton = new toolButton( embed::getIconPixmap( @@ -404,8 +385,6 @@ songEditor::songEditor( void ) : songEditor::~songEditor() { - m_playing = FALSE; - delete m_automationTrack; } @@ -413,8 +392,8 @@ songEditor::~songEditor() void songEditor::paintEvent( QPaintEvent * _pe ) { - m_leftRightScroll->setMaximum( lengthInTacts() ); - trackContainer::paintEvent( _pe ); + m_leftRightScroll->setMaximum( m_s->lengthInTacts() ); + trackContainerView::paintEvent( _pe ); } @@ -426,48 +405,48 @@ void songEditor::keyPressEvent( QKeyEvent * _ke ) engine::getMainWindow()->isShiftPressed() == TRUE && _ke->key() == Qt::Key_Insert ) { - insertBar(); + m_s->insertBar(); } else if(/* _ke->modifiers() & Qt::ShiftModifier &&*/ engine::getMainWindow()->isShiftPressed() == TRUE && _ke->key() == Qt::Key_Delete ) { - removeBar(); + m_s->removeBar(); } else if( _ke->key() == Qt::Key_Left ) { - tact interesting_tact = currentTact(); + tact interesting_tact = m_s->currentTact(); if( interesting_tact > 0 ) { - setPlayPos( --interesting_tact, currentTact64th(), - PLAY_SONG ); + m_s->setPlayPos( --interesting_tact, + m_s->currentTact64th(), + song::Mode_PlaySong ); } - } else if( _ke->key() == Qt::Key_Right ) { - tact interesting_tact = currentTact(); + tact interesting_tact = m_s->currentTact(); if( interesting_tact < MAX_SONG_LENGTH ) { - setPlayPos( ++interesting_tact, currentTact64th(), - PLAY_SONG ); + m_s->setPlayPos( ++interesting_tact, + m_s->currentTact64th(), + song::Mode_PlaySong ); } - } else if( _ke->key() == Qt::Key_Space ) { - if( playing() ) + if( m_s->playing() ) { - stop(); + m_s->stop(); } else { - play(); + m_s->play(); } } else if( _ke->key() == Qt::Key_Home ) { - setPlayPos( 0, 0, PLAY_SONG ); + m_s->setPlayPos( 0, 0, song::Mode_PlaySong ); } else { @@ -509,8 +488,8 @@ void songEditor::wheelEvent( QWheelEvent * _we ) 100 / DEFAULT_PIXELS_PER_TACT ) ) + "%" ) ); // update timeline - m_playPos[PLAY_SONG].m_timeLine->setPixelsPerTact( - pixelsPerTact() ); + m_s->m_playPos[song::Mode_PlaySong].m_timeLine-> + setPixelsPerTact( pixelsPerTact() ); // and make sure, all TCO's are resized and relocated realignTracks(); } @@ -533,7 +512,7 @@ void songEditor::wheelEvent( QWheelEvent * _we ) void songEditor::masterVolumeChanged( int _new_val ) { masterVolumeMoved( _new_val ); - if( m_mvsStatus->isVisible() == FALSE && m_loadingProject == FALSE + if( m_mvsStatus->isVisible() == FALSE && m_s->m_loadingProject == FALSE && m_masterVolumeSlider->showStatus() ) { m_mvsStatus->reparent( m_masterVolumeSlider ); @@ -557,7 +536,7 @@ void songEditor::masterVolumePressed( void ) QPoint( 0, 0 ) ) + QPoint( m_masterVolumeSlider->width() + 2, -2 ) ); m_mvsStatus->show(); - masterVolumeMoved( m_masterVolumeModel.value() ); + masterVolumeMoved( m_s->m_masterVolumeModel.value() ); } @@ -582,7 +561,7 @@ void songEditor::masterVolumeReleased( void ) void songEditor::masterPitchChanged( int _new_val ) { masterPitchMoved( _new_val ); - if( m_mpsStatus->isVisible() == FALSE && m_loadingProject == FALSE + if( m_mpsStatus->isVisible() == FALSE && m_s->m_loadingProject == FALSE && m_masterPitchSlider->showStatus() ) { m_mpsStatus->reparent( m_masterPitchSlider ); @@ -605,7 +584,7 @@ void songEditor::masterPitchPressed( void ) QPoint( 0, 0 ) ) + QPoint( m_masterPitchSlider->width() + 2, -2 ) ); m_mpsStatus->show(); - masterPitchMoved( m_masterPitchModel.value() ); + masterPitchMoved( m_s->m_masterPitchModel.value() ); } @@ -630,7 +609,8 @@ void songEditor::masterPitchReleased( void ) void songEditor::updatePosition( const midiTime & _t ) { - if( ( m_playing && m_playMode == PLAY_SONG ) || m_scrollBack == TRUE ) + if( ( m_s->m_playing && m_s->m_playMode == song::Mode_PlaySong ) || + m_scrollBack == TRUE ) { const int w = width() - DEFAULT_SETTINGS_WIDGET_WIDTH - TRACK_OP_WIDTH; @@ -657,458 +637,18 @@ void songEditor::zoomingChanged( void ) const QString & zfac = m_zoomingComboBox->model()->currentText(); setPixelsPerTact( zfac.left( zfac.length() - 1 ).toInt() * DEFAULT_PIXELS_PER_TACT / 100 ); - m_playPos[PLAY_SONG].m_timeLine->setPixelsPerTact( pixelsPerTact() ); + m_s->m_playPos[song::Mode_PlaySong].m_timeLine-> + setPixelsPerTact( pixelsPerTact() ); realignTracks(); } -void songEditor::setTempo( void ) -{ - const bpm_t tempo = m_tempoModel.value(); - playHandleVector & phv = engine::getMixer()->playHandles(); - for( playHandleVector::iterator it = phv.begin(); it != phv.end(); - ++it ) - { - notePlayHandle * nph = dynamic_cast( *it ); - if( nph && !nph->released() ) - { - nph->resize( tempo ); - } - } - -// m_bpmSpinBox->setInitValue( _new_bpm ); - engine::updateFramesPerTact64th(); - emit tempoChanged( tempo ); -} - - - - -void songEditor::doActions( void ) -{ - while( !m_actions.empty() ) - { - switch( m_actions.front() ) - { - case ACT_STOP_PLAY: - { - timeLine * tl = - m_playPos[m_playMode].m_timeLine; - m_playing = FALSE; - if( tl != NULL ) - { - - switch( tl->behaviourAtStop() ) - { - case timeLine::BACK_TO_ZERO: - m_playPos[m_playMode].setTact( 0 ); - m_playPos[m_playMode].setTact64th( 0 ); - break; - - case timeLine::BACK_TO_START: - if( tl->savedPos() >= 0 ) - { - m_playPos[m_playMode].setTact( - tl->savedPos().getTact() ); - m_playPos[m_playMode].setTact64th( - tl->savedPos().getTact64th() ); - tl->savePos( -1 ); - } - break; - - case timeLine::KEEP_STOP_POSITION: - default: - break; - } - - } - else - { - m_playPos[m_playMode].setTact( 0 ); - m_playPos[m_playMode].setTact64th( 0 ); - } - - m_playPos[m_playMode].setCurrentFrame( 0 ); - updateTimeLinePosition(); - - // remove all note-play-handles that are active - engine::getMixer()->clear(); - - break; - } - - case ACT_PLAY_SONG: - m_playMode = PLAY_SONG; - m_playing = TRUE; - break; - - case ACT_PLAY_TRACK: - m_playMode = PLAY_TRACK; - m_playing = TRUE; - break; - - case ACT_PLAY_BB: - m_playMode = PLAY_BB; - m_playing = TRUE; - break; - - case ACT_PLAY_PATTERN: - m_playMode = PLAY_PATTERN; - m_playing = TRUE; - break; - - case ACT_PAUSE: - m_playing = FALSE;// just set the play-flag - m_paused = TRUE; - break; - - case ACT_RESUME_FROM_PAUSE: - m_playing = TRUE;// just set the play-flag - m_paused = FALSE; - break; - } - - // a second switch for saving pos when starting to play - // anything (need pos for restoring it later in certain - // timeline-modes) - switch( m_actions.front() ) - { - case ACT_PLAY_SONG: - case ACT_PLAY_TRACK: - case ACT_PLAY_BB: - case ACT_PLAY_PATTERN: - { - timeLine * tl = - m_playPos[m_playMode].m_timeLine; - if( tl != NULL ) - { - tl->savePos( m_playPos[m_playMode] ); - } - break; - } - - // keep GCC happy... - default: - break; - } - - m_actions.erase( m_actions.begin() ); - - } - -} - - - - -void songEditor::processNextBuffer( void ) -{ - doActions(); - - if( m_playing == FALSE ) - { - return; - } - - QList trackList; - Sint16 tco_num = -1; - - switch( m_playMode ) - { - case PLAY_SONG: - trackList = tracks(); - // at song-start we have to reset the LFOs - if( m_playPos[PLAY_SONG] == 0 ) - { - envelopeAndLFOWidget::resetLFO(); - } - break; - - case PLAY_TRACK: - trackList.push_back( m_trackToPlay ); - break; - - case PLAY_BB: - if( engine::getBBEditor()->numOfBBs() > 0 ) - { - tco_num = engine::getBBEditor()->currentBB(); - trackList.push_back( bbTrack::findBBTrack( - tco_num ) ); - } - break; - - case PLAY_PATTERN: - if( m_patternToPlay != NULL ) - { - tco_num = m_patternToPlay->getTrack()->getTCONum( - m_patternToPlay ); - trackList.push_back( - m_patternToPlay->getTrack() ); - } - break; - - default: - return; - - } - - if( trackList.empty() == TRUE ) - { - return; - } - - // check for looping-mode and act if neccessary - timeLine * tl = m_playPos[m_playMode].m_timeLine; - bool check_loop = tl != NULL && m_exporting == FALSE && - tl->loopPointsEnabled() && - !( m_playMode == PLAY_PATTERN && - m_patternToPlay->freezing() == TRUE ); - if( check_loop ) - { - if( m_playPos[m_playMode] < tl->loopBegin() || - m_playPos[m_playMode] >= tl->loopEnd() ) - { - m_playPos[m_playMode].setTact( - tl->loopBegin().getTact() ); - m_playPos[m_playMode].setTact64th( - tl->loopBegin().getTact64th() ); - } - } - - f_cnt_t total_frames_played = 0; - float frames_per_tact64th = engine::framesPerTact64th(); - - while( total_frames_played - < engine::getMixer()->framesPerPeriod() ) - { - f_cnt_t played_frames = engine::getMixer() - ->framesPerPeriod() - total_frames_played; - - float current_frame = m_playPos[m_playMode].currentFrame(); - // did we play a 64th of a tact? - if( current_frame >= frames_per_tact64th ) - { - int tact64th = m_playPos[m_playMode].getTact64th() - + (int)( current_frame / frames_per_tact64th ); - // did we play a whole tact? - if( tact64th >= 64 ) - { - // per default we just continue playing even if - // there's no more stuff to play - // (song-play-mode) - int max_tact = m_playPos[m_playMode].getTact() - + 2; - - // then decide whether to go over to next tact - // or to loop back to first tact - if( m_playMode == PLAY_BB ) - { - max_tact = engine::getBBEditor() - ->lengthOfCurrentBB(); - } - else if( m_playMode == PLAY_PATTERN && - m_loopPattern == TRUE && - tl != NULL && - tl->loopPointsEnabled() == FALSE ) - { - max_tact = m_patternToPlay->length() - .getTact(); - } - if( m_playPos[m_playMode].getTact() + 1 - < max_tact ) - { - // next tact - m_playPos[m_playMode].setTact( - m_playPos[m_playMode].getTact() - + 1 ); - } - else - { - // first tact - m_playPos[m_playMode].setTact( 0 ); - } - } - m_playPos[m_playMode].setTact64th( tact64th % 64 ); - - if( check_loop ) - { - if( m_playPos[m_playMode] >= tl->loopEnd() ) - { - m_playPos[m_playMode].setTact( - tl->loopBegin().getTact() ); - m_playPos[m_playMode].setTact64th( - tl->loopBegin().getTact64th() ); - } - } - - current_frame = fmodf( current_frame, - frames_per_tact64th ); - m_playPos[m_playMode].setCurrentFrame( current_frame ); - } - - f_cnt_t last_frames = (f_cnt_t)frames_per_tact64th - - (f_cnt_t)current_frame; - // skip last frame fraction - if( last_frames == 0 ) - { - ++total_frames_played; - m_playPos[m_playMode].setCurrentFrame( current_frame - + 1.0f ); - continue; - } - // do we have some samples left in this tact64th but this are - // less then samples we have to play? - if( last_frames < played_frames ) - { - // then set played_samples to remaining samples, the - // rest will be played in next loop - played_frames = last_frames; - } - - if( (f_cnt_t)current_frame == 0 ) - { - if( m_playMode == PLAY_SONG ) - { - m_automationTrack->play( m_playPos[m_playMode], - played_frames, - total_frames_played, tco_num ); - } - - // loop through all tracks and play them - for( int i = 0; i < trackList.size(); ++i ) - { - trackList[i]->play( m_playPos[m_playMode], - played_frames, - total_frames_played, tco_num ); - } - } - - // update frame-counters - total_frames_played += played_frames; - m_playPos[m_playMode].setCurrentFrame( played_frames + - current_frame ); - } - - if( m_exporting == FALSE ) - { - updateTimeLinePosition(); - } -} - - - - -bool songEditor::realTimeTask( void ) const -{ - return( !( m_exporting == TRUE || ( m_playMode == PLAY_PATTERN && - m_patternToPlay != NULL && - m_patternToPlay->freezing() == TRUE ) ) ); -} - - - - -void songEditor::play( void ) -{ - if( m_playing == TRUE ) - { - if( m_playMode != PLAY_SONG ) - { - // make sure, bb-editor updates/resets it play-button - engine::getBBEditor()->stop(); - //pianoRoll::inst()->stop(); - } - else - { - pause(); - return; - } - } - m_playButton->setIcon( embed::getIconPixmap( "pause" ) ); - m_actions.push_back( ACT_PLAY_SONG ); -} - - - - -void songEditor::playTrack( track * _trackToPlay ) -{ - if( m_playing == TRUE ) - { - stop(); - } - m_trackToPlay = _trackToPlay; - - m_actions.push_back( ACT_PLAY_TRACK ); -} - - - - -void songEditor::playBB( void ) -{ - if( m_playing == TRUE ) - { - stop(); - } - m_actions.push_back( ACT_PLAY_BB ); -} - - - - -void songEditor::playPattern( pattern * _patternToPlay, bool _loop ) -{ - if( m_playing == TRUE ) - { - stop(); - } - m_patternToPlay = _patternToPlay; - m_loopPattern = _loop; - if( m_patternToPlay != NULL ) - { - m_actions.push_back( ACT_PLAY_PATTERN ); - } -} - - - - -tact songEditor::lengthInTacts( void ) const -{ - tact len = 0; - const QList ctl = tracks(); - for( int i = 0; i < ctl.size(); ++i ) - { - len = tMax( ctl[i]->length(), len ); - } - return( len ); -} - - - - -void songEditor::setPlayPos( tact _tact_num, tact64th _t_64th, playModes - _play_mode ) -{ - m_playPos[_play_mode].setTact( _tact_num ); - m_playPos[_play_mode].setTact64th( _t_64th ); - m_playPos[_play_mode].setCurrentFrame( 0.0f ); - if( _play_mode == m_playMode ) - { - updateTimeLinePosition(); - } -} - - - - void songEditor::updateTimeLinePosition( void ) { - if( m_playPos[m_playMode].m_timeLine != NULL && - m_playPos[m_playMode].m_timeLineUpdate == TRUE ) + if( m_s->m_playPos[m_s->m_playMode].m_timeLine != NULL && + m_s->m_playPos[m_s->m_playMode].m_timeLineUpdate == TRUE ) { /* QTimer::singleShot( 1, m_playPos[m_playMode].m_timeLine, SLOT( updatePosition() ) );*/ @@ -1119,460 +659,6 @@ void songEditor::updateTimeLinePosition( void ) -void songEditor::stop( void ) -{ - m_actions.push_back( ACT_STOP_PLAY ); - m_playButton->setIcon( embed::getIconPixmap( "play" ) ); - m_scrollBack = TRUE; -} - - - - - - -void songEditor::pause( void ) -{ - m_actions.push_back( ACT_PAUSE ); - m_playButton->setIcon( embed::getIconPixmap( "play" ) ); -} - - - - -void songEditor::resumeFromPause( void ) -{ - m_actions.push_back( ACT_RESUME_FROM_PAUSE ); - m_playButton->setIcon( embed::getIconPixmap( "pause" ) ); -} - - - - -void songEditor::startExport( void ) -{ - stop(); - doActions(); - - play(); - doActions(); - - m_exporting = TRUE; -} - - - - -void songEditor::stopExport( void ) -{ - stop(); - m_exporting = FALSE; -} - - - - - - -void songEditor::insertBar( void ) -{ - QList tl = tracks(); - for( int i = 0; i < tl.size(); ++i ) - { - tl[i]->getTrackContentWidget()->insertTact( - m_playPos[PLAY_SONG] ); - } -} - - - - -void songEditor::removeBar( void ) -{ - QList tl = tracks(); - for( int i = 0; i < tl.size(); ++i ) - { - tl[i]->getTrackContentWidget()->removeTact( - m_playPos[PLAY_SONG] ); - } -} - - - - -void songEditor::addBBTrack( void ) -{ - track * t = track::create( track::BB_TRACK, this ); - if( dynamic_cast( t ) != NULL ) - { - dynamic_cast( t )->clickedTrackLabel(); - } -} - - - - -void songEditor::addSampleTrack( void ) -{ - (void) track::create( track::SAMPLE_TRACK, this ); -} - - - - -bpm_t songEditor::getTempo( void ) -{ - return( m_tempoModel.value() ); -} - - - - -automationPattern * songEditor::tempoAutomationPattern( void ) -{ - return( m_tempoModel.getAutomationPattern() ); -} - - - - -void songEditor::clearProject( void ) -{ - engine::getProjectJournal()->setJournalling( FALSE ); - - if( m_playing ) - { - stop(); - } - - engine::getMixer()->lock(); - clearAllTracks(); - - engine::getAutomationEditor()->setCurrentPattern( NULL ); - m_tempoModel.getAutomationPattern()->clear(); - m_masterVolumeModel.getAutomationPattern()->clear(); - m_masterPitchModel.getAutomationPattern()->clear(); - - engine::getBBEditor()->clearAllTracks(); - engine::getMixer()->unlock(); - - engine::getProjectNotes()->clear(); - - engine::getProjectJournal()->clearInvalidJournallingObjects(); - engine::getProjectJournal()->clearJournal(); - - engine::getProjectJournal()->setJournalling( TRUE ); -} - - - - - -// create new file -void songEditor::createNewProject( void ) -{ - QString default_template = configManager::inst()->userProjectsDir() - + "templates/default.mpt"; - if( QFile::exists( default_template ) ) - { - createNewProjectFromTemplate( default_template ); - return; - } - - default_template = configManager::inst()->factoryProjectsDir() - + "templates/default.mpt"; - if( QFile::exists( default_template ) ) - { - createNewProjectFromTemplate( default_template ); - return; - } - - m_loadingProject = TRUE; - - clearProject(); - - engine::getProjectJournal()->setJournalling( FALSE ); - - m_fileName = m_oldFileName = ""; - - engine::getMainWindow()->resetWindowTitle(); - - track * t; - t = track::create( track::INSTRUMENT_TRACK, this ); - dynamic_cast< instrumentTrack * >( t )->loadInstrument( - "tripleoscillator" ); - track::create( track::SAMPLE_TRACK, this ); - t = track::create( track::INSTRUMENT_TRACK, engine::getBBEditor() ); - dynamic_cast< instrumentTrack * >( t )->loadInstrument( - "tripleoscillator" ); - track::create( track::BB_TRACK, this ); - - m_tempoModel.setInitValue( DEFAULT_BPM ); - m_masterVolumeModel.setInitValue( 100 ); - m_masterPitchModel.setInitValue( 0 ); - - engine::getProjectJournal()->setJournalling( TRUE ); - - m_loadingProject = FALSE; -} - - - - -void FASTCALL songEditor::createNewProjectFromTemplate( const QString & - _template ) -{ - loadProject( _template ); - // clear file-name so that user doesn't overwrite template when - // saving... - m_fileName = m_oldFileName = ""; -} - - - - -// load given song -void FASTCALL songEditor::loadProject( const QString & _file_name ) -{ - m_loadingProject = TRUE; - - clearProject(); - - engine::getProjectJournal()->setJournalling( FALSE ); - - m_fileName = _file_name; - m_oldFileName = _file_name; - - multimediaProject mmp( m_fileName ); - // if file could not be opened, head-node is null and we create - // new project - if( mmp.head().isNull() ) - { - createNewProject(); - return; - } - - engine::getMainWindow()->resetWindowTitle(); - - // get the header information from the DOM - m_tempoModel.loadSettings( mmp.head(), "bpm" ); - m_masterVolumeModel.loadSettings( mmp.head(), "mastervol" ); - m_masterPitchModel.loadSettings( mmp.head(), "masterpitch" ); - - // reset loop-point-state - m_playPos[PLAY_SONG].m_timeLine->toggleLoopPoints( 0 ); - - QDomNode node = mmp.content().firstChild(); - while( !node.isNull() ) - { - if( node.isElement() ) - { - if( node.nodeName() == "trackcontainer" ) - { - ( (journallingObject *)( this ) )-> - restoreState( node.toElement() ); - } - else if( node.nodeName() == - engine::getPianoRoll()->nodeName() ) - { - engine::getPianoRoll()->restoreState( - node.toElement() ); - } - else if( node.nodeName() == - engine::getAutomationEditor()->nodeName() ) - { - engine::getAutomationEditor()->restoreState( - node.toElement() ); - } - else if( node.nodeName() == - engine::getProjectNotes()->nodeName() ) - { - ( (journallingObject *)( engine:: - getProjectNotes() ) )-> - restoreState( node.toElement() ); - } - else if( node.nodeName() == - m_playPos[PLAY_SONG].m_timeLine->nodeName() ) - { - m_playPos[PLAY_SONG].m_timeLine->restoreState( - node.toElement() ); - } - } - node = node.nextSibling(); - } - - m_leftRightScroll->setValue( 0 ); - - configManager::inst()->addRecentlyOpenedProject( _file_name ); - - engine::getProjectJournal()->setJournalling( TRUE ); - - m_loadingProject = FALSE; -} - - - - -// save current song -bool songEditor::saveProject( void ) -{ - multimediaProject mmp( multimediaProject::SONG_PROJECT ); - - m_tempoModel.saveSettings( mmp, mmp.head(), "bpm" ); - m_masterVolumeModel.saveSettings( mmp, mmp.head(), "mastervol" ); - m_masterPitchModel.saveSettings( mmp, mmp.head(), "masterpitch" ); - - - ( (journallingObject *)( this ) )->saveState( mmp, mmp.content() ); - - engine::getPianoRoll()->saveState( mmp, mmp.content() ); - engine::getAutomationEditor()->saveState( mmp, mmp.content() ); - ( (journallingObject *)( engine::getProjectNotes() ) )->saveState( mmp, - mmp.content() ); - m_playPos[PLAY_SONG].m_timeLine->saveState( mmp, mmp.content() ); - - m_fileName = mmp.nameWithExtension( m_fileName ); - if( mmp.writeFile( m_fileName, m_oldFileName == "" || - m_fileName != m_oldFileName ) == TRUE ) - { - textFloat::displayMessage( tr( "Project saved" ), - tr( "The project %1 is now saved." - ).arg( m_fileName ), - embed::getIconPixmap( "project_save", 24, 24 ), - 2000 ); - configManager::inst()->addRecentlyOpenedProject( m_fileName ); - engine::getMainWindow()->resetWindowTitle(); - } - else - { - textFloat::displayMessage( tr( "Project NOT saved." ), - tr( "The project %1 was not saved!" ).arg( - m_fileName ), - embed::getIconPixmap( "error" ), 4000 ); - return( FALSE ); - } - return( TRUE ); -} - - - - -// save current song in given filename -bool FASTCALL songEditor::saveProjectAs( const QString & _file_name ) -{ - QString o = m_oldFileName; - m_oldFileName = m_fileName; - m_fileName = _file_name; - if( saveProject() == FALSE ) - { - m_fileName = m_oldFileName; - m_oldFileName = o; - return( FALSE ); - } - m_oldFileName = m_fileName; - return( TRUE ); -} - - - - -void songEditor::importProject( void ) -{ - QFileDialog ofd( this, tr( "Import file" ), ""/*, - tr( "MIDI-files (*.mid)" )*/ ); - ofd.setDirectory( configManager::inst()->userProjectsDir() ); - ofd.setFileMode( QFileDialog::ExistingFiles ); - if( ofd.exec () == QDialog::Accepted && !ofd.selectedFiles().isEmpty() ) - { - importFilter::import( ofd.selectedFiles()[0], this ); - } -} - - -#warning TODO: move somewhere else -static inline QString baseName( const QString & _file ) -{ - return( QFileInfo( _file ).absolutePath() + "/" + - QFileInfo( _file ).completeBaseName() ); -} - - -void songEditor::exportProject( void ) -{ - QString base_filename; - - if( m_fileName != "" ) - { - base_filename = baseName( m_fileName ); - } - else - { - base_filename = tr( "untitled" ); - } - base_filename += fileEncodeDevices[0].m_extension; - - QFileDialog efd( engine::getMainWindow() ); - efd.setFileMode( QFileDialog::AnyFile ); - - int idx = 0; - QStringList types; - while( fileEncodeDevices[idx].m_fileType != NULL_FILE ) - { - types << tr( fileEncodeDevices[idx].m_description ); - ++idx; - } - efd.setFilters( types ); - efd.selectFile( base_filename ); - efd.setWindowTitle( tr( "Select file for project-export..." ) ); - - if( efd.exec() == QDialog::Accepted && - !efd.selectedFiles().isEmpty() && efd.selectedFiles()[0] != "" - ) - { - const QString export_file_name = efd.selectedFiles()[0]; - if( QFileInfo( export_file_name ).exists() == TRUE && - QMessageBox::warning( engine::getMainWindow(), - tr( "File already exists" ), - tr( "The file \"%1\" already " - "exists. Do you want " - "to overwrite it?" - ).arg( QFileInfo( - export_file_name ).fileName() ), - QMessageBox::Yes, - QMessageBox::No | - QMessageBox::Escape | - QMessageBox::Default ) - == QMessageBox::No ) - { - return; - } - exportProjectDialog epd( export_file_name, - engine::getMainWindow() ); - epd.exec(); - } -} - - - - -void songEditor::updateFramesPerTact64th( void ) -{ - engine::updateFramesPerTact64th(); -} - - - - -void songEditor::setModified( void ) -{ - if( !m_loadingProject ) - { - engine::getMainWindow()->resetWindowTitle( TRUE ); - } -} - - - bool songEditor::allowRubberband( void ) const { diff --git a/src/core/timeline.cpp b/src/core/timeline.cpp index abf735e97..53afba87b 100644 --- a/src/core/timeline.cpp +++ b/src/core/timeline.cpp @@ -51,12 +51,12 @@ QPixmap * timeLine::s_loopPointDisabledPixmap = NULL; timeLine::timeLine( const int _xoff, const int _yoff, const float _ppt, - songEditor::playPos & _pos, const midiTime & _begin, + song::playPos & _pos, const midiTime & _begin, QWidget * _parent ) : QWidget( _parent ), - m_autoScroll( AUTOSCROLL_ENABLED ), - m_loopPoints( LOOP_POINTS_DISABLED ), - m_behaviourAtStop( BACK_TO_ZERO ), + m_autoScroll( AutoScrollEnabled ), + m_loopPoints( LoopPointsDisabled ), + m_behaviourAtStop( BackToZero ), m_changedPosition( TRUE ), m_xOffset( _xoff ), m_posMarkerX( 0 ), @@ -65,7 +65,7 @@ timeLine::timeLine( const int _xoff, const int _yoff, const float _ppt, m_begin( _begin ), m_savedPos( -1 ), m_hint( NULL ), - m_action( NONE ), + m_action( NoAction ), m_moveXOff( 0 ) { m_loopPos[0] = 0; @@ -175,7 +175,7 @@ void timeLine::loadSettings( const QDomElement & _this ) { m_loopPos[0] = _this.attribute( "lp0pos" ).toInt(); m_loopPos[1] = _this.attribute( "lp1pos" ).toInt(); - m_loopPoints = static_cast( + m_loopPoints = static_cast( _this.attribute( "lpstate" ).toInt() ); update(); emit loopPointStateLoaded( m_loopPoints ); @@ -192,7 +192,7 @@ void timeLine::updatePosition( const midiTime & ) { m_posMarkerX = new_x; m_changedPosition = TRUE; - if( m_autoScroll == AUTOSCROLL_ENABLED ) + if( m_autoScroll == AutoScrollEnabled ) { emit positionChanged( m_pos ); } @@ -205,7 +205,7 @@ void timeLine::updatePosition( const midiTime & ) void timeLine::toggleAutoScroll( int _n ) { - m_autoScroll = static_cast( _n ); + m_autoScroll = static_cast( _n ); } @@ -213,7 +213,7 @@ void timeLine::toggleAutoScroll( int _n ) void timeLine::toggleLoopPoints( int _n ) { - m_loopPoints = static_cast( _n ); + m_loopPoints = static_cast( _n ); update(); } @@ -222,7 +222,7 @@ void timeLine::toggleLoopPoints( int _n ) void timeLine::toggleBehaviourAtStop( int _n ) { - m_behaviourAtStop = static_cast( _n ); + m_behaviourAtStop = static_cast( _n ); } @@ -280,7 +280,7 @@ void timeLine::mousePressEvent( QMouseEvent * _me ) } if( _me->button() == Qt::LeftButton ) { - m_action = MOVE_POS_MARKER; + m_action = MovePositionMarker; if( _me->x() - m_xOffset < s_posMarkerPixmap->width() ) { m_moveXOff = _me->x() - m_xOffset; @@ -294,18 +294,18 @@ void timeLine::mousePressEvent( QMouseEvent * _me ) { const midiTime t = m_begin + static_cast( _me->x() * 64 / m_ppt ); - m_action = MOVE_LOOP_BEGIN; + m_action = MoveLoopBegin; if( m_loopPos[0] > m_loopPos[1] ) { qSwap( m_loopPos[0], m_loopPos[1] ); } if( _me->button() == Qt::RightButton ) { - m_action = MOVE_LOOP_END; + m_action = MoveLoopEnd; } - m_loopPos[( m_action == MOVE_LOOP_BEGIN ) ? 0 : 1] = t; + m_loopPos[( m_action == MoveLoopBegin ) ? 0 : 1] = t; } - if( m_action == MOVE_LOOP_BEGIN || m_action == MOVE_LOOP_END ) + if( m_action == MoveLoopBegin || m_action == MoveLoopEnd ) { delete m_hint; m_hint = textFloat::displayMessage( tr( "Hint" ), @@ -325,17 +325,17 @@ void timeLine::mouseMoveEvent( QMouseEvent * _me ) m_xOffset - m_moveXOff, 0 ) * 64 / m_ppt ); switch( m_action ) { - case MOVE_POS_MARKER: + case MovePositionMarker: m_pos.setTact( t.getTact() ); m_pos.setTact64th( t.getTact64th() ); m_pos.setCurrentFrame( 0 ); updatePosition(); break; - case MOVE_LOOP_BEGIN: - case MOVE_LOOP_END: + case MoveLoopBegin: + case MoveLoopEnd: { - const Uint8 i = m_action - MOVE_LOOP_BEGIN; + const Uint8 i = m_action - MoveLoopBegin; if( engine::getMainWindow()->isCtrlPressed() == TRUE ) { // no ctrl-press-hint when having ctrl pressed @@ -363,7 +363,7 @@ void timeLine::mouseReleaseEvent( QMouseEvent * _me ) { delete m_hint; m_hint = NULL; - m_action = NONE; + m_action = NoAction; } diff --git a/src/core/track.cpp b/src/core/track.cpp index 7d4d91616..575c21f5e 100644 --- a/src/core/track.cpp +++ b/src/core/track.cpp @@ -4,7 +4,7 @@ * track.cpp - implementation of classes concerning tracks -> neccessary for * all track-like objects (beat/bassline, sample-track...) * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -28,15 +28,16 @@ #include "track.h" +#include -#include #include #include #include +#include #include -#include "automation_pattern.h" +//#include "automation_pattern.h" #include "automation_track.h" #include "bb_editor.h" #include "bb_track.h" @@ -50,7 +51,7 @@ #include "pixmap_button.h" #include "project_journal.h" #include "sample_track.h" -#include "song_editor.h" +#include "song.h" #include "string_pair_drag.h" #include "templates.h" #include "text_float.h" @@ -66,21 +67,138 @@ const Uint16 TRACK_OP_BTN_HEIGHT = 14; const Uint16 MINIMAL_TRACK_HEIGHT = 32; -textFloat * trackContentObject::s_textFloat = NULL; +textFloat * trackContentObjectView::s_textFloat = NULL; // =========================================================================== // trackContentObject // =========================================================================== trackContentObject::trackContentObject( track * _track ) : - selectableObject( _track->getTrackContentWidget() ), + model( _track ), m_track( _track ), m_startPosition(), m_length(), - m_action( NONE ), + m_mutedModel( FALSE, this ) +{ + setJournalling( FALSE ); + movePosition( 0 ); + changeLength( 0 ); + setJournalling( TRUE ); +} + + + + +trackContentObject::~trackContentObject() +{ + m_track->removeTCO( this ); +} + + + + +void trackContentObject::movePosition( const midiTime & _pos ) +{ + if( m_startPosition != _pos ) + { + addJournalEntry( journalEntry( Move, m_startPosition - _pos ) ); + m_startPosition = _pos; + } + emit positionChanged(); +} + + + + +void trackContentObject::changeLength( const midiTime & _length ) +{ + if( m_length != _length ) + { + addJournalEntry( journalEntry( Resize, m_length - _length ) ); + m_length = _length; + } + emit lengthChanged(); +} + + + + +void trackContentObject::undoStep( journalEntry & _je ) +{ + saveJournallingState( FALSE ); + switch( _je.actionID() ) + { + case Move: + movePosition( startPosition() + _je.data().toInt() ); + break; + case Resize: + changeLength( length() + _je.data().toInt() ); + break; + } + restoreJournallingState(); +} + + + + +void trackContentObject::redoStep( journalEntry & _je ) +{ + journalEntry je( _je.actionID(), -_je.data().toInt() ); + undoStep( je ); +} + + + + +void trackContentObject::cut( void ) +{ + copy(); + deleteLater(); +} + + + + +void trackContentObject::copy( void ) +{ + clipboard::copy( this ); +} + + + + +void trackContentObject::paste( void ) +{ + if( clipboard::getContent( nodeName() ) != NULL ) + { + restoreState( *( clipboard::getContent( nodeName() ) ) ); + } +} + + + + +void trackContentObject::toggleMute( void ) +{ + m_mutedModel.setValue( !m_mutedModel.value() ); + emit dataChanged(); +} + + + + + + + +trackContentObjectView::trackContentObjectView( trackContentObject * _tco, + trackView * _tv ) : + selectableObject( _tv->getTrackContentWidget() ), + modelView( NULL ), + m_tco( _tco ), + m_trackView( _tv ), + m_action( NoAction ), m_autoResize( FALSE ), m_initialMouseX( 0 ), - m_muted( FALSE ), m_hint( NULL ) { if( s_textFloat == NULL ) @@ -91,55 +209,58 @@ trackContentObject::trackContentObject( track * _track ) : setAttribute( Qt::WA_DeleteOnClose ); setFocusPolicy( Qt::StrongFocus ); + move( 0, 1 ); show(); - setJournalling( FALSE ); - movePosition( 0 ); - changeLength( 0 ); - setJournalling( TRUE ); - - setFixedHeight( parentWidget()->height() - 2 ); + setFixedHeight( _tv->getTrackContentWidget()->height() - 2 ); setAcceptDrops( TRUE ); setMouseTracking( TRUE ); + + connect( m_tco, SIGNAL( lengthChanged() ), + this, SLOT( updateLength() ) ); + connect( m_tco, SIGNAL( positionChanged() ), + this, SLOT( updatePosition() ) ); + connect( m_tco, SIGNAL( destroyed( QObject * ) ), + this, SLOT( close() ), Qt::QueuedConnection ); + setModel( m_tco ); + + m_trackView->getTrackContentWidget()->addTCOView( this ); } -trackContentObject::~trackContentObject() +trackContentObjectView::~trackContentObjectView() { delete m_hint; + // we have to give our track-container the focus because otherwise the + // op-buttons of our track-widgets could become focus and when the user + // presses space for playing song, just one of these buttons is pressed + // which results in unwanted effects + m_trackView->getTrackContainerView()->setFocus(); } -bool trackContentObject::fixedTCOs( void ) +bool trackContentObjectView::fixedTCOs( void ) { - return( m_track->getTrackContainer()->fixedTCOs() ); + return( m_trackView->getTrackContainerView()->fixedTCOs() ); } -void trackContentObject::movePosition( const midiTime & _pos ) +bool trackContentObjectView::close( void ) { - if( m_startPosition != _pos ) - { - //engine::getSongEditor()->setModified(); - addJournalEntry( journalEntry( MOVE, m_startPosition - _pos ) ); - m_startPosition = _pos; - } - m_track->getTrackWidget()->changePosition(); - // moving a TCO can result in change of song-length etc., - // therefore we update the track-container - m_track->getTrackContainer()->update(); + m_trackView->getTrackContentWidget()->removeTCOView( this ); + QWidget::close(); } -void trackContentObject::changeLength( const midiTime & _length ) +void trackContentObjectView::updateLength( void ) { if( fixedTCOs() ) { @@ -147,48 +268,49 @@ void trackContentObject::changeLength( const midiTime & _length ) } else { - setFixedWidth( static_cast( m_length * pixelsPerTact() / + setFixedWidth( static_cast( m_tco->length() * + pixelsPerTact() / 64 ) + TCO_BORDER_WIDTH * 2 ); } - - if( m_length != _length ) - { - //engine::getSongEditor()->setModified(); - addJournalEntry( journalEntry( RESIZE, m_length - _length ) ); - m_length = _length; - - // changing length of TCO can result in change of song-length - // etc., therefore we update the track-container - m_track->getTrackContainer()->update(); - } + m_trackView->getTrackContainerView()->update(); } -void trackContentObject::dragEnterEvent( QDragEnterEvent * _dee ) +void trackContentObjectView::updatePosition( void ) +{ + m_trackView->getTrackContentWidget()->changePosition(); + // moving a TCO can result in change of song-length etc., + // therefore we update the track-container + m_trackView->getTrackContainerView()->update(); +} + + + +void trackContentObjectView::dragEnterEvent( QDragEnterEvent * _dee ) { stringPairDrag::processDragEnterEvent( _dee, "tco_" + - QString::number( m_track->type() ) ); + QString::number( m_tco->getTrack()->type() ) ); } -void trackContentObject::dropEvent( QDropEvent * _de ) +void trackContentObjectView::dropEvent( QDropEvent * _de ) { QString type = stringPairDrag::decodeKey( _de ); QString value = stringPairDrag::decodeValue( _de ); - if( type == ( "tco_" + QString::number( m_track->type() ) ) ) + if( type == ( "tco_" + QString::number( m_tco->getTrack()->type() ) ) ) { // value contains our XML-data so simply create a // multimediaProject which does the rest for us... multimediaProject mmp( value, FALSE ); // at least save position before getting to moved to somewhere // the user doesn't expect... - midiTime pos = startPosition(); - restoreState( mmp.content().firstChild().toElement() ); - movePosition( pos ); + midiTime pos = m_tco->startPosition(); + m_tco->restoreState( mmp.content().firstChild().toElement() ); + m_tco->movePosition( pos ); _de->accept(); } } @@ -196,7 +318,7 @@ void trackContentObject::dropEvent( QDropEvent * _de ) -void trackContentObject::leaveEvent( QEvent * _e ) +void trackContentObjectView::leaveEvent( QEvent * _e ) { while( QApplication::overrideCursor() != NULL ) { @@ -211,13 +333,13 @@ void trackContentObject::leaveEvent( QEvent * _e ) -void trackContentObject::mousePressEvent( QMouseEvent * _me ) +void trackContentObjectView::mousePressEvent( QMouseEvent * _me ) { - if( m_track->getTrackContainer()->allowRubberband() == TRUE && + if( m_trackView->getTrackContainerView()->allowRubberband() == TRUE && _me->button() == Qt::LeftButton ) { // if rubberband is active, we can be selected - if( m_track->getTrackContainer()->rubberBandActive() == FALSE ) + if( !m_trackView->getTrackContainerView()->rubberBandActive() ) { if( engine::getMainWindow()->isCtrlPressed() == TRUE ) { @@ -225,7 +347,7 @@ void trackContentObject::mousePressEvent( QMouseEvent * _me ) } else if( isSelected() == TRUE ) { - m_action = MOVE_SELECTION; + m_action = MoveSelection; m_initialMouseX = _me->x(); } } @@ -244,13 +366,14 @@ void trackContentObject::mousePressEvent( QMouseEvent * _me ) engine::getMainWindow()->isCtrlPressed() == TRUE ) { // start drag-action - multimediaProject mmp( multimediaProject::DRAG_N_DROP_DATA ); - saveState( mmp, mmp.content() ); + multimediaProject mmp( multimediaProject::DragNDropData ); + m_tco->saveState( mmp, mmp.content() ); QPixmap thumbnail = QPixmap::grabWidget( this ).scaled( 128, 128, Qt::KeepAspectRatio, Qt::SmoothTransformation ); - new stringPairDrag( QString( "tco_%1" ).arg( m_track->type() ), + new stringPairDrag( QString( "tco_%1" ).arg( + m_tco->getTrack()->type() ), mmp.toString(), thumbnail, this ); } else if( _me->button() == Qt::LeftButton && @@ -258,14 +381,14 @@ void trackContentObject::mousePressEvent( QMouseEvent * _me ) fixedTCOs() == FALSE ) { // move or resize - setJournalling( FALSE ); + m_tco->setJournalling( FALSE ); m_initialMouseX = _me->x(); if( _me->x() < width() - RESIZE_GRIP_WIDTH ) { - m_action = MOVE; - m_oldTime = m_startPosition; + m_action = Move; + m_oldTime = m_tco->startPosition(); QCursor c( Qt::SizeAllCursor ); QApplication::setOverrideCursor( c ); s_textFloat->setTitle( tr( "Current position" ) ); @@ -277,8 +400,8 @@ void trackContentObject::mousePressEvent( QMouseEvent * _me ) } else if( m_autoResize == FALSE ) { - m_action = RESIZE; - m_oldTime = m_length; + m_action = Resize; + m_oldTime = m_tco->length(); QCursor c( Qt::SizeHorCursor ); QApplication::setOverrideCursor( c ); s_textFloat->setTitle( tr( "Current length" ) ); @@ -297,12 +420,14 @@ void trackContentObject::mousePressEvent( QMouseEvent * _me ) { if( engine::getMainWindow()->isCtrlPressed() ) { - toggleMute(); + m_tco->toggleMute(); } else if( fixedTCOs() == FALSE ) { // delete ourself - close(); + m_trackView->getTrackContentWidget()-> + removeTCOView( this ); + m_tco->deleteLater(); } } } @@ -310,7 +435,7 @@ void trackContentObject::mousePressEvent( QMouseEvent * _me ) -void trackContentObject::mouseMoveEvent( QMouseEvent * _me ) +void trackContentObjectView::mouseMoveEvent( QMouseEvent * _me ) { if( engine::getMainWindow()->isCtrlPressed() == TRUE ) { @@ -318,31 +443,32 @@ void trackContentObject::mouseMoveEvent( QMouseEvent * _me ) m_hint = NULL; } - const float ppt = m_track->getTrackContainer()->pixelsPerTact(); - if( m_action == MOVE ) + const float ppt = m_trackView->getTrackContainerView()->pixelsPerTact(); + if( m_action == Move ) { const int x = mapToParent( _me->pos() ).x() - m_initialMouseX; - midiTime t = tMax( 0, (Sint32) m_track->getTrackContainer()-> - currentPosition() + + midiTime t = tMax( 0, (Sint32) + m_trackView->getTrackContainerView()->currentPosition()+ static_cast( x * 64 / ppt ) ); if( engine::getMainWindow()->isCtrlPressed() == FALSE && _me->button() == Qt::NoButton ) { t = t.toNearestTact(); } - movePosition( t ); - m_track->getTrackWidget()->changePosition(); + m_tco->movePosition( t ); + m_trackView->getTrackContentWidget()->changePosition(); s_textFloat->setText( QString( "%1:%2" ). - arg( m_startPosition.getTact() + 1 ). - arg( m_startPosition.getTact64th() ) ); - s_textFloat->move( QPoint(8, s_textFloat->parentWidget()->height() - + arg( m_tco->startPosition().getTact() + 1 ). + arg( m_tco->startPosition().getTact64th() ) ); + s_textFloat->move( QPoint( 8, + s_textFloat->parentWidget()->height() - s_textFloat->height() - 24 ) ); } - else if( m_action == MOVE_SELECTION ) + else if( m_action == MoveSelection ) { const int dx = _me->x() - m_initialMouseX; QVector so = - m_track->getTrackContainer()->selectedObjects(); + m_trackView->getTrackContainerView()->selectedObjects(); QVector tcos; midiTime smallest_pos; // find out smallest position of all selected objects for not @@ -369,7 +495,7 @@ void trackContentObject::mouseMoveEvent( QMouseEvent * _me ) smallest_pos ); } } - else if( m_action == RESIZE ) + else if( m_action == Resize ) { midiTime t = tMax( 64, static_cast( _me->x() * 64 / ppt ) ); @@ -378,14 +504,14 @@ void trackContentObject::mouseMoveEvent( QMouseEvent * _me ) { t = t.toNearestTact(); } - changeLength( t ); + m_tco->changeLength( t ); s_textFloat->setText( tr( "%1:%2 (%3:%4 to %5:%6)" ). - arg( length().getTact() ). - arg( length().getTact64th() ). - arg( m_startPosition.getTact() + 1 ). - arg( m_startPosition.getTact64th() ). - arg( endPosition().getTact() + 1 ). - arg( endPosition().getTact64th() ) ); + arg( m_tco->length().getTact() ). + arg( m_tco->length().getTact64th() ). + arg( m_tco->startPosition().getTact() + 1 ). + arg( m_tco->startPosition().getTact64th() ). + arg( m_tco->endPosition().getTact() + 1 ). + arg( m_tco->endPosition().getTact64th() ) ); s_textFloat->move( mapTo( topLevelWidget(), QPoint( 0, 0 ) ) + QPoint( width() + 2, 8 ) ); } @@ -415,16 +541,16 @@ void trackContentObject::mouseMoveEvent( QMouseEvent * _me ) -void trackContentObject::mouseReleaseEvent( QMouseEvent * _me ) +void trackContentObjectView::mouseReleaseEvent( QMouseEvent * _me ) { - if( m_action == MOVE || m_action == RESIZE ) + if( m_action == Move || m_action == Resize ) { - setJournalling( TRUE ); - addJournalEntry( journalEntry( m_action, m_oldTime - - ( ( m_action == MOVE ) ? - m_startPosition : m_length ) ) ); + m_tco->setJournalling( TRUE ); + m_tco->addJournalEntry( journalEntry( m_action, m_oldTime - + ( ( m_action == Move ) ? + m_tco->startPosition() : m_tco->length() ) ) ); } - m_action = NONE; + m_action = NoAction; delete m_hint; m_hint = NULL; s_textFloat->hide(); @@ -435,26 +561,26 @@ void trackContentObject::mouseReleaseEvent( QMouseEvent * _me ) -void trackContentObject::contextMenuEvent( QContextMenuEvent * _cme ) +void trackContentObjectView::contextMenuEvent( QContextMenuEvent * _cme ) { QMenu contextMenu( this ); if( fixedTCOs() == FALSE ) { contextMenu.addAction( embed::getIconPixmap( "cancel" ), tr( "Delete (middle mousebutton)" ), - this, SLOT( close() ) ); + m_tco, SLOT( deleteLater() ) ); contextMenu.addSeparator(); contextMenu.addAction( embed::getIconPixmap( "edit_cut" ), - tr( "Cut" ), this, SLOT( cut() ) ); + tr( "Cut" ), m_tco, SLOT( cut() ) ); } contextMenu.addAction( embed::getIconPixmap( "edit_copy" ), - tr( "Copy" ), this, SLOT( copy() ) ); + tr( "Copy" ), m_tco, SLOT( copy() ) ); contextMenu.addAction( embed::getIconPixmap( "edit_paste" ), - tr( "Paste" ), this, SLOT( paste() ) ); + tr( "Paste" ), m_tco, SLOT( paste() ) ); contextMenu.addSeparator(); contextMenu.addAction( embed::getIconPixmap( "muted" ), tr( "Mute/unmute ( + middle click)" ), - this, SLOT( toggleMute() ) ); + m_tco, SLOT( toggleMute() ) ); constructContextMenu( &contextMenu ); contextMenu.exec( QCursor::pos() ); @@ -463,93 +589,15 @@ void trackContentObject::contextMenuEvent( QContextMenuEvent * _cme ) -float trackContentObject::pixelsPerTact( void ) +float trackContentObjectView::pixelsPerTact( void ) { - return( getTrack()->getTrackContainer()->pixelsPerTact() ); + return( m_trackView->getTrackContainerView()->pixelsPerTact() ); } -void trackContentObject::undoStep( journalEntry & _je ) -{ - saveJournallingState( FALSE ); - switch( _je.actionID() ) - { - case MOVE: - movePosition( startPosition() + _je.data().toInt() ); - break; - case RESIZE: - changeLength( length() + _je.data().toInt() ); - break; - } - restoreJournallingState(); -} - - - - -void trackContentObject::redoStep( journalEntry & _je ) -{ - journalEntry je( _je.actionID(), -_je.data().toInt() ); - undoStep( je ); -} - - - - -void trackContentObject::close( void ) -{ - m_track->getTrackContentWidget()->removeTCO( this, FALSE ); - // we have to give our track-container the focus because otherwise the - // op-buttons of our track-widgets could become focus and when the user - // presses space for playing song, just one of these buttons is pressed - // which results in unwanted effects - m_track->getTrackContainer()->setFocus(); - QWidget::close(); -} - - - - -void trackContentObject::cut( void ) -{ - copy(); - close(); -} - - - - -void trackContentObject::copy( void ) -{ - clipboard::copy( this ); -} - - - - -void trackContentObject::paste( void ) -{ - if( clipboard::getContent( nodeName() ) != NULL ) - { - restoreState( *( clipboard::getContent( nodeName() ) ) ); - } -} - - - - -void trackContentObject::toggleMute( void ) -{ - m_muted = !m_muted; - update(); -} - - - - -void trackContentObject::setAutoResizeEnabled( bool _e ) +void trackContentObjectView::setAutoResizeEnabled( bool _e ) { m_autoResize = _e; } @@ -557,18 +605,23 @@ void trackContentObject::setAutoResizeEnabled( bool _e ) + // =========================================================================== // trackContentWidget // =========================================================================== -trackContentWidget::trackContentWidget( trackWidget * _parent ) : +trackContentWidget::trackContentWidget( trackView * _parent ) : QWidget( _parent ), - m_trackWidget( _parent ) + m_trackView( _parent ) { setAutoFillBackground( TRUE ); QPalette pal; pal.setColor( backgroundRole(), QColor( 96, 96, 96 ) ); setPalette( pal ); setAcceptDrops( TRUE ); + + connect( _parent->getTrackContainerView(), + SIGNAL( positionChanged( const midiTime & ) ), + this, SLOT( changePosition( const midiTime & ) ) ); } @@ -581,156 +634,41 @@ trackContentWidget::~trackContentWidget() -trackContentObject * trackContentWidget::getTCO( int _tco_num ) -{ - if( _tco_num < m_trackContentObjects.size() ) - { - return( m_trackContentObjects[_tco_num] ); - } - printf( "called trackContentWidget::getTCO( %d, TRUE ), " - "but TCO %d doesn't exist\n", _tco_num, _tco_num ); - return( getTrack()->addTCO( getTrack()->createTCO( _tco_num * 64 ) ) ); -} - - - - -int trackContentWidget::numOfTCOs( void ) -{ - return( m_trackContentObjects.size() ); -} - - - - -trackContentObject * trackContentWidget::addTCO( trackContentObject * _tco ) +void trackContentWidget::addTCOView( trackContentObjectView * _tcov ) { + trackContentObject * tco = _tcov->getTrackContentObject(); QMap map; - map["id"] = _tco->id(); - addJournalEntry( journalEntry( ADD_TCO, map ) ); + map["id"] = tco->id(); + addJournalEntry( journalEntry( AddTrackContentObject, map ) ); - m_trackContentObjects.push_back( _tco ); - _tco->move( 0, 1 ); + m_tcoViews.push_back( _tcov ); - _tco->saveJournallingState( FALSE ); - m_trackWidget->changePosition(); - _tco->restoreJournallingState(); + tco->saveJournallingState( FALSE ); + changePosition(); + tco->restoreJournallingState(); - //engine::getSongEditor()->setModified(); - return( _tco ); // just for convenience } -void trackContentWidget::removeTCO( int _tco_num, bool _also_delete ) +void trackContentWidget::removeTCOView( trackContentObjectView * _tcov ) { - removeTCO( getTCO( _tco_num ), _also_delete ); -} - - - - -void trackContentWidget::removeTCO( trackContentObject * _tco, - bool _also_delete ) -{ - tcoVector::iterator it = qFind( m_trackContentObjects.begin(), - m_trackContentObjects.end(), - _tco ); - if( it != m_trackContentObjects.end() ) + tcoViewVector::iterator it = qFind( m_tcoViews.begin(), + m_tcoViews.end(), + _tcov ); + if( it != m_tcoViews.end() ) { QMap map; - multimediaProject mmp( multimediaProject::JOURNAL_DATA ); - _tco->saveState( mmp, mmp.content() ); - map["id"] = _tco->id(); + multimediaProject mmp( multimediaProject::JournalData ); + _tcov->getTrackContentObject()->saveState( mmp, mmp.content() ); + map["id"] = _tcov->getTrackContentObject()->id(); map["state"] = mmp.toString(); - addJournalEntry( journalEntry( REMOVE_TCO, map ) ); + addJournalEntry( journalEntry( RemoveTrackContentObject, + map ) ); - if( _also_delete ) - { - delete _tco; - } - - m_trackContentObjects.erase( it ); - engine::getSongEditor()->setModified(); - } -} - - - - -void trackContentWidget::removeAllTCOs( void ) -{ - while( !m_trackContentObjects.empty() ) - { - delete m_trackContentObjects.front(); - m_trackContentObjects.erase( m_trackContentObjects.begin() ); - } -} - - - - -void trackContentWidget::swapPositionOfTCOs( int _tco_num1, int _tco_num2 ) -{ - // TODO: range-checking - qSwap( m_trackContentObjects[_tco_num1], - m_trackContentObjects[_tco_num2] ); - - const midiTime pos = m_trackContentObjects[_tco_num1]->startPosition(); - - m_trackContentObjects[_tco_num1]->movePosition( - m_trackContentObjects[_tco_num2]->startPosition() ); - m_trackContentObjects[_tco_num2]->movePosition( pos ); -} - - - - -tact trackContentWidget::length( void ) const -{ - // find last end-position - midiTime last = 0; - for( tcoVector::const_iterator it = m_trackContentObjects.begin(); - it != m_trackContentObjects.end(); ++it ) - { - last = tMax( ( *it )->endPosition(), last ); - } - return( last.getTact() + ( ( last.getTact64th() != 0 )? 1 : 0 ) ); -} - - - - -void trackContentWidget::insertTact( const midiTime & _pos ) -{ - // we'll increase the position of every TCO, posated behind _pos, by - // one tact - for( tcoVector::iterator it = m_trackContentObjects.begin(); - it != m_trackContentObjects.end(); ++it ) - { - if( ( *it )->startPosition() >= _pos ) - { - ( *it )->movePosition( (*it)->startPosition() + 64 ); - } - } -} - - - - -void trackContentWidget::removeTact( const midiTime & _pos ) -{ - // we'll decrease the position of every TCO, posated behind _pos, by - // one tact - for( tcoVector::iterator it = m_trackContentObjects.begin(); - it != m_trackContentObjects.end(); ++it ) - { - if( ( *it )->startPosition() >= _pos ) - { - ( *it )->movePosition( tMax( ( *it )->startPosition() - - 64, 0 ) ); - } + m_tcoViews.erase( it ); + engine::getSong()->setModified(); } } @@ -739,8 +677,8 @@ void trackContentWidget::removeTact( const midiTime & _pos ) void trackContentWidget::update( void ) { - for( tcoVector::iterator it = m_trackContentObjects.begin(); - it != m_trackContentObjects.end(); ++it ) + for( tcoViewVector::iterator it = m_tcoViews.begin(); + it != m_tcoViews.end(); ++it ) { ( *it )->setFixedHeight( height() - 2 ); ( *it )->update(); @@ -751,6 +689,80 @@ void trackContentWidget::update( void ) +// resposible for moving track-content-widgets to appropriate position after +// change of visible viewport +void trackContentWidget::changePosition( const midiTime & _new_pos ) +{ +// const int tcos = numOfTCOs(); + + if( m_trackView->getTrackContainerView() == engine::getBBEditor() ) + { + const int cur_bb = engine::getBBTrackContainer()->currentBB(); + int i = 0; + // first show TCO for current BB... + for( tcoViewVector::iterator it = m_tcoViews.begin(); + it != m_tcoViews.end(); ++it, ++i ) + { + if( i == cur_bb ) + { + ( *it )->move( 0, ( *it )->y() ); + ( *it )->raise(); + ( *it )->show(); + } + else + { + ( *it )->lower(); + } + } + // ...then hide others to avoid flickering + i = 0; + for( tcoViewVector::iterator it = m_tcoViews.begin(); + it != m_tcoViews.end(); ++it, ++i ) + { + if( i != cur_bb ) + { + ( *it )->hide(); + } + } + return; + } + + midiTime pos = _new_pos; + if( pos < 0 ) + { + pos = m_trackView->getTrackContainerView()->currentPosition(); + } + + const Sint32 begin = pos; + const Sint32 end = endPosition( pos ); + const float ppt = m_trackView->getTrackContainerView()->pixelsPerTact(); + + for( tcoViewVector::iterator it = m_tcoViews.begin(); + it != m_tcoViews.end(); ++it ) + { + trackContentObjectView * tcov = *it; + trackContentObject * tco = tcov->getTrackContentObject(); + tco->changeLength( tco->length() ); + Sint32 ts = tco->startPosition(); + Sint32 te = tco->endPosition(); + if( ( ts >= begin && ts <= end ) || + ( te >= begin && te <= end ) || + ( ts <= begin && te >= end ) ) + { + tcov->move( static_cast( ( ts - begin ) * ppt / + 64 ), tcov->y() ); + tcov->show(); + } + else + { + tcov->hide(); + } + } +} + + + + void trackContentWidget::dragEnterEvent( QDragEnterEvent * _dee ) { stringPairDrag::processDragEnterEvent( _dee, "tco_" + @@ -765,12 +777,13 @@ void trackContentWidget::dropEvent( QDropEvent * _de ) QString type = stringPairDrag::decodeKey( _de ); QString value = stringPairDrag::decodeValue( _de ); if( type == ( "tco_" + QString::number( getTrack()->type() ) ) && - getTrack()->getTrackContainer()->fixedTCOs() == FALSE ) + m_trackView->getTrackContainerView()->fixedTCOs() == FALSE ) { const midiTime pos = getPosition( _de->pos().x() ).toNearestTact(); - trackContentObject * tco = addTCO( getTrack()->createTCO( - pos ) ); + trackContentObject * tco = getTrack()->addTCO( + getTrack()->createTCO( pos ) ); + // value contains our XML-data so simply create a // multimediaProject which does the rest for us... multimediaProject mmp( value, FALSE ); @@ -778,6 +791,8 @@ void trackContentWidget::dropEvent( QDropEvent * _de ) // the user doesn't expect... tco->restoreState( mmp.content().firstChild().toElement() ); tco->movePosition( pos ); + + _de->accept(); } } @@ -789,7 +804,7 @@ void trackContentWidget::dropEvent( QDropEvent * _de ) void trackContentWidget::mousePressEvent( QMouseEvent * _me ) { - if( getTrack()->getTrackContainer()->allowRubberband() == TRUE ) + if( m_trackView->getTrackContainerView()->allowRubberband() == TRUE ) { QWidget::mousePressEvent( _me ); } @@ -798,14 +813,16 @@ void trackContentWidget::mousePressEvent( QMouseEvent * _me ) QWidget::mousePressEvent( _me ); } else if( _me->button() == Qt::LeftButton && - getTrack()->getTrackContainer()->fixedTCOs() == FALSE ) + !m_trackView->getTrackContainerView()->fixedTCOs() ) { const midiTime pos = getPosition( _me->x() ).getTact() * 64; - trackContentObject * tco = addTCO( getTrack()->createTCO( - pos ) ); + trackContentObject * tco = getTrack()->addTCO( + getTrack()->createTCO( pos ) ); + tco->saveJournallingState( FALSE ); tco->movePosition( pos ); tco->restoreJournallingState(); + } } @@ -817,15 +834,15 @@ void trackContentWidget::paintEvent( QPaintEvent * _pe ) QPainter p( this ); p.fillRect( rect(), QColor( 96, 96, 96 ) ); - const trackContainer * tc = getTrack()->getTrackContainer(); - if( !tc->fixedTCOs() ) + const trackContainerView * tcv = m_trackView->getTrackContainerView(); + if( !tcv->fixedTCOs() ) { - const int offset = (int)( ( tc->currentPosition() % 4 ) * - tc->pixelsPerTact() ); + const int offset = (int)( ( tcv->currentPosition() % 4 ) * + tcv->pixelsPerTact() ); // draw vertical lines p.setPen( QColor( 128, 128, 128 ) ); for( int x = -offset; x < width(); - x += (int) tc->pixelsPerTact() ) + x += (int) tcv->pixelsPerTact() ) { p.drawLine( x, 0, x, height() ); } @@ -848,7 +865,7 @@ void trackContentWidget::undoStep( journalEntry & _je ) saveJournallingState( FALSE ); switch( _je.actionID() ) { - case ADD_TCO: + case AddTrackContentObject: { QMap map = _je.data().toMap(); trackContentObject * tco = @@ -856,18 +873,18 @@ void trackContentWidget::undoStep( journalEntry & _je ) engine::getProjectJournal()->getJournallingObject( map["id"].toInt() ) ); multimediaProject mmp( - multimediaProject::JOURNAL_DATA ); + multimediaProject::JournalData ); tco->saveState( mmp, mmp.content() ); map["state"] = mmp.toString(); _je.data() = map; - tco->close(); + tco->deleteLater(); break; } - case REMOVE_TCO: + case RemoveTrackContentObject: { - trackContentObject * tco = addTCO( - getTrack()->createTCO( + trackContentObject * tco = + getTrack()->addTCO( getTrack()->createTCO( midiTime( 0 ) ) ); multimediaProject mmp( _je.data().toMap()["state"].toString(), FALSE ); @@ -886,13 +903,17 @@ void trackContentWidget::redoStep( journalEntry & _je ) { switch( _je.actionID() ) { - case ADD_TCO: - case REMOVE_TCO: - _je.actionID() = ( _je.actionID() == ADD_TCO ) ? - REMOVE_TCO : ADD_TCO; + case AddTrackContentObject: + case RemoveTrackContentObject: + _je.actionID() = ( _je.actionID() == + AddTrackContentObject ) ? + RemoveTrackContentObject : + AddTrackContentObject; undoStep( _je ); - _je.actionID() = ( _je.actionID() == ADD_TCO ) ? - REMOVE_TCO : ADD_TCO; + _je.actionID() = ( _je.actionID() == + AddTrackContentObject ) ? + RemoveTrackContentObject : + AddTrackContentObject; break; } } @@ -902,7 +923,7 @@ void trackContentWidget::redoStep( journalEntry & _je ) track * trackContentWidget::getTrack( void ) { - return( m_trackWidget->getTrack() ); + return( m_trackView->getTrack() ); } @@ -910,13 +931,25 @@ track * trackContentWidget::getTrack( void ) midiTime trackContentWidget::getPosition( int _mouse_x ) { - const trackContainer * tc = getTrack()->getTrackContainer(); - return( midiTime( tc->currentPosition() + _mouse_x * 64 / - static_cast( tc->pixelsPerTact() ) ) ); + return( midiTime( m_trackView->getTrackContainerView()-> + currentPosition() + _mouse_x * 64 / + static_cast( m_trackView-> + getTrackContainerView()->pixelsPerTact() ) ) ); } +midiTime trackContentWidget::endPosition( const midiTime & _pos_start ) +{ + const float ppt = m_trackView->getTrackContainerView()->pixelsPerTact(); + const int w = width(); + return( _pos_start + static_cast( w * 64 / ppt ) ); +} + + + + + // =========================================================================== // trackOperationsWidget @@ -930,9 +963,9 @@ QPixmap * trackOperationsWidget::s_muteOnDisabled; QPixmap * trackOperationsWidget::s_muteOnEnabled; -trackOperationsWidget::trackOperationsWidget( trackWidget * _parent ) : +trackOperationsWidget::trackOperationsWidget( trackView * _parent ) : QWidget( _parent ), - m_trackWidget( _parent ), + m_trackView( _parent ), m_automationDisabled( FALSE ) { if( s_grip == NULL ) @@ -967,7 +1000,7 @@ trackOperationsWidget::trackOperationsWidget( trackWidget * _parent ) : m_muteBtn = new pixmapButton( this, tr( "Mute" ) ); - m_muteBtn->model()->setTrack( m_trackWidget->getTrack() ); + m_muteBtn->model()->setTrack( m_trackView->getTrack() ); m_muteBtn->setActiveGraphic( *s_muteOnEnabled ); m_muteBtn->setInactiveGraphic( *s_muteOffEnabled ); m_muteBtn->setCheckable( TRUE ); @@ -1019,14 +1052,14 @@ void trackOperationsWidget::mousePressEvent( QMouseEvent * _me ) { if( _me->button() == Qt::LeftButton && engine::getMainWindow()->isCtrlPressed() == TRUE && - m_trackWidget->getTrack()->type() != track::BB_TRACK ) + m_trackView->getTrack()->type() != track::BBTrack ) { - multimediaProject mmp( multimediaProject::DRAG_N_DROP_DATA ); - m_trackWidget->getTrack()->saveState( mmp, mmp.content() ); + multimediaProject mmp( multimediaProject::DragNDropData ); + m_trackView->getTrack()->saveState( mmp, mmp.content() ); new stringPairDrag( QString( "track_%1" ).arg( - m_trackWidget->getTrack()->type() ), + m_trackView->getTrack()->type() ), mmp.toString(), QPixmap::grabWidget( - &m_trackWidget->getTrackSettingsWidget() ), + m_trackView->getTrackSettingsWidget() ), this ); } else if( _me->button() == Qt::LeftButton ) @@ -1044,14 +1077,14 @@ void trackOperationsWidget::paintEvent( QPaintEvent * _pe ) { QPainter p( this ); p.fillRect( rect(), QColor( 128, 128, 128 ) ); - if( m_trackWidget->isMovingTrack() == FALSE ) + if( m_trackView->isMovingTrack() == FALSE ) { p.drawPixmap( 2, 2, *s_grip ); if( inBBEditor() ) { bbTrack * bb_track = currentBBTrack(); if( !bb_track || bb_track->automationDisabled( - m_trackWidget->getTrack() ) ) + m_trackView->getTrack() ) ) { if( !m_automationDisabled ) { @@ -1094,7 +1127,7 @@ void trackOperationsWidget::paintEvent( QPaintEvent * _pe ) void trackOperationsWidget::cloneTrack( void ) { engine::getMixer()->lock(); - m_trackWidget->getTrack()->clone(); + m_trackView->getTrack()->clone(); engine::getMixer()->unlock(); } @@ -1103,10 +1136,11 @@ void trackOperationsWidget::cloneTrack( void ) void trackOperationsWidget::removeTrack( void ) { + m_trackView->close(); engine::getMixer()->lock(); - m_trackWidget->getTrack()->getTrackContainer()->removeTrack( - m_trackWidget->getTrack() ); + delete m_trackView->getTrack(); engine::getMixer()->unlock(); + m_trackView->deleteLater(); } @@ -1115,7 +1149,7 @@ void trackOperationsWidget::removeTrack( void ) void trackOperationsWidget::setMuted( bool _muted ) { m_muteBtn->setChecked( _muted ); - m_trackWidget->getTrackContentWidget().update(); + m_trackView->getTrackContentWidget()->update(); } @@ -1125,7 +1159,7 @@ void trackOperationsWidget::muteBtnRightClicked( void ) { const bool m = muted(); // next function might modify our mute-state, // so save it now - m_trackWidget->getTrack()->getTrackContainer()-> + m_trackView->getTrack()->getTrackContainer()-> setMutedOfAllTracks( m ); setMuted( !m ); } @@ -1143,7 +1177,7 @@ void trackOperationsWidget::updateMenu( void ) if( bb_track ) { if( bb_track->automationDisabled( - m_trackWidget->getTrack() ) ) + m_trackView->getTrack() ) ) { to_menu->addAction( embed::getIconPixmap( "led_off", 16, 16 ), @@ -1172,7 +1206,7 @@ void trackOperationsWidget::updateMenu( void ) void trackOperationsWidget::enableAutomation( void ) { - currentBBTrack()->enableAutomation( m_trackWidget->getTrack() ); + currentBBTrack()->enableAutomation( m_trackView->getTrack() ); } @@ -1180,7 +1214,7 @@ void trackOperationsWidget::enableAutomation( void ) void trackOperationsWidget::disableAutomation( void ) { - currentBBTrack()->disableAutomation( m_trackWidget->getTrack() ); + currentBBTrack()->disableAutomation( m_trackView->getTrack() ); } @@ -1188,7 +1222,8 @@ void trackOperationsWidget::disableAutomation( void ) bbTrack * trackOperationsWidget::currentBBTrack( void ) { - return( bbTrack::findBBTrack( engine::getBBEditor()->currentBB() ) ); + return( bbTrack::findBBTrack( + engine::getBBTrackContainer()->currentBB() ) ); } @@ -1196,7 +1231,7 @@ bbTrack * trackOperationsWidget::currentBBTrack( void ) bool trackOperationsWidget::inBBEditor( void ) { - return( m_trackWidget->getTrack()->getTrackContainer() + return( m_trackView->getTrackContainerView() == engine::getBBEditor() ); } @@ -1205,330 +1240,21 @@ bool trackOperationsWidget::inBBEditor( void ) -// =========================================================================== -// trackWidget -// =========================================================================== - -trackWidget::trackWidget( track * _track, QWidget * _parent ) : - QWidget( _parent ), - m_track( _track ), - m_trackOperationsWidget( this ), - m_trackSettingsWidget( this ), - m_trackContentWidget( this ), - m_action( NONE ) -{ - m_trackOperationsWidget.setAutoFillBackground( TRUE ); - QPalette pal; - pal.setColor( m_trackOperationsWidget.backgroundRole(), - QColor( 128, 128, 128 ) ); - m_trackOperationsWidget.setPalette( pal ); - - - m_trackSettingsWidget.setAutoFillBackground( TRUE ); - pal.setColor( m_trackSettingsWidget.backgroundRole(), - QColor( 64, 64, 64 ) ); - m_trackSettingsWidget.setPalette( pal ); - - QHBoxLayout * layout = new QHBoxLayout( this ); - layout->setMargin( 0 ); - layout->setSpacing( 0 ); - layout->addWidget( &m_trackOperationsWidget ); - layout->addWidget( &m_trackSettingsWidget ); - layout->addWidget( &m_trackContentWidget, 1 ); - - resizeEvent( NULL ); - - setAcceptDrops( TRUE ); -} - - - - -trackWidget::~trackWidget() -{ -} - - - - -void trackWidget::resizeEvent( QResizeEvent * _re ) -{ - m_trackOperationsWidget.setFixedSize( TRACK_OP_WIDTH, height() - 1 ); - m_trackSettingsWidget.setFixedSize( DEFAULT_SETTINGS_WIDGET_WIDTH, - height() - 1 ); - m_trackContentWidget.setFixedHeight( height() - 1 ); -} - - - - -void trackWidget::update( void ) -{ - m_trackContentWidget.update(); - if( !m_track->getTrackContainer()->fixedTCOs() ) - { - changePosition(); - } - QWidget::update(); -} - - - - -// resposible for moving track-content-widgets to appropriate position after -// change of visible viewport -void trackWidget::changePosition( const midiTime & _new_pos ) -{ - const int tcos = m_trackContentWidget.numOfTCOs(); - - if( m_track->getTrackContainer() == engine::getBBEditor() ) - { - const int showTco = engine::getBBEditor()->currentBB(); - for( int i = 0; i < tcos; ++i ) - { - trackContentObject * tco = m_trackContentWidget.getTCO( - i ); - if( i == showTco ) - { - tco->move( 0, tco->y() ); - tco->show(); - } - else - { - tco->hide(); - } - } - return; - } - - midiTime pos = _new_pos; - if( pos < 0 ) - { - pos = m_track->getTrackContainer()->currentPosition(); - } - - const Sint32 begin = pos; - const Sint32 end = endPosition( pos ); - const float ppt = m_track->getTrackContainer()->pixelsPerTact(); - - for( int i = 0; i < tcos; ++i ) - { - trackContentObject * tco = m_trackContentWidget.getTCO( i ); - tco->changeLength( tco->length() ); - Sint32 ts = tco->startPosition(); - Sint32 te = tco->endPosition(); - if( ( ts >= begin && ts <= end ) || - ( te >= begin && te <= end ) || - ( ts <= begin && te >= end ) ) - { - tco->move( static_cast( ( ts - begin ) * ppt / - 64 ), tco->y() ); - tco->show(); - } - else - { - tco->hide(); - } - } -} - - - - -void trackWidget::undoStep( journalEntry & _je ) -{ - saveJournallingState( FALSE ); - switch( _je.actionID() ) - { - case MOVE_TRACK: - { - trackContainer * tc = m_track->getTrackContainer(); - if( _je.data().toInt() > 0 ) - { - tc->moveTrackUp( m_track ); - } - else - { - tc->moveTrackDown( m_track ); - } - break; - } - case RESIZE_TRACK: - setFixedHeight( tMax( height() + - _je.data().toInt(), - MINIMAL_TRACK_HEIGHT ) ); - m_track->getTrackContainer()->realignTracks(); - break; - } - restoreJournallingState(); -} - - - - -void trackWidget::redoStep( journalEntry & _je ) -{ - journalEntry je( _je.actionID(), -_je.data().toInt() ); - undoStep( je ); -} - - - - -void trackWidget::dragEnterEvent( QDragEnterEvent * _dee ) -{ - stringPairDrag::processDragEnterEvent( _dee, "track_" + - QString::number( m_track->type() ) ); -} - - - - -void trackWidget::dropEvent( QDropEvent * _de ) -{ - QString type = stringPairDrag::decodeKey( _de ); - QString value = stringPairDrag::decodeValue( _de ); - if( type == ( "track_" + QString::number( m_track->type() ) ) ) - { - // value contains our XML-data so simply create a - // multimediaProject which does the rest for us... - multimediaProject mmp( value, FALSE ); - engine::getMixer()->lock(); - m_track->restoreState( mmp.content().firstChild().toElement() ); - engine::getMixer()->unlock(); - _de->accept(); - } -} - - - - -void trackWidget::mousePressEvent( QMouseEvent * _me ) -{ - if( m_track->getTrackContainer()->allowRubberband() == TRUE ) - { - QWidget::mousePressEvent( _me ); - } - else if( _me->button() == Qt::LeftButton ) - { - if( engine::getMainWindow()->isShiftPressed() == TRUE ) - { - m_action = RESIZE_TRACK; - QCursor::setPos( mapToGlobal( QPoint( _me->x(), - height() ) ) ); - QCursor c( Qt::SizeVerCursor); - QApplication::setOverrideCursor( c ); - } - else - { - m_action = MOVE_TRACK; - - QCursor c( Qt::SizeAllCursor ); - QApplication::setOverrideCursor( c ); - // update because in move-mode, all elements in - // track-op-widgets are hidden as a visual feedback - m_trackOperationsWidget.update(); - } - - _me->accept(); - } - else - { - QWidget::mousePressEvent( _me ); - } -} - - - - -void trackWidget::mouseMoveEvent( QMouseEvent * _me ) -{ - if( m_track->getTrackContainer()->allowRubberband() == TRUE ) - { - QWidget::mouseMoveEvent( _me ); - } - else if( m_action == MOVE_TRACK ) - { - trackContainer * tc = m_track->getTrackContainer(); - // look which track-widget the mouse-cursor is over - const trackWidget * track_at_y = tc->trackWidgetAt( - mapTo( tc->contentWidget(), _me->pos() ).y() ); - // a track-widget not equal to ourself? - if( track_at_y != NULL && track_at_y != this ) - { - // then move us up/down there! - if( _me->y() < 0 ) - { - tc->moveTrackUp( m_track ); - } - else - { - tc->moveTrackDown( m_track ); - } - addJournalEntry( journalEntry( MOVE_TRACK, _me->y() ) ); - } - } - else if( m_action == RESIZE_TRACK ) - { - setFixedHeight( tMax( _me->y(), MINIMAL_TRACK_HEIGHT ) ); - m_track->getTrackContainer()->realignTracks(); - } -} - - - - -void trackWidget::mouseReleaseEvent( QMouseEvent * _me ) -{ - m_action = NONE; - while( QApplication::overrideCursor() != NULL ) - { - QApplication::restoreOverrideCursor(); - } - m_trackOperationsWidget.update(); - - QWidget::mouseReleaseEvent( _me ); -} - - - - -void trackWidget::paintEvent( QPaintEvent * _pe ) -{ - QStyleOption opt; - opt.initFrom( this ); - QPainter p( this ); - style()->drawPrimitive( QStyle::PE_Widget, &opt, &p, this ); -} - - - - -midiTime trackWidget::endPosition( const midiTime & _pos_start ) -{ - const float ppt = m_track->getTrackContainer()->pixelsPerTact(); - const int cww = m_trackContentWidget.width(); - return( _pos_start + static_cast( cww * 64 / ppt ) ); -} - - - - - - // =========================================================================== // track // =========================================================================== -track::track( trackContainer * _tc, bool _create_widget ) : +track::track( TrackTypes _type, trackContainer * _tc ) : + model( _tc ), m_trackContainer( _tc ), - m_trackWidget( NULL ) + m_type( _type ), + m_name(), + m_pixmap( NULL ), + m_mutedModel( FALSE, this ), + m_trackContentObjects(), + m_automationPatterns() { - if( _create_widget ) - { - m_trackWidget = new trackWidget( this, m_trackContainer ); - m_trackContainer->addTrack( this ); - } + m_trackContainer->addTrack( this ); } @@ -1536,13 +1262,13 @@ track::track( trackContainer * _tc, bool _create_widget ) : track::~track() { - if( m_trackContainer == engine::getBBEditor() - && engine::getSongEditor() ) + if( m_trackContainer == engine::getBBTrackContainer() + && engine::getSong() ) { - QList tracks = engine::getSongEditor()->tracks(); + QList tracks = engine::getSong()->tracks(); for( int i = 0; i < tracks.size(); ++i ) { - if( tracks[i]->type() == BB_TRACK ) + if( tracks[i]->type() == BBTrack ) { bbTrack * bb_track = (bbTrack *)tracks[i]; if( bb_track->automationDisabled( this ) ) @@ -1554,18 +1280,16 @@ track::~track() } } - if( m_trackWidget != NULL ) + while( !m_trackContentObjects.isEmpty() ) { - m_trackContainer->removeTrack( this ); - - m_trackWidget->hide(); - m_trackWidget->deleteLater(); - m_trackWidget = NULL; + delete m_trackContentObjects.last(); } + m_trackContainer->removeTrack( this ); + for( QList::iterator it = - m_automation_patterns.begin(); - it != m_automation_patterns.end(); + m_automationPatterns.begin(); + it != m_automationPatterns.end(); ++it ) { ( *it )->forgetTrack(); @@ -1575,18 +1299,18 @@ track::~track() -track * track::create( trackTypes _tt, trackContainer * _tc ) +track * track::create( TrackTypes _tt, trackContainer * _tc ) { track * t = NULL; switch( _tt ) { - case INSTRUMENT_TRACK: t = new instrumentTrack( _tc ); break; - case BB_TRACK: t = new bbTrack( _tc ); break; - case SAMPLE_TRACK: t = new sampleTrack( _tc ); break; + case InstrumentTrack: t = new instrumentTrack( _tc ); break; + case BBTrack: t = new bbTrack( _tc ); break; +// case SampleTrack: t = new sampleTrack( _tc ); break; // case EVENT_TRACK: // case VIDEO_TRACK: - case AUTOMATION_TRACK: t = new automationTrack( _tc ); break; + case AutomationTrack: t = new automationTrack( _tc ); break; default: break; } @@ -1598,10 +1322,16 @@ track * track::create( trackTypes _tt, trackContainer * _tc ) -void track::create( const QDomElement & _this, trackContainer * _tc ) +track * track::create( const QDomElement & _this, trackContainer * _tc ) { - create( static_cast( _this.attribute( "type" ).toInt() ), - _tc )->restoreState( _this ); + track * t = create( + static_cast( _this.attribute( "type" ).toInt() ), + _tc ); + if( t != NULL ) + { + t->restoreState( _this ); + } + return( t ); } @@ -1618,22 +1348,15 @@ void track::clone( void ) -tact track::length( void ) const -{ - return( getTrackContentWidget()->length() ); -} - - void track::saveSettings( QDomDocument & _doc, QDomElement & _this ) { - int num_of_tcos = getTrackContentWidget()->numOfTCOs(); - _this.setTagName( "track" ); _this.setAttribute( "type", type() ); _this.setAttribute( "muted", muted() ); - _this.setAttribute( "height", m_trackWidget->height() ); +// ### TODO +// _this.setAttribute( "height", m_trackView->height() ); QDomElement ts_de = _doc.createElement( nodeName() ); // let actual track (instrumentTrack, bbTrack, sampleTrack etc.) save @@ -1642,10 +1365,10 @@ void track::saveSettings( QDomDocument & _doc, QDomElement & _this ) saveTrackSpecificSettings( _doc, ts_de ); // now save settings of all TCO's - for( int i = 0; i < num_of_tcos; ++i ) + for( tcoVector::const_iterator it = m_trackContentObjects.begin(); + it != m_trackContentObjects.end(); ++it ) { - trackContentObject * tco = getTCO( i ); - tco->saveState( _doc, _this ); + ( *it )->saveState( _doc, _this ); } } @@ -1662,8 +1385,11 @@ void track::loadSettings( const QDomElement & _this ) setMuted( _this.attribute( "muted" ).toInt() ); - - getTrackContentWidget()->removeAllTCOs(); + while( !m_trackContentObjects.empty() ) + { + delete m_trackContentObjects.front(); + m_trackContentObjects.erase( m_trackContentObjects.begin() ); + } QDomNode node = _this.firstChild(); while( !node.isNull() ) @@ -1680,21 +1406,19 @@ void track::loadSettings( const QDomElement & _this ) trackContentObject * tco = createTCO( midiTime( 0 ) ); tco->restoreState( node.toElement() ); - getTrackContentWidget()->saveJournallingState( - FALSE ); + saveJournallingState( FALSE ); addTCO( tco ); - getTrackContentWidget()-> - restoreJournallingState(); + restoreJournallingState(); } } node = node.nextSibling(); } - +/* if( _this.attribute( "height" ).toInt() >= MINIMAL_TRACK_HEIGHT ) { - m_trackWidget->setFixedHeight( + m_trackView->setFixedHeight( _this.attribute( "height" ).toInt() ); - } + }*/ } @@ -1702,15 +1426,28 @@ void track::loadSettings( const QDomElement & _this ) trackContentObject * track::addTCO( trackContentObject * _tco ) { - return( getTrackContentWidget()->addTCO( _tco ) ); + m_trackContentObjects.push_back( _tco ); + +// emit dataChanged(); + emit trackContentObjectAdded( _tco ); + + //engine::getSongEditor()->setModified(); + return( _tco ); // just for convenience } -void track::removeTCO( int _tco_num ) +void track::removeTCO( trackContentObject * _tco ) { - getTrackContentWidget()->removeTCO( _tco_num ); + tcoVector::iterator it = qFind( m_trackContentObjects.begin(), + m_trackContentObjects.end(), + _tco ); + if( it != m_trackContentObjects.end() ) + { + m_trackContentObjects.erase( it ); + engine::getSong()->setModified(); + } } @@ -1718,7 +1455,7 @@ void track::removeTCO( int _tco_num ) int track::numOfTCOs( void ) { - return( getTrackContentWidget()->numOfTCOs() ); + return( m_trackContentObjects.size() ); } @@ -1726,7 +1463,13 @@ int track::numOfTCOs( void ) trackContentObject * track::getTCO( int _tco_num ) { - return( getTrackContentWidget()->getTCO( _tco_num ) ); + if( _tco_num < m_trackContentObjects.size() ) + { + return( m_trackContentObjects[_tco_num] ); + } + printf( "called track::getTCO( %d ), " + "but TCO %d doesn't exist\n", _tco_num, _tco_num ); + return( addTCO( createTCO( _tco_num * 64 ) ) ); } @@ -1735,12 +1478,17 @@ trackContentObject * track::getTCO( int _tco_num ) int track::getTCONum( trackContentObject * _tco ) { - for( int i = 0; i < getTrackContentWidget()->numOfTCOs(); ++i ) +// for( int i = 0; i < getTrackContentWidget()->numOfTCOs(); ++i ) + tcoVector::iterator it = qFind( m_trackContentObjects.begin(), + m_trackContentObjects.end(), + _tco ); + if( it != m_trackContentObjects.end() ) { - if( getTCO( i ) == _tco ) +/* if( getTCO( i ) == _tco ) { return( i ); - } + }*/ + return( it - m_trackContentObjects.begin() ); } qWarning( "track::getTCONum(...) -> _tco not found!\n" ); return( 0 ); @@ -1753,9 +1501,10 @@ void track::getTCOsInRange( QList & _tco_v, const midiTime & _start, const midiTime & _end ) { - for( int i = 0; i < getTrackContentWidget()->numOfTCOs(); ++i ) + for( tcoVector::iterator it_o = m_trackContentObjects.begin(); + it_o != m_trackContentObjects.end(); ++it_o ) { - trackContentObject * tco = getTCO( i ); + trackContentObject * tco = ( *it_o );//getTCO( i ); Sint32 s = tco->startPosition(); Sint32 e = tco->endPosition(); if( ( s <= _end ) && ( e >= _start ) ) @@ -1789,15 +1538,72 @@ void track::getTCOsInRange( QList & _tco_v, void track::swapPositionOfTCOs( int _tco_num1, int _tco_num2 ) { - getTrackContentWidget()->swapPositionOfTCOs( _tco_num1, _tco_num2 ); + // TODO: range-checking + qSwap( m_trackContentObjects[_tco_num1], + m_trackContentObjects[_tco_num2] ); + + const midiTime pos = m_trackContentObjects[_tco_num1]->startPosition(); + + m_trackContentObjects[_tco_num1]->movePosition( + m_trackContentObjects[_tco_num2]->startPosition() ); + m_trackContentObjects[_tco_num2]->movePosition( pos ); } +void track::insertTact( const midiTime & _pos ) +{ + // we'll increase the position of every TCO, posated behind _pos, by + // one tact + for( tcoVector::iterator it = m_trackContentObjects.begin(); + it != m_trackContentObjects.end(); ++it ) + { + if( ( *it )->startPosition() >= _pos ) + { + ( *it )->movePosition( (*it)->startPosition() + 64 ); + } + } +} + + + + +void track::removeTact( const midiTime & _pos ) +{ + // we'll decrease the position of every TCO, posated behind _pos, by + // one tact + for( tcoVector::iterator it = m_trackContentObjects.begin(); + it != m_trackContentObjects.end(); ++it ) + { + if( ( *it )->startPosition() >= _pos ) + { + ( *it )->movePosition( tMax( ( *it )->startPosition() - + 64, 0 ) ); + } + } +} + + + + +tact track::length( void ) const +{ + // find last end-position + midiTime last = 0; + for( tcoVector::const_iterator it = m_trackContentObjects.begin(); + it != m_trackContentObjects.end(); ++it ) + { + last = tMax( ( *it )->endPosition(), last ); + } + return( last.getTact() + ( ( last.getTact64th() != 0 ) ? 1 : 0 ) ); +} + + + void track::addAutomationPattern( automationPattern * _pattern ) { - m_automation_patterns.append( _pattern ); + m_automationPatterns.append( _pattern ); } @@ -1805,7 +1611,7 @@ void track::addAutomationPattern( automationPattern * _pattern ) void track::removeAutomationPattern( automationPattern * _pattern ) { - m_automation_patterns.removeAll( _pattern ); + m_automationPatterns.removeAll( _pattern ); } @@ -1814,8 +1620,8 @@ void track::removeAutomationPattern( automationPattern * _pattern ) void track::sendMidiTime( const midiTime & _time ) { for( QList::iterator it = - m_automation_patterns.begin(); - it != m_automation_patterns.end(); + m_automationPatterns.begin(); + it != m_automationPatterns.end(); ++it ) { ( *it )->processMidiTime( _time ); @@ -1825,6 +1631,294 @@ void track::sendMidiTime( const midiTime & _time ) + + +// =========================================================================== +// trackView +// =========================================================================== + +trackView::trackView( track * _track, trackContainerView * _tcv ) : + QWidget( _tcv->contentWidget() ), + modelView( NULL/*_track*/ ), + m_track( _track ), + m_trackContainerView( _tcv ), + m_trackOperationsWidget( this ), + m_trackSettingsWidget( this ), + m_trackContentWidget( this ), + m_action( NoAction ) +{ + m_trackOperationsWidget.setAutoFillBackground( TRUE ); + QPalette pal; + pal.setColor( m_trackOperationsWidget.backgroundRole(), + QColor( 128, 128, 128 ) ); + m_trackOperationsWidget.setPalette( pal ); + + + m_trackSettingsWidget.setAutoFillBackground( TRUE ); + pal.setColor( m_trackSettingsWidget.backgroundRole(), + QColor( 64, 64, 64 ) ); + m_trackSettingsWidget.setPalette( pal ); + + QHBoxLayout * layout = new QHBoxLayout( this ); + layout->setMargin( 0 ); + layout->setSpacing( 0 ); + layout->addWidget( &m_trackOperationsWidget ); + layout->addWidget( &m_trackSettingsWidget ); + layout->addWidget( &m_trackContentWidget, 1 ); + + resizeEvent( NULL ); + + setAcceptDrops( TRUE ); + setAttribute( Qt::WA_DeleteOnClose ); + + + connect( m_track, SIGNAL( destroyed( QObject * ) ), + this, SLOT( close() ), Qt::QueuedConnection ); + connect( m_track, + SIGNAL( trackContentObjectAdded( trackContentObject * ) ), + this, SLOT( createTCOView( trackContentObject * ) ), + Qt::QueuedConnection ); + + // create views for already existing TCOs + for( track::tcoVector::iterator it = + m_track->m_trackContentObjects.begin(); + it != m_track->m_trackContentObjects.end(); ++it ) + { + createTCOView( *it ); + } +// setModel( m_track ); + + m_trackContainerView->addTrackView( this ); +} + + + + +trackView::~trackView() +{ +} + + + + +void trackView::resizeEvent( QResizeEvent * _re ) +{ + m_trackOperationsWidget.setFixedSize( TRACK_OP_WIDTH, height() - 1 ); + m_trackSettingsWidget.setFixedSize( DEFAULT_SETTINGS_WIDGET_WIDTH, + height() - 1 ); + m_trackContentWidget.setFixedHeight( height() - 1 ); +} + + + + +void trackView::update( void ) +{ + m_trackContentWidget.update(); + if( !m_trackContainerView->fixedTCOs() ) + { + m_trackContentWidget.changePosition(); + } + QWidget::update(); +} + + + + +bool trackView::close( void ) +{ + m_trackContainerView->removeTrackView( this ); + QWidget::close(); +} + + + + +void trackView::modelChanged( void ) +{ + m_track = castModel(); + assert( m_track != NULL ); + connect( m_track, SIGNAL( destroyed( QObject * ) ), + this, SLOT( close() ), Qt::QueuedConnection ); + modelView::modelChanged(); +} + + + + +void trackView::undoStep( journalEntry & _je ) +{ + saveJournallingState( FALSE ); + switch( _je.actionID() ) + { + case MoveTrack: + if( _je.data().toInt() > 0 ) + { + m_trackContainerView->moveTrackViewUp( this ); + } + else + { + m_trackContainerView->moveTrackViewDown( this ); + } + break; + case ResizeTrack: + setFixedHeight( tMax( height() + + _je.data().toInt(), + MINIMAL_TRACK_HEIGHT ) ); + m_trackContainerView->realignTracks(); + break; + } + restoreJournallingState(); +} + + + + +void trackView::redoStep( journalEntry & _je ) +{ + journalEntry je( _je.actionID(), -_je.data().toInt() ); + undoStep( je ); +} + + + + +void trackView::dragEnterEvent( QDragEnterEvent * _dee ) +{ + stringPairDrag::processDragEnterEvent( _dee, "track_" + + QString::number( m_track->type() ) ); +} + + + + +void trackView::dropEvent( QDropEvent * _de ) +{ + QString type = stringPairDrag::decodeKey( _de ); + QString value = stringPairDrag::decodeValue( _de ); + if( type == ( "track_" + QString::number( m_track->type() ) ) ) + { + // value contains our XML-data so simply create a + // multimediaProject which does the rest for us... + multimediaProject mmp( value, FALSE ); + engine::getMixer()->lock(); + m_track->restoreState( mmp.content().firstChild().toElement() ); + engine::getMixer()->unlock(); + _de->accept(); + } +} + + + + +void trackView::mousePressEvent( QMouseEvent * _me ) +{ + if( m_trackContainerView->allowRubberband() == TRUE ) + { + QWidget::mousePressEvent( _me ); + } + else if( _me->button() == Qt::LeftButton ) + { + if( engine::getMainWindow()->isShiftPressed() == TRUE ) + { + m_action = ResizeTrack; + QCursor::setPos( mapToGlobal( QPoint( _me->x(), + height() ) ) ); + QCursor c( Qt::SizeVerCursor); + QApplication::setOverrideCursor( c ); + } + else + { + m_action = MoveTrack; + + QCursor c( Qt::SizeAllCursor ); + QApplication::setOverrideCursor( c ); + // update because in move-mode, all elements in + // track-op-widgets are hidden as a visual feedback + m_trackOperationsWidget.update(); + } + + _me->accept(); + } + else + { + QWidget::mousePressEvent( _me ); + } +} + + + + +void trackView::mouseMoveEvent( QMouseEvent * _me ) +{ + if( m_trackContainerView->allowRubberband() == TRUE ) + { + QWidget::mouseMoveEvent( _me ); + } + else if( m_action == MoveTrack ) + { + // look which track-widget the mouse-cursor is over + const trackView * track_at_y = + m_trackContainerView->trackViewAt( + mapTo( m_trackContainerView->contentWidget(), + _me->pos() ).y() ); + // a track-widget not equal to ourself? + if( track_at_y != NULL && track_at_y != this ) + { + // then move us up/down there! + if( _me->y() < 0 ) + { + m_trackContainerView->moveTrackViewUp( this ); + } + else + { + m_trackContainerView->moveTrackViewDown( this ); + } + addJournalEntry( journalEntry( MoveTrack, _me->y() ) ); + } + } + else if( m_action == ResizeTrack ) + { + setFixedHeight( tMax( _me->y(), MINIMAL_TRACK_HEIGHT ) ); + m_trackContainerView->realignTracks(); + } +} + + + + +void trackView::mouseReleaseEvent( QMouseEvent * _me ) +{ + m_action = NoAction; + while( QApplication::overrideCursor() != NULL ) + { + QApplication::restoreOverrideCursor(); + } + m_trackOperationsWidget.update(); + + QWidget::mouseReleaseEvent( _me ); +} + + + + +void trackView::paintEvent( QPaintEvent * _pe ) +{ + QStyleOption opt; + opt.initFrom( this ); + QPainter p( this ); + style()->drawPrimitive( QStyle::PE_Widget, &opt, &p, this ); +} + + + + +void trackView::createTCOView( trackContentObject * _tco ) +{ + _tco->createView( this ); +} + + #include "track.moc" diff --git a/src/core/track_container.cpp b/src/core/track_container.cpp index e55177f8f..6eb7a140e 100644 --- a/src/core/track_container.cpp +++ b/src/core/track_container.cpp @@ -4,7 +4,7 @@ * track_container.cpp - implementation of base-class for all track-containers * like Song-Editor, BB-Editor... * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -50,35 +50,16 @@ #include "mmp.h" #include "project_journal.h" #include "rubberband.h" -#include "song_editor.h" +#include "song.h" #include "string_pair_drag.h" #include "track.h" trackContainer::trackContainer( void ) : - m_currentPosition( 0, 0 ), - m_scrollArea( new scrollArea( this ) ), - m_ppt( DEFAULT_PIXELS_PER_TACT ), - m_rubberBand( new rubberBand( m_scrollArea ) ), - m_origin() + model( NULL ), + journallingObject(), + m_tracks() { - QVBoxLayout * layout = new QVBoxLayout( this ); - layout->setMargin( 0 ); - layout->setSpacing( 0 ); - layout->addWidget( m_scrollArea ); - - QWidget * scrollContent = new QWidget; - m_scrollLayout = new QVBoxLayout( scrollContent ); - m_scrollLayout->setMargin( 0 ); - m_scrollLayout->setSpacing( 0 ); - m_scrollLayout->setSizeConstraint( QLayout::SetMinimumSize ); - - m_scrollArea->setWidget( scrollContent ); - - m_scrollArea->show(); - m_rubberBand->hide(); - - setAcceptDrops( TRUE ); } @@ -99,7 +80,8 @@ void trackContainer::saveSettings( QDomDocument & _doc, QDomElement & _this ) { _this.setTagName( classNodeName() ); _this.setAttribute( "type", nodeName() ); - mainWindow::saveWidgetState( this, _this ); +// ### TODO + //mainWindow::saveWidgetState( this, _this ); // save settings of each track for( int i = 0; i < m_tracks.size(); ++i ) @@ -150,9 +132,9 @@ void trackContainer::loadSettings( const QDomElement & _this ) node = node.nextSibling(); } - mainWindow::restoreWidgetState( this, _this ); +// ### TODO +// mainWindow::restoreWidgetState( this, _this ); - realignTracks(); pd->setValue( start_val + _this.childNodes().count() ); @@ -168,16 +150,11 @@ void trackContainer::loadSettings( const QDomElement & _this ) void trackContainer::addTrack( track * _track ) { - QMap map; - map["id"] = _track->id(); - addJournalEntry( journalEntry( ADD_TRACK, map ) ); - - m_tracks.push_back( _track ); - m_scrollLayout->addWidget( _track->getTrackWidget() ); - connect( this, SIGNAL( positionChanged( const midiTime & ) ), - _track->getTrackWidget(), - SLOT( changePosition( const midiTime & ) ) ); - realignTracks(); + if( _track->type() != track::AutomationTrack ) + { + m_tracks.push_back( _track ); + emit trackAdded( _track ); + } } @@ -188,24 +165,11 @@ void trackContainer::removeTrack( track * _track ) int index = m_tracks.indexOf( _track ); if( index != -1 ) { - QMap map; - multimediaProject mmp( multimediaProject::JOURNAL_DATA ); - _track->saveState( mmp, mmp.content() ); - map["id"] = _track->id(); - map["state"] = mmp.toString(); - addJournalEntry( journalEntry( REMOVE_TRACK, map ) ); - m_tracks.removeAt( index ); - disconnect( _track->getTrackWidget() ); - m_scrollLayout->removeWidget( _track->getTrackWidget() ); - - delete _track; - - realignTracks(); - if( engine::getSongEditor() ) + if( engine::getSong() ) { - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } } } @@ -213,45 +177,6 @@ void trackContainer::removeTrack( track * _track ) -void trackContainer::moveTrackUp( track * _track ) -{ - for( int i = 1; i < m_tracks.size(); ++i ) - { - if( m_tracks[i] == _track ) - { - bbTrack::swapBBTracks( m_tracks[i], m_tracks[i - 1] ); - QWidget * tw = m_tracks[i]->getTrackWidget(); - m_scrollLayout->removeWidget( tw ); - m_scrollLayout->insertWidget( i - 1, tw ); - m_tracks.swap( i - 1, i ); - realignTracks(); - break; - } - } -} - - - - -void trackContainer::moveTrackDown( track * _track ) -{ - for( int i = 0; i < m_tracks.size() - 1; ++i ) - { - if( m_tracks[i] == _track ) - { - bbTrack::swapBBTracks( m_tracks[i], m_tracks[i + 1] ); - QWidget * tw = m_tracks[i]->getTrackWidget(); - m_scrollLayout->removeWidget( tw ); - m_scrollLayout->insertWidget( i + 1, tw ); - m_tracks.swap( i, i + 1 ); - realignTracks(); - break; - } - } -} - - - void trackContainer::updateAfterTrackAdd( void ) { @@ -260,69 +185,24 @@ void trackContainer::updateAfterTrackAdd( void ) -void trackContainer::realignTracks( void ) -{ - QWidget * content = m_scrollArea->widget(); - content->setFixedWidth( width() - - m_scrollArea->verticalScrollBar()->width() ); - content->setFixedHeight( content->minimumSizeHint().height() ); - - for( int i = 0; i < m_tracks.size(); ++i ) - { - trackWidget * tw = m_tracks[i]->getTrackWidget(); - tw->show(); - tw->update(); - } -} - - - void trackContainer::clearAllTracks( void ) { while( !m_tracks.empty() ) { - removeTrack( m_tracks.last() ); + delete m_tracks.takeLast(); } } -const trackWidget * trackContainer::trackWidgetAt( const int _y ) const +int trackContainer::countTracks( track::TrackTypes _tt ) const { - const int abs_y = _y + m_scrollArea->viewport()->y(); - int y_cnt = 0; + int cnt = 0; for( int i = 0; i < m_tracks.size(); ++i ) { - const int y_cnt1 = y_cnt; - y_cnt += m_tracks[i]->getTrackWidget()->height(); - if( abs_y >= y_cnt1 && abs_y < y_cnt ) - { - return( m_tracks[i]->getTrackWidget() ); - } - } - return( NULL ); -} - - - - -bool trackContainer::allowRubberband( void ) const -{ - return( FALSE ); -} - - - - -Uint16 trackContainer::countTracks( track::trackTypes _tt ) const -{ - Uint16 cnt = 0; - for( int i = 0; i < m_tracks.size(); ++i ) - { - if( m_tracks[i]->type() == _tt || - _tt == track::TOTAL_TRACK_TYPES ) + if( m_tracks[i]->type() == _tt || _tt == track::NumTrackTypes ) { ++cnt; } @@ -344,23 +224,208 @@ void trackContainer::setMutedOfAllTracks( bool _muted ) -const QList trackContainer::tracks( void ) const + + + + + + + +trackContainerView::trackContainerView( trackContainer * _tc ) : + QWidget(), + modelView( NULL ), + m_currentPosition( 0, 0 ), + m_tc( _tc ), + m_trackViews(), + m_scrollArea( new scrollArea( this ) ), + m_ppt( DEFAULT_PIXELS_PER_TACT ), + m_rubberBand( new rubberBand( m_scrollArea ) ), + m_origin() { - return( m_tracks ); + QVBoxLayout * layout = new QVBoxLayout( this ); + layout->setMargin( 0 ); + layout->setSpacing( 0 ); + layout->addWidget( m_scrollArea ); + + QWidget * scrollContent = new QWidget; + m_scrollLayout = new QVBoxLayout( scrollContent ); + m_scrollLayout->setMargin( 0 ); + m_scrollLayout->setSpacing( 0 ); + m_scrollLayout->setSizeConstraint( QLayout::SetMinimumSize ); + + m_scrollArea->setWidget( scrollContent ); + + m_scrollArea->show(); + m_rubberBand->hide(); + + setAcceptDrops( TRUE ); + + connect( m_tc, SIGNAL( trackAdded( track * ) ), + this, SLOT( createTrackView( track * ) ), + Qt::QueuedConnection ); } -QList trackContainer::tracks( void ) +trackContainerView::~trackContainerView() { - return( m_tracks ); + while( !m_trackViews.empty() ) + { + delete m_trackViews.takeLast(); + } } -void trackContainer::setPixelsPerTact( Uint16 _ppt ) + +trackView * trackContainerView::addTrackView( trackView * _tv ) +{ + QMap map; + map["id"] = _tv->getTrack()->id(); + addJournalEntry( journalEntry( AddTrack, map ) ); + + m_trackViews.push_back( _tv ); + m_scrollLayout->addWidget( _tv ); + connect( this, SIGNAL( positionChanged( const midiTime & ) ), + _tv->getTrackContentWidget(), + SLOT( changePosition( const midiTime & ) ) ); + realignTracks(); + return( _tv ); +} + + + + +void trackContainerView::removeTrackView( trackView * _tv ) +{ + int index = m_trackViews.indexOf( _tv ); + if( index != -1 ) + { + QMap map; + multimediaProject mmp( multimediaProject::JournalData ); + _tv->getTrack()->saveState( mmp, mmp.content() ); + map["id"] = _tv->getTrack()->id(); + map["state"] = mmp.toString(); + addJournalEntry( journalEntry( RemoveTrack, map ) ); + + m_trackViews.removeAt( index ); + + disconnect( _tv ); + m_scrollLayout->removeWidget( _tv ); + + realignTracks(); + if( engine::getSong() ) + { + engine::getSong()->setModified(); + } + } +} + + + + +void trackContainerView::moveTrackViewUp( trackView * _tv ) +{ + for( int i = 1; i < m_trackViews.size(); ++i ) + { + trackView * t = m_trackViews[i]; + if( t == _tv ) + { + bbTrack::swapBBTracks( t->getTrack(), + m_trackViews[i - 1]->getTrack() ); + m_scrollLayout->removeWidget( t ); + m_scrollLayout->insertWidget( i - 1, t ); + m_tc->m_tracks.swap( i - 1, i ); + m_trackViews.swap( i - 1, i ); + realignTracks(); + break; + } + } +} + + + + +void trackContainerView::moveTrackViewDown( trackView * _tv ) +{ + for( int i = 0; i < m_trackViews.size()-1; ++i ) + { + trackView * t = m_trackViews[i]; + if( t == _tv ) + { + bbTrack::swapBBTracks( t->getTrack(), + m_trackViews[i + 1]->getTrack() ); + m_scrollLayout->removeWidget( t ); + m_scrollLayout->insertWidget( i + 1, t ); + m_tc->m_tracks.swap( i, i + 1 ); + m_trackViews.swap( i, i + 1 ); + realignTracks(); + break; + } + } +} + + + + + +void trackContainerView::realignTracks( void ) +{ + QWidget * content = m_scrollArea->widget(); + content->setFixedWidth( width() + - m_scrollArea->verticalScrollBar()->width() ); + content->setFixedHeight( content->minimumSizeHint().height() ); + + for( trackViewList::iterator it = m_trackViews.begin(); + it != m_trackViews.end(); ++it ) + { + ( *it )->show(); + ( *it )->update(); + } +} + + + + +void trackContainerView::createTrackView( track * _t ) +{ + _t->createView( this ); +} + + + + +const trackView * trackContainerView::trackViewAt( const int _y ) const +{ + const int abs_y = _y + m_scrollArea->viewport()->y(); + int y_cnt = 0; + for( trackViewList::const_iterator it = m_trackViews.begin(); + it != m_trackViews.end(); ++it ) + { + const int y_cnt1 = y_cnt; + y_cnt += ( *it )->height(); + if( abs_y >= y_cnt1 && abs_y < y_cnt ) + { + return( *it ); + } + } + return( NULL ); +} + + + + +bool trackContainerView::allowRubberband( void ) const +{ + return( FALSE ); +} + + + + +void trackContainerView::setPixelsPerTact( int _ppt ) { m_ppt = _ppt; } @@ -368,34 +433,47 @@ void trackContainer::setPixelsPerTact( Uint16 _ppt ) -void trackContainer::undoStep( journalEntry & _je ) +void trackContainerView::clearAllTracks( void ) +{ + while( !m_trackViews.empty() ) + { + trackView * tv = m_trackViews.takeLast(); + track * t = tv->getTrack(); + delete tv; + delete t; + } +} + + + + +void trackContainerView::undoStep( journalEntry & _je ) { saveJournallingState( FALSE ); switch( _je.actionID() ) { - case ADD_TRACK: + case AddTrack: { QMap map = _je.data().toMap(); - track * tr = + track * t = dynamic_cast( engine::getProjectJournal()->getJournallingObject( map["id"].toInt() ) ); - assert( tr != NULL ); - multimediaProject mmp( - multimediaProject::JOURNAL_DATA ); - tr->saveState( mmp, mmp.content() ); + assert( t != NULL ); + multimediaProject mmp( multimediaProject::JournalData ); + t->saveState( mmp, mmp.content() ); map["state"] = mmp.toString(); _je.data() = map; - removeTrack( tr ); + t->deleteLater(); break; } - case REMOVE_TRACK: + case RemoveTrack: { multimediaProject mmp( _je.data().toMap()["state"].toString(), FALSE ); track::create( mmp.content().firstChild().toElement(), - this ); + m_tc ); break; } } @@ -405,17 +483,17 @@ void trackContainer::undoStep( journalEntry & _je ) -void trackContainer::redoStep( journalEntry & _je ) +void trackContainerView::redoStep( journalEntry & _je ) { switch( _je.actionID() ) { - case ADD_TRACK: - case REMOVE_TRACK: - _je.actionID() = ( _je.actionID() == ADD_TRACK ) ? - REMOVE_TRACK : ADD_TRACK; + case AddTrack: + case RemoveTrack: + _je.actionID() = ( _je.actionID() == AddTrack ) ? + RemoveTrack : AddTrack; undoStep( _je ); - _je.actionID() = ( _je.actionID() == ADD_TRACK ) ? - REMOVE_TRACK : ADD_TRACK; + _je.actionID() = ( _je.actionID() == AddTrack ) ? + RemoveTrack : AddTrack; break; } } @@ -423,19 +501,19 @@ void trackContainer::redoStep( journalEntry & _je ) -void trackContainer::dragEnterEvent( QDragEnterEvent * _dee ) +void trackContainerView::dragEnterEvent( QDragEnterEvent * _dee ) { stringPairDrag::processDragEnterEvent( _dee, QString( "presetfile,sampledata,samplefile,instrument,midifile," "track_%1,track_%2" ). - arg( track::INSTRUMENT_TRACK ). - arg( track::SAMPLE_TRACK ) ); + arg( track::InstrumentTrack ). + arg( track::SampleTrack ) ); } -void trackContainer::dropEvent( QDropEvent * _de ) +void trackContainerView::dropEvent( QDropEvent * _de ) { QString type = stringPairDrag::decodeKey( _de ); QString value = stringPairDrag::decodeValue( _de ); @@ -443,45 +521,45 @@ void trackContainer::dropEvent( QDropEvent * _de ) if( type == "instrument" ) { instrumentTrack * it = dynamic_cast( - track::create( track::INSTRUMENT_TRACK, - this ) ); + track::create( track::InstrumentTrack, + m_tc ) ); it->loadInstrument( value ); - it->toggledInstrumentTrackButton( TRUE ); + //it->toggledInstrumentTrackButton( TRUE ); _de->accept(); } else if( type == "sampledata" || type == "samplefile" ) { instrumentTrack * it = dynamic_cast( - track::create( track::INSTRUMENT_TRACK, - this ) ); + track::create( track::InstrumentTrack, + m_tc ) ); QString iname = type == "sampledata" ? "audiofileprocessor" : engine::sampleExtensions()[fileItem::extension( value )]; instrument * i = it->loadInstrument( iname ); i->setParameter( type, value ); - it->toggledInstrumentTrackButton( TRUE ); + //it->toggledInstrumentTrackButton( TRUE ); _de->accept(); } else if( type == "presetfile" ) { multimediaProject mmp( value ); instrumentTrack * it = dynamic_cast( - track::create( track::INSTRUMENT_TRACK, - this ) ); + track::create( track::InstrumentTrack, + m_tc ) ); it->loadTrackSpecificSettings( mmp.content().firstChild(). toElement() ); - it->toggledInstrumentTrackButton( TRUE ); + //it->toggledInstrumentTrackButton( TRUE ); _de->accept(); } else if( type == "midifile" ) { - importFilter::import( value, this ); + importFilter::import( value, m_tc ); _de->accept(); } else if( type.left( 6 ) == "track_" ) { multimediaProject mmp( value, FALSE ); - track::create( mmp.content().firstChild().toElement(), this ); + track::create( mmp.content().firstChild().toElement(), m_tc ); _de->accept(); } engine::getMixer()->unlock(); @@ -490,7 +568,7 @@ void trackContainer::dropEvent( QDropEvent * _de ) -void trackContainer::mousePressEvent( QMouseEvent * _me ) +void trackContainerView::mousePressEvent( QMouseEvent * _me ) { if( allowRubberband() == TRUE ) { @@ -498,12 +576,13 @@ void trackContainer::mousePressEvent( QMouseEvent * _me ) m_rubberBand->setGeometry( QRect( m_origin, QSize() ) ); m_rubberBand->show(); } + QWidget::mousePressEvent( _me ); } -void trackContainer::mouseMoveEvent( QMouseEvent * _me ) +void trackContainerView::mouseMoveEvent( QMouseEvent * _me ) { if( rubberBandActive() == TRUE ) { @@ -511,31 +590,34 @@ void trackContainer::mouseMoveEvent( QMouseEvent * _me ) m_scrollArea->mapFromParent( _me->pos() ) ). normalized() ); } + QWidget::mouseMoveEvent( _me ); } -void trackContainer::mouseReleaseEvent( QMouseEvent * _me ) +void trackContainerView::mouseReleaseEvent( QMouseEvent * _me ) { m_rubberBand->hide(); + QWidget::mouseReleaseEvent( _me ); } -void trackContainer::resizeEvent( QResizeEvent * ) +void trackContainerView::resizeEvent( QResizeEvent * _re ) { realignTracks(); + QWidget::resizeEvent( _re ); } -trackContainer::scrollArea::scrollArea( trackContainer * _parent ) : +trackContainerView::scrollArea::scrollArea( trackContainerView * _parent ) : QScrollArea( _parent ), - m_trackContainer( _parent ) + m_trackContainerView( _parent ) { setFrameStyle( QFrame::NoFrame ); setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); @@ -545,20 +627,20 @@ trackContainer::scrollArea::scrollArea( trackContainer * _parent ) : -trackContainer::scrollArea::~scrollArea() +trackContainerView::scrollArea::~scrollArea() { } -void trackContainer::scrollArea::wheelEvent( QWheelEvent * _we ) +void trackContainerView::scrollArea::wheelEvent( QWheelEvent * _we ) { // always pass wheel-event to parent-widget (song-editor // bb-editor etc.) because they might want to use it for zooming // or scrolling left/right if a modifier-key is pressed, otherwise // they do not accept it and we pass it up to QScrollArea - m_trackContainer->wheelEvent( _we ); + m_trackContainerView->wheelEvent( _we ); if( !_we->isAccepted() ) { QScrollArea::wheelEvent( _we ); @@ -568,6 +650,7 @@ void trackContainer::scrollArea::wheelEvent( QWheelEvent * _we ) + #include "track_container.moc" diff --git a/src/lib/journalling_object.cpp b/src/lib/journalling_object.cpp index d72fcb2d2..5a23bd47c 100644 --- a/src/lib/journalling_object.cpp +++ b/src/lib/journalling_object.cpp @@ -3,7 +3,7 @@ /* * journalling_object.cpp - implementation of journalling-object related stuff * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -38,7 +38,9 @@ journallingObject::journallingObject( void ) : m_id( engine::getProjectJournal()->allocID( this ) ), m_journalEntries(), m_currentJournalEntry( m_journalEntries.end() ), - m_journalling( TRUE ) + m_journalling( TRUE ), + m_journallingStateStack(), + m_hook( NULL ) { } @@ -47,6 +49,10 @@ journallingObject::journallingObject( void ) : journallingObject::~journallingObject() { + if( m_hook ) + { + m_hook->m_hookedIn = NULL; + } if( engine::getProjectJournal() ) { engine::getProjectJournal()->freeID( id() ); @@ -125,6 +131,15 @@ void journallingObject::restoreState( const QDomElement & _this ) +void journallingObject::setHook( journallingObjectHook * _hook ) +{ + m_hook = _hook; + m_hook->m_hookedIn = this; +} + + + + void journallingObject::addJournalEntry( const journalEntry & _je ) { if( engine::getProjectJournal()->isJournalling() && isJournalling() ) diff --git a/src/lib/mmp.cpp b/src/lib/mmp.cpp index 48fbead8c..44ef7f3df 100644 --- a/src/lib/mmp.cpp +++ b/src/lib/mmp.cpp @@ -40,26 +40,26 @@ multimediaProject::typeDescStruct - multimediaProject::s_types[multimediaProject::PROJ_TYPE_COUNT] = + multimediaProject::s_types[multimediaProject::NumProjectTypes] = { - { multimediaProject::UNKNOWN, "unknown" }, - { multimediaProject::SONG_PROJECT, "song" }, - { multimediaProject::SONG_PROJECT_TEMPLATE, "songtemplate" }, + { multimediaProject::UnknownType, "unknown" }, + { multimediaProject::SongProject, "song" }, + { multimediaProject::SongProjectTemplate, "songtemplate" }, #warning compat-code, use upgrade feature - { multimediaProject::INSTRUMENT_TRACK_SETTINGS, + { multimediaProject::InstrumentTrackSettings, "instrumenttracksettings,channelsettings" }, - { multimediaProject::DRAG_N_DROP_DATA, "dnddata" }, - { multimediaProject::CLIPBOARD_DATA, "clipboard-data" }, - { multimediaProject::JOURNAL_DATA, "journaldata" }, - { multimediaProject::EFFECT_SETTINGS, "effectsettings" }, - { multimediaProject::VIDEO_PROJECT, "videoproject" }, - { multimediaProject::BURN_PROJECT, "burnproject" }, - { multimediaProject::PLAYLIST, "playlist" } + { multimediaProject::DragNDropData, "dnddata" }, + { multimediaProject::ClipboardData, "clipboard-data" }, + { multimediaProject::JournalData, "journaldata" }, + { multimediaProject::EffectSettings, "effectsettings" }, + { multimediaProject::VideoProject, "videoproject" }, + { multimediaProject::BurnProject, "burnproject" }, + { multimediaProject::Playlist, "playlist" } } ; -multimediaProject::multimediaProject( projectTypes _project_type ) : +multimediaProject::multimediaProject( ProjectTypes _project_type ) : QDomDocument( "multimedia-project" ), m_content(), m_head(), @@ -193,7 +193,7 @@ QString multimediaProject::nameWithExtension( const QString & _fn ) const { switch( type() ) { - case SONG_PROJECT: + case SongProject: if( _fn.section( '.', -1 ) != "mmp" && _fn.section( '.', -1 ) != "mpt" && _fn.section( '.', -1 ) != "mmpz" ) @@ -206,13 +206,13 @@ QString multimediaProject::nameWithExtension( const QString & _fn ) const return( _fn + ".mmp" ); } break; - case SONG_PROJECT_TEMPLATE: + case SongProjectTemplate: if( _fn.section( '.',-1 ) != "mpt" ) { return( _fn + ".mpt" ); } break; - case INSTRUMENT_TRACK_SETTINGS: + case InstrumentTrackSettings: if( _fn.section( '.', -2, -1 ) != "cs.xml" ) { return( _fn + ".cs.xml" ); @@ -228,8 +228,8 @@ QString multimediaProject::nameWithExtension( const QString & _fn ) const bool multimediaProject::writeFile( QString & _fn, bool _overwrite_check ) { - if( type() == SONG_PROJECT || type() == SONG_PROJECT_TEMPLATE - || type() == INSTRUMENT_TRACK_SETTINGS ) + if( type() == SongProject || type() == SongProjectTemplate + || type() == InstrumentTrackSettings ) { cleanMetaNodes( documentElement() ); } @@ -284,7 +284,7 @@ bool multimediaProject::writeFile( QString & _fn, bool _overwrite_check ) -multimediaProject::projectTypes multimediaProject::typeOfFile( +multimediaProject::ProjectTypes multimediaProject::typeOfFile( const QString & _fn ) { multimediaProject m( _fn, TRUE, FALSE ); @@ -294,10 +294,10 @@ multimediaProject::projectTypes multimediaProject::typeOfFile( -multimediaProject::projectTypes multimediaProject::type( +multimediaProject::ProjectTypes multimediaProject::type( const QString & _type_name ) { - for( int i = 0; i < PROJ_TYPE_COUNT; ++i ) + for( int i = 0; i < NumProjectTypes; ++i ) { if( s_types[i].m_name == _type_name || ( s_types[i].m_name.contains( "," ) && ( @@ -306,26 +306,26 @@ multimediaProject::projectTypes multimediaProject::type( ) { - return( static_cast( + return( static_cast( i ) ); } } - return( UNKNOWN ); + return( UnknownType ); } -QString multimediaProject::typeName( projectTypes _project_type ) +QString multimediaProject::typeName( ProjectTypes _project_type ) { - if( _project_type >= UNKNOWN && _project_type < PROJ_TYPE_COUNT ) + if( _project_type >= UnknownType && _project_type < NumProjectTypes ) { return( s_types[_project_type].m_name #warning compat-code, use upgrade feature .section( ',', 0, 0 ) ); } - return( s_types[UNKNOWN].m_name ); + return( s_types[UnknownType].m_name ); } @@ -606,6 +606,20 @@ void multimediaProject::upgrade( void ) } } + if( version < "0.4.0-svn20080129" ) + { + QDomNodeList list; + while( !( list = + elementsByTagName( "arpandchords" ) ).isEmpty() ) + { + QDomElement aac = list.item( 0 ).toElement(); + aac.setTagName( "arpeggiator" ); + QDomNode cloned = aac.cloneNode(); + cloned.toElement().setTagName( "chordcreator" ); + aac.parentNode().appendChild( cloned ); + } + } + if( !m_head.hasAttribute( "mastervol" ) ) { m_head.setAttribute( "mastervol", 100 ); diff --git a/src/lib/project_journal.cpp b/src/lib/project_journal.cpp index b78ae7f09..6986fffbe 100644 --- a/src/lib/project_journal.cpp +++ b/src/lib/project_journal.cpp @@ -30,7 +30,7 @@ #include "project_journal.h" #include "engine.h" #include "journalling_object.h" -#include "song_editor.h" +#include "song.h" #include "automatable_model_templates.h" @@ -65,7 +65,7 @@ void projectJournal::undo( void ) ( jo = m_joIDs[*--m_currentJournalEntry] ) != NULL ) { jo->undo(); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } } @@ -86,7 +86,7 @@ void projectJournal::redo( void ) ( jo = m_joIDs[*m_currentJournalEntry++] ) != NULL ) { jo->redo(); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } } @@ -98,7 +98,7 @@ void projectJournal::journalEntryAdded( const jo_id_t _id ) m_journalEntries.erase( m_currentJournalEntry, m_journalEntries.end() ); m_journalEntries.push_back( _id ); m_currentJournalEntry = m_journalEntries.end(); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } diff --git a/src/midi/midi_alsa_seq.cpp b/src/midi/midi_alsa_seq.cpp index 827d8fda9..c7fd98cc6 100644 --- a/src/midi/midi_alsa_seq.cpp +++ b/src/midi/midi_alsa_seq.cpp @@ -33,7 +33,7 @@ #include "config_mgr.h" #include "engine.h" #include "gui_templates.h" -#include "song_editor.h" +#include "song.h" #include "midi_port.h" #include "note.h" #include "automatable_model_templates.h" @@ -63,14 +63,14 @@ midiALSASeq::midiALSASeq( void ) : snd_seq_queue_tempo_t * tempo; snd_seq_queue_tempo_malloc( &tempo ); snd_seq_queue_tempo_set_tempo( tempo, 6000000 / - engine::getSongEditor()->getTempo() ); + engine::getSong()->getTempo() ); snd_seq_queue_tempo_set_ppq( tempo, 16 ); snd_seq_set_queue_tempo( m_seqHandle, m_queueID, tempo ); snd_seq_queue_tempo_free( tempo ); snd_seq_start_queue( m_seqHandle, m_queueID, NULL ); - changeQueueTempo( engine::getSongEditor()->getTempo() ); - connect( engine::getSongEditor(), SIGNAL( tempoChanged( bpm_t ) ), + changeQueueTempo( engine::getSong()->getTempo() ); + connect( engine::getSong(), SIGNAL( tempoChanged( bpm_t ) ), this, SLOT( changeQueueTempo( bpm_t ) ) ); // initial list-update diff --git a/src/tracks/automation_track.cpp b/src/tracks/automation_track.cpp index 66099f1bb..aa3728dd6 100644 --- a/src/tracks/automation_track.cpp +++ b/src/tracks/automation_track.cpp @@ -4,7 +4,7 @@ * automation_track.cpp - automationTrack handles automation of objects without * a track * - * Copyright (c) 2006 Javier Serrano Polo + * Copyright (c) 2006-2008 Javier Serrano Polo * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -27,12 +27,13 @@ #include "automation_track.h" +#include "automatable_model_templates.h" automationTrack::automationTrack( trackContainer * _tc ) : - track( _tc, FALSE ) + track( AutomationTrack, _tc ) { } @@ -46,18 +47,8 @@ automationTrack::~automationTrack() -track::trackTypes automationTrack::type( void ) const -{ - return( AUTOMATION_TRACK ); -} - - - - -bool automationTrack::play( const midiTime & _start, - const fpp_t _frames, - const f_cnt_t _frame_base, - Sint16 _tco_num ) +bool automationTrack::play( const midiTime & _start, const fpp_t _frames, + const f_cnt_t _frame_base, Sint16 _tco_num ) { sendMidiTime( _start ); return( FALSE ); @@ -88,8 +79,4 @@ void automationTrack::loadTrackSpecificSettings( const QDomElement & _this ) - -#include "automation_track.moc" - - #endif diff --git a/src/tracks/bb_track.cpp b/src/tracks/bb_track.cpp index 5cb349069..1496048b0 100644 --- a/src/tracks/bb_track.cpp +++ b/src/tracks/bb_track.cpp @@ -3,7 +3,7 @@ /* * bb_track.cpp - implementation of class bbTrack and bbTCO * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -39,6 +39,7 @@ #include "mixer.h" #include "name_label.h" #include "rename_dialog.h" +#include "song.h" #include "song_editor.h" #include "templates.h" @@ -47,14 +48,15 @@ bbTrack::infoMap bbTrack::s_infoMap; -bbTCO::bbTCO( track * _track, const QColor & _c ) : +bbTCO::bbTCO( track * _track, unsigned int _color ) : trackContentObject( _track ), - m_name( ( dynamic_cast( _track ) != NULL ) ? + m_name(/* ( dynamic_cast( _track ) != NULL ) ? dynamic_cast( _track )->trackLabel()->text() : - QString( "" ) ), - m_color( _c.isValid() ? _c : QColor( 64, 128, 255 ) ) + QString( "" )*/ + "" ), + m_color( _color > 0 ? _color : qRgb( 64, 128, 255 ) ) { - tact t = engine::getBBEditor()->lengthOfBB( + tact t = engine::getBBTrackContainer()->lengthOfBB( bbTrack::numOfBBTrack( getTrack() ) ); if( t > 0 ) { @@ -74,86 +76,6 @@ bbTCO::~bbTCO() -void bbTCO::constructContextMenu( QMenu * _cm ) -{ - QAction * a = new QAction( embed::getIconPixmap( "bb_track" ), - tr( "Open in Beat+Baseline-Editor" ), - _cm ); - _cm->insertAction( _cm->actions()[0], a ); - connect( a, SIGNAL( triggered( bool ) ), this, - SLOT( openInBBEditor( bool ) ) ); - _cm->insertSeparator( _cm->actions()[1] ); - _cm->addSeparator(); - _cm->addAction( embed::getIconPixmap( "reload" ), tr( "Reset name" ), - this, SLOT( resetName() ) ); - _cm->addAction( embed::getIconPixmap( "rename" ), tr( "Change name" ), - this, SLOT( changeName() ) ); - _cm->addAction( embed::getIconPixmap( "colorize" ), - tr( "Change color" ), this, SLOT( changeColor() ) ); -} - - - - -void bbTCO::mouseDoubleClickEvent( QMouseEvent * ) -{ - openInBBEditor(); -} - - - - -void bbTCO::paintEvent( QPaintEvent * ) -{ - QColor col = m_color; - if( getTrack()->muted() || muted() ) - { - col = QColor( 160, 160, 160 ); - } - if( isSelected() == TRUE ) - { - col = QColor( tMax( col.red() - 128, 0 ), - tMax( col.green() - 128, 0 ), 255 ); - } - QPainter p( this ); - - QLinearGradient lingrad( 0, 0, 0, height() ); - lingrad.setColorAt( 0, col.light( 130 ) ); - lingrad.setColorAt( 1, col.light( 70 ) ); - p.fillRect( rect(), lingrad ); - - tact t = engine::getBBEditor()->lengthOfBB( bbTrack::numOfBBTrack( - getTrack() ) ); - if( length() > 64 && t > 0 ) - { - for( int x = static_cast( t * pixelsPerTact() ); - x < width()-2; - x += static_cast( t * pixelsPerTact() ) ) - { - p.setPen( col.light( 80 ) ); - p.drawLine( x, 1, x, 5 ); - p.setPen( col.light( 120 ) ); - p.drawLine( x, height() - 6, x, height() - 2 ); - } - } - - p.setPen( col.dark() ); - p.drawRect( 0, 0, rect().right(), rect().bottom() ); - - p.setFont( pointSize<7>( p.font() ) ); - p.setPen( QColor( 0, 0, 0 ) ); - p.drawText( 2, p.fontMetrics().height() - 1, m_name ); - - if( muted() ) - { - p.drawPixmap( 3, p.fontMetrics().height() + 1, - embed::getIconPixmap( "muted", 16, 16 ) ); - } -} - - - - void bbTCO::saveSettings( QDomDocument & _doc, QDomElement & _this ) { _this.setAttribute( "name", m_name ); @@ -167,7 +89,7 @@ void bbTCO::saveSettings( QDomDocument & _doc, QDomElement & _this ) } _this.setAttribute( "len", length() ); _this.setAttribute( "muted", muted() ); - _this.setAttribute( "color", m_color.rgb() ); + _this.setAttribute( "color", m_color ); } @@ -188,17 +110,127 @@ void bbTCO::loadSettings( const QDomElement & _this ) if( _this.attribute( "color" ).toUInt() != 0 ) { - m_color.setRgb( _this.attribute( "color" ).toUInt() ); + m_color = _this.attribute( "color" ).toUInt(); } } -void bbTCO::openInBBEditor( bool ) +trackContentObjectView * bbTCO::createView( trackView * _tv ) { - engine::getBBEditor()->setCurrentBB( bbTrack::numOfBBTrack( - getTrack() ) ); + return( new bbTCOView( this, _tv ) ); +} + + + + + + + + + + +bbTCOView::bbTCOView( trackContentObject * _tco, trackView * _tv ) : + trackContentObjectView( _tco, _tv ), + m_bbTCO( dynamic_cast( _tco ) ) +{ +} + + + + +bbTCOView::~bbTCOView() +{ +} + + + + +void bbTCOView::constructContextMenu( QMenu * _cm ) +{ + QAction * a = new QAction( embed::getIconPixmap( "bb_track" ), + tr( "Open in Beat+Baseline-Editor" ), + _cm ); + _cm->insertAction( _cm->actions()[0], a ); + connect( a, SIGNAL( triggered( bool ) ), + this, SLOT( openInBBEditor() ) ); + _cm->insertSeparator( _cm->actions()[1] ); + _cm->addSeparator(); + _cm->addAction( embed::getIconPixmap( "reload" ), tr( "Reset name" ), + this, SLOT( resetName() ) ); + _cm->addAction( embed::getIconPixmap( "rename" ), tr( "Change name" ), + this, SLOT( changeName() ) ); + _cm->addAction( embed::getIconPixmap( "colorize" ), + tr( "Change color" ), this, SLOT( changeColor() ) ); +} + + + + +void bbTCOView::mouseDoubleClickEvent( QMouseEvent * ) +{ + openInBBEditor(); +} + + + + +void bbTCOView::paintEvent( QPaintEvent * ) +{ + QColor col( m_bbTCO->m_color ); + if( m_bbTCO->getTrack()->muted() || m_bbTCO->muted() ) + { + col = QColor( 160, 160, 160 ); + } + if( isSelected() == TRUE ) + { + col = QColor( tMax( col.red() - 128, 0 ), + tMax( col.green() - 128, 0 ), 255 ); + } + QPainter p( this ); + + QLinearGradient lingrad( 0, 0, 0, height() ); + lingrad.setColorAt( 0, col.light( 130 ) ); + lingrad.setColorAt( 1, col.light( 70 ) ); + p.fillRect( rect(), lingrad ); + + tact t = engine::getBBTrackContainer()->lengthOfBB( + bbTrack::numOfBBTrack( m_bbTCO->getTrack() ) ); + if( m_bbTCO->length() > 64 && t > 0 ) + { + for( int x = static_cast( t * pixelsPerTact() ); + x < width()-2; + x += static_cast( t * pixelsPerTact() ) ) + { + p.setPen( col.light( 80 ) ); + p.drawLine( x, 1, x, 5 ); + p.setPen( col.light( 120 ) ); + p.drawLine( x, height() - 6, x, height() - 2 ); + } + } + + p.setPen( col.dark() ); + p.drawRect( 0, 0, rect().right(), rect().bottom() ); + + p.setFont( pointSize<7>( p.font() ) ); + p.setPen( QColor( 0, 0, 0 ) ); + p.drawText( 2, p.fontMetrics().height() - 1, m_bbTCO->m_name ); + + if( m_bbTCO->muted() ) + { + p.drawPixmap( 3, p.fontMetrics().height() + 1, + embed::getIconPixmap( "muted", 16, 16 ) ); + } +} + + + + +void bbTCOView::openInBBEditor( void ) +{ + engine::getBBTrackContainer()->setCurrentBB( bbTrack::numOfBBTrack( + m_bbTCO->getTrack() ) ); engine::getBBEditor()->show(); engine::getBBEditor()->setFocus(); } @@ -206,19 +238,12 @@ void bbTCO::openInBBEditor( bool ) -void bbTCO::openInBBEditor( void ) +void bbTCOView::resetName( void ) { - openInBBEditor( FALSE ); -} - - - - -void bbTCO::resetName( void ) -{ - if( dynamic_cast( getTrack() ) != NULL ) + if( dynamic_cast( getTrackView() ) != NULL ) { - m_name = dynamic_cast( getTrack() )-> + m_bbTCO->m_name = + dynamic_cast( getTrackView() )-> trackLabel()->text(); } } @@ -226,18 +251,18 @@ void bbTCO::resetName( void ) -void bbTCO::changeName( void ) +void bbTCOView::changeName( void ) { - renameDialog rename_dlg( m_name ); + renameDialog rename_dlg( m_bbTCO->m_name ); rename_dlg.exec(); } -void bbTCO::changeColor( void ) +void bbTCOView::changeColor( void ) { - QColor _new_color = QColorDialog::getColor( m_color ); + QColor _new_color = QColorDialog::getColor( m_bbTCO->m_color ); if( !_new_color.isValid() ) { return; @@ -250,10 +275,10 @@ void bbTCO::changeColor( void ) selected.begin(); it != selected.end(); ++it ) { - bbTCO * bb_tco = dynamic_cast( *it ); - if( bb_tco ) + bbTCOView * bb_tcov = dynamic_cast( *it ); + if( bb_tcov ) { - bb_tco->setColor( _new_color ); + bb_tcov->setColor( _new_color ); } } } @@ -266,12 +291,12 @@ void bbTCO::changeColor( void ) -void bbTCO::setColor( QColor _new_color ) +void bbTCOView::setColor( QColor _new_color ) { - if( _new_color != m_color ) + if( _new_color.rgb() != m_bbTCO->m_color ) { - m_color = _new_color; - engine::getSongEditor()->setModified(); + m_bbTCO->m_color = _new_color.rgb(); + engine::getSong()->setModified(); update(); } } @@ -280,33 +305,17 @@ void bbTCO::setColor( QColor _new_color ) -bbTrack::bbTrack( trackContainer * _tc ) : - track( _tc ) -{ - getTrackWidget()->setFixedHeight( 32 ); - // drag'n'drop with bb-tracks only causes troubles (and makes no sense - // too), so disable it - getTrackWidget()->setAcceptDrops( FALSE ); + +bbTrack::bbTrack( trackContainer * _tc ) : + track( BBTrack, _tc ) +{ int bbNum = s_infoMap.size(); s_infoMap[this] = bbNum; - m_trackLabel = new nameLabel( tr( "Beat/Baseline %1" ).arg( bbNum ), - getTrackSettingsWidget() ); - m_trackLabel->setPixmap( embed::getIconPixmap( "bb_track" ) ); - m_trackLabel->setGeometry( 1, 1, DEFAULT_SETTINGS_WIDGET_WIDTH - 2, - 29 ); - m_trackLabel->show(); - connect( m_trackLabel, SIGNAL( clicked() ), - this, SLOT( clickedTrackLabel() ) ); - connect( m_trackLabel, SIGNAL( nameChanged() ), - engine::getBBEditor(), SLOT( updateComboBox() ) ); - connect( m_trackLabel, SIGNAL( pixmapChanged() ), - engine::getBBEditor(), SLOT( updateComboBox() ) ); - - - engine::getBBEditor()->setCurrentBB( bbNum ); - engine::getBBEditor()->updateComboBox(); + setName( tr( "Beat/Baseline %1" ).arg( bbNum ) ); + engine::getBBTrackContainer()->setCurrentBB( bbNum ); + engine::getBBTrackContainer()->updateComboBox(); } @@ -316,8 +325,8 @@ bbTrack::~bbTrack() { engine::getMixer()->removePlayHandles( this ); - int bb = s_infoMap[this]; - engine::getBBEditor()->removeBB( bb ); + const int bb = s_infoMap[this]; + engine::getBBTrackContainer()->removeBB( bb ); for( infoMap::iterator it = s_infoMap.begin(); it != s_infoMap.end(); ++it ) { @@ -327,30 +336,25 @@ bbTrack::~bbTrack() } } s_infoMap.remove( this ); - engine::getBBEditor()->updateComboBox(); + + // remove us from TC so bbTrackContainer::numOfBBs() returns a smaller + // value and thus combobox-updating in bbTrackContainer works well + getTrackContainer()->removeTrack( this ); + engine::getBBTrackContainer()->updateComboBox(); } -track::trackTypes bbTrack::type( void ) const -{ - return( BB_TRACK ); -} - - - // play _frames frames of given TCO within starting with _start -bool FASTCALL bbTrack::play( const midiTime & _start, - const fpp_t _frames, - const f_cnt_t _offset, - Sint16 _tco_num ) +bool bbTrack::play( const midiTime & _start, const fpp_t _frames, + const f_cnt_t _offset, Sint16 _tco_num ) { sendMidiTime( _start ); if( _tco_num >= 0 ) { - return( engine::getBBEditor()->play( _start, _frames, + return( engine::getBBTrackContainer()->play( _start, _frames, _offset, s_infoMap[this] ) ); } @@ -378,7 +382,8 @@ bool FASTCALL bbTrack::play( const midiTime & _start, } if( _start - lastPosition < lastLen ) { - return( engine::getBBEditor()->play( _start - lastPosition, + return( engine::getBBTrackContainer()->play( _start - + lastPosition, _frames, _offset, s_infoMap[this] ) ); @@ -389,6 +394,14 @@ bool FASTCALL bbTrack::play( const midiTime & _start, +trackView * bbTrack::createView( trackContainerView * _tcv ) +{ + return( new bbTrackView( this, _tcv ) ); +} + + + + trackContentObject * bbTrack::createTCO( const midiTime & _pos ) { // if we're creating a new bbTCO, we colorize it according to the @@ -413,20 +426,20 @@ trackContentObject * bbTrack::createTCO( const midiTime & _pos ) void bbTrack::saveTrackSpecificSettings( QDomDocument & _doc, QDomElement & _this ) { - _this.setAttribute( "name", m_trackLabel->text() ); - _this.setAttribute( "icon", m_trackLabel->pixmapFile() ); + _this.setAttribute( "name", name() ); +// _this.setAttribute( "icon", m_trackLabel->pixmapFile() ); /* _this.setAttribute( "current", s_infoMap[this] == engine::getBBEditor()->currentBB() );*/ if( s_infoMap[this] == 0 && _this.parentNode().parentNode().nodeName() != "clone" && _this.parentNode().nodeName() != "journaldata" ) { - ( (journallingObject *)( engine::getBBEditor() ) )->saveState( - _doc, _this ); + ( (journallingObject *)( engine::getBBTrackContainer() ) )-> + saveState( _doc, _this ); } int track_num = 0; - QList tracks = engine::getBBEditor()->tracks(); + QList tracks = engine::getBBTrackContainer()->tracks(); for( int i = 0; i < tracks.size(); ++i, ++track_num ) { if( automationDisabled( tracks[i] ) ) @@ -444,18 +457,18 @@ void bbTrack::saveTrackSpecificSettings( QDomDocument & _doc, void bbTrack::loadTrackSpecificSettings( const QDomElement & _this ) { - m_trackLabel->setText( _this.attribute( "name" ) ); - if( _this.attribute( "icon" ) != "" ) + setName( _this.attribute( "name" ) ); +/* if( _this.attribute( "icon" ) != "" ) { m_trackLabel->setPixmapFile( _this.attribute( "icon" ) ); - } - engine::getBBEditor()->updateComboBox(); + }*/ +// engine::getBBTrackContainer()->updateComboBox(); QDomNode node = _this.namedItem( trackContainer::classNodeName() ); if( node.isElement() ) { - ( (journallingObject *)engine::getBBEditor() )->restoreState( - node.toElement() ); + ( (journallingObject *)engine::getBBTrackContainer() )-> + restoreState( node.toElement() ); } /* doesn't work yet because bbTrack-ctor also sets current bb so if bb-tracks are created after this function is called, this doesn't @@ -465,7 +478,7 @@ void bbTrack::loadTrackSpecificSettings( const QDomElement & _this ) engine::getBBEditor()->setCurrentBB( s_infoMap[this] ); }*/ - QList tracks = engine::getBBEditor()->tracks(); + QList tracks = engine::getBBTrackContainer()->tracks(); node = _this.firstChild(); while( !node.isNull() ) { @@ -518,17 +531,70 @@ void bbTrack::swapBBTracks( track * _track1, track * _track2 ) if( t1 != NULL && t2 != NULL ) { qSwap( s_infoMap[t1], s_infoMap[t2] ); - engine::getBBEditor()->swapBB( s_infoMap[t1], s_infoMap[t2] ); - engine::getBBEditor()->setCurrentBB( s_infoMap[t1] ); + engine::getBBTrackContainer()->swapBB( s_infoMap[t1], + s_infoMap[t2] ); + engine::getBBTrackContainer()->setCurrentBB( s_infoMap[t1] ); } } -void bbTrack::clickedTrackLabel( void ) + + + + + +bbTrackView::bbTrackView( bbTrack * _bbt, trackContainerView * _tcv ) : + trackView( _bbt, _tcv ), + m_bbTrack( _bbt ) { - engine::getBBEditor()->setCurrentBB( s_infoMap[this] ); + setFixedHeight( 32 ); + // drag'n'drop with bb-tracks only causes troubles (and makes no sense + // too), so disable it + setAcceptDrops( FALSE ); + + m_trackLabel = new nameLabel( _bbt->name(), + getTrackSettingsWidget() ); + m_trackLabel->setPixmap( embed::getIconPixmap( "bb_track" ) ); + m_trackLabel->setGeometry( 1, 1, DEFAULT_SETTINGS_WIDGET_WIDTH - 2, + 29 ); + m_trackLabel->show(); + connect( m_trackLabel, SIGNAL( clicked() ), + this, SLOT( clickedTrackLabel() ) ); + connect( m_trackLabel, SIGNAL( nameChanged( const QString & ) ), + _bbt, SLOT( setName( const QString & ) ) ); + connect( m_trackLabel, SIGNAL( nameChanged( const QString & ) ), + engine::getBBTrackContainer(), SLOT( updateComboBox() ) ); + connect( m_trackLabel, SIGNAL( pixmapChanged() ), + engine::getBBTrackContainer(), SLOT( updateComboBox() ) ); + + setModel( _bbt ); +} + + + + +bbTrackView::~bbTrackView() +{ +} + + + + +bool bbTrackView::close( void ) +{ + engine::getBBEditor()->removeBBView( bbTrack::s_infoMap[m_bbTrack] ); + trackView::close(); +} + + + + +void bbTrackView::clickedTrackLabel( void ) +{ + engine::getBBTrackContainer()->setCurrentBB( + bbTrack::numOfBBTrack( m_bbTrack ) ); engine::getBBEditor()->show(); } diff --git a/src/tracks/instrument_track.cpp b/src/tracks/instrument_track.cpp index 0e064fbf9..5f9f99ce4 100644 --- a/src/tracks/instrument_track.cpp +++ b/src/tracks/instrument_track.cpp @@ -40,9 +40,9 @@ #include #include #include +#include -#include "arp_and_chords_tab_widget.h" #include "audio_port.h" #include "automatable_model_templates.h" #include "automation_pattern.h" @@ -54,9 +54,12 @@ #include "embed.h" #include "engine.h" #include "instrument_sound_shaping.h" +#include "instrument_sound_shaping_view.h" #include "fade_button.h" #include "gui_templates.h" #include "instrument.h" +#include "instrument_function_views.h" +#include "instrument_midi_io_view.h" #include "led_checkbox.h" #include "main_window.h" #include "midi_client.h" @@ -68,7 +71,7 @@ #include "piano_widget.h" #include "plugin_view.h" #include "sample_play_handle.h" -#include "song_editor.h" +#include "song.h" #include "string_pair_drag.h" #include "tab_widget.h" #include "tooltip.h" @@ -95,10 +98,10 @@ const int INSTRUMENT_HEIGHT = INSTRUMENT_WIDTH; const int PIANO_HEIGHT = 84; +// #### IT: instrumentTrack::instrumentTrack( trackContainer * _tc ) : - track( _tc ), + track( InstrumentTrack, _tc ), midiEventProcessor(), - m_trackType( INSTRUMENT_TRACK ), m_midiPort( engine::getMixer()->getMIDIClient()->addPort( this, tr( "unnamed_channel" ) ) ), m_audioPort( tr( "unnamed_channel" ), this ), @@ -112,9 +115,11 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : /* this */ ), // m_effects( /* this */ NULL ), m_instrument( NULL ), - m_instrumentView( NULL ), - m_midiInputAction( NULL ), - m_midiOutputAction( NULL ) + m_soundShaping( this ), + m_arpeggiator( this ), + m_chordCreator( this ), + m_midiIO( this, m_midiPort ), + m_piano( this ) { m_baseNoteModel.setTrack( this ); m_baseNoteModel.setInitValue( DEFAULT_OCTAVE * NOTES_PER_OCTAVE + A ); @@ -131,194 +136,8 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : } - setAcceptDrops( TRUE ); - - getTrackWidget()->setFixedHeight( 32 ); - - - // creation of widgets for track-settings-widget - m_tswVolumeKnob = new volumeKnob( knobSmall_17, getTrackSettingsWidget(), - tr( "Channel volume" ) ); - m_tswVolumeKnob->setModel( &m_volumeModel ); - m_tswVolumeKnob->setHintText( tr( "Channel volume:" ) + " ", "%" ); - m_tswVolumeKnob->move( 4, 4 ); - m_tswVolumeKnob->setLabel( tr( "VOL" ) ); - m_tswVolumeKnob->show(); - m_tswVolumeKnob->setWhatsThis( tr( volume_help ) ); - - QPushButton * tsw_midi = new QPushButton( - embed::getIconPixmap( "piano" ), QString::null, - getTrackSettingsWidget() ); - tsw_midi->setGeometry( 32, 2, 28, 28 ); - tsw_midi->show(); - toolTip::add( tsw_midi, tr( "MIDI input/output" ) ); - m_tswMidiMenu = new QMenu( tsw_midi ); - tsw_midi->setMenu( m_tswMidiMenu ); - - - m_tswActivityIndicator = new fadeButton( QColor( 96, 96, 96 ), - QColor( 255, 204, 0 ), - getTrackSettingsWidget() ); - m_tswActivityIndicator->setGeometry( 212, 2, 8, 28 ); - m_tswActivityIndicator->show(); - connect( m_tswActivityIndicator, SIGNAL( pressed( void ) ), - this, SLOT( activityIndicatorPressed() ) ); - connect( m_tswActivityIndicator, SIGNAL( released( void ) ), - this, SLOT( activityIndicatorReleased() ) ); - - - m_tswInstrumentTrackButton = new instrumentTrackButton( this ); - m_tswInstrumentTrackButton->setCheckable( TRUE ); - m_tswInstrumentTrackButton->setGeometry( 64, 2, 144, 28 ); - m_tswInstrumentTrackButton->show(); - connect( m_tswInstrumentTrackButton, SIGNAL( toggled( bool ) ), this, - SLOT( toggledInstrumentTrackButton( bool ) ) ); - - - - // init own layout + widgets - setFocusPolicy( Qt::StrongFocus ); - QVBoxLayout * vlayout = new QVBoxLayout( this ); - vlayout->setMargin( 0 ); - vlayout->setSpacing( 0 ); - - m_generalSettingsWidget = new tabWidget( tr( "GENERAL SETTINGS" ), - this ); - m_generalSettingsWidget->setFixedHeight( 90 ); - - // setup line-edit for changing channel-name - m_instrumentNameLE = new QLineEdit( m_generalSettingsWidget ); - m_instrumentNameLE->setFont( pointSize<8>( - m_instrumentNameLE->font() ) ); - m_instrumentNameLE->setGeometry( 10, 16, 230, 18 ); - connect( m_instrumentNameLE, SIGNAL( textChanged( const QString & ) ), - this, SLOT( textChanged( const QString & ) ) ); - - - // setup volume-knob - m_volumeKnob = new volumeKnob( knobBright_26, m_generalSettingsWidget, - tr( "Channel volume" ) ); - m_volumeKnob->setModel( &m_volumeModel ); - m_volumeKnob->move( 10, 44 ); - m_volumeKnob->setHintText( tr( "Channel volume:" ) + " ", "%" ); - m_volumeKnob->setLabel( tr( "VOLUME" ) ); - - m_volumeKnob->setWhatsThis( tr( volume_help ) ); - //volumeKnob::linkObjects( m_tswVolumeKnob, m_volumeKnob ); - - - // setup surround-area - m_surroundArea = new surroundArea( m_generalSettingsWidget, - tr( "Surround area" ) ); - m_surroundArea->setModel( &m_surroundAreaModel ); - m_surroundArea->move( 20 + m_volumeKnob->width(), 38 ); - m_surroundArea->show(); - m_surroundArea->setWhatsThis( tr( surroundarea_help ) ); - - - // setup spinbox for selecting FX-channel - m_effectChannelNumber = new lcdSpinBox( 2, m_generalSettingsWidget, - tr( "FX channel" ) ); - m_effectChannelNumber->setLabel( tr( "FX CHNL" ) ); - m_effectChannelNumber->move( m_surroundArea->x() + - m_surroundArea->width() + 16, 40 ); - - - m_saveSettingsBtn = new QPushButton( embed::getIconPixmap( - "project_save" ), "", - m_generalSettingsWidget ); - m_saveSettingsBtn->setGeometry( m_effectChannelNumber->x() + - m_effectChannelNumber->width() + 20, 40, - 32, 32 ); - connect( m_saveSettingsBtn, SIGNAL( clicked() ), this, - SLOT( saveSettingsBtnClicked() ) ); - toolTip::add( m_saveSettingsBtn, - tr( "Save current channel settings in a preset-file" ) ); - m_saveSettingsBtn->setWhatsThis( - tr( "Click here, if you want to save current channel settings " - "in a preset-file. Later you can load this preset by " - "double-clicking it in the preset-browser." ) ); - - setName( tr( "Default" ) ); - - m_tabWidget = new tabWidget( "", this ); - m_tabWidget->setFixedHeight( INSTRUMENT_HEIGHT + 12 ); - - - // create other tab-widgets - m_envWidget = new envelopeTabWidget( this ); - m_arpWidget = new arpAndChordsTabWidget( this ); - m_midiWidget = new midiTabWidget( this, m_midiPort ); - m_effectRack = new effectRackView( m_audioPort.getEffects(), - m_tabWidget ); - m_tabWidget->addTab( m_envWidget, tr( "ENV/LFO/FILTER" ), 1 ); - m_tabWidget->addTab( m_arpWidget, tr( "ARP/CHORD" ), 2 ); - m_tabWidget->addTab( m_effectRack, tr( "FX" ), 3 ); - m_tabWidget->addTab( m_midiWidget, tr( "MIDI" ), 4 ); - - // setup piano-widget - m_pianoWidget = new pianoWidget( this ); - m_pianoWidget->setFixedSize( INSTRUMENT_WIDTH, PIANO_HEIGHT ); - - - vlayout->addWidget( m_generalSettingsWidget ); - vlayout->addWidget( m_tabWidget ); - vlayout->addWidget( m_pianoWidget ); - - if( m_midiWidget->m_readablePorts ) - { - m_midiInputAction = m_tswMidiMenu->addMenu( - m_midiWidget->m_readablePorts ); - } - else - { - m_midiInputAction = m_tswMidiMenu->addAction( "" ); - connect( m_midiInputAction, SIGNAL( changed() ), this, - SLOT( midiInSelected() ) ); - } - if( m_midiWidget->m_writeablePorts ) - { - m_midiOutputAction = m_tswMidiMenu->addMenu( - m_midiWidget->m_writeablePorts ); - } - else - { - m_midiOutputAction = m_tswMidiMenu->addAction( "" ); - connect( m_midiOutputAction, SIGNAL( changed() ), this, - SLOT( midiOutSelected() ) ); - } - m_midiInputAction->setText( tr( "MIDI input" ) ); - m_midiOutputAction->setText( tr( "MIDI output" ) ); - if( m_midiWidget->m_readablePorts == NULL || - m_midiWidget->m_writeablePorts == NULL ) - { - connect( m_midiWidget->m_sendCheckBox, - SIGNAL( toggled( bool ) ), - this, SLOT( midiConfigChanged( bool ) ) ); - connect( m_midiWidget->m_receiveCheckBox, - SIGNAL( toggled( bool ) ), - this, SLOT( midiConfigChanged( bool ) ) ); - } - - - // set window-icon - setWindowIcon( embed::getIconPixmap( "instrument_track" ) ); - - - setFixedWidth( INSTRUMENT_WIDTH ); - resize( sizeHint() ); - - if( engine::getMainWindow()->workspace() ) - { - engine::getMainWindow()->workspace()->addSubWindow( this ); - parentWidget()->hide(); - } - else - { - hide(); - } } @@ -327,98 +146,7 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : instrumentTrack::~instrumentTrack() { engine::getMixer()->removePlayHandles( this ); - delete m_effectRack; engine::getMixer()->getMIDIClient()->removePort( m_midiPort ); - - if( engine::getMainWindow()->workspace() ) - { - parentWidget()->hide(); - parentWidget()->deleteLater(); - } -} - - - - -void instrumentTrack::saveSettingsBtnClicked( void ) -{ - QFileDialog sfd( this, tr( "Save channel-settings in file" ), "", - tr( "Channel-Settings-File (*.cs.xml)" ) ); - - QString preset_root = configManager::inst()->userPresetsDir(); - if( !QDir( preset_root ).exists() ) - { - QDir().mkdir( preset_root ); - } - if( !QDir( preset_root + instrumentName() ).exists() ) - { - QDir( preset_root ).mkdir( instrumentName() ); - } - - sfd.setDirectory( preset_root + instrumentName() ); - sfd.setFileMode( QFileDialog::AnyFile ); - if( sfd.exec () == QDialog::Accepted && - !sfd.selectedFiles().isEmpty() && sfd.selectedFiles()[0] != "" - ) - { - multimediaProject mmp( - multimediaProject::INSTRUMENT_TRACK_SETTINGS ); - QDomElement _this = mmp.createElement( nodeName() ); - saveTrackSpecificSettings( mmp, _this ); - mmp.content().appendChild( _this ); - QString f = sfd.selectedFiles()[0]; - mmp.writeFile( f ); - } -} - - - - -void instrumentTrack::activityIndicatorPressed( void ) -{ - processInEvent( midiEvent( NOTE_ON, 0, - DEFAULT_OCTAVE * NOTES_PER_OCTAVE + A, - 127 ), midiTime() ); -} - - - - -void instrumentTrack::activityIndicatorReleased( void ) -{ - processInEvent( midiEvent( NOTE_OFF, 0, - DEFAULT_OCTAVE * NOTES_PER_OCTAVE + A, - 0 ), midiTime() ); -} - - - - -void instrumentTrack::midiInSelected( void ) -{ - m_midiInputAction->setChecked( !m_midiInputAction->isChecked() ); - m_midiWidget->m_receiveCheckBox->setChecked( - m_midiInputAction->isChecked() ); -} - - - -void instrumentTrack::midiOutSelected( void ) -{ - m_midiOutputAction->setChecked( !m_midiOutputAction->isChecked() ); - m_midiWidget->m_sendCheckBox->setChecked( - m_midiOutputAction->isChecked() ); -} - - - - -void instrumentTrack::midiConfigChanged( bool ) -{ - m_midiInputAction->setChecked( - m_midiWidget->m_receiveCheckBox->model()->value() ); - m_midiOutputAction->setChecked( - m_midiWidget->m_sendCheckBox->model()->value() ); } @@ -434,7 +162,7 @@ f_cnt_t instrumentTrack::beatLen( notePlayHandle * _n ) const return( len ); } } - return( m_envWidget->envFrames() ); + return( m_soundShaping.envFrames() ); } @@ -460,14 +188,15 @@ void instrumentTrack::processAudioBuffer( sampleFrame * _buf, // is no problem for us since we just bypass the envelopes+LFOs if( _n != NULL ) { - m_envWidget->processAudioBuffer( _buf, _frames, _n ); + m_soundShaping.processAudioBuffer( _buf, _frames, _n ); v_scale *= ( (float) _n->getVolume() / DEFAULT_VOLUME ); } - volumeVector v = m_surroundArea->model()->getVolumeVector( v_scale ); + volumeVector v = m_surroundAreaModel.getVolumeVector( v_scale ); engine::getMixer()->bufferToPort( _buf, - ( _n != NULL ) ? tMin( _n->framesLeftForCurrentPeriod(), _frames ) : - _frames, + ( _n != NULL ) ? tMin( + _n->framesLeftForCurrentPeriod(), _frames ) : + _frames, ( _n != NULL ) ? _n->offset() : 0, v, &m_audioPort ); } @@ -487,7 +216,7 @@ void instrumentTrack::processInEvent( const midiEvent & _me, if( !configManager::inst()->value( "ui", "manualchannelpiano" ).toInt() ) { - m_pianoWidget->setKeyState( + m_piano.setKeyState( _me.key(), TRUE ); } // create temporary note @@ -586,7 +315,7 @@ void instrumentTrack::processOutEvent( const midiEvent & _me, if( !configManager::inst()->value( "ui", "manualchannelpiano" ).toInt() ) { - m_pianoWidget->setKeyState( _me.key(), TRUE ); + m_piano.setKeyState( _me.key(), TRUE ); } if( !configManager::inst()->value( "ui", "disablechannelactivityindicators" ).toInt() ) @@ -595,7 +324,7 @@ void instrumentTrack::processOutEvent( const midiEvent & _me, { return; } - m_tswActivityIndicator->activate(); + emit newNote(); } break; @@ -603,7 +332,7 @@ void instrumentTrack::processOutEvent( const midiEvent & _me, if( !configManager::inst()->value( "ui", "manualchannelpiano" ).toInt() ) { - m_pianoWidget->setKeyState( _me.key(), FALSE ); + m_piano.setKeyState( _me.key(), FALSE ); } break; @@ -621,7 +350,8 @@ void instrumentTrack::playNote( notePlayHandle * _n, bool _try_parallelizing ) { // arpeggio- and chord-widget has to do its work -> adding sub-notes // for chords/arpeggios - m_arpWidget->processNote( _n ); + m_chordCreator.processNote( _n ); + m_arpeggiator.processNote( _n ); if( _n->arpBaseNote() == FALSE && m_instrument != NULL ) { @@ -729,30 +459,22 @@ void instrumentTrack::deleteNotePluginData( notePlayHandle * _n ) void instrumentTrack::setName( const QString & _new_name ) { - // when changing name of channel, also change name of those patterns, - // which have the same name as the channel + // when changing name of track, also change name of those patterns, + // which have the same name as the instrument-track for( int i = 0; i < numOfTCOs(); ++i ) { pattern * p = dynamic_cast( getTCO( i ) ); - if( ( p != NULL && p->name() == m_name ) || p->name() == "" ) + if( ( p != NULL && p->name() == name() ) || p->name() == "" ) { p->setName( _new_name ); } } - m_name = _new_name; - setWindowTitle( m_name ); + track::setName( _new_name ); + m_midiPort->setName( name() ); + m_audioPort.setName( name() ); - if( m_instrumentNameLE->text() != _new_name ) - { - m_instrumentNameLE->setText( m_name ); - } -#ifdef LMMS_DEBUG - assert( m_tswInstrumentTrackButton != NULL ); -#endif - m_tswInstrumentTrackButton->setText( m_name ); - m_midiPort->setName( m_name ); - m_audioPort.setName( m_name ); + emit nameChanged(); } @@ -781,8 +503,7 @@ void instrumentTrack::updateBaseNote( /* bool _modified*/ void ) int instrumentTrack::masterKey( notePlayHandle * _n ) const { - int key = m_baseNoteModel.value() + - engine::getSongEditor()->masterPitch(); + int key = m_baseNoteModel.value() + engine::getSong()->masterPitch(); return( tLimit( _n->key() - ( key - A - DEFAULT_OCTAVE * NOTES_PER_OCTAVE ), 0, NOTES ) ); } @@ -846,8 +567,7 @@ bool FASTCALL instrumentTrack::play( const midiTime & _start, { cur_start -= p->startPosition(); } - if( p->frozen() && - engine::getSongEditor()->exporting() == FALSE ) + if( p->frozen() && engine::getSong()->exporting() == FALSE ) { if( cur_start > 0 ) { @@ -951,6 +671,14 @@ trackContentObject * instrumentTrack::createTCO( const midiTime & ) +trackView * instrumentTrack::createView( trackContainerView * _tcv ) +{ + return( new instrumentTrackView( this, _tcv ) ); +} + + + + void instrumentTrack::saveTrackSpecificSettings( QDomDocument & _doc, QDomElement & _this ) { @@ -961,18 +689,20 @@ void instrumentTrack::saveTrackSpecificSettings( QDomDocument & _doc, m_effectChannelModel.saveSettings( _doc, _this, "fxch" ); m_baseNoteModel.saveSettings( _doc, _this, "basenote" ); - _this.setAttribute( "tab", m_tabWidget->activeTab() ); - - mainWindow::saveWidgetState( this, _this ); if( m_instrument != NULL ) { m_instrument->saveState( _doc, _this ); } - m_envWidget->saveState( _doc, _this ); - m_arpWidget->saveState( _doc, _this ); - m_midiWidget->saveState( _doc, _this ); + m_soundShaping.saveState( _doc, _this ); + m_chordCreator.saveState( _doc, _this ); + m_arpeggiator.saveState( _doc, _this ); + m_midiIO.saveState( _doc, _this ); m_audioPort.getEffects()->saveState( _doc, _this ); + if( getHook() ) + { + getHook()->saveSettings( _doc, _this ); + } } @@ -1003,33 +733,34 @@ void instrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) m_baseNoteModel.loadSettings( _this, "basenote" ); } - int tab = _this.attribute( "tab" ).toInt(); - - bool had_fx = FALSE; + m_audioPort.getEffects()->deleteAllPlugins(); QDomNode node = _this.firstChild(); while( !node.isNull() ) { if( node.isElement() ) { - if( m_envWidget->nodeName() == node.nodeName() ) + if( m_soundShaping.nodeName() == node.nodeName() ) { - m_envWidget->restoreState( node.toElement() ); + m_soundShaping.restoreState( node.toElement() ); } - else if( m_arpWidget->nodeName() == node.nodeName() ) + else if( m_chordCreator.nodeName() == node.nodeName() ) { - m_arpWidget->restoreState( node.toElement() ); + m_chordCreator.restoreState( node.toElement() ); } - else if( m_midiWidget->nodeName() == node.nodeName() ) + else if( m_arpeggiator.nodeName() == node.nodeName() ) { - m_midiWidget->restoreState( node.toElement() ); + m_arpeggiator.restoreState( node.toElement() ); + } + else if( m_midiIO.nodeName() == node.nodeName() ) + { + m_midiIO.restoreState( node.toElement() ); } else if( m_audioPort.getEffects()->nodeName() == node.nodeName() ) { m_audioPort.getEffects()->restoreState( node.toElement() ); - had_fx = TRUE; } else if( automationPattern::classNodeName() != node.nodeName() ) @@ -1037,7 +768,6 @@ void instrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) // if node-name doesn't match any known one, // we assume that it is an instrument-plugin // which we'll try to load - delete m_instrumentView; delete m_instrument; m_instrument = instrument::instantiate( node.nodeName(), this ); @@ -1047,29 +777,15 @@ void instrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) m_instrument->restoreState( node.toElement() ); } - m_instrumentView = m_instrument-> - createView( m_tabWidget ); - m_tabWidget->addTab( m_instrumentView, - tr( "PLUGIN" ), 0 ); } } node = node.nextSibling(); } - // TODO: why not move above without any condition?? - if( !had_fx ) - { - m_audioPort.getEffects()->deleteAllPlugins(); - } engine::getMixer()->unlock(); - m_tabWidget->setActiveTab( tab ); - - m_pianoWidget->update(); - - mainWindow::restoreWidgetState( this, _this ); - if( isVisible() == TRUE ) + if( getHook() ) { - m_tswInstrumentTrackButton->setChecked( TRUE ); + getHook()->loadSettings( _this ); } } @@ -1081,16 +797,11 @@ instrument * instrumentTrack::loadInstrument( const QString & _plugin_name ) invalidateAllMyNPH(); engine::getMixer()->lock(); - delete m_instrumentView; delete m_instrument; m_instrument = instrument::instantiate( _plugin_name, this ); engine::getMixer()->unlock(); - m_instrumentView = m_instrument->createView( m_tabWidget ); - m_tabWidget->addTab( m_instrumentView, tr( "PLUGIN" ), 0 ); - m_tabWidget->setActiveTab( 0 ); - - m_tswInstrumentTrackButton->update(); + emit instrumentChanged(); return( m_instrument ); } @@ -1098,20 +809,434 @@ instrument * instrumentTrack::loadInstrument( const QString & _plugin_name ) -void instrumentTrack::textChanged( const QString & _new_name ) +void instrumentTrack::invalidateAllMyNPH( void ) { - setName( _new_name ); - engine::getSongEditor()->setModified(); + engine::getMixer()->lock(); + for( int i = 0; i < NOTES; ++i ) + { + m_notes[i] = NULL; + } + + // invalidate all note-play-handles linked to this channel + m_processHandles.clear(); + engine::getMixer()->removePlayHandles( this ); + engine::getMixer()->unlock(); } -void instrumentTrack::toggledInstrumentTrackButton( bool _on ) + +// #### ITV: + +instrumentTrackView::instrumentTrackView( instrumentTrack * _it, + trackContainerView * _tcv ) : + trackView( _it, _tcv ) { - if( m_tswInstrumentTrackButton->isChecked() != _on ) + setAcceptDrops( TRUE ); + setFixedHeight( 32 ); + + // creation of widgets for track-settings-widget + m_tswVolumeKnob = new volumeKnob( knobSmall_17, + getTrackSettingsWidget(), + tr( "Volume" ) ); + m_tswVolumeKnob->setModel( &_it->m_volumeModel ); + m_tswVolumeKnob->setHintText( tr( "Volume:" ) + " ", "%" ); + m_tswVolumeKnob->move( 4, 4 ); + m_tswVolumeKnob->setLabel( tr( "VOL" ) ); + m_tswVolumeKnob->show(); + m_tswVolumeKnob->setWhatsThis( tr( volume_help ) ); + + QPushButton * tsw_midi = new QPushButton( + embed::getIconPixmap( "piano" ), QString::null, + getTrackSettingsWidget() ); + tsw_midi->setGeometry( 32, 2, 28, 28 ); + tsw_midi->show(); + toolTip::add( tsw_midi, tr( "MIDI input/output" ) ); + m_tswMidiMenu = new QMenu( tsw_midi ); + tsw_midi->setMenu( m_tswMidiMenu ); + + + m_tswActivityIndicator = new fadeButton( QColor( 96, 96, 96 ), + QColor( 255, 204, 0 ), + getTrackSettingsWidget() ); + m_tswActivityIndicator->setGeometry( 212, 2, 8, 28 ); + m_tswActivityIndicator->show(); + connect( m_tswActivityIndicator, SIGNAL( pressed( void ) ), + this, SLOT( activityIndicatorPressed() ) ); + connect( m_tswActivityIndicator, SIGNAL( released( void ) ), + this, SLOT( activityIndicatorReleased() ) ); + + + m_tswInstrumentTrackButton = new instrumentTrackButton( this ); + m_tswInstrumentTrackButton->setCheckable( TRUE ); + m_tswInstrumentTrackButton->setGeometry( 64, 2, 144, 28 ); + m_tswInstrumentTrackButton->show(); + +/* if( m_midiWidget->m_readablePorts ) { - m_tswInstrumentTrackButton->setChecked( _on ); + m_midiInputAction = m_tswMidiMenu->addMenu( + m_midiWidget->m_readablePorts ); + } + else + { + m_midiInputAction = m_tswMidiMenu->addAction( "" ); + connect( m_midiInputAction, SIGNAL( changed() ), this, + SLOT( midiInSelected() ) ); + } + if( m_midiWidget->m_writeablePorts ) + { + m_midiOutputAction = m_tswMidiMenu->addMenu( + m_midiWidget->m_writeablePorts ); + } + else + { + m_midiOutputAction = m_tswMidiMenu->addAction( "" ); + connect( m_midiOutputAction, SIGNAL( changed() ), this, + SLOT( midiOutSelected() ) ); + } + m_midiInputAction->setText( tr( "MIDI input" ) ); + m_midiOutputAction->setText( tr( "MIDI output" ) ); + if( m_midiWidget->m_readablePorts == NULL || + m_midiWidget->m_writeablePorts == NULL ) + { + connect( m_midiWidget->m_sendCheckBox, + SIGNAL( toggled( bool ) ), + this, SLOT( midiConfigChanged( bool ) ) ); + connect( m_midiWidget->m_receiveCheckBox, + SIGNAL( toggled( bool ) ), + this, SLOT( midiConfigChanged( bool ) ) ); + }*/ + + setModel( _it ); + + m_window = new instrumentTrackWindow( this ); + connect( m_tswInstrumentTrackButton, SIGNAL( toggled( bool ) ), + m_window, SLOT( toggledInstrumentTrackButton( bool ) ) ); + +} + + + + +instrumentTrackView::~instrumentTrackView() +{ + delete m_window; +} + + + + +void instrumentTrackView::activityIndicatorPressed( void ) +{ + model()->processInEvent( midiEvent( NOTE_ON, 0, + DEFAULT_OCTAVE * NOTES_PER_OCTAVE + A, + 127 ), midiTime() ); +} + + + + +void instrumentTrackView::activityIndicatorReleased( void ) +{ + model()->processInEvent( midiEvent( NOTE_OFF, 0, + DEFAULT_OCTAVE * NOTES_PER_OCTAVE + A, + 0 ), midiTime() ); +} + + + + + +void instrumentTrackView::updateName( void ) +{ +#ifdef LMMS_DEBUG + assert( m_tswInstrumentTrackButton != NULL ); +#endif + m_tswInstrumentTrackButton->setText( model()->name() ); +} + + + + + + + +// #### ITW: +instrumentTrackWindow::instrumentTrackWindow( instrumentTrackView * _itv ) : + QWidget(), + modelView( NULL ), + m_track( _itv->model() ), + m_itv( _itv ), + m_instrumentView( NULL ), + m_midiInputAction( NULL ), + m_midiOutputAction( NULL ) +{ + setAcceptDrops( TRUE ); + + // init own layout + widgets + setFocusPolicy( Qt::StrongFocus ); + QVBoxLayout * vlayout = new QVBoxLayout( this ); + vlayout->setMargin( 0 ); + vlayout->setSpacing( 0 ); + + m_generalSettingsWidget = new tabWidget( tr( "GENERAL SETTINGS" ), + this ); + m_generalSettingsWidget->setFixedHeight( 90 ); + + // setup line-edit for changing channel-name + m_instrumentNameLE = new QLineEdit( m_generalSettingsWidget ); + m_instrumentNameLE->setFont( pointSize<8>( + m_instrumentNameLE->font() ) ); + m_instrumentNameLE->setGeometry( 10, 16, 230, 18 ); + connect( m_instrumentNameLE, SIGNAL( textChanged( const QString & ) ), + this, SLOT( textChanged( const QString & ) ) ); + + + // setup volume-knob + m_volumeKnob = new volumeKnob( knobBright_26, m_generalSettingsWidget, + tr( "Channel volume" ) ); + m_volumeKnob->move( 10, 44 ); + m_volumeKnob->setHintText( tr( "Channel volume:" ) + " ", "%" ); + m_volumeKnob->setLabel( tr( "VOLUME" ) ); + + m_volumeKnob->setWhatsThis( tr( volume_help ) ); + + + // setup surround-area + m_surroundArea = new surroundArea( m_generalSettingsWidget, + tr( "Surround area" ) ); + m_surroundArea->move( 20 + m_volumeKnob->width(), 38 ); + m_surroundArea->show(); + m_surroundArea->setWhatsThis( tr( surroundarea_help ) ); + + + // setup spinbox for selecting FX-channel + m_effectChannelNumber = new lcdSpinBox( 2, m_generalSettingsWidget, + tr( "FX channel" ) ); + m_effectChannelNumber->setLabel( tr( "FX CHNL" ) ); + m_effectChannelNumber->move( m_surroundArea->x() + + m_surroundArea->width() + 16, 40 ); + + + m_saveSettingsBtn = new QPushButton( embed::getIconPixmap( + "project_save" ), "", + m_generalSettingsWidget ); + m_saveSettingsBtn->setGeometry( m_effectChannelNumber->x() + + m_effectChannelNumber->width() + 20, 40, + 32, 32 ); + connect( m_saveSettingsBtn, SIGNAL( clicked() ), this, + SLOT( saveSettingsBtnClicked() ) ); + toolTip::add( m_saveSettingsBtn, + tr( "Save current channel settings in a preset-file" ) ); + m_saveSettingsBtn->setWhatsThis( + tr( "Click here, if you want to save current channel settings " + "in a preset-file. Later you can load this preset by " + "double-clicking it in the preset-browser." ) ); + + + m_tabWidget = new tabWidget( "", this ); + m_tabWidget->setFixedHeight( INSTRUMENT_HEIGHT + 12 ); + + + // create tab-widgets + m_ssView = new instrumentSoundShapingView( m_tabWidget ); + QWidget * instrument_functions = new QWidget( m_tabWidget ); + m_chordView = new chordCreatorView( &m_track->m_chordCreator, + instrument_functions ); + m_arpView= new arpeggiatorView( &m_track->m_arpeggiator, + instrument_functions ); + m_midiView = new instrumentMidiIOView( m_tabWidget ); + m_effectView = new effectRackView( m_track->m_audioPort.getEffects(), + m_tabWidget ); + m_tabWidget->addTab( m_ssView, tr( "ENV/LFO" ), 1 ); + m_tabWidget->addTab( instrument_functions, tr( "FUNC" ), 2 ); + m_tabWidget->addTab( m_effectView, tr( "FX" ), 3 ); + m_tabWidget->addTab( m_midiView, tr( "MIDI" ), 4 ); + + // setup piano-widget + m_pianoView= new pianoView( this ); + m_pianoView->setFixedSize( INSTRUMENT_WIDTH, PIANO_HEIGHT ); + + vlayout->addWidget( m_generalSettingsWidget ); + vlayout->addWidget( m_tabWidget ); + vlayout->addWidget( m_pianoView ); + + if( m_midiView->m_readablePorts ) + { + m_midiInputAction = m_itv->m_tswMidiMenu->addMenu( + m_midiView->m_readablePorts ); + } + else + { + m_midiInputAction = m_itv->m_tswMidiMenu->addAction( "" ); + connect( m_midiInputAction, SIGNAL( changed() ), this, + SLOT( midiInSelected() ) ); + } + if( m_midiView->m_writeablePorts ) + { + m_midiOutputAction = m_itv->m_tswMidiMenu->addMenu( + m_midiView->m_writeablePorts ); + } + else + { + m_midiOutputAction = m_itv->m_tswMidiMenu->addAction( "" ); + connect( m_midiOutputAction, SIGNAL( changed() ), this, + SLOT( midiOutSelected() ) ); + } + m_midiInputAction->setText( tr( "MIDI input" ) ); + m_midiOutputAction->setText( tr( "MIDI output" ) ); + if( m_midiView->m_readablePorts == NULL || + m_midiView->m_writeablePorts == NULL ) + { + connect( m_midiView->m_sendCheckBox, + SIGNAL( toggled( bool ) ), + this, SLOT( midiConfigChanged( bool ) ) ); + connect( m_midiView->m_receiveCheckBox, + SIGNAL( toggled( bool ) ), + this, SLOT( midiConfigChanged( bool ) ) ); + } + + setModel( _itv->model() ); + + // set window-icon + setWindowIcon( embed::getIconPixmap( "instrument_track" ) ); + + updateInstrumentView(); + + setFixedWidth( INSTRUMENT_WIDTH ); + resize( sizeHint() ); + + if( engine::getMainWindow()->workspace() ) + { + engine::getMainWindow()->workspace()->addSubWindow( this ); + parentWidget()->hide(); + } + else + { + hide(); + } +} + + + + +instrumentTrackWindow::~instrumentTrackWindow() +{ + if( engine::getMainWindow()->workspace() ) + { + parentWidget()->hide(); + parentWidget()->deleteLater(); + } +} + + + + +void instrumentTrackWindow::modelChanged( void ) +{ + m_track = m_itv->model(); + + m_instrumentNameLE->setText( m_track->name() ); + connect( m_track, SIGNAL( nameChanged() ), + this, SLOT( updateName() ) ); + connect( m_track, SIGNAL( instrumentChanged() ), + this, SLOT( updateInstrumentView() ), + Qt::QueuedConnection ); + m_volumeKnob->setModel( &m_track->m_volumeModel ); + m_surroundArea->setModel( &m_track->m_surroundAreaModel ); + m_pianoView->setModel( &m_track->m_piano ); + + m_ssView->setModel( &m_track->m_soundShaping ); + m_chordView->setModel( &m_track->m_chordCreator ); + m_arpView->setModel( &m_track->m_arpeggiator ); + m_midiView->setModel( &m_track->m_midiIO ); + updateName(); +} + + + + +void instrumentTrackWindow::saveSettingsBtnClicked( void ) +{ + QFileDialog sfd( this, tr( "Save channel-settings in file" ), "", + tr( "Channel-Settings-File (*.cs.xml)" ) ); + + QString preset_root = configManager::inst()->userPresetsDir(); + if( !QDir( preset_root ).exists() ) + { + QDir().mkdir( preset_root ); + } + if( !QDir( preset_root + m_track->instrumentName() ).exists() ) + { + QDir( preset_root ).mkdir( m_track->instrumentName() ); + } + + sfd.setDirectory( preset_root + m_track->instrumentName() ); + sfd.setFileMode( QFileDialog::AnyFile ); + if( sfd.exec () == QDialog::Accepted && + !sfd.selectedFiles().isEmpty() && sfd.selectedFiles()[0] != "" + ) + { + multimediaProject mmp( + multimediaProject::InstrumentTrackSettings ); + QDomElement _this = mmp.createElement( m_track->nodeName() ); + m_track->saveTrackSpecificSettings( mmp, _this ); + mmp.content().appendChild( _this ); + QString f = sfd.selectedFiles()[0]; + mmp.writeFile( f ); + } +} + + + + + +void instrumentTrackWindow::updateName( void ) +{ + setWindowTitle( m_track->name() ); + + if( m_instrumentNameLE->text() != m_track->name() ) + { + m_instrumentNameLE->setText( m_track->name() ); + } +} + + + + + +void instrumentTrackWindow::updateInstrumentView( void ) +{ + delete m_instrumentView; + if( m_track->m_instrument != NULL ) + { + m_instrumentView = m_track->m_instrument->createView( + m_tabWidget ); + m_tabWidget->addTab( m_instrumentView, tr( "PLUGIN" ), 0 ); + m_tabWidget->setActiveTab( 0 ); + } + +// m_tswInstrumentTrackButton->update(); +} + + + + +void instrumentTrackWindow::textChanged( const QString & _new_name ) +{ + m_track->setName( _new_name ); + engine::getSong()->setModified(); +} + + + + +void instrumentTrackWindow::toggledInstrumentTrackButton( bool _on ) +{ + if( m_itv->m_tswInstrumentTrackButton->isChecked() != _on ) + { + m_itv->m_tswInstrumentTrackButton->setChecked( _on ); } if( _on ) { @@ -1143,7 +1268,7 @@ void instrumentTrack::toggledInstrumentTrackButton( bool _on ) -void instrumentTrack::closeEvent( QCloseEvent * _ce ) +void instrumentTrackWindow::closeEvent( QCloseEvent * _ce ) { _ce->ignore(); if( engine::getMainWindow()->workspace() ) @@ -1154,21 +1279,21 @@ void instrumentTrack::closeEvent( QCloseEvent * _ce ) { hide(); } - m_tswInstrumentTrackButton->setChecked( FALSE ); + m_itv->m_tswInstrumentTrackButton->setChecked( FALSE ); } -void instrumentTrack::focusInEvent( QFocusEvent * ) +void instrumentTrackWindow::focusInEvent( QFocusEvent * ) { - m_pianoWidget->setFocus(); + m_pianoView->setFocus(); } -void instrumentTrack::dragEnterEvent( QDragEnterEvent * _dee ) +void instrumentTrackWindow::dragEnterEvent( QDragEnterEvent * _dee ) { stringPairDrag::processDragEnterEvent( _dee, "instrument,presetfile" ); } @@ -1176,22 +1301,22 @@ void instrumentTrack::dragEnterEvent( QDragEnterEvent * _dee ) -void instrumentTrack::dropEvent( QDropEvent * _de ) +void instrumentTrackWindow::dropEvent( QDropEvent * _de ) { QString type = stringPairDrag::decodeKey( _de ); QString value = stringPairDrag::decodeValue( _de ); if( type == "instrument" ) { - loadInstrument( value ); - engine::getSongEditor()->setModified(); + m_track->loadInstrument( value ); + engine::getSong()->setModified(); _de->accept(); } else if( type == "presetfile" ) { multimediaProject mmp( value ); - loadTrackSpecificSettings( mmp.content().firstChild(). + m_track->loadTrackSpecificSettings( mmp.content().firstChild(). toElement() ); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); _de->accept(); } } @@ -1199,18 +1324,53 @@ void instrumentTrack::dropEvent( QDropEvent * _de ) -void instrumentTrack::invalidateAllMyNPH( void ) +void instrumentTrackWindow::saveSettings( QDomDocument & _doc, + QDomElement & _this ) { - engine::getMixer()->lock(); - for( int i = 0; i < NOTES; ++i ) - { - m_notes[i] = NULL; - } + _this.setAttribute( "tab", m_tabWidget->activeTab() ); + mainWindow::saveWidgetState( this, _this ); +} - // invalidate all note-play-handles linked to this channel - m_processHandles.clear(); - engine::getMixer()->removePlayHandles( this ); - engine::getMixer()->unlock(); + + + +void instrumentTrackWindow::loadSettings( const QDomElement & _this ) +{ + m_tabWidget->setActiveTab( _this.attribute( "tab" ).toInt() ); + mainWindow::restoreWidgetState( this, _this ); + if( isVisible() ) + { + m_itv->m_tswInstrumentTrackButton->setChecked( TRUE ); + } +} + + + +void instrumentTrackWindow::midiInSelected( void ) +{ + m_midiInputAction->setChecked( !m_midiInputAction->isChecked() ); + m_midiView->m_receiveCheckBox->setChecked( + m_midiInputAction->isChecked() ); +} + + + +void instrumentTrackWindow::midiOutSelected( void ) +{ + m_midiOutputAction->setChecked( !m_midiOutputAction->isChecked() ); + m_midiView->m_sendCheckBox->setChecked( + m_midiOutputAction->isChecked() ); +} + + + + +void instrumentTrackWindow::midiConfigChanged( bool ) +{ + m_midiInputAction->setChecked( + m_midiView->m_receiveCheckBox->model()->value() ); + m_midiOutputAction->setChecked( + m_midiView->m_sendCheckBox->model()->value() ); } @@ -1218,13 +1378,9 @@ void instrumentTrack::invalidateAllMyNPH( void ) - - - -instrumentTrackButton::instrumentTrackButton( instrumentTrack * - _instrument_track ) : - QPushButton( _instrument_track->getTrackSettingsWidget() ), - m_instrumentTrack( _instrument_track ) +instrumentTrackButton::instrumentTrackButton( instrumentTrackView * _itv ) : + QPushButton( _itv->getTrackSettingsWidget() ), + m_instrumentTrackView( _itv ) { setAcceptDrops( TRUE ); } @@ -1239,19 +1395,22 @@ instrumentTrackButton::~instrumentTrackButton() -void instrumentTrackButton::drawButtonLabel( QPainter * _p ) +void instrumentTrackButton::paintEvent( QPaintEvent * _pe ) { - QString in = m_instrumentTrack->instrumentName() + ":"; + QPushButton::paintEvent( _pe ); + QPainter p( this ); + const QString in = m_instrumentTrackView->model()->instrumentName() + + ":"; + const QString n = m_instrumentTrackView->model()->name(); int extra = isChecked() ? -1 : -3; - _p->setFont( pointSize<7>( _p->font() ) ); - _p->setPen( QApplication::palette().buttonText().color() ); - _p->drawText( ( width() - QFontMetrics( _p->font() ).width( in ) ) / 2 + + p.setFont( pointSize<7>( p.font() ) ); + p.setPen( QApplication::palette().buttonText().color() ); + p.drawText( ( width() - QFontMetrics( p.font() ).width( in ) ) / 2 + extra, height() / 2 + extra, in ); - _p->setPen( QColor( 0, 0, 0 ) ); - _p->drawText( ( width() - QFontMetrics( _p->font() ).width( text() ) ) / + p.setPen( QColor( 0, 0, 0 ) ); + p.drawText( ( width() - QFontMetrics( p.font() ).width( n ) ) / 2 + extra, height() / 2 + - QFontMetrics( _p->font() ).height() + extra, - text() ); + QFontMetrics( p.font() ).height() + extra, n ); } @@ -1259,7 +1418,7 @@ void instrumentTrackButton::drawButtonLabel( QPainter * _p ) void instrumentTrackButton::dragEnterEvent( QDragEnterEvent * _dee ) { - m_instrumentTrack->dragEnterEvent( _dee ); + m_instrumentTrackView->m_window->dragEnterEvent( _dee ); } @@ -1267,12 +1426,13 @@ void instrumentTrackButton::dragEnterEvent( QDragEnterEvent * _dee ) void instrumentTrackButton::dropEvent( QDropEvent * _de ) { - m_instrumentTrack->dropEvent( _de ); + m_instrumentTrackView->m_window->dropEvent( _de ); setChecked( TRUE ); } + #include "instrument_track.moc" diff --git a/src/tracks/pattern.cpp b/src/tracks/pattern.cpp index c2ea2abf3..ddad35a4b 100644 --- a/src/tracks/pattern.cpp +++ b/src/tracks/pattern.cpp @@ -3,7 +3,7 @@ /* * pattern.cpp - implementation of class pattern which holds notes * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * Copyright (c) 2005-2007 Danny McRae * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -46,27 +47,25 @@ #include "rename_dialog.h" #include "sample_buffer.h" #include "audio_sample_recorder.h" -#include "song_editor.h" +#include "song.h" #include "tooltip.h" #include "bb_editor.h" #include "string_pair_drag.h" #include "main_window.h" -QPixmap * pattern::s_stepBtnOn = NULL; -QPixmap * pattern::s_stepBtnOverlay = NULL; -QPixmap * pattern::s_stepBtnOff = NULL; -QPixmap * pattern::s_stepBtnOffLight = NULL; -QPixmap * pattern::s_frozen = NULL; +QPixmap * patternView::s_stepBtnOn = NULL; +QPixmap * patternView::s_stepBtnOverlay = NULL; +QPixmap * patternView::s_stepBtnOff = NULL; +QPixmap * patternView::s_stepBtnOffLight = NULL; +QPixmap * patternView::s_frozen = NULL; -pattern::pattern ( instrumentTrack * _instrument_track ) : +pattern::pattern( instrumentTrack * _instrument_track ) : trackContentObject( _instrument_track ), - m_paintPixmap(), - m_needsUpdate( TRUE ), m_instrumentTrack( _instrument_track ), - m_patternType( BEAT_PATTERN ), + m_patternType( BeatPattern ), m_name( _instrument_track->name() ), m_steps( DEFAULT_STEPS_PER_TACT ), m_frozenPattern( NULL ), @@ -81,8 +80,6 @@ pattern::pattern ( instrumentTrack * _instrument_track ) : pattern::pattern( const pattern & _pat_to_copy ) : trackContentObject( _pat_to_copy.m_instrumentTrack ), - m_paintPixmap(), - m_needsUpdate( TRUE ), m_instrumentTrack( _pat_to_copy.m_instrumentTrack ), m_patternType( _pat_to_copy.m_patternType ), m_name( "" ), @@ -104,19 +101,6 @@ pattern::pattern( const pattern & _pat_to_copy ) : pattern::~pattern() { - if( engine::getPianoRoll()->currentPattern() == this ) - { - engine::getPianoRoll()->setCurrentPattern( NULL ); - // we have to have the song-editor to stop playing if it played - // us before - if( engine::getSongEditor()->playing() && - engine::getSongEditor()->playMode() == - songEditor::PLAY_PATTERN ) - { - engine::getSongEditor()->playPattern( NULL ); - } - } - for( noteVector::iterator it = m_notes.begin(); it != m_notes.end(); ++it ) { @@ -136,48 +120,12 @@ pattern::~pattern() void pattern::init( void ) { - if( s_stepBtnOn == NULL ) - { - s_stepBtnOn = new QPixmap( embed::getIconPixmap( - "step_btn_on_100" ) ); - } - - if( s_stepBtnOverlay == NULL ) - { - s_stepBtnOverlay = new QPixmap( embed::getIconPixmap( - "step_btn_on_yellow" ) ); - } - - if( s_stepBtnOff == NULL ) - { - s_stepBtnOff = new QPixmap( embed::getIconPixmap( - "step_btn_off" ) ); - } - - if( s_stepBtnOffLight == NULL ) - { - s_stepBtnOffLight = new QPixmap( embed::getIconPixmap( - "step_btn_off_light" ) ); - } - - if( s_frozen == NULL ) - { - s_frozen = new QPixmap( embed::getIconPixmap( "frozen" ) ); - } - saveJournallingState( FALSE ); ensureBeatNotes(); changeLength( length() ); restoreJournallingState(); - - setFixedHeight( parentWidget()->height() - 2 ); - setAutoResizeEnabled( FALSE ); - - toolTip::add( this, - tr( "double-click to open this pattern in piano-roll\n" - "use mouse wheel to set volume of a step" ) ); } @@ -185,7 +133,7 @@ void pattern::init( void ) midiTime pattern::length( void ) const { - if( m_patternType == BEAT_PATTERN ) + if( m_patternType == BeatPattern ) { if( m_steps % DEFAULT_STEPS_PER_TACT == 0 ) { @@ -217,7 +165,7 @@ midiTime pattern::length( void ) const note * pattern::addNote( const note & _new_note, const bool _quant_pos ) { note * new_note = new note( _new_note ); - if( _quant_pos ) + if( _quant_pos && engine::getPianoRoll() ) { new_note->quantizePos( engine::getPianoRoll()->quantization() ); } @@ -248,9 +196,10 @@ note * pattern::addNote( const note & _new_note, const bool _quant_pos ) engine::getMixer()->unlock(); checkType(); - update(); changeLength( length() ); + emit dataChanged(); + updateBBTrack(); return( new_note ); @@ -276,9 +225,10 @@ void pattern::removeNote( const note * _note_to_del ) engine::getMixer()->unlock(); checkType(); - update(); changeLength( length() ); + emit dataChanged(); + updateBBTrack(); } @@ -311,20 +261,16 @@ void pattern::clearNotes( void ) engine::getMixer()->unlock(); checkType(); - update(); - if( engine::getPianoRoll()->currentPattern() == this ) - { - engine::getPianoRoll()->update(); - } + emit dataChanged(); } -void pattern::setType( patternTypes _new_pattern_type ) +void pattern::setType( PatternTypes _new_pattern_type ) { - if( _new_pattern_type == BEAT_PATTERN || - _new_pattern_type == MELODY_PATTERN ) + if( _new_pattern_type == BeatPattern || + _new_pattern_type == MelodyPattern ) { m_patternType = _new_pattern_type; } @@ -340,12 +286,12 @@ void pattern::checkType( void ) { if( ( *it )->length() > 0 ) { - setType( pattern::MELODY_PATTERN ); + setType( pattern::MelodyPattern ); return; } ++it; } - setType( pattern::BEAT_PATTERN ); + setType( pattern::BeatPattern ); } @@ -390,7 +336,7 @@ void pattern::loadSettings( const QDomElement & _this ) { unfreeze(); - m_patternType = static_cast( _this.attribute( "type" + m_patternType = static_cast( _this.attribute( "type" ).toInt() ); m_name = _this.attribute( "name" ); if( _this.attribute( "pos" ).toInt() >= 0 ) @@ -430,39 +376,14 @@ void pattern::loadSettings( const QDomElement & _this ) { freeze(); }*/ - update(); + + emit dataChanged(); + updateBBTrack(); } -void pattern::update( void ) -{ - m_needsUpdate = TRUE; - changeLength( length() ); - trackContentObject::update(); -} - - - - -void pattern::openInPianoRoll( void ) -{ - openInPianoRoll( FALSE ); -} - - - - -void pattern::openInPianoRoll( bool ) -{ - engine::getPianoRoll()->setCurrentPattern( this ); - engine::getPianoRoll()->parentWidget()->show(); - engine::getPianoRoll()->setFocus(); -} - - - void pattern::clear( void ) { @@ -473,26 +394,9 @@ void pattern::clear( void ) -void pattern::resetName( void ) -{ - m_name = m_instrumentTrack->name(); -} - - - - -void pattern::changeName( void ) -{ - renameDialog rename_dlg( m_name ); - rename_dlg.exec(); -} - - - - void pattern::freeze( void ) { - if( engine::getSongEditor()->playing() ) + if( engine::getSong()->playing() ) { QMessageBox::information( 0, tr( "Cannot freeze pattern" ), tr( "The pattern currently " @@ -524,7 +428,7 @@ void pattern::unfreeze( void ) { sharedObject::unref( m_frozenPattern ); m_frozenPattern = NULL; - update(); + emit dataChanged(); } } @@ -539,28 +443,11 @@ void pattern::abortFreeze( void ) -void pattern::addSteps( QAction * _item ) -{ - addSteps( _item->text().toInt() ); -} - - - - -void pattern::removeSteps( QAction * _item ) -{ - removeSteps( _item->text().toInt() ); -} - - - - - void pattern::addSteps( int _n ) { m_steps += _n; ensureBeatNotes(); - update(); + emit dataChanged(); } @@ -584,409 +471,21 @@ void pattern::removeSteps( int _n ) } } m_steps -= _n; - update(); + emit dataChanged(); } } -void pattern::constructContextMenu( QMenu * _cm ) +trackContentObjectView * pattern::createView( trackView * _tv ) { - QAction * a = new QAction( embed::getIconPixmap( "piano" ), - tr( "Open in piano-roll" ), _cm ); - _cm->insertAction( _cm->actions()[0], a ); - connect( a, SIGNAL( triggered( bool ) ), this, - SLOT( openInPianoRoll( bool ) ) ); - _cm->insertSeparator( _cm->actions()[1] ); - - _cm->addSeparator(); - - _cm->addAction( embed::getIconPixmap( "edit_erase" ), - tr( "Clear all notes" ), this, SLOT( clear() ) ); - _cm->addSeparator(); - - _cm->addAction( embed::getIconPixmap( "reload" ), tr( "Reset name" ), - this, SLOT( resetName() ) ); - _cm->addAction( embed::getIconPixmap( "rename" ), tr( "Change name" ), - this, SLOT( changeName() ) ); - _cm->addSeparator(); - - bool freeze_separator = FALSE; - if( !( m_instrumentTrack->muted() || muted() ) ) - { - _cm->addAction( embed::getIconPixmap( "freeze" ), - m_frozenPattern ? tr( "Refreeze" ) : tr( "Freeze" ), - this, SLOT( freeze() ) ); - freeze_separator = TRUE; - } - if( m_frozenPattern ) - { - _cm->addAction( embed::getIconPixmap( "unfreeze" ), - tr( "Unfreeze" ), this, SLOT( unfreeze() ) ); - freeze_separator = TRUE; - } - if( freeze_separator ) - { - _cm->addSeparator(); - } - - QMenu * add_step_menu = _cm->addMenu( - embed::getIconPixmap( "step_btn_add" ), - tr( "Add steps" ) ); - QMenu * remove_step_menu = _cm->addMenu( - embed::getIconPixmap( "step_btn_remove" ), - tr( "Remove steps" ) ); - connect( add_step_menu, SIGNAL( triggered( QAction * ) ), - this, SLOT( addSteps( QAction * ) ) ); - connect( remove_step_menu, SIGNAL( triggered( QAction * ) ), - this, SLOT( removeSteps( QAction * ) ) ); - for( int i = 1; i <= 16; i *= 2 ) - { - const QString label = ( i == 1 ) ? - tr( "1 step" ) : - tr( "%1 steps" ).arg( i ); - add_step_menu->addAction( label ); - remove_step_menu->addAction( label ); - } + return( new patternView( this, _tv ) ); } -void pattern::mouseDoubleClickEvent( QMouseEvent * _me ) -{ - if( _me->button() != Qt::LeftButton ) - { - _me->ignore(); - return; - } - if( m_patternType == pattern::MELODY_PATTERN || - !( m_patternType == pattern::BEAT_PATTERN && - ( pixelsPerTact() >= 192 || - m_steps != DEFAULT_STEPS_PER_TACT ) && - _me->y() > height() - s_stepBtnOff->height() ) ) - { - openInPianoRoll(); - } -} - - - - -void pattern::mousePressEvent( QMouseEvent * _me ) -{ - if( _me->button() == Qt::LeftButton && - m_patternType == pattern::BEAT_PATTERN && - ( fixedTCOs() || pixelsPerTact() >= 192 || - m_steps != DEFAULT_STEPS_PER_TACT ) && - _me->y() > height() - s_stepBtnOff->height() ) - { - int step = ( _me->x() - TCO_BORDER_WIDTH ) * - length() / BEATS_PER_TACT / width(); - if( step >= m_steps ) - { - return; - } - note * n = m_notes[step]; - if( n->length() < 0 ) - { - n->setLength( 0 ); - } - else - { - n->setLength( -64 ); - } - engine::getSongEditor()->setModified(); - update(); - if( engine::getPianoRoll()->currentPattern() == this ) - { - engine::getPianoRoll()->update(); - } - } - else if( m_frozenPattern != NULL && _me->button() == Qt::LeftButton && - engine::getMainWindow()->isShiftPressed() == TRUE ) - { - QString s; - new stringPairDrag( "sampledata", - m_frozenPattern->toBase64( s ), - embed::getIconPixmap( "freeze" ), - this ); - } - else - { - trackContentObject::mousePressEvent( _me ); - } -} - - - - -void pattern::wheelEvent( QWheelEvent * _we ) -{ - if( m_patternType == pattern::BEAT_PATTERN && - ( fixedTCOs() || pixelsPerTact() >= 192 || - m_steps != DEFAULT_STEPS_PER_TACT ) && - _we->y() > height() - s_stepBtnOff->height() ) - { - int step = ( _we->x() - TCO_BORDER_WIDTH ) * - length() / BEATS_PER_TACT / width(); - if( step >= m_steps ) - { - return; - } - note * n = m_notes[step]; - Uint8 vol = n->getVolume(); - - if( n->length() == 0 && _we->delta() > 0 ) - { - n->setLength( -64 ); - n->setVolume( 5 ); - } - else if( _we->delta() > 0 ) - { - if( vol < 95 ) - { - n->setVolume( vol + 5 ); - } - } - else - { - if( vol > 5 ) - { - n->setVolume( vol - 5 ); - } - else - { - n->setLength( 0 ); - } - } - engine::getSongEditor()->setModified(); - update(); - if( engine::getPianoRoll()->currentPattern() == this ) - { - engine::getPianoRoll()->update(); - } - _we->accept(); - } - else - { - trackContentObject::wheelEvent( _we ); - } -} - - - - -void pattern::paintEvent( QPaintEvent * ) -{ - if( m_needsUpdate == FALSE ) - { - QPainter p( this ); - p.drawPixmap( 0, 0, m_paintPixmap ); - return; - } - - changeLength( length() ); - - m_needsUpdate = FALSE; - - if( m_paintPixmap.isNull() == TRUE || m_paintPixmap.size() != size() ) - { - m_paintPixmap = QPixmap( size() ); - } - - QPainter p( &m_paintPixmap ); - - QLinearGradient lingrad( 0, 0, 0, height() ); - const QColor c = isSelected() ? QColor( 0, 0, 224 ) : - QColor( 96, 96, 96 ); - lingrad.setColorAt( 0, c ); - lingrad.setColorAt( 0.5, Qt::black ); - lingrad.setColorAt( 1, c ); - p.fillRect( QRect( 1, 1, width() - 2, height() - 2 ), lingrad ); - - p.setPen( QColor( 57, 69, 74 ) ); - p.drawLine( 0, 0, width(), 0 ); - p.drawLine( 0, 0, 0, height() ); - p.setPen( QColor( 120, 130, 140 ) ); - p.drawLine( 0, height() - 1, width() - 1, height() - 1 ); - p.drawLine( width() - 1, 0, width() - 1, height() - 1 ); - - p.setPen( QColor( 0, 0, 0 ) ); - p.drawRect( 1, 1, width() - 2, height() - 2 ); - - const float ppt = fixedTCOs() ? - ( parentWidget()->width() - 2 * TCO_BORDER_WIDTH ) - / (float)length().getTact() : - pixelsPerTact(); - - if( m_patternType == pattern::MELODY_PATTERN ) - { - Sint32 central_key = 0; - if( m_notes.size() > 0 ) - { - // first determine the central tone so that we can - // display the area where most of the m_notes are - Sint32 total_notes = 0; - for( noteVector::iterator it = m_notes.begin(); - it != m_notes.end(); ++it ) - { - if( ( *it )->length() > 0 ) - { - central_key += ( *it )->key(); - ++total_notes; - } - } - - if( total_notes > 0 ) - { - central_key = central_key / total_notes; - - Sint16 central_y = height() / 2; - Sint16 y_base = central_y + TCO_BORDER_WIDTH -1; - - const Sint16 x_base = TCO_BORDER_WIDTH; - - p.setPen( QColor( 0, 0, 0 ) ); - for( tact tact_num = 1; tact_num < - length().getTact(); ++tact_num ) - { - p.drawLine( - x_base + static_cast( - ppt * tact_num ) - 1, - TCO_BORDER_WIDTH, - x_base + static_cast( - ppt * tact_num ) - 1, - height() - 2 * - TCO_BORDER_WIDTH ); - } - if( getTrack()->muted() || muted() ) - { - p.setPen( QColor( 160, 160, 160 ) ); - } - else if( m_frozenPattern != NULL ) - { - p.setPen( QColor( 0x00, 0xE0, 0xFF ) ); - } - else - { - p.setPen( QColor( 0xFF, 0xB0, 0x00 ) ); - } - - for( noteVector::iterator it = m_notes.begin(); - it != m_notes.end(); ++it ) - { - Sint8 y_pos = central_key - - ( *it )->key(); - - if( ( *it )->length() > 0 && - y_pos > -central_y && - y_pos < central_y ) - { - Sint16 x1 = 2 * x_base + - static_cast( ( *it )->pos() * ppt / 64 ); - Sint16 x2 = x1 + - static_cast( ( *it )->length() * ppt / 64 ); - p.drawLine( x1, y_base + y_pos, - x2, y_base + y_pos ); - - } - } - } - } - } - else if( m_patternType == pattern::BEAT_PATTERN && - ( fixedTCOs() || ppt >= 96 - || m_steps != DEFAULT_STEPS_PER_TACT ) ) - { - QPixmap stepon; - QPixmap stepoverlay; - QPixmap stepoff; - QPixmap stepoffl; - const int steps = length() / BEATS_PER_TACT; - const int w = width() - 2 * TCO_BORDER_WIDTH; - stepon = s_stepBtnOn->scaled( w / steps, - s_stepBtnOn->height(), - Qt::IgnoreAspectRatio, - Qt::SmoothTransformation ); - stepoverlay = s_stepBtnOverlay->scaled( w / steps, - s_stepBtnOn->height(), - Qt::IgnoreAspectRatio, - Qt::SmoothTransformation ); - stepoff = s_stepBtnOff->scaled( w / steps, - s_stepBtnOff->height(), - Qt::IgnoreAspectRatio, - Qt::SmoothTransformation ); - stepoffl = s_stepBtnOffLight->scaled( w / steps, - s_stepBtnOffLight->height(), - Qt::IgnoreAspectRatio, - Qt::SmoothTransformation ); - for( noteVector::iterator it = m_notes.begin(); - it != m_notes.end(); ++it ) - { - Sint16 no = ( *it )->pos() / 4; - Sint16 x = TCO_BORDER_WIDTH + static_cast( no * - w / steps ); - Sint16 y = height() - s_stepBtnOff->height() - 1; - - Uint8 vol = ( *it )->getVolume(); - - if( ( *it )->length() < 0 ) - { - p.drawPixmap( x, y, stepoff ); - for( int i = 0; i < vol / 5 + 1; ++i ) - { - p.drawPixmap( x, y, stepon ); - } - for( int i = 0; i < ( 25 + ( vol - 75 ) ) / 5; - ++i ) - { - p.drawPixmap( x, y, stepoverlay ); - } - } - else if( ( no / BEATS_PER_TACT ) % 2 ) - { - p.drawPixmap( x, y, stepoff ); - } - else - { - p.drawPixmap( x, y, stepoffl ); - } - } - } - - p.setFont( pointSize<7>( p.font() ) ); - if( muted() || getTrack()->muted() ) - { - p.setPen( QColor( 192, 192, 192 ) ); - } - else - { - p.setPen( QColor( 32, 240, 32 ) ); - } - p.drawText( 2, p.fontMetrics().height() - 1, m_name ); - if( muted() ) - { - p.drawPixmap( 3, p.fontMetrics().height() + 1, - embed::getIconPixmap( "muted", 16, 16 ) ); - } - else if( m_frozenPattern != NULL ) - { - p.setPen( QColor( 0, 224, 255 ) ); - p.drawRect( 0, 0, width(), height() - 1 ); - p.drawPixmap( 3, height() - s_frozen->height() - 4, *s_frozen ); - } - - p.end(); - - p.begin( this ); - p.drawPixmap( 0, 0, m_paintPixmap ); - -} - - - void pattern::ensureBeatNotes( void ) { @@ -1017,9 +516,9 @@ void pattern::ensureBeatNotes( void ) void pattern::updateBBTrack( void ) { - if( getTrack()->getTrackContainer() == engine::getBBEditor() ) + if( getTrack()->getTrackContainer() == engine::getBBTrackContainer() ) { - engine::getBBEditor()->updateBBTrack( this ); + engine::getBBTrackContainer()->updateBBTrack( this ); } } @@ -1150,7 +649,6 @@ patternFreezeThread::patternFreezeThread( pattern * _pattern ) : patternFreezeThread::~patternFreezeThread() { - m_pattern->update(); } @@ -1171,9 +669,9 @@ void patternFreezeThread::run( void ) engine::getMixer()->highQuality() ); // prepare stuff for playing correct things later - engine::getSongEditor()->playPattern( m_pattern, FALSE ); - songEditor::playPos & ppp = engine::getSongEditor()->getPlayPos( - songEditor::PLAY_PATTERN ); + engine::getSong()->playPattern( m_pattern, FALSE ); + song::playPos & ppp = engine::getSong()->getPlayPos( + song::Mode_PlayPattern ); ppp.setTact( 0 ); ppp.setTact64th( 0 ); ppp.setCurrentFrame( 0 ); @@ -1202,7 +700,7 @@ void patternFreezeThread::run( void ) m_pattern->m_freezing = FALSE; // reset song-editor settings - engine::getSongEditor()->stop(); + engine::getSong()->stop(); ppp.m_timeLineUpdate = TRUE; // create final sample-buffer if freezing was successful @@ -1223,6 +721,539 @@ void patternFreezeThread::run( void ) +patternView::patternView( pattern * _pattern, trackView * _parent ) : + trackContentObjectView( _pattern, _parent ), + m_pat( _pattern ), + m_paintPixmap(), + m_needsUpdate( TRUE ) +{ + if( s_stepBtnOn == NULL ) + { + s_stepBtnOn = new QPixmap( embed::getIconPixmap( + "step_btn_on_100" ) ); + } + + if( s_stepBtnOverlay == NULL ) + { + s_stepBtnOverlay = new QPixmap( embed::getIconPixmap( + "step_btn_on_yellow" ) ); + } + + if( s_stepBtnOff == NULL ) + { + s_stepBtnOff = new QPixmap( embed::getIconPixmap( + "step_btn_off" ) ); + } + + if( s_stepBtnOffLight == NULL ) + { + s_stepBtnOffLight = new QPixmap( embed::getIconPixmap( + "step_btn_off_light" ) ); + } + + if( s_frozen == NULL ) + { + s_frozen = new QPixmap( embed::getIconPixmap( "frozen" ) ); + } + + setFixedHeight( parentWidget()->height() - 2 ); + setAutoResizeEnabled( FALSE ); + + toolTip::add( this, + tr( "double-click to open this pattern in piano-roll\n" + "use mouse wheel to set volume of a step" ) ); +} + + + + + + +patternView::~patternView() +{ + if( engine::getPianoRoll()->currentPattern() == m_pat ) + { + engine::getPianoRoll()->setCurrentPattern( NULL ); + // we have to have the song-editor to stop playing if it played + // us before + if( engine::getSong()->playing() && + engine::getSong()->playMode() == + song::Mode_PlayPattern ) + { + engine::getSong()->playPattern( NULL ); + } + } +} + + + + + +void patternView::update( void ) +{ + m_needsUpdate = TRUE; + m_pat->changeLength( m_pat->length() ); + trackContentObjectView::update(); +} + + + + +void patternView::openInPianoRoll( void ) +{ + openInPianoRoll( FALSE ); +} + + + + +void patternView::openInPianoRoll( bool ) +{ + engine::getPianoRoll()->setCurrentPattern( m_pat ); + engine::getPianoRoll()->parentWidget()->show(); + engine::getPianoRoll()->setFocus(); +} + + + + +void patternView::resetName( void ) +{ + m_pat->setName( m_pat->m_instrumentTrack->name() ); +} + + + + +void patternView::changeName( void ) +{ + QString s = m_pat->name(); + renameDialog rename_dlg( s ); + rename_dlg.exec(); + m_pat->setName( s ); +} + + + + + +void patternView::addSteps( QAction * _item ) +{ + m_pat->addSteps( _item->text().toInt() ); +} + + + + +void patternView::removeSteps( QAction * _item ) +{ + m_pat->removeSteps( _item->text().toInt() ); +} + + + + +void patternView::constructContextMenu( QMenu * _cm ) +{ + QAction * a = new QAction( embed::getIconPixmap( "piano" ), + tr( "Open in piano-roll" ), _cm ); + _cm->insertAction( _cm->actions()[0], a ); + connect( a, SIGNAL( triggered( bool ) ), this, + SLOT( openInPianoRoll( bool ) ) ); + _cm->insertSeparator( _cm->actions()[1] ); + + _cm->addSeparator(); + + _cm->addAction( embed::getIconPixmap( "edit_erase" ), + tr( "Clear all notes" ), m_pat, SLOT( clear() ) ); + _cm->addSeparator(); + + _cm->addAction( embed::getIconPixmap( "reload" ), tr( "Reset name" ), + this, SLOT( resetName() ) ); + _cm->addAction( embed::getIconPixmap( "rename" ), tr( "Change name" ), + this, SLOT( changeName() ) ); + _cm->addSeparator(); + + bool freeze_separator = FALSE; + if( !( m_pat->m_instrumentTrack->muted() || m_pat->muted() ) ) + { + _cm->addAction( embed::getIconPixmap( "freeze" ), + m_pat->m_frozenPattern ? tr( "Refreeze" ) : + tr( "Freeze" ), + m_pat, SLOT( freeze() ) ); + freeze_separator = TRUE; + } + if( m_pat->m_frozenPattern ) + { + _cm->addAction( embed::getIconPixmap( "unfreeze" ), + tr( "Unfreeze" ), m_pat, SLOT( unfreeze() ) ); + freeze_separator = TRUE; + } + if( freeze_separator ) + { + _cm->addSeparator(); + } + + QMenu * add_step_menu = _cm->addMenu( + embed::getIconPixmap( "step_btn_add" ), + tr( "Add steps" ) ); + QMenu * remove_step_menu = _cm->addMenu( + embed::getIconPixmap( "step_btn_remove" ), + tr( "Remove steps" ) ); + connect( add_step_menu, SIGNAL( triggered( QAction * ) ), + this, SLOT( addSteps( QAction * ) ) ); + connect( remove_step_menu, SIGNAL( triggered( QAction * ) ), + this, SLOT( removeSteps( QAction * ) ) ); + for( int i = 1; i <= 16; i *= 2 ) + { + const QString label = ( i == 1 ) ? + tr( "1 step" ) : + tr( "%1 steps" ).arg( i ); + add_step_menu->addAction( label ); + remove_step_menu->addAction( label ); + } +} + + + + +void patternView::mouseDoubleClickEvent( QMouseEvent * _me ) +{ + if( _me->button() != Qt::LeftButton ) + { + _me->ignore(); + return; + } + if( m_pat->type() == pattern::MelodyPattern || + !( m_pat->type() == pattern::BeatPattern && + ( pixelsPerTact() >= 192 || + m_pat->m_steps != DEFAULT_STEPS_PER_TACT ) && + _me->y() > height() - s_stepBtnOff->height() ) ) + { + openInPianoRoll(); + } +} + + + + +void patternView::mousePressEvent( QMouseEvent * _me ) +{ + if( _me->button() == Qt::LeftButton && + m_pat->m_patternType == pattern::BeatPattern && + ( fixedTCOs() || pixelsPerTact() >= 192 || + m_pat->m_steps != DEFAULT_STEPS_PER_TACT ) && + _me->y() > height() - s_stepBtnOff->height() ) + { + int step = ( _me->x() - TCO_BORDER_WIDTH ) * + m_pat->length() / BEATS_PER_TACT / width(); + if( step >= m_pat->m_steps ) + { + return; + } + note * n = m_pat->m_notes[step]; + if( n->length() < 0 ) + { + n->setLength( 0 ); + } + else + { + n->setLength( -64 ); + } + engine::getSong()->setModified(); + update(); + if( engine::getPianoRoll()->currentPattern() == m_pat ) + { + engine::getPianoRoll()->update(); + } + } + else if( m_pat->m_frozenPattern != NULL && + _me->button() == Qt::LeftButton && + engine::getMainWindow()->isShiftPressed() == TRUE ) + { + QString s; + new stringPairDrag( "sampledata", + m_pat->m_frozenPattern->toBase64( s ), + embed::getIconPixmap( "freeze" ), + this ); + } + else + { + trackContentObjectView::mousePressEvent( _me ); + } +} + + + + +void patternView::wheelEvent( QWheelEvent * _we ) +{ + if( m_pat->m_patternType == pattern::BeatPattern && + ( fixedTCOs() || pixelsPerTact() >= 192 || + m_pat->m_steps != DEFAULT_STEPS_PER_TACT ) && + _we->y() > height() - s_stepBtnOff->height() ) + { + int step = ( _we->x() - TCO_BORDER_WIDTH ) * + m_pat->length() / BEATS_PER_TACT / width(); + if( step >= m_pat->m_steps ) + { + return; + } + note * n = m_pat->m_notes[step]; + Uint8 vol = n->getVolume(); + + if( n->length() == 0 && _we->delta() > 0 ) + { + n->setLength( -64 ); + n->setVolume( 5 ); + } + else if( _we->delta() > 0 ) + { + if( vol < 95 ) + { + n->setVolume( vol + 5 ); + } + } + else + { + if( vol > 5 ) + { + n->setVolume( vol - 5 ); + } + else + { + n->setLength( 0 ); + } + } + engine::getSong()->setModified(); + update(); + if( engine::getPianoRoll()->currentPattern() == m_pat ) + { + engine::getPianoRoll()->update(); + } + _we->accept(); + } + else + { + trackContentObjectView::wheelEvent( _we ); + } +} + + + + +void patternView::paintEvent( QPaintEvent * ) +{ + if( m_needsUpdate == FALSE ) + { + QPainter p( this ); + p.drawPixmap( 0, 0, m_paintPixmap ); + return; + } + + m_pat->changeLength( m_pat->length() ); + + m_needsUpdate = FALSE; + + if( m_paintPixmap.isNull() == TRUE || m_paintPixmap.size() != size() ) + { + m_paintPixmap = QPixmap( size() ); + } + + QPainter p( &m_paintPixmap ); + + QLinearGradient lingrad( 0, 0, 0, height() ); + const QColor c = isSelected() ? QColor( 0, 0, 224 ) : + QColor( 96, 96, 96 ); + lingrad.setColorAt( 0, c ); + lingrad.setColorAt( 0.5, Qt::black ); + lingrad.setColorAt( 1, c ); + p.fillRect( QRect( 1, 1, width() - 2, height() - 2 ), lingrad ); + + p.setPen( QColor( 57, 69, 74 ) ); + p.drawLine( 0, 0, width(), 0 ); + p.drawLine( 0, 0, 0, height() ); + p.setPen( QColor( 120, 130, 140 ) ); + p.drawLine( 0, height() - 1, width() - 1, height() - 1 ); + p.drawLine( width() - 1, 0, width() - 1, height() - 1 ); + + p.setPen( QColor( 0, 0, 0 ) ); + p.drawRect( 1, 1, width() - 2, height() - 2 ); + + const float ppt = fixedTCOs() ? + ( parentWidget()->width() - 2 * TCO_BORDER_WIDTH ) + / (float) m_pat->length().getTact() : + pixelsPerTact(); + + if( m_pat->m_patternType == pattern::MelodyPattern ) + { + Sint32 central_key = 0; + if( m_pat->m_notes.size() > 0 ) + { + // first determine the central tone so that we can + // display the area where most of the m_notes are + Sint32 total_notes = 0; + for( noteVector::iterator it = m_pat->m_notes.begin(); + it != m_pat->m_notes.end(); ++it ) + { + if( ( *it )->length() > 0 ) + { + central_key += ( *it )->key(); + ++total_notes; + } + } + + if( total_notes > 0 ) + { + central_key = central_key / total_notes; + + Sint16 central_y = height() / 2; + Sint16 y_base = central_y + TCO_BORDER_WIDTH -1; + + const Sint16 x_base = TCO_BORDER_WIDTH; + + p.setPen( QColor( 0, 0, 0 ) ); + for( tact tact_num = 1; tact_num < + m_pat->length().getTact(); ++tact_num ) + { + p.drawLine( + x_base + static_cast( + ppt * tact_num ) - 1, + TCO_BORDER_WIDTH, + x_base + static_cast( + ppt * tact_num ) - 1, + height() - 2 * + TCO_BORDER_WIDTH ); + } + if( m_pat->getTrack()->muted() || + m_pat->muted() ) + { + p.setPen( QColor( 160, 160, 160 ) ); + } + else if( m_pat->m_frozenPattern != NULL ) + { + p.setPen( QColor( 0x00, 0xE0, 0xFF ) ); + } + else + { + p.setPen( QColor( 0xFF, 0xB0, 0x00 ) ); + } + + for( noteVector::iterator it = + m_pat->m_notes.begin(); + it != m_pat->m_notes.end(); ++it ) + { + Sint8 y_pos = central_key - + ( *it )->key(); + + if( ( *it )->length() > 0 && + y_pos > -central_y && + y_pos < central_y ) + { + Sint16 x1 = 2 * x_base + + static_cast( ( *it )->pos() * ppt / 64 ); + Sint16 x2 = x1 + + static_cast( ( *it )->length() * ppt / 64 ); + p.drawLine( x1, y_base + y_pos, + x2, y_base + y_pos ); + + } + } + } + } + } + else if( m_pat->m_patternType == pattern::BeatPattern && + ( fixedTCOs() || ppt >= 96 + || m_pat->m_steps != DEFAULT_STEPS_PER_TACT ) ) + { + QPixmap stepon; + QPixmap stepoverlay; + QPixmap stepoff; + QPixmap stepoffl; + const int steps = m_pat->length() / BEATS_PER_TACT; + const int w = width() - 2 * TCO_BORDER_WIDTH; + stepon = s_stepBtnOn->scaled( w / steps, + s_stepBtnOn->height(), + Qt::IgnoreAspectRatio, + Qt::SmoothTransformation ); + stepoverlay = s_stepBtnOverlay->scaled( w / steps, + s_stepBtnOn->height(), + Qt::IgnoreAspectRatio, + Qt::SmoothTransformation ); + stepoff = s_stepBtnOff->scaled( w / steps, + s_stepBtnOff->height(), + Qt::IgnoreAspectRatio, + Qt::SmoothTransformation ); + stepoffl = s_stepBtnOffLight->scaled( w / steps, + s_stepBtnOffLight->height(), + Qt::IgnoreAspectRatio, + Qt::SmoothTransformation ); + for( noteVector::iterator it = m_pat->m_notes.begin(); + it != m_pat->m_notes.end(); ++it ) + { + Sint16 no = ( *it )->pos() / 4; + Sint16 x = TCO_BORDER_WIDTH + static_cast( no * + w / steps ); + Sint16 y = height() - s_stepBtnOff->height() - 1; + + Uint8 vol = ( *it )->getVolume(); + + if( ( *it )->length() < 0 ) + { + p.drawPixmap( x, y, stepoff ); + for( int i = 0; i < vol / 5 + 1; ++i ) + { + p.drawPixmap( x, y, stepon ); + } + for( int i = 0; i < ( 25 + ( vol - 75 ) ) / 5; + ++i ) + { + p.drawPixmap( x, y, stepoverlay ); + } + } + else if( ( no / BEATS_PER_TACT ) % 2 ) + { + p.drawPixmap( x, y, stepoff ); + } + else + { + p.drawPixmap( x, y, stepoffl ); + } + } + } + + p.setFont( pointSize<7>( p.font() ) ); + if( m_pat->muted() || m_pat->getTrack()->muted() ) + { + p.setPen( QColor( 192, 192, 192 ) ); + } + else + { + p.setPen( QColor( 32, 240, 32 ) ); + } + p.drawText( 2, p.fontMetrics().height() - 1, m_pat->name() ); + if( m_pat->muted() ) + { + p.drawPixmap( 3, p.fontMetrics().height() + 1, + embed::getIconPixmap( "muted", 16, 16 ) ); + } + else if( m_pat->m_frozenPattern != NULL ) + { + p.setPen( QColor( 0, 224, 255 ) ); + p.drawRect( 0, 0, width(), height() - 1 ); + p.drawPixmap( 3, height() - s_frozen->height() - 4, *s_frozen ); + } + + p.end(); + + p.begin( this ); + p.drawPixmap( 0, 0, m_paintPixmap ); + +} + + + + #include "pattern.moc" diff --git a/src/tracks/sample_track.cpp b/src/tracks/sample_track.cpp index b87373639..0b07441aa 100644 --- a/src/tracks/sample_track.cpp +++ b/src/tracks/sample_track.cpp @@ -329,7 +329,7 @@ void sampleTCOSettingsDialog::setSampleFile( const QString & _f ) sampleTrack::sampleTrack( trackContainer * _tc ) : - track( _tc ), + track( SampleTrack, _tc ), m_audioPort( tr( "Sample track" ), this ), m_volumeModel( DEFAULT_VOLUME, MIN_VOLUME, MAX_VOLUME, 1/*, this*/ ) { @@ -377,14 +377,6 @@ sampleTrack::~sampleTrack() -track::trackTypes sampleTrack::type( void ) const -{ - return( SAMPLE_TRACK ); -} - - - - bool FASTCALL sampleTrack::play( const midiTime & _start, const fpp_t _frames, const f_cnt_t _offset, diff --git a/src/widgets/automatable_button.cpp b/src/widgets/automatable_button.cpp index d7846e43a..2a127e1a6 100644 --- a/src/widgets/automatable_button.cpp +++ b/src/widgets/automatable_button.cpp @@ -176,9 +176,10 @@ automatableButtonGroup::automatableButtonGroup( QWidget * _parent, automatableButtonGroup::~automatableButtonGroup() { - while( m_buttons.empty() == FALSE ) + for( QList::iterator it = m_buttons.begin(); + it != m_buttons.end(); ++it ) { - removeButton( m_buttons.front() ); + ( *it )->m_group = NULL; } } diff --git a/src/widgets/effect_rack_view.cpp b/src/widgets/effect_rack_view.cpp index a10ceddb7..392493863 100644 --- a/src/widgets/effect_rack_view.cpp +++ b/src/widgets/effect_rack_view.cpp @@ -43,7 +43,7 @@ effectRackView::effectRackView( effectChain * _model, QWidget * _parent ) : modelView( NULL ) { setFixedSize( 230, 184 ); - + /* m_mainLayout = new QVBoxLayout( this ); m_mainLayout->setMargin( 0 ); m_mainLayout->setSpacing( 0 );*/ diff --git a/src/widgets/envelope_and_lfo_view.cpp b/src/widgets/envelope_and_lfo_view.cpp new file mode 100644 index 000000000..f5db2d292 --- /dev/null +++ b/src/widgets/envelope_and_lfo_view.cpp @@ -0,0 +1,600 @@ +#ifndef SINGLE_SOURCE_COMPILE + +/* + * envelope_and_lfo_view.cpp - widget which is m_used by envelope/lfo/filter- + * tab of channel-window + * + * Copyright (c) 2004-2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "envelope_and_lfo_view.h" + + +#include +#include + + +#include "envelope_and_lfo_parameters.h" +#include "embed.h" +#include "engine.h" +#include "gui_templates.h" +#include "knob.h" +#include "led_checkbox.h" +#include "mmp.h" +#include "oscillator.h" +#include "pixmap_button.h" +#include "string_pair_drag.h" +#include "tempo_sync_knob.h" +#include "text_float.h" +#include "tooltip.h" +#include "track.h" +#include "automatable_model_templates.h" + + + +// how long should be each envelope-segment maximal (e.g. attack)? +const float SECS_PER_ENV_SEGMENT = 5.0f; +// how long should be one LFO-oscillation maximal? +const float SECS_PER_LFO_OSCILLATION = 20.0f; + + +const int ENV_GRAPH_X = 6; +const int ENV_GRAPH_Y = 6; + +const int ENV_KNOBS_Y = 43; +const int ENV_KNOBS_LBL_Y = ENV_KNOBS_Y+35; +const int KNOB_X_SPACING = 32; +const int PREDELAY_KNOB_X = 6; +const int ATTACK_KNOB_X = PREDELAY_KNOB_X+KNOB_X_SPACING; +const int HOLD_KNOB_X = ATTACK_KNOB_X+KNOB_X_SPACING; +const int DECAY_KNOB_X = HOLD_KNOB_X+KNOB_X_SPACING; +const int SUSTAIN_KNOB_X = DECAY_KNOB_X+KNOB_X_SPACING; +const int RELEASE_KNOB_X = SUSTAIN_KNOB_X+KNOB_X_SPACING; +const int AMOUNT_KNOB_X = RELEASE_KNOB_X+KNOB_X_SPACING; + +const float TIME_UNIT_WIDTH = 36.0; + + +const int LFO_GRAPH_X = 6; +const int LFO_GRAPH_Y = ENV_KNOBS_LBL_Y+14; +const int LFO_KNOB_Y = LFO_GRAPH_Y-2; +const int LFO_PREDELAY_KNOB_X = LFO_GRAPH_X + 100; +const int LFO_ATTACK_KNOB_X = LFO_PREDELAY_KNOB_X+KNOB_X_SPACING; +const int LFO_SPEED_KNOB_X = LFO_ATTACK_KNOB_X+KNOB_X_SPACING; +const int LFO_AMOUNT_KNOB_X = LFO_SPEED_KNOB_X+KNOB_X_SPACING; +const int LFO_SHAPES_X = LFO_GRAPH_X;//PREDELAY_KNOB_X; +const int LFO_SHAPES_Y = LFO_GRAPH_Y + 50; + + +QPixmap * envelopeAndLFOView::s_envGraph = NULL; +QPixmap * envelopeAndLFOView::s_lfoGraph = NULL; + + + +envelopeAndLFOView::envelopeAndLFOView( QWidget * _parent ) : + QWidget( _parent ), + modelView( NULL ), + m_params( NULL ) +{ + if( s_envGraph == NULL ) + { + s_envGraph = new QPixmap( embed::getIconPixmap( + "envelope_graph" ) ); + } + if( s_lfoGraph == NULL ) + { + s_lfoGraph = new QPixmap( embed::getIconPixmap( "lfo_graph" ) ); + } + + m_predelayKnob = new knob( knobBright_26, this, tr( "Predelay-time" ) ); + m_predelayKnob->setLabel( tr( "DEL" ) ); + m_predelayKnob->move( PREDELAY_KNOB_X, ENV_KNOBS_Y ); + m_predelayKnob->setHintText( tr( "Predelay:" ) + " ", "" ); + m_predelayKnob->setWhatsThis( + tr( "Use this knob for setting predelay of the current " + "envelope. The bigger this value the longer the time " + "before start of actual envelope." ) ); + + + m_attackKnob = new knob( knobBright_26, this, tr( "Attack-time" ) ); + m_attackKnob->setLabel( tr( "ATT" ) ); + m_attackKnob->move( ATTACK_KNOB_X, ENV_KNOBS_Y ); + m_attackKnob->setHintText( tr( "Attack:" )+" ", "" ); + m_attackKnob->setWhatsThis( + tr( "Use this knob for setting attack-time of the current " + "envelope. The bigger this value the longer the " + "envelope needs to increase to attack-level. " + "Choose a small value for instruments like pianos " + "and a big value for strings." ) ); + + m_holdKnob = new knob( knobBright_26, this, tr( "Hold-time" ) ); + m_holdKnob->setLabel( tr( "HOLD" ) ); + m_holdKnob->move( HOLD_KNOB_X, ENV_KNOBS_Y ); + m_holdKnob->setHintText( tr( "Hold:" ) + " ", "" ); + m_holdKnob->setWhatsThis( + tr( "Use this knob for setting hold-time of the current " + "envelope. The bigger this value the longer the " + "envelope holds attack-level before it begins to " + "decrease to sustain-level." ) ); + + m_decayKnob = new knob( knobBright_26, this, tr( "Decay-time" ) ); + m_decayKnob->setLabel( tr( "DEC" ) ); + m_decayKnob->move( DECAY_KNOB_X, ENV_KNOBS_Y ); + m_decayKnob->setHintText( tr( "Decay:" ) + " ", "" ); + m_decayKnob->setWhatsThis( + tr( "Use this knob for setting decay-time of the current " + "envelope. The bigger this value the longer the " + "envelope needs to decrease from attack-level to " + "sustain-level. Choose a small value for instruments " + "like pianos." ) ); + + + m_sustainKnob = new knob( knobBright_26, this, tr( "Sustain-level" ) ); + m_sustainKnob->setLabel( tr( "SUST" ) ); + m_sustainKnob->move( SUSTAIN_KNOB_X, ENV_KNOBS_Y ); + m_sustainKnob->setHintText( tr( "Sustain:" ) + " ", "" ); + m_sustainKnob->setWhatsThis( + tr( "Use this knob for setting sustain-level of the current " + "envelope. The bigger this value the higher the level " + "on which the envelope stays before going down to " + "zero." ) ); + + + m_releaseKnob = new knob( knobBright_26, this, tr( "Release-time" ) ); + m_releaseKnob->setLabel( tr( "REL" ) ); + m_releaseKnob->move( RELEASE_KNOB_X, ENV_KNOBS_Y ); + m_releaseKnob->setHintText( tr( "Release:" ) + " ", "" ); + m_releaseKnob->setWhatsThis( + tr( "Use this knob for setting release-time of the current " + "envelope. The bigger this value the longer the " + "envelope needs to decrease from sustain-level to " + "zero. Choose a big value for soft instruments like " + "strings." ) ); + + + m_amountKnob = new knob( knobBright_26, this, + tr( "Modulation amount" ) ); + m_amountKnob->setLabel( tr( "AMT" ) ); + m_amountKnob->move( AMOUNT_KNOB_X, ENV_GRAPH_Y ); + m_amountKnob->setHintText( tr( "Modulation amount:" ) + " ", "" ); + m_amountKnob->setWhatsThis( + tr( "Use this knob for setting modulation amount of the " + "current envelope. The bigger this value the more the " + "according size (e.g. volume or cutoff-frequency) " + "will be influenced by this envelope." ) ); + + + + + m_lfoPredelayKnob = new knob( knobBright_26, this, + tr( "LFO-predelay-time" ) ); + m_lfoPredelayKnob->setLabel( tr( "DEL" ) ); + m_lfoPredelayKnob->move( LFO_PREDELAY_KNOB_X, LFO_KNOB_Y ); + m_lfoPredelayKnob->setHintText( tr( "LFO-predelay:" ) + " ", "" ); + m_lfoPredelayKnob->setWhatsThis( + tr( "Use this knob for setting predelay-time of the current " + "LFO. The bigger this value the the time until the " + "LFO starts to oscillate." ) ); + + + m_lfoAttackKnob = new knob( knobBright_26, this, + tr( "LFO-attack-time" ) ); + m_lfoAttackKnob->setLabel( tr( "ATT" ) ); + m_lfoAttackKnob->move( LFO_ATTACK_KNOB_X, LFO_KNOB_Y ); + m_lfoAttackKnob->setHintText( tr( "LFO-attack:" ) + " ", "" ); + m_lfoAttackKnob->setWhatsThis( + tr( "Use this knob for setting attack-time of the current LFO. " + "The bigger this value the longer the LFO needs to " + "increase its amplitude to maximum." ) ); + + + m_lfoSpeedKnob = new tempoSyncKnob( knobBright_26, this, + tr( "LFO-speed" ), 20000.0 ); + m_lfoSpeedKnob->setLabel( tr( "SPD" ) ); + m_lfoSpeedKnob->move( LFO_SPEED_KNOB_X, LFO_KNOB_Y ); + m_lfoSpeedKnob->setHintText( tr( "LFO-speed:" ) + " ", "" ); + m_lfoSpeedKnob->setWhatsThis( + tr( "Use this knob for setting speed of the current LFO. The " + "bigger this value the faster the LFO oscillates and " + "the faster will be your effect." ) ); + + + m_lfoAmountKnob = new knob( knobBright_26, this, + tr( "LFO-modulation-amount" ) ); + m_lfoAmountKnob->setLabel( tr( "AMT" ) ); + m_lfoAmountKnob->move( LFO_AMOUNT_KNOB_X, LFO_KNOB_Y ); + m_lfoAmountKnob->setHintText( tr( "Modulation amount:" ) + " ", "" ); + m_lfoAmountKnob->setWhatsThis( + tr( "Use this knob for setting modulation amount of the " + "current LFO. The bigger this value the more the " + "selected size (e.g. volume or cutoff-frequency) will " + "be influenced by this LFO." ) ); + + + pixmapButton * sin_lfo_btn = new pixmapButton( this, NULL ); + sin_lfo_btn->move( LFO_SHAPES_X, LFO_SHAPES_Y ); + sin_lfo_btn->setActiveGraphic( embed::getIconPixmap( + "sin_wave_active" ) ); + sin_lfo_btn->setInactiveGraphic( embed::getIconPixmap( + "sin_wave_inactive" ) ); + sin_lfo_btn->setWhatsThis( + tr( "Click here if you want a sine-wave for current " + "oscillator." ) ); + + pixmapButton * triangle_lfo_btn = new pixmapButton( this, NULL ); + triangle_lfo_btn->move( LFO_SHAPES_X+15, LFO_SHAPES_Y ); + triangle_lfo_btn->setActiveGraphic( embed::getIconPixmap( + "triangle_wave_active" ) ); + triangle_lfo_btn->setInactiveGraphic( embed::getIconPixmap( + "triangle_wave_inactive" ) ); + triangle_lfo_btn->setWhatsThis( + tr( "Click here if you want a triangle-wave for current " + "oscillator." ) ); + + pixmapButton * saw_lfo_btn = new pixmapButton( this, NULL ); + saw_lfo_btn->move( LFO_SHAPES_X+30, LFO_SHAPES_Y ); + saw_lfo_btn->setActiveGraphic( embed::getIconPixmap( + "saw_wave_active" ) ); + saw_lfo_btn->setInactiveGraphic( embed::getIconPixmap( + "saw_wave_inactive" ) ); + saw_lfo_btn->setWhatsThis( + tr( "Click here if you want a saw-wave for current " + "oscillator." ) ); + + pixmapButton * sqr_lfo_btn = new pixmapButton( this, NULL ); + sqr_lfo_btn->move( LFO_SHAPES_X+45, LFO_SHAPES_Y ); + sqr_lfo_btn->setActiveGraphic( embed::getIconPixmap( + "square_wave_active" ) ); + sqr_lfo_btn->setInactiveGraphic( embed::getIconPixmap( + "square_wave_inactive" ) ); + sqr_lfo_btn->setWhatsThis( + tr( "Click here if you want a square-wave for current " + "oscillator." ) ); + + m_userLfoBtn = new pixmapButton( this, NULL ); + m_userLfoBtn->move( LFO_SHAPES_X+60, LFO_SHAPES_Y ); + m_userLfoBtn->setActiveGraphic( embed::getIconPixmap( + "usr_wave_active" ) ); + m_userLfoBtn->setInactiveGraphic( embed::getIconPixmap( + "usr_wave_inactive" ) ); + m_userLfoBtn->setWhatsThis( + tr( "Click here if you want a user-defined wave for current " + "oscillator. Afterwards drag an according sample-" + "file into LFO-graph." ) ); + + connect( m_userLfoBtn, SIGNAL( toggled( bool ) ), + this, SLOT( lfoUserWaveChanged() ) ); + + m_lfoWaveBtnGrp = new automatableButtonGroup( this, + tr( "LFO wave shape" ) ); + m_lfoWaveBtnGrp->addButton( sin_lfo_btn ); + m_lfoWaveBtnGrp->addButton( triangle_lfo_btn ); + m_lfoWaveBtnGrp->addButton( saw_lfo_btn ); + m_lfoWaveBtnGrp->addButton( sqr_lfo_btn ); + m_lfoWaveBtnGrp->addButton( m_userLfoBtn ); + + + m_x100Cb = new ledCheckBox( tr( "FREQ x 100" ), this, + tr( "Freq x 100" ) ); + m_x100Cb->setFont( pointSize<6>( m_x100Cb->font() ) ); + m_x100Cb->move( LFO_PREDELAY_KNOB_X, LFO_GRAPH_Y + 36 ); + m_x100Cb->setWhatsThis( + tr( "Click here if the frequency of this LFO should be " + "multiplied with 100." ) ); + toolTip::add( m_x100Cb, tr( "multiply LFO-frequency with 100" ) ); + + + m_controlEnvAmountCb = new ledCheckBox( tr( "MODULATE ENV-AMOUNT" ), + this, tr( "Modulate Env-Amount" ) ); + m_controlEnvAmountCb->move( LFO_PREDELAY_KNOB_X, LFO_GRAPH_Y + 54 ); + m_controlEnvAmountCb->setFont( pointSize<6>( + m_controlEnvAmountCb->font() ) ); + m_controlEnvAmountCb ->setWhatsThis( + tr( "Click here to make the envelope-amount controlled by this " + "LFO." ) ); + toolTip::add( m_controlEnvAmountCb, + tr( "control envelope-amount by this LFO" ) ); + + + setAcceptDrops( TRUE ); + +} + + + + +envelopeAndLFOView::~envelopeAndLFOView() +{ + delete m_lfoWaveBtnGrp; +} + + + + +void envelopeAndLFOView::modelChanged( void ) +{ + m_params = castModel(); + m_predelayKnob->setModel( &m_params->m_predelayModel ); + m_attackKnob->setModel( &m_params->m_attackModel ); + m_holdKnob->setModel( &m_params->m_holdModel ); + m_decayKnob->setModel( &m_params->m_decayModel ); + m_sustainKnob->setModel( &m_params->m_sustainModel ); + m_releaseKnob->setModel( &m_params->m_releaseModel ); + m_amountKnob->setModel( &m_params->m_amountModel ); + m_lfoPredelayKnob->setModel( &m_params->m_lfoPredelayModel ); + m_lfoAttackKnob->setModel( &m_params->m_lfoAttackModel ); + m_lfoSpeedKnob->setModel( &m_params->m_lfoSpeedModel ); + m_lfoAmountKnob->setModel( &m_params->m_lfoAmountModel ); + m_lfoWaveBtnGrp->setModel( &m_params->m_lfoWaveModel ); + m_x100Cb->setModel( &m_params->m_x100Model ); + m_controlEnvAmountCb->setModel( &m_params->m_controlEnvAmountModel ); +} + + + + +void envelopeAndLFOView::mousePressEvent( QMouseEvent * _me ) +{ + if( _me->button() != Qt::LeftButton ) + { + return; + } + + if( QRect( ENV_GRAPH_X, ENV_GRAPH_Y, s_envGraph->width(), + s_envGraph->height() ).contains( _me->pos() ) == TRUE ) + { + if( m_amountKnob->value() < 1.0f ) + { + m_amountKnob->setValue( 1.0f ); + } + else + { + m_amountKnob->setValue( 0.0f ); + } + } + else if( QRect( LFO_GRAPH_X, LFO_GRAPH_Y, s_lfoGraph->width(), + s_lfoGraph->height() ).contains( _me->pos() ) == TRUE ) + { + if( m_lfoAmountKnob->value() < 1.0f ) + { + m_lfoAmountKnob->setValue( 1.0f ); + } + else + { + m_lfoAmountKnob->setValue( 0.0f ); + } + } +} + + + + +void envelopeAndLFOView::dragEnterEvent( QDragEnterEvent * _dee ) +{ + stringPairDrag::processDragEnterEvent( _dee, + QString( "samplefile,tco_%1" ).arg( + track::SampleTrack ) ); +} + + + + +void envelopeAndLFOView::dropEvent( QDropEvent * _de ) +{ + QString type = stringPairDrag::decodeKey( _de ); + QString value = stringPairDrag::decodeValue( _de ); + if( type == "samplefile" ) + { + m_params->m_userWave.setAudioFile( + stringPairDrag::decodeValue( _de ) ); + m_userLfoBtn->model()->setValue( TRUE ); + _de->accept(); + } + else if( type == QString( "tco_%1" ).arg( track::SampleTrack ) ) + { + multimediaProject mmp( value, FALSE ); + m_params->m_userWave.setAudioFile( + mmp.content().firstChild().toElement(). + attribute( "src" ) ); + m_userLfoBtn->model()->setValue( TRUE ); + _de->accept(); + } +} + + + + +void envelopeAndLFOView::paintEvent( QPaintEvent * ) +{ + QPainter p( this ); + p.setRenderHint( QPainter::Antialiasing ); + + // set smaller font + p.setFont( pointSize<6>( p.font() ) ); + + // draw envelope-graph + p.drawPixmap( ENV_GRAPH_X, ENV_GRAPH_Y, *s_envGraph ); + // draw LFO-graph + p.drawPixmap( LFO_GRAPH_X, LFO_GRAPH_Y, *s_lfoGraph ); + + + p.setFont( pointSize<8>( p.font() ) ); + + const float gray_amount = 1.0f - fabsf( m_amountKnob->value() ); + + p.setPen( QPen( QColor( static_cast( 96 * gray_amount ), + static_cast( 255 - 159 * gray_amount ), + static_cast( 128 - 32 * gray_amount ) ), + 2 ) ); + + const QColor end_points_color( 0xFF, 0xBF, 0x22 ); + const QColor end_points_bg_color( 0, 0, 2 ); + + const int y_base = ENV_GRAPH_Y + s_envGraph->height() - 3; + const int avail_height = s_envGraph->height() - 6; + + int x1 = ENV_GRAPH_X + 2 + static_cast( m_predelayKnob->value() * + TIME_UNIT_WIDTH ); + int x2 = x1 + static_cast( m_attackKnob->value() * + TIME_UNIT_WIDTH ); + + p.drawLine( x1, y_base, x2, y_base - avail_height ); + p.fillRect( x1 - 1, y_base - 2, 4, 4, end_points_bg_color ); + p.fillRect( x1, y_base - 1, 2, 2, end_points_color ); + x1 = x2; + x2 = x1 + static_cast( m_holdKnob->value() * TIME_UNIT_WIDTH ); + + p.drawLine( x1, y_base - avail_height, x2, y_base - avail_height ); + p.fillRect( x1 - 1, y_base - 2 - avail_height, 4, 4, + end_points_bg_color ); + p.fillRect( x1, y_base-1-avail_height, 2, 2, end_points_color ); + x1 = x2; + x2 = x1 + static_cast( ( m_decayKnob->value() * + m_sustainKnob->value() ) * + TIME_UNIT_WIDTH ); + + p.drawLine( x1, y_base-avail_height, x2, static_cast( y_base - + avail_height + + m_sustainKnob->value() * avail_height ) ); + p.fillRect( x1 - 1, y_base - 2 - avail_height, 4, 4, + end_points_bg_color ); + p.fillRect( x1, y_base - 1 - avail_height, 2, 2, end_points_color ); + x1 = x2; + x2 = x1 + static_cast( m_releaseKnob->value() * TIME_UNIT_WIDTH ); + + p.drawLine( x1, static_cast( y_base - avail_height + + m_sustainKnob->value() * + avail_height ), x2, y_base ); + p.fillRect( x1-1, static_cast( y_base - avail_height + + m_sustainKnob->value() * + avail_height ) - 2, 4, 4, + end_points_bg_color ); + p.fillRect( x1, static_cast( y_base - avail_height + + m_sustainKnob->value() * + avail_height ) - 1, 2, 2, + end_points_color ); + p.fillRect( x2 - 1, y_base - 2, 4, 4, end_points_bg_color ); + p.fillRect( x2, y_base - 1, 2, 2, end_points_color ); + + + int LFO_GRAPH_W = s_lfoGraph->width() - 6; // substract border + int LFO_GRAPH_H = s_lfoGraph->height() - 6; // substract border + int graph_x_base = LFO_GRAPH_X + 3; + int graph_y_base = LFO_GRAPH_Y + 3 + LFO_GRAPH_H / 2; + + const float frames_for_graph = SECS_PER_LFO_OSCILLATION * + engine::getMixer()->sampleRate() / 10; + + const float lfo_gray_amount = 1.0f - fabsf( m_lfoAmountKnob->value() ); + p.setPen( QPen( QColor( static_cast( 96 * lfo_gray_amount ), + static_cast( 255 - 159 * lfo_gray_amount ), + static_cast( 128 - 32 * + lfo_gray_amount ) ), + 1.5 ) ); + + + float osc_frames = m_params->m_lfoOscillationFrames; + + if( m_params->m_x100Model.value() ) + { + osc_frames *= 100.0f; + } + + float old_y = 0; + for( int x = 0; x <= LFO_GRAPH_W; ++x ) + { + float val = 0.0; + float cur_sample = x * frames_for_graph / LFO_GRAPH_W; + if( static_cast( cur_sample ) > + m_params->m_lfoPredelayFrames ) + { + float phase = ( cur_sample -= + m_params->m_lfoPredelayFrames ) / + osc_frames; + switch( m_params->m_lfoWaveModel.value() ) + { + case envelopeAndLFOParameters::SineWave: + val = oscillator::sinSample( phase ); + break; + case envelopeAndLFOParameters::TriangleWave: + val = oscillator::triangleSample( + phase ); + break; + case envelopeAndLFOParameters::SawWave: + val = oscillator::sawSample( phase ); + break; + case envelopeAndLFOParameters::SquareWave: + val = oscillator::squareSample( phase ); + break; + case envelopeAndLFOParameters::UserDefinedWave: + val = m_params->m_userWave. + userWaveSample( phase ); + } + if( static_cast( cur_sample ) <= + m_params->m_lfoAttackFrames ) + { + val *= cur_sample / m_params->m_lfoAttackFrames; + } + } + float cur_y = -LFO_GRAPH_H / 2.0f * val; + p.drawLine( QLineF( graph_x_base + x - 1, graph_y_base + old_y, + graph_x_base + x, + graph_y_base + cur_y ) ); + old_y = cur_y; + } + + p.setPen( QColor( 255, 192, 0 ) ); + int ms_per_osc = static_cast( SECS_PER_LFO_OSCILLATION * + m_lfoSpeedKnob->value() * + 1000.0f ); + p.drawText( LFO_GRAPH_X + 4, LFO_GRAPH_Y + s_lfoGraph->height() - 6, + tr( "ms/LFO:" ) ); + p.drawText( LFO_GRAPH_X + 52, LFO_GRAPH_Y + s_lfoGraph->height() - 6, + QString::number( ms_per_osc ) ); + +} + + + + +void envelopeAndLFOView::lfoUserWaveChanged( void ) +{ + if( m_params->m_lfoWaveModel.value() == + envelopeAndLFOParameters::UserDefinedWave ) + { + if( m_params->m_userWave.frames() <= 1 ) + { + textFloat::displayMessage( tr( "Hint" ), + tr( "Drag a sample from somewhere and drop " + "it in this window." ), + embed::getIconPixmap( "hint" ), 3000 ); + } + } +} + + + + +#include "envelope_and_lfo_view.moc" + + +#endif diff --git a/src/widgets/instrument_function_views.cpp b/src/widgets/instrument_function_views.cpp new file mode 100644 index 000000000..0a025746a --- /dev/null +++ b/src/widgets/instrument_function_views.cpp @@ -0,0 +1,254 @@ +#ifndef SINGLE_SOURCE_COMPILE + +/* + * instrument_function_views.cpp - view for instrument-functions-tab + * + * Copyright (c) 2004-2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include + +#include "instrument_functions.h" +#include "instrument_function_views.h" +#include "combobox.h" +#include "embed.h" +#include "engine.h" +#include "group_box.h" +#include "gui_templates.h" +#include "knob.h" +#include "led_checkbox.h" +#include "pixmap_button.h" +#include "tempo_sync_knob.h" +#include "tooltip.h" + + + +const int CHORDS_GROUPBOX_X = 4; +const int CHORDS_GROUPBOX_Y = 5; +const int CHORDS_GROUPBOX_WIDTH = 238; +const int CHORDS_GROUPBOX_HEIGHT = 65; +const int ARP_GROUPBOX_X = CHORDS_GROUPBOX_X; +const int ARP_GROUPBOX_Y = 10 + CHORDS_GROUPBOX_Y + CHORDS_GROUPBOX_HEIGHT; +const int ARP_GROUPBOX_WIDTH = CHORDS_GROUPBOX_WIDTH; +const int ARP_GROUPBOX_HEIGHT = 240 - ARP_GROUPBOX_Y; + + + +chordCreatorView::chordCreatorView( chordCreator * _cc, QWidget * _parent ) : + QWidget( _parent ), + modelView( NULL ), + m_cc( _cc ), + m_chordsGroupBox( new groupBox( tr( "CHORDS" ), this ) ), + m_chordsComboBox( new comboBox( m_chordsGroupBox, + tr( "Chord type" ) ) ), + m_chordRangeKnob( new knob( knobBright_26, m_chordsGroupBox, + tr( "Chord range" ) ) ) +{ + move( CHORDS_GROUPBOX_X, CHORDS_GROUPBOX_Y ); + setFixedSize( 250, CHORDS_GROUPBOX_HEIGHT ); + m_chordsGroupBox->setGeometry( 0, 0, CHORDS_GROUPBOX_WIDTH, + CHORDS_GROUPBOX_HEIGHT ); + + + m_chordsComboBox->setGeometry( 10, 25, 140, 22 ); + + + m_chordRangeKnob->setLabel( tr( "RANGE" ) ); + m_chordRangeKnob->move( 164, 24 ); + m_chordRangeKnob->setHintText( tr( "Chord range:" ) + " ", " " + + tr( "octave(s)" ) ); + m_chordRangeKnob->setWhatsThis( + tr( "Use this knob for setting the chord range in octaves. " + "The selected chord will be played within specified " + "amount of octaves." ) ); + +} + + + + +chordCreatorView::~chordCreatorView() +{ +} + + + + +void chordCreatorView::modelChanged( void ) +{ + m_cc = castModel(); + m_chordsGroupBox->setModel( &m_cc->m_chordsEnabledModel ); + m_chordsComboBox->setModel( &m_cc->m_chordsModel ); + m_chordRangeKnob->setModel( &m_cc->m_chordRangeModel ); +} + + + + + + + +arpeggiatorView::arpeggiatorView( arpeggiator * _arp, QWidget * _parent ) : + QWidget( _parent ), + modelView( NULL ), + m_a( _arp ), + m_arpGroupBox( new groupBox( tr( "ARPEGGIO" ), this ) ), + m_arpComboBox( new comboBox( m_arpGroupBox, tr( "Arpeggio type" ) ) ), + m_arpRangeKnob( new knob( knobBright_26, m_arpGroupBox, + tr( "Arpeggio range" ) ) ), + m_arpTimeKnob( new tempoSyncKnob( knobBright_26, m_arpGroupBox, + tr( "Arpeggio time" ) ) ), + m_arpGateKnob( new knob( knobBright_26, m_arpGroupBox, + tr( "Arpeggio gate" ) ) ), + m_arpModeComboBox( new comboBox( m_arpGroupBox, + tr( "Arpeggio mode" ) ) ) +{ + move( ARP_GROUPBOX_X, ARP_GROUPBOX_Y ); + setFixedSize( 250, ARP_GROUPBOX_HEIGHT ); + m_arpGroupBox->setGeometry( 0, 0, ARP_GROUPBOX_WIDTH, + ARP_GROUPBOX_HEIGHT ); + + m_arpGroupBox->setWhatsThis( + tr( "An arpeggio is a type of playing (especially plucked) " + "instruments, which makes the music much livelier. " + "The strings of such instruments (e.g. harps) are " + "plucked like chords, the only difference is, that " + "this is done in a sequential order, so the notes are " + "not played at the same time. Typical arpeggios are " + "major or minor triads. But there're a lot of other " + "possible chords, you can select." ) ); + + + m_arpComboBox->setGeometry( 10, 25, 140, 22 ); + + + m_arpRangeKnob->setLabel( tr( "RANGE" ) ); + m_arpRangeKnob->move( 164, 24 ); + m_arpRangeKnob->setHintText( tr( "Arpeggio range:" ) + " ", " " + + tr( "octave(s)" ) ); + m_arpRangeKnob->setWhatsThis( + tr( "Use this knob for setting the arpeggio range in octaves. " + "The selected arpeggio will be played within specified " + "amount of octaves." ) ); + + + m_arpTimeKnob->setLabel( tr( "TIME" ) ); + m_arpTimeKnob->move( 164, 70 ); + m_arpTimeKnob->setHintText( tr( "Arpeggio time:" ) + " ", " " + + tr( "ms" ) ); + m_arpTimeKnob->setWhatsThis( + tr( "Use this knob for setting the arpeggio time in " + "milliseconds. The arpeggio time specifies how long " + "each arpeggio-tone should be played." ) ); + + + m_arpGateKnob->setLabel( tr( "GATE" ) ); + m_arpGateKnob->move( 204, 70 ); + m_arpGateKnob->setHintText( tr( "Arpeggio gate:" ) + " ", tr( "%" ) ); + m_arpGateKnob->setWhatsThis( + tr( "Use this knob for setting the arpeggio gate. The " + "arpeggio gate specifies the percent of a whole " + "arpeggio-tone that should be played. With this you " + "can make cool staccato-arpeggios." ) ); + + m_arpDirectionLbl = new QLabel( tr( "Direction:" ), m_arpGroupBox ); + m_arpDirectionLbl->setGeometry( 10, 60, 64, 10 ); + m_arpDirectionLbl->setFont( pointSize<7>( m_arpDirectionLbl->font() ) ); + + + + pixmapButton * arp_up_btn = new pixmapButton( m_arpGroupBox, NULL ); + arp_up_btn->move( 10, 74 ); + arp_up_btn->setActiveGraphic( embed::getIconPixmap( "arp_up_on" ) ); + arp_up_btn->setInactiveGraphic( embed::getIconPixmap( "arp_up_off" ) ); + toolTip::add( arp_up_btn, tr( "arpeggio direction = up" ) ); + + + pixmapButton * arp_down_btn = new pixmapButton( m_arpGroupBox, NULL ); + arp_down_btn->move( 30, 74 ); + arp_down_btn->setActiveGraphic( embed::getIconPixmap( "arp_down_on" ) ); + arp_down_btn->setInactiveGraphic( embed::getIconPixmap( + "arp_down_off" ) ); + toolTip::add( arp_down_btn, tr( "arpeggio direction = down" ) ); + + + pixmapButton * arp_up_and_down_btn = new pixmapButton( m_arpGroupBox, + NULL ); + arp_up_and_down_btn->move( 50, 74 ); + arp_up_and_down_btn->setActiveGraphic( embed::getIconPixmap( + "arp_up_and_down_on" ) ); + arp_up_and_down_btn->setInactiveGraphic( embed::getIconPixmap( + "arp_up_and_down_off" ) ); + toolTip::add( arp_up_and_down_btn, + tr( "arpeggio direction = up and down" ) ); + + + pixmapButton * arp_random_btn = new pixmapButton( m_arpGroupBox, NULL ); + arp_random_btn->move( 70, 74 ); + arp_random_btn->setActiveGraphic( embed::getIconPixmap( + "arp_random_on" ) ); + arp_random_btn->setInactiveGraphic( embed::getIconPixmap( + "arp_random_off" ) ); + toolTip::add( arp_random_btn, tr( "arpeggio direction = random" ) ); + + m_arpDirectionBtnGrp = new automatableButtonGroup( this, + tr( "Arpeggio direction" ) ); + m_arpDirectionBtnGrp->addButton( arp_up_btn ); + m_arpDirectionBtnGrp->addButton( arp_down_btn ); + m_arpDirectionBtnGrp->addButton( arp_up_and_down_btn ); + m_arpDirectionBtnGrp->addButton( arp_random_btn ); + + + + QLabel * mode_lbl = new QLabel( tr( "Mode:" ), m_arpGroupBox ); + mode_lbl->setGeometry( 10, 104, 64, 10 ); + mode_lbl->setFont( pointSize<7>( mode_lbl->font() ) ); + + m_arpModeComboBox->setGeometry( 10, 118, 128, 22 ); +} + + + + +arpeggiatorView::~arpeggiatorView() +{ +} + + + + +void arpeggiatorView::modelChanged( void ) +{ + m_a = castModel(); + m_arpGroupBox->setModel( &m_a->m_arpEnabledModel ); + m_arpComboBox->setModel( &m_a->m_arpModel ); + m_arpRangeKnob->setModel( &m_a->m_arpRangeModel ); + m_arpTimeKnob->setModel( &m_a->m_arpTimeModel ); + m_arpGateKnob->setModel( &m_a->m_arpGateModel ); + m_arpDirectionBtnGrp->setModel( &m_a->m_arpDirectionModel ); + m_arpModeComboBox->setModel( &m_a->m_arpModeModel ); +} + + + + +#endif diff --git a/src/widgets/instrument_midi_io_view.cpp b/src/widgets/instrument_midi_io_view.cpp new file mode 100644 index 000000000..91db2d30c --- /dev/null +++ b/src/widgets/instrument_midi_io_view.cpp @@ -0,0 +1,207 @@ +#ifndef SINGLE_SOURCE_COMPILE + +/* + * instrument_midi_io_view.cpp - MIDI-IO-View + * + * Copyright (c) 2005-2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include +#include + + +#include "instrument_midi_io_view.h" +#include "instrument_midi_io.h" +#include "embed.h" +#include "engine.h" +#include "gui_templates.h" +#include "midi_client.h" +#include "midi_port.h" +#include "mixer.h" +#include "led_checkbox.h" +#include "lcd_spinbox.h" +#include "tab_widget.h" +#include "tooltip.h" +#include "automatable_model_templates.h" + + + +instrumentMidiIOView::instrumentMidiIOView( QWidget * _parent ) : + QWidget( _parent ), + modelView( NULL ), + m_readablePorts( NULL ), + m_writeablePorts( NULL ) +{ + m_setupTabWidget = new tabWidget( tr( "MIDI-SETUP FOR THIS CHANNEL" ), + this ); + m_setupTabWidget->setGeometry( 4, 5, 238, 200 ); + + m_inputChannelSpinBox = new lcdSpinBox( 3, m_setupTabWidget, + tr( "Input channel" ) ); + m_inputChannelSpinBox->addTextForValue( 0, "---" ); + m_inputChannelSpinBox->setLabel( tr( "CHANNEL" ) ); + m_inputChannelSpinBox->move( 28, 52 ); + m_inputChannelSpinBox->setEnabled( FALSE ); + + + + m_outputChannelSpinBox = new lcdSpinBox( 3, m_setupTabWidget, + tr( "Output channel" ) ); + m_outputChannelSpinBox->setLabel( tr( "CHANNEL" ) ); + m_outputChannelSpinBox->move( 28, 132 ); + m_outputChannelSpinBox->setEnabled( FALSE ); + + + m_receiveCheckBox = new ledCheckBox( tr( "Receive MIDI-events" ), + m_setupTabWidget, + tr( "Receive MIDI-events" ) ); + m_receiveCheckBox->move( 10, 34 ); + // enabling/disabling widgets is UI-stuff thus we do not use model here + connect( m_receiveCheckBox, SIGNAL( toggled( bool ) ), + m_inputChannelSpinBox, SLOT( setEnabled( bool ) ) ); + + + m_defaultVelocityInCheckBox = new ledCheckBox( + tr( "Default velocity for all input-events" ), + m_setupTabWidget, + tr( "Default input velocity" ) ); + m_defaultVelocityInCheckBox->move( 28, 84 ); + + + m_sendCheckBox = new ledCheckBox( tr( "Send MIDI-events" ), + m_setupTabWidget, + tr( "Send MIDI-events" ) ); + m_sendCheckBox->move( 10, 114 ); + connect( m_sendCheckBox, SIGNAL( toggled( bool ) ), + m_outputChannelSpinBox, SLOT( setEnabled( bool ) ) ); + + + m_defaultVelocityOutCheckBox = new ledCheckBox( + tr( "Default velocity for all output-events" ), + m_setupTabWidget, + tr( "Default output velocity" ) ); + m_defaultVelocityOutCheckBox->move( 28, 164 ); + + + + // when using with non-raw-clients we can provide buttons showing + // our port-menus when being clicked + midiClient * mc = engine::getMixer()->getMIDIClient(); + if( mc->isRaw() == FALSE ) + { + m_readablePorts = new QMenu( m_setupTabWidget ); + m_readablePorts->setFont( pointSize<9>( + m_readablePorts->font() ) ); + connect( m_readablePorts, SIGNAL( triggered( QAction * ) ), + this, SLOT( activatedReadablePort( QAction * ) ) ); + + m_writeablePorts = new QMenu( m_setupTabWidget ); + m_writeablePorts->setFont( pointSize<9>( + m_writeablePorts->font() ) ); + connect( m_writeablePorts, SIGNAL( triggered( QAction * ) ), + this, SLOT( activatedWriteablePort( QAction * ) ) ); + + // fill menus +/* readablePortsChanged(); + writeablePortsChanged();*/ + + QToolButton * rp_btn = new QToolButton( m_setupTabWidget ); + rp_btn->setText( tr( "MIDI-devices to receive " + "MIDI-events from" ) ); + rp_btn->setIcon( embed::getIconPixmap( "midi_in" ) ); + rp_btn->setGeometry( 186, 34, 40, 40 ); + rp_btn->setMenu( m_readablePorts ); + rp_btn->setPopupMode( QToolButton::InstantPopup ); + + QToolButton * wp_btn = new QToolButton( m_setupTabWidget ); + wp_btn->setText( tr( "MIDI-devices to send MIDI-events " + "to" ) ); + wp_btn->setIcon( embed::getIconPixmap( "midi_out" ) ); + wp_btn->setGeometry( 186, 114, 40, 40 ); + wp_btn->setMenu( m_writeablePorts ); + wp_btn->setPopupMode( QToolButton::InstantPopup ); + } +} + + + + +instrumentMidiIOView::~instrumentMidiIOView() +{ +} + + + + +void instrumentMidiIOView::modelChanged( void ) +{ + instrumentMidiIO * mio = castModel(); + m_inputChannelSpinBox->setModel( &mio->m_inputChannelModel ); + m_outputChannelSpinBox->setModel( &mio->m_outputChannelModel ); + m_receiveCheckBox->setModel( &mio->m_receiveEnabledModel ); + m_defaultVelocityInCheckBox->setModel( + &mio->m_defaultVelocityInEnabledModel ); + m_sendCheckBox->setModel( &mio->m_sendEnabledModel ); + m_defaultVelocityOutCheckBox->setModel( + &mio->m_defaultVelocityOutEnabledModel ); +} + + + + +void instrumentMidiIOView::activatedReadablePort( QAction * _item ) +{ + instrumentMidiIO * mio = castModel(); + // make sure, MIDI-port is configured for input + if( _item->isChecked() == TRUE && + mio->m_midiPort->mode() != midiPort::INPUT && + mio->m_midiPort->mode() != midiPort::DUPLEX ) + { + mio->m_receiveEnabledModel.setValue( TRUE ); + } + engine::getMixer()->getMIDIClient()->subscribeReadablePort( + mio->m_midiPort, _item->text(), !_item->isChecked() ); +} + + + + +void instrumentMidiIOView::activatedWriteablePort( QAction * _item ) +{ + instrumentMidiIO * mio = castModel(); + // make sure, MIDI-port is configured for output + if( _item->isChecked() == TRUE && + mio->m_midiPort->mode() != midiPort::OUTPUT && + mio->m_midiPort->mode() != midiPort::DUPLEX ) + { + mio->m_sendEnabledModel.setValue( TRUE ); + } + engine::getMixer()->getMIDIClient()->subscribeWriteablePort( + mio->m_midiPort, _item->text(), !_item->isChecked() ); +} + + + +#include "instrument_midi_io_view.moc" + + +#endif diff --git a/src/widgets/instrument_sound_shaping_view.cpp b/src/widgets/instrument_sound_shaping_view.cpp new file mode 100644 index 000000000..f0b97c0cf --- /dev/null +++ b/src/widgets/instrument_sound_shaping_view.cpp @@ -0,0 +1,150 @@ +/* + * instrument_sound_shaping_view.cpp - view for instrumentSoundShaping-class + * + * Copyright (c) 2004-2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "instrument_sound_shaping_view.h" +#include "envelope_and_lfo_parameters.h" +#include "envelope_and_lfo_view.h" +#include "combobox.h" +#include "group_box.h" +#include "gui_templates.h" +#include "knob.h" +#include "tab_widget.h" + + + +const int TARGETS_TABWIDGET_X = 4; +const int TARGETS_TABWIDGET_Y = 5; +const int TARGETS_TABWIDGET_WIDTH = 238; +const int TARGETS_TABWIDGET_HEIGTH = 175; + +const int FILTER_GROUPBOX_X = TARGETS_TABWIDGET_X; +const int FILTER_GROUPBOX_Y = TARGETS_TABWIDGET_Y+TARGETS_TABWIDGET_HEIGTH+5; +const int FILTER_GROUPBOX_WIDTH = TARGETS_TABWIDGET_WIDTH; +const int FILTER_GROUPBOX_HEIGHT = 245-FILTER_GROUPBOX_Y; + + + +instrumentSoundShapingView::instrumentSoundShapingView( QWidget * _parent ) : + QWidget( _parent ), + modelView( NULL ), + m_ss( NULL ) +{ + m_targetsTabWidget = new tabWidget( tr( "TARGET" ), this ); + m_targetsTabWidget->setGeometry( TARGETS_TABWIDGET_X, + TARGETS_TABWIDGET_Y, + TARGETS_TABWIDGET_WIDTH, + TARGETS_TABWIDGET_HEIGTH ); + m_targetsTabWidget->setWhatsThis( + tr( "These tabs contain envelopes. They're very important for " + "modifying a sound, for not saying that they're almost " + "always neccessary for substractive synthesis. For " + "example if you have a volume-envelope, you can set " + "when the sound should have which volume-level. " + "Maybe you want to create some soft strings. Then your " + "sound has to fade in and out very softly. This can be " + "done by setting a large attack- and release-time. " + "It's the same for other envelope-targets like " + "panning, cutoff-frequency of used filter and so on. " + "Just monkey around with it! You can really make cool " + "sounds out of a saw-wave with just some " + "envelopes...!" ) ); + + for( int i = 0; i < instrumentSoundShaping::NumTargets; ++i ) + { + m_envLFOViews[i] = new envelopeAndLFOView( m_targetsTabWidget ); + m_targetsTabWidget->addTab( m_envLFOViews[i], + tr( __targetNames[i][0] + .toAscii().constData() ) ); + } + + + m_filterGroupBox = new groupBox( tr( "FILTER" ), this ); + m_filterGroupBox->setGeometry( FILTER_GROUPBOX_X, FILTER_GROUPBOX_Y, + FILTER_GROUPBOX_WIDTH, + FILTER_GROUPBOX_HEIGHT ); + + + m_filterComboBox = new comboBox( m_filterGroupBox, + tr( "Filter type" ) ); + m_filterComboBox->setGeometry( 14, 22, 120, 22 ); + m_filterComboBox->setFont( pointSize<8>( m_filterComboBox->font() ) ); + + m_filterComboBox->setWhatsThis( + tr( "Here you can select the built-in filter you want to use " + "for this instrument-track. Filters are very important " + "for changing the characteristics of a sound." ) ); + + + m_filterCutKnob = new knob( knobBright_26, m_filterGroupBox, + tr( "cutoff-frequency" ) ); + m_filterCutKnob->setLabel( tr( "CUTOFF" ) ); + m_filterCutKnob->move( 140, 18 ); + m_filterCutKnob->setHintText( tr( "cutoff-frequency:" ) + " ", " " + + tr( "Hz" ) ); + m_filterCutKnob->setWhatsThis( + tr( "Use this knob for setting the cutoff-frequency for the " + "selected filter. The cutoff-frequency specifies the " + "frequency for cutting the signal by a filter. For " + "example a lowpass-filter cuts all frequencies above " + "the cutoff-frequency. A highpass-filter cuts all " + "frequencies below cutoff-frequency and so on..." ) ); + + + m_filterResKnob = new knob( knobBright_26, m_filterGroupBox, + tr( "Q/Resonance" ) ); + m_filterResKnob->setLabel( tr( "Q/RESO" ) ); + m_filterResKnob->move( 190, 18 ); + m_filterResKnob->setHintText( tr( "Q/Resonance:" ) + " ", "" ); + m_filterResKnob->setWhatsThis( + tr( "Use this knob for setting Q/Resonance for the selected " + "filter. Q/Resonance tells the filter, how much it " + "should amplify frequencies near Cutoff-frequency." ) ); +} + + + + +instrumentSoundShapingView::~instrumentSoundShapingView() +{ + delete m_targetsTabWidget; +} + + + + +void instrumentSoundShapingView::modelChanged( void ) +{ + m_ss = castModel(); + m_filterGroupBox->setModel( &m_ss->m_filterEnabledModel ); + m_filterComboBox->setModel( &m_ss->m_filterModel ); + m_filterCutKnob->setModel( &m_ss->m_filterCutModel ); + m_filterResKnob->setModel( &m_ss->m_filterResModel ); + for( int i = 0; i < instrumentSoundShaping::NumTargets; ++i ) + { + m_envLFOViews[i]->setModel( m_ss->m_envLFOParameters[i] ); + } +} + + diff --git a/src/widgets/project_notes.cpp b/src/widgets/project_notes.cpp index 91745ca31..6f73265e3 100644 --- a/src/widgets/project_notes.cpp +++ b/src/widgets/project_notes.cpp @@ -3,7 +3,7 @@ /* * project_notes.cpp - implementation of project-notes-editor * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -42,7 +42,7 @@ #include "embed.h" #include "engine.h" #include "main_window.h" -#include "song_editor.h" +#include "song.h" @@ -63,7 +63,7 @@ projectNotes::projectNotes( void ) : // connect( m_edit, SIGNAL( currentAlignmentChanged( int ) ), // this, SLOT( alignmentChanged( int ) ) ); connect( m_edit, SIGNAL( textChanged() ), - engine::getSongEditor(), SLOT( setModified() ) ); + engine::getSong(), SLOT( setModified() ) ); setupActions(); @@ -258,7 +258,7 @@ void projectNotes::textBold() { m_edit->setFontWeight( m_actionTextBold->isChecked() ? QFont::Bold : QFont::Normal ); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } @@ -267,7 +267,7 @@ void projectNotes::textBold() void projectNotes::textUnderline() { m_edit->setFontUnderline( m_actionTextUnderline->isChecked() ); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } @@ -276,7 +276,7 @@ void projectNotes::textUnderline() void projectNotes::textItalic() { m_edit->setFontItalic( m_actionTextItalic->isChecked() ); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } @@ -286,7 +286,7 @@ void projectNotes::textFamily( const QString & _f ) { m_edit->setFontFamily( _f ); m_edit->viewport()->setFocus(); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } @@ -296,7 +296,7 @@ void projectNotes::textSize( const QString & _p ) { m_edit->setFontPointSize( _p.toInt() ); m_edit->viewport()->setFocus(); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } @@ -354,7 +354,7 @@ void projectNotes::formatChanged( const QTextCharFormat & _f ) pix.fill( _f.foreground().color() ); m_actionTextColor->setIcon( pix ); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } @@ -378,7 +378,7 @@ void projectNotes::alignmentChanged( int _a ) { m_actionAlignJustify->setChecked( TRUE ); } - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } diff --git a/src/widgets/tempo_sync_knob.cpp b/src/widgets/tempo_sync_knob.cpp index 2173b68d9..fe71b1472 100644 --- a/src/widgets/tempo_sync_knob.cpp +++ b/src/widgets/tempo_sync_knob.cpp @@ -4,7 +4,7 @@ * tempo_sync_knob.cpp - adds bpm to ms conversion for knob class * * Copyright (c) 2005-2007 Danny McRae - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -37,7 +37,7 @@ #include "embed.h" #include "main_window.h" #include "meter_dialog.h" -#include "song_editor.h" +#include "song.h" tempoSyncKnob::tempoSyncKnob( int _knob_num, QWidget * _parent, @@ -50,7 +50,7 @@ tempoSyncKnob::tempoSyncKnob( int _knob_num, QWidget * _parent, m_tempoSyncDescription( tr( "Tempo Sync" ) ), m_tempoLastSyncMode( NO_SYNC ) { - connect( engine::getSongEditor(), SIGNAL( tempoChanged( bpm_t ) ), + connect( engine::getSong(), SIGNAL( tempoChanged( bpm_t ) ), this, SLOT( calculateTempoSyncTime( bpm_t ) ) ); m_custom = new meterDialog( engine::getMainWindow()->workspace(), NULL ); @@ -93,7 +93,7 @@ void tempoSyncKnob::contextMenuEvent( QContextMenuEvent * ) this, SLOT( pasteValue() ) ); contextMenu.addSeparator(); - float limit = 60000.0f / ( engine::getSongEditor()->getTempo() * + float limit = 60000.0f / ( engine::getSong()->getTempo() * m_scale ); QMenu * syncMenu = contextMenu.addMenu( m_tempoSyncIcon, @@ -173,7 +173,7 @@ void tempoSyncKnob::contextMenuEvent( QContextMenuEvent * ) void tempoSyncKnob::mouseMoveEvent( QMouseEvent * _me ) { m_tempoSyncMode = NO_SYNC; - calculateTempoSyncTime( engine::getSongEditor()->getTempo() ); + calculateTempoSyncTime( engine::getSong()->getTempo() ); knob::mouseMoveEvent( _me ); } @@ -184,7 +184,7 @@ void tempoSyncKnob::wheelEvent( QWheelEvent * _we ) { knob::wheelEvent( _we ); m_tempoSyncMode = NO_SYNC; - calculateTempoSyncTime( engine::getSongEditor()->getTempo() ); + calculateTempoSyncTime( engine::getSong()->getTempo() ); } @@ -201,7 +201,7 @@ void tempoSyncKnob::setTempoSync( QAction * _item ) void tempoSyncKnob::setTempoSync( int _note_type ) { setSyncMode( ( tempoSyncMode ) _note_type ); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } @@ -380,7 +380,7 @@ void tempoSyncKnob::setSyncMode( tempoSyncMode _new_mode ) this, SLOT( updateCustom() ) ); } } - calculateTempoSyncTime( engine::getSongEditor()->getTempo() ); + calculateTempoSyncTime( engine::getSong()->getTempo() ); } @@ -397,7 +397,7 @@ float tempoSyncKnob::getScale( void ) void tempoSyncKnob::setScale( float _new_scale ) { m_scale = _new_scale; - calculateTempoSyncTime( engine::getSongEditor()->getTempo() ); + calculateTempoSyncTime( engine::getSong()->getTempo() ); emit scaleChanged( _new_scale ); } From d3a46695cf719a8295039caf0cca0838f2731be1 Mon Sep 17 00:00:00 2001 From: Paul Giblock Date: Sat, 16 Feb 2008 02:14:14 +0000 Subject: [PATCH 52/87] Updated some instruments for MV git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@692 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 8 + plugins/organic/organic.cpp | 185 ++++++++++-------- plugins/organic/organic.h | 2 +- .../plucked_string_synth.cpp | 76 ++++--- .../plucked_string_synth.h | 19 ++ 5 files changed, 176 insertions(+), 114 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2f7c0fd0a..a7c1169b1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-02-15 Paul Giblock + * plugins/plucked_string_synth/plucked_string_synth.cpp: + * plugins/plucked_string_synth/plucked_string_synth.h: + * plugins/organic/organic.cpp: + * plugins/organic/organic.h: + Updated some instruments for M/V. Unfortunately one is an old version + and the other is obsoleted + 2008-02-16 Tobias Doerffel * plugins/ladspa_effect/ladspa_controls.cpp: diff --git a/plugins/organic/organic.cpp b/plugins/organic/organic.cpp index d09b51bed..1d6db7efa 100644 --- a/plugins/organic/organic.cpp +++ b/plugins/organic/organic.cpp @@ -81,10 +81,24 @@ organicInstrument::organicInstrument( instrumentTrack * _channel_track ) : { m_numOscillators = 8; + m_osc = new oscillatorObject*[ m_numOscillators ]; for (int i=0; i < m_numOscillators; i++) { m_osc[i] = new oscillatorObject( this, _channel_track ); m_osc[i]->m_numOscillators = m_numOscillators; + + // Connect events + connect( &m_osc[i]->m_oscKnob, SIGNAL( dataChanged() ), + m_osc[i], SLOT ( oscButtonChanged() ) ); + connect( &m_osc[i]->m_volKnob, SIGNAL( dataChanged() ), + m_osc[i], SLOT( updateVolume() ) ); + connect( &m_osc[i]->m_panKnob, SIGNAL( dataChanged() ), + m_osc[i], SLOT( updateVolume() ) ); + connect( &m_osc[i]->m_detuneKnob, SIGNAL( dataChanged() ), + m_osc[i], SLOT( updateDetuning() ) ); + + m_osc[i]->updateVolume(); + } m_osc[0]->m_harmonic = log2f( 0.5f ); // one octave below @@ -102,8 +116,9 @@ organicInstrument::organicInstrument( instrumentTrack * _channel_track ) : } - //connect( engine::getMixer(), SIGNAL( sampleRateChanged() ), - // this, SLOT( updateAllDetuning() ) ); + connect( engine::getMixer(), SIGNAL( sampleRateChanged() ), + this, SLOT( updateAllDetuning() ) ); + } @@ -129,7 +144,7 @@ void organicInstrument::saveSettings( QDomDocument & _doc, QDomElement & _this ) m_osc[i]->m_volKnob.saveSettings( _doc, _this, "vol" + is ); m_osc[i]->m_panKnob.saveSettings( _doc, _this, "pan" + is ); _this.setAttribute( "harmonic" + is, QString::number( - powf( 2.0f, m_osc[i]->m_harmonic ) ) ); + d powf( 2.0f, m_osc[i]->m_harmonic ) ) ); m_osc[i]->m_detuneKnob.saveSettings( _doc, _this, "detune" + is ); m_osc[i]->m_oscKnob.saveSettings( _doc, _this, "wavetype" @@ -304,20 +319,20 @@ float inline organicInstrument::waveshape(float in, float amount) void organicInstrument::randomiseSettings( void ) { -/* + for( int i = 0; i < m_numOscillators; i++ ) { - m_osc[i].m_volKnob->setValue( intRand( 0, 100 ) ); + m_osc[i]->m_volKnob.setValue( intRand( 0, 100 ) ); - m_osc[i].m_detuneKnob->setValue( intRand( -5, 5 ) ); + m_osc[i]->m_detuneKnob.setValue( intRand( -5, 5 ) ); - m_osc[i].m_panKnob->setValue( + m_osc[i]->m_panKnob.setValue( //(int)gaussRand(PANNING_LEFT, PANNING_RIGHT,1,0) 0 ); - m_osc[i].m_oscKnob->setValue( intRand( 0, 5 ) ); + m_osc[i]->m_oscKnob.setValue( intRand( 0, 5 ) ); } -*/ + } @@ -342,17 +357,79 @@ int organicInstrument::intRand( int min, int max ) return( randn ); } + +pluginView * organicInstrument::instantiateView( QWidget * _parent ) +{ + return( new organicInstrumentView( this, _parent ) ); +} + + organicInstrumentView::organicInstrumentView( instrument * _instrument, QWidget * _parent ) : instrumentView( _instrument, _parent ) { + organicInstrument * oi = castModel(); + setAutoFillBackground( TRUE ); QPalette pal; pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); setPalette( pal ); - for (int i=0; i < m_numOscillators; ++i) + // setup knob for FX1 + m_fx1Knob = new knob( knobGreen_17, this, tr( "FX1" ) ); + m_fx1Knob->move( 20, 200 ); + + // setup volume-knob + m_volKnob = new knob( knobGreen_17, this, tr( "Osc %1 volume" ).arg( + 1 ) ); + m_volKnob->move( 50, 200 ); + m_volKnob->setHintText( tr( "Osc %1 volume:" ).arg( 1 ) + " ", "%" ); + + // randomise + m_randBtn = new pixmapButton( this, tr( "Randomise" ) ); + m_randBtn->move( 100, 200 ); + m_randBtn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "randomise_pressed" ) ); + m_randBtn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "randomise" ) ); + //m_randBtn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( "btn_mask" ). + // createHeuristicMask() ) ); + + connect( m_randBtn, SIGNAL ( clicked() ), + oi, SLOT( randomiseSettings() ) ); + + + if( s_artwork == NULL ) + { + s_artwork = new QPixmap( PLUGIN_NAME::getIconPixmap( + "artwork" ) ); + } + +} + + +organicInstrumentView::~organicInstrumentView() +{ + delete[] m_oscKnobs; +} + + +void organicInstrumentView::modelChanged( void ) +{ + organicInstrument * oi = castModel(); + + m_numOscillators = oi->m_numOscillators; + + m_fx1Knob->setModel( &oi->m_fx1Knob ); + m_volKnob->setModel( &oi->m_volKnob ); + + // TODO: Delete existing oscKnobs if they exist + + m_oscKnobs = new oscillatorKnobs[ m_numOscillators ]; + + // Create knobs, now that we know how many to make + for( int i = 0; i < m_numOscillators; ++i ) { // setup waveform-knob knob * oscKnob = new knob( knobGreen_17, this, tr( @@ -361,9 +438,6 @@ organicInstrumentView::organicInstrumentView( instrument * _instrument, oscKnob->setHintText( tr( "Osc %1 waveform:" ).arg( i + 1 ) + " ", "%" ); - //connect( m_osc[i].m_oscKnob, SIGNAL( valueChanged() ), - // &m_osc[i], SLOT ( oscButtonChanged() ) ); - // setup volume-knob volumeKnob * volKnob = new volumeKnob( knobGreen_17, this, tr( "Osc %1 volume" ).arg( i + 1 ) ); @@ -389,65 +463,7 @@ organicInstrumentView::organicInstrumentView( instrument * _instrument, m_oscKnobs[i] = oscillatorKnobs( volKnob, oscKnob, panKnob, detuneKnob ); - - /*connect( m_osc[i].m_volKnob, SIGNAL( valueChanged() ), - &m_osc[i], SLOT( updateVolume() ) ); - connect( m_osc[i].m_panKnob, SIGNAL( valueChanged() ), - &m_osc[i], SLOT( updateVolume() ) ); - //m_osc[i].updateVolume(); - - connect( m_osc[i].m_detuneKnob, SIGNAL( valueChanged() ), - &m_osc[i], SLOT( updateDetuning() ) ); - //m_osc[i].updateDetuning();*/ - } - - - // setup knob for FX1 - m_fx1Knob = new knob( knobGreen_17, this, tr( "FX1" ) ); - m_fx1Knob->move( 20, 200 ); - - // setup volume-knob - m_volKnob = new knob( knobGreen_17, this, tr( "Osc %1 volume" ).arg( - 1 ) ); - m_volKnob->move( 50, 200 ); - m_volKnob->setHintText( tr( "Osc %1 volume:" ).arg( 1 ) + " ", "%" ); - - // randomise - /*m_randBtn = new pixmapButton( this, tr( "Randomise" ), _channel_track ); - m_randBtn->move( 100, 200 ); - m_randBtn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "randomise_pressed" ) ); - m_randBtn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "randomise" ) ); - //m_randBtn->setMask( QBitmap( PLUGIN_NAME::getIconPixmap( "btn_mask" ). - // createHeuristicMask() ) ); - - connect( m_randBtn, SIGNAL ( clicked() ), - this, SLOT( randomiseSettings() ) ); -*/ - - - - if( s_artwork == NULL ) - { - s_artwork = new QPixmap( PLUGIN_NAME::getIconPixmap( - "artwork" ) ); - } -} - - - -void organicInstrumentView::modelChanged( void ) -{ - organicInstrument * oi = castModel(); - - m_numOscillators = oi->m_numOscillators; - - m_fx1Knob->setModel( &oi->m_fx1Knob ); - m_volKnob->setModel( &oi->m_volKnob ); - - for( int i = 0; i < m_numOscillators; ++i ) - { + // Attach to models m_oscKnobs[i].m_volKnob->setModel( &oi->m_osc[i]->m_volKnob ); m_oscKnobs[i].m_oscKnob->setModel( @@ -456,6 +472,8 @@ void organicInstrumentView::modelChanged( void ) &oi->m_osc[i]->m_panKnob ); m_oscKnobs[i].m_detuneKnob->setModel( &oi->m_osc[i]->m_detuneKnob ); + + /*connect( m_oscKnobs[i].m_userWaveButton, SIGNAL( doubleClicked() ), t->m_osc[i], SLOT( oscUserDefWaveDblClick() ) ); @@ -467,7 +485,7 @@ void organicInstrumentView::modelChanged( void ) oscillatorObject::oscillatorObject( model * _parent, track * _track ) : model( _parent ), m_waveShape( oscillator::SineWave, 0, oscillator::NumWaveShapes-1, 1, this ), - m_oscKnob( 0.0f, 0.0f, 5.0f, 0.25f, this ), + m_oscKnob( 0.0f, 0.0f, 5.0f, 1.0f, this ), m_volKnob( 100.0f, 0.0f, 100.0f, 1.0f, this ), m_panKnob( DEFAULT_PANNING, PANNING_LEFT, PANNING_RIGHT, 1.0f, this ), m_detuneKnob( 0.0f, -100.0f, 100.0f, 1.0f, this ) @@ -486,19 +504,19 @@ oscillatorObject::~oscillatorObject() void oscillatorObject::oscButtonChanged( void ) { -/* - static oscillator::waveShapes shapes[] = + + static oscillator::WaveShapes shapes[] = { - oscillator::SIN_WAVE, - oscillator::SAW_WAVE, - oscillator::SQUARE_WAVE, - oscillator::TRIANGLE_WAVE, - oscillator::MOOG_SAW_WAVE, - oscillator::EXP_WAVE + oscillator::SineWave, + oscillator::SawWave, + oscillator::SquareWave, + oscillator::TriangleWave, + oscillator::MoogSawWave, + oscillator::ExponentialWave } ; - m_waveShape = shapes[(int)roundf( m_oscKnob->value() )]; -*/ + m_waveShape.setValue( shapes[(int)roundf( m_oscKnob.value() )] ); + } @@ -506,6 +524,7 @@ void oscillatorObject::oscButtonChanged( void ) void oscillatorObject::updateVolume( void ) { + printf("Updating VOL\n"); m_volumeLeft = ( 1.0f - m_panKnob.value() / (float)PANNING_RIGHT ) * m_volKnob.value() / m_numOscillators / 100.0f; m_volumeRight = ( 1.0f + m_panKnob.value() / (float)PANNING_RIGHT ) diff --git a/plugins/organic/organic.h b/plugins/organic/organic.h index 780dbda34..8dd8c8682 100644 --- a/plugins/organic/organic.h +++ b/plugins/organic/organic.h @@ -125,7 +125,6 @@ private: floatModel m_fx1Knob; floatModel m_volKnob; - /*pixmapButton * m_randBtn;*/ virtual pluginView * instantiateView( QWidget * _parent ); @@ -171,6 +170,7 @@ private: knob * m_fx1Knob; knob * m_volKnob; + pixmapButton * m_randBtn; int m_numOscillators; diff --git a/plugins/plucked_string_synth/plucked_string_synth.cpp b/plugins/plucked_string_synth/plucked_string_synth.cpp index 271deccb1..d6e676379 100644 --- a/plugins/plucked_string_synth/plucked_string_synth.cpp +++ b/plugins/plucked_string_synth/plucked_string_synth.cpp @@ -59,30 +59,10 @@ plugin::descriptor pluckedstringsynth_plugin_descriptor = // add distortion pluckedStringSynth::pluckedStringSynth( instrumentTrack * _instrument_track ) : - instrument( _instrument_track, &pluckedstringsynth_plugin_descriptor ) + instrument( _instrument_track, &pluckedstringsynth_plugin_descriptor ), + m_pickModel( 0.0f, 0.0f, 0.5f, 0.005f, this ), + m_pickupModel( 0.05f, 0.0f, 0.5f, 0.005f, this ) { - m_pickKnob = new knob( knobDark_28, this, tr( "Pick position" ), - _instrument_track ); - m_pickKnob->setRange( 0.0f, 0.5f, 0.005f ); - m_pickKnob->setInitValue( 0.0f ); - m_pickKnob->move( 86, 134 ); - m_pickKnob->setHintText( tr( "Pick position:" ) + " ", "" ); - - m_pickupKnob = new knob( knobDark_28, this, tr( "Pickup position" ), - _instrument_track ); - m_pickupKnob->setRange( 0.0f, 0.5f, 0.005f ); - m_pickupKnob->setInitValue( 0.05f ); - m_pickupKnob->move( 138, 134 ); - m_pickupKnob->setHintText( tr( "Pickup position:" ) + " ", "" ); -#ifdef QT4 - setAutoFillBackground( TRUE ); - QPalette pal; - pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( - "artwork" ) ); - setPalette( pal ); -#else - setErasePixmap( PLUGIN_NAME::getIconPixmap( "artwork" ) ); -#endif } @@ -98,8 +78,8 @@ pluckedStringSynth::~pluckedStringSynth() void pluckedStringSynth::saveSettings( QDomDocument & _doc, QDomElement & _this ) { - m_pickKnob->saveSettings( _doc, _this, "pick" ); - m_pickupKnob->saveSettings( _doc, _this, "pickup" ); + m_pickModel.saveSettings( _doc, _this, "pick" ); + m_pickupModel.saveSettings( _doc, _this, "pickup" ); } @@ -107,8 +87,8 @@ void pluckedStringSynth::saveSettings( QDomDocument & _doc, void pluckedStringSynth::loadSettings( const QDomElement & _this ) { - m_pickKnob->loadSettings( _this, "pick" ); - m_pickupKnob->loadSettings( _this, "pickup" ); + m_pickModel.loadSettings( _this, "pick" ); + m_pickupModel.loadSettings( _this, "pickup" ); } @@ -127,8 +107,8 @@ void pluckedStringSynth::playNote( notePlayHandle * _n, bool ) if ( _n->totalFramesPlayed() == 0 ) { _n->m_pluginData = new pluckSynth( _n->frequency(), - m_pickKnob->value(), - m_pickupKnob->value(), + m_pickModel.value(), + m_pickupModel.value(), engine::getMixer()->sampleRate() ); } @@ -159,8 +139,44 @@ void pluckedStringSynth::deleteNotePluginData( notePlayHandle * _n ) } +pluginView * pluckedStringSynth::instantiateView( QWidget * _parent ) +{ + return( new pluckedStringSynthView( this, _parent ) ); +} +pluckedStringSynthView::pluckedStringSynthView( instrument * _instrument, + QWidget * _parent ) : + instrumentView( _instrument, _parent ) +{ + m_pickKnob = new knob( knobDark_28, this, tr( "Pick position" ) ); + m_pickKnob->move( 86, 134 ); + m_pickKnob->setHintText( tr( "Pick position:" ) + " ", "" ); + + m_pickupKnob = new knob( knobDark_28, this, tr( "Pickup position" ) ); + m_pickupKnob->move( 138, 134 ); + m_pickupKnob->setHintText( tr( "Pickup position:" ) + " ", "" ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( + "artwork" ) ); + setPalette( pal ); +} + + +pluckedStringSynthView::~pluckedStringSynthView() +{ +} + + +void pluckedStringSynthView::modelChanged( void ) +{ + pluckedStringSynth * p = castModel(); + m_pickKnob->setModel( &p->m_pickModel ); + m_pickupKnob->setModel( &p->m_pickupModel ); +} + pluckSynth::delayLine * FASTCALL pluckSynth::initDelayLine( int _len ) { @@ -250,7 +266,7 @@ extern "C" { // neccessary for getting instance out of shared lib -plugin * lmms_plugin_main( void * _data ) +plugin * lmms_plugin_main( model *, void * _data ) { return( new pluckedStringSynth( static_cast( _data ) ) ); diff --git a/plugins/plucked_string_synth/plucked_string_synth.h b/plugins/plucked_string_synth/plucked_string_synth.h index a88a0f08c..961214ce9 100644 --- a/plugins/plucked_string_synth/plucked_string_synth.h +++ b/plugins/plucked_string_synth/plucked_string_synth.h @@ -28,6 +28,8 @@ #define _PLUCKED_STRING_SYNTH_H #include "instrument.h" +#include "instrument_view.h" +#include "knob.h" class knob; @@ -208,8 +210,25 @@ public: virtual QString nodeName( void ) const; + virtual pluginView * instantiateView( QWidget * _parent ); private: + knobModel m_pickModel; + knobModel m_pickupModel; + + friend class pluckedStringSynthView; +} ; + +class pluckedStringSynthView : public instrumentView +{ +public: + pluckedStringSynthView( instrument * _instrument, + QWidget * _parent ); + virtual ~pluckedStringSynthView(); + +private: + virtual void modelChanged( void ); + knob * m_pickKnob; knob * m_pickupKnob; From fa4bcc6cf7bdc2049c89d155d0498cedb81c63d8 Mon Sep 17 00:00:00 2001 From: Paul Giblock Date: Sat, 16 Feb 2008 02:16:27 +0000 Subject: [PATCH 53/87] ChangeLog formatting git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@693 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index a7c1169b1..41191b99a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,7 @@ * plugins/plucked_string_synth/plucked_string_synth.h: * plugins/organic/organic.cpp: * plugins/organic/organic.h: + Updated some instruments for M/V. Unfortunately one is an old version and the other is obsoleted From b3f7195a8d59df08c9bfa1956a686afc5255dde4 Mon Sep 17 00:00:00 2001 From: Paul Giblock Date: Sat, 16 Feb 2008 02:31:21 +0000 Subject: [PATCH 54/87] removed stray character git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@694 0778d3d1-df1d-0410-868b-ea421aaaa00d --- plugins/organic/organic.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/organic/organic.cpp b/plugins/organic/organic.cpp index 1d6db7efa..45aed3003 100644 --- a/plugins/organic/organic.cpp +++ b/plugins/organic/organic.cpp @@ -144,7 +144,7 @@ void organicInstrument::saveSettings( QDomDocument & _doc, QDomElement & _this ) m_osc[i]->m_volKnob.saveSettings( _doc, _this, "vol" + is ); m_osc[i]->m_panKnob.saveSettings( _doc, _this, "pan" + is ); _this.setAttribute( "harmonic" + is, QString::number( - d powf( 2.0f, m_osc[i]->m_harmonic ) ) ); + powf( 2.0f, m_osc[i]->m_harmonic ) ) ); m_osc[i]->m_detuneKnob.saveSettings( _doc, _this, "detune" + is ); m_osc[i]->m_oscKnob.saveSettings( _doc, _this, "wavetype" From 64cc3d871028212d2c6b7144e92fb5a3d608bdc5 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Tue, 19 Feb 2008 00:18:07 +0000 Subject: [PATCH 55/87] made MIDI- and FLP-import-filter work git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@695 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 12 +++ include/envelope_and_lfo_parameters.h | 2 +- include/instrument_functions.h | 2 +- include/instrument_sound_shaping.h | 1 + include/song.h | 1 + plugins/flp_import/flp_import.cpp | 146 ++++++++++++-------------- plugins/flp_import/flp_import.h | 7 +- plugins/midi_import/midi_import.cpp | 3 +- plugins/midi_import/midi_import.h | 7 +- 9 files changed, 99 insertions(+), 82 deletions(-) diff --git a/ChangeLog b/ChangeLog index 41191b99a..1589f650d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2008-02-18 Tobias Doerffel + + * plugins/flp_import/flp_import.h: + * plugins/flp_import/flp_import.cpp: + * plugins/midi_import/midi_import.h: + * plugins/midi_import/midi_import.cpp: + * include/instrument_functions.h: + * include/song.h: + * include/envelope_and_lfo_parameters.h: + * include/instrument_sound_shaping.h: + made MIDI- and FLP-import-filter work + 2008-02-15 Paul Giblock * plugins/plucked_string_synth/plucked_string_synth.cpp: * plugins/plucked_string_synth/plucked_string_synth.h: diff --git a/include/envelope_and_lfo_parameters.h b/include/envelope_and_lfo_parameters.h index c0efcd1c5..fe6f6ba25 100644 --- a/include/envelope_and_lfo_parameters.h +++ b/include/envelope_and_lfo_parameters.h @@ -151,7 +151,7 @@ private: friend class envelopeAndLFOView; -// friend class flpImport; + friend class flpImport; } ; diff --git a/include/instrument_functions.h b/include/instrument_functions.h index fdb779437..70a3a22d7 100644 --- a/include/instrument_functions.h +++ b/include/instrument_functions.h @@ -131,7 +131,7 @@ private: comboBoxModel m_arpModeModel; -// friend class flpImport; + friend class flpImport; friend class instrumentTrack; friend class arpeggiatorView; diff --git a/include/instrument_sound_shaping.h b/include/instrument_sound_shaping.h index 5a8b4e622..e15ddac4d 100644 --- a/include/instrument_sound_shaping.h +++ b/include/instrument_sound_shaping.h @@ -78,6 +78,7 @@ private: friend class instrumentSoundShapingView; + friend class flpImport; } ; diff --git a/include/song.h b/include/song.h index a9bf070e5..86e7d1286 100644 --- a/include/song.h +++ b/include/song.h @@ -45,6 +45,7 @@ const Uint16 MAX_SONG_LENGTH = 9999; class song : public trackContainer { Q_OBJECT + mapPropertyFromModel(int,getTempo,setTempo,m_tempoModel); mapPropertyFromModel(int,masterPitch,setMasterPitch,m_masterPitchModel); mapPropertyFromModel(int,masterVolume,setMasterVolume, m_masterVolumeModel); diff --git a/plugins/flp_import/flp_import.cpp b/plugins/flp_import/flp_import.cpp index b46ac5053..4f1a9c357 100644 --- a/plugins/flp_import/flp_import.cpp +++ b/plugins/flp_import/flp_import.cpp @@ -1,7 +1,7 @@ /* * flp_import.cpp - support for importing FLP-files * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -30,7 +30,6 @@ #include #include "flp_import.h" -#include "arp_and_chords_tab_widget.h" #include "basic_filters.h" #include "bb_editor.h" #include "bb_track.h" @@ -38,18 +37,17 @@ #include "config_mgr.h" #include "debug.h" #include "engine.h" -#include "envelope_tab_widget.h" -#include "envelope_and_lfo_widget.h" #include "group_box.h" #include "instrument.h" #include "instrument_track.h" +#include "envelope_and_lfo_parameters.h" #include "knob.h" #include "oscillator.h" #include "pattern.h" #include "piano_widget.h" #include "project_journal.h" #include "project_notes.h" -#include "song_editor.h" +#include "song.h" #include "tempo_sync_knob.h" #include "track_container.h" @@ -232,7 +230,7 @@ bool flpImport::tryImport( trackContainer * _tc ) int ev_cnt = 0; - engine::getSongEditor()->clearProject(); + engine::getSong()->clearProject(); const bool is_journ = engine::getProjectJournal()->isJournalling(); engine::getProjectJournal()->setJournalling( FALSE ); @@ -314,7 +312,7 @@ bool flpImport::tryImport( trackContainer * _tc ) case FLP_MainVol: printf( "main-volume: %d\n", data ); - engine::getSongEditor()->setMasterVolume( + engine::getSong()->setMasterVolume( static_cast( data * 100 / 128 ) ); break; @@ -345,12 +343,12 @@ bool flpImport::tryImport( trackContainer * _tc ) printf( "new channel\n" ); it = dynamic_cast( - track::create( track::INSTRUMENT_TRACK, engine::getBBEditor() ) ); + track::create( track::InstrumentTrack, engine::getBBTrackContainer() ) ); assert( it != NULL ); i_tracks.push_back( it ); it_inst = it->loadInstrument( "audiofileprocessor" ); - it->toggledInstrumentTrackButton( FALSE ); +// it->toggledInstrumentTrackButton( FALSE ); // reset some values step_pattern = 0; @@ -365,7 +363,7 @@ bool flpImport::tryImport( trackContainer * _tc ) case FLP_Tempo: printf( "tempo: %d\n", data ); - engine::getSongEditor()->setTempo( data ); + engine::getSong()->setTempo( data ); break; case FLP_CurrentPatNum: @@ -398,7 +396,7 @@ bool flpImport::tryImport( trackContainer * _tc ) break; case FLP_MainPitch: - engine::getSongEditor()->setMasterPitch( data ); + engine::getSong()->setMasterPitch( data ); break; case FLP_Resonance: @@ -460,8 +458,7 @@ bool flpImport::tryImport( trackContainer * _tc ) case FLP_MiddleNote: data += 8; - it->setBaseNote( data ); - it->getPianoWidget()->update(); + it->baseNoteModel()->setValue( data ); break; case FLP_DelayReso: @@ -602,27 +599,27 @@ bool flpImport::tryImport( trackContainer * _tc ) case FLP_ChanParams: { - const arpAndChordsTabWidget::arpDirections + const arpeggiator::ArpDirections mappedArpDir[] = { - arpAndChordsTabWidget::UP, - arpAndChordsTabWidget::UP, - arpAndChordsTabWidget::DOWN, - arpAndChordsTabWidget::UP_AND_DOWN, - arpAndChordsTabWidget::UP_AND_DOWN, - arpAndChordsTabWidget::RANDOM + arpeggiator::ArpDirUp, + arpeggiator::ArpDirUp, + arpeggiator::ArpDirDown, + arpeggiator::ArpDirUpAndDown, + arpeggiator::ArpDirUpAndDown, + arpeggiator::ArpDirRandom } ; const Uint32 * p = (const Uint32 *) text; - arpAndChordsTabWidget * actw = it->m_arpWidget; - actw->m_arpDirectionBtnGrp->setValue( + arpeggiator * arp = &it->m_arpeggiator; + arp->m_arpDirectionModel.setValue( mappedArpDir[p[10]] ); - actw->m_arpRangeKnob->setValue( p[11] ); - actw->m_arpComboBox->setValue( p[12] ); - actw->m_arpTimeKnob->setValue( p[13] / 8.0f ); + arp->m_arpRangeModel.setValue( p[11] ); + arp->m_arpModel.setValue( p[12] ); + arp->m_arpTimeModel.setValue( p[13] / 8.0f ); //// 100.0f ); - actw->m_arpGateKnob->setValue( p[14] * 100.0f / + arp->m_arpGateModel.setValue( p[14] * 100.0f / 48.0f ); - actw->m_arpGroupBox->setState( p[10] > 0 ); + arp->m_arpEnabledModel.setValue( p[10] > 0 ); printf( "channel params: " ); dump_mem( text, text_len ); //printf( "channel params: arpdir: %d range: %d time: %d gate: %d\n", p[10], p[11], p[13], p[14] ); @@ -634,36 +631,36 @@ bool flpImport::tryImport( trackContainer * _tc ) const Uint32 * p = (const Uint32 *) text; printf( "envelope and lfo params: " ); dump_mem( text, text_len ); - envelopeTabWidget * etw = it->m_envWidget; - envelopeAndLFOWidget * elw = NULL; + instrumentSoundShaping * iss = &it->m_soundShaping; + envelopeAndLFOParameters * elp = NULL; switch( env_lfo_target ) { case 1: - elw = etw->m_envLFOWidgets[envelopeTabWidget::VOLUME]; - break; + elp = iss->m_envLFOParameters[instrumentSoundShaping::Volume]; + break; case 2: - elw = etw->m_envLFOWidgets[envelopeTabWidget::CUT]; - break; + elp = iss->m_envLFOParameters[instrumentSoundShaping::Cut]; + break; case 3: - elw = etw->m_envLFOWidgets[envelopeTabWidget::RES]; - break; + elp = iss->m_envLFOParameters[instrumentSoundShaping::Resonance]; + break; default: break; } ++env_lfo_target; - if( elw == NULL ) + if( elp == NULL ) { break; } const float scaling = 0.8f / 65536.0f; - elw->m_predelayKnob->setValue( p[2] * scaling ); - elw->m_attackKnob->setValue( p[3] * scaling ); - elw->m_holdKnob->setValue( p[4] * scaling ); - elw->m_decayKnob->setValue( p[5] * scaling ); - elw->m_sustainKnob->setValue( p[6] * scaling ); - elw->m_releaseKnob->setValue( p[7] * scaling ); - elw->m_amountKnob->setValue( p[1] ? 1 : 0 ); - elw->updateSampleVars(); + elp->m_predelayModel.setValue( p[2] * scaling ); + elp->m_attackModel.setValue( p[3] * scaling ); + elp->m_holdModel.setValue( p[4] * scaling ); + elp->m_decayModel.setValue( p[5] * scaling ); + elp->m_sustainModel.setValue( p[6] * scaling ); + elp->m_releaseModel.setValue( p[7] * scaling ); + elp->m_amountModel.setValue( p[1] ? 1 : 0 ); + elp->updateSampleVars(); break; } @@ -684,24 +681,24 @@ bool flpImport::tryImport( trackContainer * _tc ) basicFilters<>::SIMPLE_FLT_CNT } ; Uint32 * p = (Uint32 *) text; - envelopeTabWidget * etw = it->m_envWidget; + instrumentSoundShaping * iss = &it->m_soundShaping; /* printf( "filter values: " ); for( int i = 0; i < 6; ++i ) { printf( "%d ", ((Sint32*)text)[i] ); } printf( "\n" );*/ - etw->m_filterComboBox->setValue( + iss->m_filterModel.setValue( mappedFilter[p[5]] ); - etw->m_filterCutKnob->setValue( p[3] / 255.0f * - ( etw->m_filterCutKnob->maxValue() - - etw->m_filterCutKnob->minValue() ) + - etw->m_filterCutKnob->minValue() ); - etw->m_filterResKnob->setValue( p[4] / 1024.0f * - ( etw->m_filterResKnob->maxValue() - - etw->m_filterResKnob->minValue() ) + - etw->m_filterResKnob->minValue() ); - etw->m_filterGroupBox->setState( p[3] < 256 ); + iss->m_filterCutModel.setValue( p[3] / 255.0f * + ( iss->m_filterCutModel.maxValue() - + iss->m_filterCutModel.minValue() ) + + iss->m_filterCutModel.minValue() ); + iss->m_filterResModel.setValue( p[4] / 1024.0f * + ( iss->m_filterResModel.maxValue() - + iss->m_filterResModel.minValue() ) + + iss->m_filterResModel.minValue() ); + iss->m_filterEnabledModel.setValue( p[3] < 256 ); break; } @@ -786,10 +783,9 @@ bool flpImport::tryImport( trackContainer * _tc ) const int ch = ( *it ) >> 16; const int pat = ( ( *it ) & 0xffff ) / 16; const int pos = ( ( ( *it ) & 0xffff ) % 16 ) * 4; - while( engine::getBBEditor()->numOfBBs() <= pat ) + while( engine::getBBTrackContainer()->numOfBBs() <= pat ) { - track::create( track::BB_TRACK, - engine::getSongEditor() ); + track::create( track::BBTrack, engine::getSong() ); } pattern * p = dynamic_cast( i_tracks[ch]->getTCO( pat ) ); @@ -811,10 +807,9 @@ bool flpImport::tryImport( trackContainer * _tc ) { continue; } - while( engine::getBBEditor()->numOfBBs() <= pat ) + while( engine::getBBTrackContainer()->numOfBBs() <= pat ) { - track::create( track::BB_TRACK, - engine::getSongEditor() ); + track::create( track::BBTrack, engine::getSong() ); qApp->processEvents( QEventLoop::AllEvents, 100 ); } pattern * p = dynamic_cast( @@ -834,10 +829,9 @@ bool flpImport::tryImport( trackContainer * _tc ) { continue; } - while( engine::getBBEditor()->numOfBBs() <= pat_num ) + while( engine::getBBTrackContainer()->numOfBBs() <= pat_num ) { - track::create( track::BB_TRACK, - engine::getSongEditor() ); + track::create( track::BBTrack, engine::getSong() ); qApp->processEvents( QEventLoop::AllEvents, 100 ); } @@ -846,9 +840,9 @@ bool flpImport::tryImport( trackContainer * _tc ) tco->movePosition( midiTime( ( ( *it ) & 0xffff ) * 64 ) ); } - if( project_cur_pat < engine::getBBEditor()->numOfBBs() ) + if( project_cur_pat < engine::getBBTrackContainer()->numOfBBs() ) { - engine::getBBEditor()->setCurrentBB( project_cur_pat ); + engine::getBBTrackContainer()->setCurrentBB( project_cur_pat ); } engine::getProjectJournal()->setJournalling( is_journ ); @@ -869,21 +863,21 @@ bool flpImport::processPluginParams( const flPlugins _plugin, { case FL_Plugin_3x_Osc: { - const oscillator::waveShapes mapped_3xOsc_Shapes[] = + const oscillator::WaveShapes mapped_3xOsc_Shapes[] = { - oscillator::SIN_WAVE, - oscillator::TRIANGLE_WAVE, - oscillator::SQUARE_WAVE, - oscillator::SAW_WAVE, - oscillator::SQUARE_WAVE, // square-sin - oscillator::WHITE_NOISE_WAVE, - oscillator::USER_DEF_WAVE + oscillator::SineWave, + oscillator::TriangleWave, + oscillator::SquareWave, + oscillator::SawWave, + oscillator::SquareWave, // square-sin + oscillator::WhiteNoise, + oscillator::UserDefinedWave } ; QDomDocument dd; QDomElement de = dd.createElement( _i->nodeName() ); - de.setAttribute( "modalgo1", oscillator::MIX ); - de.setAttribute( "modalgo2", oscillator::MIX ); + de.setAttribute( "modalgo1", oscillator::SignalMix ); + de.setAttribute( "modalgo2", oscillator::SignalMix ); for( Uint8 i = 0; i < 3; ++i ) { const Sint32 * d = (const Sint32 *)( _data + diff --git a/plugins/flp_import/flp_import.h b/plugins/flp_import/flp_import.h index 4db1607ae..fabc3a13f 100644 --- a/plugins/flp_import/flp_import.h +++ b/plugins/flp_import/flp_import.h @@ -1,7 +1,7 @@ /* * flp_import.h - support for importing FLP-files * - * Copyright (c) 2006 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -169,6 +169,11 @@ public: flpImport( const QString & _file ); virtual ~flpImport(); + virtual pluginView * instantiateView( QWidget * ) + { + return( NULL ); + } + private: virtual bool tryImport( trackContainer * _tc ); diff --git a/plugins/midi_import/midi_import.cpp b/plugins/midi_import/midi_import.cpp index 380c76769..48ef3b931 100644 --- a/plugins/midi_import/midi_import.cpp +++ b/plugins/midi_import/midi_import.cpp @@ -264,14 +264,13 @@ invalid_format: // now create new instrument-track for reading in track instrumentTrack * it = dynamic_cast( track::create( - track::INSTRUMENT_TRACK, + track::InstrumentTrack, _tc ) ); #ifdef LMMS_DEBUG assert( it != NULL ); #endif // TODO: setup program, channel etc. instrument * it_inst = it->loadInstrument( "patman" ); - it->toggledInstrumentTrackButton( FALSE ); bool sample_loaded = FALSE; // TODO: track_name.trimmed().isEmpty() (Qt4) diff --git a/plugins/midi_import/midi_import.h b/plugins/midi_import/midi_import.h index 9fed65c53..d2960d56c 100644 --- a/plugins/midi_import/midi_import.h +++ b/plugins/midi_import/midi_import.h @@ -1,7 +1,7 @@ /* * midi_import.h - support for importing MIDI-files * - * Copyright (c) 2005-2007 Tobias Doerffel + * Copyright (c) 2005-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -44,6 +44,11 @@ public: midiImport( const QString & _file ); virtual ~midiImport(); + virtual pluginView * instantiateView( QWidget * ) + { + return( NULL ); + } + private: virtual bool tryImport( trackContainer * _tc ); From 640946c7c9977b036ed180c2fdc3d01ce0bdee9d Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Tue, 19 Feb 2008 18:14:19 +0000 Subject: [PATCH 56/87] M/V-split of Patman-instrument git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@696 0778d3d1-df1d-0410-868b-ea421aaaa00d --- plugins/patman/patman.cpp | 504 +++++++++++++++++++++----------------- plugins/patman/patman.h | 98 +++++--- 2 files changed, 346 insertions(+), 256 deletions(-) diff --git a/plugins/patman/patman.cpp b/plugins/patman/patman.cpp index 922e72885..43f74d5ae 100644 --- a/plugins/patman/patman.cpp +++ b/plugins/patman/patman.cpp @@ -1,7 +1,7 @@ /* * patman.cpp - a GUS-compatible patch instrument plugin * - * Copyright (c) 2007 Javier Serrano Polo + * Copyright (c) 2007-2008 Javier Serrano Polo * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -27,6 +27,7 @@ #include #include +#include #include #include "endian_handling.h" @@ -34,7 +35,7 @@ #include "gui_templates.h" #include "note_play_handle.h" #include "pixmap_button.h" -#include "song_editor.h" +#include "song.h" #include "string_pair_drag.h" #include "tooltip.h" @@ -57,14 +58,14 @@ plugin::descriptor patman_plugin_descriptor = 0x0100, plugin::Instrument, new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), - new patmanSynth::subPluginFeatures( plugin::Instrument ) + new patmanInstrument::subPluginFeatures( plugin::Instrument ) } ; // necessary for getting instance out of shared lib -plugin * lmms_plugin_main( void * _data ) +plugin * lmms_plugin_main( model *, void * _data ) { - return( new patmanSynth( static_cast( _data ) ) ); + return( new patmanInstrument( static_cast( _data ) ) ); } } @@ -72,94 +73,47 @@ plugin * lmms_plugin_main( void * _data ) -patmanSynth::patmanSynth( instrumentTrack * _track ) : - instrument( _track, &patman_plugin_descriptor ) +patmanInstrument::patmanInstrument( instrumentTrack * _instrument_track ) : + instrument( _instrument_track, &patman_plugin_descriptor ), + m_patchFile( QString::null ), + m_loopedModel( FALSE, this ), + m_tunedModel( TRUE, this ) { - setAutoFillBackground( TRUE ); - QPalette pal; - pal.setBrush( backgroundRole(), - PLUGIN_NAME::getIconPixmap( "artwork" ) ); - setPalette( pal ); - - m_openFileButton = new pixmapButton( this, NULL, NULL ); - m_openFileButton->setCursor( QCursor( Qt::PointingHandCursor ) ); - m_openFileButton->move( 200, 90 ); - m_openFileButton->setActiveGraphic( embed::getIconPixmap( - "project_open_down" ) ); - m_openFileButton->setInactiveGraphic( embed::getIconPixmap( - "project_open" ) ); - connect( m_openFileButton, SIGNAL( clicked() ), this, - SLOT( openFile() ) ); - toolTip::add( m_openFileButton, tr( "Open other patch" ) ); - - m_openFileButton->setWhatsThis( - tr( "Click here to open another patch-file. Loop and Tune " - "settings are not reset." ) ); - - m_loopButton = new pixmapButton( this, tr( "Loop" ), _track ); - m_loopButton->setCheckable( TRUE ); - m_loopButton->move( 160, 160 ); - m_loopButton->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "loop_on" ) ); - m_loopButton->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "loop_off" ) ); - toolTip::add( m_loopButton, tr( "Loop mode" ) ); - m_loopButton->setWhatsThis( - tr( "Here you can toggle the Loop mode. If enabled, PatMan " - "will use the loop information available in the " - "file." ) ); - - m_tuneButton = new pixmapButton( this, tr( "Tune" ), _track ); - m_tuneButton->setCheckable( TRUE ); - m_tuneButton->setValue( TRUE ); - m_tuneButton->move( 180, 160 ); - m_tuneButton->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "tune_on" ) ); - m_tuneButton->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "tune_off" ) ); - toolTip::add( m_tuneButton, tr( "Tune mode" ) ); - m_tuneButton->setWhatsThis( - tr( "Here you can toggle the Tune mode. If enabled, PatMan " - "will tune the sample to match the note's " - "frequency." ) ); - - m_display_filename = tr( "No file selected" ); - - setAcceptDrops( TRUE ); } -patmanSynth::~patmanSynth() +patmanInstrument::~patmanInstrument() { - unload_current_patch(); + unloadCurrentPatch(); } -void patmanSynth::saveSettings( QDomDocument & _doc, QDomElement & _this ) +void patmanInstrument::saveSettings( QDomDocument & _doc, QDomElement & _this ) { _this.setAttribute( "src", m_patchFile ); - m_loopButton->saveSettings( _doc, _this, "looped" ); - m_tuneButton->saveSettings( _doc, _this, "tuned" ); + m_loopedModel.saveSettings( _doc, _this, "looped" ); + m_tunedModel.saveSettings( _doc, _this, "tuned" ); } -void patmanSynth::loadSettings( const QDomElement & _this ) +void patmanInstrument::loadSettings( const QDomElement & _this ) { setFile( _this.attribute( "src" ), FALSE ); - m_loopButton->loadSettings( _this, "looped" ); - m_tuneButton->loadSettings( _this, "tuned" ); + m_loopedModel.loadSettings( _this, "looped" ); + m_tunedModel.loadSettings( _this, "tuned" ); } -void patmanSynth::setParameter( const QString & _param, const QString & _value ) +void patmanInstrument::setParameter( const QString & _param, + const QString & _value ) { if( _param == "samplefile" ) { @@ -170,7 +124,7 @@ void patmanSynth::setParameter( const QString & _param, const QString & _value ) -QString patmanSynth::nodeName( void ) const +QString patmanInstrument::nodeName( void ) const { return( patman_plugin_descriptor.name ); } @@ -178,14 +132,14 @@ QString patmanSynth::nodeName( void ) const -void patmanSynth::playNote( notePlayHandle * _n, bool ) +void patmanInstrument::playNote( notePlayHandle * _n, bool ) { const fpp_t frames = _n->framesLeftForCurrentPeriod(); sampleFrame * buf = new sampleFrame[frames]; if( !_n->m_pluginData ) { - select_sample( _n ); + selectSample( _n ); } handle_data * hdata = (handle_data *)_n->m_pluginData; @@ -193,7 +147,7 @@ void patmanSynth::playNote( notePlayHandle * _n, bool ) hdata->sample->frequency(); if( hdata->sample->play( buf, hdata->state, frames, play_freq, - m_loopButton->isChecked() ) ) + m_loopedModel.value() ) ) { getInstrumentTrack()->processAudioBuffer( buf, frames, _n ); } @@ -203,7 +157,7 @@ void patmanSynth::playNote( notePlayHandle * _n, bool ) -void patmanSynth::deleteNotePluginData( notePlayHandle * _n ) +void patmanInstrument::deleteNotePluginData( notePlayHandle * _n ) { handle_data * hdata = (handle_data *)_n->m_pluginData; sharedObject::unref( hdata->sample ); @@ -214,114 +168,9 @@ void patmanSynth::deleteNotePluginData( notePlayHandle * _n ) -void patmanSynth::dragEnterEvent( QDragEnterEvent * _dee ) +void patmanInstrument::setFile( const QString & _patch_file, bool _rename ) { - if( _dee->mimeData()->hasFormat( stringPairDrag::mimeType() ) ) - { - QString txt = _dee->mimeData()->data( - stringPairDrag::mimeType() ); - if( txt.section( ':', 0, 0 ) == "samplefile" ) - { - _dee->acceptProposedAction(); - } - else - { - _dee->ignore(); - } - } - else - { - _dee->ignore(); - } -} - - - - -void patmanSynth::dropEvent( QDropEvent * _de ) -{ - QString type = stringPairDrag::decodeKey( _de ); - QString value = stringPairDrag::decodeValue( _de ); - if( type == "samplefile" ) - { - setFile( value ); - _de->accept(); - return; - } - - _de->ignore(); -} - - - - -void patmanSynth::paintEvent( QPaintEvent * ) -{ - QPainter p( this ); - - p.setFont( pointSize<8>( font() ) ); - p.setPen( QColor( 0x66, 0xFF, 0x66 ) ); - p.drawText( 8, 140, m_display_filename ); -} - - - - -void patmanSynth::openFile( void ) -{ - QFileDialog ofd( NULL, tr( "Open patch file" ) ); - ofd.setFileMode( QFileDialog::ExistingFiles ); - - QStringList types; - types << tr( "Patch-Files (*.pat)" ); - ofd.setFilters( types ); - - if( m_patchFile == "" ) - { - if( QDir( "/usr/share/midi/freepats" ).exists() ) - { - ofd.setDirectory( "/usr/share/midi/freepats" ); - } - else - { - ofd.setDirectory( - configManager::inst()->userSamplesDir() ); - } - } - else if( QFileInfo( m_patchFile ).isRelative() ) - { - QString f = configManager::inst()->userSamplesDir() - + m_patchFile; - if( QFileInfo( f ).exists() == FALSE ) - { - f = configManager::inst()->factorySamplesDir() - + m_patchFile; - } - - ofd.selectFile( f ); - } - else - { - ofd.selectFile( m_patchFile ); - } - - if( ofd.exec() == QDialog::Accepted && !ofd.selectedFiles().isEmpty() ) - { - QString f = ofd.selectedFiles()[0]; - if( f != "" ) - { - setFile( f ); - engine::getSongEditor()->setModified(); - } - } -} - - - - -void patmanSynth::setFile( const QString & _patch_file, bool _rename ) -{ - // is current channel-name equal to previous-filename?? + // is current instrument-track-name equal to previous-filename?? if( _rename && ( getInstrumentTrack()->name() == QFileInfo( m_patchFile ).fileName() || @@ -331,49 +180,33 @@ void patmanSynth::setFile( const QString & _patch_file, bool _rename ) getInstrumentTrack()->setName( QFileInfo( _patch_file ).fileName() ); } - // else we don't touch the channel-name, because the user named it self + // else we don't touch the instrument-track-name, because the user + // named it self m_patchFile = sampleBuffer::tryToMakeRelative( _patch_file ); - load_error error = load_patch( sampleBuffer::tryToMakeAbsolute( + LoadErrors error = loadPatch( sampleBuffer::tryToMakeAbsolute( _patch_file ) ); if( error ) { printf("Load error\n"); } - m_display_filename = ""; - Uint16 idx = m_patchFile.length(); - - QFontMetrics fm( pointSize<8>( font() ) ); - - // simple algorithm for creating a text from the filename that - // matches in the white rectangle - while( idx > 0 && fm.size( Qt::TextSingleLine, - m_display_filename + "..." ).width() < 225 ) - { - m_display_filename = m_patchFile[--idx] + m_display_filename; - } - - if( idx > 0 ) - { - m_display_filename = "..." + m_display_filename; - } - - update(); + emit fileChanged(); } -patmanSynth::load_error patmanSynth::load_patch( const QString & _filename ) +patmanInstrument::LoadErrors patmanInstrument::loadPatch( + const QString & _filename ) { - unload_current_patch(); + unloadCurrentPatch(); FILE * fd = fopen( _filename.toAscii().constData() , "rb" ); if( !fd ) { perror( "fopen" ); - return( LOAD_OPEN ); + return( LoadOpen ); } unsigned char header[239]; @@ -383,19 +216,19 @@ patmanSynth::load_error patmanSynth::load_patch( const QString & _filename ) && memcmp( header, "GF1PATCH100\0ID#000002", 22 ) ) ) { fclose( fd ); - return( LOAD_NOT_GUS ); + return( LoadNotGUS ); } if( header[82] != 1 && header[82] != 0 ) { fclose( fd ); - return( LOAD_INSTRUMENTS ); + return( LoadInstruments ); } if( header[151] != 1 && header[151] != 0 ) { fclose( fd ); - return( LOAD_LAYERS ); + return( LoadLayers ); } int sample_count = header[198]; @@ -407,14 +240,14 @@ patmanSynth::load_error patmanSynth::load_patch( const QString & _filename ) if ( fseek( fd, x, SEEK_CUR ) == -1 ) \ { \ fclose( fd ); \ - return( LOAD_IO ); \ + return( LoadIO ); \ } #define READ_SHORT( x ) \ if ( fread( &tmpshort, 2, 1, fd ) != 1 ) \ { \ fclose( fd ); \ - return( LOAD_IO ); \ + return( LoadIO ); \ } \ x = (unsigned short)swap16IfBE( tmpshort ); @@ -422,7 +255,7 @@ patmanSynth::load_error patmanSynth::load_patch( const QString & _filename ) if ( fread( &x, 4, 1, fd ) != 1 ) \ { \ fclose( fd ); \ - return( LOAD_IO ); \ + return( LoadIO ); \ } \ x = (unsigned)swap32IfBE( x ); @@ -446,7 +279,7 @@ patmanSynth::load_error patmanSynth::load_patch( const QString & _filename ) if ( fread( &modes, 1, 1, fd ) != 1 ) { fclose( fd ); - return( LOAD_IO ); + return( LoadIO ); } // skip scale frequency, scale factor, reserved space SKIP_BYTES( 2 + 2 + 36 ); @@ -464,7 +297,7 @@ patmanSynth::load_error patmanSynth::load_patch( const QString & _filename ) { delete wave_samples; fclose( fd ); - return( LOAD_IO ); + return( LoadIO ); } sample = swap16IfBE( sample ); if( modes & MODES_UNSIGNED ) @@ -488,7 +321,7 @@ patmanSynth::load_error patmanSynth::load_patch( const QString & _filename ) { delete wave_samples; fclose( fd ); - return( LOAD_IO ); + return( LoadIO ); } if( modes & MODES_UNSIGNED ) { @@ -519,39 +352,39 @@ patmanSynth::load_error patmanSynth::load_patch( const QString & _filename ) psample->setLoopEndFrame( loop_end ); } - m_patch_samples.push_back( psample ); + m_patchSamples.push_back( psample ); delete[] wave_samples; delete[] data; } fclose( fd ); - return( LOAD_OK ); + return( LoadOK ); } -void patmanSynth::unload_current_patch( void ) +void patmanInstrument::unloadCurrentPatch( void ) { - while( !m_patch_samples.empty() ) + while( !m_patchSamples.empty() ) { - sharedObject::unref( m_patch_samples.back() ); - m_patch_samples.pop_back(); + sharedObject::unref( m_patchSamples.back() ); + m_patchSamples.pop_back(); } } -void patmanSynth::select_sample( notePlayHandle * _n ) +void patmanInstrument::selectSample( notePlayHandle * _n ) { const float freq = _n->frequency(); float min_dist = HUGE_VALF; sampleBuffer * sample = NULL; - for( QVector::iterator it = m_patch_samples.begin(); - it != m_patch_samples.end(); ++it ) + for( QVector::iterator it = m_patchSamples.begin(); + it != m_patchSamples.end(); ++it ) { float patch_freq = ( *it )->frequency(); float dist = freq >= patch_freq ? freq / patch_freq : @@ -565,7 +398,7 @@ void patmanSynth::select_sample( notePlayHandle * _n ) } handle_data * hdata = new handle_data; - hdata->tuned = m_tuneButton->isChecked(); + hdata->tuned = m_tunedModel.value(); if( sample ) { hdata->sample = sharedObject::ref( sample ); @@ -582,11 +415,233 @@ void patmanSynth::select_sample( notePlayHandle * _n ) +pluginView * patmanInstrument::instantiateView( QWidget * _parent ) +{ + return( new patmanView( this, _parent ) ); +} -patmanSynth::subPluginFeatures::subPluginFeatures( plugin::pluginTypes _type ) : + + + + + + +patmanView::patmanView( instrument * _instrument, QWidget * _parent ) : + instrumentView( _instrument, _parent ), + m_pi( NULL ) +{ + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), + PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); + + pixmapButton * open_file_btn = new pixmapButton( this, NULL ); + open_file_btn->setCursor( QCursor( Qt::PointingHandCursor ) ); + open_file_btn->move( 200, 90 ); + open_file_btn->setActiveGraphic( embed::getIconPixmap( + "project_open_down" ) ); + open_file_btn->setInactiveGraphic( embed::getIconPixmap( + "project_open" ) ); + connect( open_file_btn, SIGNAL( clicked() ), + this, SLOT( openFile() ) ); + toolTip::add( open_file_btn, tr( "Open other patch" ) ); + + open_file_btn->setWhatsThis( + tr( "Click here to open another patch-file. Loop and Tune " + "settings are not reset." ) ); + + m_loopButton = new pixmapButton( this, tr( "Loop" ) ); + m_loopButton->setCheckable( TRUE ); + m_loopButton->move( 160, 160 ); + m_loopButton->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "loop_on" ) ); + m_loopButton->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "loop_off" ) ); + toolTip::add( m_loopButton, tr( "Loop mode" ) ); + m_loopButton->setWhatsThis( + tr( "Here you can toggle the Loop mode. If enabled, PatMan " + "will use the loop information available in the " + "file." ) ); + + m_tuneButton = new pixmapButton( this, tr( "Tune" ) ); + m_tuneButton->setCheckable( TRUE ); + m_tuneButton->move( 180, 160 ); + m_tuneButton->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "tune_on" ) ); + m_tuneButton->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "tune_off" ) ); + toolTip::add( m_tuneButton, tr( "Tune mode" ) ); + m_tuneButton->setWhatsThis( + tr( "Here you can toggle the Tune mode. If enabled, PatMan " + "will tune the sample to match the note's " + "frequency." ) ); + + m_displayFilename = tr( "No file selected" ); + + setAcceptDrops( TRUE ); +} + + + + +patmanView::~patmanView() +{ +} + + + + +void patmanView::openFile( void ) +{ + QFileDialog ofd( NULL, tr( "Open patch file" ) ); + ofd.setFileMode( QFileDialog::ExistingFiles ); + + QStringList types; + types << tr( "Patch-Files (*.pat)" ); + ofd.setFilters( types ); + + if( m_pi->m_patchFile == "" ) + { + if( QDir( "/usr/share/midi/freepats" ).exists() ) + { + ofd.setDirectory( "/usr/share/midi/freepats" ); + } + else + { + ofd.setDirectory( + configManager::inst()->userSamplesDir() ); + } + } + else if( QFileInfo( m_pi->m_patchFile ).isRelative() ) + { + QString f = configManager::inst()->userSamplesDir() + + m_pi->m_patchFile; + if( QFileInfo( f ).exists() == FALSE ) + { + f = configManager::inst()->factorySamplesDir() + + m_pi->m_patchFile; + } + + ofd.selectFile( f ); + } + else + { + ofd.selectFile( m_pi->m_patchFile ); + } + + if( ofd.exec() == QDialog::Accepted && !ofd.selectedFiles().isEmpty() ) + { + QString f = ofd.selectedFiles()[0]; + if( f != "" ) + { + m_pi->setFile( f ); + engine::getSong()->setModified(); + } + } +} + + + + +void patmanView::updateFilename( void ) +{ + m_displayFilename = ""; + Uint16 idx = m_pi->m_patchFile.length(); + + QFontMetrics fm( pointSize<8>( font() ) ); + + // simple algorithm for creating a text from the filename that + // matches in the white rectangle + while( idx > 0 && fm.size( Qt::TextSingleLine, + m_displayFilename + "..." ).width() < 225 ) + { + m_displayFilename = m_pi->m_patchFile[--idx] + + m_displayFilename; + } + + if( idx > 0 ) + { + m_displayFilename = "..." + m_displayFilename; + } + + update(); +} + + + + +void patmanView::dragEnterEvent( QDragEnterEvent * _dee ) +{ + if( _dee->mimeData()->hasFormat( stringPairDrag::mimeType() ) ) + { + QString txt = _dee->mimeData()->data( + stringPairDrag::mimeType() ); + if( txt.section( ':', 0, 0 ) == "samplefile" ) + { + _dee->acceptProposedAction(); + } + else + { + _dee->ignore(); + } + } + else + { + _dee->ignore(); + } +} + + + + +void patmanView::dropEvent( QDropEvent * _de ) +{ + QString type = stringPairDrag::decodeKey( _de ); + QString value = stringPairDrag::decodeValue( _de ); + if( type == "samplefile" ) + { + m_pi->setFile( value ); + _de->accept(); + return; + } + + _de->ignore(); +} + + + + +void patmanView::paintEvent( QPaintEvent * ) +{ + QPainter p( this ); + + p.setFont( pointSize<8>( font() ) ); + p.setPen( QColor( 0x66, 0xFF, 0x66 ) ); + p.drawText( 8, 140, m_displayFilename ); +} + + + + +void patmanView::modelChanged( void ) +{ + m_pi = castModel(); + m_loopButton->setModel( &m_pi->m_loopedModel ); + m_tuneButton->setModel( &m_pi->m_tunedModel ); + connect( m_pi, SIGNAL( fileChanged() ), + this, SLOT( updateFilename() ) ); +} + + + + + +patmanInstrument::subPluginFeatures::subPluginFeatures( + plugin::PluginTypes _type ) : plugin::descriptor::subPluginFeatures( _type ) { } @@ -594,7 +649,8 @@ patmanSynth::subPluginFeatures::subPluginFeatures( plugin::pluginTypes _type ) : -const QStringList & patmanSynth::subPluginFeatures::supported_extensions( void ) +const QStringList & patmanInstrument::subPluginFeatures::supported_extensions( + void ) { static QStringList extension( "pat" ); return( extension ); diff --git a/plugins/patman/patman.h b/plugins/patman/patman.h index efc7b51ff..98fd175d2 100644 --- a/plugins/patman/patman.h +++ b/plugins/patman/patman.h @@ -1,7 +1,7 @@ /* * patman.h - header for a GUS-compatible patch instrument plugin * - * Copyright (c) 2007 Javier Serrano Polo + * Copyright (c) 2007-2008 Javier Serrano Polo * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -28,7 +28,9 @@ #include "instrument.h" +#include "instrument_view.h" #include "sample_buffer.h" +#include "automatable_model.h" class pixmapButton; @@ -44,14 +46,14 @@ class pixmapButton; #define MODES_CLAMPED ( 1 << 7 ) -class patmanSynth : public instrument +class patmanInstrument : public instrument { Q_OBJECT public: class subPluginFeatures : public plugin::descriptor::subPluginFeatures { public: - subPluginFeatures( plugin::pluginTypes _type ); + subPluginFeatures( plugin::PluginTypes _type ); virtual const QStringList & supportedExtensions( void ) { @@ -63,35 +65,30 @@ public: } ; - patmanSynth( instrumentTrack * _track ); - virtual ~patmanSynth(); + patmanInstrument( instrumentTrack * _track ); + virtual ~patmanInstrument(); - virtual void FASTCALL playNote( notePlayHandle * _n, + virtual void playNote( notePlayHandle * _n, bool _try_parallelizing ); - virtual void FASTCALL deleteNotePluginData( notePlayHandle * _n ); + virtual void deleteNotePluginData( notePlayHandle * _n ); - virtual void FASTCALL saveSettings( QDomDocument & _doc, + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); + virtual void loadSettings( const QDomElement & _this ); - virtual void FASTCALL setParameter( const QString & _param, + virtual void setParameter( const QString & _param, const QString & _value ); virtual QString nodeName( void ) const; + virtual pluginView * instantiateView( QWidget * _parent ); + public slots: - void openFile( void ); void setFile( const QString & _patch_file, bool _rename = TRUE ); -protected: - virtual void dragEnterEvent( QDragEnterEvent * _dee ); - virtual void dropEvent( QDropEvent * _de ); - virtual void paintEvent( QPaintEvent * ); - - private: typedef struct { @@ -101,29 +98,66 @@ private: } handle_data; QString m_patchFile; - QVector m_patch_samples; + QVector m_patchSamples; + boolModel m_loopedModel; + boolModel m_tunedModel; - pixmapButton * m_openFileButton; - pixmapButton * m_loopButton; - pixmapButton * m_tuneButton; - QString m_display_filename; - enum load_error + enum LoadErrors { - LOAD_OK, - LOAD_OPEN, - LOAD_NOT_GUS, - LOAD_INSTRUMENTS, - LOAD_LAYERS, - LOAD_IO + LoadOK, + LoadOpen, + LoadNotGUS, + LoadInstruments, + LoadLayers, + LoadIO } ; - load_error load_patch( const QString & _filename ); - void unload_current_patch( void ); + LoadErrors loadPatch( const QString & _filename ); + void unloadCurrentPatch( void ); - void select_sample( notePlayHandle * _n ); + void selectSample( notePlayHandle * _n ); + + + friend class patmanView; + +signals: + void fileChanged( void ); } ; + +class patmanView : public instrumentView +{ + Q_OBJECT +public: + patmanView( instrument * _instrument, QWidget * _parent ); + virtual ~patmanView(); + + +public slots: + void openFile( void ); + void updateFilename( void ); + + +protected: + virtual void dragEnterEvent( QDragEnterEvent * _dee ); + virtual void dropEvent( QDropEvent * _de ); + virtual void paintEvent( QPaintEvent * ); + + +private: + virtual void modelChanged( void ); + + patmanInstrument * m_pi; + QString m_displayFilename; + + pixmapButton * m_loopButton; + pixmapButton * m_tuneButton; + +} ; + + + #endif From 601e5c1df936d62eb4860d0b417802db75e0191b Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Tue, 19 Feb 2008 18:14:39 +0000 Subject: [PATCH 57/87] made song-export work again git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@697 0778d3d1-df1d-0410-868b-ea421aaaa00d --- src/core/main_window.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/main_window.cpp b/src/core/main_window.cpp index 8b1248fa2..7b7380c4e 100644 --- a/src/core/main_window.cpp +++ b/src/core/main_window.cpp @@ -242,7 +242,7 @@ void mainWindow::finalize( void ) toolButton * project_export = new toolButton( embed::getIconPixmap( "project_export" ), tr( "Export current project" ), - engine::getSongEditor(), + engine::getSong(), SLOT( exportProject() ), m_toolBar ); @@ -387,11 +387,11 @@ void mainWindow::finalize( void ) project_menu->addSeparator(); project_menu->addAction( /*embed::getIconPixmap( "project_import" ),*/ tr( "Import..." ), - engine::getSongEditor(), + engine::getSong(), SLOT( importProject() ) ); project_menu->addAction( embed::getIconPixmap( "project_export" ), tr( "E&xport..." ), - engine::getSongEditor(), + engine::getSong(), SLOT( exportProject() ), Qt::CTRL + Qt::Key_E ); project_menu->addSeparator(); From 3e29f447a99842c679bb820fc0f923ca90d3a05f Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Tue, 19 Feb 2008 18:15:23 +0000 Subject: [PATCH 58/87] coding-style improvements git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@698 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 22 +++++++++++++++++++ configure.in | 4 ++-- include/audio_file_device.h | 2 +- include/export.h | 12 +++++----- include/export_project_dialog.h | 6 ++--- include/plugin.h | 10 ++++----- .../audio_file_processor.cpp | 2 +- .../audio_file_processor.h | 2 +- .../ladspa_subplugin_features.cpp | 2 +- .../ladspa_effect/ladspa_subplugin_features.h | 2 +- plugins/vst_effect/vst_control_dialog.h | 6 ++--- src/core/export_project_dialog.cpp | 21 +++++++++--------- src/core/song.cpp | 2 +- 13 files changed, 58 insertions(+), 35 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1589f650d..a382e81ef 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +2008-02-18 Tobias Doerffel + + * plugins/ladspa_effect/ladspa_subplugin_features.h: + * plugins/ladspa_effect/ladspa_subplugin_features.cpp: + * plugins/vst_effect/vst_control_dialog.h: + * plugins/audio_file_processor/audio_file_processor.cpp: + * plugins/audio_file_processor/audio_file_processor.h: + * include/plugin.h: + * include/audio_file_device.h: + * include/export.h: + * include/export_project_dialog.h: + * src/core/song.cpp: + * src/core/export_project_dialog.cpp: + coding-style improvements + + * src/core/main_window.cpp: + made song-export work again + + * plugins/patman/patman.cpp: + * plugins/patman/patman.h: + M/V-split of Patman-instrument + 2008-02-18 Tobias Doerffel * plugins/flp_import/flp_import.h: diff --git a/configure.in b/configure.in index 3ad0b608e..6b2e4d6fe 100644 --- a/configure.in +++ b/configure.in @@ -2,8 +2,8 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.50) -AC_INIT(lmms, 0.4.0-svn20080215-mv, lmms-devel/at/lists/dot/sf/dot/net) -AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080215-mv) +AC_INIT(lmms, 0.4.0-svn20080219-mv, lmms-devel/at/lists/dot/sf/dot/net) +AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080219-mv) AM_CONFIG_HEADER(config.h) diff --git a/include/audio_file_device.h b/include/audio_file_device.h index 78fc40ccd..64957bc81 100644 --- a/include/audio_file_device.h +++ b/include/audio_file_device.h @@ -48,7 +48,7 @@ public: protected: - Sint32 FASTCALL writeData( const void * _data, Sint32 _len ); + Sint32 writeData( const void * _data, Sint32 _len ); void seekToBegin( void ); inline bool useVBR( void ) const diff --git a/include/export.h b/include/export.h index 7f522ef1b..7023a24c8 100644 --- a/include/export.h +++ b/include/export.h @@ -1,7 +1,7 @@ /* * export.h - header which is needed for song-export * - * Copyright (c) 2004-2006 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -43,18 +43,18 @@ typedef audioFileDevice * ( * getDeviceInst)( const sample_rate_t _sample_rate, mixer * _mixer ); -enum fileTypes +enum ExportFileTypes { - WAVE_FILE, - OGG_FILE, - NULL_FILE = 0xFF + WaveFile, + OggFile, + NullFile = 0xFF } ; struct fileEncodeDevice { - fileTypes m_fileType; + ExportFileTypes m_fileType; const char * m_description; const char * m_extension; getDeviceInst m_getDevInst; diff --git a/include/export_project_dialog.h b/include/export_project_dialog.h index 61be5eb96..ffc0b30f7 100644 --- a/include/export_project_dialog.h +++ b/include/export_project_dialog.h @@ -2,7 +2,7 @@ * export_project_dialog.h - declaration of class exportProjectDialog which is * responsible for exporting project * - * Copyright (c) 2004-2007 Tobias Doerffel + * Copyright (c) 2004-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -69,7 +69,7 @@ private: void finishProjectExport( void ); void abortProjectExport( void ); - static fileTypes getFileTypeFromExtension( const QString & _ext ); + static ExportFileTypes getFileTypeFromExtension( const QString & _ext ); static Sint16 s_availableBitrates[]; @@ -89,7 +89,7 @@ private: QProgressBar * m_exportProgressBar; QString m_fileName; - fileTypes m_fileType; + ExportFileTypes m_fileType; bool m_deleteFile; } ; diff --git a/include/plugin.h b/include/plugin.h index e92ef9fdf..8265256d9 100644 --- a/include/plugin.h +++ b/include/plugin.h @@ -49,7 +49,7 @@ class pluginView; class plugin : public journallingObject, public model { public: - enum pluginTypes + enum PluginTypes { Instrument, // instrument being used in channel-track Effect, // effect-plugin for effect-board @@ -72,7 +72,7 @@ public: const char * description; const char * author; int version; - pluginTypes type; + PluginTypes type; const QPixmap * logo; class subPluginFeatures { @@ -120,7 +120,7 @@ public: }; typedef QList keyList; - subPluginFeatures( plugin::pluginTypes _type ) : + subPluginFeatures( plugin::PluginTypes _type ) : m_type( _type ) { } @@ -146,7 +146,7 @@ public: protected: - const plugin::pluginTypes m_type; + const plugin::PluginTypes m_type; } * sub_plugin_features; @@ -163,7 +163,7 @@ public: } // return plugin-type - inline pluginTypes type( void ) const + inline PluginTypes type( void ) const { return( m_descriptor->type ); } diff --git a/plugins/audio_file_processor/audio_file_processor.cpp b/plugins/audio_file_processor/audio_file_processor.cpp index 4574cd99f..cd9fafb20 100644 --- a/plugins/audio_file_processor/audio_file_processor.cpp +++ b/plugins/audio_file_processor/audio_file_processor.cpp @@ -311,7 +311,7 @@ void audioFileProcessor::endPointModelChanged( void ) audioFileProcessor::subPluginFeatures::subPluginFeatures( - plugin::pluginTypes _type ) : + plugin::PluginTypes _type ) : plugin::descriptor::subPluginFeatures( _type ) { } diff --git a/plugins/audio_file_processor/audio_file_processor.h b/plugins/audio_file_processor/audio_file_processor.h index ce6b6f2eb..e9ed1cb9b 100644 --- a/plugins/audio_file_processor/audio_file_processor.h +++ b/plugins/audio_file_processor/audio_file_processor.h @@ -44,7 +44,7 @@ public: class subPluginFeatures : public plugin::descriptor::subPluginFeatures { public: - subPluginFeatures( plugin::pluginTypes _type ); + subPluginFeatures( plugin::PluginTypes _type ); virtual const QStringList & supportedExtensions( void ); diff --git a/plugins/ladspa_effect/ladspa_subplugin_features.cpp b/plugins/ladspa_effect/ladspa_subplugin_features.cpp index 4c1e21c5f..5ce78e6a8 100644 --- a/plugins/ladspa_effect/ladspa_subplugin_features.cpp +++ b/plugins/ladspa_effect/ladspa_subplugin_features.cpp @@ -40,7 +40,7 @@ #include "mixer.h" -ladspaSubPluginFeatures::ladspaSubPluginFeatures( plugin::pluginTypes _type ) : +ladspaSubPluginFeatures::ladspaSubPluginFeatures( plugin::PluginTypes _type ) : subPluginFeatures( _type ) { } diff --git a/plugins/ladspa_effect/ladspa_subplugin_features.h b/plugins/ladspa_effect/ladspa_subplugin_features.h index e6b485ef2..239763836 100644 --- a/plugins/ladspa_effect/ladspa_subplugin_features.h +++ b/plugins/ladspa_effect/ladspa_subplugin_features.h @@ -36,7 +36,7 @@ class ladspaSubPluginFeatures : public plugin::descriptor::subPluginFeatures { public: - ladspaSubPluginFeatures( plugin::pluginTypes _type ); + ladspaSubPluginFeatures( plugin::PluginTypes _type ); virtual void fillDescriptionWidget( QWidget * _parent, const key * _key ); diff --git a/plugins/vst_effect/vst_control_dialog.h b/plugins/vst_effect/vst_control_dialog.h index abe621a36..0eb37afcf 100644 --- a/plugins/vst_effect/vst_control_dialog.h +++ b/plugins/vst_effect/vst_control_dialog.h @@ -37,13 +37,13 @@ public: vstControlDialog( QWidget * _parent, vstEffect * _eff ); virtual ~vstControlDialog(); - virtual void FASTCALL saveSettings( QDomDocument & _doc, +/* virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); + virtual void loadSettings( const QDomElement & _this ); inline virtual QString nodeName( void ) const { return( "vstcontrols" ); - } + }*/ virtual ch_cnt_t getControlCount( void ) { diff --git a/src/core/export_project_dialog.cpp b/src/core/export_project_dialog.cpp index 192de0da5..ffe518cae 100644 --- a/src/core/export_project_dialog.cpp +++ b/src/core/export_project_dialog.cpp @@ -52,18 +52,18 @@ extern QString file_to_render; fileEncodeDevice fileEncodeDevices[] = { - { WAVE_FILE, QT_TRANSLATE_NOOP( "exportProjectDialog", + { WaveFile, QT_TRANSLATE_NOOP( "exportProjectDialog", "Uncompressed Wave-File (*.wav)" ), ".wav", &audioFileWave::getInst }, #ifdef HAVE_VORBIS_CODEC_H - { OGG_FILE, QT_TRANSLATE_NOOP( "exportProjectDialog", + { OggFile, QT_TRANSLATE_NOOP( "exportProjectDialog", "Compressed OGG-File (*.ogg)" ), ".ogg", &audioFileOgg::getInst }, #endif // ... insert your own file-encoder-infos here... may be one day the // user can add own encoders inside the program... - { NULL_FILE, NULL, NULL, NULL } + { NullFile, NULL, NULL, NULL } } ; @@ -136,7 +136,7 @@ exportProjectDialog::exportProjectDialog( const QString & _file_name, TYPE_HEIGHT ); Uint8 idx = 0; - while( fileEncodeDevices[idx].m_fileType != NULL_FILE ) + while( fileEncodeDevices[idx].m_fileType != NullFile ) { m_typeModel->addItem( tr( fileEncodeDevices[idx].m_description ) ); @@ -221,10 +221,11 @@ exportProjectDialog::~exportProjectDialog() // little help-function for getting file-type from a file-extension (only for // registered file-encoders) -fileTypes exportProjectDialog::getFileTypeFromExtension( const QString & _ext ) +ExportFileTypes exportProjectDialog::getFileTypeFromExtension( + const QString & _ext ) { int idx = 0; - while( fileEncodeDevices[idx].m_fileType != NULL_FILE ) + while( fileEncodeDevices[idx].m_fileType != NullFile ) { if( QString( fileEncodeDevices[idx].m_extension ) == _ext ) { @@ -233,7 +234,7 @@ fileTypes exportProjectDialog::getFileTypeFromExtension( const QString & _ext ) ++idx; } - return( WAVE_FILE ); // default + return( WaveFile ); // default } @@ -276,7 +277,7 @@ void exportProjectDialog::closeEvent( QCloseEvent * _ce ) void exportProjectDialog::changedType( const QString & _new_type ) { int idx = 0; - while( fileEncodeDevices[idx].m_fileType != NULL_FILE ) + while( fileEncodeDevices[idx].m_fileType != NullFile ) { if( tr( fileEncodeDevices[idx].m_description ) == _new_type ) { @@ -293,7 +294,7 @@ void exportProjectDialog::changedType( const QString & _new_type ) void exportProjectDialog::exportBtnClicked( void ) { int idx = 0; - while( fileEncodeDevices[idx].m_fileType != NULL_FILE ) + while( fileEncodeDevices[idx].m_fileType != NullFile ) { if( fileEncodeDevices[idx].m_fileType == m_fileType ) { @@ -302,7 +303,7 @@ void exportProjectDialog::exportBtnClicked( void ) ++idx; } - if( fileEncodeDevices[idx].m_fileType == NULL_FILE ) + if( fileEncodeDevices[idx].m_fileType == NullFile ) { return; } diff --git a/src/core/song.cpp b/src/core/song.cpp index a208d0b75..d9dff6d61 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -954,7 +954,7 @@ void song::exportProject( void ) int idx = 0; QStringList types; - while( fileEncodeDevices[idx].m_fileType != NULL_FILE ) + while( fileEncodeDevices[idx].m_fileType != NullFile ) { types << tr( fileEncodeDevices[idx].m_description ); ++idx; From 5313f32c560fab4c2f65c83c3ee529c3a6855739 Mon Sep 17 00:00:00 2001 From: Paul Giblock Date: Fri, 22 Feb 2008 08:09:34 +0000 Subject: [PATCH 59/87] steroEnhancer, Vibed, and separated Graph widget git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@699 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 33 + Makefile.am | 3 + {plugins/vibed => include}/graph.h | 95 ++- plugins/stereo_enhancer/Makefile.am | 6 +- plugins/stereo_enhancer/stereo_enhancer.cpp | 14 +- plugins/stereo_enhancer/stereo_enhancer.h | 25 +- .../stereoenhancer_control_dialog.cpp | 63 +- .../stereoenhancer_control_dialog.h | 30 +- .../stereoenhancer_controls.cpp | 68 ++ .../stereo_enhancer/stereoenhancer_controls.h | 74 ++ plugins/vibed/Makefile.am | 12 +- plugins/vibed/graph.cpp | 227 ----- plugins/vibed/impulse_editor.cpp | 471 ----------- plugins/vibed/impulse_editor.h | 88 -- plugins/vibed/nine_button_selector.cpp | 50 +- plugins/vibed/nine_button_selector.h | 26 +- plugins/vibed/string_container.cpp | 4 +- plugins/vibed/string_container.h | 2 +- plugins/vibed/vibed.cpp | 799 +++++++++++------- plugins/vibed/vibed.h | 97 ++- src/core/piano_roll.cpp | 8 +- src/widgets/graph.cpp | 478 +++++++++++ 22 files changed, 1380 insertions(+), 1293 deletions(-) rename {plugins/vibed => include}/graph.h (50%) create mode 100644 plugins/stereo_enhancer/stereoenhancer_controls.cpp create mode 100644 plugins/stereo_enhancer/stereoenhancer_controls.h delete mode 100644 plugins/vibed/graph.cpp delete mode 100644 plugins/vibed/impulse_editor.cpp delete mode 100644 plugins/vibed/impulse_editor.h create mode 100644 src/widgets/graph.cpp diff --git a/ChangeLog b/ChangeLog index a382e81ef..fe2c9e3ef 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,36 @@ +2008-02-22 Paul Giblock + + * plugins/vibed/vibed.cpp: + * plugins/vibed/vibed.h: + * plugins/vibed/string_container.cpp: + * plugins/vibed/string_container.h: + * plugins/vibed/nine_button_selector.cpp: + * plugins/vibed/nine_button_selector.h: + * plugins/vibed/Makefile.am: + M/V-split of Vibed-instrument. Lacks user-specified wave, to be added on + my next commit. Also has an audio output bug, certain notes make weird + noises + + * plugins/stereo_enhancer/stereoenhancer_controls.cpp: + * plugins/stereo_enhancer/stereoenhancer_controls.h: + * plugins/stereo_enhancer/stereo_enhancer.cpp: + * plugins/stereo_enhancer/stereo_enhancer.h: + * plugins/stereo_enhancer/stereoenhancer_control_dialog.cpp: + * plugins/stereo_enhancer/stereoenhancer_control_dialog.h: + * plugins/stereo_enhancer/Makefile.am: + M/V-split of Stereo-enhancer effect. + + * src/core/piano_roll.cpp: + Changed quantization to change on the gridlines, instead of nearest-point + in the middle. Made this change here, because MIDI events should still be + quantized to nearest-point (I think) + + * src/widgets/graph.cpp: + * include/graph.h: + * Makefile.am: + Split graph and moved it to the shared widgets. Supports variable ranges, + sample-lengths, smoothing, normalizing, and is antialiased + 2008-02-18 Tobias Doerffel * plugins/ladspa_effect/ladspa_subplugin_features.h: diff --git a/Makefile.am b/Makefile.am index 772d18160..ff26fdef2 100644 --- a/Makefile.am +++ b/Makefile.am @@ -67,6 +67,7 @@ lmms_MOC = \ ./export_project_dialog.moc \ ./fade_button.moc \ ./file_browser.moc \ + ./graph.moc \ ./group_box.moc \ ./instrument_midi_io.moc \ ./instrument_midi_io_view.moc \ @@ -223,6 +224,7 @@ lmms_SOURCES = \ $(srcdir)/src/widgets/effect_rack_view.cpp \ $(srcdir)/src/widgets/effect_view.cpp \ $(srcdir)/src/widgets/fade_button.cpp \ + $(srcdir)/src/widgets/graph.cpp \ $(srcdir)/src/widgets/group_box.cpp \ $(srcdir)/src/widgets/envelope_and_lfo_view.cpp \ $(srcdir)/src/widgets/instrument_function_views.cpp \ @@ -303,6 +305,7 @@ lmms_SOURCES = \ $(srcdir)/include/mv_base.h \ $(srcdir)/include/automatable_model.h \ $(srcdir)/include/automatable_model_templates.h \ + $(srcdir)/include/graph.h \ $(srcdir)/include/group_box.h \ $(srcdir)/include/tab_widget.h \ $(srcdir)/include/knob.h \ diff --git a/plugins/vibed/graph.h b/include/graph.h similarity index 50% rename from plugins/vibed/graph.h rename to include/graph.h index 9e8147542..095f9b73b 100644 --- a/plugins/vibed/graph.h +++ b/include/graph.h @@ -2,6 +2,7 @@ * graph.h - a QT widget for displaying and manipulating waveforms * * Copyright (c) 2006-2007 Andreas Brandmaier + * 2008 Paul Giblock * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -30,21 +31,26 @@ #include #include +#include "mv_base.h" +#include "types.h" -class graph : public QWidget +class graphModel; +class track; + +class graph : public QWidget, public modelView { Q_OBJECT public: graph( QWidget * _parent ); virtual ~graph(); - void setSamplePointer( float * pointer, int length ); void setForeground( const QPixmap & _pixmap ); - void loadSampleFromFile( const QString & _filename ); +// void loadSampleFromFile( const QString & _filename ); + + virtual inline graphModel * model( void ) { + return castModel(); + } -signals: - void sampleSizeChanged( float f ); - void sampleChanged( void ); protected: virtual void paintEvent( QPaintEvent * _pe ); @@ -54,19 +60,90 @@ protected: virtual void mouseMoveEvent( QMouseEvent * _me ); virtual void mouseReleaseEvent( QMouseEvent * _me ); +protected slots: + void updateGraph(Uint32 _startPos, Uint32 _endPos); + private: + virtual void modelChanged( void ); void changeSampleAt(int _x, int _y); + QPixmap m_foreground; + graphModel * m_graphModel; - float *samplePointer; - int sampleLength; - bool m_mouseDown; int m_lastCursorX; } ; + +class graphModel : public model +{ + Q_OBJECT +public: + graphModel( float _min, + float _max, + Uint32 _size, + :: model * _parent, track * _track = NULL, + bool _default_constructed = FALSE ); + + virtual ~graphModel(); + + // TODO: saveSettings, loadSettings? + + inline float minValue( void ) const + { + return( m_minValue ); + } + + inline float maxValue( void ) const + { + return( m_maxValue ); + } + + inline Uint32 length( void ) const + { + return( m_samples.count() ); + } + + inline const float* samples( void ) const + { + return( m_samples.data() ); + } + +public slots: + void setRange( float _min, float _max ); + + void setLength( Uint32 _size ); + + void setSampleAt( Uint32 _samplePos, float _value ); + void setSamples( const float * _value ); + + void setWaveToSine( void ); + void setWaveToTriangle( void ); + void setWaveToSaw( void ); + void setWaveToSquare( void ); + void setWaveToNoise( void ); + //void setWaveToUser( ); + + void smooth( void ); + void normalize( void ); + +signals: + void lengthChanged( void ); + void samplesChanged( Uint32 startPos, Uint32 endPos ); + void rangeChanged( void ); + +private: + + QVector m_samples; + float m_maxValue; + float m_minValue; + + friend class graph; + +}; + #endif diff --git a/plugins/stereo_enhancer/Makefile.am b/plugins/stereo_enhancer/Makefile.am index 7789ccb55..e64807721 100644 --- a/plugins/stereo_enhancer/Makefile.am +++ b/plugins/stereo_enhancer/Makefile.am @@ -11,7 +11,7 @@ AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="stereoenhancer" $(MOC) -o $@ $< -MOC_FILES = ./stereoenhancer_control_dialog.moc +MOC_FILES = ./stereoenhancer_controls.moc BUILT_SOURCES = $(MOC_FILES) ./embedded_resources.h EMBEDDED_RESOURCES = $(wildcard *png) @@ -31,6 +31,8 @@ pkglib_LTLIBRARIES= libstereoenhancer.la libstereoenhancer_la_SOURCES = stereo_enhancer.cpp \ stereo_enhancer.h \ stereoenhancer_control_dialog.cpp \ - stereoenhancer_control_dialog.h + stereoenhancer_control_dialog.h \ + stereoenhancer_controls.cpp \ + stereoenhancer_controls.h $(libstereoenhancer_la_SOURCES): ./embedded_resources.h diff --git a/plugins/stereo_enhancer/stereo_enhancer.cpp b/plugins/stereo_enhancer/stereo_enhancer.cpp index 43ac9b588..d684e87fa 100644 --- a/plugins/stereo_enhancer/stereo_enhancer.cpp +++ b/plugins/stereo_enhancer/stereo_enhancer.cpp @@ -51,11 +51,13 @@ plugin::descriptor stereoenhancer_plugin_descriptor = stereoEnhancerEffect::stereoEnhancerEffect( + model * _parent, const descriptor::subPluginFeatures::key * _key ) : - effect( &stereoenhancer_plugin_descriptor, _key ), + effect( &stereoenhancer_plugin_descriptor, _parent, _key ), m_seFX( effectLib::stereoEnhancer<>( 0.0f ) ), m_delayBuffer( new surroundSampleFrame[DEFAULT_BUFFER_SIZE] ), - m_currFrame( 0 ) + m_currFrame( 0 ), + m_bbControls( this ) { // TODO: Make m_delayBuffer customizable? } @@ -89,7 +91,7 @@ bool FASTCALL stereoEnhancerEffect::processAudioBuffer( surroundSampleFrame * _b int frameIndex = 0; - if( isBypassed() || !isRunning () ) + if( !isEnabled() || !isRunning() ) { return( FALSE ); } @@ -123,7 +125,7 @@ bool FASTCALL stereoEnhancerEffect::processAudioBuffer( surroundSampleFrame * _b _buf[f][ch] = getDryLevel() * _buf[f][ch] + getWetLevel() * s[ch%DEFAULT_CHANNELS]; - out_sum += _buf[f][ch]*_buf[f][ch]; + out_sum += _buf[f][ch]*_buf[f][ch]; } // Update currFrame @@ -170,9 +172,9 @@ extern "C" { // neccessary for getting instance out of shared lib -plugin * lmms_plugin_main( void * _data ) +plugin * lmms_plugin_main( model * _parent, void * _data ) { - return( new stereoEnhancerEffect( + return( new stereoEnhancerEffect( _parent, static_cast( _data ) ) ); } diff --git a/plugins/stereo_enhancer/stereo_enhancer.h b/plugins/stereo_enhancer/stereo_enhancer.h index bc937588d..7796f084a 100644 --- a/plugins/stereo_enhancer/stereo_enhancer.h +++ b/plugins/stereo_enhancer/stereo_enhancer.h @@ -32,43 +32,36 @@ #include "effect_lib.h" #include "engine.h" #include "main_window.h" -#include "stereoenhancer_control_dialog.h" +#include "stereoenhancer_controls.h" class stereoEnhancerEffect : public effect { public: - stereoEnhancerEffect( const descriptor::subPluginFeatures::key * _key ); + stereoEnhancerEffect( model * parent, + const descriptor::subPluginFeatures::key * _key ); virtual ~stereoEnhancerEffect(); virtual bool FASTCALL processAudioBuffer( surroundSampleFrame * _buf, - const fpp_t _frames ); - inline virtual QString nodeName( void ) const + const fpp_t _frames ); + + virtual effectControls * getControls( void ) { - return( "stereoenhancereffect" ); + return( &m_bbControls ); } - virtual inline effectControlDialog * createControlDialog( track * ) - { - return( new stereoEnhancerControlDialog( - engine::getMainWindow()->workspace(), - this ) ); - } - void clearMyBuffer(); private: - //effectLib::monoToStereoAdaptor > m_seFX; effectLib::stereoEnhancer<> m_seFX; surroundSampleFrame * m_delayBuffer; int m_currFrame; + stereoEnhancerControls m_bbControls; - friend class stereoEnhancerControlDialog; + friend class stereoEnhancerControls; } ; - - #endif diff --git a/plugins/stereo_enhancer/stereoenhancer_control_dialog.cpp b/plugins/stereo_enhancer/stereoenhancer_control_dialog.cpp index bb1b3d006..8b4da06f2 100644 --- a/plugins/stereo_enhancer/stereoenhancer_control_dialog.cpp +++ b/plugins/stereo_enhancer/stereoenhancer_control_dialog.cpp @@ -23,68 +23,27 @@ */ -#ifndef QT3 #include -#include -#else - -#include - -#endif - -#include "stereo_enhancer.h" -#include "knob.h" +#include "stereoenhancer_control_dialog.h" +#include "stereoenhancer_controls.h" -stereoEnhancerControlDialog::stereoEnhancerControlDialog( QMdiArea * _parent, - stereoEnhancerEffect * _eff ) : - effectControlDialog( _parent, _eff ), - m_effect( _eff ) +stereoEnhancerControlDialog::stereoEnhancerControlDialog( + stereoEnhancerControls * _controls ) : + effectControlDialog( _controls ) { QHBoxLayout * l = new QHBoxLayout( this ); - m_widthKnob = new knob( knobBright_26, this, tr( "Width" ), NULL ); - m_widthKnob->setRange( 0.0f, 180.0f, 1.0f ); - m_widthKnob->setInitValue( 0.0f ); - m_widthKnob->setLabel( tr( "WIDE" ) ); - m_widthKnob->setHintText( tr( "Width:" ) + " ", "samples" ); - connect( m_widthKnob, SIGNAL( valueChanged( float ) ), - this, SLOT( changeWideCoeff( void ) ) ); + knob * widthKnob = new knob( knobBright_26, this, tr( "Width" ) ); + widthKnob->setModel( &_controls->m_widthModel ); + widthKnob->setLabel( tr( "WIDE" ) ); + widthKnob->setHintText( tr( "Width:" ) + " ", "samples" ); - l->addWidget( m_widthKnob ); + l->addWidget( widthKnob ); - changeWideCoeff(); + this->setLayout(l); } - - - -void stereoEnhancerControlDialog::changeWideCoeff( void ) -{ - m_effect->m_seFX.setWideCoeff( m_widthKnob->value() ); -} - - - -void FASTCALL stereoEnhancerControlDialog::loadSettings( - const QDomElement & _this ) -{ - m_widthKnob->setValue( _this.attribute( "width" ).toFloat() ); -} - - - - -void FASTCALL stereoEnhancerControlDialog::saveSettings( QDomDocument & _doc, - QDomElement & _this ) -{ - _this.setAttribute( "width", m_widthKnob->value() ); -} - - - -#include "stereoenhancer_control_dialog.moc" - diff --git a/plugins/stereo_enhancer/stereoenhancer_control_dialog.h b/plugins/stereo_enhancer/stereoenhancer_control_dialog.h index c3b7eed5e..5ba9de711 100644 --- a/plugins/stereo_enhancer/stereoenhancer_control_dialog.h +++ b/plugins/stereo_enhancer/stereoenhancer_control_dialog.h @@ -27,42 +27,18 @@ #include "effect_control_dialog.h" -class knob; -class stereoEnhancerEffect; -class QMdiArea; +class stereoEnhancerControls; class stereoEnhancerControlDialog : public effectControlDialog { - Q_OBJECT public: - stereoEnhancerControlDialog( QMdiArea * _parent, stereoEnhancerEffect * _eff ); + stereoEnhancerControlDialog( stereoEnhancerControls * _controls ); virtual ~stereoEnhancerControlDialog() { } - virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _parent ); - virtual void FASTCALL loadSettings( const QDomElement & _this ); - inline virtual QString nodeName( void ) const - { - return( "stereoenhancercontrols" ); - } +}; - virtual ch_cnt_t getControlCount( void ) - { - return( 1 ); - } - - -private slots: - void changeWideCoeff( void ); - - -private: - stereoEnhancerEffect * m_effect; - knob * m_widthKnob; - -} ; #endif diff --git a/plugins/stereo_enhancer/stereoenhancer_controls.cpp b/plugins/stereo_enhancer/stereoenhancer_controls.cpp new file mode 100644 index 000000000..452c33000 --- /dev/null +++ b/plugins/stereo_enhancer/stereoenhancer_controls.cpp @@ -0,0 +1,68 @@ +/* + * stereoenhancer_controls.cpp - control-dialog for stereoenhancer-effect + * + * Copyright (c) 2006-2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include "stereoenhancer_controls.h" +#include "stereo_enhancer.h" +#include "automatable_model_templates.h" + + +stereoEnhancerControls::stereoEnhancerControls( stereoEnhancerEffect * _eff ) : + effectControls( _eff ), + m_effect( _eff ), + m_widthModel(0.0f, 0.0f, 180.0f, 1.0f) +{ + connect( &m_widthModel, SIGNAL( dataChanged( void ) ), + this, SLOT( changeWideCoeff( void ) ) ); + + changeWideCoeff(); +} + + + +void stereoEnhancerControls::changeWideCoeff( void ) +{ + m_effect->m_seFX.setWideCoeff( m_widthModel.value() ); +} + + + +void FASTCALL stereoEnhancerControls::loadSettings( + const QDomElement & _this ) +{ + m_widthModel.setValue( _this.attribute( "width" ).toFloat() ); +} + + + + +void FASTCALL stereoEnhancerControls::saveSettings( QDomDocument & _doc, + QDomElement & _this ) +{ + _this.setAttribute( "width", m_widthModel.value() ); +} + + + +#include "stereoenhancer_controls.moc" + diff --git a/plugins/stereo_enhancer/stereoenhancer_controls.h b/plugins/stereo_enhancer/stereoenhancer_controls.h new file mode 100644 index 000000000..df51a8750 --- /dev/null +++ b/plugins/stereo_enhancer/stereoenhancer_controls.h @@ -0,0 +1,74 @@ +/* + * stereoenhancer_controls.h - controls for stereoEnhancer-effect + * + * Copyright (c) 2008 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _STEREO_ENHANCER_CONTROLS_H +#define _STEREO_ENHANCER_CONTROLS_H + +#include "effect_controls.h" +#include "stereoenhancer_control_dialog.h" +#include "knob.h" + +class stereoEnhancerEffect; + +class stereoEnhancerControls : public effectControls +{ + Q_OBJECT +public: + stereoEnhancerControls( stereoEnhancerEffect( * _eff ) ); + virtual ~stereoEnhancerControls() + { + } + + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); + inline virtual QString nodeName( void ) const + { + return( "stereoenhancercontrols" ); + } + + virtual ch_cnt_t getControlCount( void ) + { + return( 1 ); + } + + virtual effectControlDialog * createView( void ) + { + return new stereoEnhancerControlDialog( this ); + } + + +private slots: + void changeWideCoeff( void ); + + +private: + stereoEnhancerEffect * m_effect; + knobModel m_widthModel; + + friend class stereoEnhancerControlDialog; + +} ; + + +#endif /*_STEREO_ENHANCER_CONTROLS_H*/ diff --git a/plugins/vibed/Makefile.am b/plugins/vibed/Makefile.am index 81f20ac8e..5f1258c0b 100644 --- a/plugins/vibed/Makefile.am +++ b/plugins/vibed/Makefile.am @@ -11,7 +11,7 @@ AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="vibedstrings" $(MOC) -o $@ $< -MOC_FILES = ./vibed.moc ./graph.moc ./impulse_editor.moc ./nine_button_selector.moc +MOC_FILES = ./vibed.moc ./nine_button_selector.moc BUILT_SOURCES = $(MOC_FILES) ./embedded_resources.h EMBEDDED_RESOURCES = $(wildcard *png) @@ -30,15 +30,11 @@ pkglib_LTLIBRARIES= libvibedstrings.la libvibedstrings_la_SOURCES = vibed.cpp \ vibed.h \ - graph.cpp \ - graph.h \ vibrating_string.cpp \ vibrating_string.h \ + nine_button_selector.cpp \ + nine_button_selector.h \ string_container.cpp \ - string_container.h \ - impulse_editor.cpp \ - impulse_editor.h \ - nine_button_selector.cpp \ - nine_button_selector.h + string_container.h $(libvibedstrings_la_SOURCES): ./embedded_resources.h diff --git a/plugins/vibed/graph.cpp b/plugins/vibed/graph.cpp deleted file mode 100644 index c66726dc4..000000000 --- a/plugins/vibed/graph.cpp +++ /dev/null @@ -1,227 +0,0 @@ -/* - * graph.cpp - a QT widget for displaying and manipulating waveforms - * - * Copyright (c) 2006-2007 Andreas Brandmaier - * - * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net - * - * 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. - * - */ - - -#include -#include -#include - -#include "graph.h" -#include "string_pair_drag.h" -#include "sample_buffer.h" -#include -#include - -using namespace std; - - - -graph::graph( QWidget * _parent ) : - QWidget( _parent ) -{ - m_mouseDown = false; - - setFixedSize( 132, 104 ); - - setAcceptDrops( TRUE ); -} - - - - -graph::~graph() -{ -} - -void graph::setForeground( const QPixmap &_pixmap ) -{ - m_foreground = _pixmap; -} - -void graph::setSamplePointer( float * _pointer, int _length ) -{ - samplePointer = _pointer; - sampleLength = _length; - update(); -} - -void graph::loadSampleFromFile( const QString & _filename ) -{ - // zero sample_shape - for (int i = 0; i < sampleLength; i++) - { - samplePointer[i] = 0; - } - - // load user shape - sampleBuffer buffer( _filename ); - - // copy buffer data - sampleLength = min( sampleLength, static_cast(buffer.frames()) ); - for ( int i = 0; i < sampleLength; i++ ) - { - samplePointer[i] = (float)*buffer.data()[i]; - } - -} - -void graph::mouseMoveEvent ( QMouseEvent * _me ) -{ - // get position - int x = _me->x(); - int y = _me->y(); - - - // avoid mouse leaps - int diff = x - m_lastCursorX; - - if( diff >= 1 ) - { - x = m_lastCursorX + 1; - } - else if( diff <= 1 ) - { - x = m_lastCursorX - 1; - } - else - { - x = m_lastCursorX; - } - - changeSampleAt( x, y ); - - // update mouse - m_lastCursorX = x; - -} - -void graph::mousePressEvent( QMouseEvent * _me ) -{ - if( _me->button() == Qt::LeftButton ) - { - // toggle mouse state - m_mouseDown = true; - - // get position - int x = _me->x(); - int y = _me->y(); - - changeSampleAt( x,y ); - - // toggle mouse state - m_mouseDown = true; - setCursor( Qt::BlankCursor ); - m_lastCursorX = x; - } -} - -void graph::changeSampleAt(int _x, int _y) -{ - // consider border of background image - _x -= 2; - _y -= 2; - - // boundary check - if (_x < 0) { return; } - if (_x > sampleLength) { return; } - if (_y < 0) { return; } - if (_y >= 100) { return; } - _y = 100 - _y; - - // change sample shape - samplePointer[_x] = (_y-50.0)/50.0; - emit sampleChanged(); - - -} - -void graph::mouseReleaseEvent( QMouseEvent * _me ) -{ - if( _me->button() == Qt::LeftButton ) - { - // toggle mouse state - m_mouseDown = false; - setCursor( Qt::ArrowCursor ); - update(); - } -} - - - -void graph::paintEvent( QPaintEvent * ) -{ - - QPainter p( this ); - - p.setPen( QColor( 0xFF, 0xAA, 0x00 ) ); - - p.drawLine( 1+sampleLength, 2, 1+sampleLength, 102); - - float xscale = 128.0 / sampleLength; - - for (int i=0; i < sampleLength-1; i++) - { - p.drawLine(2+static_cast(i*xscale), - 2+static_cast(-samplePointer[i]*50) + 50, - 2+static_cast((i+1)*xscale), - 2+static_cast(-samplePointer[i+1]*50 + 50) - ); - } - - // draw Pointer - if (m_mouseDown) { - QPoint cursor = mapFromGlobal( QCursor::pos() ); - p.setPen( QColor( 0xAA, 0xFF, 0x00 ) ); - p.drawLine( 2, cursor.y(), 130, cursor.y() ); - p.drawLine( cursor.x(), 2, cursor.x(), 102 ); - } - p.drawPixmap( 0, 0, m_foreground ); -} - - - - -void graph::dropEvent( QDropEvent * _de ) -{ - QString type = stringPairDrag::decodeKey( _de ); - QString value = stringPairDrag::decodeValue( _de ); - - if( type == "samplefile" ) - { - loadSampleFromFile( value ); - _de->accept(); - } -} - -void graph::dragEnterEvent( QDragEnterEvent * _dee ) -{ - if( stringPairDrag::processDragEnterEvent( _dee, - QString( "samplefile" ) ) == FALSE ) - { - _dee->ignore(); - } -} - - -#include "graph.moc" diff --git a/plugins/vibed/impulse_editor.cpp b/plugins/vibed/impulse_editor.cpp deleted file mode 100644 index 1d0b7c989..000000000 --- a/plugins/vibed/impulse_editor.cpp +++ /dev/null @@ -1,471 +0,0 @@ -/* - * impulse_editor.cpp - graphic waveform editor - * - * Copyright (c) 2006-2007 Danny McRae - * - * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net - * - * 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. - * - */ - - -#include "impulse_editor.h" - -#include -#include -#include -#include - -#include "caption_menu.h" -#include "embed.h" -#include "engine.h" -#include "oscillator.h" -#include "song_editor.h" -#include "tooltip.h" -#include "vibed.h" - - -impulseEditor::impulseEditor( QWidget * _parent, int _x, int _y, track * _track, - Uint32 _len ) : - QWidget( _parent ), - m_sampleLength( _len ), - m_normalizeFactor( 1.0f ), - m_forward( TRUE ) -{ - setFixedSize( 153, 124 ); - m_base = QPixmap::grabWidget( _parent, _x, _y ); - setAutoFillBackground( TRUE ); - QPalette pal = palette(); - pal.setBrush( backgroundRole(), m_base ); - setPalette( pal ); - - m_graph = new graph( this ); - m_graph->setForeground( PLUGIN_NAME::getIconPixmap( "wavegraph4" ) ); - m_graph->move( 0, 0 ); - m_graph->setCursor( QCursor( Qt::CrossCursor ) ); - toolTip::add( m_graph, tr ( "Draw your own waveform here " - "by dragging your mouse onto this graph" ) ); - - connect( m_graph, SIGNAL ( sampleChanged( void ) ), - this, SLOT ( sampleChanged( void ) ) ); - - m_sinWaveBtn = new pixmapButton( this, tr( "Sine wave" ), _track ); - m_sinWaveBtn->move( 136, 3 ); - m_sinWaveBtn->setActiveGraphic( embed::getIconPixmap( - "sin_wave_active" ) ); - m_sinWaveBtn->setInactiveGraphic( embed::getIconPixmap( - "sin_wave_inactive" ) ); - m_sinWaveBtn->setChecked( TRUE ); - toolTip::add( m_sinWaveBtn, - tr( "Click here if you want a sine-wave for " - "current oscillator." ) ); - connect( m_sinWaveBtn, SIGNAL (clicked ( void ) ), - this, SLOT ( sinWaveClicked( void ) ) ); - - - m_triangleWaveBtn = new pixmapButton( this, tr( "Triangle wave" ), - _track ); - m_triangleWaveBtn->move( 136, 20 ); - m_triangleWaveBtn->setActiveGraphic( - embed::getIconPixmap( "triangle_wave_active" ) ); - m_triangleWaveBtn->setInactiveGraphic( - embed::getIconPixmap( "triangle_wave_inactive" ) ); - toolTip::add( m_triangleWaveBtn, - tr( "Click here if you want a triangle-wave " - "for current oscillator." ) ); - connect( m_triangleWaveBtn, SIGNAL ( clicked ( void ) ), - this, SLOT ( triangleWaveClicked( void ) ) ); - - - m_sawWaveBtn = new pixmapButton( this, tr( "Saw wave" ), _track ); - m_sawWaveBtn->move( 136, 37 ); - m_sawWaveBtn->setActiveGraphic( embed::getIconPixmap( - "saw_wave_active" ) ); - m_sawWaveBtn->setInactiveGraphic( embed::getIconPixmap( - "saw_wave_inactive" ) ); - toolTip::add( m_sawWaveBtn, - tr( "Click here if you want a saw-wave for " - "current oscillator." ) ); - connect( m_sawWaveBtn, SIGNAL (clicked ( void ) ), - this, SLOT ( sawWaveClicked( void ) ) ); - - - m_sqrWaveBtn = new pixmapButton( this, tr( "Square wave" ), _track ); - m_sqrWaveBtn->move( 136, 54 ); - m_sqrWaveBtn->setActiveGraphic( embed::getIconPixmap( - "square_wave_active" ) ); - m_sqrWaveBtn->setInactiveGraphic( embed::getIconPixmap( - "square_wave_inactive" ) ); - toolTip::add( m_sqrWaveBtn, - tr( "Click here if you want a square-wave for " - "current oscillator." ) ); - connect( m_sqrWaveBtn, SIGNAL ( clicked ( void ) ), - this, SLOT ( sqrWaveClicked( void ) ) ); - - - m_whiteNoiseWaveBtn = new pixmapButton( this, tr( "White noise wave" ), - _track ); - m_whiteNoiseWaveBtn->move( 136, 71 ); - m_whiteNoiseWaveBtn->setActiveGraphic( - embed::getIconPixmap( "white_noise_wave_active" ) ); - m_whiteNoiseWaveBtn->setInactiveGraphic( - embed::getIconPixmap( "white_noise_wave_inactive" ) ); - toolTip::add( m_whiteNoiseWaveBtn, - tr( "Click here if you want a white-noise for " - "current oscillator." ) ); - connect( m_whiteNoiseWaveBtn, SIGNAL ( clicked ( void ) ), - this, SLOT ( noiseWaveClicked( void ) ) ); - - - m_usrWaveBtn = new pixmapButton( this, tr( "User defined wave" ), - _track ); - m_usrWaveBtn->move( 136, 88 ); - m_usrWaveBtn->setActiveGraphic( embed::getIconPixmap( - "usr_wave_active" ) ); - m_usrWaveBtn->setInactiveGraphic( embed::getIconPixmap( - "usr_wave_inactive" ) ); - toolTip::add( m_usrWaveBtn, - tr( "Click here if you want a user-defined " - "wave-shape for current oscillator." ) ); - connect( m_usrWaveBtn, SIGNAL ( clicked ( void ) ), - this, SLOT ( usrWaveClicked( void ) ) ); - - - m_smoothBtn = new pixmapButton( this, tr( "Smooth" ), _track ); - m_smoothBtn->move( 3, 108 ); - m_smoothBtn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "smooth_active" ) ); - m_smoothBtn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "smooth_inactive" ) ); - m_smoothBtn->setChecked( FALSE ); - toolTip::add( m_smoothBtn, - tr( "Click here to smooth waveform." ) ); - connect( m_smoothBtn, SIGNAL ( clicked ( void ) ), - this, SLOT ( smoothClicked( void ) ) ); - - - m_normalizeBtn = new pixmapButton( this, tr( "Normalize" ), _track ); - m_normalizeBtn->move( 20, 108 ); - m_normalizeBtn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "normalize_active" ) ); - m_normalizeBtn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "normalize_inactive" ) ); - m_normalizeBtn->setChecked( FALSE ); - toolTip::add( m_normalizeBtn, - tr( "Click here to normalize waveform." ) ); - - connect( m_normalizeBtn, SIGNAL ( clicked ( void ) ), - this, SLOT ( normalizeClicked( void ) ) ); - - m_state = new ledCheckBox( "", this, tr( "Enable waveform" ), _track ); - m_state->move( 136, 109 ); - m_state->setChecked( TRUE ); - toolTip::add( m_state, - tr( "Click here to enable/disable waveform." ) ); - - m_sampleShape = new float[m_sampleLength]; - m_graph->setSamplePointer( m_sampleShape, m_sampleLength ); - - m_lastBtn = m_sinWaveBtn; - emit( sawWaveClicked() ); - - move( _x, _y ); - -} - - - - -impulseEditor::~impulseEditor() -{ -} - - - - -void impulseEditor::sinWaveClicked( void ) -{ - m_lastBtn->setChecked( FALSE); - m_lastBtn = m_sinWaveBtn; - m_lastBtn->setChecked( TRUE ); - // generate a Sinus wave using static oscillator-method - for( Uint32 i = 0; i < m_sampleLength; i++ ) - { - m_sampleShape[i] = oscillator::sinSample( i / - static_cast( m_sampleLength ) ); - } - - sampleChanged(); -} - - - - -void impulseEditor::triangleWaveClicked( void ) -{ - m_lastBtn->setChecked( FALSE); - m_lastBtn = m_triangleWaveBtn; - m_lastBtn->setChecked( TRUE ); - // generate a Triangle wave using static oscillator-method - for( Uint32 i = 0; i < m_sampleLength; i++ ) - { - m_sampleShape[i] = oscillator::triangleSample( i / - static_cast( m_sampleLength ) ); - } - - sampleChanged(); - -} - - - - -void impulseEditor::sawWaveClicked( void ) -{ - m_lastBtn->setChecked( FALSE); - m_lastBtn = m_sawWaveBtn; - m_lastBtn->setChecked( TRUE ); - // generate a Saw wave using static oscillator-method - for( Uint32 i = 0; i < m_sampleLength; i++ ) - { - m_sampleShape[i] = oscillator::sawSample( i / - static_cast( m_sampleLength ) ); - } - - sampleChanged(); -} - - - - -void impulseEditor::sqrWaveClicked( void ) -{ - m_lastBtn->setChecked( FALSE); - m_lastBtn = m_sqrWaveBtn; - m_lastBtn->setChecked( TRUE ); - // generate a Sqr wave using static oscillator-method - for( Uint32 i = 0; i < m_sampleLength; i++ ) - { - m_sampleShape[i] = oscillator::squareSample( i / - static_cast( m_sampleLength ) ); - } - - sampleChanged(); -} - - - - -void impulseEditor::noiseWaveClicked( void ) -{ - m_lastBtn->setChecked( FALSE); - m_lastBtn = m_whiteNoiseWaveBtn; - m_lastBtn->setChecked( TRUE ); - // generate a Noise wave using static oscillator-method - for( Uint32 i = 0; i < m_sampleLength; i++ ) - { - m_sampleShape[i] = oscillator::noiseSample( i / - static_cast( m_sampleLength ) ); - } - - sampleChanged(); - -} - - - - -void impulseEditor::usrWaveClicked( void ) -{ - m_lastBtn->setChecked( FALSE ); - m_lastBtn = m_usrWaveBtn; - m_lastBtn->setChecked( TRUE ); - // zero sample_shape - for( Uint32 i = 0; i < m_sampleLength; i++ ) - { - m_sampleShape[i] = 0; - } - - // load user shape - sampleBuffer buffer; - QString af = buffer.openAudioFile(); - if( af != "" ) - { - buffer.setAudioFile( af ); - - // copy buffer data - if( m_sampleLength < static_cast( buffer.frames() ) ) - { - m_sampleLength = m_sampleLength; - } - else - { - m_sampleLength = static_cast( buffer.frames() ); - } - for( Uint32 i = 0; i < m_sampleLength; i++ ) - { - m_sampleShape[i] = static_cast( - buffer.data()[0][i] ); - } - } - - sampleChanged(); -} - - - - -void impulseEditor::smoothClicked( void ) -{ - m_smoothBtn->setChecked( TRUE ); - m_smoothBtn->update(); - - float* temp = new float[m_sampleLength]; - memcpy( temp, m_sampleShape, sizeof( float ) * m_sampleLength ); - - // Smoothing - m_sampleShape[0] = temp[0] / 2.0f; - for( Uint32 i = 1; i < m_sampleLength - 1; i++ ) - { - m_sampleShape[i] = ( temp[i - 1] + - temp[i] + - temp[i + 1] ) / 3.0f; - } - m_sampleShape[m_sampleLength - 1] = temp[m_sampleLength - 1] / 2.0f; - m_forward = FALSE; - - // Clean up - delete[] temp; - - // paint - update(); - m_graph->update(); - - engine::getSongEditor()->setModified(); - - m_smoothBtn->setChecked( FALSE ); - m_smoothBtn->update(); -} - - - - -void impulseEditor::normalizeClicked( void ) -{ - m_normalizeBtn->setChecked( TRUE ); - m_normalizeBtn->update(); - - float max = 0.0001f; - for( Uint32 i = 0; i < m_sampleLength; i++ ) - { - if( fabsf(m_sampleShape[i]) > max && m_sampleShape[i] != 0.0f ) - { - max = fabs( m_sampleShape[i] ); - } - } - m_normalizeFactor = max; - - for( Uint32 i = 0; i < m_sampleLength; i++ ) - { - m_sampleShape[i] /= m_normalizeFactor; - } - - update(); - m_graph->update(); - - engine::getSongEditor()->setModified(); - - m_normalizeBtn->setChecked( FALSE ); - m_normalizeBtn->update(); -} - - - - -void impulseEditor::sampleChanged() -{ - // analyze - float max = 0.0001f; - for( Uint32 i = 0; i < m_sampleLength; i++ ) - { - if( fabsf(m_sampleShape[i]) > max && m_sampleShape[i] != 0.0f ) - { - max = fabs( m_sampleShape[i] ); - } - } - m_normalizeFactor = max; - - // update - if( m_graph != NULL ) - { - m_graph->update(); - } - - engine::getSongEditor()->setModified(); -} - - - - -void impulseEditor::setOn( bool _on ) -{ - if( _on ) - { - m_state->setChecked( TRUE ); - } - else - { - m_state->setChecked( FALSE ); - } -} - - - - -void impulseEditor::contextMenuEvent( QContextMenuEvent * ) -{ - captionMenu contextMenu( accessibleName() ); - contextMenu.addAction( embed::getIconPixmap( "help" ), tr( "&Help" ), - this, SLOT( displayHelp() ) ); - contextMenu.exec( QCursor::pos() ); -} - - - - -void impulseEditor::displayHelp( void ) -{ - QWhatsThis::showText( mapToGlobal( rect().bottomRight() ), - whatsThis() ); -} - - - - -void FASTCALL impulseEditor::setValues( float * _shape ) -{ - for( Uint32 i = 0; i < m_sampleLength; i++ ) - { - m_sampleShape[i] = _shape[i]; - } -} - - - - -#include "impulse_editor.moc" - diff --git a/plugins/vibed/impulse_editor.h b/plugins/vibed/impulse_editor.h deleted file mode 100644 index 28751ef7f..000000000 --- a/plugins/vibed/impulse_editor.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * impulse_editor.cpp - graphic waveform editor - * - * Copyright (c) 2006-2007 Danny McRae - * - * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net - * - * 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 _IMPULSE_EDITOR_H -#define _IMPULSE_EDITOR_H - -#include -#include -#include - -#include "config.h" -#include "types.h" -#include "graph.h" -#include "pixmap_button.h" -#include "led_checkbox.h" - - -class impulseEditor: public QWidget -{ - Q_OBJECT -public: - impulseEditor( QWidget *parent, int _x, int _y, track * _track, - Uint32 _len = 128 ); - ~impulseEditor(); - - inline float * getValues() { return( m_sampleShape ); }; - inline bool isOn() { return( m_state->isChecked() ); }; - - void FASTCALL setValues( float * _shape ); - -public slots: - void sinWaveClicked( void ); - void triangleWaveClicked( void ); - void sawWaveClicked( void ); - void sqrWaveClicked( void ); - void noiseWaveClicked( void ); - void usrWaveClicked( void ); - void smoothClicked( void ); - void normalizeClicked( void ); - void sampleChanged(); - void setOn( bool _on ); - void contextMenuEvent( QContextMenuEvent * ); - void displayHelp( void ); - -private: - - graph * m_graph; - pixmapButton * m_sinWaveBtn; - pixmapButton * m_triangleWaveBtn; - pixmapButton * m_sqrWaveBtn; - pixmapButton * m_sawWaveBtn; - pixmapButton * m_whiteNoiseWaveBtn; - pixmapButton * m_usrWaveBtn; - pixmapButton * m_smoothBtn; - pixmapButton * m_normalizeBtn; - pixmapButton * m_lastBtn; - ledCheckBox * m_state; - - float * m_sampleShape; - - Uint32 m_sampleLength; - float m_normalizeFactor; - bool m_forward; - - QPixmap m_base; -}; - -#endif diff --git a/plugins/vibed/nine_button_selector.cpp b/plugins/vibed/nine_button_selector.cpp index b7c5f9a52..55b5dcb82 100644 --- a/plugins/vibed/nine_button_selector.cpp +++ b/plugins/vibed/nine_button_selector.cpp @@ -51,10 +51,9 @@ nineButtonSelector::nineButtonSelector( QPixmap _button0_on, QPixmap _button8_off, Uint8 _default, Uint32 _x, Uint32 _y, - QWidget * _parent, - track * _track ): + QWidget * _parent ): QWidget( _parent ), - m_selected( _default ) + autoModelView( new nineButtonSelectorModel(0, 8, _default, 1, NULL, TRUE ) ) { setFixedSize( 50, 50 ); m_base = QPixmap::grabWidget( _parent, _x, _y ); @@ -65,7 +64,7 @@ nineButtonSelector::nineButtonSelector( QPixmap _button0_on, pal.setBrush( backgroundRole(), m_base ); setPalette( pal ); - m_button = new pixmapButton( this, NULL, _track ); + m_button = new pixmapButton( this, NULL ); m_button->move( 1, 1 ); m_button->setActiveGraphic( _button0_on ); m_button->setInactiveGraphic( _button0_off ); @@ -74,7 +73,7 @@ nineButtonSelector::nineButtonSelector( QPixmap _button0_on, this, SLOT ( button0Clicked( void ) ) ); m_buttons.append( m_button ); - m_button = new pixmapButton( this, NULL, _track ); + m_button = new pixmapButton( this, NULL ); m_button->move( 18, 1 ); m_button->setActiveGraphic( _button1_on ); m_button->setInactiveGraphic( _button1_off ); @@ -83,7 +82,7 @@ nineButtonSelector::nineButtonSelector( QPixmap _button0_on, this, SLOT ( button1Clicked( void ) ) ); m_buttons.append( m_button ); - m_button = new pixmapButton( this, NULL, _track ); + m_button = new pixmapButton( this, NULL ); m_button->move( 35, 1 ); m_button->setActiveGraphic( _button2_on ); m_button->setInactiveGraphic( _button2_off ); @@ -92,7 +91,7 @@ nineButtonSelector::nineButtonSelector( QPixmap _button0_on, this, SLOT ( button2Clicked( void ) ) ); m_buttons.append( m_button ); - m_button = new pixmapButton( this, NULL, _track ); + m_button = new pixmapButton( this, NULL ); m_button->move( 1, 18 ); m_button->setActiveGraphic( _button3_on ); m_button->setInactiveGraphic( _button3_off ); @@ -101,7 +100,7 @@ nineButtonSelector::nineButtonSelector( QPixmap _button0_on, this, SLOT ( button3Clicked( void ) ) ); m_buttons.append( m_button ); - m_button = new pixmapButton( this, NULL, _track ); + m_button = new pixmapButton( this, NULL ); m_button->move( 18, 18 ); m_button->setActiveGraphic( _button4_on ); m_button->setInactiveGraphic( _button4_off ); @@ -110,7 +109,7 @@ nineButtonSelector::nineButtonSelector( QPixmap _button0_on, this, SLOT ( button4Clicked( void ) ) ); m_buttons.append( m_button ); - m_button = new pixmapButton( this, NULL, _track ); + m_button = new pixmapButton( this, NULL ); m_button->move( 35, 18 ); m_button->setActiveGraphic( _button5_on ); m_button->setInactiveGraphic( _button5_off ); @@ -119,7 +118,7 @@ nineButtonSelector::nineButtonSelector( QPixmap _button0_on, this, SLOT ( button5Clicked( void ) ) ); m_buttons.append( m_button ); - m_button = new pixmapButton( this, NULL, _track ); + m_button = new pixmapButton( this, NULL ); m_button->move( 1, 35 ); m_button->setActiveGraphic( _button6_on ); m_button->setInactiveGraphic( _button6_off ); @@ -128,7 +127,7 @@ nineButtonSelector::nineButtonSelector( QPixmap _button0_on, this, SLOT ( button6Clicked( void ) ) ); m_buttons.append( m_button ); - m_button = new pixmapButton( this, NULL, _track ); + m_button = new pixmapButton( this, NULL ); m_button->move( 18, 35 ); m_button->setActiveGraphic( _button7_on ); m_button->setInactiveGraphic( _button7_off ); @@ -137,7 +136,7 @@ nineButtonSelector::nineButtonSelector( QPixmap _button0_on, this, SLOT ( button7Clicked( void ) ) ); m_buttons.append( m_button ); - m_button = new pixmapButton( this, NULL, _track ); + m_button = new pixmapButton( this, NULL ); m_button->move( 35, 35 ); m_button->setActiveGraphic( _button8_on ); m_button->setInactiveGraphic( _button8_off ); @@ -231,22 +230,29 @@ void nineButtonSelector::button8Clicked( void ) setSelected( 8 ); } - - +void nineButtonSelector::modelChanged( void ) +{ + printf("Model Changed %d", model()->value()); + updateButton( model()->value() ); +} void FASTCALL nineButtonSelector::setSelected( Uint8 _new_button ) { - m_selected = _new_button; - - m_lastBtn->setChecked( FALSE ); - m_lastBtn = m_buttons[m_selected]; - m_lastBtn->setChecked( TRUE ); - - emit nineButtonSelection( m_selected ); + model()->setValue(_new_button); + updateButton( _new_button ); } +void FASTCALL nineButtonSelector::updateButton( Uint8 _new_button ) +{ + m_lastBtn->setChecked( FALSE ); + m_lastBtn->update(); - + m_lastBtn = m_buttons[_new_button]; + m_lastBtn->setChecked( TRUE ); + m_lastBtn->update(); + + emit nineButtonSelection( _new_button ); +} void nineButtonSelector::contextMenuEvent( QContextMenuEvent * ) { diff --git a/plugins/vibed/nine_button_selector.h b/plugins/vibed/nine_button_selector.h index 3dc21a2f4..8db59273e 100644 --- a/plugins/vibed/nine_button_selector.h +++ b/plugins/vibed/nine_button_selector.h @@ -29,12 +29,14 @@ #include "pixmap_button.h" -class nineButtonSelector: public QWidget +class nineButtonSelector: public QWidget , public intModelView { Q_OBJECT public: - nineButtonSelector( QPixmap _button1_on, + nineButtonSelector( QPixmap _button0_on, + QPixmap _button0_off, + QPixmap _button1_on, QPixmap _button1_off, QPixmap _button2_on, QPixmap _button2_off, @@ -50,15 +52,16 @@ public: QPixmap _button7_off, QPixmap _button8_on, QPixmap _button8_off, - QPixmap _button9_on, - QPixmap _button9_off, Uint8 _default, Uint32 _x, Uint32 _y, - QWidget * _parent, - track * _track ); + QWidget * _parent); ~nineButtonSelector(); - inline Uint8 getSelected() { return( m_selected ); }; +// inline Uint8 getSelected() { +// return( castModel()->value() ); +// }; + +protected: void FASTCALL setSelected( Uint8 _new_button ); public slots: @@ -78,11 +81,18 @@ signals: void nineButtonSelection( Uint8 ); private: + virtual void modelChanged( void ); + void updateButton( Uint8 ); + QList m_buttons; pixmapButton * m_button; pixmapButton * m_lastBtn; QPixmap m_base; - + Uint8 m_selected; + }; + +typedef nineButtonSelector::autoModel nineButtonSelectorModel; + #endif diff --git a/plugins/vibed/string_container.cpp b/plugins/vibed/string_container.cpp index 67ab176d1..ca57af6d9 100644 --- a/plugins/vibed/string_container.cpp +++ b/plugins/vibed/string_container.cpp @@ -45,7 +45,7 @@ stringContainer::stringContainer(const float _pitch, void stringContainer::addString(Uint8 _harm, const float _pick, const float _pickup, - float * _impluse, + const float * _impulse, const float _randomize, const float _string_loss, const float _detune, @@ -90,7 +90,7 @@ void stringContainer::addString(Uint8 _harm, m_strings.append( new vibratingString( m_pitch * harm, _pick, _pickup, - _impluse, + const_cast(_impulse), m_bufferLength, m_sampleRate, _oversample, diff --git a/plugins/vibed/string_container.h b/plugins/vibed/string_container.h index bc35f28ca..c1daf0df8 100644 --- a/plugins/vibed/string_container.h +++ b/plugins/vibed/string_container.h @@ -43,7 +43,7 @@ public: void addString( Uint8 _harm, const float _pick, const float _pickup, - float * _impluse, + const float * _impluse, const float _randomize, const float _string_loss, const float _detune, diff --git a/plugins/vibed/vibed.cpp b/plugins/vibed/vibed.cpp index 6ff6e204a..8d2667ab3 100644 --- a/plugins/vibed/vibed.cpp +++ b/plugins/vibed/vibed.cpp @@ -23,22 +23,22 @@ */ -#include "vibed.h" - #include #include #include -#include "base64.h" -#include "caption_menu.h" +#include "vibed.h" +#include "automatable_model_templates.h" + #include "engine.h" #include "instrument_track.h" -#include "knob.h" #include "note_play_handle.h" +#include "tooltip.h" +#include "base64.h" +#include "caption_menu.h" #include "oscillator.h" #include "string_container.h" #include "templates.h" -#include "tooltip.h" #include "volume.h" #include "volume_knob.h" @@ -48,13 +48,13 @@ extern "C" { - + plugin::descriptor vibedstrings_plugin_descriptor = { STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), "Vibed", QT_TRANSLATE_NOOP( "pluginBrowser", - "Vibrating string modeler" ), + "Vibrating string modeler" ), "Danny McRae ", 0x0100, plugin::Instrument, @@ -66,258 +66,58 @@ plugin::descriptor vibedstrings_plugin_descriptor = vibed::vibed( instrumentTrack * instrument_track ) : - instrument( instrument_track, &vibedstrings_plugin_descriptor ), - m_sampleLength( 128 ) + instrument( instrument_track, &vibedstrings_plugin_descriptor ) { - setAutoFillBackground( TRUE ); - QPalette pal; - pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( - "artwork" ) ); - setPalette( pal ); + + knobModel * knob; + boolModel * led; + nineButtonSelectorModel * harmonic; + graphModel * graphTmp; for( Uint8 harm = 0; harm < 9; harm++ ) { - m_editor = new impulseEditor( this, 76, 21, instrument_track ); - m_editor->setAccessibleName( tr( "Impulse Editor" ) ); - m_editor->setOn( FALSE ); - m_editor->hide(); - m_editors.append( m_editor ); - m_editor->setWhatsThis( tr( -"The waveform editor provides control over the initial state or impulse " -"that is used to start the string vibrating. The buttons to the right of " -"the graph will initialize the waveform to the selected type. The '?' " -"button will load a waveform from a file--only the first 128 samples " -"will be loaded.\n\n" + knob = new knobModel( DEFAULT_VOLUME, MIN_VOLUME, MAX_VOLUME, 1.0f, this ); + m_volumeKnobs.append( knob ); -"The waveform can also be drawn in the graph.\n\n" + knob = new knobModel( 0.0f, 0.0f, 0.05f, 0.001f, this ); + m_stiffnessKnobs.append( knob ); -"The 'S' button will smooth the waveform.\n\n" + knob = new knobModel( 0.0f, 0.0f, 0.05f, 0.001f, this ); + m_stiffnessKnobs.append( knob ); -"The 'N' button will normalize the waveform.") ); + knob = new knobModel( 0.0f, 0.0f, 0.05f, 0.005f, this ); + m_pickKnobs.append( knob ); - m_volumeKnob = new volumeKnob( knobBright_26, this, - tr( "Volume" ), instrument_track ); - m_volumeKnob->setRange( MIN_VOLUME, MAX_VOLUME, 1.0f ); - m_volumeKnob->setInitValue( DEFAULT_VOLUME ); - m_volumeKnob->move( 103, 142 ); - m_volumeKnob->setHintText( tr( "Volume:" ) + " ", "" ); - m_volumeKnob->hide(); - m_volumeKnobs.append( m_volumeKnob ); - m_volumeKnob->setWhatsThis( tr( "The 'V' knob sets the volume " - "of the selected string." ) ); - - m_stiffnessKnob = new knob( knobBright_26, this, - tr( "String stiffness" ), - instrument_track ); - m_stiffnessKnob->setRange( 0.0f, 0.05f, 0.001f ); - m_stiffnessKnob->setInitValue( 0.0f ); - m_stiffnessKnob->move( 129, 142 ); - m_stiffnessKnob->setHintText( tr( "String stiffness:" ) + - " ", "" ); - m_stiffnessKnob->hide(); - m_stiffnessKnobs.append( m_stiffnessKnob ); - m_stiffnessKnob->setWhatsThis( tr( -"The 'S' knob sets the stiffness of the selected string. The stiffness " -"of the string affects how long the string will ring out. The lower " -"the setting, the longer the string will ring." ) ); - - - m_pickKnob = new knob( knobBright_26, this, - tr( "Pick position" ), - instrument_track ); - m_pickKnob->setRange( 0.0f, 0.5f, 0.005f ); - m_pickKnob->setInitValue( 0.0f ); - m_pickKnob->move( 153, 142 ); - m_pickKnob->setHintText( tr( "Pick position:" ) + " ", "" ); - m_pickKnob->hide(); - m_pickKnobs.append( m_pickKnob ); - m_pickKnob->setWhatsThis( tr( -"The 'P' knob sets the position where the selected string will be 'picked'. " -"The lower the setting the closer the pick is to the bridge." ) ); - - m_pickupKnob = new knob( knobBright_26, this, - tr( "Pickup position" ), - instrument_track ); - m_pickupKnob->setRange( 0.0f, 0.5f, 0.005f ); - m_pickupKnob->setInitValue( 0.05f ); - m_pickupKnob->move( 177, 142 ); - m_pickupKnob->setHintText( tr( "Pickup position:" ) + - " ", "" ); - m_pickupKnob->hide(); - m_pickupKnobs.append( m_pickupKnob ); - m_pickupKnob->setWhatsThis( tr( -"The 'PU' knob sets the position where the vibrations will be monitored " -"for the selected string. The lower the setting, the closer the " -"pickup is to the bridge." ) ); + knob = new knobModel( 0.05f, 0.0f, 0.05f, 0.005f, this ); + m_pickupKnobs.append( knob ); - m_panKnob = new knob( knobBright_26, this, tr( "Pan" ), - instrument_track ); - m_panKnob->setRange( -1.0f, 1.0f, 0.01f ); - m_panKnob->setInitValue( 0.0f ); - m_panKnob->move( 105, 187 ); - m_panKnob->setHintText( tr( "Pan:" ) + " ", "" ); - m_panKnob->hide(); - m_panKnobs.append( m_panKnob ); - m_panKnob->setWhatsThis( tr( -"The Pan knob determines the location of the selected string in the stereo " -"field." ) ); - - m_detuneKnob = new knob( knobBright_26, this, tr( "Detune" ), - instrument_track ); - m_detuneKnob->setRange( -0.1f, 0.1f, 0.001f ); - m_detuneKnob->setInitValue( 0.0f ); - m_detuneKnob->move( 150, 187 ); - m_detuneKnob->setHintText( tr( "Detune:" ) + " ", "" ); - m_detuneKnob->hide(); - m_detuneKnobs.append( m_detuneKnob ); - m_detuneKnob->setWhatsThis( tr( -"The Detune knob modifies the pitch of the selected string. Settings less " -"than zero will cause the string to sound flat. Settings greater than zero " -"will cause the string to sound sharp." ) ); - - m_randomKnob = new knob( knobBright_26, this, tr( "Fuzziness" ), - instrument_track ); - m_randomKnob->setRange( 0.0f, 0.75f, 0.01f ); - m_randomKnob->setInitValue( 0.0f ); - m_randomKnob->move( 194, 187 ); - m_randomKnob->setHintText( tr( "Fuzziness:" ) + - " ", "" ); - m_randomKnob->hide(); - m_randomKnobs.append( m_randomKnob ); - m_randomKnob->setWhatsThis( tr( -"The Slap knob adds a bit of fuzz to the selected string which is most " -"apparent during the attack, though it can also be used to make the string " -"sound more 'metallic'.") ); + knob = new knobModel( 0.0f, -1.0f, 1.0f, 0.01f, this ); + m_panKnobs.append( knob ); - m_lengthKnob = new knob( knobBright_26, this, tr( "Length" ), - instrument_track ); - m_lengthKnob->setRange( 1, 16, 1 ); - m_lengthKnob->setInitValue( 1 ); - m_lengthKnob->move( 23, 193 ); - m_lengthKnob->setHintText( tr( "Length:" ) + - " ", "" ); - m_lengthKnob->hide(); - m_lengthKnobs.append( m_lengthKnob ); - m_lengthKnob->setWhatsThis( tr( -"The Length knob sets the length of the selected string. Longer strings " -"will both ring longer and sound brighter, however, they will also eat up " -"more CPU cycles." ) ); + knob = new knobModel( 0.0f, -0.1f, 0.1f, 0.001f, this ); + m_detuneKnobs.append( knob ); - m_impulse = new ledCheckBox( "", this, tr( "Impulse" ), - instrument_track ); - m_impulse->move( 23, 94 ); - m_impulse->setChecked( FALSE ); - toolTip::add( m_impulse, - tr( "Impulse or initial state" ) ); - m_impulse->hide(); - m_impulses.append( m_impulse ); - m_impulse->setWhatsThis( tr( -"The 'Imp' selector determines whether the waveform in the graph is to be " -"treated as an impulse imparted to the string by the pick or the initial " -"state of the string." ) ); + knob = new knobModel( 0.0f, 0.0f, 0.75f, 0.01f, this ); + m_randomKnobs.append( knob ); + + knob = new knobModel( 1, 1, 16, 1, this ); + m_lengthKnobs.append( knob ); + + led = new boolModel( FALSE, this ); + m_impulses.append( led ); + + led = new boolModel( harm==0, this ); + m_powerButtons.append( led ); + + harmonic = new nineButtonSelectorModel( 2, 0, 8, 1, this ); + m_harmonics.append( harmonic ); + + graphTmp = new graphModel( -1.0, 1.0, m_sampleLength, this ); + graphTmp->setWaveToSine(); + + m_graphs.append( graphTmp ); - m_harmonic = new nineButtonSelector( - PLUGIN_NAME::getIconPixmap( "button_-2_on" ), - PLUGIN_NAME::getIconPixmap( "button_-2_off" ), - PLUGIN_NAME::getIconPixmap( "button_-1_on" ), - PLUGIN_NAME::getIconPixmap( "button_-1_off" ), - PLUGIN_NAME::getIconPixmap( "button_f_on" ), - PLUGIN_NAME::getIconPixmap( "button_f_off" ), - PLUGIN_NAME::getIconPixmap( "button_2_on" ), - PLUGIN_NAME::getIconPixmap( "button_2_off" ), - PLUGIN_NAME::getIconPixmap( "button_3_on" ), - PLUGIN_NAME::getIconPixmap( "button_3_off" ), - PLUGIN_NAME::getIconPixmap( "button_4_on" ), - PLUGIN_NAME::getIconPixmap( "button_4_off" ), - PLUGIN_NAME::getIconPixmap( "button_5_on" ), - PLUGIN_NAME::getIconPixmap( "button_5_off" ), - PLUGIN_NAME::getIconPixmap( "button_6_on" ), - PLUGIN_NAME::getIconPixmap( "button_6_off" ), - PLUGIN_NAME::getIconPixmap( "button_7_on" ), - PLUGIN_NAME::getIconPixmap( "button_7_off" ), - 2, - 21, 127, - this, - NULL ); - m_harmonic->setAccessibleName( tr( "Octave" ) ); - m_harmonic->hide(); - m_harmonics.append( m_harmonic ); - m_harmonic->setWhatsThis( tr( -"The Octave selector is used to choose which harmonic of the note the " -"string will ring at. For example, '-2' means the string will ring two " -"octaves below the fundamental, 'F' means the string will ring at the " -"fundamental, and '6' means the string will ring six octaves above the " -"fundamental." ) ); } - - m_stringSelector = new nineButtonSelector( - PLUGIN_NAME::getIconPixmap( "button_1_on" ), - PLUGIN_NAME::getIconPixmap( "button_1_off" ), - PLUGIN_NAME::getIconPixmap( "button_2_on" ), - PLUGIN_NAME::getIconPixmap( "button_2_off" ), - PLUGIN_NAME::getIconPixmap( "button_3_on" ), - PLUGIN_NAME::getIconPixmap( "button_3_off" ), - PLUGIN_NAME::getIconPixmap( "button_4_on" ), - PLUGIN_NAME::getIconPixmap( "button_4_off" ), - PLUGIN_NAME::getIconPixmap( "button_5_on" ), - PLUGIN_NAME::getIconPixmap( "button_5_off" ), - PLUGIN_NAME::getIconPixmap( "button_6_on" ), - PLUGIN_NAME::getIconPixmap( "button_6_off" ), - PLUGIN_NAME::getIconPixmap( "button_7_on" ), - PLUGIN_NAME::getIconPixmap( "button_7_off" ), - PLUGIN_NAME::getIconPixmap( "button_8_on" ), - PLUGIN_NAME::getIconPixmap( "button_8_off" ), - PLUGIN_NAME::getIconPixmap( "button_9_on" ), - PLUGIN_NAME::getIconPixmap( "button_9_off" ), - 0, - 21, 39, - this, - NULL ); - m_stringSelector->setAccessibleName( tr( "String" ) ); - connect( m_stringSelector, SIGNAL( nineButtonSelection( Uint8 ) ), - this, SLOT( showString( Uint8 ) ) ); - m_stringSelector->setWhatsThis( tr( -"The String selector is used to choose which string the controls are " -"editting. A Vibed instrument can contain up to nine independently " -"vibrating strings. The LED in the lower right corner of the " -"waveform editor indicates whether the selected string is active." ) ); - - m_pickKnob = m_pickKnobs[0]; - m_pickupKnob = m_pickupKnobs[0]; - m_stiffnessKnob = m_stiffnessKnobs[0]; - m_volumeKnob = m_volumeKnobs[0]; - m_panKnob = m_panKnobs[0]; - m_detuneKnob = m_detuneKnobs[0]; - m_randomKnob = m_randomKnobs[0]; - m_lengthKnob = m_lengthKnobs[0]; - m_editor = m_editors[0]; - m_impulse = m_impulses[0]; - m_harmonic = m_harmonics[0]; - - m_editor->setOn( TRUE ); - showString( 0 ); - - setWhatsThis( tr( -"Vibed models up to nine independently vibrating strings. The 'String' " -"selector allows you to choose which string is being edited. The 'Imp' " "selector chooses whether the graph represents an impulse or the initial " -"state of the string. The 'Octave' selector chooses which harmonic the " -"string should vibrate at.\n\n" - -"The graph allows you to control the initial state or impulse used to set the " -"string in motion.\n\n" - -"The 'V' knob controls the volume. The 'S' knob controls the string's " -"stiffness. The 'P' knob controls the pick position. The 'PU' knob " -"controls the pickup position.\n\n" - -"'Pan' and 'Detune' hopefully don't need explanation. The 'Slap' knob " -"adds a bit of fuzz to the sound of the string.\n\n" - -"The 'Length' knob controls the length of the string.\n\n" - -"The LED in the lower right corner of the waveform editor determines " -"whether the string is active in the current instrument." ) ); - } @@ -333,6 +133,7 @@ vibed::~vibed() void vibed::saveSettings( QDomDocument & _doc, QDomElement & _this ) { + QString name; // Save plugin version @@ -341,9 +142,10 @@ void vibed::saveSettings( QDomDocument & _doc, for( Uint8 i = 0; i < 9; i++ ) { name = "active" + QString::number( i ); - _this.setAttribute( name, QString::number( - m_editors[i]->isOn() ) ); - if( m_editors[i]->isOn() ) + _this.setAttribute( name, QString::number( + m_powerButtons[i]->value() ) ); + + if( m_powerButtons[i]->value() ) { name = "volume" + QString::number( i ); m_volumeKnobs[i]->saveSettings( _doc, _this, name ); @@ -358,8 +160,7 @@ void vibed::saveSettings( QDomDocument & _doc, m_pickupKnobs[i]->saveSettings( _doc, _this, name ); name = "octave" + QString::number( i ); - _this.setAttribute( name, QString::number( - m_harmonics[i]->getSelected() ) ); + m_harmonics[i]->saveSettings( _doc, _this, name ); name = "length" + QString::number( i ); m_lengthKnobs[i]->saveSettings( _doc, _this, name ); @@ -375,13 +176,14 @@ void vibed::saveSettings( QDomDocument & _doc, name = "impulse" + QString::number( i ); m_impulses[i]->saveSettings( _doc, _this, name ); - + QString sampleString; - base64::encode( - (const char *)m_editors[i]->getValues(), - 128 * sizeof(float), sampleString ); + base64::encode( + (const char *)m_graphs[i]->samples(), + m_sampleLength * sizeof(float), + sampleString ); name = "graph" + QString::number( i ); - _this.setAttribute( name, sampleString ); + _this.setAttribute( name, sampleString ); } } @@ -389,17 +191,17 @@ void vibed::saveSettings( QDomDocument & _doc, - void vibed::loadSettings( const QDomElement & _this ) { + QString name; - + for( Uint8 i = 0; i < 9; i++ ) { name = "active" + QString::number( i ); - m_editors[i]->setOn( _this.attribute( name ).toInt() ); + m_powerButtons[i]->setValue( _this.attribute( name ).toInt() ); - if( m_editors[i]->isOn() && + if( m_powerButtons[i]->value() && _this.hasAttribute( "volume" + QString::number( i ) ) ) { name = "volume" + QString::number( i ); @@ -415,8 +217,7 @@ void vibed::loadSettings( const QDomElement & _this ) m_pickupKnobs[i]->loadSettings( _this, name ); name = "octave" + QString::number( i ); - m_harmonics[i]->setSelected( - _this.attribute( name ).toInt() ); + m_harmonics[i]->loadSettings( _this, name ); name = "length" + QString::number( i ); m_lengthKnobs[i]->loadSettings( _this, name ); @@ -437,11 +238,13 @@ void vibed::loadSettings( const QDomElement & _this ) float * shp = 0; base64::decode( _this.attribute( "graph" + QString::number( i ) ), - (char * *) &shp, &size ); + (char * *) &shp, + &size ); // TODO: check whether size == 128 * sizeof( float ), // otherwise me might and up in a segfault - m_editors[i]->setValues( shp ); + m_graphs[i]->setSamples( shp ); delete[] shp; + // TODO: do one of the following to avoid // "uninitialized" wave-shape-buttongroup @@ -452,7 +255,7 @@ void vibed::loadSettings( const QDomElement & _this ) } } - update(); +// update(); } @@ -471,25 +274,25 @@ void vibed::playNote( notePlayHandle * _n, bool ) if ( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) { _n->m_pluginData = new stringContainer( _n->frequency(), - engine::getMixer()->sampleRate(), - m_sampleLength ); + engine::getMixer()->sampleRate(), + m_sampleLength ); for( Uint8 i = 0; i < 9; ++i ) { - if( m_editors[i]->isOn() ) + if( m_powerButtons[i]->value() ) { static_cast( _n->m_pluginData )->addString( - m_harmonics[i]->getSelected(), + m_harmonics[i]->value(), m_pickKnobs[i]->value(), m_pickupKnobs[i]->value(), - m_editors[i]->getValues(), + m_graphs[i]->samples(), m_randomKnobs[i]->value(), m_stiffnessKnobs[i]->value(), m_detuneKnobs[i]->value(), static_cast( m_lengthKnobs[i]->value() ), - m_impulses[i]->isChecked(), + m_impulses[i]->value(), i ); } } @@ -497,8 +300,8 @@ void vibed::playNote( notePlayHandle * _n, bool ) const fpp_t frames = _n->framesLeftForCurrentPeriod(); stringContainer * ps = static_cast( - _n->m_pluginData ); - + _n->m_pluginData ); + sampleFrame * buf = new sampleFrame[frames]; for( fpp_t i = 0; i < frames; ++i ) @@ -538,77 +341,421 @@ void vibed::deleteNotePluginData( notePlayHandle * _n ) } - - -void vibed::showString( Uint8 _string ) +pluginView * vibed::instantiateView( QWidget * _parent ) { - m_pickKnob->hide(); - m_pickupKnob->hide(); - m_stiffnessKnob->hide(); - m_volumeKnob->hide(); - m_panKnob->hide(); - m_detuneKnob->hide(); - m_randomKnob->hide(); - m_lengthKnob->hide(); - m_editor->hide(); - m_impulse->hide(); - m_harmonic->hide(); - - // TODO: first assign, then show - avoids that we have to index vector - // (or list or whatever) twice - // something like - // ( m_editor = m_editors[_string] )->show() - // would be even better ;-) - m_editors[_string]->show(); - m_volumeKnobs[_string]->show(); - m_stiffnessKnobs[_string]->show(); - m_pickKnobs[_string]->show(); - m_pickupKnobs[_string]->show(); - m_panKnobs[_string]->show(); - m_detuneKnobs[_string]->show(); - m_randomKnobs[_string]->show(); - m_lengthKnobs[_string]->show(); - m_impulses[_string]->show(); - m_impulses[_string]->update(); - m_harmonics[_string]->show(); - - m_pickKnob = m_pickKnobs[_string]; - m_pickupKnob = m_pickupKnobs[_string]; - m_stiffnessKnob = m_stiffnessKnobs[_string]; - m_volumeKnob = m_volumeKnobs[_string]; - m_panKnob = m_panKnobs[_string]; - m_detuneKnob = m_detuneKnobs[_string]; - m_randomKnob = m_randomKnobs[_string]; - m_lengthKnob = m_lengthKnobs[_string]; - m_editor = m_editors[_string]; - m_impulse = m_impulses[_string]; - m_harmonic = m_harmonics[_string]; + return( new vibedView( this, _parent ) ); } -void vibed::contextMenuEvent( QContextMenuEvent * ) +vibedView::vibedView( instrument * _instrument, + QWidget * _parent ) : + instrumentView( _instrument, _parent ) { + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( + "artwork" ) ); + setPalette( pal ); + + m_volumeKnob = new volumeKnob( knobBright_26, this, tr( "Volume" ) ); + m_volumeKnob->move( 103, 142 ); + m_volumeKnob->setHintText( tr( "Volume:" ) + " ", "" ); + m_volumeKnob->setWhatsThis( tr( "The 'V' knob sets the volume " + "of the selected string." ) ); + + m_stiffnessKnob = new knob( knobBright_26, this, + tr( "String stiffness" ) ); + m_stiffnessKnob->move( 129, 142 ); + m_stiffnessKnob->setHintText( tr( "String stiffness:" ) + + " ", "" ); + m_stiffnessKnob->setWhatsThis( tr( +"The 'S' knob sets the stiffness of the selected string. The stiffness " +"of the string affects how long the string will ring out. The lower " +"the setting, the longer the string will ring." ) ); + + + m_pickKnob = new knob( knobBright_26, this, + tr( "Pick position" ) ); + m_pickKnob->move( 153, 142 ); + m_pickKnob->setHintText( tr( "Pick position:" ) + " ", "" ); + m_pickKnob->setWhatsThis( tr( +"The 'P' knob sets the position where the selected string will be 'picked'. " +"The lower the setting the closer the pick is to the bridge." ) ); + + m_pickupKnob = new knob( knobBright_26, this, + tr( "Pickup position" ) ); + m_pickupKnob->move( 177, 142 ); + m_pickupKnob->setHintText( tr( "Pickup position:" ) + + " ", "" ); + m_pickupKnob->setWhatsThis( tr( +"The 'PU' knob sets the position where the vibrations will be monitored " +"for the selected string. The lower the setting, the closer the " +"pickup is to the bridge." ) ); + + m_panKnob = new knob( knobBright_26, this, tr( "Pan" ) ); + m_panKnob->move( 105, 187 ); + m_panKnob->setHintText( tr( "Pan:" ) + " ", "" ); + m_panKnob->setWhatsThis( tr( +"The Pan knob determines the location of the selected string in the stereo " +"field." ) ); + + m_detuneKnob = new knob( knobBright_26, this, tr( "Detune" ) ); + m_detuneKnob->move( 150, 187 ); + m_detuneKnob->setHintText( tr( "Detune:" ) + " ", "" ); + m_detuneKnob->setWhatsThis( tr( +"The Detune knob modifies the pitch of the selected string. Settings less " +"than zero will cause the string to sound flat. Settings greater than zero " +"will cause the string to sound sharp." ) ); + + m_randomKnob = new knob( knobBright_26, this, tr( "Fuzziness" ) ); + m_randomKnob->move( 194, 187 ); + m_randomKnob->setHintText( tr( "Fuzziness:" ) + + " ", "" ); + m_randomKnob->setWhatsThis( tr( +"The Slap knob adds a bit of fuzz to the selected string which is most " +"apparent during the attack, though it can also be used to make the string " +"sound more 'metallic'.") ); + + m_lengthKnob = new knob( knobBright_26, this, tr( "Length" ) ); + m_lengthKnob->move( 23, 193 ); + m_lengthKnob->setHintText( tr( "Length:" ) + + " ", "" ); + m_lengthKnob->setWhatsThis( tr( +"The Length knob sets the length of the selected string. Longer strings " +"will both ring longer and sound brighter, however, they will also eat up " +"more CPU cycles." ) ); + + m_impulse = new ledCheckBox( "", this, tr( "Impulse" ) ); + m_impulse->move( 23, 94 ); + toolTip::add( m_impulse, + tr( "Impulse or initial state" ) ); + m_impulse->setWhatsThis( tr( +"The 'Imp' selector determines whether the waveform in the graph is to be " +"treated as an impulse imparted to the string by the pick or the initial " +"state of the string." ) ); + + m_harmonic = new nineButtonSelector( + PLUGIN_NAME::getIconPixmap( "button_-2_on" ), + PLUGIN_NAME::getIconPixmap( "button_-2_off" ), + PLUGIN_NAME::getIconPixmap( "button_-1_on" ), + PLUGIN_NAME::getIconPixmap( "button_-1_off" ), + PLUGIN_NAME::getIconPixmap( "button_f_on" ), + PLUGIN_NAME::getIconPixmap( "button_f_off" ), + PLUGIN_NAME::getIconPixmap( "button_2_on" ), + PLUGIN_NAME::getIconPixmap( "button_2_off" ), + PLUGIN_NAME::getIconPixmap( "button_3_on" ), + PLUGIN_NAME::getIconPixmap( "button_3_off" ), + PLUGIN_NAME::getIconPixmap( "button_4_on" ), + PLUGIN_NAME::getIconPixmap( "button_4_off" ), + PLUGIN_NAME::getIconPixmap( "button_5_on" ), + PLUGIN_NAME::getIconPixmap( "button_5_off" ), + PLUGIN_NAME::getIconPixmap( "button_6_on" ), + PLUGIN_NAME::getIconPixmap( "button_6_off" ), + PLUGIN_NAME::getIconPixmap( "button_7_on" ), + PLUGIN_NAME::getIconPixmap( "button_7_off" ), + 2, + 21, 127, + this ); + + m_harmonic->setAccessibleName( tr( "Octave" ) ); + m_harmonic->setWhatsThis( tr( +"The Octave selector is used to choose which harmonic of the note the " +"string will ring at. For example, '-2' means the string will ring two " +"octaves below the fundamental, 'F' means the string will ring at the " +"fundamental, and '6' means the string will ring six octaves above the " +"fundamental." ) ); + + + m_stringSelector = new nineButtonSelector( + PLUGIN_NAME::getIconPixmap( "button_1_on" ), + PLUGIN_NAME::getIconPixmap( "button_1_off" ), + PLUGIN_NAME::getIconPixmap( "button_2_on" ), + PLUGIN_NAME::getIconPixmap( "button_2_off" ), + PLUGIN_NAME::getIconPixmap( "button_3_on" ), + PLUGIN_NAME::getIconPixmap( "button_3_off" ), + PLUGIN_NAME::getIconPixmap( "button_4_on" ), + PLUGIN_NAME::getIconPixmap( "button_4_off" ), + PLUGIN_NAME::getIconPixmap( "button_5_on" ), + PLUGIN_NAME::getIconPixmap( "button_5_off" ), + PLUGIN_NAME::getIconPixmap( "button_6_on" ), + PLUGIN_NAME::getIconPixmap( "button_6_off" ), + PLUGIN_NAME::getIconPixmap( "button_7_on" ), + PLUGIN_NAME::getIconPixmap( "button_7_off" ), + PLUGIN_NAME::getIconPixmap( "button_8_on" ), + PLUGIN_NAME::getIconPixmap( "button_8_off" ), + PLUGIN_NAME::getIconPixmap( "button_9_on" ), + PLUGIN_NAME::getIconPixmap( "button_9_off" ), + 0, + 21, 39, + this); + + m_graph = new graph( this ); + m_graph->setAccessibleName( tr( "Impulse Editor" ) ); + m_graph->setForeground( PLUGIN_NAME::getIconPixmap( "wavegraph4" ) ); + m_graph->move( 76, 21 ); + m_graph->resize(132, 104); + + m_graph->setWhatsThis( tr( +"The waveform editor provides control over the initial state or impulse " +"that is used to start the string vibrating. The buttons to the right of " +"the graph will initialize the waveform to the selected type. The '?' " +"button will load a waveform from a file--only the first 128 samples " +"will be loaded.\n\n" + +"The waveform can also be drawn in the graph.\n\n" + +"The 'S' button will smooth the waveform.\n\n" + +"The 'N' button will normalize the waveform.") ); + + + setWhatsThis( tr( +"Vibed models up to nine independently vibrating strings. The 'String' " +"selector allows you to choose which string is being edited. The 'Imp' " "selector chooses whether the graph represents an impulse or the initial " +"state of the string. The 'Octave' selector chooses which harmonic the " +"string should vibrate at.\n\n" + +"The graph allows you to control the initial state or impulse used to set the " +"string in motion.\n\n" + +"The 'V' knob controls the volume. The 'S' knob controls the string's " +"stiffness. The 'P' knob controls the pick position. The 'PU' knob " +"controls the pickup position.\n\n" + +"'Pan' and 'Detune' hopefully don't need explanation. The 'Slap' knob " +"adds a bit of fuzz to the sound of the string.\n\n" + +"The 'Length' knob controls the length of the string.\n\n" + +"The LED in the lower right corner of the waveform editor determines " +"whether the string is active in the current instrument." ) ); + + + m_power = new ledCheckBox( "", this, tr( "Enable waveform" ) ); + m_power->move( 212, 130 ); + toolTip::add( m_power, + tr( "Click here to enable/disable waveform." ) ); + + + // String selector is not a part of the model + m_stringSelector->setAccessibleName( tr( "String" ) ); + m_stringSelector->setWhatsThis( tr( +"The String selector is used to choose which string the controls are " +"editting. A Vibed instrument can contain up to nine independently " +"vibrating strings. The LED in the lower right corner of the " +"waveform editor indicates whether the selected string is active." ) ); + + connect( m_stringSelector, SIGNAL( nineButtonSelection( Uint8 ) ), + this, SLOT( showString( Uint8 ) ) ); + + showString( 0 ); + // Get current graph-model + graphModel * gModel = m_graph->model(); + + m_sinWaveBtn = new pixmapButton( this, tr( "Sine wave" ) ); + m_sinWaveBtn->move( 212, 24 ); + m_sinWaveBtn->setActiveGraphic( embed::getIconPixmap( + "sin_wave_active" ) ); + m_sinWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "sin_wave_inactive" ) ); + toolTip::add( m_sinWaveBtn, + tr( "Click here if you want a sine-wave for " + "current oscillator." ) ); + connect( m_sinWaveBtn, SIGNAL (clicked ( void ) ), + this, SLOT ( sinWaveClicked( void ) ) ); + + + m_triangleWaveBtn = new pixmapButton( this, tr( "Triangle wave" ) ); + m_triangleWaveBtn->move( 212, 41 ); + m_triangleWaveBtn->setActiveGraphic( + embed::getIconPixmap( "triangle_wave_active" ) ); + m_triangleWaveBtn->setInactiveGraphic( + embed::getIconPixmap( "triangle_wave_inactive" ) ); + toolTip::add( m_triangleWaveBtn, + tr( "Click here if you want a triangle-wave " + "for current oscillator." ) ); + connect( m_triangleWaveBtn, SIGNAL ( clicked ( void ) ), + this, SLOT ( triangleWaveClicked( ) ) ); + + + m_sawWaveBtn = new pixmapButton( this, tr( "Saw wave" ) ); + m_sawWaveBtn->move( 212, 58 ); + m_sawWaveBtn->setActiveGraphic( embed::getIconPixmap( + "saw_wave_active" ) ); + m_sawWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "saw_wave_inactive" ) ); + toolTip::add( m_sawWaveBtn, + tr( "Click here if you want a saw-wave for " + "current oscillator." ) ); + connect( m_sawWaveBtn, SIGNAL (clicked ( void ) ), + this, SLOT ( sawWaveClicked( void ) ) ); + + + m_sqrWaveBtn = new pixmapButton( this, tr( "Square wave" ) ); + m_sqrWaveBtn->move( 212, 75 ); + m_sqrWaveBtn->setActiveGraphic( embed::getIconPixmap( + "square_wave_active" ) ); + m_sqrWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "square_wave_inactive" ) ); + toolTip::add( m_sqrWaveBtn, + tr( "Click here if you want a square-wave for " + "current oscillator." ) ); + connect( m_sqrWaveBtn, SIGNAL ( clicked ( void ) ), + this, SLOT ( sqrWaveClicked( void ) ) ); + + + m_whiteNoiseWaveBtn = new pixmapButton( this, tr( "White noise wave" ) ); + m_whiteNoiseWaveBtn->move( 212, 92 ); + m_whiteNoiseWaveBtn->setActiveGraphic( + embed::getIconPixmap( "white_noise_wave_active" ) ); + m_whiteNoiseWaveBtn->setInactiveGraphic( + embed::getIconPixmap( "white_noise_wave_inactive" ) ); + toolTip::add( m_whiteNoiseWaveBtn, + tr( "Click here if you want a white-noise for " + "current oscillator." ) ); + connect( m_whiteNoiseWaveBtn, SIGNAL ( clicked ( void ) ), + this, SLOT ( noiseWaveClicked( void ) ) ); + + + m_usrWaveBtn = new pixmapButton( this, tr( "User defined wave" ) ); + m_usrWaveBtn->move( 212, 109 ); + m_usrWaveBtn->setActiveGraphic( embed::getIconPixmap( + "usr_wave_active" ) ); + m_usrWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "usr_wave_inactive" ) ); + toolTip::add( m_usrWaveBtn, + tr( "Click here if you want a user-defined " + "wave-shape for current oscillator." ) ); + connect( m_usrWaveBtn, SIGNAL ( clicked ( void ) ), + this, SLOT ( usrWaveClicked( void ) ) ); + + + m_smoothBtn = new pixmapButton( this, tr( "Smooth" ) ); + m_smoothBtn->move( 79, 129 ); + m_smoothBtn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "smooth_active" ) ); + m_smoothBtn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "smooth_inactive" ) ); + m_smoothBtn->setChecked( FALSE ); + toolTip::add( m_smoothBtn, + tr( "Click here to smooth waveform." ) ); + connect( m_smoothBtn, SIGNAL ( clicked ( void ) ), + this, SLOT ( smoothClicked( void ) ) ); + + m_normalizeBtn = new pixmapButton( this, tr( "Normalize" ) ); + m_normalizeBtn->move( 96, 129 ); + m_normalizeBtn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "normalize_active" ) ); + m_normalizeBtn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "normalize_inactive" ) ); + m_normalizeBtn->setChecked( FALSE ); + toolTip::add( m_normalizeBtn, + tr( "Click here to normalize waveform." ) ); + + connect( m_normalizeBtn, SIGNAL ( clicked ( void ) ), + this, SLOT ( normalizeClicked( void ) ) ); + +} + + +void vibedView::modelChanged( void ) +{ + showString( 0 ); +} + + +void vibedView::showString( Uint8 _string ) +{ + vibed * v = castModel(); + + m_pickKnob->setModel( v->m_pickKnobs[_string] ); + m_pickupKnob->setModel( v->m_pickupKnobs[_string] ); + m_stiffnessKnob->setModel( v->m_stiffnessKnobs[_string] ); + m_volumeKnob->setModel( v->m_volumeKnobs[_string] ); + m_panKnob->setModel( v->m_panKnobs[_string] ); + m_detuneKnob->setModel( v->m_detuneKnobs[_string] ); + m_randomKnob->setModel( v->m_randomKnobs[_string] ); + m_lengthKnob->setModel( v->m_lengthKnobs[_string] ); + m_graph->setModel( v->m_graphs[_string] ); + m_impulse->setModel( v->m_impulses[_string] ); + m_harmonic->setModel( v->m_harmonics[_string] ); + m_power->setModel( v->m_powerButtons[_string] ); + +} + + +void vibedView::sinWaveClicked( void ) +{ + m_graph->model()->setWaveToSine(); + engine::getSongEditor()->setModified(); +} + +void vibedView::triangleWaveClicked( void ) +{ + m_graph->model()->setWaveToTriangle(); + engine::getSongEditor()->setModified(); +} + +void vibedView::sawWaveClicked( void ) +{ + m_graph->model()->setWaveToSaw(); + engine::getSongEditor()->setModified(); +} + +void vibedView::sqrWaveClicked( void ) +{ + m_graph->model()->setWaveToSquare(); + engine::getSongEditor()->setModified(); +} + +void vibedView::noiseWaveClicked( void ) +{ + m_graph->model()->setWaveToNoise(); + engine::getSongEditor()->setModified(); +} + +void vibedView::usrWaveClicked( void ) +{ + // TODO: load file + //m_graph->model()->setWaveToUser(); + //engine::getSongEditor()->setModified(); +} + +void vibedView::smoothClicked( void ) +{ + m_graph->model()->smooth(); + engine::getSongEditor()->setModified(); +} + +void vibedView::normalizeClicked( void ) +{ + m_graph->model()->normalize(); + engine::getSongEditor()->setModified(); +} + + + +void vibedView::contextMenuEvent( QContextMenuEvent * ) +{ + captionMenu contextMenu( publicName() ); contextMenu.addAction( embed::getIconPixmap( "help" ), tr( "&Help" ), - this, SLOT( displayHelp() ) ); + this, SLOT( displayHelp() ) ); contextMenu.exec( QCursor::pos() ); + } - - -void vibed::displayHelp( void ) +void vibedView::displayHelp( void ) { QWhatsThis::showText( mapToGlobal( rect().bottomRight() ), - whatsThis() ); + whatsThis() ); } - - extern "C" { diff --git a/plugins/vibed/vibed.h b/plugins/vibed/vibed.h index 4a14c819f..6423384be 100644 --- a/plugins/vibed/vibed.h +++ b/plugins/vibed/vibed.h @@ -24,56 +24,91 @@ #define _VIBED_STRINGS_H #include "instrument.h" +#include "instrument_view.h" #include "sample_buffer.h" #include "graph.h" +#include "knob.h" #include "pixmap_button.h" #include "led_checkbox.h" #include "impulse_editor.h" #include "lcd_spinbox.h" +#include "volume_knob.h" #include "nine_button_selector.h" -class knob; +class vibedView; class notePlayHandle; -class volumeKnob; - class vibed : public instrument { Q_OBJECT - + public: vibed( instrumentTrack * _channel_track ); virtual ~vibed(); virtual void FASTCALL playNote( notePlayHandle * _n, - bool _try_parallelizing ); + bool _try_parallelizing ); virtual void FASTCALL deleteNotePluginData( notePlayHandle * _n ); virtual void FASTCALL saveSettings( QDomDocument & _doc, - QDomElement & _parent ); + QDomElement & _parent ); virtual void FASTCALL loadSettings( const QDomElement & _this ); virtual QString nodeName( void ) const; + virtual pluginView * instantiateView( QWidget * _parent ); + + +private: + QList m_pickKnobs; + QList m_pickupKnobs; + QList m_stiffnessKnobs; + QList m_volumeKnobs; + QList m_panKnobs; + QList m_detuneKnobs; + QList m_randomKnobs; + QList m_lengthKnobs; + QList m_powerButtons; + QList m_graphs; + QList m_impulses; + QList m_harmonics; + + static const int m_sampleLength = 128; + + friend class vibedView; +} ; + + + +class vibedView : public instrumentView +{ + Q_OBJECT +public: + vibedView( instrument * _instrument, + QWidget * _parent ); + virtual ~vibedView() {}; + public slots: void showString( Uint8 _string ); void contextMenuEvent( QContextMenuEvent * ); void displayHelp( void ); - + +protected slots: + void sinWaveClicked( void ); + void triangleWaveClicked( void ); + void sawWaveClicked( void ); + void sqrWaveClicked( void ); + void noiseWaveClicked( void ); + void usrWaveClicked( void ); + void smoothClicked( void ); + void normalizeClicked( void ); + private: - QList m_pickKnobs; - QList m_pickupKnobs; - QList m_stiffnessKnobs; - QList m_volumeKnobs; - QList m_panKnobs; - QList m_detuneKnobs; - QList m_randomKnobs; - QList m_lengthKnobs; - QList m_editors; - QList m_impulses; - QList m_harmonics; - + virtual void modelChanged( void ); + + + // String-related knob * m_pickKnob; knob * m_pickupKnob; knob * m_stiffnessKnob; @@ -82,15 +117,25 @@ private: knob * m_detuneKnob; knob * m_randomKnob; knob * m_lengthKnob; - impulseEditor * m_editor; - - nineButtonSelector * m_stringSelector; + graph * m_graph; nineButtonSelector * m_harmonic; - ledCheckBox * m_impulse; - - int m_sampleLength; -} ; + ledCheckBox * m_power; + // Not in model + nineButtonSelector * m_stringSelector; + pixmapButton * m_smoothBtn; + pixmapButton * m_normalizeBtn; + + // From impulse editor + pixmapButton * m_sinWaveBtn; + pixmapButton * m_triangleWaveBtn; + pixmapButton * m_sqrWaveBtn; + pixmapButton * m_sawWaveBtn; + pixmapButton * m_whiteNoiseWaveBtn; + pixmapButton * m_usrWaveBtn; + + +}; #endif diff --git a/src/core/piano_roll.cpp b/src/core/piano_roll.cpp index 727fffee0..6aadf3eda 100644 --- a/src/core/piano_roll.cpp +++ b/src/core/piano_roll.cpp @@ -871,9 +871,10 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) x -= WHITE_KEY_WIDTH; // get tact-64th in which the user clicked - int pos_tact_64th = x * 64 / m_ppt + + int pos_tact_64th = (x-1) * 64 / m_ppt + m_currentPosition; + // get note-vector of current pattern const noteVector & notes = m_pattern->notes(); @@ -939,7 +940,10 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) pattern::MelodyPattern ); // then set new note - midiTime note_pos( pos_tact_64th ); + // +32 to quanitize the note correctly when placing notes with + // the mouse. We do this here instead of in note.quantized + // because live notes should still be quantized at the half. + midiTime note_pos( pos_tact_64th - (quantization() / 2) ); midiTime note_len( newNoteLen() ); note new_note( note_len, note_pos, diff --git a/src/widgets/graph.cpp b/src/widgets/graph.cpp new file mode 100644 index 000000000..eb44ad10c --- /dev/null +++ b/src/widgets/graph.cpp @@ -0,0 +1,478 @@ +/* + * graph.cpp - a QT widget for displaying and manipulating waveforms + * + * Copyright (c) 2006-2007 Andreas Brandmaier + * 2008 Paul Giblock + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include +#include +#include + +#include "graph.h" +#include "string_pair_drag.h" +#include "sample_buffer.h" +#include "oscillator.h" +//#include +//#include + +using namespace std; + + + +graph::graph( QWidget * _parent ) : + QWidget( _parent ), + /* TODO: size, background? */ + modelView( new graphModel( -1.0, 1.0, 128, NULL, NULL, TRUE ) ) +{ + m_mouseDown = false; + + resize( 132, 104 ); + setAcceptDrops( TRUE ); + + graphModel * gModel = castModel(); + + QObject::connect( gModel, SIGNAL( samplesChanged( int, int ) ), + this, SLOT( updateGraph( int, int ) ) ); +} + + +graph::~graph() +{ +} + + + +void graph::setForeground( const QPixmap &_pixmap ) +{ + m_foreground = _pixmap; +} + + + +/* +void graph::loadSampleFromFile( const QString & _filename ) +{ + + int i; + + // zero sample_shape + for( i = 0; i < sampleLength; i++ ) + { + samplePointer[i] = 0; + } + + // load user shape + sampleBuffer buffer( _filename ); + + // copy buffer data + int trimSize = fmin( size(), static_cast(buffer.frames()) ); + + + for( i = 0; i < trimSize; i++ ) + { + samplePointer[i] = (float)*buffer.data()[i]; + } +} +*/ + + + +void graph::mouseMoveEvent ( QMouseEvent * _me ) +{ + // get position + int x = _me->x(); + int y = _me->y(); + + static bool skip = false; + + if( skip ) + { + skip = false; + return; + } + + // avoid mouse leaps + int diff = x - m_lastCursorX; + + if( diff >= 1 ) + { + x = min( width() - 3, m_lastCursorX + 1); + } + else if( diff <= 1 ) + { + x = max( 2, m_lastCursorX - 1 ); + } + else + { + x = m_lastCursorX; + } + + y = max( 2, min( y, height()-3 ) ); + + changeSampleAt( x, y ); + + // update mouse + m_lastCursorX = x; + + QPoint pt = mapToGlobal( QPoint( x, y ) ); + + QCursor::setPos( pt.x(), pt.y() ); + + skip = true; +} + + + +void graph::mousePressEvent( QMouseEvent * _me ) +{ + if( _me->button() == Qt::LeftButton ) + { + // toggle mouse state + m_mouseDown = true; + + // get position + int x = _me->x(); + int y = _me->y(); + + changeSampleAt( x, y ); + + // toggle mouse state + m_mouseDown = true; + setCursor( Qt::BlankCursor ); + m_lastCursorX = x; + } +} + + + +void graph::changeSampleAt(int _x, int _y) +{ + float minVal = model()->minValue(); + float maxVal = model()->maxValue(); + + if ( width() <= 4 ) + { + return; + } + + float xscale = static_cast( model()->length() ) / + ( width()-4 ); + + // consider border of background image + _x -= 2; + _y -= 2; + + // subtract max from min because Qt's Y-axis is backwards + float range = minVal - maxVal; + float val = ( _y*range/( height()-4 ) ) + maxVal; + + model()->setSampleAt( _x*xscale, val ); +} + + + +void graph::mouseReleaseEvent( QMouseEvent * _me ) +{ + if( _me->button() == Qt::LeftButton ) + { + // toggle mouse state + m_mouseDown = false; + setCursor( Qt::ArrowCursor ); + update(); + } +} + + + +void graph::paintEvent( QPaintEvent * ) +{ + QPainter p( this ); + + p.setPen( QPen(QColor( 0xFF, 0xAA, 0x00 ), 1) ); + + QVector * samps = &(model()->m_samples); + int length = model()->length(); + int maxVal = model()->maxValue(); + + float xscale = ( width()-4 ) / length; + float yscale = (float)( height()-4 ) / ( model()->minValue() - maxVal ); + + // Max index, more useful below + length--; + + p.setRenderHints( QPainter::Antialiasing, TRUE ); + for( int i=0; i < length; i++ ) + { + // Needs to be rewritten + p.drawLine(2+static_cast(i*xscale), + 2+static_cast( ( (*samps)[i] - maxVal ) * yscale ), + 2+static_cast((i+1)*xscale), + 2+static_cast( ( (*samps)[i+1] - maxVal ) * yscale ) + ); + } + + // Draw last segment flat + p.drawLine(2+static_cast(length*xscale), + 2+static_cast( ( (*samps)[length] - maxVal ) * yscale ), + width()-2, + 2+static_cast( ( (*samps)[length] - maxVal ) * yscale ) ); + + p.setRenderHints( QPainter::Antialiasing, FALSE ); + + // draw Pointer + if( m_mouseDown ) + { + QPoint cursor = mapFromGlobal( QCursor::pos() ); + p.setPen( QColor( 0xAA, 0xFF, 0x00 ) ); + p.drawLine( 2, cursor.y(), width()-2, cursor.y() ); + p.drawLine( cursor.x(), 2, cursor.x(), height()-2 ); + } + p.drawPixmap( 0, 0, m_foreground ); +} + + + +void graph::dropEvent( QDropEvent * _de ) +{ + QString type = stringPairDrag::decodeKey( _de ); + QString value = stringPairDrag::decodeValue( _de ); + + if( type == "samplefile" ) + { + // TODO: call setWaveToUser + // loadSampleFromFile( value ); + _de->accept(); + } +} + +void graph::dragEnterEvent( QDragEnterEvent * _dee ) +{ + if( stringPairDrag::processDragEnterEvent( _dee, + QString( "samplefile" ) ) == FALSE ) + { + _dee->ignore(); + } +} + + + +void graph::modelChanged( void ) +{ + graphModel * gModel = castModel(); + + QObject::connect( gModel, SIGNAL( samplesChanged( Uint32, Uint32 ) ), + this, SLOT( updateGraph( Uint32, Uint32 ) ) ); +} + + + +void graph::updateGraph( Uint32 _startPos, Uint32 _endPos ) +{ + // Can optimize by only drawing changed position + update(); +} + + + +graphModel::graphModel( float _min, float _max, Uint32 _length, + ::model * _parent, track * _track, + bool _default_constructed ) : + model( _parent, _default_constructed ), + m_minValue( _min ), + m_maxValue( _max ), + m_samples( _length ) +{ +} + + + +graphModel::~graphModel() +{ +} + + + +void graphModel::setRange( float _min, float _max ) +{ + if( _min != m_minValue || _max != m_maxValue ) + { + m_minValue = _min; + m_maxValue = _max; + + if( !m_samples.isEmpty() ) + { + // Trim existing values + for( int i=0; i < length(); i++ ) + { + m_samples[i] = fmaxf( _min, fminf( m_samples[i], _max ) ); + } + } + + emit rangeChanged(); + } +} + + + +void graphModel::setLength( Uint32 _length ) +{ + if( _length != length() ) + { + m_samples.resize( _length ); + emit lengthChanged(); + } +} + + + +void graphModel::setSampleAt( Uint32 _x, float _val ) +{ + // boundary check + if ( _x >= 0 && _x < length() && + _val >= minValue() && _val < maxValue() ) + { + + // change sample shape + m_samples[_x] = _val; + emit samplesChanged( _x, _x ); + } +} + + + +void graphModel::setSamples( const float * _samples ) +{ + qCopy( _samples, _samples + length(), m_samples.begin()); + + emit samplesChanged( 0, length()-1 ); +} + + + +void graphModel::setWaveToSine( void ) +{ + for( Uint32 i = 0; i < length(); i++ ) + { + m_samples[i] = oscillator::sinSample( + i / static_cast( length() ) ); + } + + emit samplesChanged( 0, length() - 1 ); +}; + + + +void graphModel::setWaveToTriangle( void ) +{ + for( Uint32 i = 0; i < length(); i++ ) + { + m_samples[i] = oscillator::triangleSample( + i / static_cast( length() ) ); + } + + emit samplesChanged( 0, length() - 1 ); +}; + + + +void graphModel::setWaveToSaw( void ) +{ + for( Uint32 i = 0; i < length(); i++ ) + { + m_samples[i] = oscillator::sawSample( + i / static_cast( length() ) ); + } + + emit samplesChanged( 0, length() - 1 ); +}; + + + +void graphModel::setWaveToSquare( void ) +{ + for( Uint32 i = 0; i < length(); i++ ) + { + m_samples[i] = oscillator::squareSample( + i / static_cast( length() ) ); + } + + emit samplesChanged( 0, length() - 1 ); +}; + + + +void graphModel::setWaveToNoise( void ) +{ + for( Uint32 i = 0; i < length(); i++ ) + { + m_samples[i] = oscillator::noiseSample( + i / static_cast( length() ) ); + } + + emit samplesChanged( 0, length() - 1 ); +}; + + + +void graphModel::smooth( void ) +{ + // store values in temporary array + QVector temp = m_samples; + + // Smoothing + m_samples[0] = ( temp[0] + temp[length()-1] ) * 0.5f; + for ( Uint32 i=1; i < length(); i++ ) + { + m_samples[i] = ( temp[i-1] + temp[i] ) * 0.5f; + } + + emit samplesChanged(0, length()-1); +} + + + +void graphModel::normalize( void ) +{ + float max = 0.0001f; + for( Uint32 i = 0; i < length(); i++ ) + { + if( fabsf(m_samples[i]) > max && m_samples[i] != 0.0f ) + { + max = fabs( m_samples[i] ); + } + } + + for( Uint32 i = 0; i < length(); i++ ) + { + m_samples[i] /= max; + } + + if( max != 1.0f ) { + emit samplesChanged( 0, length()-1 ); + } +} + + + + +#include "graph.moc" From 98fc05e1898fecf9e9726b7ef1af08bf6ca0da0c Mon Sep 17 00:00:00 2001 From: Paul Giblock Date: Fri, 22 Feb 2008 08:33:52 +0000 Subject: [PATCH 60/87] steroEnhancer, Vibed, and separated Graph widget git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@700 0778d3d1-df1d-0410-868b-ea421aaaa00d --- plugins/vibed/vibed.cpp | 17 +++++++++-------- plugins/vibed/vibed.h | 2 -- src/widgets/graph.cpp | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/plugins/vibed/vibed.cpp b/plugins/vibed/vibed.cpp index 8d2667ab3..bea57d872 100644 --- a/plugins/vibed/vibed.cpp +++ b/plugins/vibed/vibed.cpp @@ -41,6 +41,7 @@ #include "templates.h" #include "volume.h" #include "volume_knob.h" +#include "song.h" #undef SINGLE_SOURCE_COMPILE #include "embed.cpp" @@ -690,31 +691,31 @@ void vibedView::showString( Uint8 _string ) void vibedView::sinWaveClicked( void ) { m_graph->model()->setWaveToSine(); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } void vibedView::triangleWaveClicked( void ) { m_graph->model()->setWaveToTriangle(); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } void vibedView::sawWaveClicked( void ) { m_graph->model()->setWaveToSaw(); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } void vibedView::sqrWaveClicked( void ) { m_graph->model()->setWaveToSquare(); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } void vibedView::noiseWaveClicked( void ) { m_graph->model()->setWaveToNoise(); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } void vibedView::usrWaveClicked( void ) @@ -727,13 +728,13 @@ void vibedView::usrWaveClicked( void ) void vibedView::smoothClicked( void ) { m_graph->model()->smooth(); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } void vibedView::normalizeClicked( void ) { m_graph->model()->normalize(); - engine::getSongEditor()->setModified(); + engine::getSong()->setModified(); } @@ -741,7 +742,7 @@ void vibedView::normalizeClicked( void ) void vibedView::contextMenuEvent( QContextMenuEvent * ) { - captionMenu contextMenu( publicName() ); + captionMenu contextMenu( model()->publicName() ); contextMenu.addAction( embed::getIconPixmap( "help" ), tr( "&Help" ), this, SLOT( displayHelp() ) ); contextMenu.exec( QCursor::pos() ); diff --git a/plugins/vibed/vibed.h b/plugins/vibed/vibed.h index 6423384be..12f915b39 100644 --- a/plugins/vibed/vibed.h +++ b/plugins/vibed/vibed.h @@ -30,8 +30,6 @@ #include "knob.h" #include "pixmap_button.h" #include "led_checkbox.h" -#include "impulse_editor.h" -#include "lcd_spinbox.h" #include "volume_knob.h" #include "nine_button_selector.h" diff --git a/src/widgets/graph.cpp b/src/widgets/graph.cpp index eb44ad10c..8b55215c8 100644 --- a/src/widgets/graph.cpp +++ b/src/widgets/graph.cpp @@ -116,7 +116,7 @@ void graph::mouseMoveEvent ( QMouseEvent * _me ) if( diff >= 1 ) { - x = min( width() - 3, m_lastCursorX + 1); + x = min( width() - 2, m_lastCursorX + 1); } else if( diff <= 1 ) { From 922d2c5f38f06cdaa53fbb51e95898ff2dba0aae Mon Sep 17 00:00:00 2001 From: Paul Giblock Date: Sun, 24 Feb 2008 10:59:17 +0000 Subject: [PATCH 61/87] M/V split of Bit Invader git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@701 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 14 + include/graph.h | 3 +- plugins/bit_invader/Makefile.am | 4 +- plugins/bit_invader/bit_invader.cpp | 697 ++++++++++++---------------- plugins/bit_invader/bit_invader.h | 85 ++-- plugins/bit_invader/graph.cpp | 221 --------- plugins/bit_invader/graph.h | 72 --- src/widgets/graph.cpp | 20 +- 8 files changed, 380 insertions(+), 736 deletions(-) delete mode 100644 plugins/bit_invader/graph.cpp delete mode 100644 plugins/bit_invader/graph.h diff --git a/ChangeLog b/ChangeLog index fe2c9e3ef..30ce8c117 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2008-02-24 Paul Giblock + + * plugins/bit_invader/bit_invader.cpp: + * plugins/bit_invader/bit_invader.h: + * plugins/bit_invader/Makefile.am: + M/V-split of Bit Invader instrument. + + * plugins/vibed/nine_button_selector.cpp: + Removed debug output + + * src/widgets/graph.cpp: + * include/graph.h: + Fixed some graph issues. Still more left to do + 2008-02-22 Paul Giblock * plugins/vibed/vibed.cpp: diff --git a/include/graph.h b/include/graph.h index 095f9b73b..b4d2bf876 100644 --- a/include/graph.h +++ b/include/graph.h @@ -61,7 +61,8 @@ protected: virtual void mouseReleaseEvent( QMouseEvent * _me ); protected slots: - void updateGraph(Uint32 _startPos, Uint32 _endPos); + void updateGraph( Uint32 _startPos, Uint32 _endPos ); + void updateGraph( void ); private: virtual void modelChanged( void ); diff --git a/plugins/bit_invader/Makefile.am b/plugins/bit_invader/Makefile.am index aa4b4df15..95c017a51 100644 --- a/plugins/bit_invader/Makefile.am +++ b/plugins/bit_invader/Makefile.am @@ -11,7 +11,7 @@ AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="bitinvader" $(MOC) -o $@ $< -MOC_FILES = ./bit_invader.moc ./graph.moc +MOC_FILES = ./bit_invader.moc BUILT_SOURCES = $(MOC_FILES) ./embedded_resources.h EMBEDDED_RESOURCES = $(wildcard *png) @@ -28,6 +28,6 @@ CLEANFILES = $(MOC_FILES) ./embedded_resources.h pkglib_LTLIBRARIES = libbitinvader.la -libbitinvader_la_SOURCES = bit_invader.cpp bit_invader.h graph.cpp graph.h +libbitinvader_la_SOURCES = bit_invader.cpp bit_invader.h $(libbitinvader_la_SOURCES): ./embedded_resources.h diff --git a/plugins/bit_invader/bit_invader.cpp b/plugins/bit_invader/bit_invader.cpp index dd817073c..5a76407eb 100644 --- a/plugins/bit_invader/bit_invader.cpp +++ b/plugins/bit_invader/bit_invader.cpp @@ -43,6 +43,7 @@ using namespace std; #include "song_editor.h" #include "templates.h" #include "tooltip.h" +#include "song.h" #undef SINGLE_SOURCE_COMPILE #include "embed.cpp" @@ -65,8 +66,6 @@ plugin::descriptor bitinvader_plugin_descriptor = } -QPixmap * bitInvader::s_artwork = NULL; - bSynth::bSynth( float * shape, int length, float _pitch, bool _interpolation, float factor, const sample_rate_t _sample_rate ) @@ -113,19 +112,19 @@ sample_t bSynth::nextStringSample( void ) if (interpolation) { - // find position in shape - int a = static_cast(sample_realindex); - int b; - if (a < (sample_length-1)) { - b = static_cast(sample_realindex+1); - } else { - b = 0; - } - - // Nachkommaanteil - float frac = sample_realindex - static_cast(sample_realindex); - - sample = sample_shape[a]*(1-frac) + sample_shape[b]*(frac); + // find position in shape + int a = static_cast(sample_realindex); + int b; + if (a < (sample_length-1)) { + b = static_cast(sample_realindex+1); + } else { + b = 0; + } + + // Nachkommaanteil + float frac = sample_realindex - static_cast(sample_realindex); + + sample = sample_shape[a]*(1-frac) + sample_shape[b]*(frac); } else { // No interpolation @@ -136,8 +135,6 @@ sample_t bSynth::nextStringSample( void ) // progress in shape sample_realindex += sample_step; -// cout << sample_index << "\t"; - return sample; } @@ -151,275 +148,25 @@ sample_t bSynth::nextStringSample( void ) bitInvader::bitInvader( instrumentTrack * _channel_track ) : - instrument( _channel_track, - &bitinvader_plugin_descriptor ) + instrument( _channel_track, &bitinvader_plugin_descriptor ), + m_sampleLength( 128, 8, 128, 1, this ), + m_graph( -1.0f, 1.0f, 128, this ), + m_interpolation( FALSE, this ), + m_normalize( FALSE, this) { + m_graph.setWaveToSine(); - m_graph = NULL; - normalize = false; - interpolation = false; - - if( s_artwork == NULL ) - { - s_artwork = new QPixmap( PLUGIN_NAME::getIconPixmap( - "artwork" ) ); - } + connect( &m_sampleLength, SIGNAL( dataChanged( ) ), + this, SLOT( lengthChanged( ) ) + ); - - m_sampleLengthKnob = new knob( knobDark_28, this, tr( "Samplelength" ), - _channel_track ); - m_sampleLengthKnob->setRange( 8, 128, 1 ); - m_sampleLengthKnob->setInitValue( 128 ); - m_sampleLengthKnob->move( 10, 120 ); - m_sampleLengthKnob->setHintText( tr( "Sample Length" ) + " ", "" ); - - connect( m_sampleLengthKnob, SIGNAL( valueChanged( float ) ), - this, SLOT ( sampleSizeChanged( float ) ) - ); - - m_interpolationToggle = new ledCheckBox( "Interpolation", this, - tr( "Interpolation" ), - _channel_track ); - m_interpolationToggle->move( 55,80 ); - - connect( m_interpolationToggle, SIGNAL( toggled( bool ) ), - this, SLOT ( interpolationToggle( bool ) ) ); - - m_normalizeToggle = new ledCheckBox( "Normalize", this, - tr( "Normalize" ), - _channel_track ); - m_normalizeToggle->move( 55, 100 ); - - connect( m_normalizeToggle, SIGNAL( toggled( bool ) ), - this, SLOT ( normalizeToggle( bool ) ) ); - - - m_graph = new graph( this ); - m_graph->move(53,118); // 55,120 - 2px border - m_graph->setCursor( QCursor( Qt::CrossCursor ) ); - - toolTip::add( m_graph, tr ( "Draw your own waveform here" - "by dragging your mouse onto this graph" - )); - - QPixmap p = PLUGIN_NAME::getIconPixmap("wavegraph3") ; - - m_graph->setBackground( p ); - - connect( m_graph, SIGNAL ( sampleSizeChanged( float ) ), - this, SLOT (sampleSizeChanged( float ) ) ); - - connect( m_graph, SIGNAL ( sampleChanged( void ) ), - this, SLOT ( sampleChanged( void ) ) ); - - sinWaveBtn = new pixmapButton( this, tr( "Sine wave" ), - _channel_track ); - sinWaveBtn->move( 188, 120 ); - sinWaveBtn->setActiveGraphic( embed::getIconPixmap( - "sin_wave_active" ) ); - sinWaveBtn->setInactiveGraphic( embed::getIconPixmap( - "sin_wave_inactive" ) ); - toolTip::add( sinWaveBtn, - tr( "Click here if you want a sine-wave for " - "current oscillator." ) ); - - triangleWaveBtn = new pixmapButton( this, tr( "Triangle wave" ), - _channel_track ); - triangleWaveBtn->move( 188, 136 ); - triangleWaveBtn->setActiveGraphic( - embed::getIconPixmap( "triangle_wave_active" ) ); - triangleWaveBtn->setInactiveGraphic( - embed::getIconPixmap( "triangle_wave_inactive" ) ); - toolTip::add( triangleWaveBtn, - tr( "Click here if you want a triangle-wave " - "for current oscillator." ) ); - - sawWaveBtn = new pixmapButton( this, tr( "Saw wave" ), - _channel_track ); - sawWaveBtn->move( 188, 152 ); - sawWaveBtn->setActiveGraphic( embed::getIconPixmap( - "saw_wave_active" ) ); - sawWaveBtn->setInactiveGraphic( embed::getIconPixmap( - "saw_wave_inactive" ) ); - toolTip::add( sawWaveBtn, - tr( "Click here if you want a saw-wave for " - "current oscillator." ) ); - - sqrWaveBtn = new pixmapButton( this, tr( "Square wave" ), - _channel_track ); - sqrWaveBtn->move( 188, 168 ); - sqrWaveBtn->setActiveGraphic( embed::getIconPixmap( - "square_wave_active" ) ); - sqrWaveBtn->setInactiveGraphic( embed::getIconPixmap( - "square_wave_inactive" ) ); - toolTip::add( sqrWaveBtn, - tr( "Click here if you want a square-wave for " - "current oscillator." ) ); - - whiteNoiseWaveBtn = new pixmapButton( this, - tr( "White noise wave" ), - _channel_track ); - whiteNoiseWaveBtn->move( 188, 184 ); - whiteNoiseWaveBtn->setActiveGraphic( - embed::getIconPixmap( "white_noise_wave_active" ) ); - whiteNoiseWaveBtn->setInactiveGraphic( - embed::getIconPixmap( "white_noise_wave_inactive" ) ); - toolTip::add( whiteNoiseWaveBtn, - tr( "Click here if you want a white-noise for " - "current oscillator." ) ); - - usrWaveBtn = new pixmapButton( this, tr( "User defined wave" ), - _channel_track ); - usrWaveBtn->move( 188, 200 ); - usrWaveBtn->setActiveGraphic( embed::getIconPixmap( - "usr_wave_active" ) ); - usrWaveBtn->setInactiveGraphic( embed::getIconPixmap( - "usr_wave_inactive" ) ); - toolTip::add( usrWaveBtn, - tr( "Click here if you want a user-defined " - "wave-shape for current oscillator." ) ); - - - connect( sinWaveBtn, SIGNAL (clicked ( void ) ), - this, SLOT ( sinWaveClicked( void ) ) ); - connect( triangleWaveBtn, SIGNAL ( clicked ( void ) ), - this, SLOT ( triangleWaveClicked( void ) ) ); - connect( sawWaveBtn, SIGNAL (clicked ( void ) ), - this, SLOT ( sawWaveClicked( void ) ) ); - connect( sqrWaveBtn, SIGNAL ( clicked ( void ) ), - this, SLOT ( sqrWaveClicked( void ) ) ); - connect( whiteNoiseWaveBtn, SIGNAL ( clicked ( void ) ), - this, SLOT ( noiseWaveClicked( void ) ) ); - connect( usrWaveBtn, SIGNAL ( clicked ( void ) ), - this, SLOT ( usrWaveClicked( void ) ) ); - - - - smoothBtn = new pixmapButton( this, tr( "Smooth" ), - _channel_track ); - smoothBtn->move( 55, 225 ); - smoothBtn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( - "smooth" ) ); - smoothBtn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( - "smooth" ) ); - smoothBtn->setChecked( TRUE ); - toolTip::add( smoothBtn, - tr( "Click here to " - "smooth waveform." ) ); - - connect( smoothBtn, SIGNAL ( clicked ( void ) ), - this, SLOT ( smoothClicked( void ) ) ); - - - setAutoFillBackground( TRUE ); - QPalette pal; - pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( - "artwork" ) ); - setPalette( pal ); - - sample_length = 128; - sample_shape = new float[128]; - m_graph->setSamplePointer( sample_shape, sample_length ); - emit( sinWaveClicked() ); - + connect( &m_graph, SIGNAL( samplesChanged( Uint32, Uint32 ) ), + this, SLOT( samplesChanged( Uint32, Uint32 ) ) ); } - - -void bitInvader::sinWaveClicked( void ) -{ - // generate a Sinus wave using static oscillator-method - for (int i=0; i < sample_length; i++) - { - sample_shape[i] = oscillator::sinSample( i / static_cast( - sample_length ) ); - } - - sampleChanged(); -} - -void bitInvader::triangleWaveClicked( void ) -{ - // generate a Triangle wave using static oscillator-method - for (int i=0; i < sample_length; i++) - { - sample_shape[i] = oscillator::triangleSample( i / - static_cast( sample_length) ); - } - - sampleChanged(); -} - - -void bitInvader::sawWaveClicked( void ) -{ - // generate a Saw wave using static oscillator-method - for (int i=0; i < sample_length; i++) - { - sample_shape[i] = oscillator::sawSample( i / static_cast( - sample_length ) ); - } - - sampleChanged(); -} - -void bitInvader::sqrWaveClicked( void ) -{ - // generate a Sqr wave using static oscillator-method - for (int i=0; i < sample_length; i++) - { - sample_shape[i] = oscillator::squareSample( i / - static_cast( sample_length ) ); - } - - sampleChanged(); -} - -void bitInvader::noiseWaveClicked( void ) -{ - // generate a Noise wave using static oscillator-method - for (int i=0; i < sample_length; i++) - { - sample_shape[i] = oscillator::noiseSample( i / - static_cast( sample_length ) ); - } - - sampleChanged(); -} - -void bitInvader::usrWaveClicked( void ) -{ - // zero sample_shape - for (int i = 0; i < sample_length; i++) - { - sample_shape[i] = 0; - } - - // load user shape - sampleBuffer buffer; - QString af = buffer.openAudioFile(); - if ( af != "" ) - { - buffer.setAudioFile( af ); - - // copy buffer data - sample_length = min( sample_length, static_cast( - buffer.frames() ) ); - for ( int i = 0; i < sample_length; i++ ) - { - sample_shape[i] = (float)*buffer.data()[i]; - } - } - - sampleChanged(); -} - - - - bitInvader::~bitInvader() { } @@ -434,21 +181,20 @@ void bitInvader::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "version", "0.1" ); // Save sample length - m_sampleLengthKnob->saveSettings( _doc, _this, "sampleLength" ); + m_sampleLength.saveSettings( _doc, _this, "sampleLength" ); // Save sample shape base64-encoded QString sampleString; - base64::encode( (const char *)sample_shape, - sample_length * sizeof(float), sampleString ); + base64::encode( (const char *)m_graph.samples(), + m_graph.length() * sizeof(float), sampleString ); _this.setAttribute( "sampleShape", sampleString ); // save LED normalize - m_interpolationToggle->saveSettings( _doc, _this, "interpolation" ); + m_interpolation.saveSettings( _doc, _this, "interpolation" ); // save LED - m_normalizeToggle->saveSettings( _doc, _this, "normalize" ); - + m_normalize->saveSettings( _doc, _this, "normalize" ); } @@ -457,89 +203,71 @@ void bitInvader::saveSettings( QDomDocument & _doc, QDomElement & _this ) void bitInvader::loadSettings( const QDomElement & _this ) { // Load sample length - m_sampleLengthKnob->loadSettings( _this, "sampleLength" ); + m_sampleLength.loadSettings( _this, "sampleLength" ); - sample_length = (int)m_sampleLengthKnob->value(); + int sampleLength = (int)m_sampleLength.value(); // Load sample shape - delete[] sample_shape; - sample_shape = new float[sample_length]; int size = 0; char * dst = 0; base64::decode( _this.attribute( "sampleShape"), &dst, &size ); - memcpy( sample_shape, dst, tMin( size, sample_length * - sizeof( float ) ) ); + m_graph.setLength( size ); + m_graph.setSamples( (float*) dst ); delete[] dst; - m_graph->setSamplePointer( sample_shape, sample_length ); // Load LED normalize - m_interpolationToggle->loadSettings( _this, "interpolation" ); + m_interpolation.loadSettings( _this, "interpolation" ); // Load LED m_normalizeToggle->loadSettings( _this, "normalize" ); - update(); // songEditor::inst()->setModified(); } -void bitInvader::interpolationToggle( bool value ) + +void bitInvader::lengthChanged( void ) { - interpolation = value; + m_graph.setLength( m_sampleLength.value() ); - engine::getSongEditor()->setModified(); + normalize(); } - -void bitInvader::normalizeToggle( bool value ) + + +void bitInvader::samplesChanged( Uint32 _begin, Uint32 _end ) { - normalize = value; - - engine::getSongEditor()->setModified(); - + normalize(); + //engine::getSongEditor()->setModified(); } +void bitInvader::normalize( void ) +{ + // analyze + float max = 0; + const float* samples = m_graph.samples(); + for (int i=0; i < m_graph.length(); i++) + { + if (fabsf(samples[i]) > max) { max = fabs(samples[i]); } + } + normalizeFactor = 1.0 / max; +} + + + QString bitInvader::nodeName( void ) const { return( bitinvader_plugin_descriptor.name ); } -void bitInvader::smoothClicked( void ) -{ - // store values in temporary array - float* temp = new float[sample_length]; - memcpy( temp, sample_shape, sizeof( float ) * sample_length ); - - // Smoothing - sample_shape[0] = ( temp[0]+temp[sample_length-1] ) * 0.5f; - for ( int i=1; i < sample_length; i++) - { - sample_shape[i] = (temp[i-1] + temp[i]) * 0.5f; - } - - - // Clean up - delete[] temp; - - // paint - update(); - m_graph->update(); - - engine::getSongEditor()->setModified(); - -} - - - - void bitInvader::playNote( notePlayHandle * _n, bool ) { if ( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) { float factor; - if( !normalize ) + if( !m_normalize.value() ) { factor = 1.0f; } @@ -548,8 +276,9 @@ void bitInvader::playNote( notePlayHandle * _n, bool ) factor = normalizeFactor; } - _n->m_pluginData = new bSynth( sample_shape, sample_length, - _n->frequency(), interpolation, factor, + _n->m_pluginData = new bSynth( const_cast( m_graph.samples() ), + m_graph.length(), + _n->frequency(), m_interpolation.value(), factor, engine::getMixer()->sampleRate() ); } @@ -574,85 +303,248 @@ void bitInvader::playNote( notePlayHandle * _n, bool ) } - - void bitInvader::deleteNotePluginData( notePlayHandle * _n ) { delete static_cast( _n->m_pluginData ); } -void bitInvader::sampleSizeChanged( float _new_sample_length ) +pluginView * bitInvader::instantiateView( QWidget * _parent ) { - int new_sample_length = static_cast(_new_sample_length); - - // ** grow array - if (new_sample_length > sample_length) { - - // store values in temporary array - float* temp = new float[sample_length]; - for (int i=0; i < sample_length; i++) - { - temp[i] = sample_shape[i]; - } - - // reinitialize sample array - delete[] sample_shape; - sample_shape = new float[new_sample_length]; - for (int i=0; i < new_sample_length; i++) - { - sample_shape[i] = 0; - } - - // fill in old values - for (int i=0; i < sample_length; i++) - { - sample_shape[i] = temp[i]; - } - - delete[] temp; - sample_length = new_sample_length; - - } - - // ** shrink array - if (new_sample_length < sample_length) { - - sample_length = new_sample_length; - - } - - - // update sample graph - m_graph->setSamplePointer( sample_shape, sample_length ); - - // set Song modified - engine::getSongEditor()->setModified(); - -} - -void bitInvader::sampleChanged() -{ - - // analyze - float max = 0; - for (int i=0; i < sample_length; i++) - { - if (fabsf(sample_shape[i]) > max) { max = fabs(sample_shape[i]); } - } - normalizeFactor = 1.0 / max; - - - // update - if (m_graph != NULL) { - m_graph->update(); - } - - engine::getSongEditor()->setModified(); - + return( new bitInvaderView( this, _parent ) ); } +bitInvaderView::bitInvaderView( instrument * _instrument, + QWidget * _parent ) : + instrumentView( _instrument, _parent ) +{ + setAutoFillBackground( TRUE ); + QPalette pal; + + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( + "artwork" ) ); + setPalette( pal ); + + m_sampleLengthKnob = new knob( knobDark_28, this, tr( "Samplelength" ) ); + m_sampleLengthKnob->move( 10, 120 ); + m_sampleLengthKnob->setHintText( tr( "Sample Length" ) + " ", "" ); + + m_graph = new graph( this ); + m_graph->move(53,118); // 55,120 - 2px border + m_graph->setAutoFillBackground( TRUE ); + + toolTip::add( m_graph, tr ( "Draw your own waveform here" + "by dragging your mouse onto this graph" + )); + + + pal = QPalette(); + pal.setBrush( backgroundRole(), + PLUGIN_NAME::getIconPixmap("wavegraph3") ); + m_graph->setPalette( pal ); + + + sinWaveBtn = new pixmapButton( this, tr( "Sine wave" ) ); + sinWaveBtn->move( 188, 120 ); + sinWaveBtn->setActiveGraphic( embed::getIconPixmap( + "sin_wave_active" ) ); + sinWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "sin_wave_inactive" ) ); + toolTip::add( sinWaveBtn, + tr( "Click here if you want a sine-wave for " + "current oscillator." ) ); + + triangleWaveBtn = new pixmapButton( this, tr( "Triangle wave" ) ); + triangleWaveBtn->move( 188, 136 ); + triangleWaveBtn->setActiveGraphic( + embed::getIconPixmap( "triangle_wave_active" ) ); + triangleWaveBtn->setInactiveGraphic( + embed::getIconPixmap( "triangle_wave_inactive" ) ); + toolTip::add( triangleWaveBtn, + tr( "Click here if you want a triangle-wave " + "for current oscillator." ) ); + + sawWaveBtn = new pixmapButton( this, tr( "Saw wave" ) ); + sawWaveBtn->move( 188, 152 ); + sawWaveBtn->setActiveGraphic( embed::getIconPixmap( + "saw_wave_active" ) ); + sawWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "saw_wave_inactive" ) ); + toolTip::add( sawWaveBtn, + tr( "Click here if you want a saw-wave for " + "current oscillator." ) ); + + sqrWaveBtn = new pixmapButton( this, tr( "Square wave" ) ); + sqrWaveBtn->move( 188, 168 ); + sqrWaveBtn->setActiveGraphic( embed::getIconPixmap( + "square_wave_active" ) ); + sqrWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "square_wave_inactive" ) ); + toolTip::add( sqrWaveBtn, + tr( "Click here if you want a square-wave for " + "current oscillator." ) ); + + whiteNoiseWaveBtn = new pixmapButton( this, + tr( "White noise wave" ) ); + whiteNoiseWaveBtn->move( 188, 184 ); + whiteNoiseWaveBtn->setActiveGraphic( + embed::getIconPixmap( "white_noise_wave_active" ) ); + whiteNoiseWaveBtn->setInactiveGraphic( + embed::getIconPixmap( "white_noise_wave_inactive" ) ); + toolTip::add( whiteNoiseWaveBtn, + tr( "Click here if you want a white-noise for " + "current oscillator." ) ); + + usrWaveBtn = new pixmapButton( this, tr( "User defined wave" ) ); + usrWaveBtn->move( 188, 200 ); + usrWaveBtn->setActiveGraphic( embed::getIconPixmap( + "usr_wave_active" ) ); + usrWaveBtn->setInactiveGraphic( embed::getIconPixmap( + "usr_wave_inactive" ) ); + toolTip::add( usrWaveBtn, + tr( "Click here if you want a user-defined " + "wave-shape for current oscillator." ) ); + + smoothBtn = new pixmapButton( this, tr( "Smooth" ) ); + smoothBtn->move( 55, 225 ); + smoothBtn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( + "smooth" ) ); + smoothBtn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( + "smooth" ) ); + smoothBtn->setChecked( TRUE ); + toolTip::add( smoothBtn, + tr( "Click here to " + "smooth waveform." ) ); + + + m_interpolationToggle = new ledCheckBox( "Interpolation", this, + tr( "Interpolation" ) ); + m_interpolationToggle->move( 55,80 ); + + + m_normalizeToggle = new ledCheckBox( "Normalize", this, + tr( "Normalize" ) ); + m_normalizeToggle->move( 55, 100 ); + + + connect( sinWaveBtn, SIGNAL (clicked ( void ) ), + this, SLOT ( sinWaveClicked( void ) ) ); + connect( triangleWaveBtn, SIGNAL ( clicked ( void ) ), + this, SLOT ( triangleWaveClicked( void ) ) ); + connect( sawWaveBtn, SIGNAL (clicked ( void ) ), + this, SLOT ( sawWaveClicked( void ) ) ); + connect( sqrWaveBtn, SIGNAL ( clicked ( void ) ), + this, SLOT ( sqrWaveClicked( void ) ) ); + connect( whiteNoiseWaveBtn, SIGNAL ( clicked ( void ) ), + this, SLOT ( noiseWaveClicked( void ) ) ); + connect( usrWaveBtn, SIGNAL ( clicked ( void ) ), + this, SLOT ( usrWaveClicked( void ) ) ); + + connect( smoothBtn, SIGNAL ( clicked ( void ) ), + this, SLOT ( smoothClicked( void ) ) ); + + connect( m_interpolationToggle, SIGNAL( toggled( bool ) ), + this, SLOT ( interpolationToggled( bool ) ) ); + + connect( m_normalizeToggle, SIGNAL( toggled( bool ) ), + this, SLOT ( normalizeToggled( bool ) ) ); + +} + +void bitInvaderView::modelChanged( void ) +{ + bitInvader * b = castModel(); + + m_graph->setModel( &b->m_graph ); + m_sampleLengthKnob->setModel( &b->m_sampleLength ); + m_interpolationToggle->setModel( &b->m_interpolation ); + m_normalizeToggle->setModel( &b->m_normalize ); + +} + + +void bitInvaderView::sinWaveClicked( void ) +{ + m_graph->model()->setWaveToSine(); + engine::getSong()->setModified(); +} + +void bitInvaderView::triangleWaveClicked( void ) +{ + m_graph->model()->setWaveToTriangle(); + engine::getSong()->setModified(); +} + + +void bitInvaderView::sawWaveClicked( void ) +{ + m_graph->model()->setWaveToSaw(); + engine::getSong()->setModified(); +} + +void bitInvaderView::sqrWaveClicked( void ) +{ + m_graph->model()->setWaveToSquare(); + engine::getSong()->setModified(); +} + +void bitInvaderView::noiseWaveClicked( void ) +{ + m_graph->model()->setWaveToNoise(); + engine::getSong()->setModified(); +} + +void bitInvaderView::usrWaveClicked( void ) +{ + /* + m_graph->model()->setWaveToNoise(); + engine::getSong()->setModified(); + // zero sample_shape + for (int i = 0; i < sample_length; i++) + { + sample_shape[i] = 0; + } + + // load user shape + sampleBuffer buffer; + QString af = buffer.openAudioFile(); + if ( af != "" ) + { + buffer.setAudioFile( af ); + + // copy buffer data + sample_length = min( sample_length, static_cast( + buffer.frames() ) ); + for ( int i = 0; i < sample_length; i++ ) + { + sample_shape[i] = (float)*buffer.data()[i]; + } + } + + sampleChanged(); + */ +} + + +void bitInvaderView::smoothClicked( void ) +{ + m_graph->model()->smooth(); + engine::getSong()->setModified(); +} + + +void bitInvaderView::interpolationToggled( bool value ) +{ + engine::getSong()->setModified(); +} + + +void bitInvaderView::normalizeToggled( bool value ) +{ + engine::getSong()->setModified(); +} + extern "C" { @@ -668,5 +560,4 @@ plugin * lmms_plugin_main( void * _data ) - #include "bit_invader.moc" diff --git a/plugins/bit_invader/bit_invader.h b/plugins/bit_invader/bit_invader.h index db278c588..c4606f07a 100644 --- a/plugins/bit_invader/bit_invader.h +++ b/plugins/bit_invader/bit_invader.h @@ -29,15 +29,15 @@ #include "instrument.h" +#include "instrument_view.h" #include "types.h" +#include "graph.h" +#include "knob.h" +#include "pixmap_button.h" +#include "led_checkbox.h" -class QPixmap; - -class graph; -class knob; -class ledCheckBox; class oscillator; -class pixmapButton; +class bitInvaderView; class bSynth { @@ -83,29 +83,59 @@ public: return( 64 ); } + virtual pluginView * instantiateView( QWidget * _parent ); -public slots: - void sampleSizeChanged( float _new_sample_length ); - void sampleChanged( void ); +protected slots: + void lengthChanged( void ); + void samplesChanged( Uint32, Uint32 ); - void interpolationToggle( bool value ); - void normalizeToggle( bool value ); - void smoothClicked( void ); + void normalize( void ); - void sinWaveClicked( void ); - void triangleWaveClicked( void ); - void sqrWaveClicked( void ); - void sawWaveClicked( void ); - void noiseWaveClicked( void ); - void usrWaveClicked( void ); -/* -protected: - virtual void paintEvent( QPaintEvent * ); -*/ private: - knob * m_sampleLengthKnob; + knobModel m_sampleLength; + graphModel m_graph; + + boolModel m_interpolation; + boolModel m_normalize; + + float normalizeFactor; + + oscillator * m_osc; + friend class bitInvaderView; +} ; + + + +class bitInvaderView : public instrumentView +{ + Q_OBJECT +public: + bitInvaderView( instrument * _instrument, + QWidget * _parent ); + + virtual ~bitInvaderView() {}; + +protected slots: + //void sampleSizeChanged( float _new_sample_length ); + + void interpolationToggled( bool value ); + void normalizeToggled( bool value ); + + void sinWaveClicked( void ); + void triangleWaveClicked( void ); + void sqrWaveClicked( void ); + void sawWaveClicked( void ); + void noiseWaveClicked( void ); + void usrWaveClicked( void ); + + void smoothClicked( void ); + +private: + virtual void modelChanged( void ); + + knob * m_sampleLengthKnob; pixmapButton * sinWaveBtn; pixmapButton * triangleWaveBtn; pixmapButton * sqrWaveBtn; @@ -120,17 +150,8 @@ private: ledCheckBox * m_interpolationToggle; ledCheckBox * m_normalizeToggle; - int sample_length; - float* sample_shape; - - bool interpolation; - bool normalize; - float normalizeFactor; - - oscillator * m_osc; } ; - #endif diff --git a/plugins/bit_invader/graph.cpp b/plugins/bit_invader/graph.cpp deleted file mode 100644 index 098ded342..000000000 --- a/plugins/bit_invader/graph.cpp +++ /dev/null @@ -1,221 +0,0 @@ -/* - * graph.cpp - a QT widget for displaying and manipulating waveforms - * - * Copyright (c) 2006-2007 Andreas Brandmaier - * - * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net - * - * 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. - * - */ - - -#include -#include -#include - -#include "graph.h" -#include "string_pair_drag.h" -#include "sample_buffer.h" -#include -#include - -using namespace std; - - - -graph::graph( QWidget * _parent ) : - QWidget( _parent ) -{ - -// m_background = 0; TODO - m_mouseDown = false; - - setFixedSize( 132, 104 ); - - setAcceptDrops( TRUE ); -} - - - - -graph::~graph() -{ -} - -void graph::setBackground( const QPixmap &_pixmap ) -{ - m_background = _pixmap; -} - -void graph::setSamplePointer( float * _pointer, int _length ) -{ - samplePointer = _pointer; - sampleLength = _length; - update(); -} - -void graph::loadSampleFromFile( const QString & _filename ) -{ - // zero sample_shape - for (int i = 0; i < sampleLength; i++) - { - samplePointer[i] = 0; - } - - // load user shape - sampleBuffer buffer( _filename ); - - // copy buffer data - sampleLength = min( sampleLength, static_cast(buffer.frames()) ); - for ( int i = 0; i < sampleLength; i++ ) - { - samplePointer[i] = (float)*buffer.data()[i]; - } - -} - -void graph::mouseMoveEvent ( QMouseEvent * _me ) -{ - - // get position - int x = _me->x(); - int y = _me->y(); - - - // avoid mouse leaps - int diff = x - m_lastCursorX; - - if (diff >= 1) { - x = m_lastCursorX + 1; - } else if (diff <= 1) { - x = m_lastCursorX - 1; - } else { - x = m_lastCursorX; - } - - changeSampleAt( x, y ); - - // update mouse - m_lastCursorX = x; - -} - -void graph::mousePressEvent( QMouseEvent * _me ) -{ - // toggle mouse state - m_mouseDown = true; - - // get position - int x = _me->x(); - int y = _me->y(); - - changeSampleAt( x,y ); - - // toggle mouse state - m_mouseDown = true; - setCursor( Qt::BlankCursor ); - m_lastCursorX = x; -} - -void graph::changeSampleAt(int _x, int _y) -{ - // consider border of background image - _x -= 2; - _y -= 2; - - // boundary check - if (_x < 0) { return; } - if (_x > sampleLength) { return; } - if (_y < 0) { return; } - if (_y >= 100) { return; } - _y = 100 - _y; - - // change sample shape - samplePointer[_x] = (_y-50.0)/50.0; - emit sampleChanged(); - - -} - -void graph::mouseReleaseEvent( QMouseEvent * _me ) -{ - // toggle mouse state - m_mouseDown = false; - setCursor( Qt::ArrowCursor ); - update(); -} - - - -void graph::paintEvent( QPaintEvent * ) -{ - - QPainter p( this ); - -// if (m_background != NULL) { - p.drawPixmap( 0, 0, m_background ); -// } - - p.setPen( QColor( 0xFF, 0xAA, 0x00 ) ); - - p.drawLine( 1+sampleLength, 2, 1+sampleLength, 102); - -// float xscale = 200.0 / sampleLength; - float xscale = 1.0; - - for (int i=0; i < sampleLength-1; i++) - { - p.drawLine(2+static_cast(i*xscale), - 2+static_cast(-samplePointer[i]*50) + 50, - 2+static_cast((i+1)*xscale), - 2+static_cast(-samplePointer[i+1]*50 + 50) - ); - } - - // draw Pointer - if (m_mouseDown) { - QPoint cursor = mapFromGlobal( QCursor::pos() ); - p.setPen( QColor( 0xAA, 0xFF, 0x00 ) ); - p.drawLine( 2, cursor.y(), 130, cursor.y() ); - p.drawLine( cursor.x(), 2, cursor.x(), 102 ); - } -} - - -void graph::dropEvent( QDropEvent * _de ) -{ - QString type = stringPairDrag::decodeKey( _de ); - QString value = stringPairDrag::decodeValue( _de ); - - if( type == "samplefile" ) - { - loadSampleFromFile( value ); - _de->accept(); - } -} - -void graph::dragEnterEvent( QDragEnterEvent * _dee ) -{ - if( stringPairDrag::processDragEnterEvent( _dee, - QString( "samplefile" ) ) == FALSE ) - { - _dee->ignore(); - } -} - - -#include "graph.moc" diff --git a/plugins/bit_invader/graph.h b/plugins/bit_invader/graph.h deleted file mode 100644 index a652d0d2f..000000000 --- a/plugins/bit_invader/graph.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * graph.h - a QT widget for displaying and manipulating waveforms - * - * Copyright (c) 2006-2007 Andreas Brandmaier - * - * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net - * - * 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 -#include -#include - - -class graph : public QWidget -{ - Q_OBJECT -public: - graph( QWidget * _parent ); - virtual ~graph(); - - void setSamplePointer( float * pointer, int length ); - void setBackground ( const QPixmap & _pixmap ); - void loadSampleFromFile( const QString & _filename ); - -signals: - void sampleSizeChanged( float f ); - void sampleChanged( void ); - -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 ); - -private: - - void changeSampleAt(int _x, int _y); - - QPixmap m_background; - - - float *samplePointer; - int sampleLength; - - bool m_mouseDown; - int m_lastCursorX; - -} ; - -#endif diff --git a/src/widgets/graph.cpp b/src/widgets/graph.cpp index 8b55215c8..8d05df230 100644 --- a/src/widgets/graph.cpp +++ b/src/widgets/graph.cpp @@ -51,8 +51,11 @@ graph::graph( QWidget * _parent ) : graphModel * gModel = castModel(); - QObject::connect( gModel, SIGNAL( samplesChanged( int, int ) ), - this, SLOT( updateGraph( int, int ) ) ); + QObject::connect( gModel, SIGNAL( samplesChanged( Uint32, Uint32 ) ), + this, SLOT( updateGraph( Uint32, Uint32 ) ) ); + + QObject::connect( gModel, SIGNAL( lengthChanged( ) ), + this, SLOT( updateGraph( ) ) ); } @@ -214,7 +217,7 @@ void graph::paintEvent( QPaintEvent * ) int length = model()->length(); int maxVal = model()->maxValue(); - float xscale = ( width()-4 ) / length; + float xscale = (float)( width()-4 ) / length; float yscale = (float)( height()-4 ) / ( model()->minValue() - maxVal ); // Max index, more useful below @@ -235,7 +238,7 @@ void graph::paintEvent( QPaintEvent * ) p.drawLine(2+static_cast(length*xscale), 2+static_cast( ( (*samps)[length] - maxVal ) * yscale ), width()-2, - 2+static_cast( ( (*samps)[length] - maxVal ) * yscale ) ); + 2+static_cast( ( (*samps)[0] - maxVal ) * yscale ) ); p.setRenderHints( QPainter::Antialiasing, FALSE ); @@ -282,8 +285,10 @@ void graph::modelChanged( void ) QObject::connect( gModel, SIGNAL( samplesChanged( Uint32, Uint32 ) ), this, SLOT( updateGraph( Uint32, Uint32 ) ) ); -} + QObject::connect( gModel, SIGNAL( lengthChanged( ) ), + this, SLOT( updateGraph( ) ) ); +} void graph::updateGraph( Uint32 _startPos, Uint32 _endPos ) @@ -293,6 +298,11 @@ void graph::updateGraph( Uint32 _startPos, Uint32 _endPos ) } +void graph::updateGraph( void ) +{ + updateGraph( 0, model()->length() - 1 ); +} + graphModel::graphModel( float _min, float _max, Uint32 _length, ::model * _parent, track * _track, From b79eddffe1d03e62dc373556e7a0d64f5da192cc Mon Sep 17 00:00:00 2001 From: Paul Giblock Date: Sun, 24 Feb 2008 11:12:14 +0000 Subject: [PATCH 62/87] M/V split of Bit Invader git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@702 0778d3d1-df1d-0410-868b-ea421aaaa00d --- plugins/bit_invader/bit_invader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/bit_invader/bit_invader.cpp b/plugins/bit_invader/bit_invader.cpp index 5a76407eb..033f0b216 100644 --- a/plugins/bit_invader/bit_invader.cpp +++ b/plugins/bit_invader/bit_invader.cpp @@ -194,7 +194,7 @@ void bitInvader::saveSettings( QDomDocument & _doc, QDomElement & _this ) m_interpolation.saveSettings( _doc, _this, "interpolation" ); // save LED - m_normalize->saveSettings( _doc, _this, "normalize" ); + m_normalize.saveSettings( _doc, _this, "normalize" ); } @@ -219,7 +219,7 @@ void bitInvader::loadSettings( const QDomElement & _this ) // Load LED normalize m_interpolation.loadSettings( _this, "interpolation" ); // Load LED - m_normalizeToggle->loadSettings( _this, "normalize" ); + m_normalize.loadSettings( _this, "normalize" ); // songEditor::inst()->setModified(); From 80d2241864c7c54844b634e5b237edcb29ee3f04 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 25 Feb 2008 11:37:02 +0000 Subject: [PATCH 63/87] connect track's m_mutedModel to m_muteBtn of trackOperationsWidget, set track for m_mutedModel git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@703 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/track.h | 3 +++ src/core/track.cpp | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/include/track.h b/include/track.h index 0d2fc2d40..08a67e485 100644 --- a/include/track.h +++ b/include/track.h @@ -326,6 +326,9 @@ private: bbTrack * currentBBTrack( void ); bool inBBEditor( void ); + + friend class trackView; + } ; diff --git a/src/core/track.cpp b/src/core/track.cpp index 575c21f5e..515ffd3b6 100644 --- a/src/core/track.cpp +++ b/src/core/track.cpp @@ -80,6 +80,7 @@ trackContentObject::trackContentObject( track * _track ) : m_length(), m_mutedModel( FALSE, this ) { + m_mutedModel.setTrack( _track ); setJournalling( FALSE ); movePosition( 0 ); changeLength( 0 ); @@ -1000,7 +1001,6 @@ trackOperationsWidget::trackOperationsWidget( trackView * _parent ) : m_muteBtn = new pixmapButton( this, tr( "Mute" ) ); - m_muteBtn->model()->setTrack( m_trackView->getTrack() ); m_muteBtn->setActiveGraphic( *s_muteOnEnabled ); m_muteBtn->setInactiveGraphic( *s_muteOffEnabled ); m_muteBtn->setCheckable( TRUE ); @@ -1254,6 +1254,7 @@ track::track( TrackTypes _type, trackContainer * _tc ) : m_trackContentObjects(), m_automationPatterns() { + m_mutedModel.setTrack( this ); m_trackContainer->addTrack( this ); } @@ -1740,6 +1741,7 @@ void trackView::modelChanged( void ) assert( m_track != NULL ); connect( m_track, SIGNAL( destroyed( QObject * ) ), this, SLOT( close() ), Qt::QueuedConnection ); + m_trackOperationsWidget.m_muteBtn->setModel( &m_track->m_mutedModel ); modelView::modelChanged(); } @@ -1919,6 +1921,9 @@ void trackView::createTCOView( trackContentObject * _tco ) } + + + #include "track.moc" From 32a3b7cf23456016e6ae15d599e7ae44f449d8af Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 25 Feb 2008 11:37:21 +0000 Subject: [PATCH 64/87] made live-tool work after M/V-split git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@704 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 13 ++++++ include/tool.h | 2 +- plugins/live_tool/live_tool.cpp | 73 +++++++++++++++++++++------------ plugins/live_tool/live_tool.h | 27 ++++++++---- src/core/tool.cpp | 6 +-- 5 files changed, 83 insertions(+), 38 deletions(-) diff --git a/ChangeLog b/ChangeLog index 30ce8c117..5684a63f8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2008-02-25 Tobias Doerffel + + * include/tool.h: + * src/core/tool.cpp: + * plugins/live_tool/live_tool.h: + * plugins/live_tool/live_tool.cpp: + made live-tool work after M/V-split + + * include/track.h: + * src/core/track.cpp: + - connect track's m_mutedModel to m_muteBtn of trackOperationsWidget + - set track for m_mutedModel + 2008-02-24 Paul Giblock * plugins/bit_invader/bit_invader.cpp: diff --git a/include/tool.h b/include/tool.h index e4c0d5e9b..350994d12 100644 --- a/include/tool.h +++ b/include/tool.h @@ -49,7 +49,7 @@ public: class toolView : public pluginView { public: - toolView( tool * _tool, QWidget * _parent ); + toolView( tool * _tool ); } ; diff --git a/plugins/live_tool/live_tool.cpp b/plugins/live_tool/live_tool.cpp index 23118948d..ec2c771e1 100644 --- a/plugins/live_tool/live_tool.cpp +++ b/plugins/live_tool/live_tool.cpp @@ -30,7 +30,7 @@ #include "bb_editor.h" #include "engine.h" -#include "song_editor.h" +#include "song.h" #ifdef Q_WS_X11 @@ -62,9 +62,9 @@ plugin::descriptor live_tool_plugin_descriptor = // neccessary for getting instance out of shared lib -plugin * lmms_plugin_main( void * _data ) +plugin * lmms_plugin_main( model * _parent, void * _data ) { - return( new liveTool ); + return( new liveTool( _parent ) ); } } @@ -72,8 +72,34 @@ plugin * lmms_plugin_main( void * _data ) -liveTool::liveTool( void ) : - tool( &live_tool_plugin_descriptor ) +liveTool::liveTool( model * _parent ) : + tool( &live_tool_plugin_descriptor, _parent ) +{ +} + + + + +liveTool::~liveTool() +{ +} + + + + +QString liveTool::nodeName( void ) const +{ + return( live_tool_plugin_descriptor.name ); +} + + + + + + + +liveToolView::liveToolView( tool * _tool ) : + toolView( _tool ) { const QPixmap background = PLUGIN_NAME::getIconPixmap( "artwork" ); @@ -103,39 +129,31 @@ liveTool::liveTool( void ) : -liveTool::~liveTool() +liveToolView::~liveToolView() { } -QString liveTool::nodeName( void ) const -{ - return( live_tool_plugin_descriptor.name ); -} - - - - -void liveTool::keyPressEvent( QKeyEvent * _ke ) +void liveToolView::keyPressEvent( QKeyEvent * _ke ) { switch( _ke->key() ) { case Qt::Key_Space: - if( engine::getSongEditor()->playing() ) + if( engine::getSong()->playing() ) { - engine::getSongEditor()->pause(); + engine::getSong()->pause(); } - else if( engine::getSongEditor()->paused() && - engine::getSongEditor()->playMode() == - songEditor::PLAY_SONG ) + else if( engine::getSong()->paused() && + engine::getSong()->playMode() == + song::Mode_PlaySong ) { - engine::getSongEditor()->resumeFromPause(); + engine::getSong()->resumeFromPause(); } else { - engine::getSongEditor()->play(); + engine::getSong()->play(); } break; @@ -148,7 +166,7 @@ void liveTool::keyPressEvent( QKeyEvent * _ke ) -void liveTool::mousePressEvent( QMouseEvent * _me ) +void liveToolView::mousePressEvent( QMouseEvent * _me ) { // MDI window gets focus otherwise setFocus(); @@ -159,7 +177,7 @@ void liveTool::mousePressEvent( QMouseEvent * _me ) #ifdef Q_WS_X11 -bool liveTool::x11Event( XEvent * _xe ) +bool liveToolView::x11Event( XEvent * _xe ) { if( _xe->type == KeyPress ) { @@ -178,11 +196,11 @@ bool liveTool::x11Event( XEvent * _xe ) -void liveTool::toggleInstrument( int _n ) +void liveToolView::toggleInstrument( int _n ) { - if( _n < engine::getBBEditor()->tracks().count() ) + if( _n < engine::getBBTrackContainer()->tracks().count() ) { - track * t = engine::getBBEditor()->tracks().at( _n ); + track * t = engine::getBBTrackContainer()->tracks().at( _n ); t->setMuted( !t->muted() ); } } @@ -190,4 +208,5 @@ void liveTool::toggleInstrument( int _n ) + #include "live_tool.moc" diff --git a/plugins/live_tool/live_tool.h b/plugins/live_tool/live_tool.h index 2331c9983..b2296193e 100644 --- a/plugins/live_tool/live_tool.h +++ b/plugins/live_tool/live_tool.h @@ -31,15 +31,11 @@ - -class liveTool : public tool +class liveToolView : public toolView { - Q_OBJECT public: - liveTool( void ); - virtual ~liveTool(); - - virtual QString nodeName( void ) const; + liveToolView( tool * _tool ); + virtual ~liveToolView(); protected: @@ -58,4 +54,21 @@ private: +class liveTool : public tool +{ +public: + liveTool( model * _parent ); + virtual ~liveTool(); + + virtual QString nodeName( void ) const; + virtual pluginView * instantiateView( QWidget * ) + { + return( new liveToolView( this ) ); + } + +} ; + + + + #endif diff --git a/src/core/tool.cpp b/src/core/tool.cpp index eaf6ce80a..5b8fd8aae 100644 --- a/src/core/tool.cpp +++ b/src/core/tool.cpp @@ -3,7 +3,7 @@ /* * tool.cpp - base class for all tool plugins (graphs, extensions, etc) * - * Copyright (c) 2006-2007 Javier Serrano Polo + * Copyright (c) 2006-2008 Javier Serrano Polo * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -70,8 +70,8 @@ tool * tool::instantiate( const QString & _plugin_name, model * _parent ) -toolView::toolView( tool * _tool, QWidget * _parent ) : - pluginView( _tool, _parent ) +toolView::toolView( tool * _tool ) : + pluginView( _tool, engine::getMainWindow()->workspace() ) { QWidget * window; if( engine::getMainWindow()->workspace() ) From 922ace49b2403040b7b985290479141fc8224fc8 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 25 Feb 2008 12:58:49 +0000 Subject: [PATCH 65/87] update() after wheelEvent git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@705 0778d3d1-df1d-0410-868b-ea421aaaa00d --- src/widgets/combobox.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/widgets/combobox.cpp b/src/widgets/combobox.cpp index 06bd4f395..86a30affd 100644 --- a/src/widgets/combobox.cpp +++ b/src/widgets/combobox.cpp @@ -34,6 +34,8 @@ #include #include +#include "automatable_model_templates.h" +#include "automation_pattern.h" #include "caption_menu.h" #include "embed.h" #include "gui_templates.h" @@ -217,6 +219,7 @@ void comboBox::wheelEvent( QWheelEvent * _we ) { model()->setInitValue( model()->value() + ( ( _we->delta() < 0 ) ? 1 : -1 ) ); + update(); _we->accept(); } From 69bbd954291ab72eb366d9411123b7462e2ce3e0 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 25 Feb 2008 12:59:15 +0000 Subject: [PATCH 66/87] fixed zooming-comboboxes in automation-editor and header-dependencies git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@706 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 11 ++++++++++ include/automation_editor.h | 9 +++++--- include/combobox.h | 9 ++------ src/core/automation_editor.cpp | 40 +++++++++++++++++++--------------- src/core/piano_roll.cpp | 1 + src/core/song.cpp | 2 ++ src/core/track.cpp | 2 +- 7 files changed, 45 insertions(+), 29 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5684a63f8..0995155d1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,16 @@ 2008-02-25 Tobias Doerffel + * include/automation_editor.h: + * include/combobox.h: + * src/core/song.cpp: + * src/core/piano_roll.cpp: + * src/core/track.cpp: + * src/core/automation_editor.cpp: + fixed zooming-comboboxes in automation-editor and header-dependencies + + * src/widgets/combobox.cpp: + update() after wheelEvent + * include/tool.h: * src/core/tool.cpp: * plugins/live_tool/live_tool.h: diff --git a/include/automation_editor.h b/include/automation_editor.h index a9fba2289..5abbe5924 100644 --- a/include/automation_editor.h +++ b/include/automation_editor.h @@ -33,13 +33,13 @@ #include "journalling_object.h" #include "midi_time.h" #include "automation_pattern.h" +#include "combobox.h" class QPainter; class QPixmap; class QScrollBar; -class comboBox; class notePlayHandle; class timeLine; class toolButton; @@ -118,8 +118,8 @@ protected slots: void updatePosition( const midiTime & _t ); - void zoomingXChanged( const QString & _zfac ); - void zoomingYChanged( const QString & _zfac ); + void zoomingXChanged( void ); + void zoomingYChanged( void ); private: @@ -182,6 +182,9 @@ private: comboBox * m_zoomingYComboBox; comboBox * m_quantizeComboBox; + comboBoxModel m_zoomingXModel; + comboBoxModel m_zoomingYModel; + comboBoxModel m_quantizeModel; automationPattern * m_pattern; int m_min_level; diff --git a/include/combobox.h b/include/combobox.h index 7a7316462..8598ee2dd 100644 --- a/include/combobox.h +++ b/include/combobox.h @@ -1,7 +1,7 @@ /* * combobox.h - class comboBox, a very cool combo-box * - * Copyright (c) 2006-2007 Tobias Doerffel + * Copyright (c) 2006-2008 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -32,7 +32,7 @@ #include #include "automatable_model.h" -#include "automatable_model_templates.h" +#include "templates.h" class comboBoxModel : public intModel @@ -138,11 +138,6 @@ private slots: void deletePixmap( QPixmap * _pixmap ); void setItem( QAction * _item ); -/* -signals: - void activated( const QString & ); - void valueChanged( int );*/ - } ; #endif diff --git a/src/core/automation_editor.cpp b/src/core/automation_editor.cpp index be1ad3462..22e1cf4b2 100644 --- a/src/core/automation_editor.cpp +++ b/src/core/automation_editor.cpp @@ -75,6 +75,10 @@ QPixmap * automationEditor::s_toolMove = NULL; automationEditor::automationEditor( void ) : + QWidget(), + m_zoomingXModel(), + m_zoomingYModel(), + m_quantizeModel(), m_pattern( NULL ), m_min_level( 0 ), m_max_level( 0 ), @@ -265,17 +269,16 @@ automationEditor::automationEditor( void ) : m_zoomingXComboBox = new comboBox( m_toolBar ); m_zoomingXComboBox->setFixedSize( 80, 22 ); - comboBoxModel * zoom_x_model = new comboBoxModel( /* this */ ); for( int i = 0; i < 6; ++i ) { - zoom_x_model->addItem( QString::number( 25 << i ) + "%" ); + m_zoomingXModel.addItem( QString::number( 25 << i ) + "%" ); } - zoom_x_model->setValue( zoom_x_model->findText( "100%" ) ); + m_zoomingXModel.setValue( m_zoomingXModel.findText( "100%" ) ); - m_zoomingXComboBox->setModel( zoom_x_model ); + m_zoomingXComboBox->setModel( &m_zoomingXModel ); - connect( m_zoomingXComboBox, SIGNAL( activated( const QString & ) ), - this, SLOT( zoomingXChanged( const QString & ) ) ); + connect( &m_zoomingXModel, SIGNAL( dataChanged() ), + this, SLOT( zoomingXChanged() ) ); QLabel * zoom_y_lbl = new QLabel( m_toolBar ); @@ -284,18 +287,17 @@ automationEditor::automationEditor( void ) : m_zoomingYComboBox = new comboBox( m_toolBar ); m_zoomingYComboBox->setFixedSize( 80, 22 ); - comboBoxModel * zoom_y_model = new comboBoxModel( /* this */ ); - zoom_y_model->addItem( "Auto" ); + m_zoomingYModel.addItem( "Auto" ); for( int i = 0; i < 6; ++i ) { - zoom_y_model->addItem( QString::number( 25 << i ) + "%" ); + m_zoomingYModel.addItem( QString::number( 25 << i ) + "%" ); } - zoom_y_model->setValue( zoom_y_model->findText( "Auto" ) ); + m_zoomingYModel.setValue( m_zoomingYModel.findText( "Auto" ) ); - m_zoomingYComboBox->setModel( zoom_y_model ); + m_zoomingYComboBox->setModel( &m_zoomingYModel ); - connect( m_zoomingYComboBox, SIGNAL( activated( const QString & ) ), - this, SLOT( zoomingYChanged( const QString & ) ) ); + connect( &m_zoomingYModel, SIGNAL( dataChanged() ), + this, SLOT( zoomingYChanged() ) ); // setup quantize-stuff @@ -1996,9 +1998,10 @@ void automationEditor::updatePosition( const midiTime & _t ) -void automationEditor::zoomingXChanged( const QString & _zfac ) +void automationEditor::zoomingXChanged( void ) { - m_ppt = _zfac.left( _zfac.length() - 1 ).toInt() * DEFAULT_PPT / 100; + const QString & zfac = m_zoomingXModel.currentText(); + m_ppt = zfac.left( zfac.length() - 1 ).toInt() * DEFAULT_PPT / 100; #ifdef LMMS_DEBUG assert( m_ppt > 0 ); #endif @@ -2009,12 +2012,13 @@ void automationEditor::zoomingXChanged( const QString & _zfac ) -void automationEditor::zoomingYChanged( const QString & _zfac ) +void automationEditor::zoomingYChanged( void ) { - m_y_auto = _zfac == "Auto"; + const QString & zfac = m_zoomingYModel.currentText(); + m_y_auto = zfac == "Auto"; if( !m_y_auto ) { - m_y_delta = _zfac.left( _zfac.length() - 1 ).toInt() + m_y_delta = zfac.left( zfac.length() - 1 ).toInt() * DEFAULT_Y_DELTA / 100; } #ifdef LMMS_DEBUG diff --git a/src/core/piano_roll.cpp b/src/core/piano_roll.cpp index 6aadf3eda..dcecf533e 100644 --- a/src/core/piano_roll.cpp +++ b/src/core/piano_roll.cpp @@ -48,6 +48,7 @@ #include +#include "automatable_model_templates.h" #include "clipboard.h" #include "combobox.h" #include "debug.h" diff --git a/src/core/song.cpp b/src/core/song.cpp index d9dff6d61..50ee94962 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -42,6 +42,8 @@ #include "automation_track.h" +#include "automatable_model_templates.h" +#include "automation_editor.h" #include "bb_editor.h" #include "bb_track.h" #include "config_mgr.h" diff --git a/src/core/track.cpp b/src/core/track.cpp index 515ffd3b6..4348e2d2f 100644 --- a/src/core/track.cpp +++ b/src/core/track.cpp @@ -37,7 +37,7 @@ #include -//#include "automation_pattern.h" +#include "automation_pattern.h" #include "automation_track.h" #include "bb_editor.h" #include "bb_track.h" From 93e247faf0d09ac4cf9c9b54d6d39f1852926ee2 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 25 Feb 2008 14:09:23 +0000 Subject: [PATCH 67/87] fixed wrong index for saving/restoring modulation-algo-settings - now projects sound like they did in pre-MV git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@707 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 4 ++++ plugins/triple_oscillator/triple_oscillator.cpp | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0995155d1..7e5414b51 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2008-02-25 Tobias Doerffel + * plugins/triple_oscillator/triple_oscillator.cpp: + fixed wrong index for saving/restoring modulation-algo-settings - + now projects sound like they did in pre-MV + * include/automation_editor.h: * include/combobox.h: * src/core/song.cpp: diff --git a/plugins/triple_oscillator/triple_oscillator.cpp b/plugins/triple_oscillator/triple_oscillator.cpp index c5e408c96..0cd0a1bc0 100644 --- a/plugins/triple_oscillator/triple_oscillator.cpp +++ b/plugins/triple_oscillator/triple_oscillator.cpp @@ -261,7 +261,7 @@ void tripleOscillator::saveSettings( QDomDocument & _doc, QDomElement & _this ) m_osc[i]->m_waveShapeModel.saveSettings( _doc, _this, "wavetype" + is ); m_osc[i]->m_modulationAlgoModel.saveSettings( _doc, _this, - "modalgo" + is ); + "modalgo" + QString( i+1 ) ); _this.setAttribute( "userwavefile" + is, m_osc[i]->m_sampleBuffer->audioFile() ); } @@ -274,7 +274,7 @@ void tripleOscillator::loadSettings( const QDomElement & _this ) { for( int i = 0; i < NUM_OF_OSCILLATORS; ++i ) { - QString is = QString::number( i ); + const QString is = QString::number( i ); m_osc[i]->m_volumeModel.loadSettings( _this, "vol" + is ); m_osc[i]->m_panModel.loadSettings( _this, "pan" + is ); m_osc[i]->m_coarseModel.loadSettings( _this, "coarse" + is ); @@ -287,7 +287,7 @@ void tripleOscillator::loadSettings( const QDomElement & _this ) m_osc[i]->m_waveShapeModel.loadSettings( _this, "wavetype" + is ); m_osc[i]->m_modulationAlgoModel.loadSettings( _this, - "modalgo" + is ); + "modalgo" + QString::number( i+1 ) ); m_osc[i]->m_sampleBuffer->setAudioFile( _this.attribute( "userwavefile" + is ) ); } From 7c2e4111a85a3a3696ec7e1c87889f69a60f7e92 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 25 Feb 2008 14:12:06 +0000 Subject: [PATCH 68/87] cleanups git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@708 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/oscillator.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/include/oscillator.h b/include/oscillator.h index 45d087a86..ad3a4c788 100644 --- a/include/oscillator.h +++ b/include/oscillator.h @@ -89,13 +89,6 @@ public: void update( sampleFrame * _ab, const fpp_t _frames, const ch_cnt_t _chnl ); -/*#define FLOAT_TO_INT(in,out) \ - register const float round_const = -0.5f; \ - __asm__ __volatile__ ("fadd %%st,%%st(0)\n" \ - "fadd %2\n" \ - "fistpl %0\n" \ - "shrl $1,%0" : "=m" (out) : "t" (in),"m"(round_const) : "st") ;*/ - // now follow the wave-shape-routines... static inline sample_t sinSample( const float _sample ) From bd72070aa0a72f86da6414e3f00ab2a7ae3303f0 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 25 Feb 2008 14:12:25 +0000 Subject: [PATCH 69/87] fixed tag-renaming-loops git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@709 0778d3d1-df1d-0410-868b-ea421aaaa00d --- src/lib/mmp.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/lib/mmp.cpp b/src/lib/mmp.cpp index 44ef7f3df..5eace5c53 100644 --- a/src/lib/mmp.cpp +++ b/src/lib/mmp.cpp @@ -556,18 +556,18 @@ void multimediaProject::upgrade( void ) if( version < "0.3.0" ) { - QDomNodeList list = elementsByTagName( "pluckedstringsynth" ); - for( int i = 0; !list.item( i ).isNull(); ++i ) + QDomNodeList list; + while( !( list = elementsByTagName( + "pluckedstringsynth" ) ).isEmpty() ) { - QDomElement el = list.item( i ).toElement(); + QDomElement el = list.item( 0 ).toElement(); el.setTagName( "vibedstrings" ); el.setAttribute( "active0", 1 ); } - list = elementsByTagName( "lb303" ); - for( int i = 0; !list.item( i ).isNull(); ++i ) + while( !( list = elementsByTagName( "lb303" ) ).isEmpty() ) { - QDomElement el = list.item( i ).toElement(); + QDomElement el = list.item( 0 ).toElement(); el.setTagName( "lb302" ); } } @@ -585,15 +585,14 @@ void multimediaProject::upgrade( void ) } } } - if( version < "0.4.0-svn20080118" ) { - QDomNodeList list = elementsByTagName( "fx" ); - for( int i = 0; !list.item( i ).isNull(); ++i ) + QDomNodeList list; + while( !( list = elementsByTagName( "fx" ) ).isEmpty() ) { - QDomElement fxchain = list.item( i ).toElement(); + QDomElement fxchain = list.item( 0 ).toElement(); fxchain.setTagName( "fxchain" ); - QDomNode rack = list.item( i ).firstChild(); + QDomNode rack = list.item( 0 ).firstChild(); QDomNodeList effects = rack.childNodes(); // move items one level up while( effects.count() ) @@ -624,6 +623,7 @@ void multimediaProject::upgrade( void ) { m_head.setAttribute( "mastervol", 100 ); } +//printf("%s\n", toString( 2 ).toAscii().constData()); } From 980f133b432aa898d057a8d86565cf7044c400a8 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 25 Feb 2008 14:12:49 +0000 Subject: [PATCH 70/87] instantiate automation-pattern before loading settings of it - fixes crashes when loading projects with automation inside git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@710 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/automatable_model_templates.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/automatable_model_templates.h b/include/automatable_model_templates.h index ab5bb2add..18691ed00 100644 --- a/include/automatable_model_templates.h +++ b/include/automatable_model_templates.h @@ -309,7 +309,7 @@ void automatableModel::loadSettings( const QString & _name ) { QDomNode node = _this.namedItem( automationPattern::classNodeName() ); - if( node.isElement() ) + if( node.isElement() && getAutomationPattern() ) { node = node.namedItem( _name ); if( node.isElement() ) From fec4e7f5f92ba060d472fd8faf81823d351890da Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 25 Feb 2008 14:13:23 +0000 Subject: [PATCH 71/87] track-window-creation on-demand - makes loading/unloading projects ultra-fastsvn diff git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@711 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 15 +++++++++++++ include/instrument_track.h | 6 ++---- src/tracks/instrument_track.cpp | 38 +++++++++++++++++++++++++++------ 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7e5414b51..6d0a3ad53 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,20 @@ 2008-02-25 Tobias Doerffel + * include/oscillator.h: + cleanups + + * src/lib/mmp.cpp: + fixed tag-renaming-loops + + * include/automatable_model_templates.h: + instantiate automation-pattern before loading settings of it - fixes + crashes when loading projects with automation inside + + * include/instrument_track.h: + * src/tracks/instrument_track.cpp: + track-window-creation on-demand - makes loading/unloading projects + ultra-fast!! + * plugins/triple_oscillator/triple_oscillator.cpp: fixed wrong index for saving/restoring modulation-algo-settings - now projects sound like they did in pre-MV diff --git a/include/instrument_track.h b/include/instrument_track.h index 0d1242fd0..544e04958 100644 --- a/include/instrument_track.h +++ b/include/instrument_track.h @@ -206,10 +206,7 @@ public: instrumentTrackView( instrumentTrack * _it, trackContainerView * _tc ); virtual ~instrumentTrackView(); - instrumentTrackWindow * getInstrumentTrackWindow( void ) - { - return( m_window ); - } + instrumentTrackWindow * getInstrumentTrackWindow( void ); instrumentTrack * model( void ) { @@ -223,6 +220,7 @@ public: private slots: + void toggledInstrumentTrackButton( bool _on ); void activityIndicatorPressed( void ); void activityIndicatorReleased( void ); diff --git a/src/tracks/instrument_track.cpp b/src/tracks/instrument_track.cpp index 5f9f99ce4..e4f29c11d 100644 --- a/src/tracks/instrument_track.cpp +++ b/src/tracks/instrument_track.cpp @@ -762,13 +762,14 @@ void instrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) m_audioPort.getEffects()->restoreState( node.toElement() ); } - else if( automationPattern::classNodeName() - != node.nodeName() ) + else if( automationPattern::classNodeName() != + node.nodeName() ) { // if node-name doesn't match any known one, // we assume that it is an instrument-plugin // which we'll try to load delete m_instrument; + m_instrument = NULL; m_instrument = instrument::instantiate( node.nodeName(), this ); if( m_instrument->nodeName() == @@ -831,7 +832,8 @@ void instrumentTrack::invalidateAllMyNPH( void ) instrumentTrackView::instrumentTrackView( instrumentTrack * _it, trackContainerView * _tcv ) : - trackView( _it, _tcv ) + trackView( _it, _tcv ), + m_window( NULL ) { setAcceptDrops( TRUE ); setFixedHeight( 32 ); @@ -910,9 +912,8 @@ instrumentTrackView::instrumentTrackView( instrumentTrack * _it, setModel( _it ); - m_window = new instrumentTrackWindow( this ); connect( m_tswInstrumentTrackButton, SIGNAL( toggled( bool ) ), - m_window, SLOT( toggledInstrumentTrackButton( bool ) ) ); + this, SLOT( toggledInstrumentTrackButton( bool ) ) ); } @@ -927,6 +928,28 @@ instrumentTrackView::~instrumentTrackView() +instrumentTrackWindow * instrumentTrackView::getInstrumentTrackWindow( void ) +{ + if( m_window == NULL ) + { + m_window = new instrumentTrackWindow( this ); + connect( m_tswInstrumentTrackButton, SIGNAL( toggled( bool ) ), + this, SLOT( toggledInstrumentTrackButton( bool ) ) ); + } + return( m_window ); +} + + + + +void instrumentTrackView::toggledInstrumentTrackButton( bool _on ) +{ + getInstrumentTrackWindow()->toggledInstrumentTrackButton( _on ); +} + + + + void instrumentTrackView::activityIndicatorPressed( void ) { model()->processInEvent( midiEvent( NOTE_ON, 0, @@ -1418,7 +1441,8 @@ void instrumentTrackButton::paintEvent( QPaintEvent * _pe ) void instrumentTrackButton::dragEnterEvent( QDragEnterEvent * _dee ) { - m_instrumentTrackView->m_window->dragEnterEvent( _dee ); + m_instrumentTrackView->getInstrumentTrackWindow()-> + dragEnterEvent( _dee ); } @@ -1426,7 +1450,7 @@ void instrumentTrackButton::dragEnterEvent( QDragEnterEvent * _dee ) void instrumentTrackButton::dropEvent( QDropEvent * _de ) { - m_instrumentTrackView->m_window->dropEvent( _de ); + m_instrumentTrackView->getInstrumentTrackWindow()->dropEvent( _de ); setChecked( TRUE ); } From a5010428f84623d9daba4b0eba799577055b7535 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 25 Feb 2008 21:27:58 +0000 Subject: [PATCH 72/87] fixed various crashes when removing instrument-track with visible instrument-track-window or loading another instrument/preset git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@712 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 10 ++++++++++ include/instrument_track.h | 1 + include/instrument_view.h | 4 ++++ src/core/instrument.cpp | 23 +++++++++++++++++------ src/tracks/instrument_track.cpp | 4 ++++ src/widgets/automatable_button.cpp | 3 +-- src/widgets/group_box.cpp | 1 + src/widgets/instrument_function_views.cpp | 3 +++ 8 files changed, 41 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6d0a3ad53..6948d7969 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2008-02-25 Tobias Doerffel + * include/instrument_view.h: + * include/instrument_track.h: + * src/widgets/instrument_function_views.cpp: + * src/widgets/group_box.cpp: + * src/widgets/automatable_button.cpp: + * src/tracks/instrument_track.cpp: + fixed various crashes when removing instrument-track with visible + instrument-track-window or loading another instrument/preset + + * src/core/instrument.cpp: * include/oscillator.h: cleanups diff --git a/include/instrument_track.h b/include/instrument_track.h index 544e04958..8325c065c 100644 --- a/include/instrument_track.h +++ b/include/instrument_track.h @@ -318,6 +318,7 @@ private: QAction * m_midiOutputAction; friend class instrumentTrackButton; + friend class instrumentView; } ; diff --git a/include/instrument_view.h b/include/instrument_view.h index b771a1ec5..987c643d1 100644 --- a/include/instrument_view.h +++ b/include/instrument_view.h @@ -29,6 +29,8 @@ #include "instrument.h" #include "plugin_view.h" +class instrumentTrackWindow; + class instrumentView : public pluginView { @@ -48,6 +50,8 @@ public: virtual void setModel( ::model * _model, bool = FALSE ); + instrumentTrackWindow * getInstrumentTrackWindow( void ); + } ; diff --git a/src/core/instrument.cpp b/src/core/instrument.cpp index e2037e3a6..350f8481f 100644 --- a/src/core/instrument.cpp +++ b/src/core/instrument.cpp @@ -139,6 +139,7 @@ instrumentView::instrumentView( instrument * _instrument, QWidget * _parent ) : { setModel( _instrument ); setFixedSize( 250, 250 ); + setAttribute( Qt::WA_DeleteOnClose, TRUE ); } @@ -146,24 +147,34 @@ instrumentView::instrumentView( instrument * _instrument, QWidget * _parent ) : instrumentView::~instrumentView() { + if( getInstrumentTrackWindow() ) + { + getInstrumentTrackWindow()->m_instrumentView = NULL; + } } + void instrumentView::setModel( ::model * _model, bool ) { if( dynamic_cast( _model ) != NULL ) { modelView::setModel( _model ); - if( dynamic_cast( parentWidget() ) != - NULL ) - { - dynamic_cast( parentWidget() )-> - setWindowIcon( *( model()-> + getInstrumentTrackWindow()->setWindowIcon( *( model()-> getDescriptor()->logo ) ); - } + connect( model(), SIGNAL( destroyed( QObject * ) ), + this, SLOT( close() ) ); } } + + +instrumentTrackWindow * instrumentView::getInstrumentTrackWindow( void ) +{ + return( dynamic_cast( + parentWidget()->parentWidget() ) ); +} + #endif diff --git a/src/tracks/instrument_track.cpp b/src/tracks/instrument_track.cpp index e4f29c11d..483b7d019 100644 --- a/src/tracks/instrument_track.cpp +++ b/src/tracks/instrument_track.cpp @@ -145,6 +145,7 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) : instrumentTrack::~instrumentTrack() { + delete m_instrument; engine::getMixer()->removePlayHandles( this ); engine::getMixer()->getMIDIClient()->removePort( m_midiPort ); } @@ -778,6 +779,7 @@ void instrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) m_instrument->restoreState( node.toElement() ); } + emit instrumentChanged(); } } node = node.nextSibling(); @@ -1146,6 +1148,7 @@ instrumentTrackWindow::instrumentTrackWindow( instrumentTrackView * _itv ) : instrumentTrackWindow::~instrumentTrackWindow() { + delete m_instrumentView; if( engine::getMainWindow()->workspace() ) { parentWidget()->hide(); @@ -1167,6 +1170,7 @@ void instrumentTrackWindow::modelChanged( void ) this, SLOT( updateInstrumentView() ), Qt::QueuedConnection ); m_volumeKnob->setModel( &m_track->m_volumeModel ); + m_volumeKnob->setModel( &m_track->m_volumeModel ); m_surroundArea->setModel( &m_track->m_surroundAreaModel ); m_pianoView->setModel( &m_track->m_piano ); diff --git a/src/widgets/automatable_button.cpp b/src/widgets/automatable_button.cpp index 2a127e1a6..d27179c09 100644 --- a/src/widgets/automatable_button.cpp +++ b/src/widgets/automatable_button.cpp @@ -207,8 +207,6 @@ void automatableButtonGroup::removeButton( automatableButton * _btn ) { m_buttons.erase( qFind( m_buttons.begin(), m_buttons.end(), _btn ) ); _btn->m_group = NULL; - - model()->setRange( 0, m_buttons.size() - 1 ); } @@ -243,6 +241,7 @@ void automatableButtonGroup::modelChanged( void ) void automatableButtonGroup::updateButtons( void ) { + model()->setRange( 0, m_buttons.size() - 1 ); int i = 0; foreach( automatableButton * btn, m_buttons ) { diff --git a/src/widgets/group_box.cpp b/src/widgets/group_box.cpp index 0c84236b9..aa3cf4443 100644 --- a/src/widgets/group_box.cpp +++ b/src/widgets/group_box.cpp @@ -77,6 +77,7 @@ groupBox::groupBox( const QString & _caption, QWidget * _parent ) : groupBox::~groupBox() { + delete m_led; } diff --git a/src/widgets/instrument_function_views.cpp b/src/widgets/instrument_function_views.cpp index 0a025746a..d4e758d3c 100644 --- a/src/widgets/instrument_function_views.cpp +++ b/src/widgets/instrument_function_views.cpp @@ -88,6 +88,7 @@ chordCreatorView::chordCreatorView( chordCreator * _cc, QWidget * _parent ) : chordCreatorView::~chordCreatorView() { + delete m_chordsGroupBox; } @@ -231,6 +232,8 @@ arpeggiatorView::arpeggiatorView( arpeggiator * _arp, QWidget * _parent ) : arpeggiatorView::~arpeggiatorView() { + delete m_arpDirectionBtnGrp; + delete m_arpGroupBox; } From 25c4d3b8ec2cfcb3ef1a34042ef3490cacfc13a4 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 25 Feb 2008 21:29:27 +0000 Subject: [PATCH 73/87] renamed from piano_widget.h git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@713 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/{piano_widget.h => piano.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename include/{piano_widget.h => piano.h} (100%) diff --git a/include/piano_widget.h b/include/piano.h similarity index 100% rename from include/piano_widget.h rename to include/piano.h From 74b6a987d6f811670e86f412b1c5a2528b7b524f Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 25 Feb 2008 21:30:09 +0000 Subject: [PATCH 74/87] renamed from piano_widget.cpp git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@714 0778d3d1-df1d-0410-868b-ea421aaaa00d --- src/core/{piano_widget.cpp => piano.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/core/{piano_widget.cpp => piano.cpp} (100%) diff --git a/src/core/piano_widget.cpp b/src/core/piano.cpp similarity index 100% rename from src/core/piano_widget.cpp rename to src/core/piano.cpp From 20d9f3e67174e771fb341af3381babf51a49230d Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 25 Feb 2008 21:35:45 +0000 Subject: [PATCH 75/87] renamed piano_widget.{h,cpp} to piano.{h,cpp} git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@715 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 8 ++++++++ Makefile.am | 6 +++--- include/instrument_track.h | 2 +- include/piano.h | 7 +++---- src/core/piano.cpp | 8 ++++---- src/core/piano_roll.cpp | 2 +- src/tracks/instrument_track.cpp | 1 - 7 files changed, 20 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6948d7969..ebc283cc1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2008-02-25 Tobias Doerffel + * include/instrument_track.h: + * include/piano.h: + * src/tracks/instrument_track.cpp: + * src/core/piano_roll.cpp: + * src/core/piano.cpp: + * Makefile.am: + renamed piano_widget.{h,cpp} to piano.{h,cpp} + * include/instrument_view.h: * include/instrument_track.h: * src/widgets/instrument_function_views.cpp: diff --git a/Makefile.am b/Makefile.am index ff26fdef2..0884e7991 100644 --- a/Makefile.am +++ b/Makefile.am @@ -86,7 +86,7 @@ lmms_MOC = \ ./instrument_midi_io.moc \ ./pattern.moc \ ./piano_roll.moc \ - ./piano_widget.moc \ + ./piano.moc \ ./pixmap_button.moc \ ./plugin_browser.moc \ ./project_notes.moc \ @@ -182,7 +182,7 @@ lmms_SOURCES = \ $(srcdir)/src/core/note.cpp \ $(srcdir)/src/core/note_play_handle.cpp \ $(srcdir)/src/core/piano_roll.cpp \ - $(srcdir)/src/core/piano_widget.cpp \ + $(srcdir)/src/core/piano.cpp \ $(srcdir)/src/core/plugin.cpp \ $(srcdir)/src/core/plugin_browser.cpp \ $(srcdir)/src/core/preset_preview_play_handle.cpp \ @@ -285,7 +285,7 @@ lmms_SOURCES = \ $(srcdir)/include/instrument.h \ $(srcdir)/include/instrument_view.h \ $(srcdir)/include/bb_editor.h \ - $(srcdir)/include/piano_widget.h \ + $(srcdir)/include/piano.h \ $(srcdir)/include/effect_board.h \ $(srcdir)/include/pixmap_button.h \ $(srcdir)/include/rename_dialog.h \ diff --git a/include/instrument_track.h b/include/instrument_track.h index 8325c065c..2f7eaa560 100644 --- a/include/instrument_track.h +++ b/include/instrument_track.h @@ -37,7 +37,7 @@ #include "lcd_spinbox.h" #include "midi_event_processor.h" #include "mixer.h" -#include "piano_widget.h" +#include "piano.h" #include "effect_chain.h" #include "surround_area.h" #include "tab_widget.h" diff --git a/include/piano.h b/include/piano.h index e3544e8ef..d6d9fcbad 100644 --- a/include/piano.h +++ b/include/piano.h @@ -1,6 +1,5 @@ /* - * piano_widget.h - declaration of class pianoView, a widget which provides - * an interactive piano/keyboard-widget + * piano.h - piano and pianoView, an interactive piano/keyboard-widget * * Copyright (c) 2004-2008 Tobias Doerffel * @@ -24,8 +23,8 @@ */ -#ifndef _PIANO_WIDGET_H -#define _PIANO_WIDGET_H +#ifndef _PIANO_H +#define _PIANO_H #include #include diff --git a/src/core/piano.cpp b/src/core/piano.cpp index 0fe5a7627..a374687d4 100644 --- a/src/core/piano.cpp +++ b/src/core/piano.cpp @@ -1,8 +1,8 @@ #ifndef SINGLE_SOURCE_COMPILE /* - * piano_widget.cpp - implementation of piano-widget used in channel-window - * for testing channel + * piano.cpp - implementation of piano-widget used in instrument-track-window + * for testing * * Copyright (c) 2004-2008 Tobias Doerffel * @@ -26,7 +26,7 @@ */ -#include "piano_widget.h" +#include "piano.h" #include @@ -709,7 +709,7 @@ bool pianoView::x11Event( XEvent * _xe ) -#include "piano_widget.moc" +#include "piano.moc" #endif diff --git a/src/core/piano_roll.cpp b/src/core/piano_roll.cpp index dcecf533e..f6081ee46 100644 --- a/src/core/piano_roll.cpp +++ b/src/core/piano_roll.cpp @@ -60,7 +60,7 @@ #include "midi.h" #include "mmp.h" #include "pattern.h" -#include "piano_widget.h" +#include "piano.h" #include "pixmap_button.h" #include "song.h" #include "song_editor.h" diff --git a/src/tracks/instrument_track.cpp b/src/tracks/instrument_track.cpp index 483b7d019..b6633d8f4 100644 --- a/src/tracks/instrument_track.cpp +++ b/src/tracks/instrument_track.cpp @@ -68,7 +68,6 @@ #include "mmp.h" #include "note_play_handle.h" #include "pattern.h" -#include "piano_widget.h" #include "plugin_view.h" #include "sample_play_handle.h" #include "song.h" From f61c989e7160dc68f4c3e5df365549227f4de11d Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 25 Feb 2008 23:27:48 +0000 Subject: [PATCH 76/87] incorporated recent API-changes git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@716 0778d3d1-df1d-0410-868b-ea421aaaa00d --- plugins/ladspa_browser/ladspa_browser.cpp | 4 ++-- plugins/ladspa_browser/ladspa_browser.h | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/ladspa_browser/ladspa_browser.cpp b/plugins/ladspa_browser/ladspa_browser.cpp index 4ce460ed0..55b5a7f15 100644 --- a/plugins/ladspa_browser/ladspa_browser.cpp +++ b/plugins/ladspa_browser/ladspa_browser.cpp @@ -97,8 +97,8 @@ QString ladspaBrowser::nodeName( void ) const -ladspaBrowserView::ladspaBrowserView( tool * _tool, QWidget * _parent ) : - toolView( _tool, _parent ) +ladspaBrowserView::ladspaBrowserView( tool * _tool ) : + toolView( _tool ) { QHBoxLayout * hlayout = new QHBoxLayout( this ); hlayout->setSpacing( 0 ); diff --git a/plugins/ladspa_browser/ladspa_browser.h b/plugins/ladspa_browser/ladspa_browser.h index db27616ce..326506e93 100644 --- a/plugins/ladspa_browser/ladspa_browser.h +++ b/plugins/ladspa_browser/ladspa_browser.h @@ -39,7 +39,7 @@ class ladspaBrowserView : public toolView { Q_OBJECT public: - ladspaBrowserView( tool * _tool, QWidget * _parent ); + ladspaBrowserView( tool * _tool ); virtual ~ladspaBrowserView(); @@ -63,9 +63,9 @@ public: ladspaBrowser( void ); virtual ~ladspaBrowser(); - virtual pluginView * instantiateView( QWidget * _parent ) + virtual pluginView * instantiateView( QWidget * ) { - return( new ladspaBrowserView( this, _parent ) ); + return( new ladspaBrowserView( this ) ); } virtual QString nodeName( void ) const; From 4a9e843715560493d8598dad532056005989aad1 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 25 Feb 2008 23:28:08 +0000 Subject: [PATCH 77/87] splitted into meterModel and meterDialog git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@717 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/meter_dialog.h | 37 +++++++++++----- src/core/meter_dialog.cpp | 93 ++++++++++++++++++++++++--------------- 2 files changed, 84 insertions(+), 46 deletions(-) diff --git a/include/meter_dialog.h b/include/meter_dialog.h index 5fdba0d3d..013ce5e7c 100644 --- a/include/meter_dialog.h +++ b/include/meter_dialog.h @@ -1,7 +1,7 @@ /* * meter_dialog.h - dialog for entering meter settings * - * Copyright (c) 2006-2007 Danny McRae + * Copyright (c) 2006-2008 Danny McRae * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -30,12 +30,12 @@ #include "lcd_spinbox.h" -class meterDialog : public QWidget +class meterModel : public model { Q_OBJECT public: - meterDialog( QWidget * _parent, track * _track ); - ~meterDialog(); + meterModel( ::model * _parent, track * _track ); + ~meterModel(); void saveSettings( QDomDocument & _doc, QDomElement & _this, const QString & _name ); @@ -44,26 +44,43 @@ public: inline int getNumerator( void ) { - return( m_numeratorModel->value() ); + return( m_numeratorModel.value() ); } inline int getDenominator( void ) { - return( m_denominatorModel->value() ); + return( m_denominatorModel.value() ); } private: - lcdSpinBox * m_numerator; - lcdSpinBox * m_denominator; - lcdSpinBoxModel * m_numeratorModel; - lcdSpinBoxModel * m_denominatorModel; + lcdSpinBoxModel m_numeratorModel; + lcdSpinBoxModel m_denominatorModel; signals: void numeratorChanged( void ); void denominatorChanged( void ); + + friend class meterDialog; + +} ; + + +class meterDialog : public QWidget, public modelView +{ +public: + meterDialog( QWidget * _parent ); + ~meterDialog(); + + virtual void modelChanged( void ); + + +private: + lcdSpinBox * m_numerator; + lcdSpinBox * m_denominator; + } ; #endif diff --git a/src/core/meter_dialog.cpp b/src/core/meter_dialog.cpp index 1c85be4d2..ead0eb36b 100644 --- a/src/core/meter_dialog.cpp +++ b/src/core/meter_dialog.cpp @@ -34,10 +34,54 @@ #include "automatable_model_templates.h" -meterDialog::meterDialog( QWidget * _parent, track * _track ): +meterModel::meterModel( ::model * _parent, track * _track ) : + model( _parent ), + m_numeratorModel( 4, 1, 32, 1, this ), + m_denominatorModel( 4, 1, 32, 1, this ) +{ + m_numeratorModel.setTrack( _track ); + m_denominatorModel.setTrack( _track ); + + connect( &m_numeratorModel, SIGNAL( dataChanged() ), + this, SIGNAL( numeratorChanged() ) ); + connect( &m_denominatorModel, SIGNAL( dataChanged() ), + this, SIGNAL( denominatorChanged() ) ); +} + + + + +meterModel::~meterModel() +{ +} + + + + +void meterModel::saveSettings( QDomDocument & _doc, QDomElement & _this, + const QString & _name ) +{ + m_numeratorModel.saveSettings( _doc, _this, _name + "_numerator" ); + m_denominatorModel.saveSettings( _doc, _this, _name + "_denominator" ); +} + + + + +void meterModel::loadSettings( const QDomElement & _this, + const QString & _name ) +{ + m_numeratorModel.loadSettings( _this, _name + "_numerator" ); + m_denominatorModel.loadSettings( _this, _name + "_denominator" ); +} + + + + + +meterDialog::meterDialog( QWidget * _parent ) : QWidget( _parent ), - m_numeratorModel( new lcdSpinBoxModel( /* this */ ) ), - m_denominatorModel( new lcdSpinBoxModel( /* this */ ) ) + modelView( NULL ) { QVBoxLayout * vlayout = new QVBoxLayout( this ); vlayout->setSpacing( 5 ); @@ -46,17 +90,11 @@ meterDialog::meterDialog( QWidget * _parent, track * _track ): QWidget * num = new QWidget( this ); QHBoxLayout * num_layout = new QHBoxLayout( num ); - num_layout->setSpacing( 10 ); + num_layout->setSpacing( 0 ); + num_layout->setMargin( 0 ); - m_numeratorModel->setTrack( _track ); - m_numeratorModel->setRange( 1, 32 ); - m_numeratorModel->setValue( 4 ); - connect( m_numeratorModel, SIGNAL( dataChanged() ), - this, SIGNAL( numeratorChanged() ) ); - m_numerator = new lcdSpinBox( 2, num, tr( "Meter Numerator" ) ); - m_numerator->setModel( m_numeratorModel ); num_layout->addWidget( m_numerator ); @@ -66,19 +104,13 @@ meterDialog::meterDialog( QWidget * _parent, track * _track ): num_label->setFont( pointSize<7>( f ) ); num_layout->addWidget( num_label ); - + QWidget * den = new QWidget( this ); QHBoxLayout * den_layout = new QHBoxLayout( den ); - den_layout->setSpacing( 10 ); - - m_denominatorModel->setTrack( _track ); - m_denominatorModel->setRange( 1, 32 ); - m_denominatorModel->setValue( 4 ); - connect( m_denominatorModel, SIGNAL( dataChanged() ), - this, SIGNAL( denominatorChanged() ) ); + den_layout->setSpacing( 0 ); + den_layout->setMargin( 0 ); m_denominator = new lcdSpinBox( 2, den, tr( "Meter Denominator" ) ); - m_denominator->setModel( m_denominatorModel ); den_layout->addWidget( m_denominator ); @@ -91,7 +123,7 @@ meterDialog::meterDialog( QWidget * _parent, track * _track ): vlayout->addWidget( num ); vlayout->addWidget( den ); - setFixedSize( den_label->width() + m_denominator->width() + 10, + resize( den_label->width() + m_denominator->width() + 10, m_numerator->height() + m_denominator->height() + 15 ); } @@ -105,25 +137,14 @@ meterDialog::~meterDialog() -void meterDialog::saveSettings( QDomDocument & _doc, QDomElement & _this, - const QString & _name ) +void meterDialog::modelChanged( void ) { - m_numeratorModel->saveSettings( _doc, _this, _name + "_numerator" ); - m_denominatorModel->saveSettings( _doc, _this, _name + "_denominator" ); + meterModel * mm = castModel(); + m_numerator->setModel( &mm->m_numeratorModel ); + m_denominator->setModel( &mm->m_denominatorModel ); } - - -void meterDialog::loadSettings( const QDomElement & _this, - const QString & _name ) -{ - m_numeratorModel->loadSettings( _this, _name + "_numerator" ); - m_denominatorModel->loadSettings( _this, _name + "_denominator" ); -} - - - #include "meter_dialog.moc" #endif From 4bf2bccb2934bea0656be9f7e7bb5733affa5ed9 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 25 Feb 2008 23:28:24 +0000 Subject: [PATCH 78/87] renamed piano_widget.{h,cpp} to piano.{h,cpp} git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@718 0778d3d1-df1d-0410-868b-ea421aaaa00d --- plugins/flp_import/flp_import.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/flp_import/flp_import.cpp b/plugins/flp_import/flp_import.cpp index 4f1a9c357..011b100e1 100644 --- a/plugins/flp_import/flp_import.cpp +++ b/plugins/flp_import/flp_import.cpp @@ -44,7 +44,7 @@ #include "knob.h" #include "oscillator.h" #include "pattern.h" -#include "piano_widget.h" +#include "piano.h" #include "project_journal.h" #include "project_notes.h" #include "song.h" From b5c9a367857d85168439a99f8ba8aa712cd43518 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 25 Feb 2008 23:28:55 +0000 Subject: [PATCH 79/87] splitted tempoSyncKnob into tempoSyncKnobModel and tempoSyncKnob git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@719 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 20 + include/effect.h | 3 +- include/envelope_and_lfo_parameters.h | 3 +- include/instrument_functions.h | 3 +- include/tempo_sync_knob.h | 95 +++-- src/core/effect.cpp | 2 +- src/core/envelope_and_lfo_parameters.cpp | 2 +- src/core/instrument_functions.cpp | 2 +- src/widgets/envelope_and_lfo_view.cpp | 2 +- src/widgets/tempo_sync_knob.cpp | 464 +++++++++++++---------- 10 files changed, 357 insertions(+), 239 deletions(-) diff --git a/ChangeLog b/ChangeLog index ebc283cc1..0691ec5e4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,25 @@ 2008-02-25 Tobias Doerffel + * plugins/ladspa_browser/ladspa_browser.cpp: + * plugins/ladspa_browser/ladspa_browser.h: + incorporated recent API-changes + + * include/effect.h: + * include/instrument_functions.h: + * include/envelope_and_lfo_parameters.h: + * include/tempo_sync_knob.h: + * src/widgets/envelope_and_lfo_view.cpp: + * src/widgets/tempo_sync_knob.cpp: + * src/core/envelope_and_lfo_parameters.cpp: + * src/core/effect.cpp: + * src/core/instrument_functions.cpp: + splitted tempoSyncKnob into tempoSyncKnobModel and tempoSyncKnob + + * include/meter_dialog.h: + * src/core/meter_dialog.cpp: + splitted into meterModel and meterDialog + + * plugins/flp_import/flp_import.cpp: * include/instrument_track.h: * include/piano.h: * src/tracks/instrument_track.cpp: diff --git a/include/effect.h b/include/effect.h index 65d0120bb..7993ce3c0 100644 --- a/include/effect.h +++ b/include/effect.h @@ -37,6 +37,7 @@ #include "engine.h" #include "mixer.h" #include "automatable_model.h" +#include "tempo_sync_knob.h" class effectChain; @@ -185,7 +186,7 @@ private: boolModel m_enabledModel; floatModel m_wetDryModel; floatModel m_gateModel; - floatModel m_autoQuitModel; + tempoSyncKnobModel m_autoQuitModel; friend class effectView; diff --git a/include/envelope_and_lfo_parameters.h b/include/envelope_and_lfo_parameters.h index fe6f6ba25..358768965 100644 --- a/include/envelope_and_lfo_parameters.h +++ b/include/envelope_and_lfo_parameters.h @@ -31,6 +31,7 @@ #include "journalling_object.h" #include "automatable_model.h" #include "sample_buffer.h" +#include "tempo_sync_knob.h" #include "types.h" @@ -117,7 +118,7 @@ private: floatModel m_lfoPredelayModel; floatModel m_lfoAttackModel; - floatModel m_lfoSpeedModel; + tempoSyncKnobModel m_lfoSpeedModel; floatModel m_lfoAmountModel; intModel m_lfoWaveModel; diff --git a/include/instrument_functions.h b/include/instrument_functions.h index 70a3a22d7..edd753a08 100644 --- a/include/instrument_functions.h +++ b/include/instrument_functions.h @@ -29,6 +29,7 @@ #include "journalling_object.h" #include "types.h" #include "automatable_model.h" +#include "tempo_sync_knob.h" #include "combobox.h" @@ -125,7 +126,7 @@ private: boolModel m_arpEnabledModel; comboBoxModel m_arpModel; floatModel m_arpRangeModel; - floatModel m_arpTimeModel; + tempoSyncKnobModel m_arpTimeModel; floatModel m_arpGateModel; intModel m_arpDirectionModel; comboBoxModel m_arpModeModel; diff --git a/include/tempo_sync_knob.h b/include/tempo_sync_knob.h index af56eb5af..5739bd286 100644 --- a/include/tempo_sync_knob.h +++ b/include/tempo_sync_knob.h @@ -1,7 +1,7 @@ /* * tempo_sync_knob.h - adds bpm to ms conversion for knob class * - * Copyright (c) 2005-2007 Danny McRae + * Copyright (c) 2005-2008 Danny McRae * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -29,38 +29,41 @@ #include #include "knob.h" +#include "meter_dialog.h" class QAction; class meterDialog; -class tempoSyncKnob : public knob + +class tempoSyncKnobModel : public knobModel { Q_OBJECT public: enum tempoSyncMode { - NO_SYNC, - DOUBLE_WHOLE_NOTE, - WHOLE_NOTE, - HALF_NOTE, - QUARTER_NOTE, - EIGHTH_NOTE, - SIXTEENTH_NOTE, - THIRTYSECOND_NOTE, - CUSTOM + SyncNone, + SyncDoubleWholeNote, + SyncWholeNote, + SyncHalfNote, + SyncQuarterNote, + SyncEighthNote, + SyncSixteenthNote, + SyncThirtysecondNote, + SyncCustom } ; - tempoSyncKnob( int _knob_num, QWidget * _parent, const QString & _name, - float _scale = 1.0f ); - virtual ~tempoSyncKnob(); + tempoSyncKnobModel( const float _val, const float _min, + const float _max, const float _step, + const float _scale, ::model * _parent ); + virtual ~tempoSyncKnobModel(); - virtual void FASTCALL saveSettings( QDomDocument & _doc, + virtual void saveSettings( QDomDocument & _doc, QDomElement & _this, const QString & _name ); - virtual void FASTCALL loadSettings( const QDomElement & _this, + virtual void loadSettings( const QDomElement & _this, const QString & _name ); tempoSyncMode getSyncMode( void ); @@ -69,24 +72,62 @@ public: float getScale( void ); void setScale( float _new_scale ); +signals: + void syncModeChanged( tempoSyncMode _new_mode ); + void scaleChanged( float _new_scale ); + + +public slots: + void setTempoSync( int _note_type ); + void setTempoSync( QAction * _item ); + + +protected slots: + void calculateTempoSyncTime( bpm_t _bpm ); + void updateCustom( void ); + + +private: + tempoSyncMode m_tempoSyncMode; + tempoSyncMode m_tempoLastSyncMode; + float m_scale; + + meterModel m_custom; + + + friend class tempoSyncKnob; + +} ; + + + +class tempoSyncKnob : public knob +{ + Q_OBJECT +public: + tempoSyncKnob( int _knob_num, QWidget * _parent, + const QString & _name ); + virtual ~tempoSyncKnob(); + const QString & getSyncDescription( void ); void setSyncDescription( const QString & _new_description ); const QPixmap & getSyncIcon( void ); void setSyncIcon( const QPixmap & _new_pix ); + tempoSyncKnobModel * model( void ) + { + return( castModel() ); + } + + virtual void modelChanged( void ); + + signals: - void syncModeChanged( tempoSyncMode _new_mode ); - void scaleChanged( float _new_scale ); void syncDescriptionChanged( const QString & _new_description ); void syncIconChanged( void ); -public slots: - void setTempoSync( int _note_type ); - void setTempoSync( QAction * _item ); - - protected: virtual void mouseMoveEvent( QMouseEvent * _me ); virtual void contextMenuEvent( QContextMenuEvent * _me ); @@ -94,20 +135,18 @@ protected: protected slots: - void calculateTempoSyncTime( bpm_t _bpm ); - void updateCustom( void ); + void updateDescAndIcon( void ); void showCustom( void ); + private: - tempoSyncMode m_tempoSyncMode; - float m_scale; QPixmap m_tempoSyncIcon; QString m_tempoSyncDescription; - tempoSyncMode m_tempoLastSyncMode; QPointer m_custom; } ; + #endif diff --git a/src/core/effect.cpp b/src/core/effect.cpp index 12d67cb3d..ddbb7f2d8 100644 --- a/src/core/effect.cpp +++ b/src/core/effect.cpp @@ -46,7 +46,7 @@ effect::effect( const plugin::descriptor * _desc, m_enabledModel( TRUE, this ), m_wetDryModel( 1.0f, 0.0f, 1.0f, 0.01f, this ), m_gateModel( 0.0f, 0.0f, 1.0f, 0.01f, this ), - m_autoQuitModel( 1.0f, 1.0f, 8000.0f, 100.0f, this ) + m_autoQuitModel( 1.0f, 1.0f, 8000.0f, 100.0f, 1.0f, this ) { } diff --git a/src/core/envelope_and_lfo_parameters.cpp b/src/core/envelope_and_lfo_parameters.cpp index eaddca887..326b05420 100644 --- a/src/core/envelope_and_lfo_parameters.cpp +++ b/src/core/envelope_and_lfo_parameters.cpp @@ -66,7 +66,7 @@ envelopeAndLFOParameters::envelopeAndLFOParameters( m_rEnv( NULL ), m_lfoPredelayModel( 0.0, 0.0, 1.0, 0.001, this ), m_lfoAttackModel( 0.0, 0.0, 1.0, 0.001, this ), - m_lfoSpeedModel( 0.1, 0.01, 1.0, 0.0001, this ), + m_lfoSpeedModel( 0.1, 0.01, 1.0, 0.0001, 20000.0, this ), m_lfoAmountModel( 0.0, -1.0, 1.0, 0.005, this ), m_lfoWaveModel( SineWave, 0, NumLfoShapes, 1, this ), m_x100Model( FALSE, this ), diff --git a/src/core/instrument_functions.cpp b/src/core/instrument_functions.cpp index f2369766e..f0eaae2e4 100644 --- a/src/core/instrument_functions.cpp +++ b/src/core/instrument_functions.cpp @@ -289,7 +289,7 @@ arpeggiator::arpeggiator( instrumentTrack * _instrument_track ) : m_arpEnabledModel( FALSE ), m_arpModel( this ), m_arpRangeModel( 1.0f, 1.0f, 9.0f, 1.0f, this ), - m_arpTimeModel( 100.0f, 25.0f, 2000.0f, 1.0f, this ), + m_arpTimeModel( 100.0f, 25.0f, 2000.0f, 1.0f, 1.0, this ), m_arpGateModel( 100.0f, 1.0f, 200.0f, 1.0f, this ), m_arpDirectionModel( 0, 0, 0, intModel::defaultRelStep(), this ), m_arpModeModel( this ) diff --git a/src/widgets/envelope_and_lfo_view.cpp b/src/widgets/envelope_and_lfo_view.cpp index f5db2d292..751d57a59 100644 --- a/src/widgets/envelope_and_lfo_view.cpp +++ b/src/widgets/envelope_and_lfo_view.cpp @@ -208,7 +208,7 @@ envelopeAndLFOView::envelopeAndLFOView( QWidget * _parent ) : m_lfoSpeedKnob = new tempoSyncKnob( knobBright_26, this, - tr( "LFO-speed" ), 20000.0 ); + tr( "LFO-speed" ) ); m_lfoSpeedKnob->setLabel( tr( "SPD" ) ); m_lfoSpeedKnob->move( LFO_SPEED_KNOB_X, LFO_KNOB_Y ); m_lfoSpeedKnob->setHintText( tr( "LFO-speed:" ) + " ", "" ); diff --git a/src/widgets/tempo_sync_knob.cpp b/src/widgets/tempo_sync_knob.cpp index fe71b1472..b8d0ca9b5 100644 --- a/src/widgets/tempo_sync_knob.cpp +++ b/src/widgets/tempo_sync_knob.cpp @@ -40,21 +40,183 @@ #include "song.h" -tempoSyncKnob::tempoSyncKnob( int _knob_num, QWidget * _parent, - const QString & _name, - float _scale ) : - knob( _knob_num, _parent, _name ), - m_tempoSyncMode( NO_SYNC ), +tempoSyncKnobModel::tempoSyncKnobModel( const float _val, const float _min, + const float _max, const float _step, + const float _scale, ::model * _parent ) : + knobModel( _val, _min, _max, _step, _parent ), + m_tempoSyncMode( SyncNone ), + m_tempoLastSyncMode( SyncNone ), m_scale( _scale ), - m_tempoSyncIcon( embed::getIconPixmap( "tempo_sync" ) ), - m_tempoSyncDescription( tr( "Tempo Sync" ) ), - m_tempoLastSyncMode( NO_SYNC ) + m_custom( _parent, NULL ) { connect( engine::getSong(), SIGNAL( tempoChanged( bpm_t ) ), this, SLOT( calculateTempoSyncTime( bpm_t ) ) ); - m_custom = new meterDialog( engine::getMainWindow()->workspace(), - NULL ); - m_custom->hide(); +} + + + + +tempoSyncKnobModel::~tempoSyncKnobModel() +{ +} + + + + +void tempoSyncKnobModel::setTempoSync( QAction * _item ) +{ + setTempoSync( _item->data().toInt() ); +} + + + + +void tempoSyncKnobModel::setTempoSync( int _note_type ) +{ + setSyncMode( ( tempoSyncMode ) _note_type ); + engine::getSong()->setModified(); +} + + + + +void tempoSyncKnobModel::calculateTempoSyncTime( bpm_t _bpm ) +{ + float conversionFactor = 1.0; + + if( m_tempoSyncMode ) + { + switch( m_tempoSyncMode ) + { + case SyncCustom: + conversionFactor = + static_cast( m_custom.getDenominator() ) / + static_cast( m_custom.getNumerator() ); + break; + case SyncDoubleWholeNote: + conversionFactor = 0.125; + break; + case SyncWholeNote: + conversionFactor = 0.25; + break; + case SyncHalfNote: + conversionFactor = 0.5; + break; + case SyncQuarterNote: + conversionFactor = 1.0; + break; + case SyncEighthNote: + conversionFactor = 2.0; + break; + case SyncSixteenthNote: + conversionFactor = 4.0; + break; + case SyncThirtysecondNote: + conversionFactor = 8.0; + break; + default: ; + } + bool journalling = testAndSetJournalling( FALSE ); + setValue( 60000.0 / ( _bpm * conversionFactor * m_scale ) ); + setJournalling( journalling ); + } + + if( m_tempoSyncMode != m_tempoLastSyncMode ) + { + emit syncModeChanged( m_tempoSyncMode ); + m_tempoLastSyncMode = m_tempoSyncMode; + } +} + + + + +void tempoSyncKnobModel::saveSettings( QDomDocument & _doc, QDomElement & _this, + const QString & _name ) +{ + _this.setAttribute( "syncmode", ( int ) getSyncMode() ); + m_custom.saveSettings( _doc, _this, _name ); + knobModel::saveSettings( _doc, _this, _name ); +} + + + + +void tempoSyncKnobModel::loadSettings( const QDomElement & _this, + const QString & _name ) +{ + setSyncMode( ( tempoSyncMode ) _this.attribute( "syncmode" ).toInt() ); + m_custom.loadSettings( _this, _name ); + knobModel::loadSettings( _this, _name ); +} + + + + +tempoSyncKnobModel::tempoSyncMode tempoSyncKnobModel::getSyncMode( void ) +{ + return( m_tempoSyncMode ); +} + + + + +void tempoSyncKnobModel::setSyncMode( tempoSyncMode _new_mode ) +{ + if( m_tempoSyncMode != _new_mode ) + { + m_tempoSyncMode = _new_mode; + if( _new_mode == SyncCustom ) + { + connect( &m_custom, SIGNAL( numeratorChanged() ), + this, SLOT( updateCustom() ) ); + connect( &m_custom, SIGNAL( denominatorChanged() ), + this, SLOT( updateCustom() ) ); + } + } + calculateTempoSyncTime( engine::getSong()->getTempo() ); +} + + + + +float tempoSyncKnobModel::getScale( void ) +{ + return( m_scale ); +} + + + + +void tempoSyncKnobModel::setScale( float _new_scale ) +{ + m_scale = _new_scale; + calculateTempoSyncTime( engine::getSong()->getTempo() ); + emit scaleChanged( _new_scale ); +} + + + + +void tempoSyncKnobModel::updateCustom( void ) +{ + setSyncMode( SyncCustom ); +} + + + + + + +tempoSyncKnob::tempoSyncKnob( int _knob_num, QWidget * _parent, + const QString & _name ) : + knob( _knob_num, _parent, _name ), + m_tempoSyncIcon( embed::getIconPixmap( "tempo_sync" ) ), + m_tempoSyncDescription( tr( "Tempo Sync" ) ) +{ + m_custom = new meterDialog( engine::getMainWindow()->workspace() ); + engine::getMainWindow()->workspace()->addSubWindow( m_custom ); + m_custom->parentWidget()->hide(); m_custom->setWindowTitle( "Meter" ); } @@ -65,13 +227,25 @@ tempoSyncKnob::~tempoSyncKnob() { if( m_custom ) { - m_custom->deleteLater(); +// m_custom->deleteLater(); + delete m_custom->parentWidget(); } } +void tempoSyncKnob::modelChanged( void ) +{ + m_custom->setModel( &model()->m_custom ); + connect( model(), SIGNAL( syncModeChanged( tempoSyncMode ) ), + this, SLOT( updateDescAndIcon() ) ); + updateDescAndIcon(); +} + + + + void tempoSyncKnob::contextMenuEvent( QContextMenuEvent * ) { captionMenu contextMenu( accessibleName() ); @@ -94,7 +268,7 @@ void tempoSyncKnob::contextMenuEvent( QContextMenuEvent * ) contextMenu.addSeparator(); float limit = 60000.0f / ( engine::getSong()->getTempo() * - m_scale ); + model()->m_scale ); QMenu * syncMenu = contextMenu.addMenu( m_tempoSyncIcon, m_tempoSyncDescription ); @@ -102,52 +276,53 @@ void tempoSyncKnob::contextMenuEvent( QContextMenuEvent * ) { connect( syncMenu, SIGNAL( triggered( QAction * ) ), - this, SLOT( setTempoSync( QAction * ) ) ); + model(), SLOT( setTempoSync( QAction * ) ) ); syncMenu->addAction( embed::getIconPixmap( "note_none" ), - tr( "No Sync" ) )->setData( (int) NO_SYNC ); + tr( "No Sync" ) )->setData( (int) tempoSyncKnobModel::SyncNone ); if( limit / 0.125f <= model()->maxValue() ) { syncMenu->addAction( embed::getIconPixmap( "note_double_whole" ), tr( "Eight beats" ) )->setData( - (int) DOUBLE_WHOLE_NOTE ); + (int) tempoSyncKnobModel::SyncDoubleWholeNote ); } if( limit / 0.25f <= model()->maxValue() ) { syncMenu->addAction( embed::getIconPixmap( "note_whole" ), tr( "Whole note" ) )->setData( - (int) WHOLE_NOTE ); + (int) tempoSyncKnobModel::SyncWholeNote ); } if( limit / 0.5f <= model()->maxValue() ) { syncMenu->addAction( embed::getIconPixmap( "note_half" ), tr( "Half note" ) )->setData( - (int) HALF_NOTE ); + (int) tempoSyncKnobModel::SyncHalfNote ); } if( limit <= model()->maxValue() ) { syncMenu->addAction( embed::getIconPixmap( "note_quarter" ), tr( "Quarter note" ) )->setData( - (int) QUARTER_NOTE ); + (int) tempoSyncKnobModel::SyncQuarterNote ); } if( limit / 2.0f <= model()->maxValue() ) { syncMenu->addAction( embed::getIconPixmap( "note_eighth" ), tr( "8th note" ) )->setData( - (int) EIGHTH_NOTE ); + (int) tempoSyncKnobModel::SyncEighthNote ); } if( limit / 4.0f <= model()->maxValue() ) { syncMenu->addAction( embed::getIconPixmap( "note_sixteenth" ), tr( "16th note" ) )->setData( - (int) SIXTEENTH_NOTE ); + (int) tempoSyncKnobModel::SyncSixteenthNote ); } syncMenu->addAction( embed::getIconPixmap( "note_thirtysecond" ), tr( "32nd note" ) )->setData( - (int) THIRTYSECOND_NOTE ); + (int) tempoSyncKnobModel::SyncThirtysecondNote ); syncMenu->addAction( embed::getIconPixmap( "dont_know" ), tr( "Custom..." ), this, SLOT( showCustom( void ) ) - )->setData( (int) CUSTOM ); + )->setData( + (int) tempoSyncKnobModel::SyncCustom ); contextMenu.addSeparator(); } @@ -172,9 +347,8 @@ void tempoSyncKnob::contextMenuEvent( QContextMenuEvent * ) void tempoSyncKnob::mouseMoveEvent( QMouseEvent * _me ) { - m_tempoSyncMode = NO_SYNC; - calculateTempoSyncTime( engine::getSong()->getTempo() ); knob::mouseMoveEvent( _me ); + model()->setSyncMode( tempoSyncKnobModel::SyncNone ); } @@ -183,222 +357,112 @@ void tempoSyncKnob::mouseMoveEvent( QMouseEvent * _me ) void tempoSyncKnob::wheelEvent( QWheelEvent * _we ) { knob::wheelEvent( _we ); - m_tempoSyncMode = NO_SYNC; - calculateTempoSyncTime( engine::getSong()->getTempo() ); + model()->setSyncMode( tempoSyncKnobModel::SyncNone ); } -void tempoSyncKnob::setTempoSync( QAction * _item ) +void tempoSyncKnob::updateDescAndIcon( void ) { - setTempoSync( _item->data().toInt() ); -} - - - - -void tempoSyncKnob::setTempoSync( int _note_type ) -{ - setSyncMode( ( tempoSyncMode ) _note_type ); - engine::getSong()->setModified(); -} - - - - -void tempoSyncKnob::calculateTempoSyncTime( bpm_t _bpm ) -{ - float conversionFactor = 1.0; - - if( m_tempoSyncMode ) + if( model()->m_tempoSyncMode ) { - switch( m_tempoSyncMode ) + switch( model()->m_tempoSyncMode ) { - case CUSTOM: + case tempoSyncKnobModel::SyncCustom: m_tempoSyncDescription = tr( "Custom " ) + "(" + - QString::number( m_custom->getNumerator() ) + + QString::number( model()->m_custom.getNumerator() ) + "/" + - QString::number( m_custom->getDenominator() ) + + QString::number( model()->m_custom.getDenominator() ) + ")"; - conversionFactor = - static_cast( m_custom->getDenominator() ) / - static_cast( m_custom->getNumerator() ); break; - case DOUBLE_WHOLE_NOTE: + case tempoSyncKnobModel::SyncDoubleWholeNote: m_tempoSyncDescription = tr( "Synced to Eight Beats" ); - conversionFactor = 0.125; break; - case WHOLE_NOTE: + case tempoSyncKnobModel::SyncWholeNote: m_tempoSyncDescription = tr( "Synced to Whole Note" ); - conversionFactor = 0.25; break; - case HALF_NOTE: + case tempoSyncKnobModel::SyncHalfNote: m_tempoSyncDescription = tr( "Synced to Half Note" ); - conversionFactor = 0.5; break; - case QUARTER_NOTE: + case tempoSyncKnobModel::SyncQuarterNote: m_tempoSyncDescription = tr( "Synced to Quarter Note" ); - conversionFactor = 1.0; break; - case EIGHTH_NOTE: + case tempoSyncKnobModel::SyncEighthNote: m_tempoSyncDescription = tr( "Synced to 8th Note" ); - conversionFactor = 2.0; break; - case SIXTEENTH_NOTE: + case tempoSyncKnobModel::SyncSixteenthNote: m_tempoSyncDescription = tr( "Synced to 16th Note" ); - conversionFactor = 4.0; break; - case THIRTYSECOND_NOTE: + case tempoSyncKnobModel::SyncThirtysecondNote: m_tempoSyncDescription = tr( "Synced to 32nd Note" ); - conversionFactor = 8.0; break; default: ; } - bool journalling = model()->testAndSetJournalling( FALSE ); - model()->setValue( 60000.0 / - ( _bpm * conversionFactor * m_scale ) ); - model()->setJournalling( journalling ); } else { m_tempoSyncDescription = tr( "Tempo Sync" ); } - - if( m_tempoSyncMode != m_tempoLastSyncMode ) + if( model()->m_tempoSyncMode != tempoSyncKnobModel::SyncCustom ) { - switch( m_tempoSyncMode ) - { - case NO_SYNC: - m_tempoSyncIcon = embed::getIconPixmap( - "tempo_sync" ); - break; - case CUSTOM: - m_tempoSyncIcon = embed::getIconPixmap( - "dont_know" ); - break; - case DOUBLE_WHOLE_NOTE: - m_tempoSyncIcon = embed::getIconPixmap( - "note_double_whole" ); - break; - case WHOLE_NOTE: - m_tempoSyncIcon = embed::getIconPixmap( - "note_whole" ); - break; - case HALF_NOTE: - m_tempoSyncIcon = embed::getIconPixmap( - "note_half" ); - break; - case QUARTER_NOTE: - m_tempoSyncIcon = embed::getIconPixmap( - "note_quarter" ); - break; - case EIGHTH_NOTE: - m_tempoSyncIcon = embed::getIconPixmap( - "note_eighth" ); - break; - case SIXTEENTH_NOTE: - m_tempoSyncIcon = embed::getIconPixmap( - "note_sixteenth" ); - break; - case THIRTYSECOND_NOTE: - m_tempoSyncIcon = embed::getIconPixmap( - "note_thirtysecond" ); - break; - default: - printf( "tempoSyncKnob::calculateTempoSyncTime" - ": invalid tempoSyncMode" ); - break; - } - - emit syncModeChanged( m_tempoSyncMode ); - emit syncDescriptionChanged( m_tempoSyncDescription ); - emit syncIconChanged(); - - m_tempoLastSyncMode = m_tempoSyncMode; + m_custom->parentWidget()->hide(); } -} - - - -void tempoSyncKnob::saveSettings( QDomDocument & _doc, QDomElement & _this, - const QString & _name ) -{ - _this.setAttribute( "syncmode", ( int ) getSyncMode() ); - model()->saveSettings( _doc, _this, _name ); - m_custom->saveSettings( _doc, _this, _name ); -} - - - - -void tempoSyncKnob::loadSettings( const QDomElement & _this, - const QString & _name ) -{ - setSyncMode( ( tempoSyncMode ) _this.attribute( - "syncmode" ).toInt() ); - model()->loadSettings( _this, _name ); - m_custom->loadSettings( _this, _name ); -} - - - - -tempoSyncKnob::tempoSyncMode tempoSyncKnob::getSyncMode( void ) -{ - return( m_tempoSyncMode ); -} - - - - -void tempoSyncKnob::setSyncMode( tempoSyncMode _new_mode ) -{ - if( m_tempoSyncMode != _new_mode ) + switch( model()->m_tempoSyncMode ) { - m_tempoSyncMode = _new_mode; - if( _new_mode == CUSTOM ) - { - connect( m_custom, SIGNAL( numeratorChanged() ), - this, SLOT( updateCustom() ) ); - connect( m_custom, SIGNAL( denominatorChanged() ), - this, SLOT( updateCustom() ) ); - } - else - { - m_custom->hide(); - disconnect( m_custom, 0, - this, SLOT( updateCustom() ) ); - } + case tempoSyncKnobModel::SyncNone: + m_tempoSyncIcon = embed::getIconPixmap( + "tempo_sync" ); + break; + case tempoSyncKnobModel::SyncCustom: + m_tempoSyncIcon = embed::getIconPixmap( + "dont_know" ); + break; + case tempoSyncKnobModel::SyncDoubleWholeNote: + m_tempoSyncIcon = embed::getIconPixmap( + "note_double_whole" ); + break; + case tempoSyncKnobModel::SyncWholeNote: + m_tempoSyncIcon = embed::getIconPixmap( + "note_whole" ); + break; + case tempoSyncKnobModel::SyncHalfNote: + m_tempoSyncIcon = embed::getIconPixmap( + "note_half" ); + break; + case tempoSyncKnobModel::SyncQuarterNote: + m_tempoSyncIcon = embed::getIconPixmap( + "note_quarter" ); + break; + case tempoSyncKnobModel::SyncEighthNote: + m_tempoSyncIcon = embed::getIconPixmap( + "note_eighth" ); + break; + case tempoSyncKnobModel::SyncSixteenthNote: + m_tempoSyncIcon = embed::getIconPixmap( + "note_sixteenth" ); + break; + case tempoSyncKnobModel::SyncThirtysecondNote: + m_tempoSyncIcon = embed::getIconPixmap( + "note_thirtysecond" ); + break; + default: + printf( "tempoSyncKnob::calculateTempoSyncTime" + ": invalid tempoSyncMode" ); + break; } - calculateTempoSyncTime( engine::getSong()->getTempo() ); -} - - - -float tempoSyncKnob::getScale( void ) -{ - return( m_scale ); -} - - - - -void tempoSyncKnob::setScale( float _new_scale ) -{ - m_scale = _new_scale; - calculateTempoSyncTime( engine::getSong()->getTempo() ); - emit scaleChanged( _new_scale ); + emit syncDescriptionChanged( m_tempoSyncDescription ); + emit syncIconChanged(); } @@ -438,18 +502,10 @@ void tempoSyncKnob::setSyncIcon( const QPixmap & _new_icon ) -void tempoSyncKnob::updateCustom( void ) -{ - setSyncMode( CUSTOM ); -} - - - - void tempoSyncKnob::showCustom( void ) { - m_custom->show(); - setTempoSync( CUSTOM ); + m_custom->parentWidget()->show(); + model()->setTempoSync( tempoSyncKnobModel::SyncCustom ); } From e0851b970ef4ad4a41997ad9c6fc41ba7171994c Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 27 Feb 2008 00:45:30 +0000 Subject: [PATCH 80/87] initial support for parallel rendering via worker-threads - far from being perfect (especially with small mixer-period-sizes) but seems to help even on a DualCore machine git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@720 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/mixer.h | 9 ++- src/core/mixer.cpp | 179 ++++++++++++++++++++++++++++++++++++--------- 2 files changed, 154 insertions(+), 34 deletions(-) diff --git a/include/mixer.h b/include/mixer.h index b7cfab426..9dd4a277e 100644 --- a/include/mixer.h +++ b/include/mixer.h @@ -31,6 +31,7 @@ #endif #include +#include #include #include @@ -91,6 +92,8 @@ const tones BASE_TONE = A; const octaves BASE_OCTAVE = OCTAVE_4; +class mixerWorkerThread; + class mixer : public QObject { @@ -361,7 +364,10 @@ private: bool m_newBuffer[SURROUND_CHANNELS]; Uint8 m_cpuLoad; - int m_parallelizingLevel; + bool m_multiThreaded; + QVector m_workers; + QSemaphore m_workerSem; + playHandleVector m_playHandles; constPlayHandleVector m_playHandlesToRemove; @@ -389,6 +395,7 @@ private: friend class engine; + friend class mixerWorkerThread; } ; diff --git a/src/core/mixer.cpp b/src/core/mixer.cpp index 9b421c204..b8a6a7390 100644 --- a/src/core/mixer.cpp +++ b/src/core/mixer.cpp @@ -25,6 +25,8 @@ */ +#include + #include #include "mixer.h" @@ -62,12 +64,101 @@ sample_rate_t SAMPLE_RATES[QUALITY_LEVELS] = { 44100, 88200 } ; +class mixerWorkerThread : public QThread +{ +public: + enum JobTypes + { + InvalidJob, + PlayHandle, + AudioPortEffects, + NumJobTypes + } ; + + mixerWorkerThread( mixer * _mixer, QSemaphore * _sem ) : + QThread( _mixer ), + m_mixer( _mixer ), + m_sem( _sem ), + m_jobWait( 1 ), + m_jobAccepted( 1 ), + m_idle( FALSE ), + m_job( NULL ), + m_jobType( InvalidJob ) + { + start( QThread::TimeCriticalPriority ); + } + + virtual ~mixerWorkerThread() + { + } + + void addJob( JobTypes _t, void * _job ) + { + m_jobType = _t; + m_job = _job; + m_jobWait.release(); + m_jobAccepted.acquire(); + } + + inline bool idle( void ) + { + return( m_idle ); + + } + +private: + virtual void run( void ) + { + m_jobWait.acquire(); + m_jobAccepted.acquire(); + m_idle = TRUE; + while( 1 ) + { + m_jobWait.acquire(); + m_idle = FALSE; + m_sem->acquire(); + m_jobAccepted.release(); + if( m_jobType == PlayHandle ) + { + ( (playHandle *) m_job )->play(); + } + else if( m_jobType == AudioPortEffects ) + { + audioPort * a = (audioPort *) m_job; + bool me = a->processEffects(); + if( a->m_bufferUsage != audioPort::NONE || me ) + { + m_mixer->processBuffer( + a->firstBuffer(), + a->nextFxChannel() ); + a->nextPeriod(); + } + } + m_idle = TRUE; + m_sem->release(); + } + } + + mixer * m_mixer; + QSemaphore * m_sem; + QSemaphore m_jobWait; + QSemaphore m_jobAccepted; + void * m_job; + JobTypes m_jobType; + volatile bool m_idle; + +} ; + + + mixer::mixer( void ) : m_framesPerPeriod( DEFAULT_BUFFER_SIZE ), m_readBuf( NULL ), m_writeBuf( NULL ), m_cpuLoad( 0 ), - m_parallelizingLevel( 1 ), + m_multiThreaded( QThread::idealThreadCount() > 1 ), + m_workers(), + m_workerSem( m_multiThreaded ? QThread::idealThreadCount() : 0 ), m_qualityLevel( DEFAULT_QUALITY_LEVEL ), m_masterGain( 1.0f ), m_audioDev( NULL ), @@ -99,13 +190,6 @@ mixer::mixer( void ) : m_fifo = new fifo( 1 ); } - if( configManager::inst()->value( "mixer", "parallelizinglevel" - ).toInt() > 0 ) - { - m_parallelizingLevel =configManager::inst()->value( "mixer", - "parallelizinglevel" ).toInt(); - } - for( Uint8 i = 0; i < 3; i++ ) { m_readBuf = new surroundSampleFrame[m_framesPerPeriod]; @@ -113,7 +197,16 @@ mixer::mixer( void ) : clearAudioBuffer( m_readBuf, m_framesPerPeriod ); m_bufferPool.push_back( m_readBuf ); } - + + if( m_multiThreaded ) + { + for( int i = 0; i < QThread::idealThreadCount(); ++i ) + { + m_workers.push_back( new mixerWorkerThread( this, + &m_workerSem ) ); + } + } + setClipScaling( FALSE ); } @@ -226,6 +319,23 @@ void mixer::setClipScaling( bool _state ) +#define ADD_JOB(type,ptr) \ + m_workerSem.acquire(); \ + m_workerSem.release(); \ + for( int i = 0; i < m_workers.size(); ++i ) \ + { \ + if( m_workers[i]->idle() ) \ + { \ + m_workers[i]->addJob( type, ptr ); \ + break; \ + } \ + } + +#define WAIT_FOR_JOBS() \ + m_workerSem.acquire( m_workers.size() ); \ + m_workerSem.release( m_workers.size() ); + + const surroundSampleFrame * mixer::renderNextBuffer( void ) { @@ -292,20 +402,8 @@ const surroundSampleFrame * mixer::renderNextBuffer( void ) lockPlayHandles(); int idx = 0; - if( m_parallelizingLevel > 1 ) + if( m_multiThreaded ) { -// TODO: if not enough play-handles are found which are capable of -// parallelizing, create according worker-threads. each of this threads -// processes a certain part of our m_playHandles-vector -// the question is the queueing model which we can use: -// 1) m_playHandles is divided into m_parallelizingLevel sub-vectors -// each sub-vector is processed by a worker-thread -// 2) create a stack with all play-handles that need to be processed, -// save it via a mutex and then let all worker-threads "fetch jobs" -// from the stack - this way it's guaranteed the work is -// balanced across all worker-threads. this would avoid cases -// where the sub-vector of a thread only contains notes that are -// done and only need to be deleted. playHandleVector par_hndls; while( idx < m_playHandles.size() ) { @@ -324,7 +422,8 @@ const surroundSampleFrame * mixer::renderNextBuffer( void ) if( !( *it )->done() && !( *it )->supportsParallelizing() ) { - ( *it )->play(); + ADD_JOB( mixerWorkerThread::PlayHandle, + *it ); } } for( playHandleVector::iterator it = par_hndls.begin(); @@ -332,6 +431,7 @@ const surroundSampleFrame * mixer::renderNextBuffer( void ) { ( *it )->waitForWorkerThread(); } + WAIT_FOR_JOBS(); } else { @@ -341,6 +441,7 @@ const surroundSampleFrame * mixer::renderNextBuffer( void ) { if( !( *it )->done() ) { + ( *it )->play(); } } @@ -366,14 +467,26 @@ const surroundSampleFrame * mixer::renderNextBuffer( void ) for( QVector::iterator it = m_audioPorts.begin(); it != m_audioPorts.end(); ++it ) { - more_effects = ( *it )->processEffects(); - if( ( *it )->m_bufferUsage != audioPort::NONE || - more_effects ) + if( m_multiThreaded ) { - processBuffer( ( *it )->firstBuffer(), - ( *it )->nextFxChannel() ); - ( *it )->nextPeriod(); + ADD_JOB( mixerWorkerThread::AudioPortEffects, + *it ); } + else + { + more_effects = ( *it )->processEffects(); + if( ( *it )->m_bufferUsage != audioPort::NONE || + more_effects ) + { + processBuffer( ( *it )->firstBuffer(), + ( *it )->nextFxChannel() ); + ( *it )->nextPeriod(); + } + } + } + if( m_multiThreaded ) + { + WAIT_FOR_JOBS(); } } @@ -726,7 +839,7 @@ void mixer::processBuffer( const surroundSampleFrame * _buf, { // TODO: effect-implementation - if( m_scaleClip ) +/* if( m_scaleClip ) { for( ch_cnt_t chnl=0; chnl < m_audioDev->channels(); @@ -734,18 +847,18 @@ void mixer::processBuffer( const surroundSampleFrame * _buf, { m_newBuffer[chnl] = TRUE; } - } + }*/ for( fpp_t frame = 0; frame < m_framesPerPeriod; ++frame ) { for( ch_cnt_t chnl = 0; chnl < m_audioDev->channels(); ++chnl ) { m_writeBuf[frame][chnl] += _buf[frame][chnl]; - +/* if( m_scaleClip ) { scaleClip( frame, chnl ); - } + }*/ } } } From 9618526b0d55343247cd43ae12a03b189c4295d1 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 27 Feb 2008 00:45:53 +0000 Subject: [PATCH 81/87] initial support for parallel rendering via worker-threads - far from being perfect (especially with small mixer-period-sizes) but seems to help even on a DualCore machine git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@721 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ChangeLog b/ChangeLog index 0691ec5e4..8acf474c2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-02-26 Tobias Doerffel + + * include/mixer.h: + * src/core/mixer.cpp: + initial support for parallel rendering via worker-threads - far from + being perfect (especially with small mixer-period-sizes) but seems to + help even on a DualCore machine + 2008-02-25 Tobias Doerffel * plugins/ladspa_browser/ladspa_browser.cpp: From b81bafd3826403bab073f807f3eaa7b5a52e43e1 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 27 Feb 2008 00:52:21 +0000 Subject: [PATCH 82/87] bumped version git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@722 0778d3d1-df1d-0410-868b-ea421aaaa00d --- configure.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.in b/configure.in index 6b2e4d6fe..6255eb514 100644 --- a/configure.in +++ b/configure.in @@ -2,8 +2,8 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.50) -AC_INIT(lmms, 0.4.0-svn20080219-mv, lmms-devel/at/lists/dot/sf/dot/net) -AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080219-mv) +AC_INIT(lmms, 0.4.0-svn20080227-mv, lmms-devel/at/lists/dot/sf/dot/net) +AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080227-mv) AM_CONFIG_HEADER(config.h) From 0acbf718af86c1f5966fbbc4964bd2fc06bf161d Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 27 Feb 2008 14:57:07 +0000 Subject: [PATCH 83/87] distribute whole job-queue instead of single jobs and re-assign unprocessed jobs to idle worker-threads - improves multi-threading behaviour a lot git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@723 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/mixer.h | 1 + src/core/mixer.cpp | 225 +++++++++++++++++++++++++++++++-------------- 2 files changed, 159 insertions(+), 67 deletions(-) diff --git a/include/mixer.h b/include/mixer.h index 9dd4a277e..b7ccda455 100644 --- a/include/mixer.h +++ b/include/mixer.h @@ -366,6 +366,7 @@ private: Uint8 m_cpuLoad; bool m_multiThreaded; QVector m_workers; + int m_numWorkers; QSemaphore m_workerSem; diff --git a/src/core/mixer.cpp b/src/core/mixer.cpp index b8a6a7390..b9ad6229d 100644 --- a/src/core/mixer.cpp +++ b/src/core/mixer.cpp @@ -72,18 +72,49 @@ public: InvalidJob, PlayHandle, AudioPortEffects, + EffectChannel, NumJobTypes } ; - mixerWorkerThread( mixer * _mixer, QSemaphore * _sem ) : + struct jobQueueItem + { + jobQueueItem() : + workerID( -1 ), + type( InvalidJob ), + job( NULL ), + done( FALSE ) + { + } + jobQueueItem( int _id, JobTypes _type, void * _job ) : + workerID( _id ), + type( _type ), + job( _job ), + done( FALSE ) + { + } + int workerID; + JobTypes type; + void * job; + volatile bool done; + } ; + + typedef QVector jobQueueItems; + struct jobQueue + { + jobQueueItems items; + int remaining; + QReadWriteLock lock; + } ; + + mixerWorkerThread( mixer * _mixer, int _id ) : QThread( _mixer ), m_mixer( _mixer ), - m_sem( _sem ), + m_id( _id ), + m_sem( &m_mixer->m_workerSem ), m_jobWait( 1 ), m_jobAccepted( 1 ), - m_idle( FALSE ), - m_job( NULL ), - m_jobType( InvalidJob ) + m_jobQueue( NULL ), + m_idle( FALSE ) { start( QThread::TimeCriticalPriority ); } @@ -92,10 +123,9 @@ public: { } - void addJob( JobTypes _t, void * _job ) + void addJob( jobQueue * _q ) { - m_jobType = _t; - m_job = _job; + m_jobQueue = _q; m_jobWait.release(); m_jobAccepted.acquire(); } @@ -118,20 +148,40 @@ private: m_idle = FALSE; m_sem->acquire(); m_jobAccepted.release(); - if( m_jobType == PlayHandle ) + for( jobQueueItems::iterator it = m_jobQueue->items.begin(); + it != m_jobQueue->items.end(); ++it ) { - ( (playHandle *) m_job )->play(); - } - else if( m_jobType == AudioPortEffects ) - { - audioPort * a = (audioPort *) m_job; - bool me = a->processEffects(); - if( a->m_bufferUsage != audioPort::NONE || me ) + m_jobQueue->lock.lockForRead(); + const int id = it->workerID; + const bool done = it->done; + m_jobQueue->lock.unlock(); + if( !done && id == m_id ) { - m_mixer->processBuffer( - a->firstBuffer(), - a->nextFxChannel() ); - a->nextPeriod(); + m_jobQueue->lock.lockForWrite(); + it->done = TRUE; + --m_jobQueue->remaining; + m_jobQueue->lock.unlock(); + switch( it->type ) + { + case PlayHandle: + ( (playHandle *) it->job )->play(); + break; + case AudioPortEffects: + { + audioPort * a = (audioPort *) it->job; + bool me = a->processEffects(); + if( a->m_bufferUsage != audioPort::NONE || me ) + { + m_mixer->processBuffer( + a->firstBuffer(), + a->nextFxChannel() ); + a->nextPeriod(); + } + } + break; + default: + break; + } } } m_idle = TRUE; @@ -140,11 +190,11 @@ private: } mixer * m_mixer; + int m_id; QSemaphore * m_sem; QSemaphore m_jobWait; QSemaphore m_jobAccepted; - void * m_job; - JobTypes m_jobType; + jobQueue * m_jobQueue; volatile bool m_idle; } ; @@ -158,7 +208,8 @@ mixer::mixer( void ) : m_cpuLoad( 0 ), m_multiThreaded( QThread::idealThreadCount() > 1 ), m_workers(), - m_workerSem( m_multiThreaded ? QThread::idealThreadCount() : 0 ), + m_numWorkers( m_multiThreaded ? QThread::idealThreadCount() : 0 ), + m_workerSem( m_numWorkers ), m_qualityLevel( DEFAULT_QUALITY_LEVEL ), m_masterGain( 1.0f ), m_audioDev( NULL ), @@ -200,10 +251,9 @@ mixer::mixer( void ) : if( m_multiThreaded ) { - for( int i = 0; i < QThread::idealThreadCount(); ++i ) + for( int i = 0; i < m_numWorkers; ++i ) { - m_workers.push_back( new mixerWorkerThread( this, - &m_workerSem ) ); + m_workers.push_back( new mixerWorkerThread( this, i ) ); } } @@ -319,21 +369,66 @@ void mixer::setClipScaling( bool _state ) -#define ADD_JOB(type,ptr) \ - m_workerSem.acquire(); \ - m_workerSem.release(); \ - for( int i = 0; i < m_workers.size(); ++i ) \ - { \ - if( m_workers[i]->idle() ) \ - { \ - m_workers[i]->addJob( type, ptr ); \ - break; \ - } \ +#define FILL_JOB_QUEUE(_jq,_vec_type,_vec,_job_type,_condition) \ + int id = 0; \ + for( _vec_type::iterator it = _vec.begin(); \ + it != _vec.end(); ++it ) \ + { \ + if( _condition ) \ + { \ + _jq.items.push_back( \ + mixerWorkerThread::jobQueueItem( id, _job_type, \ + *it ) );\ + id = (id+1) % m_numWorkers; \ + } \ } -#define WAIT_FOR_JOBS() \ - m_workerSem.acquire( m_workers.size() ); \ - m_workerSem.release( m_workers.size() ); +#define DISTRIBUTE_JOB_QUEUE(_jq) \ + _jq.remaining = _jq.items.size(); \ + for( int i = 0; i < m_numWorkers; ++i ) \ + { \ + m_workers[i]->addJob( &_jq ); \ + } + +#define WAIT_FOR_JOBS() \ + while( m_workerSem.available() < m_numWorkers ) \ + { \ + m_workerSem.acquire( 1 ); \ + m_workerSem.release( 1 ); \ + jq.lock.lockForRead(); \ + const int r = jq.remaining; \ + jq.lock.unlock(); \ + if( m_workerSem.available() >= m_numWorkers || \ + r <= m_numWorkers ) \ + break; \ + /* in case a worker has finished, try to re-assign */ \ + /* jobs of busy workers */ \ + for( int i = 0; i < m_numWorkers; ++i ) \ + { \ + if( m_workers[i]->idle() ) \ + { \ + int n = m_numWorkers-1; \ +for( mixerWorkerThread::jobQueueItems::iterator it = jq.items.end(); \ + it != jq.items.begin(); ) \ +{ \ + --it; \ + jq.lock.lockForRead(); \ + if( !it->done && it->workerID != i && \ + (++n) % m_numWorkers == 0 ) \ + { \ + jq.lock.unlock(); \ + jq.lock.lockForWrite(); \ + it->workerID = i; \ + } \ + jq.lock.unlock(); \ +} \ + m_workers[i]->addJob( &jq ); \ + break; \ + } \ + } \ + } \ + m_workerSem.acquire( m_numWorkers ); \ + m_workerSem.release( m_numWorkers ); @@ -415,17 +510,12 @@ const surroundSampleFrame * mixer::renderNextBuffer( void ) } ++idx; } - for( playHandleVector::iterator it = - m_playHandles.begin(); - it != m_playHandles.end(); ++it ) - { - if( !( *it )->done() && - !( *it )->supportsParallelizing() ) - { - ADD_JOB( mixerWorkerThread::PlayHandle, - *it ); - } - } + mixerWorkerThread::jobQueue jq; + FILL_JOB_QUEUE(jq,playHandleVector,m_playHandles, + mixerWorkerThread::PlayHandle, + !( *it )->done() && + !( *it )->supportsParallelizing() ); + DISTRIBUTE_JOB_QUEUE(jq); for( playHandleVector::iterator it = par_hndls.begin(); it != par_hndls.end(); ++it ) { @@ -462,32 +552,30 @@ const surroundSampleFrame * mixer::renderNextBuffer( void ) } } unlockPlayHandles(); - - bool more_effects = FALSE; - for( QVector::iterator it = m_audioPorts.begin(); - it != m_audioPorts.end(); ++it ) + if( m_multiThreaded ) { - if( m_multiThreaded ) - { - ADD_JOB( mixerWorkerThread::AudioPortEffects, - *it ); - } - else + mixerWorkerThread::jobQueue jq; + FILL_JOB_QUEUE(jq,QVector,m_audioPorts, + mixerWorkerThread::AudioPortEffects,1); + DISTRIBUTE_JOB_QUEUE(jq); + WAIT_FOR_JOBS(); + } + else + { + bool more_effects = FALSE; + for( QVector::iterator it = m_audioPorts.begin(); + it != m_audioPorts.end(); ++it ) { more_effects = ( *it )->processEffects(); if( ( *it )->m_bufferUsage != audioPort::NONE || more_effects ) { processBuffer( ( *it )->firstBuffer(), - ( *it )->nextFxChannel() ); + ( *it )->nextFxChannel() ); ( *it )->nextPeriod(); } } } - if( m_multiThreaded ) - { - WAIT_FOR_JOBS(); - } } unlock(); @@ -837,7 +925,7 @@ midiClient * mixer::tryMIDIClients( void ) void mixer::processBuffer( const surroundSampleFrame * _buf, fx_ch_t/* _fx_chnl */ ) { - // TODO: effect-implementation + // TODO: process according effect-channel /* if( m_scaleClip ) { @@ -848,7 +936,9 @@ void mixer::processBuffer( const surroundSampleFrame * _buf, m_newBuffer[chnl] = TRUE; } }*/ - + + static QMutex m; + m.lock(); for( fpp_t frame = 0; frame < m_framesPerPeriod; ++frame ) { for( ch_cnt_t chnl = 0; chnl < m_audioDev->channels(); ++chnl ) @@ -861,6 +951,7 @@ void mixer::processBuffer( const surroundSampleFrame * _buf, }*/ } } + m.unlock(); } From c043eed2d6d98915edfa491c695121b841281d03 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 27 Feb 2008 14:57:38 +0000 Subject: [PATCH 84/87] distribute whole job-queue instead of single jobs and re-assign unprocessed jobs to idle worker-threads - improves multi-threading behaviour a lot git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@724 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ChangeLog b/ChangeLog index 8acf474c2..7636dba3b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-02-27 Tobias Doerffel + + * include/mixer.h: + * src/core/mixer.cpp: + distribute whole job-queue instead of single jobs and re-assign + unprocessed jobs to idle worker-threads - improves multi-threading + behaviour a lot + 2008-02-26 Tobias Doerffel * include/mixer.h: From a7b14c66607ae9b54b25ae4386a50f0e8f04eb9c Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 27 Feb 2008 17:49:35 +0000 Subject: [PATCH 85/87] lock audioPort-buffers before writing them git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@725 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/audio_port.h | 30 +++++++++++++++++++++++++++++- src/audio/audio_port.cpp | 9 ++++++--- src/core/mixer.cpp | 15 +++++++++------ 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/include/audio_port.h b/include/audio_port.h index a7177772d..357c7ae8a 100644 --- a/include/audio_port.h +++ b/include/audio_port.h @@ -27,6 +27,8 @@ #define _AUDIO_PORT_H #include +#include +#include #include "effect_chain.h" @@ -46,6 +48,26 @@ public: return( m_secondBuffer ); } + inline void lockFirstBuffer( void ) + { + m_firstBufferLock.lock(); + } + + inline void lockSecondBuffer( void ) + { + m_secondBufferLock.lock(); + } + + inline void unlockFirstBuffer( void ) + { + m_firstBufferLock.unlock(); + } + + inline void unlockSecondBuffer( void ) + { + m_secondBufferLock.unlock(); + } + void nextPeriod( void ); @@ -85,11 +107,14 @@ public: enum bufferUsages { - NONE, FIRST, BOTH + NoUsage, + FirstBuffer, + BothBuffers } m_bufferUsage; inline bool processEffects( void ) { + QMutexLocker m( &m_firstBufferLock ); return( m_effects.processAudioBuffer( m_firstBuffer, m_frames ) ); } @@ -97,6 +122,9 @@ public: private: surroundSampleFrame * m_firstBuffer; surroundSampleFrame * m_secondBuffer; + QMutex m_firstBufferLock; + QMutex m_secondBufferLock; + bool m_extOutputEnabled; fx_ch_t m_nextFxChannel; diff --git a/src/audio/audio_port.cpp b/src/audio/audio_port.cpp index 7b9bafd1a..00510aa13 100644 --- a/src/audio/audio_port.cpp +++ b/src/audio/audio_port.cpp @@ -35,7 +35,7 @@ audioPort::audioPort( const QString & _name, track * _track ) : - m_bufferUsage( NONE ), + m_bufferUsage( NoUsage ), m_firstBuffer( new surroundSampleFrame[ engine::getMixer()->framesPerPeriod()] ), m_secondBuffer( new surroundSampleFrame[ @@ -70,12 +70,15 @@ audioPort::~audioPort() void audioPort::nextPeriod( void ) { + m_firstBufferLock.lock(); engine::getMixer()->clearAudioBuffer( m_firstBuffer, engine::getMixer()->framesPerPeriod() ); qSwap( m_firstBuffer, m_secondBuffer ); + m_firstBufferLock.unlock(); // this is how we decrease state of buffer-usage ;-) - m_bufferUsage = ( m_bufferUsage != NONE ) ? - ( ( m_bufferUsage == FIRST ) ? NONE : FIRST ) : NONE; + m_bufferUsage = ( m_bufferUsage != NoUsage ) ? + ( ( m_bufferUsage == FirstBuffer ) ? + NoUsage : FirstBuffer ) : NoUsage; } diff --git a/src/core/mixer.cpp b/src/core/mixer.cpp index b9ad6229d..40dab8160 100644 --- a/src/core/mixer.cpp +++ b/src/core/mixer.cpp @@ -170,7 +170,7 @@ private: { audioPort * a = (audioPort *) it->job; bool me = a->processEffects(); - if( a->m_bufferUsage != audioPort::NONE || me ) + if( a->m_bufferUsage != audioPort::NoUsage || me ) { m_mixer->processBuffer( a->firstBuffer(), @@ -567,7 +567,7 @@ const surroundSampleFrame * mixer::renderNextBuffer( void ) it != m_audioPorts.end(); ++it ) { more_effects = ( *it )->processEffects(); - if( ( *it )->m_bufferUsage != audioPort::NONE || + if( ( *it )->m_bufferUsage != audioPort::NoUsage || more_effects ) { processBuffer( ( *it )->firstBuffer(), @@ -648,6 +648,7 @@ void FASTCALL mixer::bufferToPort( const sampleFrame * _buf, fpp_t end_frame = start_frame + _frames; const fpp_t loop1_frame = tMin( end_frame, m_framesPerPeriod ); + _port->lockFirstBuffer(); for( fpp_t frame = start_frame; frame < loop1_frame; ++frame ) { for( ch_cnt_t chnl = 0; chnl < m_audioDev->channels(); ++chnl ) @@ -658,7 +659,9 @@ void FASTCALL mixer::bufferToPort( const sampleFrame * _buf, _volume_vector.vol[chnl]; } } + _port->unlockFirstBuffer(); + _port->lockSecondBuffer(); if( end_frame > m_framesPerPeriod ) { fpp_t frames_done = m_framesPerPeriod - start_frame; @@ -676,14 +679,14 @@ void FASTCALL mixer::bufferToPort( const sampleFrame * _buf, } } // we used both buffers so set flags - _port->m_bufferUsage = audioPort::BOTH; + _port->m_bufferUsage = audioPort::BothBuffers; } - else if( _port->m_bufferUsage == audioPort::NONE ) + else if( _port->m_bufferUsage == audioPort::NoUsage ) { // only first buffer touched - _port->m_bufferUsage = audioPort::FIRST; + _port->m_bufferUsage = audioPort::FirstBuffer; } - + _port->unlockSecondBuffer(); } From f83aecf6174368a12ebc02f96dbb4d76adb7f6b3 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 27 Feb 2008 17:52:56 +0000 Subject: [PATCH 86/87] integrated new version of CAPS and fixed miscompilation with GCC 4.3 git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@726 0778d3d1-df1d-0410-868b-ea421aaaa00d --- plugins/ladspa_effect/caps/Amp.cc | 253 +- plugins/ladspa_effect/caps/Amp.h | 96 +- plugins/ladspa_effect/caps/Cabinet.cc | 37 +- plugins/ladspa_effect/caps/Cabinet.h | 19 +- plugins/ladspa_effect/caps/Chorus.cc | 76 +- plugins/ladspa_effect/caps/Chorus.h | 38 +- plugins/ladspa_effect/caps/Click.cc | 38 +- plugins/ladspa_effect/caps/Click.h | 18 +- plugins/ladspa_effect/caps/Clip.cc | 14 +- plugins/ladspa_effect/caps/Clip.h | 9 +- plugins/ladspa_effect/caps/Compress.cc | 24 +- plugins/ladspa_effect/caps/Compress.h | 9 +- plugins/ladspa_effect/caps/Descriptor.h | 125 +- plugins/ladspa_effect/caps/Eq.cc | 219 +- plugins/ladspa_effect/caps/Eq.h | 42 +- plugins/ladspa_effect/caps/HRTF.cc | 13 +- plugins/ladspa_effect/caps/HRTF.h | 9 +- plugins/ladspa_effect/caps/Lorenz.cc | 15 +- plugins/ladspa_effect/caps/Lorenz.h | 13 +- plugins/ladspa_effect/caps/Makefile.am | 4 +- plugins/ladspa_effect/caps/Pan.cc | 21 +- plugins/ladspa_effect/caps/Pan.h | 11 +- plugins/ladspa_effect/caps/Phaser.cc | 30 +- plugins/ladspa_effect/caps/Phaser.h | 24 +- plugins/ladspa_effect/caps/Preamp.cc | 39 +- plugins/ladspa_effect/caps/README | 66 +- plugins/ladspa_effect/caps/Reverb.cc | 51 +- plugins/ladspa_effect/caps/Reverb.h | 21 +- plugins/ladspa_effect/caps/Roessler.cc | 23 +- plugins/ladspa_effect/caps/Roessler.h | 9 +- plugins/ladspa_effect/caps/Scape.cc | 22 +- plugins/ladspa_effect/caps/Scape.h | 21 +- plugins/ladspa_effect/caps/Sin.cc | 17 +- plugins/ladspa_effect/caps/Sin.h | 13 +- plugins/ladspa_effect/caps/SweepVF.cc | 215 +- plugins/ladspa_effect/caps/SweepVF.h | 73 +- plugins/ladspa_effect/caps/ToneControls.cc | 2 +- plugins/ladspa_effect/caps/ToneStack.cc | 195 + plugins/ladspa_effect/caps/ToneStack.h | 98 + plugins/ladspa_effect/caps/VCO.cc | 52 +- plugins/ladspa_effect/caps/VCO.h | 21 +- plugins/ladspa_effect/caps/White.cc | 10 +- plugins/ladspa_effect/caps/White.h | 10 +- plugins/ladspa_effect/caps/basics.h | 89 +- plugins/ladspa_effect/caps/dsp/BiQuad.h | 19 +- plugins/ladspa_effect/caps/dsp/Eq.h | 128 +- .../ladspa_effect/caps/dsp/FPTruncateMode.h | 12 +- plugins/ladspa_effect/caps/dsp/LatFilt.h | 102 + plugins/ladspa_effect/caps/dsp/OnePole.h | 19 +- plugins/ladspa_effect/caps/dsp/RMS.h | 18 +- plugins/ladspa_effect/caps/dsp/TDFII.h | 80 + plugins/ladspa_effect/caps/dsp/ToneStack.h | 268 + plugins/ladspa_effect/caps/dsp/TwelveAX7.h | 44 +- .../ladspa_effect/caps/dsp/tonestack/ks_tab.h | 663 + .../ladspa_effect/caps/dsp/tonestack/tables.h | 38 + .../ladspa_effect/caps/dsp/tonestack/vs_tab.h | 15664 ++++++++++++++++ plugins/ladspa_effect/caps/dsp/util.h | 2 +- plugins/ladspa_effect/caps/interface.cc | 22 +- plugins/ladspa_effect/caps/waves/click.h | 520 + plugins/ladspa_effect/caps/waves/money.h | 2715 +++ 60 files changed, 21649 insertions(+), 869 deletions(-) create mode 100644 plugins/ladspa_effect/caps/ToneStack.cc create mode 100644 plugins/ladspa_effect/caps/ToneStack.h create mode 100644 plugins/ladspa_effect/caps/dsp/LatFilt.h create mode 100644 plugins/ladspa_effect/caps/dsp/TDFII.h create mode 100644 plugins/ladspa_effect/caps/dsp/ToneStack.h create mode 100644 plugins/ladspa_effect/caps/dsp/tonestack/ks_tab.h create mode 100644 plugins/ladspa_effect/caps/dsp/tonestack/tables.h create mode 100644 plugins/ladspa_effect/caps/dsp/tonestack/vs_tab.h create mode 100644 plugins/ladspa_effect/caps/waves/click.h create mode 100644 plugins/ladspa_effect/caps/waves/money.h diff --git a/plugins/ladspa_effect/caps/Amp.cc b/plugins/ladspa_effect/caps/Amp.cc index 326ce1850..52045e765 100644 --- a/plugins/ladspa_effect/caps/Amp.cc +++ b/plugins/ladspa_effect/caps/Amp.cc @@ -1,11 +1,14 @@ /* Amp.cc - Copyright 2003-6 Tim Goetze + Copyright 2003-7 + Tim Goetze + David Yeh (Tone Stack in TS models) http://quitte.de/dsp/ - tube amplifier models + Tube amplifier models + */ /* This program is free software; you can redistribute it and/or @@ -31,9 +34,8 @@ #include "Descriptor.h" void -AmpStub::init (double _fs, bool adjust_downsampler) +AmpStub::init (bool adjust_downsampler) { - fs = _fs; dc_blocker.set_f (10. / fs); /* going a bit lower than nominal with fc */ @@ -62,22 +64,20 @@ AmpStub::init (double _fs, bool adjust_downsampler) s *= OVERSAMPLE; for (int i = 0; i < up.n; ++i) up.c[i] *= s; - - normal = NOISE_FLOOR; } /* //////////////////////////////////////////////////////////////////////// */ void -AmpIII::init (double _fs) +AmpIII::init() { - this->AmpStub::init (_fs, false); + this->AmpStub::init (false); /* need to filter out dc before the power amp stage, which is running at * the oversampled rate */ dc_blocker.set_f (10. / (fs * OVERSAMPLE)); - DSP::RBJ::LoShelve (200 / (_fs), .2, -3, filter.a, filter.b); + DSP::RBJ::LoShelve (200 / fs, .2, -3, filter.a, filter.b); } template @@ -86,10 +86,10 @@ AmpIII::one_cycle (int frames) { d_sample * s = ports[0]; - d_sample gain = *ports[1]; - d_sample temp = *ports[2] * tube.scale; + d_sample gain = getport(1); + d_sample temp = getport(2) * tube.scale; - drive = *ports[3] * .5; + drive = getport(3) * .5; i_drive = 1 / (1 - drive); d_sample * d = ports[4]; @@ -104,7 +104,7 @@ AmpIII::one_cycle (int frames) /* recursive fade to prevent zipper noise from the 'gain' knob */ if (g == 0) g = current.g; - double one_over_n = 1. / frames; + double one_over_n = frames > 0 ? 1. / frames : 1; double gf = pow (current.g / g, one_over_n); for (int i = 0; i < frames; ++i) @@ -123,14 +123,13 @@ AmpIII::one_cycle (int frames) down.store ( power_transfer ( dc_blocker.process ( - tube.transfer_clip (up.pad (o))))); + normal + tube.transfer_clip (up.pad (o))))); F (d, i, a, adding_gain); g *= gf; } - normal = -normal; current.g = g; } @@ -173,9 +172,9 @@ Descriptor::setup() Label = "AmpIII"; Properties = HARD_RT; - Name = "CAPS: AmpIII - Tube amp emulation"; + Name = CAPS "AmpIII - Tube amp"; Maker = "Tim Goetze "; - Copyright = "GPL, 2002-5"; + Copyright = "GPL, 2002-7"; /* fill port info and vtable */ autogen(); @@ -184,31 +183,31 @@ Descriptor::setup() /* //////////////////////////////////////////////////////////////////////// */ void -AmpIV::init (double _fs) +AmpIV::init() { - this->AmpStub::init (_fs, false); + this->AmpStub::init (false); /* need to filter out dc before the power amp stage, which is running at * the oversampled rate */ dc_blocker.set_f (10. / (fs * OVERSAMPLE)); - tone.init (_fs); + tone.init (fs); } template void AmpIV::one_cycle (int frames) { - double one_over_n = 1. / frames; + double one_over_n = frames > 0 ? 1. / frames : 1; d_sample * s = ports[0]; - d_sample gain = *ports[1]; - d_sample temp = *ports[2] * tube.scale; - + d_sample gain = getport(1); + d_sample temp = getport(2) * tube.scale; + tone.start_cycle (ports + 3, one_over_n); - drive = *ports[7] * .5; + drive = getport(7) * .5; i_drive = 1 / (1 - drive); d_sample * d = ports[8]; @@ -241,14 +240,13 @@ AmpIV::one_cycle (int frames) down.store ( power_transfer ( dc_blocker.process ( - tube.transfer_clip (up.pad (o))))); + normal + tube.transfer_clip (up.pad (o))))); F (d, i, a, adding_gain); g *= gf; } - normal = -normal; current.g = g; } @@ -307,9 +305,9 @@ Descriptor::setup() Label = "AmpIV"; Properties = HARD_RT; - Name = "CAPS: AmpIV - Tube amp emulation + tone controls"; + Name = CAPS "AmpIV - Tube amp + tone controls"; Maker = "Tim Goetze "; - Copyright = "GPL, 2002-5"; + Copyright = "GPL, 2002-7"; /* fill port info and vtable */ autogen(); @@ -318,52 +316,50 @@ Descriptor::setup() /* //////////////////////////////////////////////////////////////////////// */ void -AmpV::init (double _fs) +AmpV::init() { - this->AmpStub::init (_fs, false); + this->AmpStub::init (false); /* need to filter out dc before the power amp stage, which is running at * the oversampled rate */ - dc_blocker.set_f (10. / (_fs * OVERSAMPLE)); + dc_blocker.set_f (10. / (fs * OVERSAMPLE)); - DSP::RBJ::LoShelve (210. / _fs, .2, -1, filter[0].a, filter[0].b); - DSP::RBJ::LoShelve (4200. / _fs, 1.2, +6, filter[1].a, filter[1].b); - DSP::RBJ::LoShelve (420. / _fs, .2, +2, filter[2].a, filter[2].b); + DSP::RBJ::LoShelve (210. / fs, .2, -1, filter[0].a, filter[0].b); + DSP::RBJ::LoShelve (4200. / fs, 1.2, +6, filter[1].a, filter[1].b); + DSP::RBJ::LoShelve (420. / fs, .2, +2, filter[2].a, filter[2].b); - /* power supply capacitor */ + /* power supply cap */ for (int i = 0; i < 2; ++i) - DSP::RBJ::LP (10. / _fs, .3, power_cap[i].a, power_cap[i].b); + DSP::RBJ::LP (10. / fs, .3, power_cap[i].a, power_cap[i].b); } -static int _turn = 0; - template void AmpV::one_cycle (int frames) { d_sample * s = ports[0]; - d_sample gain = *ports[1]; + d_sample gain = getport(1); if (*ports[2] != cut) { - cut = *ports[2]; + cut = getport(2); DSP::RBJ::LoShelve (210. / fs, .2, cut, filter[0].a, filter[0].b); } if (*ports[3] != tone) { - tone = *ports[3]; + tone = getport(3); double f = tone * tone * 8400 + 420; double q = tone * .4 + .2; double db = tone * 2 + 2; DSP::RBJ::LoShelve (f / fs, q, db, filter[2].a, filter[2].b); } - drive = *ports[4] * .5; + drive = getport(4) * .5; i_drive = 1 / (1 - drive); #define MAX_WATTS port_info[5].range.UpperBound - d_sample sag = (MAX_WATTS - *ports[5]) / MAX_WATTS; + d_sample sag = (MAX_WATTS - getport(5)) / MAX_WATTS; sag = .6 * sag * sag; d_sample * d = ports[6]; @@ -373,13 +369,15 @@ AmpV::one_cycle (int frames) double g = current.g; current.g = max (gain < 1 ? gain : pow (20, gain - 1), .000001); - if (0 && (++_turn & 127) == 0) + #if 0 + if (++_turn & 127) == 0) fprintf (stderr, "supply = %.3f sag = %.3f\n", supply, sag); + #endif if (g == 0) g = current.g; /* recursive fade to prevent zipper noise from the 'gain' knob */ - double one_over_n = 1. / frames; + double one_over_n = frames > 0 ? 1. / frames : 1; double gf = pow (current.g / g, one_over_n); for (int i = 0; i < frames; ++i) @@ -409,7 +407,7 @@ AmpV::one_cycle (int frames) down.store ( power_transfer ( dc_blocker.process ( - tube.transfer_clip ( + normal + tube.transfer_clip ( up.pad (o))))); } @@ -418,8 +416,8 @@ AmpV::one_cycle (int frames) /* integrate for an approximation of cumulative output power */ supply += sag * fabs (a) + normal; /* filter integrated power consumption */ - for (int i = 0; i < 2; ++i) - supply = 0.9 * (power_cap[i].process (supply)); + for (int j = 0; j < 2; ++j) + supply = 0.9 * (power_cap[j].process (supply)); g *= gf; normal = -normal; @@ -475,12 +473,165 @@ Descriptor::setup() Label = "AmpV"; Properties = HARD_RT; - Name = "CAPS: AmpV - Refined tube amp emulation"; + Name = CAPS "AmpV - Tube amp"; Maker = "Tim Goetze "; - Copyright = "GPL, 2002-5"; + Copyright = "GPL, 2002-7"; /* fill port info and vtable */ autogen(); } +/* //////////////////////////////////////////////////////////////////////// */ +void +AmpVTS::init() +{ + this->AmpStub::init (false); + + /* need to filter out dc before the power amp stage, which is running at + * the oversampled rate */ + dc_blocker.set_f (10. / (fs * OVERSAMPLE)); + + /* power supply capacitance */ + for (int i = 0; i < 2; ++i) + DSP::RBJ::LP (10. / fs, .3, power_cap[i].a, power_cap[i].b); + + tonestack.init (fs); +} + +template +void +AmpVTS::one_cycle (int frames) +{ + d_sample * s = ports[0]; + + tonestack.start_cycle (ports + 1, 2); + d_sample gain = getport(2); + + drive = getport(6) * .5; + i_drive = 1 / (1 - drive); + + d_sample sag = 1 - max (0.0001, min (1, getport(7))); + sag = .6 * sag * sag; /* map to log space makes slider better */ + + d_sample * d = ports[8]; + + *ports[9] = OVERSAMPLE; + + double g = current.g; + + if (gain < 1) + current.g = max (gain, .001); + else + { + gain -= 1; + gain *= gain; + current.g = pow (10, gain); + } + + /* recursive fade to prevent zipper noise from the 'gain' knob */ + double one_over_n = frames > 0 ? 1. / frames : 1; + double gf = pow (current.g / g, one_over_n); + + for (int i = 0; i < frames; ++i) + { + register double a = s[i]; + register double v = 3 - supply; + v = v * v * .06 + .46; + + a = tube.transfer (a); + a = tonestack.process (a + normal); + + a = g * (a + supply * .001); + + a = v * tube.transfer_clip (up.upsample (a)); + a = power_transfer (dc_blocker.process (a)); + + a = down.process (a); + + { + for (int o = 1; o < OVERSAMPLE; ++o) + down.store ( + power_transfer ( + dc_blocker.process ( + normal + tube.transfer_clip ( + up.pad (o))))); + } + + F (d, i, a, adding_gain); + + /* integrate for an approximation of cumulative output power */ + supply += sag * fabs (a) + normal; + /* filter integrated power consumption */ + for (int j = 0; j < 2; ++j) + supply = 0.9 * (power_cap[j].process (supply + normal)); + + g *= gf; + normal = -normal; + } + + current.g = g; +} + +/* //////////////////////////////////////////////////////////////////////// */ + +PortInfo +AmpVTS::port_info [] = +{ + { + "in", + INPUT | AUDIO, + {BOUNDED, -1, 1} + }, { + "model", + INPUT | CONTROL, + {BOUNDED | DEFAULT_0 | INTEGER, 0, 5} /* no way to set dyn at compile t */ + }, { + "gain", + INPUT | CONTROL, + {BOUNDED | DEFAULT_HIGH, 0, 3} + }, { + "bass", + INPUT | CONTROL, + {BOUNDED | DEFAULT_MID, 0, 1} + }, { + "mid", + INPUT | CONTROL, + {BOUNDED | DEFAULT_1, 0, 1} + }, { + "treble", + INPUT | CONTROL, + {BOUNDED | DEFAULT_HIGH, 0, 1} + }, { + "drive", + INPUT | CONTROL, + {BOUNDED | DEFAULT_LOW, 0.0001, 1} + }, { + "watts", + INPUT | CONTROL, + {BOUNDED | DEFAULT_HIGH, 0.0001, 1} + }, { + "out", + OUTPUT | AUDIO, + {0} + }, { + "latency", + OUTPUT | CONTROL, + {0} + } +}; + +template <> void +Descriptor::setup() +{ + UniqueID = 2592; + Label = "AmpVTS"; + Properties = HARD_RT; + + Name = CAPS "AmpVTS - Tube amp + Tone stack"; + Maker = "David Yeh & Tim Goetze "; + Copyright = "GPL, 2002-7"; + + /* fill port info and vtable */ + autogen(); +} diff --git a/plugins/ladspa_effect/caps/Amp.h b/plugins/ladspa_effect/caps/Amp.h index 00a73715f..5ce548153 100644 --- a/plugins/ladspa_effect/caps/Amp.h +++ b/plugins/ladspa_effect/caps/Amp.h @@ -1,11 +1,11 @@ /* Amp.h - Copyright 2002-5 Tim Goetze + Copyright 2002-7 Tim Goetze http://quitte.de/dsp/ - oversampled tube amplifier emulation. + Oversampled tube amplifier emulation. */ /* @@ -41,14 +41,12 @@ #include "dsp/RBJ.h" #include "dsp/Eq.h" +#include "dsp/ToneStack.h" + class AmpStub +: public Plugin { public: - double fs; - - /* oscillating NOISE_FLOOR, added to prevent denormals in signal */ - d_sample normal; - DSP::TwelveAX7_3 tube; d_sample drive, i_drive; @@ -78,7 +76,7 @@ class AmpStub down (FIR_SIZE, up.c) { } - void init (double _fs, bool adjust_downsampler = false); + void init (bool adjust_downsampler = false); inline d_sample power_transfer (d_sample a) { @@ -93,18 +91,16 @@ class PreampIII { public: template - void one_cycle (int frames); + void one_cycle (int frames); DSP::BiQuad filter; public: static PortInfo port_info[]; - d_sample * ports [5]; d_sample adding_gain; - void init (double _fs); - + void init(); void activate() { current.g = 1; @@ -133,18 +129,16 @@ class AmpIII { public: template - void one_cycle (int frames); + void one_cycle (int frames); DSP::BiQuad filter; public: static PortInfo port_info[]; - d_sample * ports [6]; d_sample adding_gain; - void init (double _fs); - + void init(); void activate() { current.g = 1; @@ -176,9 +170,8 @@ class ToneControls { public: d_sample eq_gain[4]; - DSP::Eq<4,4> eq; + DSP::Eq<4> eq; static PreampBand bands[4]; - d_sample normal; public: void init (double _fs); @@ -220,16 +213,14 @@ class PreampIV ToneControls tone; template - void one_cycle (int frames); + void one_cycle (int frames); public: static PortInfo port_info[]; - d_sample * ports [9]; d_sample adding_gain; - void init (double _fs); - + void init(); void activate(); void run (int n) @@ -252,16 +243,14 @@ class AmpIV ToneControls tone; template - void one_cycle (int frames); + void one_cycle (int frames); public: static PortInfo port_info[]; - d_sample * ports [10]; d_sample adding_gain; - void init (double _fs); - + void init(); void activate() { current.g = 1; @@ -291,7 +280,7 @@ class AmpV { public: template - void one_cycle (int frames); + void one_cycle (int frames); DSP::BiQuad filter[3]; @@ -303,12 +292,10 @@ class AmpV public: static PortInfo port_info[]; - d_sample * ports [7]; d_sample adding_gain; - void init (double _fs); - + void init(); void activate() { current.g = 1; @@ -336,4 +323,53 @@ class AmpV } }; +/* /////////////////////////////////////////////////////////////////////// */ + +class AmpVTS +: public AmpStub +{ + public: + DSP::ToneStack tonestack; + + template + void one_cycle (int frames); + + d_sample cut, tone; + + /* supply voltage sag */ + d_sample supply; + DSP::BiQuad power_cap[2]; + + public: + static PortInfo port_info[]; + + d_sample adding_gain; + + void init(); + void activate() + { + current.g = 1; + + for (int i = 0; i < 2; ++i) + power_cap[i].reset(); + + up.reset(); + down.reset(); + dc_blocker.reset(); + + cut = 2; + supply = 0.; + } + + void run (int n) + { + one_cycle (n); + } + + void run_adding (int n) + { + one_cycle (n); + } +}; + #endif /* _AMP_H_ */ diff --git a/plugins/ladspa_effect/caps/Cabinet.cc b/plugins/ladspa_effect/caps/Cabinet.cc index 3fc6f423f..fb46fc6f7 100644 --- a/plugins/ladspa_effect/caps/Cabinet.cc +++ b/plugins/ladspa_effect/caps/Cabinet.cc @@ -1,7 +1,7 @@ /* Cabinet.cc - Copyright 2002-5 Tim Goetze + Copyright 2002-7 Tim Goetze http://quitte.de/dsp/ @@ -73,11 +73,10 @@ CabinetI::models [] = /* //////////////////////////////////////////////////////////////////////// */ void -CabinetI::init (double fs) +CabinetI::init() { h = 0; model = 0; - normal = NOISE_FLOOR; } void @@ -92,7 +91,7 @@ CabinetI::switch_model (int m) a = models[m].a; b = models[m].b; - gain = models[m].gain * DSP::db2lin (*ports[2]); + gain = models[m].gain * DSP::db2lin (getport(2)); memset (x, 0, sizeof (x)); memset (y, 0, sizeof (y)); @@ -101,7 +100,7 @@ CabinetI::switch_model (int m) void CabinetI::activate() { - switch_model ((int) *ports[1]); + switch_model ((int) getport(1)); } template @@ -110,10 +109,10 @@ CabinetI::one_cycle (int frames) { d_sample * s = ports[0]; - int m = (int) *ports[1]; + int m = (int) getport (1); if (m != model) switch_model (m); - d_sample g = models[model].gain * DSP::db2lin (*ports[2]); + d_sample g = models[model].gain * DSP::db2lin (getport(2)); double gf = pow (g / gain, 1 / (double) frames); d_sample * d = ports[3]; @@ -140,8 +139,6 @@ CabinetI::one_cycle (int frames) F (d, i, gain * out, adding_gain); gain *= gf; } - - normal = -normal; } /* //////////////////////////////////////////////////////////////////////// */ @@ -177,9 +174,9 @@ Descriptor::setup() Label = "CabinetI"; Properties = HARD_RT; - Name = "CAPS: CabinetI - Loudspeaker cabinet emulation"; + Name = CAPS "CabinetI - Loudspeaker cabinet emulation"; Maker = "Tim Goetze "; - Copyright = "GPL, 2002-5"; + Copyright = "GPL, 2002-7"; /* fill port info and vtable */ autogen(); @@ -190,7 +187,7 @@ Descriptor::setup() #include "Cabinet-Models32.h" void -CabinetII::init (double fs) +CabinetII::init() { if (fs < 46000) models = models44100; @@ -203,7 +200,6 @@ CabinetII::init (double fs) h = 0; model = 0; - normal = NOISE_FLOOR; } void @@ -218,7 +214,7 @@ CabinetII::switch_model (int m) a = models[m].a; b = models[m].b; - gain = models[m].gain * DSP::db2lin (*ports[2]); + gain = models[m].gain * DSP::db2lin (getport(2)); memset (x, 0, sizeof (x)); memset (y, 0, sizeof (y)); @@ -227,8 +223,7 @@ CabinetII::switch_model (int m) void CabinetII::activate() { - switch_model ((int) *ports[1]); - gain = models[model].gain * DSP::db2lin (*ports[2]); + switch_model ((int) getport(1)); } template @@ -237,10 +232,10 @@ CabinetII::one_cycle (int frames) { d_sample * s = ports[0]; - int m = (int) *ports[1]; + int m = (int) getport (1); if (m != model) switch_model (m); - d_sample g = models[model].gain * DSP::db2lin (*ports[2]); + d_sample g = models[model].gain * DSP::db2lin (getport(2)); double gf = pow (g / gain, 1 / (double) frames); d_sample * d = ports[3]; @@ -267,8 +262,6 @@ CabinetII::one_cycle (int frames) F (d, i, gain * out, adding_gain); gain *= gf; } - - normal = -normal; } /* //////////////////////////////////////////////////////////////////////// */ @@ -304,9 +297,9 @@ Descriptor::setup() Label = "CabinetII"; Properties = HARD_RT; - Name = "CAPS: CabinetII - Refined loudspeaker cabinet emulation"; + Name = CAPS "CabinetII - Refined loudspeaker cabinet emulation"; Maker = "Tim Goetze "; - Copyright = "GPL, 2002-5"; + Copyright = "GPL, 2002-7"; /* fill port info and vtable */ autogen(); diff --git a/plugins/ladspa_effect/caps/Cabinet.h b/plugins/ladspa_effect/caps/Cabinet.h index 660b4a2af..7bc82be9f 100644 --- a/plugins/ladspa_effect/caps/Cabinet.h +++ b/plugins/ladspa_effect/caps/Cabinet.h @@ -54,6 +54,7 @@ typedef struct { } Model32; class CabinetI +: public Plugin { public: d_sample gain; @@ -66,18 +67,13 @@ class CabinetI cabinet_float * a, * b; cabinet_float x[16], y[16]; - d_sample normal; - template - void one_cycle (int frames); + void one_cycle (int frames); public: static PortInfo port_info []; - d_sample * ports [4]; - d_sample adding_gain; - - void init (double _fs); + void init(); void activate(); @@ -96,6 +92,7 @@ class CabinetI * 44.1 / 48 / 88.2 / 96 kHz sample rates */ class CabinetII +: public Plugin { public: d_sample gain; @@ -113,19 +110,15 @@ class CabinetII cabinet_float * a, * b; cabinet_float x[32], y[32]; - d_sample normal; - template - void one_cycle (int frames); + void one_cycle (int frames); public: static PortInfo port_info []; - d_sample * ports [4]; d_sample adding_gain; - void init (double _fs); - + void init(); void activate(); void run (int n) diff --git a/plugins/ladspa_effect/caps/Chorus.cc b/plugins/ladspa_effect/caps/Chorus.cc index dd5396dbf..f752e315c 100644 --- a/plugins/ladspa_effect/caps/Chorus.cc +++ b/plugins/ladspa_effect/caps/Chorus.cc @@ -1,7 +1,7 @@ /* Chorus.cc - Copyright 2004, 2005 Tim Goetze + Copyright 2004-7 Tim Goetze http://quitte.de/dsp/ @@ -40,27 +40,24 @@ ChorusI::one_cycle (int frames) double ms = .001 * fs; double t = time; - time = *ports[1] * ms; + time = getport(1) * ms; double dt = (time - t) * one_over_n; double w = width; - width = *ports[2] * ms; + width = getport(2) * ms; /* clamp, or we need future samples from the delay line */ if (width >= t - 3) width = t - 3; double dw = (width - w) * one_over_n; if (rate != *ports[3]) - lfo.set_f (max (rate = *ports[3], .000001), fs, lfo.get_phase()); + lfo.set_f (max (rate = getport(3), .000001), fs, lfo.get_phase()); - double blend = *ports[4]; - double ff = *ports[5]; - double fb = *ports[6]; + double blend = getport(4); + double ff = getport(5); + double fb = getport(6); d_sample * d = ports[7]; - /* flip 'renormal' addition constant */ - normal = -normal; - DSP::FPTruncateMode truncate; for (int i = 0; i < frames; ++i) @@ -142,9 +139,9 @@ Descriptor::setup() Label = "ChorusI"; Properties = HARD_RT; - Name = "CAPS: ChorusI - Mono chorus/flanger"; + Name = CAPS "ChorusI - Mono chorus/flanger"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); @@ -162,34 +159,31 @@ StereoChorusI::one_cycle (int frames) double ms = .001 * fs; double t = time; - time = *ports[1] * ms; + time = getport(1) * ms; double dt = (time - t) * one_over_n; double w = width; - width = *ports[2] * ms; + width = getport(2) * ms; /* clamp, or we need future samples from the delay line */ if (width >= t - 1) width = t - 1; double dw = (width - w) * one_over_n; if (rate != *ports[3] && phase != *ports[4]) { - rate = *ports[3]; - phase = *ports[4]; + rate = getport(3); + phase = getport(4); double phi = left.lfo.get_phase(); left.lfo.set_f (max (rate, .000001), fs, phi); right.lfo.set_f (max (rate, .000001), fs, phi + phase * M_PI); } - double blend = *ports[5]; - double ff = *ports[6]; - double fb = *ports[7]; + double blend = getport(5); + double ff = getport(6); + double fb = getport(7); d_sample * dl = ports[8]; d_sample * dr = ports[9]; - /* flip 'renormal' addition constant */ - normal = -normal; - /* to go sure (on i386) that the fistp instruction does the right thing * when looking up fractional sample indices */ DSP::FPTruncateMode truncate; @@ -273,9 +267,9 @@ Descriptor::setup() Label = "StereoChorusI"; Properties = HARD_RT; - Name = "CAPS: StereoChorusI - Stereo chorus/flanger"; + Name = CAPS "StereoChorusI - Stereo chorus/flanger"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); @@ -293,11 +287,11 @@ ChorusII::one_cycle (int frames) double ms = .001 * fs; double t = time; - time = *ports[1] * ms; + time = getport(1) * ms; double dt = (time - t) * one_over_n; double w = width; - width = *ports[2] * ms; + width = getport(2) * ms; /* clamp, or we need future samples from the delay line */ if (width >= t - 3) width = t - 3; double dw = (width - w) * one_over_n; @@ -305,15 +299,12 @@ ChorusII::one_cycle (int frames) if (rate != *ports[3]) set_rate (*ports[3]); - double blend = *ports[4]; - double ff = *ports[5]; - double fb = *ports[6]; + double blend = getport(4); + double ff = getport(5); + double fb = getport(6); d_sample * d = ports[7]; - /* flip 'renormal' addition constant */ - normal = -normal; - DSP::FPTruncateMode truncate; for (int i = 0; i < frames; ++i) @@ -384,9 +375,9 @@ Descriptor::setup() Label = "ChorusII"; Properties = HARD_RT; - Name = "CAPS: ChorusII - Mono chorus/flanger modulated by a fractal"; + Name = CAPS "ChorusII - Mono chorus/flanger modulated by a fractal"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); @@ -404,27 +395,24 @@ StereoChorusII::one_cycle (int frames) double ms = .001 * fs; double t = time; - time = *ports[1] * ms; + time = getport(1) * ms; double dt = (time - t) * one_over_n; double w = width; - width = *ports[2] * ms; + width = getport(2) * ms; /* clamp, or we need future samples from the delay line */ if (width >= t - 1) width = t - 1; double dw = (width - w) * one_over_n; set_rate (*ports[3]); - double blend = *ports[4]; - double ff = *ports[5]; - double fb = *ports[6]; + double blend = getport(4); + double ff = getport(5); + double fb = getport(6); d_sample * dl = ports[7]; d_sample * dr = ports[8]; - /* flip 'renormal' addition constant */ - normal = -normal; - /* to go sure (on i386) that the fistp instruction does the right thing * when looking up fractional sample indices */ DSP::FPTruncateMode truncate; @@ -507,9 +495,9 @@ Descriptor::setup() Label = "StereoChorusII"; Properties = HARD_RT; - Name = "CAPS: StereoChorusII - Stereo chorus/flanger modulated by a fractal"; + Name = CAPS "StereoChorusII - Stereo chorus/flanger modulated by a fractal"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); diff --git a/plugins/ladspa_effect/caps/Chorus.h b/plugins/ladspa_effect/caps/Chorus.h index a43b332ad..8627a1d53 100644 --- a/plugins/ladspa_effect/caps/Chorus.h +++ b/plugins/ladspa_effect/caps/Chorus.h @@ -38,11 +38,10 @@ #include "dsp/RBJ.h" class ChorusStub +: public Plugin { public: - double fs; d_sample time, width, rate; - d_sample normal; /* denormal protection */ }; class ChorusI @@ -54,20 +53,15 @@ class ChorusI DSP::DelayTapA tap; template - void one_cycle (int frames); + void one_cycle (int frames); public: - d_sample * ports [8]; - static PortInfo port_info []; - d_sample adding_gain; - void init (double _fs) + void init() { - fs = _fs; rate = .15; delay.init ((int) (.040 * fs)); - normal = NOISE_FLOOR; } void activate() @@ -98,7 +92,6 @@ class StereoChorusI : public ChorusStub { public: - double fs; d_sample rate; d_sample phase; @@ -110,22 +103,17 @@ class StereoChorusI } left, right; template - void one_cycle (int frames); + void one_cycle (int frames); public: - d_sample * ports [10]; - static PortInfo port_info []; - d_sample adding_gain; - void init (double _fs) + void init() { - fs = _fs; rate = .15; phase = .5; /* pi */ delay.init ((int) (.040 * fs)); - normal = NOISE_FLOOR; } void activate() @@ -200,7 +188,7 @@ class ChorusII DSP::Delay delay; template - void one_cycle (int frames); + void one_cycle (int frames); void set_rate (d_sample r) { @@ -213,15 +201,10 @@ class ChorusII } public: - d_sample * ports [8]; - static PortInfo port_info []; - d_sample adding_gain; - void init (double _fs) + void init() { - fs = _fs; - normal = NOISE_FLOOR; delay.init ((int) (.040 * fs)); for (int i = 0; i < Taps; ++i) taps[i].init (fs); @@ -254,7 +237,6 @@ class StereoChorusII : public ChorusStub { public: - double fs; d_sample rate; d_sample phase; @@ -279,18 +261,14 @@ class StereoChorusII } public: - d_sample * ports [10]; - static PortInfo port_info []; d_sample adding_gain; - void init (double _fs) + void init() { - fs = _fs; phase = .5; /* pi */ delay.init ((int) (.040 * fs)); - normal = NOISE_FLOOR; left.fractal.init (.001, frandom()); right.fractal.init (.001, frandom()); diff --git a/plugins/ladspa_effect/caps/Click.cc b/plugins/ladspa_effect/caps/Click.cc index 853c21f39..764410f4e 100644 --- a/plugins/ladspa_effect/caps/Click.cc +++ b/plugins/ladspa_effect/caps/Click.cc @@ -1,7 +1,7 @@ /* Click.cc - Copyright 2002-5 Tim Goetze + Copyright 2002-7 Tim Goetze http://quitte.de/dsp/ @@ -27,28 +27,26 @@ #include "basics.h" -#include "click.h" -#include "money.h" +#include "waves/click.h" +#include "waves/money.h" #include "Click.h" #include "Descriptor.h" void -ClickStub::init (double _fs, float * _wave, int _N) +ClickStub::init (float * _wave, int _N) { - fs = _fs; wave = _wave; N = _N; bpm = -1; - normal = NOISE_FLOOR; } template void ClickStub::one_cycle (int frames) { - bpm = *ports[0]; - d_sample gain = *ports[1] * *ports[1]; + bpm = getport(0); + d_sample gain = getport(1) * *ports[1]; lp.set (1 - *ports[2]); d_sample * d = ports[3]; @@ -120,9 +118,9 @@ ClickStub::port_info [] = #define LENGTH(W) ((int) (sizeof (W) / sizeof (float))) void -Click::init (double fs) +Click::init() { - this->ClickStub::init (fs, click, LENGTH (click)); + this->ClickStub::init (click, LENGTH (click)); } template <> void @@ -132,9 +130,9 @@ Descriptor::setup() Label = "Click"; Properties = HARD_RT; - Name = "CAPS: Click - Metronome"; + Name = CAPS "Click - Metronome"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); @@ -165,9 +163,9 @@ CEO::port_info [] = }; void -CEO::init (double fs) +CEO::init() { - this->ClickStub::init (fs, money, LENGTH (money)); + this->ClickStub::init (money, LENGTH (money)); } template <> void @@ -177,9 +175,9 @@ Descriptor::setup() Label = "CEO"; Properties = HARD_RT; - Name = "CAPS: CEO - Chief Executive Oscillator"; + Name = CAPS "CEO - Chief Executive Oscillator"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); @@ -212,9 +210,9 @@ Dirac::port_info [] = }; void -Dirac::init (double fs) +Dirac::init() { - this->ClickStub::init (fs, dirac, LENGTH (dirac)); + this->ClickStub::init (dirac, LENGTH (dirac)); } template <> void @@ -224,9 +222,9 @@ Descriptor::setup() Label = "Dirac"; Properties = HARD_RT; - Name = "CAPS: Dirac - One-sample impulse generator"; + Name = CAPS "Dirac - One-sample impulse generator"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); diff --git a/plugins/ladspa_effect/caps/Click.h b/plugins/ladspa_effect/caps/Click.h index 63eda873f..1526c484b 100644 --- a/plugins/ladspa_effect/caps/Click.h +++ b/plugins/ladspa_effect/caps/Click.h @@ -32,10 +32,9 @@ #include "dsp/util.h" class ClickStub +: public Plugin { public: - double fs; - d_sample bpm; float * wave; @@ -46,18 +45,13 @@ class ClickStub int period; /* frames remaining in period */ int played; /* frames played from sample */ - d_sample normal; - template - void one_cycle (int frames); + void one_cycle (int frames); public: static PortInfo port_info []; - d_sample * ports [4]; - d_sample adding_gain; - - void init (double _fs, float * _wave, int _N); + void init (float * _wave, int _N); void activate() { @@ -80,14 +74,14 @@ class Click : public ClickStub { public: - void init (double fs); + void init(); }; class CEO : public ClickStub { public: - void init (double fs); + void init(); static PortInfo port_info []; }; @@ -96,7 +90,7 @@ class Dirac : public ClickStub { public: - void init (double fs); + void init(); static PortInfo port_info []; }; diff --git a/plugins/ladspa_effect/caps/Clip.cc b/plugins/ladspa_effect/caps/Clip.cc index b1dcf9c7b..75cfc5ceb 100644 --- a/plugins/ladspa_effect/caps/Clip.cc +++ b/plugins/ladspa_effect/caps/Clip.cc @@ -1,7 +1,7 @@ /* Clip.cc - Copyright 2003-5 Tim Goetze + Copyright 2003-7 Tim Goetze http://quitte.de/dsp/ @@ -31,9 +31,8 @@ #include "Descriptor.h" void -Clip::init (double _fs) +Clip::init() { - fs = _fs; gain = 1; threshold[0] = -.9; @@ -79,12 +78,13 @@ Clip::one_cycle (int frames) { d_sample * s = ports[0]; + double g = getport (1); double gf; - if (*ports[1] == gain_db) + if (g == gain_db) gf = 1; else { - gain_db = *ports[1]; + gain_db = g; d_sample g = DSP::db2lin (gain_db); gf = pow (g / gain, 1 / (double) frames); } @@ -138,9 +138,9 @@ Descriptor::setup() Label = "Clip"; Properties = HARD_RT; - Name = "CAPS: Clip - Hard clipper, 8x oversampled"; + Name = CAPS "Clip - Hard clipper, 8x oversampled"; Maker = "Tim Goetze "; - Copyright = "GPL, 2003-5"; + Copyright = "GPL, 2003-7"; /* fill port info and vtable */ autogen(); diff --git a/plugins/ladspa_effect/caps/Clip.h b/plugins/ladspa_effect/caps/Clip.h index 1f6926ee7..26030f980 100644 --- a/plugins/ladspa_effect/caps/Clip.h +++ b/plugins/ladspa_effect/caps/Clip.h @@ -34,9 +34,9 @@ #include "dsp/windows.h" class Clip +: public Plugin { public: - double fs; d_sample gain, gain_db; d_sample threshold[2]; @@ -51,22 +51,19 @@ class Clip DSP::FIR down; template - void one_cycle (int frames); + void one_cycle (int frames); inline d_sample clip (d_sample x); public: static PortInfo port_info[]; - d_sample * ports [4]; - - d_sample adding_gain; Clip() : up (FIR_SIZE, OVERSAMPLE), down (FIR_SIZE) { } - void init (double fs); + void init(); void activate() { diff --git a/plugins/ladspa_effect/caps/Compress.cc b/plugins/ladspa_effect/caps/Compress.cc index 4f44274b6..078f60b0c 100644 --- a/plugins/ladspa_effect/caps/Compress.cc +++ b/plugins/ladspa_effect/caps/Compress.cc @@ -1,7 +1,7 @@ /* Compress.cc - Copyright 2004-5 Tim Goetze + Copyright 2004-7 Tim Goetze http://quitte.de/dsp/ @@ -31,20 +31,14 @@ #include "Compress.h" #include "Descriptor.h" -void -Compress::init (double _fs) -{ - fs = _fs; -} - template void Compress::one_cycle (int frames) { d_sample * s = ports[0]; - d_sample range = DSP::db2lin (*ports[1]); - d_sample ratio = (*ports[2] - 1) / *ports[2]; + d_sample range = DSP::db2lin (getport(1)); + d_sample ratio = (*ports[2] - 1) / getport(2); /* sc1 has lookup tables here, and they're only 40 % used (400 ms/1 s). * thus, sc1's attack/release controls are a bit coarse due to truncation @@ -57,11 +51,11 @@ Compress::one_cycle (int frames) * * TODO: check whether these parameters work like they should, try pow() */ - double ga = exp (-1 / (fs * *ports[3])); - double gr = exp (-1 / (fs * *ports[4])); + double ga = exp (-1 / (fs * getport(3))); + double gr = exp (-1 / (fs * getport(4))); - d_sample threshold = *ports[5]; - d_sample knee = *ports[6]; + d_sample threshold = getport(5); + d_sample knee = getport(6); d_sample * d = ports[7]; @@ -149,9 +143,9 @@ Descriptor::setup() Label = "Compress"; Properties = HARD_RT; - Name = "CAPS: Compress - Mono compressor"; + Name = CAPS "Compress - Mono compressor"; Maker = "Tim Goetze , Steve Harris "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); diff --git a/plugins/ladspa_effect/caps/Compress.h b/plugins/ladspa_effect/caps/Compress.h index c7209ae2c..c322824a5 100644 --- a/plugins/ladspa_effect/caps/Compress.h +++ b/plugins/ladspa_effect/caps/Compress.h @@ -32,6 +32,7 @@ #include "dsp/util.h" class Compress +: public Plugin { public: double fs; @@ -43,16 +44,12 @@ class Compress int count; template - void one_cycle (int frames); + void one_cycle (int frames); public: static PortInfo port_info []; - d_sample * ports [8]; - - d_sample adding_gain; - - void init (double _fs); + void init() {} void activate() { rms.reset(); diff --git a/plugins/ladspa_effect/caps/Descriptor.h b/plugins/ladspa_effect/caps/Descriptor.h index 429524ac4..44584c5e8 100644 --- a/plugins/ladspa_effect/caps/Descriptor.h +++ b/plugins/ladspa_effect/caps/Descriptor.h @@ -1,24 +1,18 @@ /* Descriptor.h - Copyright 2004-5 Tim Goetze + Copyright 2004-6 Tim Goetze http://quitte.de/dsp/ - creating a LADSPA_Descriptor for a caps plugin via a C++ template, + Creating a LADSPA_Descriptor for a CAPS plugin via a C++ template, saves us a virtual function call compared to the usual method used for C++ plugins in a C context. Descriptor

    expects P to declare some common methods, like init(), activate() etc, plus a static port_info[] and LADSPA_Data * ports[] - and of course 'adding_gain'. - - maintaining both port_info[] and ports[] is a bit of a bitch, but, - hey, "you only do it once (tm)" .. and then you do it over and over - again. particularly bothersome is also the necessary unrolling of our - PortInfo array to fit into LADSPA_Descriptor's inconsequential way of - port data structuring, which results in quite a bit of memory holding - duplicated data. oh well. + and adding_gain. + */ /* This program is free software; you can redistribute it and/or @@ -40,6 +34,13 @@ #ifndef _DESCRIPTOR_H_ #define _DESCRIPTOR_H_ +#ifdef __SSE__ +#include +#endif +#ifdef __SSE3__ +#include +#endif + /* common stub for Descriptor makes it possible to delete() without special- * casing for every plugin class. */ @@ -47,6 +48,8 @@ class DescriptorStub : public LADSPA_Descriptor { public: + static int thishostsucks; + DescriptorStub() { PortCount = 0; @@ -62,23 +65,34 @@ class DescriptorStub } } }; - + +inline void +processor_specific_denormal_measures() +{ + #ifdef __SSE3__ + /* this one works reliably on a 6600 Core2 */ + _MM_SET_DENORMALS_ZERO_MODE (_MM_DENORMALS_ZERO_ON); + #endif + + #ifdef __SSE__ + /* this one doesn't ... */ + _MM_SET_FLUSH_ZERO_MODE (_MM_FLUSH_ZERO_ON); + #endif +} + template class Descriptor : public DescriptorStub { public: - /* tom szilyagi reports that hosts exist which call activate() before - * connect_port(). since caps' plugins expect ports to be valid we + /* Tom Szilyagi reports that hosts exist which call activate() before + * connect_port(). Since CAPS' plugins expect ports to be valid we * need a safeguard: at instantiation, each port is connected to the - * lower bound. When (If?) LADSPA default values are ever fixed, connecting - * to the default will be preferred. */ + * lower bound. */ LADSPA_PortRangeHint * ranges; public: - Descriptor() - { setup(); } - + Descriptor() { setup(); } void setup(); void autogen() @@ -117,12 +131,20 @@ class Descriptor const struct _LADSPA_Descriptor * d, ulong fs) { T * plugin = new T(); - - /* see comment above at 'ranges' member */ - for (int i = 0; i < (int) d->PortCount; ++i) - plugin->ports[i] = &((Descriptor *) d)->ranges[i].LowerBound; + int n = (int) d->PortCount; - plugin->init (fs); + LADSPA_PortRangeHint * ranges = ((Descriptor *) d)->ranges; + plugin->ranges = ranges; + + plugin->ports = new d_sample * [n]; + + /* connect to lower bound as a safety measure */ + for (int i = 0; i < n; ++i) + plugin->ports[i] = &(ranges[i].LowerBound); + + plugin->fs = fs; + plugin->normal = NOISE_FLOOR; + plugin->init(); return plugin; } @@ -134,29 +156,72 @@ class Descriptor static void _activate (LADSPA_Handle h) { - ((T *) h)->activate(); + T * plugin = (T *) h; + + plugin->first_run = 1; + + /* since none of the plugins do any RT-critical work in + * activate(), it's safe to defer the actual call to the + * plugin's activate() method for the first run() after + * the host called in here. + * + * It's simplest way to prevent a parameter smoothing sweep + * in the first audio block after activation. + plugin->activate(); + */ } static void _run (LADSPA_Handle h, ulong n) { - /* cannot call template here (g++ 2.95), sigh. */ - ((T *) h)->run (n); + T * plugin = (T *) h; + + /* We don't reset the processor flags later, it's true. */ + processor_specific_denormal_measures(); + + /* If this is the first audio block after activation, + * initialize the plugin from the current set of parameters. */ + if (plugin->first_run) + { + plugin->activate(); + plugin->first_run = 0; + } + + plugin->run (n); + plugin->normal = -plugin->normal; } static void _run_adding (LADSPA_Handle h, ulong n) { - /* cannot call a template here (g++ 2.95), sigh. */ - ((T *) h)->run_adding (n); + T * plugin = (T *) h; + + /* We don't reset the processor flags later, it's true. */ + processor_specific_denormal_measures(); + + /* If this is the first audio block after activation, + * initialize the plugin from the current set of parameters. */ + if (plugin->first_run) + { + plugin->activate(); + plugin->first_run = 0; + } + + plugin->run_adding (n); + plugin->normal = -plugin->normal; } static void _set_run_adding_gain (LADSPA_Handle h, LADSPA_Data g) { - ((T *) h)->adding_gain = g; + T * plugin = (T *) h; + + plugin->adding_gain = g; } static void _cleanup (LADSPA_Handle h) { - delete (T *) h; + T * plugin = (T *) h; + + delete [] plugin->ports; + delete plugin; } }; diff --git a/plugins/ladspa_effect/caps/Eq.cc b/plugins/ladspa_effect/caps/Eq.cc index 2369a2d1f..ec4884c99 100644 --- a/plugins/ladspa_effect/caps/Eq.cc +++ b/plugins/ladspa_effect/caps/Eq.cc @@ -1,7 +1,7 @@ /* Eq.cc - Copyright 2002-5 Tim Goetze + Copyright 2002-7 Tim Goetze http://quitte.de/dsp/ @@ -31,14 +31,8 @@ #include "Eq.h" #include "Descriptor.h" -void -Eq::init (double _fs) -{ - fs = _fs; - eq.init (fs, 1.2); - normal = NOISE_FLOOR; -} - +/* slight adjustments to gain to keep response optimally flat at + * 0 dB gain in all bands */ inline static double adjust_gain (int i, double g) { @@ -53,13 +47,22 @@ adjust_gain (int i, double g) return g * adjust[i]; } +#define Q 1.2 + +void +Eq::init() +{ + eq.init (fs, Q); +} + void Eq::activate() { for (int i = 0; i < 10; ++i) { - gain[i] = *ports [1 + i]; + gain[i] = getport (1 + i); eq.gain[i] = adjust_gain (i, DSP::db2lin (gain[i])); + eq.gf[i] = 1; } } @@ -71,29 +74,34 @@ Eq::one_cycle (int frames) /* evaluate band gain changes and compute recursion factor to prevent * zipper noise */ - double one_over_n = 1. / frames; + double one_over_n = frames > 0 ? 1. / frames : 1; for (int i = 0; i < 10; ++i) { - if (*ports [1 + i] == gain[i]) + d_sample g = getport (1 + i); + if (g == gain[i]) { /* no gain factoring */ eq.gf[i] = 1; continue; } + gain[i] = g; - gain[i] = *ports [1 + i]; - - double want = adjust_gain (i, DSP::db2lin (gain[i])); + double want = adjust_gain (i, DSP::db2lin (g)); eq.gf[i] = pow (want / eq.gain[i], one_over_n); } d_sample * d = ports[11]; for (int i = 0; i < frames; ++i) - F (d, i, eq.process (s[i] + normal), adding_gain); + { + d_sample x = s[i]; + x = eq.process (x); + F (d, i, x, adding_gain); + } - normal = -normal; + eq.normal = -normal; + eq.flush_0(); } /* //////////////////////////////////////////////////////////////////////// */ @@ -108,43 +116,43 @@ Eq::port_info [] = }, { "31 Hz", INPUT | CONTROL, - {BOUNDED | DEFAULT_0, -48, 30} + {BOUNDED | DEFAULT_LOW, -48, 24} }, { "63 Hz", INPUT | CONTROL, - {BOUNDED | DEFAULT_0, -48, 30} + {BOUNDED | DEFAULT_0, -48, 24} }, { "125 Hz", INPUT | CONTROL, - {BOUNDED | DEFAULT_0, -48, 30} + {BOUNDED | DEFAULT_0, -48, 24} }, { "250 Hz", INPUT | CONTROL, - {BOUNDED | DEFAULT_0, -48, 30} + {BOUNDED | DEFAULT_0, -48, 24} }, { "500 Hz", INPUT | CONTROL, - {BOUNDED | DEFAULT_0, -48, 30} + {BOUNDED | DEFAULT_0, -48, 24} }, { "1 kHz", INPUT | CONTROL, - {BOUNDED | DEFAULT_0, -48, 30} + {BOUNDED | DEFAULT_0, -48, 24} }, { "2 kHz", INPUT | CONTROL, - {BOUNDED | DEFAULT_0, -48, 30} + {BOUNDED | DEFAULT_0, -48, 24} }, { "4 kHz", INPUT | CONTROL, - {BOUNDED | DEFAULT_0, -48, 30} + {BOUNDED | DEFAULT_0, -48, 24} }, { "8 kHz", INPUT | CONTROL, - {BOUNDED | DEFAULT_0, -48, 30} + {BOUNDED | DEFAULT_0, -48, 24} }, { "16 kHz", INPUT | CONTROL, - {BOUNDED | DEFAULT_0, -48, 30} + {BOUNDED | DEFAULT_0, -48, 24} }, { "out", OUTPUT | AUDIO, @@ -159,11 +167,164 @@ Descriptor::setup() Label = "Eq"; Properties = HARD_RT; - Name = "CAPS: Eq - 10-band 'analogue' equalizer"; + Name = CAPS "Eq - 10-band equalizer"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); } +/* //////////////////////////////////////////////////////////////////////// */ + +void +Eq2x2::init() +{ + for (int c = 0; c < 2; ++c) + eq[c].init (fs, Q); +} + +void +Eq2x2::activate() +{ + /* Fetch current parameter settings so we won't sweep band gains in the + * first block to process. + */ + for (int i = 0; i < 10; ++i) + { + gain[i] = getport (2 + i); + double a = adjust_gain (i, DSP::db2lin (gain[i])); + for (int c = 0; c < 2; ++c) + eq[c].gf[i] = 1, + eq[c].gain[i] = a; + } +} + +template +void +Eq2x2::one_cycle (int frames) +{ + /* evaluate band gain changes and compute recursion factor to prevent + * zipper noise */ + double one_over_n = frames > 0 ? 1. / frames : 1; + + for (int i = 0; i < 10; ++i) + { + double a; + + if (*ports [2 + i] == gain[i]) + /* still same value, no gain fade */ + a = 1; + else + { + gain[i] = getport (2 + i); + + /* prepare factor for logarithmic gain fade */ + a = adjust_gain (i, DSP::db2lin (gain[i])); + a = pow (a / eq[0].gain[i], one_over_n); + } + + for (int c = 0; c < 2; ++c) + eq[c].gf[i] = a; + } + + for (int c = 0; c < 2; ++c) + { + d_sample + * s = ports[c], + * d = ports[12 + c]; + + for (int i = 0; i < frames; ++i) + { + d_sample x = s[i]; + x = eq[c].process (x); + F (d, i, x, adding_gain); + } + } + + /* flip 'renormal' values */ + for (int c = 0; c < 2; ++c) + { + eq[c].normal = normal; + eq[c].flush_0(); + } +} + +PortInfo +Eq2x2::port_info [] = +{ + { + "in:l", + INPUT | AUDIO, + {0, -1, 1} + }, { + "in:r", + INPUT | AUDIO, + {0, -1, 1} + }, { + "31 Hz", + INPUT | CONTROL, + {BOUNDED | DEFAULT_0, -48, 24} + }, { + "63 Hz", + INPUT | CONTROL, + {BOUNDED | DEFAULT_0, -48, 24} + }, { + "125 Hz", + INPUT | CONTROL, + {BOUNDED | DEFAULT_0, -48, 24} + }, { + "250 Hz", + INPUT | CONTROL, + {BOUNDED | DEFAULT_0, -48, 24} + }, { + "500 Hz", + INPUT | CONTROL, + {BOUNDED | DEFAULT_0, -48, 24} + }, { + "1 kHz", + INPUT | CONTROL, + {BOUNDED | DEFAULT_0, -48, 24} + }, { + "2 kHz", + INPUT | CONTROL, + {BOUNDED | DEFAULT_0, -48, 24} + }, { + "4 kHz", + INPUT | CONTROL, + {BOUNDED | DEFAULT_0, -48, 24} + }, { + "8 kHz", + INPUT | CONTROL, + {BOUNDED | DEFAULT_0, -48, 24} + }, { + "16 kHz", + INPUT | CONTROL, + {BOUNDED | DEFAULT_0, -48, 24} + }, { + "out:l", + OUTPUT | AUDIO, + {0} + }, { + "out:r", + OUTPUT | AUDIO, + {0} + } +}; + +template <> void +Descriptor::setup() +{ + UniqueID = 2594; + Label = "Eq2x2"; + Properties = HARD_RT; + + Name = CAPS "Eq2x2 - stereo 10-band equalizer"; + Maker = "Tim Goetze "; + Copyright = "GPL, 2004-7"; + + /* fill port info and vtable */ + autogen(); +} + + diff --git a/plugins/ladspa_effect/caps/Eq.h b/plugins/ladspa_effect/caps/Eq.h index 3ef1c281c..d6b83dc62 100644 --- a/plugins/ladspa_effect/caps/Eq.h +++ b/plugins/ladspa_effect/caps/Eq.h @@ -28,29 +28,55 @@ #ifndef _EQ_H_ #define _EQ_H_ -#include "dsp/Eq.h" #include "dsp/util.h" +#include "dsp/Eq.h" +#include "dsp/BiQuad.h" +#include "dsp/RBJ.h" class Eq +: public Plugin { public: - double fs; d_sample gain[10]; - d_sample normal; + DSP::Eq<10> eq; - DSP::Eq<10,12> eq; + int block; + enum { BlockSize = 64 }; template - void one_cycle (int frames); + void one_cycle (int frames); public: static PortInfo port_info []; - d_sample * ports [12]; - d_sample adding_gain; + void init(); + void activate(); - void init (double _fs); + void run (int n) + { + one_cycle (n); + } + + void run_adding (int n) + { + one_cycle (n); + } +}; +class Eq2x2 +: public Plugin +{ + public: + d_sample gain[10]; + DSP::Eq<10> eq[2]; + + template + void one_cycle (int frames); + + public: + static PortInfo port_info []; + + void init(); void activate(); void run (int n) diff --git a/plugins/ladspa_effect/caps/HRTF.cc b/plugins/ladspa_effect/caps/HRTF.cc index 73cec03d8..56d995414 100644 --- a/plugins/ladspa_effect/caps/HRTF.cc +++ b/plugins/ladspa_effect/caps/HRTF.cc @@ -1,7 +1,7 @@ /* HRTF.cc - Copyright 2002-5 Tim Goetze + Copyright 2002-7 Tim Goetze http://quitte.de/dsp/ @@ -35,9 +35,8 @@ /* //////////////////////////////////////////////////////////////////////// */ void -HRTF::init (double fs) +HRTF::init() { - normal = NOISE_FLOOR; h = 0; } @@ -74,7 +73,7 @@ HRTF::one_cycle (int frames) { d_sample * s = ports[0]; - int p = (int) *ports[1]; + int p = (int) getport(1); if (p != pan) set_pan (p); d_sample * dl = ports[2]; @@ -106,8 +105,6 @@ HRTF::one_cycle (int frames) F (dl, i, l, adding_gain); F (dr, i, r, adding_gain); } - - normal = -normal; } /* //////////////////////////////////////////////////////////////////////// */ @@ -141,9 +138,9 @@ Descriptor::setup() Label = "HRTF"; Properties = HARD_RT; - Name = "CAPS: HRTF - Head-related transfer function at elevation 0"; + Name = CAPS "HRTF - Head-related transfer function at elevation 0"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); diff --git a/plugins/ladspa_effect/caps/HRTF.h b/plugins/ladspa_effect/caps/HRTF.h index 6e4277014..c2a5f4a77 100644 --- a/plugins/ladspa_effect/caps/HRTF.h +++ b/plugins/ladspa_effect/caps/HRTF.h @@ -31,6 +31,7 @@ #include "dsp/util.h" class HRTF +: public Plugin { public: int pan; @@ -45,19 +46,13 @@ class HRTF void set_pan (int p); - d_sample normal; - template void one_cycle (int frames); public: static PortInfo port_info []; - d_sample * ports [4]; - - d_sample adding_gain; - - void init (double _fs); + void init(); void activate() { set_pan ((int) *ports[1]); diff --git a/plugins/ladspa_effect/caps/Lorenz.cc b/plugins/ladspa_effect/caps/Lorenz.cc index 92e48417d..77759e59c 100644 --- a/plugins/ladspa_effect/caps/Lorenz.cc +++ b/plugins/ladspa_effect/caps/Lorenz.cc @@ -1,7 +1,7 @@ /* Lorenz.cc - Copyright 2002-5 Tim Goetze + Copyright 2002-7 Tim Goetze http://quitte.de/dsp/ @@ -33,9 +33,8 @@ #include "Descriptor.h" void -Lorenz::init (double _fs) +Lorenz::init() { - fs = _fs; lorenz.init (h = .001, 0.1 * frandom()); gain = 0; } @@ -47,11 +46,11 @@ Lorenz::one_cycle (int frames) lorenz.set_rate (*ports[0]); double g = (gain == *ports[4]) ? - 1 : pow (*ports[4] / gain, 1. / (double) frames); + 1 : pow (getport(4) / gain, 1. / (double) frames); d_sample * d = ports[5]; - d_sample x, sx = *ports[1], sy = *ports[2], sz = *ports[3]; + d_sample x, sx = getport(1), sy = getport(2), sz = getport(3); for (int i = 0; i < frames; ++i) { @@ -63,7 +62,7 @@ Lorenz::one_cycle (int frames) gain *= g; } - gain = *ports[4]; + gain = getport(4); } /* //////////////////////////////////////////////////////////////////////// */ @@ -105,9 +104,9 @@ Descriptor::setup() Label = "Lorenz"; Properties = HARD_RT; - Name = "CAPS: Lorenz - The sound of a Lorenz attractor"; + Name = CAPS "Lorenz - The sound of a Lorenz attractor"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); diff --git a/plugins/ladspa_effect/caps/Lorenz.h b/plugins/ladspa_effect/caps/Lorenz.h index f1186aa2c..b386d9cd4 100644 --- a/plugins/ladspa_effect/caps/Lorenz.h +++ b/plugins/ladspa_effect/caps/Lorenz.h @@ -31,26 +31,21 @@ #include "dsp/Lorenz.h" class Lorenz +: public Plugin { public: - double fs; d_sample h, gain; DSP::Lorenz lorenz; template - void one_cycle (int frames); + void one_cycle (int frames); public: static PortInfo port_info []; - d_sample * ports [6]; - d_sample adding_gain; - - void init (double _fs); - - void activate() - { } + void init(); + void activate() {} void run (int n) { diff --git a/plugins/ladspa_effect/caps/Makefile.am b/plugins/ladspa_effect/caps/Makefile.am index 1a11b1e11..97eb9dbb6 100644 --- a/plugins/ladspa_effect/caps/Makefile.am +++ b/plugins/ladspa_effect/caps/Makefile.am @@ -1,7 +1,7 @@ AUTOMAKE_OPTIONS = foreign 1.4 -AM_CXXFLAGS := $(AM_CXXFLAGS) -O6 -ffast-math -funroll-loops -ftracer -I../../../include +AM_CXXFLAGS := $(AM_CXXFLAGS) -O2 -I../../../include DEST = $(DESTDIR)$(libdir)/$(PACKAGE)/ladspa SOURCES = $(wildcard *.cc) @@ -15,7 +15,7 @@ clean: rm -f *.o *.so *.s depend install: all - strip caps.so +# strip caps.so install -d $(DEST) install -m 644 caps.so $(DEST) diff --git a/plugins/ladspa_effect/caps/Pan.cc b/plugins/ladspa_effect/caps/Pan.cc index 24586159f..24e992cf0 100644 --- a/plugins/ladspa_effect/caps/Pan.cc +++ b/plugins/ladspa_effect/caps/Pan.cc @@ -1,7 +1,7 @@ /* Pan.cc - Copyright 2002-5 Tim Goetze + Copyright 2002-7 Tim Goetze http://quitte.de/dsp/ @@ -31,11 +31,9 @@ #include "Descriptor.h" void -Pan::init (double _fs) +Pan::init() { - fs = _fs; delay.init ((int) (.040 * fs)); - normal = NOISE_FLOOR; } void @@ -64,15 +62,16 @@ Pan::one_cycle (int frames) d_sample * s = ports[0]; if (pan != *ports[1]) - set_pan (*ports[1]); + set_pan (getport(1)); + d_sample g = getport(2); d_sample - width_l = *ports[2] * gain_r, - width_r = *ports[2] * gain_l; + width_l = g * gain_r, + width_r = g * gain_l; - tap.t = (int) (*ports[3] * fs * .001); + tap.t = (int) (getport(3) * fs * .001); - bool mono = *ports[4]; + bool mono = getport(4); d_sample * dl = ports[5]; d_sample * dr = ports[6]; @@ -152,9 +151,9 @@ Descriptor::setup() Label = "Pan"; Properties = HARD_RT; - Name = "CAPS: Pan - Pan and width"; + Name = CAPS "Pan - Pan and width"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); diff --git a/plugins/ladspa_effect/caps/Pan.h b/plugins/ladspa_effect/caps/Pan.h index 3ba2fcc26..61176be5b 100644 --- a/plugins/ladspa_effect/caps/Pan.h +++ b/plugins/ladspa_effect/caps/Pan.h @@ -50,30 +50,25 @@ class PanTap }; class Pan +: public Plugin { public: - double fs; d_sample pan; d_sample gain_l, gain_r; - d_sample normal; DSP::Delay delay; PanTap tap; template - void one_cycle (int frames); + void one_cycle (int frames); inline void set_pan (d_sample); public: static PortInfo port_info []; - d_sample * ports [7]; - - d_sample adding_gain; - - void init (double _fs); + void init(); void activate(); void run (int n) diff --git a/plugins/ladspa_effect/caps/Phaser.cc b/plugins/ladspa_effect/caps/Phaser.cc index ab1e0bade..817434e6b 100644 --- a/plugins/ladspa_effect/caps/Phaser.cc +++ b/plugins/ladspa_effect/caps/Phaser.cc @@ -1,7 +1,7 @@ /* Phaser.cc - Copyright 2002-5 Tim Goetze + Copyright 2002-7 Tim Goetze http://quitte.de/dsp/ @@ -41,18 +41,16 @@ PhaserI::one_cycle (int frames) if (rate != *ports[1]) { - rate = *ports[1]; + rate = getport(1); lfo.set_f (max (.001, rate * (double) blocksize), fs, lfo.get_phase()); } - double depth = *ports[2]; - double spread = 1 + *ports[3]; - double fb = *ports[4]; + double depth = getport(2); + double spread = 1 + getport(3); + double fb = getport(4); d_sample * dst = ports[5]; - normal = -normal; - while (frames) { if (remain == 0) remain = 32; @@ -126,9 +124,9 @@ Descriptor::setup() Label = "PhaserI"; Properties = HARD_RT; - Name = "CAPS: PhaserI - Mono phaser"; + Name = CAPS "PhaserI - Mono phaser"; Maker = "Tim Goetze "; - Copyright = "GPL, 2002-5"; + Copyright = "GPL, 2002-7"; /* fill port info and vtable */ autogen(); @@ -142,16 +140,14 @@ PhaserII::one_cycle (int frames) { d_sample * s = ports[0]; - lorenz.set_rate (*ports[1] * .08); + lorenz.set_rate (getport(1) * .08); - double depth = *ports[2]; - double spread = 1 + *ports[3]; - double fb = *ports[4]; + double depth = getport(2); + double spread = 1 + getport(3); + double fb = getport(4); d_sample * dst = ports[5]; - normal = -normal; - while (frames) { if (remain == 0) remain = 32; @@ -225,9 +221,9 @@ Descriptor::setup() Label = "PhaserII"; Properties = HARD_RT; - Name = "CAPS: PhaserII - Mono phaser modulated by a Lorenz fractal"; + Name = CAPS "PhaserII - Mono phaser modulated by a Lorenz fractal"; Maker = "Tim Goetze "; - Copyright = "GPL, 2002-5"; + Copyright = "GPL, 2002-7"; /* fill port info and vtable */ autogen(); diff --git a/plugins/ladspa_effect/caps/Phaser.h b/plugins/ladspa_effect/caps/Phaser.h index 9e7923f7a..dd30e8cc7 100644 --- a/plugins/ladspa_effect/caps/Phaser.h +++ b/plugins/ladspa_effect/caps/Phaser.h @@ -58,37 +58,30 @@ class PhaserAP }; class PhaserI +: public Plugin { public: - double fs; - PhaserAP ap[6]; DSP::Sine lfo; d_sample rate; d_sample y0; - d_sample normal; struct { double bottom, range; } delay; template - void one_cycle (int frames); + void one_cycle (int frames); int blocksize, remain; public: - d_sample * ports [6]; - static PortInfo port_info []; - d_sample adding_gain; - void init (double _fs) + void init() { - fs = _fs; blocksize = 32; - normal = NOISE_FLOOR; } void activate() @@ -116,6 +109,7 @@ class PhaserI /* same as above, but filter sweep is controlled by a Lorenz fractal */ class PhaserII +: public Plugin { public: double fs; @@ -125,28 +119,22 @@ class PhaserII d_sample rate; d_sample y0; - d_sample normal; struct { double bottom, range; } delay; template - void one_cycle (int frames); + void one_cycle (int frames); int blocksize, remain; public: - d_sample * ports [6]; - static PortInfo port_info []; - d_sample adding_gain; - void init (double _fs) + void init() { - fs = _fs; blocksize = 32; - normal = NOISE_FLOOR; lorenz.init(); } diff --git a/plugins/ladspa_effect/caps/Preamp.cc b/plugins/ladspa_effect/caps/Preamp.cc index da3a2d68a..79a416b65 100644 --- a/plugins/ladspa_effect/caps/Preamp.cc +++ b/plugins/ladspa_effect/caps/Preamp.cc @@ -1,11 +1,11 @@ /* Preamp.cc - Copyright 2003-5 Tim Goetze + Copyright 2003-7 Tim Goetze http://quitte.de/dsp/ - loosely 12AX7-based tube preamp model, 8x oversampling. + Loosely 12AX7-based tube preamp model with 8x oversampling. */ /* This program is free software; you can redistribute it and/or @@ -31,11 +31,11 @@ #include "Descriptor.h" void -PreampIII::init (double _fs) +PreampIII::init() { - this->AmpStub::init (_fs); + this->AmpStub::init(); - DSP::RBJ::LoShelve (200 / (_fs), .2, -6, filter.a, filter.b); + DSP::RBJ::LoShelve (200 / fs, .2, -6, filter.a, filter.b); } template @@ -43,8 +43,8 @@ void PreampIII::one_cycle (int frames) { d_sample * s = ports[0]; - d_sample gain = *ports[1]; - d_sample temp = *ports[2] * tube.scale; + d_sample gain = getport(1); + d_sample temp = getport(2) * tube.scale; d_sample * d = ports[3]; *ports[4] = OVERSAMPLE; @@ -57,7 +57,7 @@ PreampIII::one_cycle (int frames) if (g == 0) g = current.g; /* recursive fade to prevent zipper noise from the 'gain' knob */ - double one_over_n = 1. / frames; + double one_over_n = frames > 0 ? 1. / frames : 1; double gf = pow (current.g / g, one_over_n); for (int i = 0; i < frames; ++i) @@ -77,7 +77,6 @@ PreampIII::one_cycle (int frames) } current.g = g; - normal = -normal; } /* //////////////////////////////////////////////////////////////////////// */ @@ -115,9 +114,9 @@ Descriptor::setup() Label = "PreampIII"; Properties = HARD_RT; - Name = "CAPS: PreampIII - Tube preamp emulation"; + Name = CAPS "PreampIII - Tube preamp emulation"; Maker = "Tim Goetze "; - Copyright = "GPL, 2002-5"; + Copyright = "GPL, 2002-7"; /* fill port info and vtable */ autogen(); @@ -126,11 +125,10 @@ Descriptor::setup() /* //////////////////////////////////////////////////////////////////////// */ void -PreampIV::init (double _fs) +PreampIV::init() { - this->AmpStub::init (_fs); - - tone.init (_fs); + this->AmpStub::init(); + tone.init (fs); } void @@ -145,11 +143,11 @@ template void PreampIV::one_cycle (int frames) { - double one_over_n = 1. / frames; + double one_over_n = frames > 0 ? 1. / frames : 1; d_sample * s = ports[0]; - d_sample gain = *ports[1]; - d_sample temp = *ports[2] * tube.scale; + d_sample gain = getport(1); + d_sample temp = getport(2) * tube.scale; tone.start_cycle (ports + 3, one_over_n); @@ -183,7 +181,6 @@ PreampIV::one_cycle (int frames) } current.g = g; - normal = -normal; } /* //////////////////////////////////////////////////////////////////////// */ @@ -237,9 +234,9 @@ Descriptor::setup() Label = "PreampIV"; Properties = HARD_RT; - Name = "CAPS: PreampIV - Tube preamp emulation + tone controls"; + Name = CAPS "PreampIV - Tube preamp emulation + tone controls"; Maker = "Tim Goetze "; - Copyright = "GPL, 2002-5"; + Copyright = "GPL, 2002-7"; /* fill port info and vtable */ autogen(); diff --git a/plugins/ladspa_effect/caps/README b/plugins/ladspa_effect/caps/README index 93e353619..58fc72ec8 100644 --- a/plugins/ladspa_effect/caps/README +++ b/plugins/ladspa_effect/caps/README @@ -1,67 +1,7 @@ -This is caps, the C Audio Plugin Suite +This is CAPS, the C Audio Plugin Suite ====================================== -Copyright 2002-5 Tim Goetze and others. - - -License information -------------------- - -See the file "COPYING" for licensing terms & conditions for usage, -and a DISCLAIMER OF ALL WARRANTIES. - - -What is this caps thing? ------------------------- - -caps is a collection of refined realtime-capable LADSPA audio DSP -plugins. It helps your computer sound better. - - -Documentation -------------- - -Please point your browser to the file 'caps.html' in this directory. - - -Web site and latest version ---------------------------- - -The latest information and package release reside at +For all questions, please be referred to the HTML documentation of +this software package in the file 'caps.html', also available from http://quitte.de/dsp/caps.html - - -Installation -============ - -At the shell prompt, enter (without the '$' denoting the prompt itself): - -$ make - -then, as the superuser, enter: - -# make install - -and you're done. You can now use the plugins in any LADSPA-aware audio -application. - -Please note that the default installation path is /usr/local/lib/ladspa; -if you prefer another place, you need to edit the makefile, or install -manually. - - -Bug reports ------------ - -Bug reports should be sent to . Please include a detailed -description of the misbehaviour and instructions on how to reproduce the -bug. - - -Troubleshooting ---------------- - -caps is known to compile well with gnu make, gcc 2.95, 3.3 and 4.0. -If you have trouble compiling it, please send mail containing the -output of the 'make' command to . diff --git a/plugins/ladspa_effect/caps/Reverb.cc b/plugins/ladspa_effect/caps/Reverb.cc index c383a1295..33627f7ad 100644 --- a/plugins/ladspa_effect/caps/Reverb.cc +++ b/plugins/ladspa_effect/caps/Reverb.cc @@ -1,7 +1,7 @@ /* Reverb.cc - Copyright 2002-5 Tim Goetze + Copyright 2002-7 Tim Goetze http://quitte.de/dsp/ @@ -57,11 +57,8 @@ JVRev::default_length[9] = { }; void -JVRev::init (double _fs) +JVRev::init() { - fs = _fs; - normal = NOISE_FLOOR; - memcpy (length, default_length, sizeof (length)); if (fs != 44100) @@ -114,7 +111,7 @@ JVRev::activate() left.reset(); right.reset(); - set_t60 (*ports[1]); + set_t60 (getport(1)); } template @@ -124,15 +121,13 @@ JVRev::one_cycle (int frames) d_sample * s = ports[0]; if (t60 != *ports[1]) - set_t60 (*ports[1]); + set_t60 (getport(1)); - double wet = *ports[2], dry = 1 - wet; + double wet = getport(2), dry = 1 - wet; d_sample * dl = ports[3]; d_sample * dr = ports[4]; - normal = -normal; - for (int i = 0; i < frames; ++i) { d_sample x = s[i], a = x + normal; @@ -191,9 +186,9 @@ Descriptor::setup() Label = "JVRev"; Properties = HARD_RT; - Name = "CAPS: JVRev - Stanford-style reverb from STK"; + Name = CAPS "JVRev - Stanford-style reverb from STK"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); @@ -202,9 +197,8 @@ Descriptor::setup() /* //////////////////////////////////////////////////////////////////////// */ void -PlateStub::init (double _fs) +PlateStub::init() { - fs = _fs; f_lfo = -1; # define L(i) ((int) (l[i] * fs)) @@ -257,8 +251,6 @@ PlateStub::init (double _fs) dediff1 = .723; dediff2 = .729; - - normal = NOISE_FLOOR; } inline void @@ -321,15 +313,15 @@ Plate::one_cycle (int frames) { d_sample * s = ports[0]; - input.bandwidth.set (exp (-M_PI * (1. - *ports[1]))); + input.bandwidth.set (exp (-M_PI * (1. - getport(1)))); - d_sample decay = *ports[2]; + d_sample decay = getport(2); - double damp = exp (-M_PI * *ports[3]); + double damp = exp (-M_PI * getport(3)); tank.damping[0].set (damp); tank.damping[1].set (damp); - d_sample blend = *ports[4], dry = 1 - blend; + d_sample blend = getport(4), dry = 1 - blend; d_sample * dl = ports[5]; d_sample * dr = ports[6]; @@ -339,8 +331,8 @@ Plate::one_cycle (int frames) for (int i = 0; i < frames; ++i) { - d_sample x = s[i] + normal; normal = -normal; + d_sample x = s[i] + normal; d_sample xl, xr; @@ -396,9 +388,9 @@ Descriptor::setup() Label = "Plate"; Properties = HARD_RT; - Name = "CAPS: Plate - Versatile plate reverb"; + Name = CAPS "Plate - Versatile plate reverb"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); @@ -413,15 +405,15 @@ Plate2x2::one_cycle (int frames) d_sample * sl = ports[0]; d_sample * sr = ports[1]; - input.bandwidth.set (exp (-M_PI * (1. - *ports[2]))); + input.bandwidth.set (exp (-M_PI * (1. - getport(2)))); - d_sample decay = *ports[3]; + d_sample decay = getport(3); - double damp = exp (-M_PI * *ports[4]); + double damp = exp (-M_PI * getport(4)); tank.damping[0].set (damp); tank.damping[1].set (damp); - d_sample blend = *ports[5], dry = 1 - blend; + d_sample blend = getport(5), dry = 1 - blend; d_sample * dl = ports[6]; d_sample * dr = ports[7]; @@ -432,7 +424,6 @@ Plate2x2::one_cycle (int frames) for (int i = 0; i < frames; ++i) { normal = -normal; - d_sample x = (sl[i] + sr[i] + normal) * .5; d_sample xl, xr; @@ -493,9 +484,9 @@ Descriptor::setup() Label = "Plate2x2"; Properties = HARD_RT; - Name = "CAPS: Plate2x2 - Versatile plate reverb, stereo inputs"; + Name = CAPS "Plate2x2 - Versatile plate reverb, stereo inputs"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); diff --git a/plugins/ladspa_effect/caps/Reverb.h b/plugins/ladspa_effect/caps/Reverb.h index 4e2037f99..e7a15a316 100644 --- a/plugins/ladspa_effect/caps/Reverb.h +++ b/plugins/ladspa_effect/caps/Reverb.h @@ -86,10 +86,10 @@ class JVComb }; class JVRev +: public Plugin { public: static int default_length[9]; - double fs; d_sample t60; Lattice allpass [3]; @@ -99,8 +99,6 @@ class JVRev double apc; - d_sample normal; - template void one_cycle (int frames); @@ -110,12 +108,8 @@ class JVRev public: static PortInfo port_info []; - d_sample * ports [5]; - - d_sample adding_gain; - - void init (double _fs); + void init(); void activate(); void run (int n) @@ -165,9 +159,9 @@ class ModLattice }; class PlateStub +: public Plugin { public: - double fs; d_sample f_lfo; d_sample indiff1, indiff2, dediff1, dediff2; @@ -185,13 +179,8 @@ class PlateStub int taps[12]; } tank; - d_sample normal; - public: - d_sample adding_gain; - - void init (double _fs); - + void init(); void activate() { input.bandwidth.reset(); @@ -228,7 +217,6 @@ class Plate public: static PortInfo port_info []; - d_sample * ports [7]; void run (int n) { @@ -252,7 +240,6 @@ class Plate2x2 public: static PortInfo port_info []; - d_sample * ports [8]; void run (int n) { diff --git a/plugins/ladspa_effect/caps/Roessler.cc b/plugins/ladspa_effect/caps/Roessler.cc index 9302cbcdc..b7ac1f321 100644 --- a/plugins/ladspa_effect/caps/Roessler.cc +++ b/plugins/ladspa_effect/caps/Roessler.cc @@ -1,7 +1,7 @@ /* Roessler.cc - Copyright 2002-5 Tim Goetze + Copyright 2002-7 Tim Goetze http://quitte.de/dsp/ @@ -33,9 +33,8 @@ #include "Descriptor.h" void -Roessler::init (double _fs) +Roessler::init() { - fs = _fs; roessler.init (h = .001, frandom()); gain = 0; } @@ -44,17 +43,17 @@ template void Roessler::one_cycle (int frames) { - roessler.set_rate (*ports[0]); + roessler.set_rate (getport(0)); - double g = (gain == *ports[4]) ? - 1 : pow (*ports[4] / gain, 1. / (double) frames); + double g = (gain == getport(4)) ? + 1 : pow (getport(4) / gain, 1. / (double) frames); d_sample * d = ports[5]; d_sample x, - sx = .043 * *ports[1], - sy = .051 * *ports[2], - sz = .018 * *ports[3]; + sx = .043 * getport(1), + sy = .051 * getport(2), + sz = .018 * getport(3); for (int i = 0; i < frames; ++i) { @@ -69,7 +68,7 @@ Roessler::one_cycle (int frames) gain *= g; } - gain = *ports[4]; + gain = getport(4); } /* //////////////////////////////////////////////////////////////////////// */ @@ -111,9 +110,9 @@ Descriptor::setup() Label = "Roessler"; Properties = HARD_RT; - Name = "CAPS: Roessler - The sound of a Roessler attractor"; + Name = CAPS "Roessler - The sound of a Roessler attractor"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); diff --git a/plugins/ladspa_effect/caps/Roessler.h b/plugins/ladspa_effect/caps/Roessler.h index d6dd0ac2a..845b77dd9 100644 --- a/plugins/ladspa_effect/caps/Roessler.h +++ b/plugins/ladspa_effect/caps/Roessler.h @@ -31,9 +31,9 @@ #include "dsp/Roessler.h" class Roessler +: public Plugin { public: - double fs; d_sample h, gain; DSP::Roessler roessler; @@ -43,14 +43,11 @@ class Roessler public: static PortInfo port_info []; - d_sample * ports [6]; d_sample adding_gain; - void init (double _fs); - - void activate() - { } + void init(); + void activate() {} void run (int n) { diff --git a/plugins/ladspa_effect/caps/Scape.cc b/plugins/ladspa_effect/caps/Scape.cc index 6d0707116..0df250115 100644 --- a/plugins/ladspa_effect/caps/Scape.cc +++ b/plugins/ladspa_effect/caps/Scape.cc @@ -1,7 +1,7 @@ /* Scape.cc - Copyright 2004-6 Tim Goetze + Copyright 2004-7 Tim Goetze http://quitte.de/dsp/ @@ -66,15 +66,15 @@ Scape::one_cycle (int frames) // double one_over_n = 1 / (double) frames; /* delay times */ - double t1 = fs * 60. / *ports[1]; - int div = (int) *ports[2]; + double t1 = fs * 60. / getport(1); + int div = (int) getport(2); double t2 = t1 * dividers[div]; - fb = *ports[3]; + fb = getport(3); - double dry = *ports[4]; + double dry = getport(4); dry = dry * dry; - double blend = *ports[5]; + double blend = getport(5); d_sample * dl = ports[6]; d_sample * dr = ports[7]; @@ -92,7 +92,6 @@ Scape::one_cycle (int frames) period = t2 * .5; float f, q; - //fprintf (stderr, "%.3f: %d\n", period, (int) period); f = frandom2(); svf[0].set_f_Q (300 + 300 * f / fs, .3); svf[3].set_f_Q (300 + 600 * 2 * f / fs, .6); @@ -107,10 +106,13 @@ Scape::one_cycle (int frames) int n = min ((int) period, frames); if (n < 1) { + /* not reached */ + #ifdef DEBUG fprintf (stderr, "Scape: %d - %d/%d frames, t2 = %.3f?!?\n", (int) period, n, frames, t2); + #endif return; } - + /* sample loop */ for (int i = 0; i < n; ++i) { @@ -193,9 +195,9 @@ Descriptor::setup() Label = "Scape"; Properties = HARD_RT; - Name = "CAPS: Scape - Stereo delay + Filters"; + Name = CAPS "Scape - Stereo delay + Filters"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-6"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); diff --git a/plugins/ladspa_effect/caps/Scape.h b/plugins/ladspa_effect/caps/Scape.h index d68256a16..dfbb9b19b 100644 --- a/plugins/ladspa_effect/caps/Scape.h +++ b/plugins/ladspa_effect/caps/Scape.h @@ -38,12 +38,11 @@ typedef DSP::SVF<1> SVF; class Scape +: public Plugin { public: - double fs; d_sample time, fb; double period; - d_sample normal; /* denormal protection */ DSP::Lorenz lfo[2]; DSP::Delay delay; @@ -51,28 +50,14 @@ class Scape DSP::OnePoleHP hipass[4]; template - void one_cycle (int frames); + void one_cycle (int frames); public: - d_sample * ports [8]; - /* - * in - * bpm - * div - * feedback - * dry - * blend - * out:l - * out:r - */ static PortInfo port_info []; - d_sample adding_gain; - void init (double _fs) + void init() { - fs = _fs; delay.init ((int) (2.01 * fs)); /* two seconds = 30 bpm + */ - normal = NOISE_FLOOR; for (int i = 0; i < 2; ++i) lfo[i].init(), lfo[i].set_rate (.00000001 * fs); diff --git a/plugins/ladspa_effect/caps/Sin.cc b/plugins/ladspa_effect/caps/Sin.cc index a527ee081..3f45196f2 100644 --- a/plugins/ladspa_effect/caps/Sin.cc +++ b/plugins/ladspa_effect/caps/Sin.cc @@ -1,7 +1,7 @@ /* Sin.cc - Copyright 2002-5 Tim Goetze + Copyright 2002-7 Tim Goetze http://quitte.de/dsp/ @@ -31,9 +31,8 @@ #include "Descriptor.h" void -Sin::init (double _fs) +Sin::init() { - fs = _fs; sin.set_f (f = .005, fs, 0); gain = 0; } @@ -43,10 +42,10 @@ void Sin::one_cycle (int frames) { if (f != *ports[0]) - sin.set_f (f = *ports[0], fs, sin.get_phase()); + sin.set_f (f = getport(0), fs, sin.get_phase()); double g = (gain == *ports[1]) ? - 1 : pow (*ports[1] / gain, 1. / (double) frames); + 1 : pow (getport(1) / gain, 1. / (double) frames); d_sample * d = ports[2]; @@ -56,7 +55,7 @@ Sin::one_cycle (int frames) gain *= g; } - gain = *ports[1]; + gain = getport(1); } /* //////////////////////////////////////////////////////////////////////// */ @@ -67,7 +66,7 @@ Sin::port_info [] = { "f", INPUT | CONTROL, - {BOUNDED | FS | LOG | DEFAULT_440, 0, .5} + {BOUNDED | LOG | DEFAULT_100, 0.0001, 20000} }, { "volume", INPUT | CONTROL, @@ -86,9 +85,9 @@ Descriptor::setup() Label = "Sin"; Properties = HARD_RT; - Name = "CAPS: Sin - Sine wave generator"; + Name = CAPS "Sin - Sine wave generator"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); diff --git a/plugins/ladspa_effect/caps/Sin.h b/plugins/ladspa_effect/caps/Sin.h index b93ca0d64..02051012e 100644 --- a/plugins/ladspa_effect/caps/Sin.h +++ b/plugins/ladspa_effect/caps/Sin.h @@ -31,26 +31,21 @@ #include "dsp/Sine.h" class Sin +: public Plugin { public: - double fs; d_sample f, gain; DSP::Sine sin; template - void one_cycle (int frames); + void one_cycle (int frames); public: static PortInfo port_info []; - d_sample * ports [3]; - d_sample adding_gain; - - void init (double _fs); - - void activate() - { } + void init(); + void activate() {} void run (int n) { diff --git a/plugins/ladspa_effect/caps/SweepVF.cc b/plugins/ladspa_effect/caps/SweepVF.cc index 69fa8669c..50ea1dc31 100644 --- a/plugins/ladspa_effect/caps/SweepVF.cc +++ b/plugins/ladspa_effect/caps/SweepVF.cc @@ -1,7 +1,7 @@ /* SweepVF.cc - Copyright 2002-5 Tim Goetze + Copyright 2002-7 Tim Goetze http://quitte.de/dsp/ @@ -33,21 +33,21 @@ #include "SweepVF.h" #include "Descriptor.h" +#include "dsp/RBJ.h" + void -SweepVFI::init (double _fs) +SweepVFI::init() { - fs = _fs; f = .1; Q = .1; lorenz.init(); - normal = NOISE_FLOOR; } void SweepVFI::activate() { svf.reset(); - svf.set_f_Q (f = *ports[1] / fs, Q = *ports[2]); + svf.set_f_Q (f = getport(1) / fs, Q = getport(2)); } template @@ -62,12 +62,12 @@ SweepVFI::one_cycle (int frames) double one_over_blocks = 1 / (double) blocks; /* cheesy linear interpolation for f, works well though. */ - double df = (*ports[1] / fs - f) * one_over_blocks; - double dQ = (*ports[2] - Q) * one_over_blocks; + double df = (getport(1) / fs - f) * one_over_blocks; + double dQ = (getport(2) - Q) * one_over_blocks; - svf.set_out ((int) *ports[3]); + svf.set_out ((int) getport(3)); - lorenz.set_rate (*ports[7]); + lorenz.set_rate (getport(7)); d_sample * d = ports[8]; @@ -76,11 +76,11 @@ SweepVFI::one_cycle (int frames) lorenz.step(); double modulation = - *ports[4] * lorenz.get_x() + - *ports[5] * lorenz.get_y() + - *ports[6] * lorenz.get_z(); + getport(4) * lorenz.get_x() + + getport(5) * lorenz.get_y() + + getport(6) * lorenz.get_z(); - double scale = *ports[4] + *ports[5] + *ports[6]; + double scale = getport(4) + getport(5) + getport(6); modulation *= scale * f; svf.set_f_Q (max (.001, f + modulation), Q); @@ -98,10 +98,8 @@ SweepVFI::one_cycle (int frames) Q += dQ; } - normal = -normal; - - f = *ports[1] / fs; - Q = *ports[2]; + f = getport(1) / fs; + Q = getport(2); } /* //////////////////////////////////////////////////////////////////////// */ @@ -116,7 +114,7 @@ SweepVFI::port_info [] = }, { "f", INPUT | CONTROL, - {BOUNDED | FS | DEFAULT_LOW, 0.002, 0.08} + {BOUNDED | LOG | DEFAULT_LOW, 83, 3383} }, { "Q", INPUT | CONTROL, @@ -155,9 +153,9 @@ Descriptor::setup() Label = "SweepVFI"; Properties = HARD_RT; - Name = "CAPS: SweepVFI - Resonant filter, f swept by a Lorenz fractal"; + Name = CAPS "SweepVFI - Resonant filter swept by a Lorenz fractal"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); @@ -166,21 +164,19 @@ Descriptor::setup() /* //////////////////////////////////////////////////////////////////////// */ void -SweepVFII::init (double _fs) +SweepVFII::init() { - fs = _fs; f = .1; Q = .1; lorenz1.init(); lorenz2.init(); - normal = NOISE_FLOOR; } void SweepVFII::activate() { svf.reset(); - svf.set_f_Q (f = *ports[1] / fs, Q = *ports[2]); + svf.set_f_Q (f = getport(1) / fs, Q = getport(2)); } template @@ -195,13 +191,13 @@ SweepVFII::one_cycle (int frames) double one_over_blocks = 1 / (double) blocks; /* cheesy linear interpolation for f, works well though. */ - double df = (*ports[1] / fs - f) * one_over_blocks; - double dQ = (*ports[2] - Q) * one_over_blocks; + double df = (getport(1) / fs - f) * one_over_blocks; + double dQ = (getport(2) - Q) * one_over_blocks; - svf.set_out ((int) *ports[3]); + svf.set_out ((int) getport(3)); - lorenz1.set_rate (*ports[7]); - lorenz2.set_rate (*ports[11]); + lorenz1.set_rate (getport(7)); + lorenz2.set_rate (getport(11)); d_sample * d = ports[12]; @@ -211,11 +207,11 @@ SweepVFII::one_cycle (int frames) lorenz1.step(); double modulation1 = - *ports[4] * lorenz1.get_x() + - *ports[5] * lorenz1.get_y() + - *ports[6] * lorenz1.get_z(); + getport(4) * lorenz1.get_x() + + getport(5) * lorenz1.get_y() + + getport(6) * lorenz1.get_z(); - double scale1 = *ports[4] + *ports[5] + *ports[6]; + double scale1 = getport(4) + getport(5) + getport(6); modulation1 *= scale1 * f; @@ -223,11 +219,11 @@ SweepVFII::one_cycle (int frames) lorenz2.step(); double modulation2 = - *ports[8] * lorenz2.get_x() + - *ports[9] * lorenz2.get_y() + - *ports[10] * lorenz2.get_z(); + getport(8) * lorenz2.get_x() + + getport(9) * lorenz2.get_y() + + getport(10) * lorenz2.get_z(); - double scale2 = *ports[8] + *ports[9] + *ports[10]; + double scale2 = getport(8) + getport(9) + getport(10); /* enforce Q limit */ double q = Q + (modulation2 * scale2 * Q); @@ -248,10 +244,8 @@ SweepVFII::one_cycle (int frames) Q += dQ; } - normal = -normal; - - f = *ports[1] / fs; - Q = *ports[2]; + f = getport(1) / fs; + Q = getport(2); } /* //////////////////////////////////////////////////////////////////////// */ @@ -266,7 +260,7 @@ SweepVFII::port_info [] = }, { "f", INPUT | CONTROL, - {BOUNDED | FS | DEFAULT_LOW, 0.002, 0.08} + {BOUNDED | LOG | DEFAULT_LOW, 83, 3383} }, { "Q", INPUT | CONTROL, @@ -321,11 +315,144 @@ Descriptor::setup() Label = "SweepVFII"; Properties = HARD_RT; - Name = "CAPS: SweepVFII - Resonant filter, f and Q swept by a Lorenz fractal"; + Name = CAPS "SweepVFII - Resonant filter, f and Q swept by a Lorenz fractal"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); } +/* //////////////////////////////////////////////////////////////////////// */ + +void +AutoWah::init() +{ + f = 800 / fs; + Q = .5; +} + +void +AutoWah::activate() +{ + svf.reset(); + svf.set_f_Q (f = getport(1) / fs, Q = getport(2)); + svf.set_out (DSP::SVF<1>::Band); + + /* hi-passing input for envelope RMS calculation */ + hp.set_f (250. / fs); + + /* smoothing the envelope at 20 Hz */ + DSP::RBJ::LP (20. * BLOCK_SIZE / fs, .6, filter.a, filter.b); + + rms.reset(); + hp.reset(); + filter.reset(); +} + +template +void +AutoWah::one_cycle (int frames) +{ + d_sample * s = ports[0]; + + int blocks = frames / BLOCK_SIZE; + if (frames & (BLOCK_SIZE - 1)) + ++blocks; + + double one_over_blocks = 1 / (double) blocks; + /* cheesy linear interpolation for f, works well though. */ + double df = (getport(1) / fs - f) * one_over_blocks; + double dQ = (getport(2) - Q) * one_over_blocks; + + double scale = getport(3); + + d_sample * d = ports[4]; + + while (frames) + { + double m = rms.rms(); + + m = filter.process (m + normal); + + /* Leaving debug output in your code is cheesy! */ + /* + static int _turn = 0; + if (_turn++ % 100 == 0) + fprintf (stderr, "%.4f\n", m); + */ + + m *= scale * .08; + svf.set_f_Q (max (.001, f + m), Q); + + int n = min (frames, BLOCK_SIZE); + + for (int i = 0; i < n; ++i) + { + d_sample x = s[i] + normal; + /* A stacked SVF in bandpass mode is rather quiet, which is + * compensated here */ + F (d, i, 2 * svf.process (x), adding_gain); + /* for envelope calculation, prefer high f content */ + x = hp.process (x); + rms.store (x * x); + } + + s += n; + d += n; + frames -= n; + + f += df; + Q += dQ; + + normal = -normal; + } + + f = getport(1) / fs; + Q = getport(2); +} + +/* //////////////////////////////////////////////////////////////////////// */ + +PortInfo +AutoWah::port_info [] = +{ + { + "in", + INPUT | AUDIO, + {0, 0, 0} + }, { + "f", + INPUT | CONTROL, + {BOUNDED | LOG | DEFAULT_LOW, 43, 933} + }, { + "Q", + INPUT | CONTROL, + {BOUNDED | DEFAULT_LOW, 0.001, .999} + }, { + "depth", + INPUT | CONTROL, + {BOUNDED | DEFAULT_MID, 0, 1} + }, { + "out", + OUTPUT | AUDIO, + {0} + } +}; + +template <> void +Descriptor::setup() +{ + UniqueID = 2593; + Label = "AutoWah"; + Properties = HARD_RT; + + Name = CAPS "AutoWah - Resonant envelope-following filter"; + Maker = "Tim Goetze "; + Copyright = "GPL, 2004-7"; + + /* fill port info and vtable */ + autogen(); +} + + diff --git a/plugins/ladspa_effect/caps/SweepVF.h b/plugins/ladspa_effect/caps/SweepVF.h index 12ecae29b..780ca34af 100644 --- a/plugins/ladspa_effect/caps/SweepVF.h +++ b/plugins/ladspa_effect/caps/SweepVF.h @@ -1,7 +1,7 @@ /* SweepVF.h - Copyright 2004-5 Tim Goetze + Copyright 2004-7 Tim Goetze http://quitte.de/dsp/ @@ -10,6 +10,8 @@ SweepVFII, the same with Q being modulated by a second fractal. + AutoWah, SVF being modulated by 'instant' amplitude (envelope). + */ /* This program is free software; you can redistribute it and/or @@ -32,10 +34,16 @@ #define _SWEEP_VF_H_ #include "dsp/SVF.h" + #include "dsp/Lorenz.h" #include "dsp/Roessler.h" +#include "dsp/RMS.h" +#include "dsp/BiQuad.h" +#include "dsp/OnePole.h" + class SweepVFI +: public Plugin { public: double fs; @@ -51,19 +59,13 @@ class SweepVFI DSP::StackedSVF<1,2> svf; DSP::Lorenz lorenz; - d_sample normal; - template - void one_cycle (int frames); + void one_cycle (int frames); public: static PortInfo port_info []; - d_sample * ports [9]; - - d_sample adding_gain; - - void init (double _fs); + void init(); void activate(); void run (int n) @@ -78,6 +80,45 @@ class SweepVFI }; class SweepVFII +: public Plugin +{ + public: + /* svf parameters */ + d_sample f, Q; + + /* needs to be a power of two */ + enum { + BLOCK_SIZE = 32 + }; + + DSP::StackedSVF<1,2> svf; + DSP::Lorenz lorenz1; + DSP::Lorenz lorenz2; + + template + void one_cycle (int frames); + + public: + static PortInfo port_info []; + + void init(); + void activate(); + + void run (int n) + { + one_cycle (n); + } + + void run_adding (int n) + { + one_cycle (n); + } +}; + +/* //////////////////////////////////////////////////////////////////////// */ + +class AutoWah +: public Plugin { public: double fs; @@ -91,22 +132,18 @@ class SweepVFII }; DSP::StackedSVF<1,2> svf; - DSP::Lorenz lorenz1; - DSP::Lorenz lorenz2; + DSP::RMS rms; - d_sample normal; + DSP::BiQuad filter; + DSP::OnePoleHP hp; template - void one_cycle (int frames); + void one_cycle (int frames); public: static PortInfo port_info []; - d_sample * ports [13]; - - d_sample adding_gain; - - void init (double _fs); + void init(); void activate(); void run (int n) diff --git a/plugins/ladspa_effect/caps/ToneControls.cc b/plugins/ladspa_effect/caps/ToneControls.cc index 6169aebb5..ea4c71cdf 100644 --- a/plugins/ladspa_effect/caps/ToneControls.cc +++ b/plugins/ladspa_effect/caps/ToneControls.cc @@ -1,7 +1,7 @@ /* ToneControls.cc - Copyright 2004-5 Tim Goetze + Copyright 2004-7 Tim Goetze http://quitte.de/dsp/ diff --git a/plugins/ladspa_effect/caps/ToneStack.cc b/plugins/ladspa_effect/caps/ToneStack.cc new file mode 100644 index 000000000..510d79378 --- /dev/null +++ b/plugins/ladspa_effect/caps/ToneStack.cc @@ -0,0 +1,195 @@ +/* + ToneStack.cc + + Copyright 2006-7 + David Yeh + Tim Goetze (cosmetics) + + Tone Stack emulation. +* +*/ +/* + 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; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA or point your web browser to http://www.gnu.org. +*/ + +#include "basics.h" + +#include "ToneStack.h" +#include "Descriptor.h" + +#include "dsp/tonestack/ks_tab.h" +#include "dsp/tonestack/vs_tab.h" + +DSP::TSParameters +DSP::ToneStack::presets[] = { + /* for convenience, temporarily define k and MOhms as well as nF and pF */ + #define k * 1000 + #define M * 1000000 + #define nF * 1e-9 + #define pF * 1e-12 + /* parameter order is R1 - R4, C1 - C3 */ + /* { 250000, 1000000, 25000, 56000, 0.25e-9, 20e-9, 20e-9 }, DY */ + /* Fender */ + {250 k, 1 M, 25 k, 56 k, 250 pF, 20 nF, 20 nF}, /* 59 Bassman 5F6-A */ + {250 k, 250 k, 10 k, 100 k, 120 pF, 100 nF, 47 nF}, /* 69 Twin Reverb AA270 */ + {250 k, 250 k, 4.8 k, 100 k, 250 pF, 100 nF, 47 nF}, /* 64 Princeton AA1164 */ + /* Marshall */ + {220 k, 1 M, 22 k, 33 k, 470 pF, 22 nF, 22 nF}, /* 59/81 JCM-800 Lead 100 2203 */ + /* R4 is a 10 k fixed + 100 k pot in series actually */ + {250 k, 1 M, 25 k, 56 k, 500 pF, 22 nF, 22 nF}, /* 81 2000 Lead */ + + #if 0 + {220 k, 1 M, 22 k, 33 k, 470 pF, 22 nF, 22 nF}, /* 90 JCM-900 Master 2100 (same as JCM-800) */ + {250 k, 1 M, 25 k, 33 k, 500 pF, 22 nF, 22 nF}, /* 67 Major Lead 200 */ + {250 k, 250 k, 25 k, 56 k, 250 pF, 47 nF, 47 nF}, /* undated M2199 30W solid state */ + #endif + /* Vox -- R3 is fixed (circuit differs anyway) */ + {1 M, 1 M, 10 k, 100 k, 50 pF, 22 nF, 22 nF}, /* 59/86 AC-30 */ + #undef k + #undef M + #undef nF + #undef pF +}; + +int DSP::ToneStack::n_presets = TS_N_PRESETS; + +void +ToneStack::activate() +{ + tonestack.activate (ports + 2); +} + +template +void +ToneStack::one_cycle (int frames) +{ + d_sample * s = ports[0]; + tonestack.start_cycle (ports + 1); + d_sample * d = ports[5]; + + for (int i = 0; i < frames; ++i) + { + register d_sample a = s[i]; + a = tonestack.process (a + normal); + F (d, i, a, adding_gain); + } +} + + +PortInfo +ToneStack::port_info [] = +{ + { + "in", + INPUT | AUDIO, + {BOUNDED, -1, 1} + }, { + "model", + INPUT | CONTROL, + {BOUNDED | DEFAULT_0 | INTEGER, 0, TS_N_PRESETS - 1} + }, { + "bass", + INPUT | CONTROL, + {BOUNDED | DEFAULT_MID, 0, 1} + }, { + "mid", + INPUT | CONTROL, + {BOUNDED | DEFAULT_MID, 0, 1} + }, { + "treble", + INPUT | CONTROL, + {BOUNDED | DEFAULT_MID, 0, 1} + }, { + "out", + OUTPUT | AUDIO, + {0} + } +}; + +template <> void +Descriptor::setup() +{ + UniqueID = 2589; + Label = "ToneStack"; + Properties = HARD_RT; + + Name = CAPS "ToneStack - Tone stack emulation"; + Maker = "David Yeh "; + Copyright = "GPL, 2006-7"; + + /* fill port info and vtable */ + autogen(); +} + +/* //////////////////////////////////////////////////////////////////////// */ + +template +void +ToneStackLT::one_cycle (int frames) +{ + d_sample * s = ports[0]; + tonestack.updatecoefs (ports + 1); + d_sample * d = ports[4]; + + for (int i = 0; i < frames; ++i) + { + register d_sample a = s[i]; + a = tonestack.process (a + normal); + F (d, i, a, adding_gain); + } +} + +PortInfo +ToneStackLT::port_info [] = +{ + { + "in", + INPUT | AUDIO, + {BOUNDED, -1, 1} + }, { + "bass", + INPUT | CONTROL, + {BOUNDED | DEFAULT_MID, 0, 1} + }, { + "mid", + INPUT | CONTROL, + {BOUNDED | DEFAULT_MID, 0, 1} + }, { + "treble", + INPUT | CONTROL, + {BOUNDED | DEFAULT_MID, 0, 1} + }, { + "out", + OUTPUT | AUDIO, + {0} + } +}; + +template <> void +Descriptor::setup() +{ + UniqueID = 2590; + Label = "ToneStackLT"; + Properties = HARD_RT; + + Name = CAPS "ToneStackLT - Tone stack emulation, lattice filter 44.1"; + Maker = "David Yeh "; + Copyright = "GPL, 2006-7"; + + /* fill port info and vtable */ + autogen(); +} + diff --git a/plugins/ladspa_effect/caps/ToneStack.h b/plugins/ladspa_effect/caps/ToneStack.h new file mode 100644 index 000000000..f98a0a0d6 --- /dev/null +++ b/plugins/ladspa_effect/caps/ToneStack.h @@ -0,0 +1,98 @@ +/* + ToneStack.h + + Copyright 2006-7 + David Yeh + Tim Goetze (cosmetics) + + Tone Stack emulation. + +*/ +/* + 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; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA or point your web browser to http://www.gnu.org. +*/ + +#ifndef _TONESTACK_H_ +#define _TONESTACK_H_ + +#include "dsp/util.h" +#include "dsp/windows.h" +#include "dsp/ToneStack.h" + +class ToneStack +: public Plugin +{ + private: + DSP::ToneStack tonestack; + + template + void one_cycle (int frames); + + public: + static PortInfo port_info []; + + void init() + { + tonestack.init (fs); + } + + void activate(); + + void run (int n) + { + one_cycle (n); + } + + void run_adding (int n) + { + one_cycle (n); + } +}; + +/* /////////////////////////////////////////////////////////////////////// */ + +class ToneStackLT +: public Plugin +{ + private: + DSP::ToneStackLT tonestack; + + template + void one_cycle (int frames); + + public: + static PortInfo port_info []; + + void init() + { + tonestack.init (fs); + } + + void activate() + { tonestack.activate (ports + 1); } + + void run (int n) + { + one_cycle (n); + } + + void run_adding (int n) + { + one_cycle (n); + } +}; + +#endif /* _TONESTACK_H_ */ diff --git a/plugins/ladspa_effect/caps/VCO.cc b/plugins/ladspa_effect/caps/VCO.cc index bf5fc43ad..0e62ba5fb 100644 --- a/plugins/ladspa_effect/caps/VCO.cc +++ b/plugins/ladspa_effect/caps/VCO.cc @@ -1,7 +1,7 @@ /* VCO.cc - Copyright 2004-5 Tim Goetze + Copyright 2004-7 Tim Goetze http://quitte.de/dsp/ @@ -32,10 +32,8 @@ #include "Descriptor.h" void -VCOs::init (double _fs) +VCOs::init() { - fs = _fs; - /* going a fair bit lower than nominal with fc because the filter * rolloff is not as steep as we might like it to be. */ double f = .5 * M_PI / OVERSAMPLE; @@ -59,11 +57,11 @@ template void VCOs::one_cycle (int frames) { - vco.set_f (*ports[0], OVERSAMPLE * fs); - vco.set_saw_square (*ports[1], *ports[2]); + vco.set_f (getport(0), OVERSAMPLE * fs); + vco.set_saw_square (getport(1), getport(2)); double g = (gain == *ports[3]) ? - 1 : pow (*ports[3] / gain, 1. / (double) frames); + 1 : pow (getport(3) / gain, 1. / (double) frames); d_sample * d = ports[4]; @@ -77,7 +75,7 @@ VCOs::one_cycle (int frames) gain *= g; } - gain = *ports[3]; + gain = getport(3); } /* //////////////////////////////////////////////////////////////////////// */ @@ -88,7 +86,7 @@ VCOs::port_info [] = { "f", INPUT | CONTROL, - {BOUNDED | FS | DEFAULT_440, 0, .1} + {BOUNDED | LOG | DEFAULT_100, 1, 5751} }, { "tri .. saw", INPUT | CONTROL, @@ -105,10 +103,6 @@ VCOs::port_info [] = "out", OUTPUT | AUDIO, {0} - }, { - "latency", - OUTPUT | CONTROL, - {0} } }; @@ -119,9 +113,9 @@ Descriptor::setup() Label = "VCOs"; Properties = HARD_RT; - Name = "CAPS: VCOs - Virtual 'analogue' oscillator"; + Name = CAPS "VCOs - Virtual 'analogue' oscillator"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); @@ -130,10 +124,8 @@ Descriptor::setup() /* //////////////////////////////////////////////////////////////////////// */ void -VCOd::init (double _fs) +VCOd::init() { - fs = _fs; - /* going a fair bit lower than nominal with fc because the filter * rolloff is not as steep as we might like it to be. */ double f = .5 * M_PI / OVERSAMPLE; @@ -157,16 +149,16 @@ template void VCOd::one_cycle (int frames) { - vco.set_f (*ports[0], OVERSAMPLE * fs, *ports[5]); + vco.set_f (getport(0), OVERSAMPLE * fs, getport(5)); - vco.vco[0].set_saw_square (*ports[1], *ports[2]); - vco.vco[1].set_saw_square (*ports[3], *ports[4]); + vco.vco[0].set_saw_square (getport(1), getport(2)); + vco.vco[1].set_saw_square (getport(3), getport(4)); - vco.set_sync (*ports[6]); - vco.set_blend (*ports[7]); + vco.set_sync (getport(6)); + vco.set_blend (getport(7)); double g = (gain == *ports[8]) ? - 1 : pow (*ports[8] / gain, 1. / (double) frames); + 1 : pow (getport(8) / gain, 1. / (double) frames); d_sample * d = ports[9]; @@ -180,7 +172,7 @@ VCOd::one_cycle (int frames) gain *= g; } - gain = *ports[8]; + gain = getport(8); } /* //////////////////////////////////////////////////////////////////////// */ @@ -191,7 +183,7 @@ VCOd::port_info [] = { "f", INPUT | CONTROL, - {BOUNDED | FS | DEFAULT_440, 0, .1} + {BOUNDED | LOG | DEFAULT_100, 1, 5751} }, { "1: tri .. saw", INPUT | CONTROL, @@ -228,10 +220,6 @@ VCOd::port_info [] = "out", OUTPUT | AUDIO, {0} - }, { - "latency", - OUTPUT | CONTROL, - {0} } }; @@ -242,9 +230,9 @@ Descriptor::setup() Label = "VCOd"; Properties = HARD_RT; - Name = "CAPS: VCOd - Double VCO with detune and hard sync options"; + Name = CAPS "VCOd - Double VCO with detune and hard sync options"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); diff --git a/plugins/ladspa_effect/caps/VCO.h b/plugins/ladspa_effect/caps/VCO.h index a4fa8125d..b37dfd3e2 100644 --- a/plugins/ladspa_effect/caps/VCO.h +++ b/plugins/ladspa_effect/caps/VCO.h @@ -37,9 +37,9 @@ #include "dsp/windows.h" class VCOs +: public Plugin { public: - double fs; d_sample f, gain; /* ok to just change these as you please, 4/32 works ok, sortof. */ @@ -54,27 +54,21 @@ class VCOs DSP::FIR down; template - void one_cycle (int frames); + void one_cycle (int frames); public: static PortInfo port_info[]; - d_sample * ports [6]; - - d_sample adding_gain; VCOs() : down (FIR_SIZE) { } - void init (double _fs); - + void init(); void activate() { gain = *ports[3]; down.reset(); vco.reset(); - /* latency */ - *ports[5] = OVERSAMPLE; } void run (int n) @@ -91,6 +85,7 @@ class VCOs /* //////////////////////////////////////////////////////////////////////// */ class VCOd +: public Plugin { public: double fs; @@ -112,23 +107,17 @@ class VCOd public: static PortInfo port_info[]; - d_sample * ports [11]; - - d_sample adding_gain; VCOd() : down (FIR_SIZE) { } - void init (double _fs); - + void init(); void activate() { gain = *ports[8]; down.reset(); vco.reset(); - /* latency */ - *ports[10] = OVERSAMPLE; } void run (int n) diff --git a/plugins/ladspa_effect/caps/White.cc b/plugins/ladspa_effect/caps/White.cc index 118c32309..00e80113d 100644 --- a/plugins/ladspa_effect/caps/White.cc +++ b/plugins/ladspa_effect/caps/White.cc @@ -1,7 +1,7 @@ /* White.cc - Copyright 2004-5 Tim Goetze + Copyright 2004-7 Tim Goetze http://quitte.de/dsp/ @@ -35,7 +35,7 @@ void White::one_cycle (int frames) { double g = (gain == *ports[0]) ? - 1 : pow (*ports[0] / gain, 1. / (double) frames); + 1 : pow (getport(0) / gain, 1. / (double) frames); d_sample * d = ports[1]; @@ -45,7 +45,7 @@ White::one_cycle (int frames) gain *= g; } - gain = *ports[0]; + gain = getport(0); } /* //////////////////////////////////////////////////////////////////////// */ @@ -71,9 +71,9 @@ Descriptor::setup() Label = "White"; Properties = HARD_RT; - Name = "CAPS: White - White noise generator"; + Name = CAPS "White - White noise generator"; Maker = "Tim Goetze "; - Copyright = "GPL, 2004-5"; + Copyright = "GPL, 2004-7"; /* fill port info and vtable */ autogen(); diff --git a/plugins/ladspa_effect/caps/White.h b/plugins/ladspa_effect/caps/White.h index 22442ce88..ea7a56c31 100644 --- a/plugins/ladspa_effect/caps/White.h +++ b/plugins/ladspa_effect/caps/White.h @@ -31,6 +31,7 @@ #include "dsp/White.h" class White +: public Plugin { public: d_sample gain; @@ -38,17 +39,12 @@ class White DSP::White white; template - void one_cycle (int frames); + void one_cycle (int frames); public: static PortInfo port_info []; - d_sample * ports [2]; - - d_sample adding_gain; - - void init (double _fs) - { } + void init() {} void activate() { gain = .5; diff --git a/plugins/ladspa_effect/caps/basics.h b/plugins/ladspa_effect/caps/basics.h index 75718d384..c10d9ba1d 100644 --- a/plugins/ladspa_effect/caps/basics.h +++ b/plugins/ladspa_effect/caps/basics.h @@ -46,19 +46,11 @@ #include #include -#ifdef HAVE_CONFIG_H -#include -#endif - -#ifdef HAVE_LADSPA_H -#include -#else -#include "ladspa-1.1.h" -#endif +#include "ladspa.h" #define BOUNDED (LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE) #define INTEGER LADSPA_HINT_INTEGER -#define FS LADSPA_HINT_SAMPLE_RATE +/* #define FS LADSPA_HINT_SAMPLE_RATE *//* deprecated */ #define LOG LADSPA_HINT_LOGARITHMIC #define TOGGLE LADSPA_HINT_TOGGLED @@ -84,16 +76,6 @@ #define MIN_GAIN .000001 /* -120 dB */ #define NOISE_FLOOR .00000000000005 /* -266 dB */ -#ifdef BUILD_WIN32 -typedef int8_t int8; -typedef uint8_t uint8; -typedef int16_t int16; -typedef uint16_t uint16; -typedef int32_t int32; -typedef uint32_t uint32; -typedef int64_t int64; -typedef uint64_t uint64; -#else typedef __int8_t int8; typedef __uint8_t uint8; typedef __int16_t int16; @@ -102,7 +84,6 @@ typedef __int32_t int32; typedef __uint32_t uint32; typedef __int64_t int64; typedef __uint64_t uint64; -#endif typedef struct { char * name; @@ -144,11 +125,73 @@ X max (X x, Y y) } #endif /* ! max */ - + +template +T clamp (T value, T lower, T upper) +{ + if (value < lower) return lower; + if (value > upper) return upper; + return value; +} + static inline float frandom() { - return (float) rand() / (float) RAND_MAX; + return (float) random() / (float) RAND_MAX; } +/* for testing only. */ +inline bool +is_denormal (float & f) +{ + int32 i = *((int32 *) &f); + return ((i & 0x7f800000) == 0); +} + +/* not sure if this double version is correct, actually ... */ +inline bool +is_denormal (double & f) +{ + int64 i = *((int64 *) &f); + return ((i & 0x7fe0000000000000ll) == 0); +} + +#ifdef __i386__ + #define TRAP asm ("int $3;") +#else + #define TRAP +#endif + +/* //////////////////////////////////////////////////////////////////////// */ + +#define CAPS "C* " + +class Plugin { + public: + double fs; /* sample rate */ + double adding_gain; /* for run_adding() */ + + int first_run; /* 1st block after activate(), do no parameter smoothing */ + d_sample normal; /* renormal constant */ + + d_sample ** ports; + LADSPA_PortRangeHint * ranges; /* for getport() below */ + + public: + /* get port value, mapping inf or nan to 0 */ + inline d_sample getport_unclamped (int i) + { + d_sample v = *ports[i]; + return (isinf (v) || isnan(v)) ? 0 : v; + } + + /* get port value and clamp to port range */ + inline d_sample getport (int i) + { + LADSPA_PortRangeHint & r = ranges[i]; + d_sample v = getport_unclamped (i); + return clamp (v, r.LowerBound, r.UpperBound); + } +}; + #endif /* _BASICS_H_ */ diff --git a/plugins/ladspa_effect/caps/dsp/BiQuad.h b/plugins/ladspa_effect/caps/dsp/BiQuad.h index 666cd12f1..605edb193 100644 --- a/plugins/ladspa_effect/caps/dsp/BiQuad.h +++ b/plugins/ladspa_effect/caps/dsp/BiQuad.h @@ -48,13 +48,11 @@ class BiQuad reset(); } - BiQuad (d_sample * _a, d_sample * _b) + void copy (BiQuad & bq) { for (int i = 0; i < 3; ++i) - a[i] = _a[i], - b[i] = _b[i]; - - reset(); + a[i] = bq.a[i], + b[i] = bq.b[i]; } void reset() @@ -65,6 +63,14 @@ class BiQuad y[0] = y[1] = 0.; } + /* denormal zapping */ + void flush_0() + { + for (int i = 0; i < 2; ++i) + if (is_denormal (y[i])) + y[i] = 0; + } + inline d_sample process (d_sample s) { register int z = h; @@ -86,7 +92,8 @@ class BiQuad return r; } - /* additional methods for using the biquad to upsample */ + /* additional methods for using the biquad to filter an + * upsampled signal with 0 padding */ inline d_sample process_0_1() { register int z = h; diff --git a/plugins/ladspa_effect/caps/dsp/Eq.h b/plugins/ladspa_effect/caps/dsp/Eq.h index 523d87c7e..4b6fb767b 100644 --- a/plugins/ladspa_effect/caps/dsp/Eq.h +++ b/plugins/ladspa_effect/caps/dsp/Eq.h @@ -1,12 +1,12 @@ /* Eq.h - Copyright 2004 Tim Goetze + Copyright 2004-7 Tim Goetze http://quitte.de/dsp/ - equalizer circuit using recursive filtering. - based on a motorola paper implementing a similar circuit on a DSP56001. + Equalizer circuit using recursive filtering. + Based on a motorola paper implementing a similar circuit on a DSP56001. */ /* @@ -31,86 +31,64 @@ namespace DSP { -/* a single bandpass as used by the Eq, expressed as a biquad. like all - * band-pass filters i know, the filter works with a FIR coefficient of 0 +/* A single bandpass as used by the Eq, expressed as a biquad. Like all + * band-pass filters I know of, the filter works with a FIR coefficient of 0 * for x[-1], so a generic biquad isn't the optimum implementation. + * + * This routine isn't used anywhere, just here for testing purposes. */ -class BP +template +void +_BP (double fc, double Q, T * ca, T * cb) { - public: - template - BP (double fc, double Q, T * ca, T * cb) - { - double theta = 2 * fc * M_PI; + double theta = 2 * fc * M_PI; - double - b = (Q - theta * .5) / (2 * Q + theta), - a = (.5 - b) / 2, - c = (.5 + b) * cos (theta); + double + b = (Q - theta * .5) / (2 * Q + theta), + a = (.5 - b) / 2, + c = (.5 + b) * cos (theta); - ca[0] = 2 * a; - ca[1] = 0; - ca[2] = -2 * a; + ca[0] = 2 * a; + ca[1] = 0; + ca[2] = -2 * a; - cb[0] = 0; - cb[1] = 2 * c; - cb[2] = -2 * b; - } -}; + cb[0] = 0; + cb[1] = 2 * c; + cb[2] = -2 * b; +} -/* BANDS must be a multiple of 4 to enable the use of SSE instructions. - * however, the current SSE-enabled process() method fails to compile if - * -funroll-loops is passed to gcc. - */ -template +template class Eq { public: - /* over-size state buffer to allow alignment */ - float state [BANDS * 8 + 4 + 4]; /* recursion coefficients, 3 per band */ - float * a, * b, * c; + eq_sample __attribute__ ((aligned)) a[Bands], b[Bands], c[Bands]; /* past outputs, 2 per band */ - float * y; + eq_sample __attribute__ ((aligned)) y[2][Bands]; /* current gain and recursion factor, each 1 per band = 2 */ - float * gain, * gf; - /* aligned storage for output summation */ - float * temp; - /* aligned storage for constants */ - float * two; + eq_sample __attribute__ ((aligned)) gain[Bands], gf[Bands]; /* input history */ - float x[2]; + eq_sample x[2]; /* history index */ int h; + eq_sample normal; + Eq() { - /* take care of 128-bit alignment */ - long s = (long) (char *) state; - s &= 0xF; - if (s) - s = 16 - s; - - /* assign coefficients */ - a = (float *) (((char *) state) + s); - b = a + BANDS; - c = a + 2 * BANDS; - - /* output history (input is common to all bands) */ - y = a + 3 * BANDS; - gain = a + 5 * BANDS; - gf = a + 6 * BANDS; - temp = a + 7 * BANDS; - two = temp + 4; - two[0] = two[1] = two[2] = two[3] = 2; - h = 0; + normal = NOISE_FLOOR; } void reset() - { - for (int i = 0; i < 2 * BANDS; ++i) - y[i] = 0; + { + for (int z = 0; z < 2; ++z) + { + // work-around for buggy optimizer in GCC 4.3 + for (int i = 0; i < Bands-1; ++i) + y[z][i] = 0; + y[z][Bands-1] = 0; + } for (int i = 0; i < 2; ++i) x[i] = 0; @@ -121,9 +99,10 @@ class Eq double f = 31.25; int i = 0; - for (i = 0; i < USE_BANDS && f < fs / 2; ++i, f *= 2) + for (i = 0; i < Bands && f < fs / 2; ++i, f *= 2) init_band (i, 2 * f * M_PI / fs, Q); - for ( ; i < BANDS; ++i) + /* just in case, zero the remaining coefficients */ + for ( ; i < Bands; ++i) zero_band (i); reset(); @@ -134,6 +113,7 @@ class Eq b[i] = (Q - theta * .5) / (2 * Q + theta); a[i] = (.5 - b[i]) / 2; c[i] = (.5 + b[i]) * cos (theta); + /* fprintf (stderr, "%02d %f %f %f\n", i, a[i], b[i], c[i]); */ gain[i] = 1; gf[i] = 1; } @@ -146,28 +126,36 @@ class Eq /* per-band recursion: * y = 2 * (a * (x - x[-2]) + c * y[-1] - b * y[-2]) */ - d_sample process (d_sample s) + eq_sample process (eq_sample s) { int z1 = h, z2 = h ^ 1; - float * y1 = y + z1 * BANDS; - float * y2 = y + z2 * BANDS; + eq_sample * y1 = y[z1]; + eq_sample * y2 = y[z2]; - d_sample x_x2 = s - x[z2]; - d_sample r = 0; + eq_sample x_x2 = s - x[z2]; + eq_sample r = 0; - for (int i = 0; i < USE_BANDS; ++i) + for (int i = 0; i < Bands; ++i) { - y2[i] = 2 * (a[i] * x_x2 + c[i] * y1[i] - b[i] * y2[i]); + y2[i] = normal + 2 * (a[i] * x_x2 + c[i] * y1[i] - b[i] * y2[i]); r += gain[i] * y2[i]; gain[i] *= gf[i]; } - + x[z2] = s; h = z2; return r; } + + /* zap denormals in history */ + void flush_0() + { + for (int i = 0; i < Bands; ++i) + if (is_denormal (y[0][i])) + y[0][i] = 0; + } }; } /* namespace DSP */ diff --git a/plugins/ladspa_effect/caps/dsp/FPTruncateMode.h b/plugins/ladspa_effect/caps/dsp/FPTruncateMode.h index 6e263b3ea..354d062be 100644 --- a/plugins/ladspa_effect/caps/dsp/FPTruncateMode.h +++ b/plugins/ladspa_effect/caps/dsp/FPTruncateMode.h @@ -1,16 +1,19 @@ /* Copyright 2001-4 tim goetze -- see 'COPYING'. */ -/* class that sets the FP rounding mode to 'truncate' in the constructor +/* Sets the FP rounding mode to 'truncate' in the constructor * and loads the previous FP conrol word in the destructor. * - * i386 implementation only, on other architectures this is a no-op. + * By directly using the machine instruction to convert float to int + * we avoid the performance hit that loading the control word twice for + * every (int) cast causes on i386. + * + * On other architectures this is a no-op. */ #ifndef _DSP_FP_TRUNCATE_MODE_H_ #define _DSP_FP_TRUNCATE_MODE_H_ #ifdef __i386__ - #define fstcw(i) \ __asm__ __volatile__ ("fstcw %0" : "=m" (i)) @@ -20,15 +23,12 @@ /* gcc chokes on __volatile__ sometimes. */ #define fistp(f,i) \ __asm__ ("fistpl %0" : "=m" (i) : "t" (f) : "st") - #else /* ! __i386__ */ - #define fstcw(i) #define fldcw(i) #define fistp(f,i) \ i = (int) f - #endif namespace DSP { diff --git a/plugins/ladspa_effect/caps/dsp/LatFilt.h b/plugins/ladspa_effect/caps/dsp/LatFilt.h new file mode 100644 index 000000000..a304959fe --- /dev/null +++ b/plugins/ladspa_effect/caps/dsp/LatFilt.h @@ -0,0 +1,102 @@ +/* + LatFilt.h + + Copyright 2006 David Yeh + + Lattice digital filter. + Assumes order of b = order of a. + Assumes a0 = 1. + +*/ +/* + 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; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA or point your web browser to http://www.gnu.org. +*/ + +#ifndef _DSP_LatFilt_H_ +#define _DSP_LatFilt_H_ + +namespace DSP { + +// ORDER is the highest power of s in the transfer function +template +class LatFilt +{ + public: + double vcoef[ORDER+1]; + double kcoef[ORDER]; + double state[ORDER]; + double y; + + // fade factors + double vf[ORDER+1]; + double kf[ORDER]; + + + void reset() + { + for (int i = 0; i < ORDER; i++) { + state[i] = 0; // zero state + vf[i] = 1; // reset fade factor + kf[i] = 1; + } + vf[ORDER] = 1; + y = 0; + } + + void init (double fs) + { + reset(); + clearcoefs(); + } + + void clearcoefs() { + for (int i=0; i< ORDER; i++) { + vcoef[i] = 0; + kcoef[i] = 0; + } + vcoef[ORDER] = 0; + } + + d_sample process (d_sample s) { + double tmp; + + int i = ORDER-1; + tmp = -kcoef[i]*state[i] + s; + y = vcoef[i+1]*(state[i] + kcoef[i]*tmp); + + for (i = ORDER-2; i >= 0; i--) { + tmp = -kcoef[i]*state[i] + tmp; + state[i+1] = kcoef[i]*tmp + state[i]; + y = y + vcoef[i+1]*state[i+1]; + } + state[0] = tmp; + y = y + vcoef[0]*tmp; + + return (d_sample) y; + } + + inline void set_vi(double coef, int i) { + vcoef[i] = coef; + } + + inline void set_ki(double coef, int i) { + kcoef[i] = coef; + } +}; + +} /* namespace DSP */ + +#endif /* _DSP_LatFilt_H_ */ diff --git a/plugins/ladspa_effect/caps/dsp/OnePole.h b/plugins/ladspa_effect/caps/dsp/OnePole.h index 198a491d6..9b198a9c6 100644 --- a/plugins/ladspa_effect/caps/dsp/OnePole.h +++ b/plugins/ladspa_effect/caps/dsp/OnePole.h @@ -67,25 +67,29 @@ class OnePoleLP a0 *= d; b1 = 1. - a0; } + + /* clear denormal numbers in history */ + void flush_0() + { + if (is_denormal (y1)) + y1 = 0; + } }; class OnePoleHP { public: d_sample a0, a1, b1, x1, y1; - double fc; OnePoleHP (double d = 1.) { - fc = 0; set (d); x1 = y1 = 0.; } void set_f (double f) { - fc = f; - set (exp (-2 * M_PI * fc)); + set (exp (-2 * M_PI * f)); } inline void set (double d) @@ -106,6 +110,13 @@ class OnePoleHP { x1 = y1 = 0; } + + /* clear denormal numbers in history */ + void flush_0() + { + if (is_denormal (y1)) + y1 = 0; + } }; } /* namespace DSP */ diff --git a/plugins/ladspa_effect/caps/dsp/RMS.h b/plugins/ladspa_effect/caps/dsp/RMS.h index 89e7fd695..ae89f5be1 100644 --- a/plugins/ladspa_effect/caps/dsp/RMS.h +++ b/plugins/ladspa_effect/caps/dsp/RMS.h @@ -49,14 +49,24 @@ class RMS memset (buffer, 0, sizeof (buffer)); } - /* needs the squared sample value to be passed in */ - d_sample process (d_sample x) + /* caution: pass in the *squared* sample value */ + void store (d_sample x) { sum -= buffer[write]; - sum += x; + sum += (buffer[write] = x); write = (write + 1) & 63; + } - return sqrt (sum / 64); + d_sample process (d_sample x) + { + store (x); + return rms(); + } + + d_sample rms() + { + /* fabs it before sqrt, just in case ... */ + return sqrt (fabs (sum) / 64); } }; diff --git a/plugins/ladspa_effect/caps/dsp/TDFII.h b/plugins/ladspa_effect/caps/dsp/TDFII.h new file mode 100644 index 000000000..3212ee4a2 --- /dev/null +++ b/plugins/ladspa_effect/caps/dsp/TDFII.h @@ -0,0 +1,80 @@ +/* + TDFII.h + + Copyright 2006-7 + David Yeh (implementation) + Tim Goetze (cosmetics) + + transposed Direct Form II digital filter. + Assumes order of b = order of a. + Assumes a0 = 1. + +*/ +/* + 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; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA or point your web browser to http://www.gnu.org. +*/ + +#ifndef _DSP_TDFII_H_ +#define _DSP_TDFII_H_ + +namespace DSP { + +// ORDER is the highest power of s in the transfer function +template +class TDFII +{ + public: + double a[Order + 1]; + double b[Order + 1]; + double h[Order + 1]; + + void reset() + { + for (int i = 0; i <= Order; ++i) + h[i] = 0; // zero state + } + + void init (double fs) + { + reset(); + clear(); + } + + void clear() + { + for (int i=0; i<= Order; i++) + a[i] = b[i] = 1; + } + + /* per-band recursion: + * y = 2 * (a * (x - x[-2]) + c * y[-1] - b * y[-2]) + */ + d_sample process (d_sample s) + { + double y = h[0] + b[0] * s; + + for (int i = 1; i < Order; ++i) + h[i - 1] = h[i] + b[i] * s - a[i] * y; + + h[Order - 1] = b[Order] * s - a[Order] * y; + + return (d_sample) y; + } +}; + +} /* namespace DSP */ + +#endif /* _DSP_TDFII_H_ */ diff --git a/plugins/ladspa_effect/caps/dsp/ToneStack.h b/plugins/ladspa_effect/caps/dsp/ToneStack.h new file mode 100644 index 000000000..484702360 --- /dev/null +++ b/plugins/ladspa_effect/caps/dsp/ToneStack.h @@ -0,0 +1,268 @@ +/* + ToneStack.h + + Copyright 2006-7 + David Yeh (implementation) + Tim Goetze (cosmetics) + + Tone Stack emulation. + +*/ +/* + 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; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA or point your web browser to http://www.gnu.org. +*/ + +#ifndef _DSP_TONESTACK_H_ +#define _DSP_TONESTACK_H_ + +#include "util.h" +#include "windows.h" +#include "TDFII.h" +#include "LatFilt.h" +#include "tonestack/tables.h" + +namespace DSP { + +typedef struct { + double R1, R2, R3, R4; + double C1, C2, C3; +} TSParameters; + +#define TS_N_PRESETS (sizeof (DSP::ToneStack::presets) / \ + sizeof (DSP::TSParameters)) + +class ToneStack +{ + private: + enum { Order = 3 }; + + double c; // BT coef + + double b1t, b1m, b1l, b1d, + b2t, b2m2, b2m, b2l, b2lm, b2d, + b3lm, b3m2, b3m, b3t, b3tm, b3tl, + a0, a1d, a1m, a1l, a2m, a2lm, a2m2, a2l, a2d, + a3lm, a3m2, a3m, a3l, a3d; // intermediate calculations + + struct { + double b1; + double b2; + double b3; + double a1; + double a2; + double a3; + } acoef; // analog coefficients + + // digital coefficients + double dcoef_a[Order + 1]; + double dcoef_b[Order + 1]; + double af[Order + 1]; + double bf[Order + 1]; + + double fs; + TDFII filter; + + public: + int model; + + static TSParameters presets[]; /* in ../ToneStack.cc */ + static int n_presets; + + ToneStack() + { + setparams (presets[0]); + } + + void init (double _fs) + { + c = 2 * _fs; + } + + void activate (d_sample ** ports) + { + filter.reset(); + } + + /* pass in pointer to ports and relative index of first eq band control */ + void start_cycle (d_sample ** ports, int bassindex = 1) + { + int m = clamp ((int) *ports[0], 0, n_presets - 1); + if (m != model) + { + model = m; + setparams (presets[model]); + filter.reset(); + } + updatecoefs (ports + bassindex); + } + + + void setparams (TSParameters & p) + { + double R1 = p.R1, R2 = p.R2, R3 = p.R3, R4 = p.R4; + double C1 = p.C1, C2 = p.C2, C3 = p.C3; + + b1t = C1*R1; + b1m = C3*R3; + b1l = C1*R2 + C2*R2; + b1d = C1*R3 + C2*R3; + b2t = C1*C2*R1*R4 + C1*C3*R1*R4; + b2m2 = -(C1*C3*R3*R3 + C2*C3*R3*R3); + b2m = C1*C3*R1*R3 + C1*C3*R3*R3 + C2*C3*R3*R3; + b2l = C1*C2*R1*R2 + C1*C2*R2*R4 + C1*C3*R2*R4; + b2lm = C1*C3*R2*R3 + C2*C3*R2*R3; + b2d = C1*C2*R1*R3 + C1*C2*R3*R4 + C1*C3*R3*R4; + b3lm = C1*C2*C3*R1*R2*R3 + C1*C2*C3*R2*R3*R4; + b3m2 = -(C1*C2*C3*R1*R3*R3 + C1*C2*C3*R3*R3*R4); + b3m = C1*C2*C3*R1*R3*R3 + C1*C2*C3*R3*R3*R4; + b3t = C1*C2*C3*R1*R3*R4; + b3tm = -b3t; + b3tl = C1*C2*C3*R1*R2*R4; + a0 = 1; + a1d = C1*R1 + C1*R3 + C2*R3 + C2*R4 + C3*R4; + a1m = C3*R3; + a1l = C1*R2 + C2*R2; + a2m = C1*C3*R1*R3 - C2*C3*R3*R4 + C1*C3*R3*R3 + C2*C3*R3*R3; + a2lm = C1*C3*R2*R3 + C2*C3*R2*R3; + a2m2 = -(C1*C3*R3*R3 + C2*C3*R3*R3); + a2l = C1*C2*R2*R4 + C1*C2*R1*R2 + C1*C3*R2*R4 + C2*C3*R2*R4; + a2d = C1*C2*R1*R4 + C1*C3*R1*R4 + C1*C2*R3*R4 + + C1*C2*R1*R3 + C1*C3*R3*R4 + C2*C3*R3*R4; + a3lm = C1*C2*C3*R1*R2*R3 + C1*C2*C3*R2*R3*R4; + a3m2 = -(C1*C2*C3*R1*R3*R3 + C1*C2*C3*R3*R3*R4); + a3m = C1*C2*C3*R3*R3*R4 + C1*C2*C3*R1*R3*R3 - C1*C2*C3*R1*R3*R4; + a3l = C1*C2*C3*R1*R2*R4; + a3d = C1*C2*C3*R1*R3*R4; + + filter.reset(); + } + + inline void updatecoefs (d_sample ** ports) + { + /* range checks on input */ + double b = clamp (*ports[0], 0, 1); + double m = clamp (*ports[1], 0, 1); + double t = clamp (*ports[2], 0, 1); + + m = (m - 1) * 3.5; + m = pow (10, m); + + acoef.a1 = a1d + m*a1m + b*a1l; + acoef.a2 = m*a2m + b*m*a2lm + m*m*a2m2 + b*a2l + a2d; + acoef.a3 = b*m*a3lm + m*m*a3m2 + m*a3m + b*a3l + a3d; + dcoef_a[0] = -1 - acoef.a1*c - acoef.a2*c*c - acoef.a3*c*c*c; // sets scale + dcoef_a[1] = -3 - acoef.a1*c + acoef.a2*c*c + 3*acoef.a3*c*c*c; + dcoef_a[2] = -3 + acoef.a1*c + acoef.a2*c*c - 3*acoef.a3*c*c*c; + dcoef_a[3] = -1 + acoef.a1*c - acoef.a2*c*c + acoef.a3*c*c*c; + + acoef.b1 = t*b1t + m*b1m + b*b1l + b1d; + acoef.b2 = t*b2t + m*m*b2m2 + m*b2m + b*b2l + b*m*b2lm + b2d; + acoef.b3 = b*m*b3lm + m*m*b3m2 + m*b3m + t*b3t + t*m*b3tm + t*b*b3tl; + dcoef_b[0] = - acoef.b1*c - acoef.b2*c*c - acoef.b3*c*c*c; + dcoef_b[1] = - acoef.b1*c + acoef.b2*c*c + 3*acoef.b3*c*c*c; + dcoef_b[2] = acoef.b1*c + acoef.b2*c*c - 3*acoef.b3*c*c*c; + dcoef_b[3] = acoef.b1*c - acoef.b2*c*c + acoef.b3*c*c*c; + + for (int i=1; i<=3; ++i) + filter.a[i] = dcoef_a[i] / dcoef_a[0]; + + for (int i=0; i<=3; ++i) + filter.b[i] = dcoef_b[i] / dcoef_a[0]; + } + + // actualy do the DFII filtering, one sample at a time + inline d_sample process (d_sample x) + { + return filter.process (x); + } +}; + +/* /////////////////////////////////////////////////////////////////////// */ + +/* + hardcode this, known size memory blocks + extern double* KS; // 25 x 25 x 3 + extern double* VS; // 25 x 25 x 25 x 4 + extern double KS[NSTEPS][NSTEPS][TSORDER]; //[bass][mid][coefs] + extern double VS[NSTEPS][NSTEPS][NSTEPS][TSORDER+1]; //[bass][mid][treb][coefs] + */ + +class ToneStackLT +{ + private: + enum { Order = 3, Steps = 25 }; + + // digital coefficients + double *kcoef; + double *vcoef; + double af [Order + 1]; + double bf [Order + 1]; + + double fs; + LatFilt filter; + + public: + ToneStackLT() + { + setparams (250000, 1000000, 25000, 56000, 0.25e-9, 20e-9, 20e-9); + } + + void init (double _fs) + { } + + void activate (d_sample ** ports) + { + filter.reset(); + } + + void setparams + (double R1, double R2, double R3, double R4, + double C1, double C2, double C3) { + int blah[4]; + int *bp; + bp = blah; + } + + void updatecoefs (d_sample ** ports) + { + double b = min (Steps - 1, max (*ports[0] * (Steps - 1), 0)); + double m = min (Steps - 1, max (*ports[1] * (Steps - 1), 0)); + double t = min (Steps - 1, max (*ports[2] * (Steps - 1), 0)); + + int bi = (int) b; + int mi = (int) m; + int ti = (int) t; + + kcoef = DSP::ToneStackKS + (mi * Steps + bi) * Order; + vcoef = DSP::ToneStackVS + ((mi * Steps + bi) * Steps + ti) * (Order + 1); + + for (int i = 0; i < Order; ++i) + filter.set_ki (kcoef[i], i); + + for (int i = 0; i < Order + 1; ++i) + filter.set_vi (vcoef[i], i); + } + + // actualy do the DFII filtering, one sample at a time + inline d_sample process (d_sample x) + { + return filter.process (x); + } +}; + +} /* namespace DSP */ + +#endif /* _DSP_TONESTACK_H_ */ diff --git a/plugins/ladspa_effect/caps/dsp/TwelveAX7.h b/plugins/ladspa_effect/caps/dsp/TwelveAX7.h index cfdfccb93..fbd3bd1c7 100644 --- a/plugins/ladspa_effect/caps/dsp/TwelveAX7.h +++ b/plugins/ladspa_effect/caps/dsp/TwelveAX7.h @@ -31,6 +31,8 @@ namespace DSP { #include "r12ax7.h" +typedef d_sample tube_sample; + /* this is the original tube model from caps < 0.1.9 or preamp.so, put * back into use in 0.1.11; the replacement (below) is too strong in * odd-order harmonics at the expense of even-order. it has to sound @@ -39,14 +41,14 @@ namespace DSP { class TwelveAX7 { public: - d_sample b, c, d; + tube_sample b, c, d; struct { - d_sample threshold, value; + tube_sample threshold, value; } clip[2]; /* amplitude at which clipping starts */ - d_sample scale; + tube_sample scale; public: TwelveAX7() @@ -61,12 +63,12 @@ class TwelveAX7 scale = min (fabs (clip[0].threshold), fabs (clip[1].threshold)); } - inline d_sample transfer (d_sample a) + inline tube_sample transfer (tube_sample a) { return a * (b + a * (c + a * d)); } - inline d_sample transfer_clip (d_sample a) + inline tube_sample transfer_clip (tube_sample a) { if (a <= clip[0].threshold) return clip[0].value; @@ -103,13 +105,13 @@ class TwelveAX7 class TwelveAX7_2 { public: - d_sample b, c, d; + tube_sample b, c, d; struct { - d_sample threshold, value; + tube_sample threshold, value; } clip[2]; - d_sample scale; + tube_sample scale; public: TwelveAX7_2() @@ -128,12 +130,12 @@ class TwelveAX7_2 scale = min (fabs (clip[0].threshold), fabs (clip[1].threshold)); } - inline d_sample transfer (d_sample a) + inline tube_sample transfer (tube_sample a) { return a * (b + a * (c + a * d)); } - inline d_sample transfer_clip (d_sample a) + inline tube_sample transfer_clip (tube_sample a) { if (a <= clip[0].threshold) return clip[0].value; @@ -149,22 +151,20 @@ class TwelveAX7_2 class TwelveAX7_3 { public: - d_sample b, c, d; + tube_sample b, c, d; struct { - d_sample threshold, value; + tube_sample threshold, value; } clip[2]; - d_sample scale; + tube_sample scale; public: TwelveAX7_3() { static double x[2] = { - /* adjust for a slightly earlier clipping threshold in the - * lower lobe */ - -0.96 * (double) r12AX7::Zero / + (double) r12AX7::Zero / ((double) r12AX7::Samples - (double) r12AX7::Zero), 1 }; @@ -176,7 +176,7 @@ class TwelveAX7_3 scale = min (fabs (clip[0].threshold), fabs (clip[1].threshold)); } - inline d_sample transfer (d_sample a) + inline tube_sample transfer (tube_sample a) { a = r12AX7::Zero + a * (r12AX7::Samples - r12AX7::Zero); if (a <= 0) @@ -191,7 +191,7 @@ class TwelveAX7_3 return (r12AX7::v2v [i] * (1.f - a) + r12AX7::v2v [i + 1] * a); } - inline d_sample transfer_clip (d_sample a) + inline tube_sample transfer_clip (tube_sample a) { return transfer (a); } @@ -202,11 +202,11 @@ class NoTwelveAX7 { public: struct { - d_sample threshold, value; + tube_sample threshold, value; } clip[2]; /* amplitude at which clipping starts */ - d_sample scale; + tube_sample scale; public: NoTwelveAX7() @@ -220,12 +220,12 @@ class NoTwelveAX7 scale = min (fabs (clip[0].threshold), fabs (clip[1].threshold)); } - inline d_sample transfer (d_sample a) + inline tube_sample transfer (tube_sample a) { return 0.5469181606780 * (pow (1 - a, 1.5) - 1); } - inline d_sample transfer_clip (d_sample a) + inline tube_sample transfer_clip (tube_sample a) { if (a <= clip[0].threshold) return clip[0].value; diff --git a/plugins/ladspa_effect/caps/dsp/tonestack/ks_tab.h b/plugins/ladspa_effect/caps/dsp/tonestack/ks_tab.h new file mode 100644 index 000000000..19fc79d60 --- /dev/null +++ b/plugins/ladspa_effect/caps/dsp/tonestack/ks_tab.h @@ -0,0 +1,663 @@ +/* + ks_tab.h + + Copyright 2006 David Yeh + + http://quitte.de/dsp/ + + Tone Stack emulation coefficient table for lattice filter. + +*/ +/* + 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; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA or point your web browser to http://www.gnu.org. +*/ + +#ifndef _KS_TAB_H_ +#define _KS_TAB_H_ + +namespace DSP { + +double ToneStackKS[] = { + -0.999655160907038,0.980127109825519,-0.614914419461634, + -0.999656568120978,0.980206907765841,-0.615188716843305, + -0.999658517676675,0.980317236486758,-0.615568128036899, + -0.999661208271173,0.98046907704722,-0.616090612857295, + -0.999664902023365,0.980676730894581,-0.616805748794314, + -0.999669936365576,0.980958270564762,-0.617776442867139, + -0.999676730565233,0.981335546377295,-0.619079214371838, + -0.999685778922586,0.981833264634174,-0.620801399623313, + -0.999697618702198,0.982476493745153,-0.623033027158334, + -0.999712758774516,0.983286007325851,-0.625851163451736, + -0.99973155988367,0.984271440446054,-0.629296281256582, + -0.999754076003002,0.98542354941219,-0.633344581005633, + -0.999779899796788,0.986708608367483,-0.637886397587646, + -0.999808088604521,0.988068846787513,-0.642724617436751, + -0.999837246275279,0.989431147988487,-0.647602282731862, + -0.999865773984939,0.990721953717012,-0.652254061004993, + -0.999892205612632,0.991882358316473,-0.656461274207081, + -0.999915487257858,0.992877246278541,-0.660087773487817, + -0.999935097854328,0.993696153431228,-0.663086394317218, + -0.999951003603908,0.994347891380557,-0.665481748921572, + -0.999963513493909,0.994852827640871,-0.667343004256292, + -0.999973116451418,0.995235942818388,-0.668758405977034, + -0.999980351396071,0.995522046602486,-0.669817209794174, + -0.99998572581668,0.995733179766024,-0.670599558951996, + -0.999989676414453,0.995887625130919,-0.671172389008809, + -0.99964958032362,0.979587583563023,-0.613841200571614, + -0.99965105886229,0.979673968717358,-0.614139015327499, + -0.99965310654599,0.979793345129979,-0.614550764884576, + -0.999655931261197,0.979957524247093,-0.615117419836355, + -0.999659806674729,0.980181839664558,-0.615892331666542, + -0.99966508402413,0.980485578112938,-0.616942906326338, + -0.999672197810492,0.980891896855617,-0.618350616306868, + -0.999681656900824,0.981426699112155,-0.620207543319113, + -0.999694008538874,0.982115787972737,-0.622607053883059, + -0.999709761087518,0.982979722321469,-0.625626413960214, + -0.999729257452251,0.984026477862534,-0.629301273863883, + -0.999752511640623,0.985243474991385,-0.633596859040439, + -0.999779056061162,0.98659232792421,-0.638387182556479, + -0.999807879344237,0.988010325656004,-0.643456796374595, + -0.999837527771197,0.989420506822037,-0.648533280922821, + -0.999866374253003,0.990747568499188,-0.653342756744767, + -0.999892960043297,0.991933070692341,-0.657666017256545, + -0.999916265897791,0.992943874252478,-0.661372461014463, + -0.999935816364322,0.993772030018927,-0.66442324414345, + -0.999951619581897,0.994428658432513,-0.666851256235163, + -0.999964015160231,0.994935885870011,-0.668732389522373, + -0.99997351033002,0.995319870362579,-0.67015970170105, + -0.999980652603298,0.995606135693424,-0.671225609758467, + -0.999985951820482,0.995817121286393,-0.672012217707519, + -0.999989843684551,0.995971315456801,-0.672587633075114, + -0.999643378423064,0.978985881492609,-0.612500740824184, + -0.999644936096075,0.979079752094198,-0.612825144699971, + -0.99964709260153,0.979209402031235,-0.613273429777593, + -0.999650065958286,0.979387576553966,-0.613889937311562, + -0.999654142524417,0.97963076347191,-0.614732221861648, + -0.99965968863373,0.97995959552602,-0.615872659651328, + -0.999667155309705,0.980398657679706,-0.617398123146777, + -0.999677066975389,0.980975122632538,-0.619405738241327, + -0.999689981074653,0.98171549955349,-0.621992177692255, + -0.999706404340016,0.982639946893981,-0.625234340260081, + -0.999726658923252,0.983754410258249,-0.629161826247319, + -0.999750714237359,0.985042459195097,-0.633727095084122, + -0.999778037042399,0.986460516399503,-0.638785891235472, + -0.999807542776699,0.9879405525597,-0.644102932677235, + -0.999837718122031,0.989401653230246,-0.649389757433484, + -0.999866908526907,0.990766919256306,-0.654364321488812, + -0.999893665267437,0.991978663173791,-0.658807867477182, + -0.999917006727609,0.993006014704747,-0.662596430819353, + -0.999936505324055,0.993843761495685,-0.665700368324747, + -0.999952212433419,0.994505470936323,-0.668161425658953, + -0.999964498892951,0.995015103003389,-0.670062547781078, + -0.999973890491138,0.995400030001749,-0.671501769244335, + -0.99998094346516,0.995686507256172,-0.672574743431766, + -0.9999861701193,0.995897381317078,-0.673365566060677, + -0.999990005274817,0.996051350521398,-0.673943527635947, + -0.999636497864097,0.978314250888013,-0.610868507178806, + -0.999638143609638,0.978416674858248,-0.611223133119698, + -0.999640421166529,0.978558054130414,-0.611712912678915, + -0.999643559753541,0.97875218877719,-0.612385977311627, + -0.999647859706568,0.979016862349941,-0.61330458074876, + -0.999653703893894,0.97937420403329,-0.614546606917925, + -0.999661561270341,0.979850359871836,-0.616204823882976, + -0.999671972845482,0.980473843383251,-0.618381706324296, + -0.99968550637702,0.981271816955761,-0.621177132648703, + -0.999702665524369,0.982263799418809,-0.624666899863223, + -0.999723748225852,0.983453256531511,-0.628873069633944, + -0.999748673996069,0.984819306197574,-0.63373324602853, + -0.99977683795445,0.98631258435924,-0.639082719486578, + -0.999807077565093,0.987859347100283,-0.644664781960943, + -0.999837817970182,0.989374645543676,-0.650174417628097, + -0.999867378328761,0.990780183969698,-0.655321967566108, + -0.999894323021703,0.992019364405147,-0.659890277895962, + -0.999917711372098,0.993063913192047,-0.663763240841613, + -0.999937166122597,0.993911596229206,-0.66692136936033, + -0.999952783288071,0.994578575143569,-0.669415879976423, + -0.999964965581412,0.995090721972347,-0.671337112690936, + -0.999974257618683,0.995476661471914,-0.672788249221993, + -0.999981224498276,0.995763398345879,-0.673868256393632, + -0.999986381097967,0.995974194795217,-0.674663253284672, + -0.999990161468935,0.996127963642263,-0.675243724730679, + -0.999628871599216,0.977563340625174,-0.608914428430414, + -0.999630615705312,0.977675597836713,-0.609303604497054, + -0.999633028378567,0.977830449102962,-0.609840779838346, + -0.999636351252157,0.978042891841267,-0.610578368059795, + -0.999640900093703,0.978332170312435,-0.611583898461033, + -0.999647075913584,0.978722082369623,-0.612941377384029, + -0.999655367140044,0.979240482054698,-0.614750017497272, + -0.999666332434044,0.979917290534043,-0.617117944354921, + -0.999680549835182,0.98078023709284,-0.62014804531906, + -0.999698518090521,0.981847892980184,-0.623914065384914, + -0.999720506814374,0.98312069692929,-0.628428717414309, + -0.999746379537056,0.9845726129935,-0.633612307993453, + -0.999775453078932,0.986147824972144,-0.639277222192053, + -0.999806481847782,0.987766463858197,-0.64514365014005, + -0.999837827653051,0.989339503078404,-0.650889614066351, + -0.999867784981983,0.990787512735525,-0.656218595909368, + -0.999894934895781,0.992055379434954,-0.660916404977201, + -0.999918381339343,0.993117793337578,-0.664876156724425, + -0.999937800054862,0.993975761434163,-0.668089558173762, + -0.999953333200393,0.99464819664376,-0.670617950121693, + -0.999965416056239,0.995162965417149,-0.672559425593145, + -0.999974612351636,0.995549984512892,-0.674022489490217, + -0.999981496185304,0.995837026254415,-0.675109501099312, + -0.999986585116092,0.996047777075045,-0.675908635241351, + -0.999990312531913,0.996201368691033,-0.676491582768135, + -0.999620420975775,0.976721799513297,-0.606601635017253, + -0.999622275355999,0.97684543733367,-0.607030558569431, + -0.999624839418341,0.977015864707194,-0.6076222077637, + -0.999628368599035,0.97724944539608,-0.608433858852205, + -0.999633195747874,0.977567077732237,-0.609538989890021, + -0.999639741820149,0.977994425988304,-0.611028434870471, + -0.999648516406429,0.978561213224713,-0.61300845746645, + -0.999660096906448,0.979298825518745,-0.615593120493524, + -0.999675071412884,0.980235426548642,-0.618887989909175, + -0.999693931427662,0.981388243122174,-0.622963529987665, + -0.999716913349402,0.982754019087567,-0.627820896963069, + -0.999743817730573,0.984300742606826,-0.633360240188853, + -0.999773875694897,0.985965403475005,-0.639368293929638, + -0.999805753219434,0.987661589920051,-0.64554040334027, + -0.999837747205987,0.989296206939276,-0.651537368871066, + -0.999868129620919,0.990789029644207,-0.657056822841524, + -0.999895502342668,0.992086891864035,-0.661889136757108, + -0.999919018029778,0.993167859006729,-0.66593818034046, + -0.999938408329249,0.994036465317501,-0.669207982776834, + -0.999953863156006,0.994714542470667,-0.671770703919781, + -0.999965851094207,0.995232037757674,-0.673732564308737, + -0.999974955287586,0.995620200909204,-0.675207573989099, + -0.999981758977838,0.995907590527414,-0.676301565758894, + -0.999986782510092,0.996118325926393,-0.677104803288624, + -0.999990458711745,0.996271762077857,-0.677690195455546, + -0.999611053343317,0.975775743039613,-0.603884796825947, + -0.999613031883562,0.975912650295233,-0.604359763835632, + -0.999615766283421,0.976101218495051,-0.6050144497913, + -0.999619527378512,0.976359379624739,-0.6059116832352, + -0.999624666982958,0.976709914051601,-0.607131681527055, + -0.999631628025413,0.977180580098539,-0.60877291769307, + -0.999640943108211,0.977803144860867,-0.610949372866091, + -0.999653209460591,0.978610499278102,-0.613781297332705, + -0.999669024734094,0.979631045031147,-0.617376419553776, + -0.99968887023538,0.980880152002991,-0.621800333065081, + -0.999712943314506,0.982350051181377,-0.627039935806544, + -0.999740973496636,0.984001791228723,-0.632971865481303, + -0.999772097994155,0.985764344142541,-0.639354138465182, + -0.999804888706456,0.987544341427899,-0.645855471952423, + -0.999837576362628,0.989244700363806,-0.652119392113297, + -0.999868413198854,0.990784834346404,-0.657839003408275, + -0.99989602668777,0.992114065717222,-0.662811117640661, + -0.99991962274449,0.993214296218098,-0.666952074995355, + -0.999938992074364,0.994093898965587,-0.670279453607488, + -0.999954374077029,0.994777802955718,-0.672876971494188, + -0.999966271422507,0.995298127015559,-0.674859368596826, + -0.999975286986133,0.995687496286005,-0.676346348241333, + -0.999982013298656,0.99597527473925,-0.677447299868145, + -0.99998697359497,0.996186023293375,-0.67825460983632, + -0.999990600240577,0.99633932449768,-0.678842417373446, + -0.999600659011736,0.974708035989579,-0.600707907614531, + -0.999602778010854,0.974860542895886,-0.601236618584895, + -0.999605704965998,0.975070410914491,-0.601964799208377, + -0.999609727957629,0.975357383329951,-0.602961655657006, + -0.999615219921094,0.975746392931787,-0.604315078325081, + -0.999622648047905,0.976267554594276,-0.606132115041143, + -0.999632569975118,0.976954867084367,-0.608535190817401, + -0.999645603825713,0.977842737024011,-0.61165092590881, + -0.999662355958282,0.978959518964467,-0.615588436744899, + -0.999683293758011,0.980318062023894,-0.6204063845804, + -0.999708568554593,0.981905078819314,-0.626074091503736, + -0.999737829566184,0.983673547947443,-0.63244074347204, + -0.99977011098019,0.985543514350578,-0.639232225924571, + -0.99980388473604,0.987414259071501,-0.646088848833459, + -0.999837314552659,0.989184888620582,-0.652637096558166, + -0.999868636494754,0.990775003339118,-0.658567251678203, + -0.999896509137097,0.992137047075131,-0.663684770297548, + -0.999920196692532,0.993257274825996,-0.667920387749179, + -0.999939552345391,0.99414823800866,-0.671306565983005, + -0.999954866827104,0.994838153363176,-0.673939367784046, + -0.999966677722521,0.995361406421881,-0.675942462717049, + -0.999975607971746,0.995752041693706,-0.677441441950547, + -0.99998225954412,0.996040248059161,-0.678549336835372, + -0.99998715866607,0.996251036846146,-0.679360690995204, + -0.9999907373361,0.996404222471088,-0.679950886641583, + -0.999589107344937,0.973497312875968,-0.597001294754147, + -0.999591386080871,0.973668328230434,-0.597593268842574, + -0.99959453183983,0.973903432400324,-0.598407851047308, + -0.999598852093593,0.974224475166901,-0.599521620766309, + -0.999604743382784,0.974658864441676,-0.601031250906323, + -0.999612699753767,0.97523937456658,-0.603053445209834, + -0.99962330608542,0.97600243259764,-0.605719853677987, + -0.999637202386439,0.976983924442916,-0.609163532904264, + -0.999655002388357,0.978211748419904,-0.613493851909141, + -0.999677154847819,0.979695369509032,-0.61875985885503, + -0.99970375671817,0.981414741216281,-0.624909211111447, + -0.999734366195928,0.983313445338257,-0.631759010565249, + -0.999767904348015,0.985301605206536,-0.638999236073545, + -0.99980273709838,0.987270802414969,-0.646240081512932, + -0.999836960897071,0.989116638466047,-0.653091609034812, + -0.999868800118624,0.990759590999243,-0.659243458364673, + -0.999896950784494,0.992155965496688,-0.664512315028276, + -0.999920740997713,0.993296950004936,-0.668845469230266, + -0.999940090129518,0.994199644092504,-0.672291720044044, + -0.99995534221587,0.994895755336471,-0.674960312547262, + -0.999967070633483,0.995422035839287,-0.676984275473309, + -0.999975918736602,0.9958139950097,-0.678495289077025, + -0.99998249808615,0.996102666636638,-0.679610114082481, + -0.999987338000502,0.996313521353591,-0.680425486697752, + -0.999990870202646,0.996466609707338,-0.681018045054702, + -0.999576241686749,0.972116617749095,-0.592677524712023, + -0.99957870315305,0.97230982067096,-0.593344669475996, + -0.999582098983777,0.972575129825707,-0.594261769514429, + -0.999586758554847,0.972936863320769,-0.595513988772127, + -0.999593104888038,0.97342529174051,-0.597208109144451, + -0.999601661826924,0.974076198024372,-0.599471740073253, + -0.999613043888958,0.974928635484012,-0.602446577711838, + -0.999627913819039,0.97601985787081,-0.606271990784749, + -0.999646890735495,0.977376723720224,-0.611055959085039, + -0.999670398812179,0.979004185472482,-0.616834417946938, + -0.999698470581005,0.980873900666029,-0.623528301373912, + -0.999730560827483,0.982918498660264,-0.630917179784869, + -0.999765466341961,0.985037108077224,-0.638650985611181, + -0.999801440901162,0.987113342915257,-0.646308258106163, + -0.999836514200741,0.989039777153926,-0.653483778621958, + -0.99986890451577,0.990738630386345,-0.659869306066888, + -0.999897352618159,0.992170935258235,-0.665295786916716, + -0.999921256704574,0.993333463562061,-0.669729491261027, + -0.999940606351128,0.994248266182805,-0.673237138510218, + -0.999955801003116,0.994950758180636,-0.675942048171054, + -0.999967450755683,0.99548016302305,-0.677987058060857, + -0.999976219742873,0.995873502181361,-0.679510145713319, + -0.999982729274098,0.99616267482996,-0.680631890943183, + -0.999987511858705,0.996373619900609,-0.681451258613912, + -0.999990999032129,0.996526628313089,-0.682046156011673, + -0.99956187268433,0.970531479526377,-0.587625703122706, + -0.999564544561613,0.970751592835626,-0.588383112630484, + -0.999568228052843,0.971053471010611,-0.589423118267952, + -0.99957327740021,0.971464348435104,-0.590840956059624, + -0.999580145454236,0.972017826647422,-0.592755112731153, + -0.999589389203159,0.972753097820726,-0.595305546336125, + -0.999601655385005,0.973712026201297,-0.59864482915026, + -0.999617630085655,0.97493300368958,-0.602918212146777, + -0.99963793493872,0.976441017872316,-0.608229928386846, + -0.999662961985651,0.978235025410733,-0.614598209635963, + -0.999692667221772,0.980276477231159,-0.621910984287905, + -0.999726387678802,0.982485230710179,-0.62990389083695, + -0.999762783587337,0.984748286160729,-0.638182336737736, + -0.999799990515491,0.986941155449722,-0.646291986463415, + -0.9998359729422,0.988954090981809,-0.653814181774226, + -0.999868949969855,0.990712133831788,-0.660446282379072, + -0.999897715526312,0.992182056431122,-0.666037051039227, + -0.999921744783971,0.99336694509957,-0.670574462569404, + -0.999941101876438,0.994294241723863,-0.674144882521851, + -0.999956243902449,0.995003300002107,-0.676886655565201, + -0.999967818653287,0.99553592474197,-0.678952899992532, + -0.999976511425167,0.995930698330922,-0.680488106036015, + -0.999982953436508,0.996220406298199,-0.681616764634929, + -0.999987680485395,0.996431464970127,-0.682440106138711, + -0.999991124005049,0.996584409866817,-0.683037320515038, + -0.999545769372832,0.968697129881683,-0.581703389413761, + -0.999548685330482,0.968950318756053,-0.582570485078089, + -0.999552702131166,0.969297052285561,-0.583759569216554, + -0.999558202401447,0.969768041680857,-0.585377795072816, + -0.999565672738884,0.970400788413801,-0.587557285815401, + -0.99957570708997,0.971238349112145,-0.590452006519345, + -0.999588987158165,0.972325543365669,-0.594226183799786, + -0.999606222572019,0.973701485409508,-0.59903003585127, + -0.999628033400377,0.97538810561202,-0.604960671497707, + -0.999654769948043,0.977376402599708,-0.612012563238519, + -0.999686297011813,0.979615237602125,-0.620032803668798, + -0.999721817252862,0.982009578441646,-0.62870559790186, + -0.999759840891314,0.984433140013485,-0.637587083446276, + -0.999798379512054,0.986753408121981,-0.646189365889778, + -0.999835335260595,0.988859323349258,-0.654083124451187, + -0.999868936604779,0.990680093327157,-0.660975691075208, + -0.999898040302297,0.992189415816235,-0.666737815961683, + -0.99992220613798,0.99339751304594,-0.671382242820988, + -0.999941577517616,0.994337697670144,-0.675016865803864, + -0.999956671584689,0.995053508724011,-0.677796068374459, + -0.999968174857054,0.995589447776921,-0.679883743341079, + -0.999976794192393,0.995985708739766,-0.681431116570944, + -0.999983170882486,0.996275984974083,-0.682566684542184, + -0.999987844111017,0.996487179407059,-0.683393980689551, + -0.999991245291239,0.996640076376014,-0.683993491478984, + -0.999527647068028,0.966554383008803,-0.574724879596308, + -0.999530848539975,0.966848851405444,-0.575727078537408, + -0.99953525472567,0.967251434416085,-0.57709940504731, + -0.999541280848263,0.967797029601554,-0.578963243130562, + -0.999549451864263,0.968527732682652,-0.581466703366014, + -0.999560403023074,0.969490971729293,-0.584779644783603, + -0.999574853846751,0.970734576829317,-0.589078562311174, + -0.999593537066634,0.972297674431688,-0.59451695807115, + -0.999617065445341,0.974197436159595,-0.601179970724196, + -0.999645735282156,0.97641428827226,-0.609030274548682, + -0.999679302369117,0.978881522835187,-0.617864335613826, + -0.99971681574429,0.981486776171256,-0.62730617857504, + -0.999756621007015,0.98408936563692,-0.636857810951617, + -0.999796600586004,0.986549150056454,-0.645997950543695, + -0.99983459893934,0.988755172290888,-0.654290641249287, + -0.999868864385614,0.990642480721143,-0.661458661540686, + -0.999898327649026,0.992193087751127,-0.66739964572281, + -0.999922641604418,0.9934252755721,-0.672154555174154, + -0.999942034036786,0.994378751406568,-0.675854867355025, + -0.999957084680973,0.995101502992542,-0.678672085713889, + -0.999968519866798,0.995640849812384,-0.68078139550167, + -0.999977068429707,0.996038649727251,-0.682340988976285, + -0.999983381903268,0.996329525932602,-0.683483465015717, + -0.999988002952587,0.996540877278988,-0.684314698518073, + -0.99999136305069,0.996693741131828,-0.684916486550783, + -0.999507150598248,0.964023361778569,-0.566443805631269, + -0.999510689256673,0.964370271326711,-0.567615024684631, + -0.999515554615236,0.964843610477965,-0.569216045936927, + -0.999522199580942,0.965483372059577,-0.571385418568372, + -0.999531192926903,0.966337094760156,-0.574290114034592, + -0.999543216143162,0.967457120290353,-0.578117988726243, + -0.999559029420708,0.968894166267862,-0.583058050119345, + -0.999579387147137,0.970686191408446,-0.589264179491485, + -0.999604886734295,0.972843149467847,-0.596802560696606, + -0.999635754725745,0.975331385211999,-0.605593323611265, + -0.999671616210287,0.978064893520965,-0.615370037541993, + -0.999711344319248,0.980911208410932,-0.625686441819605, + -0.999753104353326,0.983714303325128,-0.635985722329208, + -0.999794645469085,0.986327296819486,-0.645714703351608, + -0.999833761386482,0.988641287435787,-0.654436491473955, + -0.999868733118323,0.990599247730616,-0.661896156590664, + -0.999898578182872,0.992193134802953,-0.66802397047431, + -0.99992305196103,0.993450331406395,-0.672892997532942, + -0.999942472149362,0.994417511571143,-0.676660542838115, + -0.999957483785679,0.995147392987777,-0.679516383603064, + -0.999968854153534,0.995690240234068,-0.681647540650936, + -0.999977334500213,0.99608962943699,-0.683219411520137, + -0.999983586773378,0.99638113616817,-0.684368796864731, + -0.999988157214811,0.996592664646218,-0.685203952213579, + -0.999991477434319,0.996745509473735,-0.685807999622806, + -0.999483830537178,0.96099363273767,-0.556526558132353, + -0.999487771824971,0.961408567503047,-0.557913085833148, + -0.99949318453032,0.961973392338345,-0.559804618374626, + -0.999500565445448,0.962734373879405,-0.562360637123727, + -0.99951053364941,0.963745527570854,-0.565770491848824, + -0.999523822447645,0.965064639052157,-0.570242285359762, + -0.999541235335364,0.96674484954275,-0.575977037252997, + -0.999563545337433,0.968821009537295,-0.583124143295505, + -0.999591323245939,0.971292265484483,-0.59172069161267, + -0.999624705516342,0.974106135226471,-0.601629796724883, + -0.999663160011883,0.977152661845667,-0.612506744011134, + -0.999705358236516,0.980276222869867,-0.623823505106148, + -0.999749268681416,0.983304874940093,-0.634960424679979, + -0.999792504826671,0.98608661301415,-0.645335938947312, + -0.999832819611289,0.988517266330941,-0.654520152023392, + -0.999868542448472,0.990550325768389,-0.662288978786769, + -0.999898792436992,0.992189608358322,-0.668612095924406, + -0.999923437929053,0.993472770560181,-0.673599052648918, + -0.999942892527405,0.994454078791728,-0.67743543482306, + -0.999957869458855,0.995191281150468,-0.680330525251589, + -0.999969178161553,0.995737720843995,-0.682483750055223, + -0.999977592746505,0.996138748541774,-0.684067959405521, + -0.999983785751949,0.996430915291374,-0.685224257694965, + -0.999988307090768,0.996642640252181,-0.686063321051298, + -0.999991588584531,0.996795479475092,-0.686669611188537, + -0.999457108562801,0.957308100330452,-0.544510348254195, + -0.999461536891738,0.957813496974774,-0.546177043093093, + -0.999467610348739,0.958499509739162,-0.548445349392839, + -0.99947587724496,0.959420224561283,-0.551500575623861, + -0.999487014706649,0.96063737454455,-0.555558738396518, + -0.999501814057202,0.962214593042568,-0.560850379360616, + -0.999521124121701,0.964206335982036,-0.567586594383798, + -0.999545731079106,0.966641151433838,-0.575904240780955, + -0.99957616326672,0.969502075922418,-0.585796443590518, + -0.999612440645105,0.97271133966764,-0.597049671898101, + -0.999653841360903,0.97612926634827,-0.609221678375412, + -0.999698805768044,0.979573890622481,-0.621690000135093, + -0.999745088676003,0.98285750656369,-0.633769664809452, + -0.999790168137297,0.985825691481262,-0.644857253738139, + -0.999831770196654,0.988382650050448,-0.654540806884388, + -0.999868291858835,0.990495625586984,-0.662637775338392, + -0.999898970864313,0.99218254911945,-0.669165211711007, + -0.999923800176717,0.993492674974405,-0.674274097203207, + -0.999943295802393,0.99448854634705,-0.678180982015034, + -0.999958242228691,0.995233262834796,-0.681115970328253, + -0.999969492310313,0.995783386502816,-0.683291491360672, + -0.9999778434921,0.996186100876788,-0.684888104075612, + -0.999983979083579,0.996478956154855,-0.686051321225753, + -0.999988452762854,0.996690896143604,-0.686894280318611, + -0.999991696635762,0.996843742558989,-0.687502797675764, + -0.99942622519677,0.95273551376525,-0.52973445342276, + -0.999431251888513,0.953364890065364,-0.531775078248324, + -0.999438135127102,0.954216205818819,-0.534544256478421, + -0.999447484232229,0.955353409604379,-0.538259555819354, + -0.999460043610956,0.956847382797287,-0.543168806764506, + -0.999476669294355,0.958767617957035,-0.549526631433258, + -0.999498256120107,0.961167548841825,-0.557549533893376, + -0.999525594039106,0.96406411345337,-0.567348498477478, + -0.99955914655047,0.967416296772765,-0.578850629984727, + -0.999598782612736,0.971112205090269,-0.591738948908515, + -0.999643550828683,0.974975424245401,-0.605449790438815, + -0.999691626863873,0.978794695326964,-0.619253051210138, + -0.999740535476891,0.982368032503499,-0.632399001290434, + -0.999787623551576,0.985542928393217,-0.644273440690982, + -0.999830609266859,0.988236917993668,-0.654497332961353, + -0.999867980665878,0.990435036734623,-0.662943041651411, + -0.999899113839826,0.992171987514358,-0.669684398813115, + -0.99992413932228,0.993510119095966,-0.674919409982818, + -0.999943682568059,0.994521000760791,-0.678898527582435, + -0.999958602593663,0.995273426895692,-0.681874083329038, + -0.999969796996008,0.995827325707849,-0.684072136980539, + -0.999978087042701,0.996231774009489,-0.685681221614805, + -0.999984166999591,0.996525345416597,-0.686851365701776, + -0.999988594403447,0.996737518228668,-0.687698209735077, + -0.99999180171517,0.996890384052486,-0.68830893987291, + -0.999390157426463,0.946920942804295,-0.51122226313308, + -0.999395933441802,0.947726692929812,-0.513777573628096, + -0.999403827648663,0.948811777610072,-0.51723281658354, + -0.999414522275239,0.950252708159809,-0.521846337183872, + -0.999428839936587,0.952130988141452,-0.527903696028361, + -0.999447708094207,0.954520972605718,-0.535683534220698, + -0.999472065554197,0.957470350228495,-0.545397862094965, + -0.999502690391198,0.960975483022857,-0.557109508368084, + -0.999539949364454,0.964959236107952,-0.570646385943978, + -0.999583515091451,0.969263514061787,-0.585551315111654, + -0.999632157937203,0.973666963417248,-0.601110139814965, + -0.999683751487941,0.977927125893571,-0.616472948214351, + -0.999735576101922,0.981831575297115,-0.630831395552119, + -0.999784857726637,0.985236493339534,-0.643578385785915, + -0.999829332450153,0.988079481753197,-0.65438828186954, + -0.999867608015024,0.990368426816476,-0.663205123565136, + -0.999899221662683,0.992157944027575,-0.670170636093868, + -0.999924455936773,0.99352517039157,-0.675536179250677, + -0.999944053382784,0.994551522336392,-0.679589326684972, + -0.999958951024577,0.995311856218264,-0.682606141144479, + -0.999970092593324,0.995869621114249,-0.684826971680466, + -0.999978323687495,0.996275849753412,-0.686448600346481, + -0.999984349718736,0.996570164047781,-0.687625681500497, + -0.99998873217569,0.996782586780245,-0.68847640106736, + -0.999991903942978,0.996935483686355,-0.689089330549666, + -0.999347481117801,0.939290459494334,-0.487467495756698, + -0.999354218814845,0.940359291937983,-0.490758827061018, + -0.999363405293717,0.94179042102576,-0.495189208987614, + -0.99937581067759,0.943676400697521,-0.501069025782312, + -0.999392348372638,0.946110332967342,-0.508727587294775, + -0.999414022815505,0.949167962851339,-0.518463101634253, + -0.999441809315305,0.952881721565543,-0.530462948663941, + -0.999476448137069,0.957211904308363,-0.544703949914482, + -0.999518163390315,0.962026671148328,-0.560864218500752, + -0.999566371599233,0.9671054278198,-0.578296052160285, + -0.999619505889223,0.972173183572955,-0.596100902764443, + -0.999675097525905,0.976957135851488,-0.613301403710775, + -0.999730172747202,0.981242394512128,-0.629046698844639, + -0.999781855631441,0.984904293259831,-0.64276494225858, + -0.999827934835346,0.987909677906738,-0.654211857218486, + -0.999867172874756,0.990295640550794,-0.663424218297065, + -0.999899294557703,0.992140429456527,-0.670624806055411, + -0.999924750546524,0.99353788980571,-0.676125509396204, + -0.999944408771816,0.994580185639227,-0.680254553289513, + -0.999959287966352,0.99534862819584,-0.683313339914276, + -0.999970379456712,0.995910350005688,-0.685557199449765, + -0.999978553700145,0.996318404632234,-0.687191447715675, + -0.99998452744805,0.996613487791505,-0.688375478023611, + -0.999988866233908,0.996826176890439,-0.689230065027467, + -0.999992003433048,0.996979116046436,-0.689845181360383, + -0.99929612221311,0.92885164154965,-0.456019541351542, + -0.999304136012349,0.930338079224207,-0.460415923605211, + -0.999315027665755,0.932312945848239,-0.466298906238068, + -0.99932967386815,0.934888870826995,-0.474045380275375, + -0.999349092121395,0.938169262151671,-0.484032087617024, + -0.999374365071002,0.942221624043521,-0.496561507953729, + -0.999406486153652,0.947043569031187,-0.511755566566498, + -0.999446114575041,0.952531828519665,-0.529439310857211, + -0.999493265137843,0.95847104464828,-0.549062847224271, + -0.999547019807701,0.964557081761264,-0.56972004770415, + -0.999605404586501,0.970454509503382,-0.590292352063801, + -0.999665568129688,0.975867415739172,-0.609679235305811, + -0.999724281933513,0.980593694544417,-0.627021003888902, + -0.999778600317221,0.984543928761683,-0.641824777683263, + -0.999826410921627,0.987726759554179,-0.653965886787326, + -0.999866674029357,0.990216498606079,-0.663600374094058, + -0.999899332676593,0.992119445097779,-0.671047699874178, + -0.999925023635529,0.99354833216856,-0.676688426942388, + -0.99994474922943,0.994607059931934,-0.680895306350511, + -0.999959613839686,0.995383815162353,-0.683996801246194, + -0.999970657921832,0.99594958472018,-0.686263949735904, + -0.999978777339898,0.996359510299634,-0.687910896533956, + -0.999984700383703,0.996655387577793,-0.689101889949892, + -0.999988996724424,0.996868358881836,-0.689960337531757, + -0.999992100293264,0.997021350982018,-0.690577629107776, + -0.999232852507766,0.913727519036899,-0.412606853125446, + -0.999242645398387,0.915935956793934,-0.41877234970756, + -0.999255893862801,0.918837586526089,-0.426956504255908, + -0.999273602979233,0.922567693783475,-0.437619185024585, + -0.999296904214589,0.927230536454782,-0.451177895602595, + -0.999326946918226,0.932859625501621,-0.467896904643251, + -0.999364701514127,0.939375916610792,-0.487748118687341, + -0.999410673041913,0.946562446165056,-0.510287421562708, + -0.999464570104078,0.95407637777001,-0.534615408125632, + -0.999525039284739,0.961506490361475,-0.559480266158481, + -0.999589621231223,0.968459052306018,-0.583516782465201, + -0.999655048311424,0.97463639862061,-0.605533240844905, + -0.999717853458056,0.979877377924312,-0.62472581872234, + -0.999775072645767,0.984152640941173,-0.640748187551763, + -0.999824754560624,0.987529886381108,-0.653647788844286, + -0.999866110070261,0.990130796201362,-0.663733488567256, + -0.999899336098702,0.992094982866248,-0.671440021774989, + -0.999925275647391,0.993556546558814,-0.677225885975937, + -0.999945075220809,0.994632209568016,-0.681512615422448, + -0.999959929042703,0.99541748478404,-0.684657577866916, + -0.999970928306749,0.995987393035966,-0.686948283109992, + -0.99997899485255,0.996399233919776,-0.688608010654417, + -0.999984868711673,0.996695929899694,-0.689805982917444, + -0.999989123785848,0.996909198680171,-0.690668285388792, + -0.99999219462584,0.997062253975925,-0.691287741435037, + -0.999152077060728,0.889889548444139,-0.349061088286487, + -0.999164564481812,0.893512362357241,-0.358321392850279, + -0.999181328175061,0.89819090051193,-0.370471779013374, + -0.999203519013022,0.904073370874581,-0.386063949868755, + -0.999232372094478,0.911225741593758,-0.405512187944769, + -0.999269054494269,0.919575847587998,-0.428928148710386, + -0.999314422562479,0.928873757841218,-0.455951377537584, + -0.999368702795487,0.938696629074492,-0.485653574382402, + -0.999431161107827,0.948513477384418,-0.516600823762431, + -0.999499889019962,0.957794017950755,-0.547100205403036, + -0.999571867439423,0.966117436282565,-0.575553712340007, + -0.999643400523047,0.973236877263828,-0.600771919790487, + -0.999710829097846,0.979083725305741,-0.622127004150167, + -0.999771250966691,0.983727246264749,-0.639523867161234, + -0.999822958889432,0.987318112980124,-0.653254531680796, + -0.999865479385908,0.990038301447359,-0.663823305665926, + -0.999899304831475,0.992067025349649,-0.67180239279328, + -0.999925506987289,0.993562576625782,-0.677738773058922, + -0.999945387183711,0.994655694348136,-0.682107445763671, + -0.999960233952359,0.995449700414856,-0.685296658764391, + -0.999971190912995,0.996023838521735,-0.687611196422924, + -0.999979206471127,0.996437638512654,-0.689283790136547, + -0.999985032608414,0.996735177154657,-0.690488758695185, + -0.999989247549769,0.996948758152623,-0.691354911475921, + -0.999992286527841,0.997101886480435,-0.691976522006297, + -0.999042007259475,0.846839476355646,-0.247562606935731, + -0.999059310027056,0.853850930614133,-0.262993110426348, + -0.99908215215834,0.862634865772264,-0.282874416523585, + -0.999111791350179,0.873267701688246,-0.307799227855353, + -0.999149460274721,0.885615899778428,-0.337997269244, + -0.999196176211498,0.89928385557361,-0.373105577817442, + -0.999252479946996,0.913630787322957,-0.412017325303364, + -0.999318122840983,0.927874730147937,-0.452924609459096, + -0.9993917698708,0.941254666200446,-0.493608708966554, + -0.999470858355026,0.953184064404172,-0.531898307960971, + -0.999551781187113,0.963334777927113,-0.566107560700536, + -0.999630458843132,0.971634043939743,-0.595279512665676, + -0.999703140993037,0.978200975484896,-0.619183392925497, + -0.999767110732338,0.983264056319206,-0.638138631171118, + -0.999821016253149,0.987090375099302,-0.652782585207141, + -0.999864780149848,0.989938753401259,-0.663869411221801, + -0.999899238810493,0.992035545799555,-0.672135353966679, + -0.999925718023562,0.993566460874601,-0.678227911673286, + -0.999945685530231,0.99467756984301,-0.682680702983936, + -0.999960528925675,0.995480521419424,-0.685914973874208, + -0.999971446026693,0.996058980854992,-0.688253627504821, + -0.999979412416931,0.996474783268042,-0.689939175953683, + -0.999985192241392,0.996773187954865,-0.69115115989633, + -0.999989368141114,0.996987095415323,-0.692021159457422, + -0.999992376091346,0.997140306222664,-0.692644915228308, + -0.998865086928174,0.745924580066976,-0.0604141480564288, + -0.998895487231205,0.764873649745473,-0.0910755754690588, + -0.998933409668284,0.787060755596958,-0.129313938502959, + -0.998979684019541,0.81184986561543,-0.175344827159791, + -0.99903493644843,0.83813626350615,-0.228455101442363, + -0.999099521125361,0.864509230253996,-0.286815983154912, + -0.999173362695985,0.889538052977561,-0.347607059890004, + -0.999255664139382,0.912066866492635,-0.407502232575221, + -0.999344565973438,0.931397810612656,-0.463365245732482, + -0.99943698944938,0.94731384445106,-0.512864721985471, + -0.999528900858466,0.959977803907794,-0.554772924977228, + -0.999616021217074,0.969782650772129,-0.588907534659359, + -0.999694709613298,0.977214767105395,-0.615844974558559, + -0.999762624036077,0.982758778214894,-0.636577066889482, + -0.999818918115288,0.986845473409128,-0.652227863178924, + -0.999864010307122,0.989831859802084,-0.663871226969659, + -0.999899137899114,0.992000508059639,-0.672439368989748, + -0.999925909089307,0.993568232917785,-0.6786940662434, + -0.999945970648199,0.994697887686373,-0.68323323728191, + -0.999960814301116,0.995510003466929,-0.686513398356392, + -0.99997169391947,0.996092876111869,-0.688876459454257, + -0.999979612900072,0.996510723831304,-0.690575054289614, + -0.999985347769733,0.996810017409768,-0.69179407428053, + -0.999989485678529,0.997024265113336,-0.69266791809088, + -0.999992463403904,0.997177567482597,-0.693293810560046, + -0.998168670041896,0.234202002930654,0.397757295018613, + -0.998398779709349,0.385186319412462,0.309863134853804, + -0.998576095338357,0.517988723723858,0.208214440973434, + -0.998719357216826,0.629703569518859,0.096222948116353, + -0.998842476527936,0.720203330951345,-0.0207601551784617, + -0.998955556213729,0.791300079843907,-0.136348134920346, + -0.999065378019792,0.845813571958666,-0.24445016793907, + -0.999175567184225,0.88683389735994,-0.340477179725281, + -0.999286737933873,0.917262868364474,-0.421953754912466, + -0.999396947303236,0.939594279052761,-0.488436998558289, + -0.999502626750312,0.955853286353504,-0.540978607500742, + -0.999599838919708,0.967622793392235,-0.581462483326913, + -0.999685441175006,0.976107385917766,-0.612050478470221, + -0.999757759055763,0.982206390023536,-0.634821102862626, + -0.999816654953809,0.986582054280449,-0.651585654275972, + -0.999863167558551,0.989717294446952,-0.663828002921204, + -0.999899001887773,0.991961866430869,-0.672714826358979, + -0.999926080483689,0.993567921696033,-0.679137945776486, + -0.999946242902525,0.994716695840987,-0.683765847313538, + -0.999961090399614,0.995538198798929,-0.687092756503707, + -0.999971934849436,0.996125577031366,-0.689480524558436, + -0.999979808120392,0.996545512563991,-0.691192260465585, + -0.999985499344625,0.996845717383694,-0.692418338685915, + -0.999989600274749,0.997060318675938,-0.693296025163123, + -0.999992548548667,0.997213721346586,-0.693924046451602 +}; + +} /* namespace DSP */ + +#endif /* _KS_TAB_H_ */ diff --git a/plugins/ladspa_effect/caps/dsp/tonestack/tables.h b/plugins/ladspa_effect/caps/dsp/tonestack/tables.h new file mode 100644 index 000000000..bbfbd94e2 --- /dev/null +++ b/plugins/ladspa_effect/caps/dsp/tonestack/tables.h @@ -0,0 +1,38 @@ +/* + ks_tab.h + + Copyright 2006 David Yeh + + http://quitte.de/dsp/ + + Tone Stack emulation coefficient table for lattice filter. + +*/ +/* + 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; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA or point your web browser to http://www.gnu.org. +*/ + +#ifndef _TS_TABLES_H_ +#define _TS_TABLES_H_ + +namespace DSP { + +extern double ToneStackKS[]; +extern double ToneStackVS[]; + +} /* namespace DSP */ + +#endif /* _TS_TABLES_H_ */ diff --git a/plugins/ladspa_effect/caps/dsp/tonestack/vs_tab.h b/plugins/ladspa_effect/caps/dsp/tonestack/vs_tab.h new file mode 100644 index 000000000..b266ee71a --- /dev/null +++ b/plugins/ladspa_effect/caps/dsp/tonestack/vs_tab.h @@ -0,0 +1,15664 @@ +/* + vs_tab.h + + Copyright 2006 David Yeh + + http://quitte.de/dsp/ + + Tone Stack emulation coefficient table for lattice filter. + +*/ +/* + 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; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA or point your web browser to http://www.gnu.org. +*/ + + +#ifndef _VS_TAB_H_ +#define _VS_TAB_H_ + +namespace DSP { + +double ToneStackVS[] = { + -9.45385446026598e-06,-0.00655412425867525,0.0132200144354443,0.0102188726276126, + -1.24191436832038e-05,-0.00586705925752717,0.0294688298274704,-0.0216003374232777, + -1.53844329061348e-05,-0.00517999425637911,0.0457176452194964,-0.053419547474168, + -1.83497221290796e-05,-0.00449292925523104,0.0619664606115225,-0.0852387575250582, + -2.13150113519966e-05,-0.00380586425408297,0.0782152760035486,-0.117057967575949, + -2.42803005748859e-05,-0.00311879925293479,0.0944640913955747,-0.148877177626839, + -2.72455897978585e-05,-0.00243173425178678,0.110712906787601,-0.180696387677729, + -3.02108790207201e-05,-0.00174466925063865,0.126961722179627,-0.212515597728619, + -3.31761682436094e-05,-0.00105760424949042,0.143210537571653,-0.24433480777951, + -3.61414574664987e-05,-0.000370539248342183,0.159459352963679,-0.2761540178304, + -3.9106746689721e-05,0.000316525752805275,0.175708168355705,-0.30797322788129, + -4.20720359125548e-05,0.0010035907539534,0.191956983747731,-0.339792437932181, + -4.50373251356662e-05,0.00169065575510152,0.208205799139757,-0.371611647983071, + -4.80026143581114e-05,0.00237772075625009,0.224454614531783,-0.403430858033961, + -5.09679035813893e-05,0.00306478575739821,0.24070342992381,-0.435250068084851, + -5.3933192804112e-05,0.00375185075854612,0.256952245315835,-0.467069278135742, + -5.68984820269458e-05,0.00443891575969446,0.273201060707862,-0.498888488186632, + -5.98637712498906e-05,0.00512598076084236,0.289449876099888,-0.530707698237522, + -6.28290604727244e-05,0.00581304576199071,0.305698691491914,-0.562526908288412, + -6.57943496960023e-05,0.00650011076313839,0.32194750688394,-0.594346118339303, + -6.87596389189471e-05,0.00718717576428629,0.338196322275966,-0.626165328390193, + -7.17249281420029e-05,0.00787424076543397,0.354445137667992,-0.657984538441083, + -7.46902173648367e-05,0.00856130576658254,0.370693953060018,-0.689803748491973, + -7.76555065876705e-05,0.00924837076773066,0.386942768452044,-0.721622958542864, + -8.06207958105043e-05,0.00993543576887879,0.40319158384407,-0.753442168593754, + -9.41939857081013e-06,-0.00655319504622455,0.0132268917091642,0.0102210248142172, + -1.23601628603601e-05,-0.00586780948081826,0.0294548118993129,-0.0216122564867453, + -1.53009271499499e-05,-0.00518242391541199,0.0456827320894617,-0.0534455377877077, + -1.82416914396022e-05,-0.00449703835000587,0.0619106522796104,-0.0852788190886702, + -2.11824557291018e-05,-0.0038116527845995,0.0781385724697592,-0.117112100389633, + -2.41232200187957e-05,-0.00312626721919329,0.094366492659908,-0.148945381690595, + -2.70639843083231e-05,-0.00244088165378709,0.110594412850057,-0.180778662991558, + -3.00047485976007e-05,-0.00175549608838033,0.126822333040206,-0.21261194429252, + -3.29455128875722e-05,-0.00107011052297457,0.143050253230354,-0.244445225593482, + -3.58862771771551e-05,-0.000384724957568361,0.159278173420503,-0.276278506894445, + -3.8827041466738e-05,0.000300660607837733,0.175506093610652,-0.308111788195407, + -4.17678057565429e-05,0.000986046173243826,0.191734013800801,-0.33994506949637, + -4.47085700459038e-05,0.00167143173865036,0.207961933990949,-0.371778350797332, + -4.76493343355422e-05,0.00235681730405624,0.224189854181098,-0.403611632098295, + -5.05900986250696e-05,0.00304220286946277,0.240417774371247,-0.435444913399257, + -5.35308629144859e-05,0.00372758843486909,0.256645694561396,-0.46727819470022, + -5.64716272042354e-05,0.00441297400027518,0.272873614751544,-0.499111476001182, + -5.94123914935407e-05,0.00509835956568172,0.289101534941693,-0.530944757302145, + -6.23531557831791e-05,0.00578374513108781,0.305329455131842,-0.562778038603107, + -6.52939200728175e-05,0.00646913069649413,0.32155737532199,-0.594611319904069, + -6.8234684362567e-05,0.00715451626190022,0.337785295512139,-0.626444601205032, + -7.11754486519833e-05,0.00783990182730676,0.354013215702288,-0.658277882505994, + -7.41162129419548e-05,0.00852528739271241,0.370241135892437,-0.690111163806957, + -7.70569772319263e-05,0.00921067295811806,0.386469056082585,-0.721944445107919, + -7.99977415204545e-05,0.00989605852352593,0.402696976272735,-0.753777726408882, + -9.37160003060961e-06,-0.00655190758967857,0.0132364072721412,0.0102240017427008, + -1.22785730753069e-05,-0.00586885694194833,0.0294354064091315,-0.0216287430680944, + -1.51855461200251e-05,-0.00518580629421808,0.0456344055461219,-0.0534814878788896, + -1.80925191646669e-05,-0.00450275564648778,0.0618334046831123,-0.0853342326896848, + -2.09994922094614e-05,-0.00381970499875756,0.0780324038201028,-0.11718697750048, + -2.3906465254131e-05,-0.00313665435102717,0.0942314029570933,-0.149039722311275, + -2.68134382989116e-05,-0.00245360370329706,0.110430402094084,-0.18089246712207, + -2.97204113434146e-05,-0.0017705530555665,0.126629401231074,-0.212745211932866, + -3.26273843883063e-05,-0.00108750240783662,0.142828400368064,-0.244597956743661, + -3.55343574329758e-05,-0.000404451760106284,0.159027399505055,-0.276450701554456, + -3.84413304777564e-05,0.000278598887623938,0.175226398642045,-0.308303446365251, + -4.1348303522426e-05,0.000961649535354159,0.191425397779036,-0.340156191176046, + -4.42552765669846e-05,0.0016447001830846,0.207624396916026,-0.372008935986842, + -4.71622496115987e-05,0.00232775083081505,0.223823396053016,-0.403861680797637, + -5.00692226566013e-05,0.0030108014785446,0.240022395190006,-0.435714425608432, + -5.29761957012154e-05,0.00369385212627549,0.256221394326997,-0.467567170419227, + -5.58831687457184e-05,0.00437690277400571,0.272420393463988,-0.499419915230022, + -5.87901417908876e-05,0.00505995342173526,0.288619392600978,-0.531272660040818, + -6.16971148355017e-05,0.00574300406946571,0.304818391737968,-0.563125404851613, + -6.46040878798937e-05,0.00642605471719659,0.321017390874959,-0.594978149662408, + -6.75110609249518e-05,0.00710910536492637,0.337216390011949,-0.626830894473203, + -7.04180339694549e-05,0.00779215601265681,0.35341538914894,-0.658683639283998, + -7.33250070134028e-05,0.0084752066603877,0.36961438828593,-0.690536384094793, + -7.62319800590161e-05,0.0091582573081177,0.385813387422921,-0.722389128905589, + -7.91389531040743e-05,0.00984130795584681,0.40201238655991,-0.754241873716384, + -9.30551244646138e-06,-0.00655013053761504,0.0132495164937455,0.0102281012526002, + -1.21662034849382e-05,-0.00587031791026438,0.0294086533311691,-0.0216514466378377, + -1.5026894523415e-05,-0.00519050528291368,0.0455677901685926,-0.0535309945282756, + -1.78875855619126e-05,-0.00451069265556314,0.0617269270060161,-0.0854105424187135, + -2.07482766004519e-05,-0.00383088002821247,0.0778860638434397,-0.117290090309151, + -2.36089676389495e-05,-0.00315106740086191,0.0940452006808631,-0.149169638199589, + -2.64696586773916e-05,-0.00247125477351118,0.110204337518287,-0.181049186090027, + -2.93303497158059e-05,-0.00179144214616056,0.12636347435571,-0.212928733980465, + -3.21910407543036e-05,-0.00111162951880983,0.142522611193134,-0.244808281870903, + -3.50517317928567e-05,-0.000431816891459214,0.158681748030557,-0.276687829761341, + -3.79124228314653e-05,0.000247995735891182,0.174840884867981,-0.308567377651779, + -4.07731138695744e-05,0.000927808363242466,0.191000021705405,-0.340446925542217, + -4.36338049084051e-05,0.00160762099059264,0.207159158542828,-0.372326473432655, + -4.64944959466806e-05,0.00228743361794348,0.223318295380251,-0.404206021323093, + -4.93551869851228e-05,0.0029672462452941,0.239477432217675,-0.436085569213531, + -5.22158780237314e-05,0.00364705887264472,0.255636569055099,-0.467965117103969, + -5.50765690616739e-05,0.00432687149999578,0.271795705892522,-0.499844664994407, + -5.79372601006156e-05,0.00500668412734617,0.287954842729946,-0.531724212884844, + -6.07979511390022e-05,0.00568649675469701,0.304113979567369,-0.563603760775282, + -6.36586421778329e-05,0.00636630938204696,0.320273116404793,-0.59548330866572, + -6.65193332161085e-05,0.00704612200939803,0.336432253242216,-0.627362856556158, + -6.93800242546061e-05,0.00772593463674864,0.35259139007964,-0.659242404446596, + -7.22407152924376e-05,0.00840574726410015,0.368750526917063,-0.691121952337034, + -7.51014063312683e-05,0.00908555989145032,0.384909663754487,-0.723001500227472, + -7.79620973696549e-05,0.00976537251880094,0.40106880059191,-0.75488104811791, + -9.21455795741509e-06,-0.00654769054013065,0.0132674694997489,0.01023371233782, + -1.20123774072986e-05,-0.00587235235406242,0.0293719796792397,-0.0216825214901362, + -1.48101968571318e-05,-0.00519701416799415,0.0454764898587305,-0.0535987553180923, + -1.76080163070691e-05,-0.00452167598192593,0.0615810000382213,-0.0855149891460485, + -2.04058357570203e-05,-0.0038463377958578,0.0776855102177121,-0.117431222974005, + -2.32036552068604e-05,-0.0031709996097895,0.0937900203972029,-0.149347456801961, + -2.60014746567283e-05,-0.00249566142372137,0.109894530576694,-0.181263690629917, + -2.87992941066517e-05,-0.00182032323765302,0.125999040756185,-0.213179924457873, + -3.15971135562698e-05,-0.00114498505158456,0.142103550935675,-0.245096158285829, + -3.4394933006443e-05,-0.000469646865516538,0.158208061115166,-0.277012392113785, + -3.71927524563387e-05,0.000205691320551926,0.174312571294657,-0.308928625941742, + -3.99905719063454e-05,0.000881029506619724,0.190417081474148,-0.340844859769698, + -4.27883913557969e-05,0.00155636769268885,0.206521591653639,-0.372761093597654, + -4.55862108061367e-05,0.00223170587875599,0.222626101833129,-0.40467732742561, + -4.83840302557548e-05,0.00290704406482489,0.23873061201262,-0.436593561253566, + -5.11818497057615e-05,0.00358238225089269,0.254835122192111,-0.468509795081522, + -5.39796691556571e-05,0.00425772043696138,0.270939632371602,-0.500426028909479, + -5.67774886057748e-05,0.00493305862302873,0.287044142551092,-0.532342262737435, + -5.95753080553374e-05,0.00560839680909742,0.303148652730583,-0.564258496565391, + -6.2373127505011e-05,0.00628373499516632,0.319253162910074,-0.596174730393347, + -6.51709469547956e-05,0.00695907318123457,0.335357673089565,-0.628090964221303, + -6.79687664046913e-05,0.00763441136730281,0.351462183269056,-0.660007198049259, + -7.07665858552531e-05,0.00830974955337016,0.367566693448546,-0.691923431877215, + -7.35644053048157e-05,0.00898508773943885,0.383671203628037,-0.723839665705172, + -7.63622247547113e-05,0.00966042592550664,0.399775713807528,-0.755755899533128, + -9.0901720242835e-06,-0.00654436433726225,0.0132918568674893,0.0102413285781499, + -1.18035387460871e-05,-0.00587517815686124,0.0293220966544303,-0.0217247011281304, + -1.45169054678873e-05,-0.00520599197646027,0.0453523364413711,-0.0536907308344107, + -1.72302721896667e-05,-0.00453680579605925,0.061382576228312,-0.0856567605406909, + -1.99436389114738e-05,-0.00386761961565824,0.077412816015253,-0.117622790246971, + -2.26570056333086e-05,-0.00319843343525739,0.0934430558021937,-0.149588819953251, + -2.53703723551435e-05,-0.00252924725485637,0.109473295589135,-0.181554849659532, + -2.80837390769784e-05,-0.00186006107445547,0.125503535376076,-0.213520879365812, + -3.07971057986745e-05,-0.00119087489405445,0.141533775163016,-0.245486909072092, + -3.35104725203705e-05,-0.000521688713653212,0.157564014949957,-0.277452938778373, + -3.62238392423997e-05,0.00014749746674747,0.173594254736898,-0.309418968484653, + -3.89372059641513e-05,0.000816683647148375,0.189624494523839,-0.341384998190933, + -4.16505726857919e-05,0.00148586982754972,0.20565473431078,-0.373351027897213, + -4.43639394076545e-05,0.00215505600795085,0.221684974097721,-0.405317057603494, + -4.70773061294061e-05,0.00282424218835153,0.237715213884662,-0.437283087309774, + -4.97906728511577e-05,0.00349342836875288,0.253745453671603,-0.469249117016054, + -5.25040395730203e-05,0.00416261454915356,0.269775693458544,-0.501215146722335, + -5.52174062947719e-05,0.00483180072955491,0.285805933245485,-0.533181176428615, + -5.79307730167455e-05,0.00550098690995537,0.301836173032425,-0.565147206134895, + -6.06441397383861e-05,0.00617017309035606,0.317866412819366,-0.597113235841175, + -6.33575064603598e-05,0.00683935927075741,0.333896652606307,-0.629079265547456, + -6.60708731822224e-05,0.00750854545115809,0.349926892393248,-0.661045295253736, + -6.87842399037519e-05,0.00817773163155922,0.365957132180188,-0.693011324960016, + -7.14976066260586e-05,0.0088469178119599,0.38198737196713,-0.724977354666296, + -7.42109733471441e-05,0.00951610399236191,0.398017611754071,-0.756943384372577, + -8.92153915172701e-06,-0.00653987441482468,0.013324621159271,0.0102515503577533, + -1.15231835207535e-05,-0.00587908717616796,0.0292549605824841,-0.021781310550188, + -1.41248278898304e-05,-0.00521829993751122,0.0451853000056971,-0.0538141714581293, + -1.67264722587823e-05,-0.00455751269885435,0.0611156394289102,-0.0858470323660706, + -1.93281166278592e-05,-0.0038967254601977,0.0770459788521232,-0.117879893274012, + -2.1929760996936e-05,-0.003235938221541,0.0929763182753361,-0.149912754181953, + -2.45314053658185e-05,-0.00257515098288408,0.108906657698549,-0.181945615089894, + -2.71330497349509e-05,-0.00191436374422738,0.124836997121762,-0.213978475997836, + -2.97346941040555e-05,-0.00125357650557101,0.140767336544975,-0.246011336905777, + -3.23363384731046e-05,-0.000592789266914084,0.156697675968188,-0.278044197813718, + -3.49379828420981e-05,6.79979717426171e-05,0.172628015391401,-0.31007705872166, + -3.75396272110917e-05,0.00072878521039943,0.188558354814614,-0.342109919629601, + -4.01412715799743e-05,0.00138957244905646,0.204488694237827,-0.374142780537542, + -4.27429159494674e-05,0.00205035968771239,0.22041903366104,-0.406175641445483, + -4.5344560318239e-05,0.00271114692636965,0.236349373084253,-0.438208502353425, + -4.79462046875101e-05,0.00337193416502601,0.252279712507466,-0.470241363261366, + -5.05478490560041e-05,0.00403272140368327,0.268210051930679,-0.502274224169307, + -5.31494934248311e-05,0.0046935086423403,0.284140391353892,-0.534307085077249, + -5.57511377943243e-05,0.00535429588099645,0.300070730777105,-0.56633994598519, + -5.83527821632623e-05,0.00601508311965326,0.316001070200318,-0.598372806893131, + -6.09544265320894e-05,0.00667587035831074,0.331931409623532,-0.630405667801072, + -6.35560709016936e-05,0.00733665759696622,0.347861749046744,-0.662438528709014, + -6.61577152706316e-05,0.00799744483562348,0.363792088469957,-0.694471389616955, + -6.87593596394587e-05,0.00865823207428029,0.379722427893171,-0.726504250524896, + -7.13610040086188e-05,0.00931901931293666,0.395652767316383,-0.758537111432838, + -8.69560363404333e-06,-0.00653389357768309,0.0133679932546893,0.0102650629330693, + -1.1152452480033e-05,-0.00588445970216538,0.0291658802327748,-0.0218561447873589, + -1.36093013259897e-05,-0.00523502582664756,0.0449637672108603,-0.0539773525077871, + -1.60661501719533e-05,-0.00458559195112979,0.0607616541889458,-0.0860985602282153, + -1.85229990179725e-05,-0.0039361580756121,0.0765595411670313,-0.118219767948644, + -2.09798478638945e-05,-0.00328672420009424,0.0923574281451169,-0.150340975669072, + -2.34366967097333e-05,-0.00263729032457627,0.108155315123202,-0.1824621833895, + -2.58935455558218e-05,-0.00198785644905874,0.123953202101288,-0.214583391109928, + -2.83503944018548e-05,-0.00133842257354089,0.139751089079374,-0.246704598830356, + -3.08072432478879e-05,-0.000688988698023363,0.155548976057459,-0.278825806550785, + -3.32640920938099e-05,-3.95548225053943e-05,0.171346863035544,-0.310947014271213, + -3.57209409400649e-05,0.000609879053012019,0.18714475001363,-0.343068221991641, + -3.81777897856539e-05,0.0012593129285301,0.202942636991715,-0.375189429712069, + -4.06346386317979e-05,0.00190874680404773,0.218740523969801,-0.407310637432497, + -4.30914874776089e-05,0.00255818067956581,0.234538410947887,-0.439431845152926, + -4.55483363235309e-05,0.00320761455508323,0.250336297925972,-0.471553052873354, + -4.8005185169453e-05,0.00385704843060108,0.266134184904057,-0.503674260593782, + -5.0462034015486e-05,0.00450648230611894,0.281932071882143,-0.53579546831421, + -5.2918882861519e-05,0.0051559161816368,0.297729958860229,-0.567916676034638, + -5.53757317078851e-05,0.00580535005715377,0.313527845838314,-0.600037883755067, + -5.78325805538071e-05,0.00645478393267185,0.329325732816399,-0.632159091475495, + -6.02894293996181e-05,0.00710421780819015,0.345123619794485,-0.664280299195923, + -6.27462782459842e-05,0.00775365168370667,0.36092150677257,-0.696401506916351, + -6.52031270920173e-05,0.00840308555922498,0.376719393750656,-0.72852271463678, + -6.76599759376062e-05,0.00905251943474328,0.392517280728742,-0.760643922357208, + -8.3976552870263e-06,-0.00652606653885501,0.0134242963979835,0.0102825726841942, + -1.0671874045888e-05,-0.00589176903631011,0.029049889087214,-0.0219531158559996, + -1.29460928047914e-05,-0.0052574715337653,0.0446754817764445,-0.0541888043961935, + -1.52203115635907e-05,-0.00462317403122031,0.060301074465675,-0.0864244929363873, + -1.74945303223761e-05,-0.0039888765286753,0.0759266671549055,-0.118660181476581, + -1.97687490813003e-05,-0.00335457902613046,0.091552259844136,-0.150895870016775, + -2.2042967840058e-05,-0.0027202815235855,0.107177852533366,-0.183131558556969, + -2.43171865989544e-05,-0.00208598402104065,0.122803445222597,-0.215367247097163, + -2.65914053579897e-05,-0.00145168651849592,0.138429037911827,-0.247602935637357, + -2.88656241165808e-05,-0.000817389015950853,0.154054630601058,-0.27983862417755, + -3.11398428753384e-05,-0.000183091513405786,0.169680223290288,-0.312074312717744, + -3.34140616344847e-05,0.000451205989138836,0.185305815979519,-0.344310001257938, + -3.56882803931313e-05,0.00108550349168413,0.200931408668749,-0.376545689798132, + -3.7962499152e-05,0.00171980099422875,0.21655700135798,-0.408781378338326, + -4.02367179110907e-05,0.00235409849677359,0.23218259404721,-0.44101706687852, + -4.25109366696264e-05,0.00298839599931844,0.24780818673644,-0.473252755418713, + -4.47851554288281e-05,0.00362269350186306,0.263433779425671,-0.505488443958907, + -4.70593741874747e-05,0.00425699100440813,0.279059372114901,-0.537724132499101, + -4.93335929462324e-05,0.00489128850695342,0.294684964804132,-0.569959821039295, + -5.16078117052121e-05,0.00552558600949804,0.310310557493362,-0.602195509579489, + -5.38820304641918e-05,0.00615988351204289,0.325936150182593,-0.634431198119683, + -5.61562492230605e-05,0.00679418101458751,0.341561742871823,-0.666666886659877, + -5.84304679815961e-05,0.00742847851713302,0.357187335561054,-0.69890257520007, + -6.07046867409089e-05,0.00806277601967764,0.372812928250285,-0.731138263740264, + -6.29789054994445e-05,0.00869707352222271,0.388438520939515,-0.763373952280458, + -8.01288922574507e-06,-0.00651605811818941,0.0134955599712367,0.0103046842885544, + -1.00647415169075e-05,-0.00590156051043475,0.0289025106675619,-0.0220755725310754, + -1.21165938081064e-05,-0.00528706290268011,0.0443094613638871,-0.0544558293507052, + -1.41684460992636e-05,-0.00467256529492538,0.0597164120602123,-0.0868360861703351, + -1.62202983903792e-05,-0.00405806768717071,0.0751233627565375,-0.119216342989965, + -1.82721506816752e-05,-0.0034435700794162,0.0905303134528626,-0.151596599809595, + -2.03240029728324e-05,-0.00282907247166142,0.105937264149188,-0.183976856629224, + -2.23758552639897e-05,-0.00221457486390686,0.121344214845513,-0.216357113448854, + -2.44277075554522e-05,-0.00160007725615263,0.136751165541838,-0.248737370268484, + -2.64795598463041e-05,-0.000985579648397295,0.152158116238164,-0.281117627088114, + -2.85314121376001e-05,-0.000371082040642845,0.167565066934489,-0.313497883907744, + -3.05832644285076e-05,0.000243415567112271,0.182972017630814,-0.345878140727373, + -3.26351167200811e-05,0.000857913174866054,0.198378968327139,-0.378258397547003, + -3.46869690107665e-05,0.00147241078262139,0.213785919023464,-0.410638654366633, + -3.67388213020625e-05,0.00208690839037606,0.22919286971979,-0.443018911186263, + -3.87906735930255e-05,0.00270140599813096,0.244599820416115,-0.475399168005893, + -4.08425258842104e-05,0.00331590360588563,0.26000677111244,-0.507779424825523, + -4.28943781759505e-05,0.00393040121363963,0.275413721808765,-0.540159681645152, + -4.49462304674686e-05,0.00454489882139342,0.29082067250509,-0.572539938464782, + -4.69980827583205e-05,0.00515939642914853,0.306227623201415,-0.604920195284412, + -4.90499350497275e-05,0.0057738940369032,0.321634573897741,-0.637300452104042, + -5.11017873406905e-05,0.00638839164465788,0.337041524594066,-0.669680708923672, + -5.31536396312093e-05,0.00700288925241388,0.352448475290392,-0.702060965743301, + -5.52054919231715e-05,0.00761738686016722,0.367855425986716,-0.734441222562931, + -5.72573442142454e-05,0.00823188446792233,0.383262376683042,-0.766821479382561, + -7.52930152583819e-06,-0.00650363431344411,0.013582925522093,0.0103317153026516, + -9.32223570344892e-06,-0.00591438229124575,0.0287209743777398,-0.0222252734779792, + -1.11151698810596e-05,-0.00532513026904735,0.0438590232333866,-0.0547822622586099, + -1.29081040586843e-05,-0.00473587824684896,0.0589970720890334,-0.0873392510392406, + -1.47010382363366e-05,-0.00414662622465067,0.0741351209446801,-0.119896239819871, + -1.6493972413878e-05,-0.00355737420245217,0.089273169800327,-0.152453228600502, + -1.82869065915581e-05,-0.002968122180254,0.104411218655974,-0.185010217381133, + -2.00798407690717e-05,-0.00237887015805549,0.11954926751162,-0.217567206161764, + -2.18727749466407e-05,-0.00178961813585721,0.134687316367267,-0.250124194942394, + -2.36657091243209e-05,-0.0012003661136587,0.149825365222914,-0.282681183723025, + -2.54586433019455e-05,-0.000611114091460196,0.164963414078561,-0.315238172503656, + -2.72515774794035e-05,-2.18620692618021e-05,0.180101462934208,-0.347795161284287, + -2.90445116573057e-05,0.000567389952936148,0.195239511789854,-0.380352150064917, + -3.08374458347638e-05,0.00115664197513499,0.210377560645501,-0.412909138845548, + -3.26303800124439e-05,0.00174589399733294,0.225515609501148,-0.445466127626179, + -3.44233141897909e-05,0.00233514601953178,0.240653658356795,-0.478023116406809, + -3.62162483674711e-05,0.00292439804172973,0.255791707212441,-0.51058010518744, + -3.80091825449291e-05,0.00351365006392879,0.270929756068088,-0.543137093968071, + -3.98021167228313e-05,0.00410290208612651,0.286067804923735,-0.575694082748702, + -4.15950509007335e-05,0.00469215410832424,0.301205853779381,-0.608251071529333, + -4.33879850779695e-05,0.00528140613052308,0.316343902635028,-0.640808060309963, + -4.51809192555386e-05,0.00587065815272148,0.331481951490675,-0.673365049090594, + -4.69738534332187e-05,0.00645991017492031,0.346620000346322,-0.705922037871225, + -4.87667876102327e-05,0.0070491621971196,0.361758049201969,-0.738479026651855, + -5.05597217874687e-05,0.00763841421931799,0.376896098057616,-0.771036015432486, + -6.94191090454613e-06,-0.00648876962972663,0.0136859348298208,0.0103634789907996, + -8.44945441232786e-06,-0.00593064844059443,0.0285057295183049,-0.0224011845324374, + -9.95699792012694e-06,-0.00537252725146228,0.0433255242067889,-0.0551658480556743, + -1.14645414278775e-05,-0.00481440606233002,0.058145318895273,-0.0879305115789112, + -1.29720849357529e-05,-0.0042562848731979,0.072965113583757,-0.120695175102148, + -1.44796284435034e-05,-0.00369816368406561,0.0877849082722411,-0.153459838625385, + -1.59871719514204e-05,-0.00314004249493371,0.102604702960725,-0.186224502148622, + -1.74947154590321e-05,-0.00258192130580115,0.117424497649209,-0.218989165671859, + -1.90022589668382e-05,-0.00202380011666892,0.132244292337693,-0.251753829195096, + -2.05098024746442e-05,-0.00146567892753702,0.147064087026177,-0.284518492718333, + -2.20173459823392e-05,-0.000907557738404785,0.161883881714661,-0.31728315624157, + -2.35248894902007e-05,-0.00034943654927222,0.176703676403146,-0.350047819764807, + -2.50324329980067e-05,0.00020868463985968,0.191523471091629,-0.382812483288044, + -2.65399765057572e-05,0.000766805828992023,0.206343265780114,-0.41557714681128, + -2.80475200135077e-05,0.00132492701812392,0.221163060468597,-0.448341810334518, + -2.95550635217579e-05,0.00188304820725582,0.235982855157082,-0.481106473857754, + -3.10626070293418e-05,0.00244116939638794,0.250802649845565,-0.513871137380991, + -3.25701505368148e-05,0.00299929058552095,0.26562244453405,-0.546635800904228, + -3.40776940450649e-05,0.00355741177465219,0.280442239222533,-0.579400464427465, + -3.55852375527599e-05,0.00411553296378475,0.295262033911018,-0.612165127950702, + -3.70927810602328e-05,0.00467365415291665,0.310081828599501,-0.644929791473939, + -3.86003245683719e-05,0.00523177534204899,0.324901623287986,-0.677694454997176, + -4.01078680751787e-05,0.00578989653118223,0.33972141797647,-0.710459118520413, + -4.16154115836509e-05,0.00634801772031368,0.354541212664954,-0.74322378204365, + -4.31229550911238e-05,0.00690613890944647,0.369361007353438,-0.775988445566887, + -6.25744233416145e-06,-0.00647175054085835,0.0138019486649254,0.0103991149008061, + -7.47014513666905e-06,-0.00595044294930479,0.0282617694880461,-0.0225985404086382, + -8.68284793918705e-06,-0.00542913535775125,0.0427215903111668,-0.0555961957180824, + -9.89555074168424e-06,-0.00490782776619769,0.0571814111342875,-0.0885938510275267, + -1.11082535440843e-05,-0.00438652017464386,0.0716412319574083,-0.121591506336971, + -1.23209563467896e-05,-0.00386521258309058,0.0861010527805289,-0.154589161646415, + -1.35336591492452e-05,-0.00334390499153692,0.10056087360365,-0.187586816955859, + -1.47463619518118e-05,-0.00282259739998358,0.11502069442677,-0.220584472265304, + -1.59590647544339e-05,-0.00230128980843014,0.129480515249891,-0.253582127574748, + -1.71717675567229e-05,-0.00177998221687636,0.143940336073011,-0.286579782884192, + -1.8384470359234e-05,-0.0012586746253227,0.158400156896132,-0.319577438193636, + -1.95971731619116e-05,-0.000737367033769365,0.172859977719253,-0.352575093503081, + -2.08098759644781e-05,-0.00021605944221581,0.187319798542374,-0.385572748812525, + -2.20225787666006e-05,0.000305248149338189,0.201779619365494,-0.418570404121969, + -2.32352815692227e-05,0.000826555740891521,0.216239440188615,-0.451568059431413, + -2.44479843719558e-05,0.00134786333244508,0.230699261011736,-0.484565714740858, + -2.56606871742449e-05,0.00186917092399863,0.245159081834856,-0.517563370050302, + -2.68733899767559e-05,0.00239047851555263,0.259618902657977,-0.550561025359746, + -2.8086092779267e-05,0.00291178610710552,0.274078723481097,-0.58355868066919, + -2.92987955821111e-05,0.00343309369865907,0.288538544304218,-0.616556335978635, + -3.05114983847332e-05,0.00395440129021241,0.302998365127339,-0.649553991288079, + -3.17242011863561e-05,0.00447570888176729,0.31745818595046,-0.682551646597523, + -3.29369039892002e-05,0.00499701647331996,0.33191800677358,-0.715549301906967, + -3.41496067919334e-05,0.00551832406487396,0.346377827596702,-0.748546957216412, + -3.53623095941114e-05,0.00603963165642796,0.360837648419822,-0.781544612525856, + -5.49750577741662e-06,-0.00645322180163136,0.0139260535767921,0.0104370764441712, + -6.42707927860781e-06,-0.00597333040810041,0.0279990091067501,-0.0228087759169046, + -7.35665277980246e-06,-0.00549343901456942,0.0420719646367081,-0.0560546282779804, + -8.28622628097631e-06,-0.00501354762103851,0.0561449201666661,-0.0893004806390561, + -9.21579978216402e-06,-0.00453365622750751,0.0702178756966241,-0.122546333000132, + -1.01453732834489e-05,-0.00405376483397657,0.0842908312265822,-0.155792185361208, + -1.10749467846227e-05,-0.00357387344044569,0.0983637867565402,-0.189038037722283, + -1.20045202858798e-05,-0.00309398204691469,0.112436742286498,-0.222283890083359, + -1.29340937870537e-05,-0.0026140906533838,0.126509697816456,-0.255529742444435, + -1.3863667288283e-05,-0.0021341992598527,0.140582653346414,-0.288775594805511, + -1.47932407890683e-05,-0.00165430786632137,0.154655608876372,-0.322021447166586, + -1.57228142906307e-05,-0.00117441647279093,0.16872856440633,-0.355267299527662, + -1.66523877918601e-05,-0.000694525079260044,0.182801519936288,-0.388513151888738, + -1.75819612930894e-05,-0.000214633685728938,0.196874475466246,-0.421759004249814, + -1.85115347942633e-05,0.000265257707802169,0.210947430996204,-0.455004856610889, + -1.94411082952151e-05,0.000745149101333054,0.225020386526162,-0.488250708971965, + -2.0370681796722e-05,0.00122504049486372,0.23909334205612,-0.521496561333041, + -2.13002552978958e-05,0.00170493188839482,0.253166297586078,-0.554742413694117, + -2.22298287995137e-05,0.00218482328192504,0.267239253116036,-0.587988266055192, + -2.31594023003545e-05,0.00266471467545659,0.281312208645994,-0.621234118416268, + -2.40889758015284e-05,0.0031446060689877,0.295385164175952,-0.654479970777344, + -2.50185493027022e-05,0.00362449746251858,0.30945811970591,-0.68772582313842, + -2.59481228042091e-05,0.00410438885604991,0.323531075235869,-0.720971675499495, + -2.68776963047168e-05,0.0045842802495808,0.337604030765826,-0.754217527860571, + -2.78072698055576e-05,0.00506417164311257,0.351676986295785,-0.787463380221647, + -4.69784619103707e-06,-0.0064341244487738,0.0140517132106779,0.0104753474836021, + -5.37602596115128e-06,-0.00599828914833316,0.0277310997761066,-0.0230207254509178, + -6.05420573124293e-06,-0.00556245384789256,0.0414104863415353,-0.0565167983854377, + -6.73238550133459e-06,-0.00512661854745189,0.055089872906964,-0.0900128713199576, + -7.41056527139849e-06,-0.00469078324701117,0.0687692594723927,-0.123508944254477, + -8.08874504160118e-06,-0.00425494794657066,0.0824486460378213,-0.157005017188997, + -8.76692481163732e-06,-0.00381911264613,0.09612803260325,-0.190501090123517, + -9.44510458161796e-06,-0.00338327734568933,0.109807419168679,-0.223997163058037, + -1.01232843517374e-05,-0.00294744204524844,0.123486805734108,-0.257493235992557, + -1.08014641220233e-05,-0.0025116067448081,0.137166192299536,-0.290989308927077, + -1.14796438921427e-05,-0.00207577144436755,0.150845578864965,-0.324485381861597, + -1.21578236620956e-05,-0.00163993614392677,0.164524965430393,-0.357981454796117, + -1.28360034322705e-05,-0.00120410084348621,0.178204351995822,-0.391477527730637, + -1.35141832023344e-05,-0.000768265543045654,0.191883738561251,-0.424973600665156, + -1.41923629719543e-05,-0.000332430242603987,0.20556312512668,-0.458469673599677, + -1.48705427427398e-05,0.000103405057835682,0.219242511692108,-0.491965746534196, + -1.55487225127482e-05,0.000539240358276238,0.232921898257537,-0.525461819468717, + -1.62269022826456e-05,0.000975075658717017,0.246601284822966,-0.558957892403236, + -1.6905082053098e-05,0.00141091095915735,0.260280671388394,-0.592453965337756, + -1.75832618231064e-05,0.00184674625959835,0.273960057953823,-0.625950038272276, + -1.82614415930038e-05,0.00228258156003891,0.287639444519251,-0.659446111206796, + -1.89396213633453e-05,0.00271841686047924,0.30131883108468,-0.692942184141316, + -1.96178011332426e-05,0.00315425216092047,0.314998217650109,-0.726438257075836, + -2.0295980903362e-05,0.0035900874613608,0.328677604215537,-0.759934330010356, + -2.09741606734815e-05,0.00402592276180158,0.342356990780966,-0.793430402944876, + -3.90250082043207e-06,-0.00641552001996264,0.0141720613176397,0.01051184617282, + -4.37448407007712e-06,-0.0060238585272803,0.0274727850268507,-0.0232228595002366, + -4.8464673197135e-06,-0.00563219703459794,0.0407735087360618,-0.0569575651732933, + -5.318450569336e-06,-0.00524053554191556,0.0540742324452729,-0.0906922708463499, + -5.79043381904176e-06,-0.00484887404923323,0.067374956154484,-0.124426976519407, + -6.26241706871977e-06,-0.00445721255655085,0.0806756798636952,-0.158161682192463, + -6.73440031839778e-06,-0.00406555106386863,0.0939764035729062,-0.19189638786552, + -7.20638356799252e-06,-0.00367388957118608,0.107277127282117,-0.225631093538576, + -7.67836681758727e-06,-0.00328222807850376,0.120577850991328,-0.259365799211633, + -8.1503500671265e-06,-0.00289056658582132,0.13387857470054,-0.29310050488469, + -8.62233331710982e-06,-0.00249890509313921,0.147179298409751,-0.326835210557746, + -9.09431656642701e-06,-0.00210724360045633,0.160480022118962,-0.360569916230803, + -9.56629981629931e-06,-0.00171558210777478,0.173780745828172,-0.39430462190386, + -1.00382830660051e-05,-0.00132392061509212,0.187081469537384,-0.428039327576916, + -1.05102663158219e-05,-0.00093225912241035,0.200382193246595,-0.461774033249973, + -1.09822495653056e-05,-0.00054059762972769,0.213682916955806,-0.495508738923029, + -1.14542328149003e-05,-0.000148936137044808,0.226983640665017,-0.529243444596086, + -1.19262160646061e-05,0.000242725355637186,0.240284364374228,-0.562978150269143, + -1.23981993140898e-05,0.000634386848319846,0.253585088083439,-0.596712855942199, + -1.28701825636846e-05,0.00102604834100251,0.266885811792651,-0.630447561615256, + -1.33421658133903e-05,0.00141770983368428,0.280186535501861,-0.664182267288313, + -1.38141490630961e-05,0.00180937132636672,0.293487259211072,-0.697916972961369, + -1.42861323125798e-05,0.00220103281904915,0.306787982920284,-0.731651678634426, + -1.47581155621745e-05,0.00259269431173204,0.320088706629495,-0.765386384307482, + -1.52300988118803e-05,0.00298435580441403,0.333389430338706,-0.799121089980539, + -3.15450593771707e-06,-0.00639836367314161,0.0142813348790851,0.0105448567245102, + -3.46966136174215e-06,-0.00604847237755808,0.0272367924321802,-0.0234056758321753, + -3.78481678578457e-06,-0.00569858108197457,0.0401922499852753,-0.0573562083888607, + -4.09997220975067e-06,-0.00534868978639097,0.0531477075383705,-0.0913067409455462, + -4.41512763380003e-06,-0.00499879849080748,0.0661031650914656,-0.125257273502232, + -4.73028305778e-06,-0.00464890719522393,0.0790586226445607,-0.159207806058917, + -5.04543848189876e-06,-0.00429901589964066,0.0920140801976557,-0.193158338615603, + -5.36059390598975e-06,-0.00394912460405705,0.104969537750751,-0.227108871172288, + -5.6757493298587e-06,-0.00359923330847345,0.117924995303846,-0.261059403728973, + -5.99090475406072e-06,-0.00324934201289007,0.130880452856941,-0.295009936285659, + -6.30606017787416e-06,-0.00289945071730635,0.143835910410036,-0.328960468842344, + -6.62121560207618e-06,-0.00254955942172308,0.156791367963131,-0.36291100139903, + -6.93637102644473e-06,-0.00219966812614003,0.169746825516226,-0.396861533955715, + -7.25152645009164e-06,-0.00184977683055632,0.182702283069321,-0.430812066512401, + -7.56668187429366e-06,-0.0014998855349726,0.195657740622417,-0.464762599069086, + -7.8818372976075e-06,-0.00114999423938844,0.208613198175512,-0.498713131625771, + -8.19699272203156e-06,-0.000800102943805614,0.221568655728607,-0.532663664182457, + -8.51214814623358e-06,-0.000450211648221899,0.234524113281702,-0.566614196739142, + -8.82730357021355e-06,-0.000100320352638184,0.247479570834797,-0.600564729295828, + -9.14245899419353e-06,0.00024957094294531,0.260435028387892,-0.634515261852513, + -9.45761441828452e-06,0.000599462238529025,0.273390485940988,-0.668465794409199, + -9.77276984193143e-06,0.000949353534112074,0.286345943494082,-0.702416326965884, + -1.00879252662445e-05,0.00129924482969601,0.299301401047178,-0.736366859522569, + -1.04030806905575e-05,0.00164913612527906,0.312256858600273,-0.770317392079255, + -1.07182361138713e-05,0.00199902742086389,0.325212316153368,-0.80426792463594, + -2.48707302702086e-06,-0.00638332336523917,0.0143758510640176,0.010573310890299, + -2.6907122829406e-06,-0.00607082502746692,0.0270315710667872,-0.0235632583611409, + -2.89435153885687e-06,-0.00575832668969467,0.0396872910695568,-0.0576998276125807, + -3.09799079484252e-06,-0.00544582835192253,0.0523430110723264,-0.0918363968640206, + -3.30163005066164e-06,-0.00513333001415006,0.0649987310750962,-0.12597296611546, + -3.50526930659179e-06,-0.00482083167637792,0.0776544510778657,-0.1601095353669, + -3.70890856268846e-06,-0.00450833333860579,0.0903101710806353,-0.19424610461834, + -3.91254781845207e-06,-0.00419583500083331,0.102965891083405,-0.22838267386978, + -4.11618707457651e-06,-0.00388333666306151,0.115621611086174,-0.26251924312122, + -4.31982633031236e-06,-0.00357083832528893,0.128277331088944,-0.29665581237266, + -4.52346558621475e-06,-0.00325833998751657,0.140933051091714,-0.330792381624099, + -4.72710484206162e-06,-0.00294584164974432,0.153588771094483,-0.364928950875539, + -4.93074409807503e-06,-0.00263334331197229,0.166244491097253,-0.399065520126979, + -5.13438335397742e-06,-0.00232084497420004,0.178900211100022,-0.433202089378419, + -5.33802260993532e-06,-0.00200834663642757,0.191555931102792,-0.467338658629859, + -5.54166186605975e-06,-0.00169584829865554,0.204211651105562,-0.501475227881299, + -5.74530112196214e-06,-0.0013833499608833,0.216867371108332,-0.535611797132738, + -5.94894037775351e-06,-0.00107085162311127,0.229523091111101,-0.569748366384178, + -6.15257963398896e-06,-0.00075835328533902,0.242178811113871,-0.603884935635618, + -6.3562188901134e-06,-0.000445854947567215,0.25483453111664,-0.638021504887058, + -6.55985814479454e-06,-0.000133356609793189,0.26749025111941,-0.672158074138498, + -6.76349740114102e-06,0.000179141727978838,0.28014597112218,-0.706294643389937, + -6.96713665748749e-06,0.000491640065749976,0.292801691124949,-0.740431212641378, + -7.17077591305681e-06,0.000804138403522892,0.305457411127719,-0.774567781892817, + -7.37441516918125e-06,0.00111663674129536,0.318113131130489,-0.808704351144257, + -1.91880374737774e-06,-0.00637071049791407,0.0144542306593313,0.010596838608799, + -2.04745307910009e-06,-0.00609010333634319,0.0268606205517252,-0.0236935576434862, + -2.17610241076693e-06,-0.00580949617477219,0.039267010444119,-0.0579839538957713, + -2.30475174253786e-06,-0.00552888901320142,0.0516734003365128,-0.0922743501480565, + -2.43340107419776e-06,-0.00524828185163051,0.0640797902289066,-0.126564746400342, + -2.56205040591317e-06,-0.00496767469005954,0.0764861801213005,-0.160855142652627, + -2.69069973776737e-06,-0.00468706752848891,0.0888925700136942,-0.195145538904912, + -2.81934906937176e-06,-0.00440646036691783,0.101298959906088,-0.229435935157197, + -2.94799840105942e-06,-0.00412585320534686,0.113705349798482,-0.263726331409482, + -3.07664773291361e-06,-0.00384524604377612,0.126111739690876,-0.298016727661768, + -3.20529706449024e-06,-0.00356463888220526,0.138518129583269,-0.332307123914053, + -3.33394639612239e-06,-0.00328403172063418,0.150924519475663,-0.366597520166338, + -3.46259572781005e-06,-0.00300342455906311,0.163330909368057,-0.400887916418623, + -3.59124505938668e-06,-0.00272281739749203,0.175737299260451,-0.435178312670908, + -3.71989439118536e-06,-0.00244221023592117,0.188143689152845,-0.469468708923193, + -3.84854372315058e-06,-0.00216160307435098,0.200550079045239,-0.503759105175478, + -3.9771930546717e-06,-0.00188099591277968,0.212956468937633,-0.538049501427764, + -4.10584238630385e-06,-0.0016003887512086,0.225362858830026,-0.572339897680049, + -4.23449171838008e-06,-0.00131978158963819,0.23776924872242,-0.606630293932334, + -4.36314105001223e-06,-0.00103917442806711,0.250175638614814,-0.640920690184619, + -4.49179038197745e-06,-0.000758567266496257,0.262582028507208,-0.675211086436904, + -4.62043971394266e-06,-0.000477960104926289,0.274988418399601,-0.70950148268919, + -4.74908904568583e-06,-0.000197352943354989,0.287394808291995,-0.743791878941474, + -4.8777383764298e-06,8.32542182171991e-05,0.29980119818439,-0.778082275193759, + -5.00638770906114e-06,0.000363861379786723,0.312207588076783,-0.812372671446045, + -1.45389860190144e-06,-0.00636052006542933,0.0145169897682612,0.0106156329919655, + -1.5342204134558e-06,-0.00610602135183713,0.0267232423360384,-0.0237976431560157, + -1.61454222499802e-06,-0.00585152263824487,0.0389294949038155,-0.0582109193039968, + -1.69486403653329e-06,-0.00559702392465261,0.0511357474715926,-0.092624195451978, + -1.77518584815184e-06,-0.00534252521106054,0.0633420000393697,-0.127037471599959, + -1.85550765968712e-06,-0.0050880264974682,0.0755482526071469,-0.16145074774794, + -1.93582947105586e-06,-0.00483352778387569,0.0877545051749241,-0.195864023895922, + -2.01615128270216e-06,-0.00457902907028362,0.0999607577427012,-0.230277300043903, + -2.09647309451499e-06,-0.00432453035669189,0.112167010310478,-0.264690576191884, + -2.17679490566169e-06,-0.00407003164309883,0.124373262878256,-0.299103852339865, + -2.25711671741902e-06,-0.00381553292950687,0.136579515446033,-0.333517128487846, + -2.33743852889878e-06,-0.00356103421591469,0.14878576801381,-0.367930404635827, + -2.41776034054508e-06,-0.00330653550232296,0.160992020581586,-0.402343680783809, + -2.49808215185832e-06,-0.00305203678873034,0.173198273149364,-0.43675695693179, + -2.57840396378217e-06,-0.00279753807513861,0.185404525717141,-0.471170233079771, + -2.65872577520643e-06,-0.00254303936154598,0.197610778284918,-0.505583509227752, + -2.73904758663068e-06,-0.00228854064795381,0.209817030852695,-0.539996785375733, + -2.81936939827698e-06,-0.00203404193436163,0.222023283420472,-0.574410061523714, + -2.89969120970124e-06,-0.00177954322076901,0.23422953598825,-0.608823337671696, + -2.98001302112549e-06,-0.00152504450717683,0.246435788556027,-0.643236613819677, + -3.06033483299384e-06,-0.00127054579358532,0.258642041123804,-0.677649889967658, + -3.14065664452912e-06,-0.00101604707999314,0.27084829369158,-0.712063166115639, + -3.22097845628644e-06,-0.000761548366400522,0.283054546259358,-0.74647644226362, + -3.30130026793274e-06,-0.000507049652809233,0.295260798827135,-0.780889718411602, + -3.38162207935699e-06,-0.000252550939216167,0.307467051394912,-0.815302994559583, + -1.08578119911891e-06,-0.00635253118688859,0.0145658460555481,0.0106302367361743, + -1.13584146603507e-06,-0.00611870810443864,0.0266159930967423,-0.0238785204153202, + -1.18590173298072e-06,-0.00588488502198872,0.0386661401379365,-0.0583872775668148, + -1.235961999968e-06,-0.00565106193953885,0.0507162871791307,-0.0928960347183094, + -1.28602226689978e-06,-0.00541723885708889,0.0627664342203249,-0.127404791869804, + -1.33608253385931e-06,-0.00518341577463888,0.0748165812615192,-0.161913549021298, + -1.38614280068006e-06,-0.00494959269218886,0.0868667283027134,-0.196422306172793, + -1.43620306752856e-06,-0.00471576960973885,0.0989168753439076,-0.230931063324288, + -1.48626333462687e-06,-0.00448194652728928,0.110967022385102,-0.265439820475782, + -1.53632360161415e-06,-0.00424812344483938,0.123017169426296,-0.299948577627277, + -1.58638386832388e-06,-0.00401430036238914,0.13506731646749,-0.334457334778771, + -1.63644413542219e-06,-0.00378047727993924,0.147117463508684,-0.368966091930266, + -1.68650440246498e-06,-0.00354665419748956,0.159167610549878,-0.40347484908176, + -1.73656466923022e-06,-0.00331283111503944,0.171217757591073,-0.437983606233255, + -1.78662493610648e-06,-0.00307900803258931,0.183267904632267,-0.472492363384749, + -1.83668520314928e-06,-0.00284518495013963,0.195318051673461,-0.507001120536244, + -1.88674546974799e-06,-0.00261136186768929,0.207368198714655,-0.541509877687739, + -1.93680573701283e-06,-0.00237753878523961,0.21941834575585,-0.576018634839233, + -1.98686600383358e-06,-0.00214371570278971,0.231468492797044,-0.610527391990728, + -2.03692627120944e-06,-0.00190989262034003,0.243518639838238,-0.645036149142222, + -2.08698653780814e-06,-0.0016760695378899,0.255568786879432,-0.679544906293717, + -2.13704680429583e-06,-0.00144224645543956,0.267618933920626,-0.714053663445211, + -2.18710707189373e-06,-0.00120842337299054,0.27966908096182,-0.748562420596706, + -2.23716733871449e-06,-0.000974600290540639,0.291719228003014,-0.783071177748201, + -2.28722760542421e-06,-0.000740777208089849,0.303769375044209,-0.817579934899695, + -8.01749084474931e-07,-0.00634641460551702,0.0146030522148104,0.0106413422327158, + -8.33154617373155e-07,-0.0061285421207572,0.026534140588,-0.0239400239660976, + -8.64560150290461e-07,-0.0059106696359974,0.0384652289611896,-0.058521390164911, + -8.95965683117561e-07,-0.00569279715123744,0.0503963173343792,-0.0931027563637243, + -9.27371216069561e-07,-0.00547492466647775,0.0623274057075687,-0.127684122562538, + -9.58776749049317e-07,-0.00525705218171801,0.0742584940807582,-0.162265488761351, + -9.90182281696006e-07,-0.00503917969695777,0.086189582453948,-0.196846854960164, + -1.02158781478678e-06,-0.00482130721219831,0.0981206708271374,-0.231428221158978, + -1.05299334757225e-06,-0.00460343472743818,0.110051759200327,-0.266009587357791, + -1.08439888063527e-06,-0.00438556224267872,0.121982847573517,-0.300590953556605, + -1.11580441347625e-06,-0.00416768975791881,0.133913935946706,-0.335172319755418, + -1.14720994603967e-06,-0.00394981727315846,0.145845024319896,-0.369753685954231, + -1.1786154791027e-06,-0.00373194478839878,0.157776112693085,-0.404335052153045, + -1.21002101216572e-06,-0.00351407230363954,0.169707201066275,-0.438916418351858, + -1.24142654478465e-06,-0.00329619981887919,0.181638289439465,-0.473497784550671, + -1.2728320779587e-06,-0.00307832733411972,0.193569377812654,-0.508079150749485, + -1.3042376109107e-06,-0.00286045484935982,0.205500466185844,-0.542660516948298, + -1.33564314341861e-06,-0.00264258236459969,0.217431554559033,-0.577241883147111, + -1.36704867637061e-06,-0.00242470987983978,0.229362642932223,-0.611823249345925, + -1.39845420954465e-06,-0.00220683739508032,0.241293731305412,-0.646404615544738, + -1.42985974205256e-06,-0.00198896491031997,0.253224819678602,-0.680985981743551, + -1.46126527522661e-06,-0.00177109242556028,0.265155908051792,-0.715567347942365, + -1.49267080773452e-06,-0.00155321994080015,0.277086996424981,-0.750148714141178, + -1.52407634146368e-06,-0.00133534745604136,0.289018084798171,-0.784730080339991, + -1.5554818745267e-06,-0.00111747497128167,0.30094917317136,-0.819311446538805, + -5.86931568026181e-07,-0.00634181563994453,0.0146309146236483,0.0106496497979511, + -6.06883570793137e-07,-0.00613600384126378,0.0264727438866888,-0.0239860322430245, + -6.2683557355836e-07,-0.00593019204258308,0.0383145731497292,-0.0586217142840001, + -6.46787576316643e-07,-0.00572438024390237,0.0501564024127696,-0.0932573963249758, + -6.66739579130438e-07,-0.00551856844522158,0.0619982316758101,-0.127893078365951, + -6.86691581791576e-07,-0.00531275664654074,0.0738400609388505,-0.162528760406927, + -7.06643584563738e-07,-0.00510694484786001,0.085681890201891,-0.197164442447903, + -7.26595587474677e-07,-0.00490113304917938,0.0975237194649314,-0.231800124488878, + -7.46547590246838e-07,-0.00469532125049865,0.109365548727972,-0.266435806529854, + -7.66499592796954e-07,-0.0044895094518177,0.121207377991012,-0.301071488570829, + -7.86451595680138e-07,-0.00428369765313708,0.133049207254053,-0.335707170611805, + -8.06403598618832e-07,-0.00407788585445656,0.144891036517093,-0.370342852652781, + -8.26355601335482e-07,-0.00387207405577561,0.156732865780134,-0.404978534693756, + -8.46307603830088e-07,-0.00366626225709465,0.168574695043174,-0.439614216734732, + -8.66259606935316e-07,-0.00346045045841414,0.180416524306215,-0.474249898775708, + -8.86211609540943e-07,-0.00325463865973341,0.192258353569255,-0.508885580816683, + -9.06163611924526e-07,-0.00304882686105201,0.204100182832296,-0.543521262857659, + -9.2611561530731e-07,-0.00284301506237239,0.215942012095335,-0.578156944898634, + -9.46067617912938e-07,-0.00263720326369166,0.227783841358376,-0.61279262693961, + -9.66019620407543e-07,-0.00243139146501004,0.239625670621417,-0.647428308980586, + -9.85971624234416e-07,-0.00222557966633108,0.251467499884457,-0.682063991021561, + -1.00592362628493e-06,-0.00201976786764924,0.263309329147497,-0.716699673062537, + -1.02587562866852e-06,-0.00181395606896784,0.275151158410538,-0.751335355103513, + -1.04582763171823e-06,-0.00160814427028777,0.286992987673578,-0.785971037144488, + -1.06577963476795e-06,-0.00140233247160682,0.298834816936619,-0.820606719185464, + -4.26900618001602e-07,-0.00633840459239337,0.0146515186331716,0.0106557882501934, + -4.39781620190094e-07,-0.00614157522153411,0.0264272865338625,-0.0240200277161461, + -4.52662622371647e-07,-0.00594474585067487,0.0382030544345534,-0.0586958436824856, + -4.65543624594833e-07,-0.00574791647981565,0.0499788223352442,-0.093371659648825, + -4.78424626804141e-07,-0.00555108710895635,0.0617545902359352,-0.128047475615164, + -4.9130562901345e-07,-0.00535425773809706,0.0735303581366261,-0.162723291581504, + -5.04186631056225e-07,-0.00515742836723765,0.085306126037317,-0.197399107547843, + -5.17067633265533e-07,-0.00496059899637835,0.0970818939380079,-0.232074923514183, + -5.29948635419331e-07,-0.00476376962551905,0.108857661838699,-0.266750739480522, + -5.4282963768415e-07,-0.00456694025466009,0.12063342973939,-0.301426555446862, + -5.55710639671414e-07,-0.00437011088380057,0.13240919764008,-0.336102371413201, + -5.68591641880722e-07,-0.00417328151294116,0.144184965540771,-0.370778187379541, + -5.81472643867986e-07,-0.00397645214208131,0.155960733441463,-0.40545400334588, + -5.94353646410362e-07,-0.00377962277122301,0.167736501342153,-0.44012981931222, + -6.07234648897226e-07,-0.00358279340036405,0.179512269242844,-0.474805635278559, + -6.20115650717956e-07,-0.0033859640295042,0.191288037143535,-0.509481451244898, + -6.32996653093798e-07,-0.00318913465864501,0.203063805044226,-0.544157267211238, + -6.45877655136573e-07,-0.00299230528778582,0.214839572944917,-0.578833083177577, + -6.58758658067526e-07,-0.0027954759169273,0.226615340845607,-0.613508899143917, + -6.7163965955519e-07,-0.00259864654606745,0.238391108746298,-0.648184715110256, + -6.84520662264099e-07,-0.00240181717520871,0.250166876646989,-0.682860531076596, + -6.97401664084829e-07,-0.00220498780434886,0.26194264454768,-0.717536347042935, + -7.10282666016582e-07,-0.00200815843348945,0.273718412448371,-0.752212163009275, + -7.23163668614468e-07,-0.00181132906263048,0.285494180349062,-0.786887978975615, + -7.36044670879288e-07,-0.00161449969177152,0.297269948249753,-0.821563794941954, + -3.09019888160983e-07,-0.00633590010679615,0.0146666136241614,0.0106602827778752, + -3.17480487545263e-07,-0.0061456857691984,0.0263939537572725,-0.0240449189409974, + -3.25941086926074e-07,-0.00595547143160066,0.0381212938903837,-0.0587501206598701, + -3.34401686341579e-07,-0.005765257094003,0.0498486340234948,-0.0934553223787428, + -3.42862285673817e-07,-0.00557504275640514,0.061575974156606,-0.128160524097615, + -3.51322885255856e-07,-0.00538482841880761,0.0733033142897171,-0.162865725816488, + -3.59783484560339e-07,-0.0051946140812098,0.0850306544228283,-0.197570927535361, + -3.68244083837066e-07,-0.00500439974361189,0.0967579945559395,-0.232276129254233, + -3.76704683280327e-07,-0.00481418540601419,0.108485334689051,-0.266981330973106, + -3.85165282723587e-07,-0.00462397106841672,0.120212674822162,-0.301686532691979, + -3.93625882055826e-07,-0.00443375673081881,0.131940014955273,-0.336391734410851, + -4.02086481221531e-07,-0.00424354239322056,0.143667355088384,-0.371096936129724, + -4.10547080831325e-07,-0.00405332805562342,0.155394695221495,-0.405802137848597, + -4.19007680385608e-07,-0.00386311371802539,0.167122035354607,-0.440507339567469, + -4.27468279773358e-07,-0.00367289938042781,0.178849375487718,-0.475212541286342, + -4.35928879327641e-07,-0.00348268504283045,0.190576715620828,-0.509917743005214, + -4.44389478770901e-07,-0.00329247070523264,0.20230405575394,-0.544622944724087, + -4.52850077770073e-07,-0.00310225636763461,0.214031395887051,-0.57932814644296, + -4.613106775464e-07,-0.00291204203003748,0.225758736020162,-0.614033348161833, + -4.69771276545572e-07,-0.00272182769243856,0.237486076153274,-0.648738549880705, + -4.78231875988833e-07,-0.00253161335484098,0.249213416286385,-0.683443751599578, + -4.86692475432093e-07,-0.00234139901724317,0.260940756419496,-0.718148953318451, + -4.95153074764332e-07,-0.00215118467964581,0.272668096552607,-0.752854155037323, + -5.03613673874526e-07,-0.00196097034204756,0.284395436685718,-0.787559356756195, + -5.12074273428809e-07,-0.0017707560044502,0.296122776818829,-0.822264558475068, + -1.41195823768342e-05,-0.0066893430151478,0.025440415439077,-0.00442004566760469, + -1.7169243624951e-05,-0.00600675280697524,0.0414703510037193,-0.0354395098086673, + -2.02189048730678e-05,-0.0053241625988027,0.0575002865683616,-0.0664589739497299, + -2.32685661212539e-05,-0.00464157239063018,0.0735302221330039,-0.0974784380907926, + -2.6318227369343e-05,-0.00395898218245755,0.0895601576976463,-0.128497902231855, + -2.93678886174598e-05,-0.00327639197428509,0.105590093262288,-0.159517366372918, + -3.24175498653823e-05,-0.00259380176611212,0.121620028826931,-0.19053683051398, + -3.54672111138044e-05,-0.00191121155794005,0.137649964391573,-0.221556294655043, + -3.85168723618934e-05,-0.00122862134976742,0.153679899956215,-0.252575758796106, + -4.15665336098714e-05,-0.000546031141594794,0.169709835520858,-0.283595222937168, + -4.46161948580714e-05,0.000136559066577835,0.1857397710855,-0.314614687078231, + -4.7665856106105e-05,0.000819149274750464,0.201769706650142,-0.345634151219294, + -5.07155173544716e-05,0.00150173948292287,0.217799642214785,-0.376653615360356, + -5.37651786025606e-05,0.00218432969109505,0.233829577779427,-0.407673079501419, + -5.68148398503165e-05,0.00286691989926813,0.249859513344069,-0.438692543642481, + -5.98645010989607e-05,0.00354951010744053,0.265889448908712,-0.469712007783544, + -6.29141623466056e-05,0.00423210031561339,0.281919384473354,-0.500731471924607, + -6.59638235951387e-05,0.00491469052378535,0.297949320037996,-0.531750936065669, + -6.90134848431168e-05,0.00559728073195842,0.313979255602639,-0.562770400206732, + -7.20631460909837e-05,0.00627987094013061,0.33000919116728,-0.593789864347795, + -7.51128073391838e-05,0.00696246114830368,0.346039126731923,-0.624809328488857, + -7.81624685877169e-05,0.00764505135647564,0.362069062296565,-0.65582879262992, + -8.12121298358059e-05,0.00832764156464849,0.378098997861208,-0.686848256770982, + -8.42617910836729e-05,0.0090102317728209,0.39412893342585,-0.717867720912045, + -8.7311452331762e-05,0.00969282198099375,0.410158868990493,-0.748887185053108, + -1.40610073333589e-05,-0.00668638968518565,0.0254398211250674,-0.00442471458540301, + -1.70844765248895e-05,-0.00600551598731253,0.0414476775710687,-0.035459099814681, + -2.01079457164133e-05,-0.00532464228943946,0.05745553401707,-0.066493485043959, + -2.31314149080064e-05,-0.00464376859156634,0.0734633904630713,-0.097527870273237, + -2.61548840995163e-05,-0.00396289489369323,0.0894712469090727,-0.128562255502515, + -2.91783532910816e-05,-0.00328202119582033,0.105479103355074,-0.159596640731793, + -3.22018224826748e-05,-0.00260114749794726,0.121486959801075,-0.190631025961071, + -3.52252916742124e-05,-0.00192027380007431,0.137494816247076,-0.221665411190349, + -3.82487608656112e-05,-0.0012394001022008,0.153502672693078,-0.252699796419627, + -4.12722300570656e-05,-0.00055852640432752,0.169510529139079,-0.283734181648905, + -4.4295699248742e-05,0.000122347293545211,0.18551838558508,-0.314768566878183, + -4.73191684401408e-05,0.000803220991418607,0.201526242031082,-0.345802952107461, + -5.03426376317062e-05,0.00148409468929134,0.217534098477083,-0.376837337336739, + -5.33661068234936e-05,0.00216496838716429,0.233541954923084,-0.407871722566017, + -5.6389576014948e-05,0.00284584208503746,0.249549811369085,-0.438906107795295, + -5.94130452066244e-05,0.00352671578291042,0.265557667815087,-0.469940493024573, + -6.24365143978567e-05,0.00420758948078381,0.281565524261088,-0.500974878253851, + -6.54599835895331e-05,0.00488846317865677,0.297573380707089,-0.532009263483129, + -6.84834527810985e-05,0.00556933687653038,0.313581237153091,-0.563043648712407, + -7.15069219722198e-05,0.00625021057440334,0.329589093599092,-0.594078033941685, + -7.45303911640072e-05,0.00693108427227607,0.345596950045093,-0.625112419170963, + -7.75538603551285e-05,0.00761195797014969,0.361604806491094,-0.656146804400241, + -8.0577329547582e-05,0.00829283166802153,0.377612662937095,-0.687181189629519, + -8.36007987393694e-05,0.0089737053658947,0.393620519383097,-0.718215574858797, + -8.66242679299356e-05,0.00965457906376921,0.409628375829099,-0.749249960088075, + -1.39798650033995e-05,-0.00668230991677934,0.0254389927688464,-0.00443116968810527, + -1.69672664514647e-05,-0.00600382301715574,0.0414163019668647,-0.0354861843567995, + -1.99546678995577e-05,-0.00532533611753216,0.0573936111648831,-0.0665411990254936, + -2.29420693475813e-05,-0.00464684921790859,0.0733709203629014,-0.0975962136941878, + -2.5929470795466e-05,-0.00396836231828462,0.08934822956092,-0.128651228362882, + -2.89168722435451e-05,-0.0032898754186611,0.105325538758938,-0.159706243031576, + -3.19042736915964e-05,-0.00261138851903753,0.121302847956957,-0.19076125770027, + -3.48916751397033e-05,-0.00193290161941406,0.137280157154975,-0.221816272368965, + -3.7879076587588e-05,-0.00125441471979015,0.153257466352994,-0.252871287037659, + -4.08664780357504e-05,-0.000575927820166688,0.169234775551012,-0.283926301706353, + -4.38538794837462e-05,0.000102559079456999,0.18521208474903,-0.314981316375047, + -4.68412809319085e-05,0.000781045979080464,0.201189393947049,-0.346036331043741, + -4.98286823799043e-05,0.00145953287870415,0.217166703145067,-0.377091345712435, + -5.28160838279002e-05,0.00213801977832784,0.233144012343085,-0.40814636038113, + -5.58034852756739e-05,0.00281650667795197,0.249121321541104,-0.439201375049824, + -5.87908867240028e-05,0.00349499357757521,0.265098630739122,-0.470256389718518, + -6.17782881719986e-05,0.00417348047719868,0.281075939937141,-0.501311404387212, + -6.47656896201054e-05,0.00485196737682236,0.297053249135159,-0.532366419055906, + -6.77530910681012e-05,0.00553045427644605,0.313030558333177,-0.563421433724601, + -7.07404925162081e-05,0.00620894117606952,0.329007867531196,-0.594476448393295, + -7.37278939644259e-05,0.00688742807569298,0.344985176729214,-0.625531463061989, + -7.67152954114225e-05,0.00756591497531778,0.360962485927233,-0.656586477730683, + -7.97026968605286e-05,0.00824440187494035,0.376939795125251,-0.687641492399377, + -8.26900983079693e-05,0.00892288877456471,0.39291710432327,-0.718696507068071, + -8.56774997564091e-05,0.00960137567418817,0.408894413521288,-0.749751521736766, + -1.38678946849796e-05,-0.00667670177047548,0.0254378401061605,-0.00444005328214347, + -1.68059349148764e-05,-0.00600152543255097,0.0413730693088682,-0.0355234584464598, + -1.9743975144787e-05,-0.00532634909462648,0.057308298511576,-0.0666068636107761, + -2.26820153746976e-05,-0.00465117275670196,0.0732435277142837,-0.0976902687750925, + -2.56200556044694e-05,-0.00397599641877727,0.0891787569169916,-0.128773673939409, + -2.85580958342968e-05,-0.00330082008085264,0.105113986119699,-0.159857079103725, + -3.1496136064374e-05,-0.00262564374292829,0.121049215322407,-0.190940484268042, + -3.44341762942291e-05,-0.00195046740500393,0.136984444525115,-0.222023889432358, + -3.73722165241119e-05,-0.00127529106707902,0.152919673727823,-0.253107294596674, + -4.03102567537728e-05,-0.000600114729154333,0.168854902930531,-0.284190699760991, + -4.32482969839887e-05,7.50616087696887e-05,0.184790132133238,-0.315274104925307, + -4.6186337213816e-05,0.000750237946694376,0.200725361335946,-0.346357510089623, + -4.91243774436434e-05,0.00142541428461884,0.216660590538653,-0.37744091525394, + -5.20624176734152e-05,0.00210059062254353,0.232595819741361,-0.408524320418256, + -5.50004579031871e-05,0.00277576696046822,0.248531048944069,-0.439607725582572, + -5.79384981336251e-05,0.00345094329839224,0.264466278146777,-0.470691130746889, + -6.08765383636189e-05,0.00412611963631648,0.280401507349484,-0.501774535911205, + -6.38145785933908e-05,0.00480129597424139,0.296336736552192,-0.532857941075521, + -6.67526188231626e-05,0.00547647231216586,0.3122719657549,-0.563941346239838, + -6.96906590524904e-05,0.00615164865009121,0.328207194957608,-0.595024751404154, + -7.26286992830394e-05,0.00682682498801501,0.344142424160316,-0.62610815656847, + -7.55667395130333e-05,0.00750200132593903,0.360077653363023,-0.657191561732787, + -7.85047797425831e-05,0.00817717766386439,0.376012882565731,-0.688274966897103, + -8.14428199723549e-05,0.00885235400178885,0.391948111768439,-0.719358372061419, + -8.43808602027929e-05,0.00952753033971243,0.407883340971146,-0.750441777225736, + -1.37142059711895e-05,-0.00666904468042966,0.0254362400625622,-0.00445220177231932, + -1.65852639968794e-05,-0.00599844402853861,0.0413138481253304,-0.0355744314997202, + -1.94563220225624e-05,-0.00532784337664755,0.0571914561880986,-0.066696661227121, + -2.23273800482593e-05,-0.00465724272475654,0.0730690642508667,-0.0978188909545219, + -2.51984380738868e-05,-0.00398664207286542,0.088946672313635,-0.128941120681923, + -2.80694960997918e-05,-0.00331604142097464,0.104824280376403,-0.160063350409323, + -3.09405541254748e-05,-0.00264544076908357,0.120701888439171,-0.191185580136724, + -3.38116121509913e-05,-0.00197484011719229,0.136579496501939,-0.222307809864125, + -3.66826701768685e-05,-0.00130423946530156,0.152457104564708,-0.253430039591526, + -3.95537282024128e-05,-0.000633638813410164,0.168334712627476,-0.284552269318927, + -4.24247862281235e-05,3.69618384810089e-05,0.184212320690244,-0.315674499046328, + -4.52958442538898e-05,0.000707562490371627,0.200089928753012,-0.346796728773729, + -4.81669022798226e-05,0.00137816314226247,0.21596753681578,-0.377918958501129, + -5.10379603049227e-05,0.0020487637941542,0.231845144878549,-0.40904118822853, + -5.39090183308e-05,0.00271936444604526,0.247722752941317,-0.440163417955931, + -5.67800763565662e-05,0.0033899650979361,0.263600361004085,-0.471285647683332, + -5.96511343823325e-05,0.00406056574982716,0.279477969066853,-0.502407877410733, + -6.25221924084318e-05,0.00473116640171733,0.295355577129621,-0.533530107138134, + -6.53932504333099e-05,0.00540176705360973,0.31123318519239,-0.564652336865534, + -6.82643084587431e-05,0.00607236770550101,0.327110793255158,-0.595774566592935, + -7.11353664847314e-05,0.00674296835739163,0.342988401317926,-0.626896796320336, + -7.40064245108307e-05,0.00741356900928247,0.358866009380694,-0.658019026047737, + -7.68774825360419e-05,0.00808416966117376,0.374743617443462,-0.689141255775138, + -7.97485405619192e-05,0.00875477031306504,0.390621225506231,-0.720263485502539, + -8.26195985879075e-05,0.00942537096495499,0.406498833568998,-0.75138571522994, + -1.35047929589946e-05,-0.00665868614607887,0.0254340270066494,-0.00446867189890189, + -1.628600905626e-05,-0.00599437827861751,0.0412333760583813,-0.0356435374237771, + -1.90672251536017e-05,-0.0053300704111563,0.0570327251101131,-0.0668184029486523, + -2.18484412508324e-05,-0.00466576254369488,0.072832074161845,-0.0979932684735275, + -2.46296573481464e-05,-0.00400145467623347,0.088631423213577,-0.129168133998403, + -2.74108734453771e-05,-0.00333714680877217,0.104430772265309,-0.160342999523278, + -3.01920895427188e-05,-0.00267283894131087,0.120230121317041,-0.191517865048153, + -3.29733056401715e-05,-0.00200853107384968,0.136029470368773,-0.222692730573028, + -3.57545217374855e-05,-0.00134422320638861,0.151828819420504,-0.253867596097903, + -3.85357378346329e-05,-0.000679915338926751,0.167628168472236,-0.285042461622779, + -4.13169539318359e-05,-1.56074714656729e-05,0.183427517523968,-0.316217327147654, + -4.40981700290943e-05,0.000648700395995849,0.1992268665757,-0.347392192672529, + -4.68793861265193e-05,0.00131300826345693,0.215026215627432,-0.378567058197404, + -4.96606022235557e-05,0.00197731613091889,0.230825564679164,-0.409741923722279, + -5.24418183209807e-05,0.00264162399837975,0.246624913730896,-0.440916789247155, + -5.52230344184057e-05,0.00330593186584105,0.262424262782628,-0.47209165477203, + -5.80042505153866e-05,0.00397023973330324,0.27822361183436,-0.503266520296905, + -6.07854666132557e-05,0.00463454760076343,0.294022960886091,-0.53444138582178, + -6.35666827105696e-05,0.00529885546822473,0.309822309937823,-0.565616251346655, + -6.63478988076616e-05,0.00596316333568603,0.325621658989555,-0.596791116871531, + -6.91291149048645e-05,0.00662747120314799,0.341421008041287,-0.627965982396406, + -7.19103310020675e-05,0.00729177907060885,0.357220357093019,-0.659140847921281, + -7.46915470986043e-05,0.00795608693807148,0.373019706144751,-0.690315713446156, + -7.74727631960292e-05,0.00862039480553278,0.388819055196483,-0.721490578971031, + -8.02539792941204e-05,0.00928470267299319,0.404618404248215,-0.752665444495907, + -1.32222791387193e-05,-0.00664484683601915,0.0254309825651138,-0.00449074092689025, + -1.58848799419603e-05,-0.00598913227789127,0.0411252163116373,-0.0357361354110802, + -1.85474807451458e-05,-0.00533341771976331,0.0568194500581608,-0.0669815298952701, + -2.12100815484562e-05,-0.00467770316163546,0.0725136838046843,-0.09822692437946, + -2.38726823516833e-05,-0.00402198860350761,0.0882079175512078,-0.12947231886365, + -2.65352831548549e-05,-0.0033662740453797,0.103902151297731,-0.16071771334784, + -2.91978839583318e-05,-0.00271055948725207,0.119596385044255,-0.19196310783203, + -3.18604847614479e-05,-0.002054844929124,0.135290618790778,-0.22320850231622, + -3.45230855645084e-05,-0.00139913037099604,0.150984852537302,-0.25445389680041, + -3.71856863680686e-05,-0.000743415812868298,0.166679086283825,-0.2856992912846, + -3.98482871712402e-05,-8.77012547404465e-05,0.182373320030349,-0.316944685768789, + -4.25108879745228e-05,0.000568013303387405,0.198067553776872,-0.348190080252979, + -4.51734887774724e-05,0.0012237278615157,0.213761787523396,-0.379435474737169, + -4.78360895808105e-05,0.00187944241964377,0.229456021269919,-0.410680869221359, + -5.04986903840932e-05,0.00253515697777118,0.245150255016443,-0.441926263705549, + -5.31612911873758e-05,0.00319087153589903,0.260844488762966,-0.473171658189739, + -5.58238919908804e-05,0.00384658609402688,0.27653872250949,-0.504417052673929, + -5.848649279383e-05,0.00450230065215518,0.292232956256013,-0.535662447158119, + -6.11490935971126e-05,0.00515801521028281,0.307927190002537,-0.566907841642309, + -6.38116944001732e-05,0.00581372976841088,0.32362142374906,-0.598153236126499, + -6.64742952038999e-05,0.00646944432653784,0.339315657495583,-0.629398630610689, + -6.91368960070715e-05,0.00712515888466614,0.355009891242107,-0.660644025094879, + -7.179949680991e-05,0.00778087344279488,0.370704124988631,-0.691889419579068, + -7.44620976130816e-05,0.00843658800092273,0.386398358735154,-0.723134814063259, + -7.71246984168084e-05,0.00909230255904969,0.402092592481677,-0.754380208547449, + -1.28462280215083e-05,-0.00662666231581905,0.0254268280857261,-0.00451985244472586, + -1.53555079866613e-05,-0.00598256610710396,0.040981960292534,-0.035858282519704, + -1.78647879517796e-05,-0.00533846989838876,0.056537092499342,-0.0671967125946821, + -2.03740679169673e-05,-0.00469437368967363,0.07209222470615,-0.0985351426696602, + -2.28833478820578e-05,-0.00405027748095849,0.0876473569129579,-0.129873572744638, + -2.53926278471761e-05,-0.00340618127224324,0.103202489119766,-0.161212002819616, + -2.79019078123222e-05,-0.00276208506352815,0.118757621326574,-0.192550432894595, + -3.04111877774682e-05,-0.00211798885481307,0.134312753533382,-0.223888862969573, + -3.29204677426698e-05,-0.0014738926460981,0.14986788574019,-0.255227293044551, + -3.54297477078158e-05,-0.00082979643738279,0.165423017946998,-0.286565723119529, + -3.79390276729064e-05,-0.000185700228667818,0.180978150153805,-0.317904153194507, + -4.04483076382189e-05,0.000458395980047488,0.196533282360614,-0.349242583269485, + -4.29575876030874e-05,0.00110249218876279,0.212088414567422,-0.380581013344463, + -4.54668675681225e-05,0.00174658839747832,0.22764354677423,-0.411919443419441, + -4.79761475332685e-05,0.00239068460619341,0.243198678981038,-0.443257873494419, + -5.04854274983035e-05,0.00303478081490871,0.258753811187846,-0.474596303569398, + -5.29947074638937e-05,0.00367887702362291,0.274308943394653,-0.505934733644376, + -5.55039874291507e-05,0.00432297323233799,0.289864075601461,-0.537273163719354, + -5.80132673939637e-05,0.00496706944105396,0.30541920780827,-0.568611593794332, + -6.05225473595539e-05,0.00561116564976794,0.320974340015077,-0.59995002386931, + -6.30318273241448e-05,0.00625526185848413,0.336529472221885,-0.631288453944288, + -6.55411072892909e-05,0.00689935806719921,0.352084604428693,-0.662626884019266, + -6.805038725477e-05,0.00754345427591385,0.367639736635501,-0.693965314094244, + -7.05596672194719e-05,0.00818755048462938,0.383194868842309,-0.725303744169222, + -7.30689471843959e-05,0.00883164669334491,0.398750001049117,-0.756642174244201, + -1.23545201799261e-05,-0.00660328428945223,0.0254212263169582,-0.00455747018312831, + -1.46710909880721e-05,-0.00597467811814334,0.0407958664774927,-0.0360161203213869, + -1.69876617961834e-05,-0.00534607194683445,0.0561705066380271,-0.0674747704596454, + -1.9304232604378e-05,-0.00471746577552562,0.0715451467985616,-0.0989334205979039, + -2.16208034123921e-05,-0.00408885960421657,0.0869197869590962,-0.130392070736163, + -2.39373742207949e-05,-0.00346025343290801,0.10229442711963,-0.161850720874421, + -2.62539450287536e-05,-0.00283164726159879,0.117669067280165,-0.19330937101268, + -2.85705158369343e-05,-0.0022030410902899,0.1330437074407,-0.224768021150938, + -3.0887086645115e-05,-0.00157443491898113,0.148418347601234,-0.256226671289197, + -3.32036574531291e-05,-0.000945828747672128,0.163792987761769,-0.287685321427455, + -3.55202282615874e-05,-0.000317222576363463,0.179167627922303,-0.319143971565714, + -3.78367990695461e-05,0.000311383594945314,0.194542268082837,-0.350602621703972, + -4.01533698776158e-05,0.000939989766254312,0.209916908243372,-0.382061271842231, + -4.24699406857409e-05,0.00156859593756331,0.225291548403906,-0.413519921980489, + -4.47865114940882e-05,0.00219720210887209,0.240666188564441,-0.444978572118748, + -4.71030823021579e-05,0.00282580828018109,0.256040828724975,-0.476437222257007, + -4.94196531105606e-05,0.0034544144514892,0.271415468885509,-0.507895872395265, + -5.17362239182972e-05,0.00408302062279886,0.286790109046044,-0.539354522533524, + -5.40527947264779e-05,0.00471162679410742,0.302164749206578,-0.570813172671782, + -5.63693655348807e-05,0.00534023296541619,0.317539389367113,-0.602271822810041, + -5.86859363428394e-05,0.00596883913672563,0.332914029527648,-0.633730472948299, + -6.10025071510201e-05,0.00659744530803419,0.348288669688182,-0.665189123086558, + -6.33190779590898e-05,0.00722605147934319,0.363663309848717,-0.696647773224816, + -6.56356487673815e-05,0.0078546576506513,0.37903795000925,-0.728106423363075, + -6.79522195753401e-05,0.00848326382196074,0.394412590169785,-0.759565073501333, + -1.17263788682875e-05,-0.0065740595809894,0.0254138036221959,-0.00460480546026015, + -1.38093612328249e-05,-0.00596570964058377,0.0405601316434969,-0.0362147313065718, + -1.58923435974595e-05,-0.00535735970017825,0.0557064596647978,-0.0678246571528835, + -1.79753259620108e-05,-0.0047490097597726,0.0708527876860989,-0.0994345829991951, + -2.00583083265204e-05,-0.00414065981936701,0.0859991157073998,-0.131044508845507, + -2.21412906912244e-05,-0.00353230987896158,0.101145443728701,-0.162654434691818, + -2.4224273055623e-05,-0.00292395993855565,0.116291771750002,-0.19426436053813, + -2.63072554202992e-05,-0.00231560999815028,0.131438099771303,-0.225874286384442, + -2.83902377847811e-05,-0.00170726005774446,0.146584427792604,-0.257484212230754, + -3.04732201495406e-05,-0.00109891011733931,0.161730755813905,-0.289094138077065, + -3.25562025137449e-05,-0.000490560176933164,0.176877083835206,-0.320704063923377, + -3.46391848783933e-05,0.000117789763472542,0.192023411856507,-0.352313989769688, + -3.67221672432083e-05,0.000726139703877804,0.207169739877808,-0.383923915616, + -3.88051496077457e-05,0.00133448964428373,0.222316067899109,-0.415533841462312, + -4.08881319722276e-05,0.00194283958468899,0.23746239592041,-0.447143767308623, + -4.29711143367095e-05,0.00255118952509426,0.252608723941711,-0.478753693154935, + -4.50540967011914e-05,0.00315953946550018,0.267755051963012,-0.510363619001247, + -4.71370790660064e-05,0.00376788940590567,0.282901379984313,-0.541973544847558, + -4.92200614303773e-05,0.00437623934631159,0.298047708005614,-0.57358347069387, + -5.13030437946371e-05,0.00498458928671774,0.313194036026915,-0.605193396540182, + -5.33860261595631e-05,0.00559293922712278,0.328340364048216,-0.636803322386493, + -5.54690085237119e-05,0.00620128916752893,0.343486692069517,-0.668413248232805, + -5.755199088886e-05,0.00680963910793331,0.358633020090817,-0.700023174079117, + -5.96349732528978e-05,0.0074179890483399,0.373779348112119,-0.731633099925428, + -6.17179556178238e-05,0.00802633898874472,0.388925676133419,-0.76324302577174, + -1.09474054983544e-05,-0.00653878010131805,0.0254042073544089,-0.00466241717516525, + -1.27599238548132e-05,-0.00595623538196288,0.0402708604933348,-0.0364564605231058, + -1.45724422112303e-05,-0.00537369066260773,0.0551375136322606,-0.0682505038710463, + -1.63849605677169e-05,-0.00479114594325258,0.0700041667711865,-0.100044547218987, + -1.81974789241202e-05,-0.00420860122389743,0.0848708199101124,-0.131838590566927, + -2.00099972804679e-05,-0.00362605650454217,0.0997374730490382,-0.163632633914868, + -2.18225156371488e-05,-0.00304351178518736,0.114604126187964,-0.195426677262808, + -2.36350339934965e-05,-0.00246096706583199,0.12947077932689,-0.227220720610749, + -2.54475523502884e-05,-0.00187842234647728,0.144337432465816,-0.259014763958689, + -2.72600707062476e-05,-0.00129587762712147,0.159204085604742,-0.29080880730663, + -2.90725890629839e-05,-0.000713332907766873,0.174070738743667,-0.32260285065457, + -3.08851074194982e-05,-0.000130788188411612,0.188937391882594,-0.354396894002511, + -3.2697625775735e-05,0.000451756530943648,0.203804045021519,-0.386190937350451, + -3.45101441320828e-05,0.00103430125029913,0.218670698160445,-0.417984980698392, + -3.63226624888746e-05,0.0016168459696535,0.233537351299371,-0.449779024046332, + -3.81351808449448e-05,0.00219939068900921,0.248404004438297,-0.481573067394273, + -3.99476992012371e-05,0.00278193540836491,0.263270657577223,-0.513367110742213, + -4.17602175583065e-05,0.00336448012771906,0.278137310716149,-0.545161154090154, + -4.35727359147098e-05,0.00394702484707432,0.293003963855075,-0.576955197438094, + -4.5385254270891e-05,0.00452956956643025,0.307870616994001,-0.608749240786035, + -4.71977726274053e-05,0.00511211428578484,0.322737270132926,-0.640543284133975, + -4.90102909841417e-05,0.00569465900513944,0.337603923271852,-0.672337327481916, + -5.08228093404339e-05,0.00627720372449492,0.352470576410778,-0.704131370829856, + -5.26353276962821e-05,0.00685974844385084,0.367337229549704,-0.735925414177797, + -5.44478460527964e-05,0.00744229316320588,0.38220388268863,-0.767719457525737, + -1.00161865496037e-05,-0.00649794593372762,0.0253922078414258,-0.00472976015830734, + -1.15326006883271e-05,-0.00594717025762809,0.0399294456681986,-0.0367390205298823, + -1.30490148270573e-05,-0.00539639458152857,0.0544666834949714,-0.0687482809014573, + -1.4565428965746e-05,-0.00484561890542889,0.0690039213217444,-0.100757541273032, + -1.60818431044207e-05,-0.00429484322932938,0.0835411591485172,-0.132766801644607, + -1.7598257243151e-05,-0.00374406755322987,0.09807839697529,-0.164776062016182, + -1.9114671381798e-05,-0.00319329187713024,0.112615634802063,-0.196785322387757, + -2.06310855205283e-05,-0.00264251620103073,0.127152872628836,-0.228794582759332, + -2.21474996593418e-05,-0.00209174052493133,0.141690110455608,-0.260803843130907, + -2.36639137978778e-05,-0.00154096484883137,0.156227348282381,-0.292813103502482, + -2.51803279370244e-05,-0.000990189172732636,0.170764586109154,-0.324822363874057, + -2.66967420757824e-05,-0.00043941349663279,0.185301823935927,-0.356831624245632, + -2.82131562143184e-05,0.000111362179466834,0.1998390617627,-0.388840884617207, + -2.97295703528544e-05,0.000662137855566236,0.214376299589472,-0.420850144988782, + -3.12459844914459e-05,0.0012129135316663,0.228913537416246,-0.452859405360357, + -3.27623986304815e-05,0.00176368920776548,0.243450775243018,-0.484868665731932, + -3.4278812769184e-05,0.00231446488386511,0.257988013069791,-0.516877926103507, + -3.57952269074424e-05,0.00286524055996518,0.272525250896564,-0.548887186475082, + -3.7311641046589e-05,0.00341601623606391,0.287062488723337,-0.580896446846657, + -3.88280551850695e-05,0.00396679191216376,0.30159972655011,-0.612905707218232, + -4.0344469323772e-05,0.00451756758826338,0.316136964376883,-0.644914967589807, + -4.18608834625855e-05,0.00506834326436278,0.330674202203655,-0.676924227961382, + -4.33772976018432e-05,0.00561911894046174,0.345211440030428,-0.708933488332957, + -4.48937117402126e-05,0.00616989461656203,0.359748677857201,-0.740942748704532, + -4.641012587836e-05,0.00672067029266188,0.374285915683974,-0.772952009076107, + -8.95061131261227e-06,-0.00645292424524583,0.0253778317728423,-0.00480485928043545, + -1.01635120729332e-05,-0.00593962074851551,0.0395445359692769,-0.0370541240116016, + -1.1376412833275e-05,-0.00542631725178516,0.0537112401657115,-0.0693033887427677, + -1.25893135936028e-05,-0.00491301375505498,0.0678779443621459,-0.101552653473934, + -1.38022143539307e-05,-0.00439971025832459,0.0820446485585806,-0.1338019182051, + -1.50151151142308e-05,-0.00388640676159435,0.0962113527550151,-0.166051182936266, + -1.62280158744754e-05,-0.00337310326486384,0.11037805695145,-0.198300447667432, + -1.74409166347478e-05,-0.00285979976813344,0.124544761147884,-0.230549712398598, + -1.86538173950757e-05,-0.00234649627140304,0.138711465344319,-0.262798977129764, + -1.98667181555701e-05,-0.00183319277467298,0.152878169540754,-0.295048241860931, + -2.10796189158424e-05,-0.00131988927794269,0.167044873737188,-0.327297506592097, + -2.22925196765034e-05,-0.000806585781212732,0.181211577933623,-0.359546771323263, + -2.35054204364982e-05,-0.000293282284481888,0.195378282130057,-0.391796036054429, + -2.47183211967705e-05,0.000220021212248733,0.209544986326492,-0.424045300785595, + -2.59312219570429e-05,0.000733324708978689,0.223711690522926,-0.456294565516761, + -2.71441227174263e-05,0.00124662820570909,0.237878394719361,-0.488543830247927, + -2.83570234775876e-05,0.00175993170243949,0.252045098915796,-0.520793094979093, + -2.95699242383041e-05,0.00227323519916922,0.26621180311223,-0.55304235971026, + -3.07828249982434e-05,0.00278653869590006,0.280378507308665,-0.585291624441425, + -3.19957257587378e-05,0.00329984219263024,0.294545211505099,-0.617540889172592, + -3.3208626518455e-05,0.00381314568936153,0.308711915701534,-0.649790153903758, + -3.44215272796156e-05,0.00432644918609038,0.322878619897968,-0.682039418634924, + -3.5634428040221e-05,0.004839752682821,0.337045324094403,-0.71428868336609, + -3.68473288002713e-05,0.00535305617955117,0.351212028290838,-0.746537948097256, + -3.80602295600996e-05,0.00586635967628224,0.365378732487272,-0.778787212828422, + -7.79067106557868e-06,-0.0064058714063689,0.025361475361132,-0.00488433690778027, + -8.71464295375268e-06,-0.00593457731235156,0.0391323924974063,-0.0373875989762279, + -9.63861484193362e-06,-0.00546328321833428,0.0529033096336805,-0.0698908610446755, + -1.05625867301007e-05,-0.00499198912431692,0.0666742267699548,-0.102394123113123, + -1.14865586183788e-05,-0.00452069503029973,0.080445143906229,-0.134897385181571, + -1.24105305066013e-05,-0.00404940093628248,0.0942160610425033,-0.167400647250018, + -1.33345023948239e-05,-0.00357810684226534,0.107986978178777,-0.199903909318466, + -1.425847428288e-05,-0.00310681274824776,0.121757895315052,-0.232407171386914, + -1.5182446171158e-05,-0.00263551865423051,0.135528812451326,-0.264910433455361, + -1.61064180592141e-05,-0.00216422456021326,0.1492997295876,-0.297413695523809, + -1.70303899476587e-05,-0.00169293046619612,0.163070646723875,-0.329916957592256, + -1.79543618354927e-05,-0.00122163637217843,0.176841563860149,-0.362420219660704, + -1.88783337238818e-05,-0.000750342278161398,0.190612480996423,-0.394923481729152, + -1.98023056120489e-05,-0.000279048184144148,0.204383398132697,-0.427426743797599, + -2.07262775000494e-05,0.000192245909873323,0.218154315268972,-0.459930005866047, + -2.1650249388494e-05,0.000663540003890573,0.231925232405246,-0.492433267934494, + -2.25742212766056e-05,0.00113483409790782,0.24569614954152,-0.524936530002942, + -2.34981931649392e-05,0.00160612819192507,0.259467066677795,-0.55743979207139, + -2.44221650530507e-05,0.00207742228594276,0.273237983814069,-0.589943054139837, + -2.53461369410513e-05,0.00254871637996024,0.287008900950343,-0.622446316208285, + -2.62701088294959e-05,0.00302001047397704,0.300779818086617,-0.654949578276732, + -2.71940807173854e-05,0.00349130456799474,0.314550735222892,-0.68745284034518, + -2.8118052605941e-05,0.0039625986620111,0.328321652359165,-0.719956102413627, + -2.90420244946077e-05,0.0044338927560279,0.34209256949544,-0.752459364482075, + -2.9965996381498e-05,0.00490518685004737,0.355863486631715,-0.784962626550523, + -6.5946658991331e-06,-0.00635936840938081,0.0253439198651874,-0.0049639222493114, + -7.26444071441623e-06,-0.00593256992546679,0.0387147523091504,-0.0377215258917449, + -7.93421552977569e-06,-0.00550577144155279,0.0520855847531134,-0.0704791295341784, + -8.60399034513515e-06,-0.00507897295763887,0.0654564171970763,-0.103236733176612, + -9.27376516038358e-06,-0.00465217447372474,0.0788272496410394,-0.135994336819045, + -9.94353997574304e-06,-0.00422537598981076,0.0921980820850024,-0.168751940461479, + -1.06133147909082e-05,-0.00379857750589652,0.105568914528965,-0.201509544103912, + -1.12830896062954e-05,-0.00337177902198249,0.118939746972929,-0.234267147746346, + -1.19528644214606e-05,-0.00294498053806846,0.132310579416891,-0.267024751388779, + -1.26226392370699e-05,-0.00251818205415477,0.145681411860854,-0.299782355031213, + -1.32924140519575e-05,-0.00209138357024008,0.159052244304818,-0.332539958673646, + -1.39621888672892e-05,-0.00166458508632639,0.17242307674878,-0.36529756231608, + -1.46319636827874e-05,-0.00123778660241269,0.185793909192743,-0.398055165958513, + -1.53017384983412e-05,-0.000810988118499001,0.199164741636706,-0.430812769600947, + -1.59715133133398e-05,-0.000384189634584198,0.21253557408067,-0.46357037324338, + -1.6641288128505e-05,4.26088493301613e-05,0.225906406524633,-0.496327976885814, + -1.73110629441142e-05,0.000469407333243632,0.239277238968595,-0.529085580528247, + -1.79808377592794e-05,0.000896205817158213,0.252648071412559,-0.561843184170681, + -1.86506125744446e-05,0.00132300430107213,0.266018903856521,-0.594600787813114, + -1.93203873900538e-05,0.0017498027849856,0.279389736300484,-0.627358391455548, + -1.9990162205108e-05,0.00217660126889951,0.292760568744447,-0.660115995097981, + -2.06599370204952e-05,0.00260339975281365,0.30613140118841,-0.692873598740415, + -2.13297118358824e-05,0.00303019823672823,0.319502233632374,-0.725631202382848, + -2.19994866508255e-05,0.00345699672064237,0.332873066076336,-0.758388806025282, + -2.26692614664348e-05,0.00388379520455562,0.346243898520299,-0.791146409667715, + -5.42848221371517e-06,-0.00631587937051781,0.0253262013124811,-0.00503932162701836, + -5.89167125854273e-06,-0.00593348347584252,0.0383145203489413,-0.0380378891961575, + -6.35486030345356e-06,-0.00555108758116729,0.0513028393854015,-0.0710364567652966, + -6.81804934832275e-06,-0.00516869168649192,0.0642911584218618,-0.104035024334436, + -7.28123839308092e-06,-0.0047862957918165,0.077279477458322,-0.137033591903575, + -7.74442743795012e-06,-0.00440389989714118,0.0902677964947822,-0.170032159472714, + -8.20761648270829e-06,-0.00402150400246581,0.103256115531242,-0.203030727041853, + -8.67080552768851e-06,-0.00363910810779067,0.116244434567703,-0.236029294610992, + -9.13399457264097e-06,-0.00325671221311541,0.129232753604163,-0.269027862180131, + -9.59718361726036e-06,-0.00287431631844004,0.142221072640623,-0.30202642974927, + -1.00603726622683e-05,-0.00249192042376456,0.155209391677083,-0.335024997318409, + -1.05235617069432e-05,-0.00210952452908897,0.168197710713544,-0.368023564887548, + -1.09867507520067e-05,-0.00172712863441449,0.181186029750003,-0.401022132456688, + -1.14499397967927e-05,-0.0013447327397389,0.194174348786464,-0.434020700025827, + -1.19131288415231e-05,-0.000962336845063305,0.207162667822924,-0.467019267594965, + -1.23763178869751e-05,-0.000579940950389046,0.220150986859384,-0.500017835164105, + -1.28395069310949e-05,-0.000197545055712345,0.233139305895845,-0.533016402733244, + -1.3302695976547e-05,0.000184850838962136,0.246127624932305,-0.566014970302383, + -1.37658850213329e-05,0.000567246733637727,0.259115943968765,-0.599013537871522, + -1.42290740656748e-05,0.000949642628313319,0.272104263005225,-0.632012105440661, + -1.46922631107937e-05,0.00133203852298847,0.285092582041685,-0.6650106730098, + -1.51554521554687e-05,0.00171443441766428,0.298080901078146,-0.698009240578939, + -1.56186412004766e-05,0.00209683031233876,0.311069220114605,-0.731007808148078, + -1.60818302453736e-05,0.00247922620701457,0.324057539151066,-0.764006375717217, + -1.65450192899375e-05,0.00286162210168994,0.337045858187526,-0.797004943286357, + -4.35168288635823e-06,-0.00627725978127903,0.0253093718361411,-0.00510709848344121, + -4.65912107407151e-06,-0.00593664760446716,0.0379509645294384,-0.0383222696633804, + -4.9665592617848e-06,-0.0055960354276553,0.0505925572227357,-0.0715374408433196, + -5.27399744956747e-06,-0.00525542325084344,0.063234149916033,-0.104752612023259, + -5.58143563716973e-06,-0.00491481107403152,0.0758757426093302,-0.137967783203198, + -5.8888738248275e-06,-0.00457419889721944,0.0885173353026277,-0.171182954383137, + -6.19631201270732e-06,-0.00423358672040774,0.101158927995925,-0.204398125563076, + -6.50375020028182e-06,-0.00389297454359561,0.113800520689222,-0.237613296743015, + -6.81118838780082e-06,-0.00355236236678358,0.12644211338252,-0.270828467922955, + -7.11862657587492e-06,-0.00321175018997222,0.139083706075817,-0.304043639102894, + -7.4260647633384e-06,-0.00287113801316008,0.151725298769114,-0.337258810282833, + -7.73350295113495e-06,-0.00253052583634816,0.164366891462411,-0.370473981462772, + -8.0409411389315e-06,-0.00218991365953647,0.177008484155709,-0.403689152642711, + -8.34837932661703e-06,-0.00184930148272455,0.189650076849006,-0.43690432382265, + -8.6558175145246e-06,-0.00150868930591286,0.202291669542303,-0.47011949500259, + -8.96325570232115e-06,-0.00116807712910094,0.214933262235601,-0.503334666182529, + -9.27069388945156e-06,-0.000827464952288359,0.227574854928898,-0.536549837362468, + -9.57813207735914e-06,-0.000486852775476443,0.240216447622196,-0.569765008542407, + -9.88557026537773e-06,-0.000146240598665193,0.252858040315493,-0.602980179722347, + -1.01930084526192e-05,0.00019437157814739,0.26549963300879,-0.636195350902285, + -1.05004466407488e-05,0.000534983754958418,0.278141225702087,-0.669410522082225, + -1.08078848281012e-05,0.000875595931770778,0.290782818395384,-0.702625693262164, + -1.11153230156757e-05,0.00121620810858269,0.303424411088682,-0.735840864442103, + -1.14227612030282e-05,0.0015568202853955,0.316066003781979,-0.769056035622042, + -1.17301993911578e-05,0.00189743246220653,0.328707596475276,-0.802271206801981, + -3.40627984006525e-06,-0.0062445074647781,0.0252942634384722,-0.00516520534647556, + -3.60385146050413e-06,-0.00594112973499392,0.0376364252876892,-0.0385660764394793, + -3.80142308087361e-06,-0.00563775200520966,0.0499785871369062,-0.071966947532483, + -3.99899470115983e-06,-0.00533437427542527,0.0623207489861233,-0.105367818625487, + -4.19656632158483e-06,-0.00503099654564115,0.0746629108353402,-0.13876868971849, + -4.39413794198207e-06,-0.00472761881585693,0.0870050726845572,-0.172169560811494, + -4.59170956237931e-06,-0.00442424108607264,0.0993472345337743,-0.205570431904498, + -4.78928118274879e-06,-0.00412086335628836,0.111689396382991,-0.238971302997502, + -4.98685280320155e-06,-0.00381748562650441,0.124031558232208,-0.272372174090505, + -5.18442442343225e-06,-0.00351410789671969,0.136373720081425,-0.305773045183509, + -5.38199604410705e-06,-0.00321073016693596,0.148715881930642,-0.339173916276513, + -5.57956766444878e-06,-0.00290735243715168,0.161058043779859,-0.372574787369516, + -5.77713928479051e-06,-0.00260397470736717,0.173400205629076,-0.40597565846252, + -5.97471090513224e-06,-0.00230059697758289,0.185742367478293,-0.439376529555524, + -6.1722825256405e-06,-0.00199721924779883,0.19808452932751,-0.472777400648527, + -6.36985414592672e-06,-0.00169384151801499,0.210426691176727,-0.506178271741531, + -6.56742576654601e-06,-0.00139046378823049,0.222768853025944,-0.539579142834535, + -6.76499738661018e-06,-0.00108708605844576,0.235111014875162,-0.572980013927539, + -6.96256900734049e-06,-0.000783708328662369,0.247453176724378,-0.606380885020543, + -7.16014062729364e-06,-0.000480330598877199,0.259795338573596,-0.639781756113546, + -7.35771224813497e-06,-0.000176952869093583,0.272137500422812,-0.67318262720655, + -7.55528386786608e-06,0.000126424860691365,0.28447966227203,-0.706583498299553, + -7.75285548837434e-06,0.00042980259047587,0.296821824121247,-0.739984369392557, + -7.95042710954874e-06,0.000733180320258597,0.309163985970463,-0.773385240485561, + -8.14799872972394e-06,0.0010365580500431,0.32150614781968,-0.806786111578565, + -2.61224921833947e-06,-0.00621779686777803,0.0252813566324146,-0.00521303325079621, + -2.73646024999408e-06,-0.00594604662143827,0.0373755508193538,-0.0387667544067805, + -2.86067128163481e-06,-0.00567429637509842,0.0494697450062931,-0.0723204755627647, + -2.98488231320615e-06,-0.00540254612875862,0.0615639391932323,-0.105874196718749, + -3.10909334491627e-06,-0.00513079588241888,0.0736581333801715,-0.139427917874733, + -3.23330437662639e-06,-0.0048590456360792,0.0857523275671107,-0.172981639030717, + -3.35751540811446e-06,-0.00458729538973934,0.0978465217540498,-0.206535360186702, + -3.48172643993561e-06,-0.0043155451433996,0.109940715940989,-0.240089081342686, + -3.60593747134041e-06,-0.00404379489705942,0.122034910127929,-0.27364280249867, + -3.73014850296727e-06,-0.0037720446507199,0.134129104314868,-0.307196523654654, + -3.85435953470514e-06,-0.00350029440438004,0.146223298501807,-0.340750244810639, + -3.97857056655404e-06,-0.00322854415804064,0.158317492688746,-0.374303965966623, + -4.10278159795885e-06,-0.00295679391170056,0.170411686875685,-0.407857687122607, + -4.22699262947468e-06,-0.00268504366536071,0.182505881062625,-0.441411408278591, + -4.35120366115704e-06,-0.00241329341902108,0.194600075249564,-0.474965129434575, + -4.47541469283941e-06,-0.002141543172681,0.206694269436503,-0.50851885059056, + -4.59962572441075e-06,-0.00186979292634115,0.218788463623443,-0.542072571746544, + -4.72383675642618e-06,-0.00159804268000197,0.230882657810381,-0.575626292902528, + -4.8480477878865e-06,-0.00132629243366189,0.242976851997321,-0.609180014058512, + -4.97225881934682e-06,-0.00105454218732204,0.25507104618426,-0.642733735214497, + -5.09646985102918e-06,-0.000782791940982186,0.267165240371199,-0.676287456370481, + -5.22068088304461e-06,-0.000511041694642778,0.279259434558139,-0.709841177526465, + -5.34489191461596e-06,-0.000239291448302481,0.291353628745078,-0.743394898682449, + -5.46910294585423e-06,3.24587980369273e-05,0.303447822932017,-0.776948619838434, + -5.59331397842477e-06,0.000304209044375447,0.315542017118955,-0.810502340994418, + -1.96980984534106e-06,-0.00619669904589003,0.025270780592608,-0.00525109781491041, + -2.04703023620745e-06,-0.00595075304648801,0.0371666545363841,-0.0389264670151655, + -2.12425062715016e-06,-0.00570480704708615,0.0490625284801601,-0.0726018362154206, + -2.20147101809287e-06,-0.00545886104768428,0.0609584024239361,-0.106277205415676, + -2.27869140900783e-06,-0.00521291504828231,0.0728542763677122,-0.139952574615931, + -2.35591179981176e-06,-0.00496696904888028,0.0847501503114882,-0.173627943816186, + -2.43313219064345e-06,-0.0047210230494783,0.0966460242552643,-0.207303313016441, + -2.51035258169718e-06,-0.00447507705007644,0.10854189819904,-0.240978682216696, + -2.58757297250112e-06,-0.00422913105067457,0.120437772142816,-0.274654051416951, + -2.66479336330505e-06,-0.00398318505127215,0.132333646086593,-0.308329420617206, + -2.74201375422001e-06,-0.0037372390518704,0.144229520030369,-0.342004789817462, + -2.81923414541252e-06,-0.00349129305246887,0.156125393974144,-0.375680159017717, + -2.89645453616094e-06,-0.00324534705306645,0.168021267917921,-0.409355528217972, + -2.97367492702039e-06,-0.0029994010536647,0.179917141861697,-0.443030897418227, + -3.05089531793534e-06,-0.00275345505426272,0.191813015805473,-0.476706266618482, + -3.12811570890581e-06,-0.00250750905486097,0.203708889749249,-0.510381635818737, + -3.20533609965423e-06,-0.00226156305545877,0.215604763693025,-0.544057005018992, + -3.28255649084674e-06,-0.00201561705605724,0.227500637636801,-0.577732374219247, + -3.35977688170619e-06,-0.00176967105665504,0.239396511580577,-0.611407743419502, + -3.43699727312075e-06,-0.00152372505725396,0.251292385524353,-0.645083112619757, + -3.51421766364712e-06,-0.00127777905785154,0.263188259468129,-0.678758481820013, + -3.59143805461759e-06,-0.00103183305844956,0.275084133411905,-0.712433851020268, + -3.66865844536601e-06,-0.000785887059047585,0.286980007355681,-0.746109220220523, + -3.74587883600341e-06,-0.000539941059645166,0.298875881299457,-0.779784589420778, + -3.82309922664081e-06,-0.000293995060242747,0.310771755243234,-0.813459958621033, + -1.46554387259884e-06,-0.00618045097756702,0.0252624014483386,-0.00528058882068535, + -1.51349218004138e-06,-0.0059548832993663,0.0370040323170038,-0.0390502063923481, + -1.56144048751861e-06,-0.00572931562116558,0.048745663185669,-0.0728198239640108, + -1.60938879489869e-06,-0.00550374794296482,0.0604872940543341,-0.106589441535674, + -1.65733710233429e-06,-0.00527818026476412,0.0722289249229993,-0.140359059107336, + -1.70528540979764e-06,-0.00505261258656331,0.0839705557916645,-0.174128676678999, + -1.75323371737202e-06,-0.00482704490836272,0.0957121866603297,-0.207898294250662, + -1.80118202458557e-06,-0.00460147723016169,0.107453817528995,-0.241667911822324, + -1.8491303321877e-06,-0.00437590955196132,0.11919544839766,-0.275437529393987, + -1.89707863951227e-06,-0.0041503418737604,0.130937079266325,-0.30920714696565, + -1.94502694689236e-06,-0.00392477419555948,0.14267871013499,-0.342976764537313, + -1.99297525438347e-06,-0.00369920651735889,0.154420341003656,-0.376746382108975, + -2.04092356187457e-06,-0.00347363883915808,0.166161971872321,-0.410515999680638, + -2.08887186942119e-06,-0.00324807116095749,0.177903602740986,-0.444285617252301, + -2.13682017669026e-06,-0.00302250348275668,0.189645233609651,-0.478055234823964, + -2.18476848423688e-06,-0.00279693580455631,0.201386864478316,-0.511824852395626, + -2.23271679145043e-06,-0.00257136812635483,0.213128495346982,-0.545594469967289, + -2.28066509888603e-06,-0.00234580044815402,0.224870126215647,-0.579364087538952, + -2.32861340643264e-06,-0.00212023276995388,0.236611757084312,-0.613133705110615, + -2.37656171397926e-06,-0.00189466509175329,0.248353387952977,-0.646903322682277, + -2.42451002163691e-06,-0.00166909741355248,0.260095018821642,-0.68067294025394, + -2.47245832851739e-06,-0.00144352973535122,0.271836649690307,-0.714442557825603, + -2.52040663661912e-06,-0.0012179620571513,0.283578280558972,-0.748212175397266, + -2.56835494349961e-06,-0.000992394378949157,0.295319911427638,-0.781981792968928, + -2.61630325071316e-06,-0.000766826700748346,0.307061542296303,-0.815751410540591, + -1.07906766994709e-06,-0.00616817972183895,0.0252559358611204,-0.00530296515732785, + -1.10905105556169e-06,-0.00595829925679961,0.0368801897736026,-0.0391440937958805, + -1.13903444118324e-06,-0.00574841879176025,0.0485044436860849,-0.0729852224344332, + -1.16901782679091e-06,-0.00553853832672085,0.0601286975985671,-0.106826351072986, + -1.19900121237082e-06,-0.00532865786168146,0.0717529515110493,-0.140667479711539, + -1.22898459806176e-06,-0.00511877739664213,0.0833772054235316,-0.174508608350091, + -1.25896798369718e-06,-0.0049088969316029,0.0950014593360137,-0.208349736988644, + -1.2889513690828e-06,-0.00469901646656312,0.106625713248496,-0.242190865627196, + -1.31893475469047e-06,-0.00448913600152401,0.118249967160978,-0.276031994265749, + -1.34891814052018e-06,-0.00427925553648456,0.129874221073461,-0.309873122904302, + -1.37890152596132e-06,-0.00406937507144534,0.141498474985942,-0.343714251542855, + -1.40888491145796e-06,-0.00385949460640567,0.153122728898425,-0.377555380181407, + -1.43886829717665e-06,-0.00364961414136622,0.164746982810907,-0.41139650881996, + -1.46885168289534e-06,-0.00343973367632699,0.176371236723389,-0.445237637458512, + -1.49883506850301e-06,-0.00322985321128777,0.187995490635872,-0.479078766097065, + -1.52881845383313e-06,-0.0030199727462481,0.199619744548354,-0.512919894735618, + -1.55880183982937e-06,-0.0028100922812091,0.211243998460836,-0.546761023374171, + -1.58878522515948e-06,-0.00260021181616921,0.222868252373319,-0.580602152012723, + -1.61876861060062e-06,-0.00239033135112976,0.234492506285801,-0.614443280651276, + -1.64875199659686e-06,-0.00218045088609076,0.246116760198283,-0.648284409289828, + -1.67873538248209e-06,-0.00197057042105175,0.257741014110765,-0.682125537928381, + -1.70871876747913e-06,-0.00176068995601186,0.269365268023247,-0.715966666566934, + -1.73870215314231e-06,-0.0015508094909733,0.280989521935729,-0.749807795205486, + -1.76868553858345e-06,-0.00134092902593297,0.292613775848212,-0.783648923844039, + -1.79866892446867e-06,-0.00113104856089352,0.304238029760694,-0.817490052482591, + -7.88248433407357e-07,-0.00615904771366496,0.0252510466753871,-0.00531967566949122, + -8.07243923386936e-07,-0.00596100914560357,0.036787450125136,-0.039214208338032, + -8.26239413387331e-07,-0.00576297057754227,0.0483238535748849,-0.0731087410065727, + -8.45234903401604e-07,-0.00556493200948088,0.0598602570246339,-0.107003273675114, + -8.64230393471388e-07,-0.00536689344141961,0.0713966604743828,-0.140897806343654, + -8.83225883541172e-07,-0.00516885487335828,0.0829330639241318,-0.174792339012195, + -9.02221373333401e-07,-0.00497081630529672,0.0944694673738807,-0.208686871680736, + -9.21216863458696e-07,-0.0047727777372355,0.10600587082363,-0.242581404349277, + -9.40212353084391e-07,-0.00457473916917361,0.117542274273379,-0.276475937017817, + -9.5920784337622e-07,-0.00437670060111273,0.129078677723128,-0.310370469686358, + -9.78203333334982e-07,-0.00417866203305128,0.140615081172876,-0.344265002354899, + -9.97198822960677e-07,-0.00398062346498929,0.152151484622626,-0.37815953502344, + -1.01619431336353e-06,-0.00378258489692884,0.163687888072374,-0.41205406769198, + -1.03518980326678e-06,-0.00358454632886684,0.175224291522124,-0.445948600360521, + -1.05418529317003e-06,-0.00338650776080596,0.186760694971872,-0.479843133029062, + -1.07318078323981e-06,-0.00318846919274463,0.198297098421621,-0.513737665697602, + -1.09217627308755e-06,-0.00299043062468285,0.20983350187137,-0.547632198366143, + -1.11117176337938e-06,-0.00279239205662174,0.221369905321119,-0.581526731034684, + -1.13016725333814e-06,-0.00259435348856041,0.232906308770868,-0.615421263703225, + -1.14916274340793e-06,-0.00239631492049908,0.244442712220617,-0.649315796371766, + -1.16815823325567e-06,-0.0021982763524373,0.255979115670366,-0.683210329040306, + -1.18715372310341e-06,-0.00200023778437552,0.267515519120115,-0.717104861708847, + -1.2061492137283e-06,-0.00180219921631553,0.279051922569864,-0.750999394377388, + -1.22514470346502e-06,-0.00160416064825331,0.290588326019613,-0.784893927045929, + -1.24414019331276e-06,-0.00140612208019197,0.302124729469362,-0.818788459714469, + -5.72414513677622e-07,-0.00615232617215074,0.0252474053070923,-0.00533200752270217, + -5.84649016172056e-07,-0.00596309611677742,0.03671887135759,-0.0392659507522268, + -5.96883518652613e-07,-0.00577386606140412,0.0481903374080877,-0.0731998939817515, + -6.09118021105415e-07,-0.00558463600603071,0.0596618034585855,-0.107133837211276, + -6.21352523516583e-07,-0.00539540595065729,0.0711332695090832,-0.141067780440801, + -6.33587025927751e-07,-0.00520617589528383,0.082604735559581,-0.175001723670325, + -6.45821528366675e-07,-0.00501694583991041,0.0940762016100787,-0.20893566689985, + -6.58056031055398e-07,-0.00482771578453745,0.105547667660576,-0.242869610129375, + -6.70290533466567e-07,-0.00463848572916414,0.117019133711074,-0.276803553358899, + -6.82525035988757e-07,-0.00444925567379073,0.128490599761572,-0.310737496588424, + -6.94759538344414e-07,-0.00426002561841732,0.139962065812069,-0.344671439817949, + -7.06994040811093e-07,-0.00407079556304368,0.151433531862567,-0.378605383047473, + -7.19228543555328e-07,-0.00388156550767071,0.162904997913065,-0.412539326276998, + -7.31463045577918e-07,-0.00369233545229686,0.174376463963563,-0.446473269506523, + -7.43697548211131e-07,-0.00350310539692367,0.18584793001406,-0.480407212736047, + -7.55932050955366e-07,-0.0033138753415507,0.197319396064558,-0.514341155965572, + -7.68166553588578e-07,-0.00312464528617751,0.208790862115056,-0.548275099195097, + -7.80401055888724e-07,-0.00293541523080409,0.220262328165553,-0.582209042424621, + -7.92635558299892e-07,-0.00274618517543068,0.231733794216051,-0.616142985654146, + -8.04870060489016e-07,-0.0025569551200566,0.243205260266549,-0.65007692888367, + -8.17104562900184e-07,-0.00236772506468386,0.254676726317046,-0.684010872113195, + -8.29339065866463e-07,-0.00217849500931067,0.266148192367544,-0.71794481534272, + -8.41573567944565e-07,-0.00198926495393748,0.277619658418041,-0.751878758572245, + -8.53808070133688e-07,-0.00180003489856295,0.28909112446854,-0.78581270180177, + -8.66042573099968e-07,-0.00161080484319065,0.300562590519037,-0.819746645031294, + -4.13869175520942e-07,-0.0061474187365574,0.0252447236841371,-0.00534102845601091, + -4.21889341600812e-07,-0.00596466965806236,0.0366686298337597,-0.0393038010947261, + -4.29909507757009e-07,-0.00578192057956745,0.0480925359833822,-0.0732665737334412, + -4.3792967382994e-07,-0.00559917150107236,0.0595164421330048,-0.107229346372156, + -4.45949840027771e-07,-0.00541642242257745,0.0709403482826274,-0.141192119010872, + -4.53970006031312e-07,-0.00523367334408242,0.0823642544322499,-0.175154891649587, + -4.61990172090365e-07,-0.00505092426558718,0.0937881605818727,-0.209117664288302, + -4.70010338315952e-07,-0.00486817518709237,0.105212066731495,-0.243080436927017, + -4.78030504458271e-07,-0.00468542610859746,0.116635972881118,-0.277043209565732, + -4.8605067054508e-07,-0.00450267703010254,0.12805987903074,-0.311005982204447, + -4.94070836298821e-07,-0.00431992795160707,0.139483785180363,-0.344968754843162, + -5.0209100238563e-07,-0.00413717887311194,0.150907691329985,-0.378931527481877, + -5.10111168861016e-07,-0.00395442979461746,0.162331597479608,-0.412894300120593, + -5.18131334836802e-07,-0.00377168071612233,0.17375550362923,-0.446857072759308, + -5.26151501145655e-07,-0.00358893163762763,0.185179409778853,-0.480819845398023, + -5.34171667232464e-07,-0.0034061825591325,0.196603315928475,-0.514782618036738, + -5.4219183320825e-07,-0.00322343348063736,0.208027222078098,-0.548745390675453, + -5.50211999628125e-07,-0.00304068440214289,0.219451128227721,-0.582708163314168, + -5.58232165936978e-07,-0.0028579353236482,0.230875034377343,-0.616670935952883, + -5.66252330913564e-07,-0.00267518624515128,0.242298940526966,-0.650633708591598, + -5.74272497333439e-07,-0.00249243716665681,0.253722846676589,-0.684596481230314, + -5.82292663975359e-07,-0.00230968808816279,0.265146752826211,-0.718559253869029, + -5.90312829396034e-07,-0.00212693900966698,0.276570658975833,-0.752522026507744, + -5.98332995704887e-07,-0.00194418993117251,0.287994565125456,-0.786484799146459, + -6.06353162346807e-07,-0.0017614408526776,0.299418471275079,-0.820447571785174, + -1.88214363341863e-05,-0.00685505252793257,0.0372352849382559,-0.0183293921652007, + -2.19693087145506e-05,-0.00617600832893198,0.053071722954117,-0.0485726429861822, + -2.51171810948525e-05,-0.00549696412993123,0.0689081609699782,-0.0788158938071636, + -2.82650534750573e-05,-0.00481791993093039,0.0847445989858394,-0.109059144628145, + -3.14129258554563e-05,-0.00413887573192984,0.100581037001701,-0.139302395449127, + -3.45607982356055e-05,-0.00345983153292906,0.116417475017562,-0.169545646270108, + -3.77086706160323e-05,-0.00278078733392839,0.132253913033423,-0.199788897091089, + -4.08565429965146e-05,-0.00210174313492795,0.148090351049284,-0.230032147912071, + -4.40044153765529e-05,-0.00142269893592695,0.163926789065145,-0.260275398733052, + -4.71522877570352e-05,-0.000743654736926391,0.179763227081006,-0.290518649554034, + -5.03001601370734e-05,-6.46105379251694e-05,0.195599665096868,-0.320761900375015, + -5.34480325177777e-05,0.000614433661074942,0.211436103112729,-0.351005151195997, + -5.65959048976494e-05,0.00129347786007616,0.22727254112859,-0.381248402016978, + -5.97437772780762e-05,0.00197252205907672,0.243108979144451,-0.41149165283796, + -6.28916496586696e-05,0.00265156625807705,0.258945417160312,-0.441734903658941, + -6.60395220386523e-05,0.00333061045707805,0.274781855176173,-0.471978154479923, + -6.91873944190791e-05,0.00400965465607883,0.290618293192035,-0.502221405300904, + -7.23352667991728e-05,0.00468869885507983,0.306454731207896,-0.532464656121886, + -7.54831391794886e-05,0.00536774305408039,0.322291169223757,-0.562707906942867, + -7.86310115603595e-05,0.00604678725308005,0.338127607239618,-0.592951157763849, + -8.17788839406752e-05,0.00672583145208128,0.353964045255479,-0.62319440858483, + -8.49267563204359e-05,0.0074048756510825,0.369800483271341,-0.653437659405811, + -8.80746287010847e-05,0.00808391985008283,0.385636921287202,-0.683680910226793, + -9.12225010808454e-05,0.00876296404908405,0.401473359303063,-0.713924161047774, + -9.43703734609391e-05,0.00944200824808528,0.417309797318924,-0.744167411868756, + -1.87366418219342e-05,-0.00684975478369067,0.0372263427390231,-0.0183417609263533, + -2.18564035990298e-05,-0.00617246373150038,0.0530393725162785,-0.0486008942974748, + -2.49761653760283e-05,-0.00549517267930999,0.0688524022935339,-0.0788600276685963, + -2.80959271531378e-05,-0.00481788162711977,0.0846654320707892,-0.109119161039718, + -3.12156889302473e-05,-0.00414059057492955,0.100478461848044,-0.139378294410839, + -3.4335450707107e-05,-0.00346329952273894,0.1162914916253,-0.169637427781961, + -3.7455212484383e-05,-0.00278600847054877,0.132104521402555,-0.199896561153082, + -4.05749742612982e-05,-0.00210871741835839,0.147917551179811,-0.230155694524204, + -4.36947360384354e-05,-0.00143142636616844,0.163730580957066,-0.260414827895325, + -4.68144978154617e-05,-0.000754135313977833,0.179543610734321,-0.290673961266447, + -4.99342595923769e-05,-7.68442617873344e-05,0.195356640511577,-0.320933094637568, + -5.30540213692365e-05,0.000600446790403275,0.211169670288832,-0.35119222800869, + -5.61737831464293e-05,0.00127773784259322,0.226982700066087,-0.381451361379811, + -5.9293544923622e-05,0.00195502889478383,0.242795729843343,-0.411710494750933, + -6.24133067010924e-05,0.00263231994697355,0.258608759620598,-0.441969628122054, + -6.55330684780076e-05,0.00330961099916349,0.274421789397853,-0.472228761493176, + -6.86528302548117e-05,0.00398690205135432,0.290234819175109,-0.502487894864297, + -7.1772592031949e-05,0.00466419310354449,0.306047848952364,-0.532747028235419, + -7.48923538085311e-05,0.00534148415573532,0.32186087872962,-0.56300616160654, + -7.80121155858904e-05,0.00601877520792549,0.337673908506875,-0.593265294977662, + -8.11318773628056e-05,0.00669606626011587,0.35348693828413,-0.623524428348783, + -8.42516391402759e-05,0.00737335731230582,0.369299968061386,-0.653783561719905, + -8.73714009170801e-05,0.0080506483644962,0.385112997838641,-0.684042695091026, + -9.04911626937732e-05,0.00872793941668748,0.400926027615897,-0.714301828462148, + -9.36109244710215e-05,0.00940523046887742,0.416739057393152,-0.744560961833269, + -1.86192833677642e-05,-0.00684244467215672,0.0372139665350253,-0.0183588529880309, + -2.17003591440612e-05,-0.00616759190513824,0.0529946244144051,-0.0486399340322654, + -2.47814349203651e-05,-0.00549273913811976,0.0687752822937849,-0.0789210150764998, + -2.78625106967523e-05,-0.00481788637110131,0.0845559401731646,-0.109202096120734, + -3.09435864731256e-05,-0.00414303360408297,0.100336598052544,-0.139483177164969, + -3.40246622494156e-05,-0.00346818083706446,0.116117255931924,-0.169764258209203, + -3.71057380255668e-05,-0.00279332807004573,0.131897913811304,-0.200045339253438, + -4.01868138019124e-05,-0.00211847530302745,0.147678571690684,-0.230326420297672, + -4.32678895783689e-05,-0.00144362253600905,0.163459229570063,-0.260607501341907, + -4.63489653548255e-05,-0.000768769768990873,0.179239887449443,-0.290888582386141, + -4.943004113106e-05,-9.39170019722546e-05,0.195020545328823,-0.321169663430376, + -5.2511116907128e-05,0.000580935765046586,0.210801203208203,-0.35145074447461, + -5.55921926835845e-05,0.00125578853206476,0.226581861087582,-0.381731825518845, + -5.86732684600966e-05,0.00193064129908316,0.242362518966962,-0.412012906563079, + -6.17543442361645e-05,0.00260549406610155,0.258143176846342,-0.442293987607314, + -6.48354200128987e-05,0.00328034683311951,0.273923834725721,-0.472575068651548, + -6.79164957891887e-05,0.00395519960013813,0.289704492605101,-0.502856149695783, + -7.09975715654787e-05,0.00463005236715697,0.305485150484481,-0.533137230740017, + -7.40786473417687e-05,0.00530490513417536,0.321265808363861,-0.563418311784251, + -7.71597231180587e-05,0.00597975790119376,0.337046466243241,-0.593699392828486, + -8.02407988945708e-05,0.00665461066821216,0.352827124122621,-0.62398047387272, + -8.33218746706388e-05,0.007329463435231,0.368607782002,-0.654261554916955, + -8.64029504470398e-05,0.00800431620224895,0.38438843988138,-0.684542635961189, + -8.94840262234409e-05,0.00867916896926735,0.40016909776076,-0.714823717005424, + -9.2565102000064e-05,0.0093540217362853,0.415949755640139,-0.745104798049659, + -1.84575372020879e-05,-0.00683241166888501,0.0371969096452189,-0.0183823589785741, + -2.1485713185318e-05,-0.00616094185344759,0.0529330010553548,-0.0486936237306827, + -2.45138891684926e-05,-0.00548947203801003,0.0686690924654907,-0.0790048884827912, + -2.75420651517089e-05,-0.00481800222257261,0.0844051838756265,-0.1093161532349, + -3.05702411349806e-05,-0.00414653240713514,0.100141275285762,-0.139627417987008, + -3.35984171181691e-05,-0.00347506259169783,0.115877366695898,-0.169938682739117, + -3.66265931014409e-05,-0.0028035927762603,0.131613458106034,-0.200249947491225, + -3.96547690846294e-05,-0.00213212296082288,0.14734954951617,-0.230561212243334, + -4.26829450678734e-05,-0.00146065314538546,0.163085640926306,-0.260872476995442, + -4.57111210511729e-05,-0.000789183329947929,0.178821732336442,-0.291183741747551, + -4.87392970341394e-05,-0.000117713514510065,0.194557823746578,-0.321495006499659, + -5.17674730172724e-05,0.000553756300927244,0.210293915156713,-0.351806271251768, + -5.47956490006829e-05,0.00122522611636455,0.226030006566849,-0.382117536003877, + -5.78238249840379e-05,0.00189669593180186,0.241766097976985,-0.412428800755985, + -6.08520009670599e-05,0.00256816574723939,0.257502189387121,-0.442740065508094, + -6.38801769502484e-05,0.00323963556267715,0.273238280797257,-0.473051330260202, + -6.69083529335479e-05,0.00391110537811445,0.288974372207393,-0.503362595012311, + -6.99365289167364e-05,0.00458257519355176,0.304710463617528,-0.533673859764419, + -7.29647048999249e-05,0.00525404500898952,0.320446555027665,-0.563985124516528, + -7.59928808832244e-05,0.00592551482442705,0.3361826464378,-0.594296389268636, + -7.90210568660799e-05,0.0065969846398648,0.351918737847936,-0.624607654020745, + -8.20492328499345e-05,0.00726845445530122,0.367654829258072,-0.654918918772853, + -8.5077408833345e-05,0.00793992427073809,0.383390920668207,-0.685230183524962, + -8.81055848157564e-05,0.00861139408617717,0.399127012078344,-0.71554144827707, + -9.11337607991669e-05,0.00928286390161448,0.41486310348848,-0.745852713029179, + -1.82359026973528e-05,-0.0068187423677884,0.0371735380238382,-0.0184144733187535, + -2.11923778945938e-05,-0.00615194997760457,0.0528486543261413,-0.0487669756379732, + -2.4148853091821e-05,-0.00548515758742074,0.0685237706284444,-0.0791194779571929, + -2.71053282892286e-05,-0.00481836519723722,0.0841988869307474,-0.109471980276413, + -3.00618034866085e-05,-0.00415157280705358,0.0998740032330505,-0.139824482595632, + -3.30182786838773e-05,-0.00348478041686973,0.115549119535354,-0.170176984914852, + -3.59747538810629e-05,-0.00281798802668609,0.131224235837657,-0.200529487234072, + -3.89312290784427e-05,-0.00215119563650235,0.14689935213996,-0.230881989553292, + -4.18877042758226e-05,-0.00148440324631871,0.162574468442263,-0.261234491872511, + -4.48441794729804e-05,-0.000817610856134965,0.178249584744566,-0.291586994191731, + -4.78006546705267e-05,-0.000150818465951552,0.193924701046869,-0.321939496510951, + -5.0757129867629e-05,0.000515973924232638,0.209599817349172,-0.35229199883017, + -5.37136050651754e-05,0.00118276631441594,0.225274933651475,-0.38264450114939, + -5.66700802620557e-05,0.00184955870460035,0.240950049953778,-0.41299700346861, + -5.96265554598796e-05,0.00251635109478343,0.256625166256081,-0.443349505787829, + -6.25830306567599e-05,0.0031831434849674,0.272300282558384,-0.473702008107049, + -6.55395058540842e-05,0.00384993587515092,0.287975398860687,-0.504054510426269, + -6.84959810511865e-05,0.00451672826533511,0.30365051516299,-0.534407012745489, + -7.14524562486218e-05,0.00518352065551841,0.319325631465293,-0.564759515064708, + -7.44089314462792e-05,0.00585031304570194,0.335000747767596,-0.595112017383928, + -7.73654066436036e-05,0.00651710543588546,0.350675864069899,-0.625464519703148, + -8.03218818407059e-05,0.00718389782606943,0.366350980372202,-0.655817022022367, + -8.32783570380302e-05,0.00785069021625295,0.382026096674505,-0.686169524341587, + -8.62348322353546e-05,0.00851748260643692,0.397701212976808,-0.716522026660807, + -8.91913074322348e-05,0.00918427499662089,0.413376329279111,-0.746874528980027, + -1.79346047260026e-05,-0.00680030432163194,0.0371417678314268,-0.0184579555447157, + -2.07950609872887e-05,-0.00613994738454396,0.0527341638745772,-0.0488662927713706, + -2.36555172485886e-05,-0.005479590447456,0.0683265599177277,-0.0792746299980255, + -2.65159735098608e-05,-0.00481923351036806,0.0839189559608781,-0.10968296722468, + -2.93764297711607e-05,-0.00415887657328007,0.0995113520040287,-0.140091304451335, + -3.22368860323219e-05,-0.00349851963619197,0.115103748047179,-0.17049964167799, + -3.50973422939549e-05,-0.00283816269910442,0.130696144090329,-0.200907978904645, + -3.79577985551438e-05,-0.00217780576201632,0.14628854013348,-0.2313163161313, + -4.08182548163882e-05,-0.00151744882492832,0.16188093617663,-0.261724653357955, + -4.36787110777992e-05,-0.000857091887840555,0.177473332219781,-0.29213299058461, + -4.65391673391546e-05,-0.000196734950752564,0.193065728262931,-0.322541327811265, + -4.9399623600177e-05,0.000463621986335871,0.208658124306082,-0.35294966503792, + -5.2260079861588e-05,0.00112397892342342,0.224250520349232,-0.383358002264575, + -5.512053612311e-05,0.00178433586051119,0.239842916392383,-0.413766339491229, + -5.79809923841879e-05,0.0024446927975994,0.255435312435533,-0.444174676717884, + -6.08414486454878e-05,0.00310504973468717,0.271027708478684,-0.474583013944539, + -6.37019049071208e-05,0.00376540667177472,0.286620104521834,-0.504991351171194, + -6.65623611679766e-05,0.0044257636088636,0.302212500564985,-0.535399688397849, + -6.94228174293876e-05,0.00508612054595137,0.317804896608135,-0.565808025624504, + -7.22832736904655e-05,0.00574647748303958,0.333397292651286,-0.596216362851159, + -7.51437299522095e-05,0.00640683442012691,0.348989688694436,-0.626624700077814, + -7.80041862128433e-05,0.00706719135721556,0.364582084737586,-0.657033037304469, + -8.08646424746984e-05,0.00772754829430289,0.380174480780737,-0.687441374531124, + -8.37250987359983e-05,0.00838790523139066,0.395766876823887,-0.717849711757778, + -8.65855549972983e-05,0.00904826216847932,0.411359272867038,-0.748258048984433, + -1.75293962865336e-05,-0.00677576723881289,0.0370990460173373,-0.0185161179004411, + -2.02633523189166e-05,-0.00612420253475468,0.0525805047211186,-0.0489991405802043, + -2.29973083512441e-05,-0.0054726378306964,0.0680619634249,-0.0794821632599674, + -2.57312643835717e-05,-0.00482107312663815,0.0835434221286812,-0.109965185939731, + -2.84652204158575e-05,-0.00416950842257968,0.0990248808324627,-0.140448208619494, + -3.11991764481434e-05,-0.00351794371852143,0.114506339536244,-0.170931231299257, + -3.39331324807346e-05,-0.0028663790144634,0.129987798240025,-0.20141425397902, + -3.66670885128539e-05,-0.00221481431040504,0.145469256943807,-0.231897276658783, + -3.94010445453619e-05,-0.00156324960634668,0.160950715647588,-0.262380299338546, + -4.21350005775367e-05,-0.000911684902288434,0.176432174351369,-0.29286332201831, + -4.48689566101002e-05,-0.000260120198230407,0.19191363305515,-0.323346344698073, + -4.76029126424415e-05,0.000391444505827732,0.207395091758932,-0.353829367377836, + -5.03368686746164e-05,0.00104300920988654,0.222876550462713,-0.384312390057599, + -5.30708247066247e-05,0.00169457391394512,0.238358009166495,-0.414795412737362, + -5.58047807394102e-05,0.00234613861800304,0.253839467870276,-0.445278435417126, + -5.85387367717516e-05,0.00299770332206117,0.269320926574057,-0.475761458096889, + -6.1272692804204e-05,0.00364926802611931,0.284802385277839,-0.506244480776652, + -6.40066488362123e-05,0.00430083273017789,0.30028384398162,-0.536727503456415, + -6.67406048686647e-05,0.00495239743423603,0.315765302685401,-0.567210526136178, + -6.94745609011171e-05,0.00560396213829417,0.331246761389183,-0.597693548815941, + -7.22085169332365e-05,0.00625552684235275,0.346728220092964,-0.628176571495704, + -7.4942472966022e-05,0.00690709154641045,0.362209678796745,-0.658659594175468, + -7.76764289983634e-05,0.00755865625046859,0.377691137500526,-0.689142616855231, + -8.04103850307047e-05,0.00821022095452673,0.393172596204307,-0.719625639534994, + -8.31443410631572e-05,0.00886178565858531,0.408654054908089,-0.750108662214757, + -1.69922629897207e-05,-0.00674369450186987,0.0370424276515967,-0.0185926635691099, + -1.9563170846032e-05,-0.0061040222919802,0.0523773798652408,-0.0491739774524651, + -2.21340787024266e-05,-0.00546435008209067,0.0677123320788847,-0.0797552913358204, + -2.47049865587934e-05,-0.00482467787220103,0.0830472842925288,-0.110336605219176, + -2.72758944151186e-05,-0.00418500566231128,0.0983822365061729,-0.140917919102531, + -2.9846802271416e-05,-0.0035453334524217,0.113717188719817,-0.171499232985886, + -3.24177101278522e-05,-0.002905661242532,0.129052140933461,-0.202080546869242, + -3.49886179841774e-05,-0.00226598903264241,0.144387093147105,-0.232661860752597, + -3.75595258406691e-05,-0.00162631682275294,0.159722045360749,-0.263243174635952, + -4.01304336968833e-05,-0.000986644612863241,0.175056997574393,-0.293824488519308, + -4.27013415530975e-05,-0.000346972402973433,0.190391949788037,-0.324405802402663, + -4.52722494096447e-05,0.000292699806916152,0.205726902001681,-0.354987116286018, + -4.78431572659699e-05,0.000932372016805516,0.221061854215325,-0.385568430169373, + -5.04140651225171e-05,0.00157204422669488,0.236396806428969,-0.416149744052729, + -5.29849729786758e-05,0.00221171643658491,0.251731758642613,-0.446731057936084, + -5.55558808349454e-05,0.00285138864647472,0.267066710856257,-0.477312371819439, + -5.81267886915482e-05,0.00349106085636408,0.282401663069901,-0.507893685702795, + -6.06976965478179e-05,0.00413073306625367,0.297736615283545,-0.53847499958615, + -6.32686044041986e-05,0.00477040527614325,0.313071567497189,-0.569056313469505, + -6.58395122608013e-05,0.00541007748603284,0.328406519710833,-0.599637627352861, + -6.8410420117071e-05,0.0060497496959222,0.343741471924477,-0.630218941236216, + -7.09813279733407e-05,0.00668942190581268,0.359076424138122,-0.660800255119571, + -7.35522358296103e-05,0.00732909411570182,0.374411376351766,-0.691381569002926, + -7.612314368588e-05,0.00796876632559185,0.38974632856541,-0.721962882886282, + -7.86940515423717e-05,0.00860843853548099,0.405081280779054,-0.752544196769637, + -1.62937396231272e-05,-0.0067027433278069,0.0369688261835577,-0.018691278456884, + -1.86604746705704e-05,-0.00607893113012178,0.0521141854907746,-0.0493992223139529, + -2.10272097180136e-05,-0.00545511893243666,0.0672595447979915,-0.0801071661710218, + -2.33939447654985e-05,-0.00483130673475157,0.0824049041052085,-0.110815110028091, + -2.57606798129972e-05,-0.00420749453706659,0.0975502634124253,-0.14152305388516, + -2.81274148602184e-05,-0.00358368233938122,0.112695622719642,-0.172230997742229, + -3.04941499078559e-05,-0.0029598701416963,0.127840982026859,-0.202938941599298, + -3.28608849553547e-05,-0.00233605794401126,0.142986341334076,-0.233646885456367, + -3.52276200029089e-05,-0.00171224574632622,0.158131700641293,-0.264354829313435, + -3.75943550502411e-05,-0.00108843354864108,0.17327705994851,-0.295062773170504, + -3.99610900979064e-05,-0.000464621350956262,0.188422419255727,-0.325770717027573, + -4.23278251451276e-05,0.000159190846729551,0.203567778562944,-0.356478660884642, + -4.46945601925153e-05,0.000783003044414032,0.21871313787016,-0.387186604741711, + -4.70612952400695e-05,0.0014068152420994,0.233858497177378,-0.41789454859878, + -4.94280302876238e-05,0.00203062743978433,0.249003856484594,-0.448602492455849, + -5.17947653349005e-05,0.0026544396374697,0.264149215791811,-0.479310436312918, + -5.41615003825102e-05,0.00327825183515484,0.279294575099029,-0.510018380169987, + -5.6528235430342e-05,0.00390206403283933,0.294439934406245,-0.540726324027056, + -5.88949704776187e-05,0.00452587623052447,0.309585293713462,-0.571434267884125, + -6.12617055247844e-05,0.00514968842821051,0.324730653020679,-0.602142211741194, + -6.36284405725052e-05,0.00577350062589455,0.339876012327896,-0.632850155598263, + -6.5995175620337e-05,0.00639731282357925,0.355021371635113,-0.663558099455332, + -6.83619106673916e-05,0.00702112502126484,0.37016673094233,-0.6942660433124, + -7.07286457145573e-05,0.00764493721895088,0.385312090249547,-0.724973987169469, + -7.3095380762167e-05,0.00826874941663558,0.400457449556764,-0.755681931026538, + -1.54075864325573e-05,-0.00665199721018116,0.0368755166188757,-0.0188148945336712, + -1.75280170387065e-05,-0.00604892369816176,0.0517818705359336,-0.0496815720354004, + -1.96484476449321e-05,-0.00544585018614246,0.0666882244529914,-0.0805482495371296, + -2.17688782510328e-05,-0.00484277667412297,0.0815945783700494,-0.111414927038859, + -2.3889308857189e-05,-0.00423970316210354,0.0965009322871072,-0.142281604540588, + -2.60097394632897e-05,-0.00363662965008404,0.111407286204165,-0.173148282042317, + -2.81301700693071e-05,-0.00303355613806455,0.126313640121223,-0.204014959544047, + -3.02506006756298e-05,-0.00243048262604539,0.141219994038281,-0.234881637045776, + -3.23710312818415e-05,-0.00182740911402601,0.156126347955339,-0.265748314547505, + -3.44914618879977e-05,-0.00122433560200674,0.171032701872396,-0.296614992049234, + -3.66118924940428e-05,-0.000621262089987029,0.185939055789454,-0.327481669550963, + -3.87323231005321e-05,-1.81885779682034e-05,0.200845409706512,-0.358348347052693, + -4.08527537067993e-05,0.000584884934051288,0.21575176362357,-0.389215024554422, + -4.29731843128445e-05,0.00118795844607056,0.230658117540628,-0.420081702056151, + -4.50936149192227e-05,0.00179103195808961,0.245564471457685,-0.450948379557881, + -4.72140455248793e-05,0.00239410547010954,0.260470825374743,-0.48181505705961, + -4.9334476131091e-05,0.00299717898212926,0.275377179291802,-0.512681734561339, + -5.14549067375247e-05,0.00360025249414808,0.290283533208859,-0.543548412063068, + -5.35753373431813e-05,0.00420332600616824,0.305189887125918,-0.574415089564797, + -5.56957679497261e-05,0.00480639951818684,0.320096241042975,-0.605281767066527, + -5.78161985562708e-05,0.00540947303020634,0.335002594960033,-0.636148444568256, + -5.99366291622605e-05,0.00601254654222538,0.349908948877091,-0.667015122069985, + -6.20570597681391e-05,0.00661562005424532,0.364815302794149,-0.697881799571714, + -6.41774903740178e-05,0.00721869356626526,0.379721656711207,-0.728748477073443, + -6.62979209800074e-05,0.0078217670782843,0.394628010628264,-0.759615154575173, + -1.43181155143612e-05,-0.00659140106304036,0.0367609212111324,-0.018964640389785, + -1.61550505929503e-05,-0.00601472995701616,0.0513757431305874,-0.0500236044138784, + -1.79919856715394e-05,-0.00543805885099197,0.0659905650500425,-0.0810825684379719, + -1.98289207502811e-05,-0.00486138774496792,0.0806053869694975,-0.112141532462065, + -2.1665855828884e-05,-0.00428471663894381,0.0952202088889524,-0.143200496486159, + -2.35027909075425e-05,-0.0037080455329197,0.109835030808407,-0.174259460510252, + -2.53397259862287e-05,-0.00313137442689571,0.124449852727862,-0.205318424534346, + -2.71766610647206e-05,-0.00255470332087127,0.139064674647318,-0.236377388558439, + -2.90135961433236e-05,-0.00197803221484727,0.153679496566772,-0.267436352582533, + -3.0850531222204e-05,-0.00140136110882327,0.168294318486227,-0.298495316606626, + -3.2687466300918e-05,-0.000824690002799278,0.182909140405682,-0.329554280630719, + -3.45244013796875e-05,-0.000248018896775504,0.197523962325137,-0.360613244654813, + -3.63613364581794e-05,0.000328652209249158,0.212138784244593,-0.391672208678906, + -3.81982715365048e-05,0.000905323315273376,0.226753606164047,-0.422731172703, + -4.00352066155518e-05,0.00148199442129715,0.241368428083502,-0.453790136727093, + -4.18721416935997e-05,0.00205866552732226,0.255983250002958,-0.484849100751187, + -4.37090767724246e-05,0.00263533663334559,0.270598071922412,-0.51590806477528, + -4.55460118512496e-05,0.00321200773937003,0.285212893841868,-0.546967028799374, + -4.73829469300746e-05,0.00378867884539424,0.299827715761323,-0.578025992823467, + -4.92198820079004e-05,0.00436534995141891,0.314442537680778,-0.60908495684756, + -5.10568170869474e-05,0.00494202105744268,0.329057359600233,-0.640143920871654, + -5.28937521658834e-05,0.00551869216346601,0.343672181519687,-0.671202884895747, + -5.47306872443754e-05,0.00609536326949067,0.358287003439143,-0.702261848919841, + -5.65676223228673e-05,0.00667203437551445,0.372901825358597,-0.733320812943934, + -5.84045574021363e-05,0.00724870548153778,0.387516647278052,-0.764379776968028, + -1.30291705836005e-05,-0.00652217453444938,0.0366255656968742,-0.0191387034144726, + -1.45579484050751e-05,-0.00597795876668852,0.0508987517815769,-0.050421179290967, + -1.60867262264802e-05,-0.00543374299892763,0.0651719378662797,-0.0817036551674614, + -1.76155040479409e-05,-0.00488952723116676,0.0794451239509824,-0.112986131043956, + -1.91442818693044e-05,-0.00434531146340589,0.0937183100356851,-0.14426860692045, + -2.06730596907512e-05,-0.00380109569564491,0.107991496120388,-0.175551082796945, + -2.22018375121702e-05,-0.00325687992788404,0.122264682205091,-0.206833558673439, + -2.37306153336725e-05,-0.0027126641601235,0.136537868289793,-0.238116034549934, + -2.52593931549527e-05,-0.00216844839236219,0.150811054374496,-0.269398510426428, + -2.67881709765105e-05,-0.00162423262460143,0.165084240459199,-0.300680986302922, + -2.83169487977908e-05,-0.00108001685684034,0.179357426543902,-0.331963462179417, + -2.98457266190155e-05,-0.000535801089079246,0.193630612628604,-0.363245938055911, + -3.13745044409064e-05,8.41467868095691e-06,0.207903798713307,-0.394528413932406, + -3.29032822621311e-05,0.00055263044644227,0.22217698479801,-0.4258108898089, + -3.44320600835779e-05,0.00109684621420314,0.236450170882713,-0.457093365685395, + -3.59608379052467e-05,0.00164106198196357,0.250723356967415,-0.488375841561889, + -3.74896157261384e-05,0.0021852777497251,0.264996543052118,-0.519658317438383, + -3.90183935481403e-05,0.00272949351748553,0.279269729136821,-0.550940793314878, + -4.05471713694761e-05,0.00327370928524617,0.293542915221523,-0.582223269191372, + -4.20759491905898e-05,0.00381792505300815,0.307816101306227,-0.613505745067867, + -4.36047270119255e-05,0.0043621408207688,0.322089287390929,-0.644788220944361, + -4.51335048340384e-05,0.00490635658852812,0.336362473475631,-0.676070696820856, + -4.66622826553742e-05,0.00545057235628965,0.350635659560334,-0.70735317269735, + -4.81910604762659e-05,0.00599478812405119,0.364908845645038,-0.738635648573844, + -4.97198382976016e-05,0.00653900389181183,0.37918203172974,-0.769918124450339, + -1.1571773419268e-05,-0.00644698744831899,0.0364728765592646,-0.0193315834815309, + -1.27872832081238e-05,-0.00594095685927656,0.0503640259712118,-0.0508617339066942, + -1.40027929969727e-05,-0.00543492627023401,0.064255175383159,-0.0823918843318574, + -1.52183027858632e-05,-0.00492889568119159,0.0781463247951061,-0.113922034757021, + -1.64338125747676e-05,-0.00442286509214906,0.0920374742070534,-0.145452185182184, + -1.76493223636442e-05,-0.00391683450310665,0.105928623619001,-0.176982335607347, + -1.88648321524654e-05,-0.00341080391406423,0.119819773030948,-0.208512486032511, + -2.0080341941342e-05,-0.00290477332502181,0.133710922442895,-0.240042636457674, + -2.12958517299411e-05,-0.00239874273597895,0.147602071854842,-0.271572786882837, + -2.25113615188732e-05,-0.00189271214693632,0.161493221266789,-0.303102937308, + -2.37268713078054e-05,-0.00138668155789423,0.175384370678736,-0.334633087733164, + -2.4942381096793e-05,-0.000880650968851926,0.189275520090683,-0.366163238158327, + -2.61578908855586e-05,-0.000374620379809176,0.203166669502631,-0.39769338858349, + -2.73734006746573e-05,0.000131410209233129,0.217057818914578,-0.429223539008653, + -2.85889104632009e-05,0.000637440798275879,0.230948968326525,-0.460753689433817, + -2.9804420252133e-05,0.00114347138731841,0.244840117738472,-0.49228383985898, + -3.10199300408431e-05,0.00164950197636071,0.258731267150419,-0.523813990284143, + -3.22354398297753e-05,0.00215553256540324,0.272622416562367,-0.555344140709307, + -3.34509496190405e-05,0.00266156315444532,0.286513565974314,-0.58687429113447, + -3.46664594077506e-05,0.00316759374348763,0.300404715386261,-0.618404441559633, + -3.58819691965717e-05,0.00367362433253016,0.314295864798208,-0.649934591984797, + -3.70974789849488e-05,0.00417965492157357,0.328187014210156,-0.68146474240996, + -3.83129887741029e-05,0.00468568551061566,0.342078163622102,-0.712994892835123, + -3.95284985629241e-05,0.00519171609965774,0.355969313034049,-0.744525043260286, + -4.07440083520783e-05,0.00569774668869982,0.369860462445996,-0.77605519368545, + -1.00059536845415e-05,-0.00636969301938656,0.0363093321376009,-0.019534309837596, + -1.09259525469946e-05,-0.00590631936602409,0.0497950121854411,-0.0513247782909903, + -1.18459514094615e-05,-0.00544294571266168,0.0632806922332813,-0.0831152467443846, + -1.27659502718869e-05,-0.00497957205929911,0.0767663722811217,-0.114905715197779, + -1.36859491342844e-05,-0.00451619840593664,0.0902520523289619,-0.146696183651173, + -1.46059479967098e-05,-0.00405282475257407,0.103737732376802,-0.178486652104568, + -1.55259468589963e-05,-0.00358945109921138,0.117223412424643,-0.210277120557962, + -1.64459457215882e-05,-0.00312607744584914,0.130709092472483,-0.242067589011356, + -1.7365944583958e-05,-0.00266270379248645,0.144194772520323,-0.273858057464751, + -1.82859434463278e-05,-0.0021993301391241,0.157680452568163,-0.305648525918145, + -1.92059423088642e-05,-0.00173595648576153,0.171166132616004,-0.337438994371539, + -2.01259411712895e-05,-0.00127258283239917,0.184651812663844,-0.369229462824934, + -2.10459400337148e-05,-0.000809209179036596,0.198137492711684,-0.401019931278328, + -2.19659388960847e-05,-0.000345835525674243,0.211623172759524,-0.432810399731722, + -2.28859377583435e-05,0.000117538127688555,0.225108852807365,-0.464600868185117, + -2.38059366209908e-05,0.00058091178105113,0.238594532855205,-0.496391336638511, + -2.47259354831941e-05,0.00104428543441371,0.252080212903045,-0.528181805091905, + -2.56459343456195e-05,0.00150765908777606,0.265565892950885,-0.5599722735453, + -2.65659332080448e-05,0.00197103274113841,0.279051572998726,-0.591762741998694, + -2.74859320706922e-05,0.00243440639450099,0.292537253046566,-0.623553210452088, + -2.84059309331175e-05,0.00289778004786356,0.306022933094406,-0.655343678905482, + -2.93259297952098e-05,0.00336115370122636,0.319508613142247,-0.687134147358877, + -3.02459286580792e-05,0.00382452735458827,0.332994293190087,-0.718924615812271, + -3.11659275201714e-05,0.00428790100795151,0.346479973237928,-0.750715084265666, + -3.20859263820417e-05,0.00475127466131431,0.359965653285768,-0.78250555271906, + -8.41328971042804e-06,-0.00629460181127853,0.0361436069563478,-0.0197358841021053, + -9.07577024131245e-06,-0.00587621167600946,0.0492221281791086,-0.0517851911993628, + -9.73825077225932e-06,-0.00545782154074048,0.0623006494018693,-0.0838344982966202, + -1.04007313031229e-05,-0.00503943140547136,0.0753791706246301,-0.115883805393878, + -1.10632118339726e-05,-0.00462104127020224,0.0884576918473909,-0.147933112491135, + -1.17256923649889e-05,-0.00420265113493334,0.101536213070152,-0.179982419588393, + -1.23881728957831e-05,-0.003784260999664,0.114614734292913,-0.21203172668565, + -1.30506534267161e-05,-0.00336587086439522,0.127693255515673,-0.244081033782908, + -1.37131339577046e-05,-0.00294748072912598,0.140771776738434,-0.276130340880165, + -1.4375614488582e-05,-0.00252909059385709,0.153850297961195,-0.308179647977422, + -1.5038095019293e-05,-0.00211070045858786,0.166928819183955,-0.34022895507468, + -1.57005755503925e-05,-0.00169231032331907,0.180007340406716,-0.372278262171937, + -1.63630560812145e-05,-0.00127392018804984,0.193085861629477,-0.404327569269195, + -1.70255366120364e-05,-0.000855530052780828,0.206164382852238,-0.436376876366452, + -1.76880171428584e-05,-0.000437139917511375,0.219242904074999,-0.46842618346371, + -1.83504976737359e-05,-1.87497822421445e-05,0.23232142529776,-0.500475490560967, + -1.90129782047244e-05,0.000399640353026864,0.245399946520521,-0.532524797658224, + -1.96754587356018e-05,0.000818030488295651,0.258478467743281,-0.564574104755482, + -2.03379392664793e-05,0.00123642062356466,0.271556988966042,-0.596623411852739, + -2.10004197976899e-05,0.00165481075883323,0.284635510188802,-0.628672718949997, + -2.16629003289004e-05,0.00207320089410246,0.297714031411563,-0.660722026047254, + -2.23253808592228e-05,0.00249159102937169,0.310792552634324,-0.692771333144512, + -2.29878613902113e-05,0.00290998116464047,0.323871073857084,-0.724820640241769, + -2.36503419210887e-05,0.0033283712999097,0.336949595079845,-0.756869947339027, + -2.43128224518552e-05,0.00374676143517894,0.350028116302606,-0.788919254436284, + -6.88102790130651e-06,-0.00622555647263549,0.0359848381938962,-0.0199255525963224, + -7.33620228605958e-06,-0.00585183735802305,0.0486766125121778,-0.0522184103072765, + -7.79137667081264e-06,-0.00547811824341055,0.0613683868304594,-0.0845112680182306, + -8.24655105557959e-06,-0.00510439912879818,0.0740601611487409,-0.116804125729185, + -8.70172544048531e-06,-0.00473068001418586,0.0867519354670224,-0.149096983440139, + -9.15689982494694e-06,-0.00435696089957305,0.0994437097853041,-0.181389841151093, + -9.61207420974164e-06,-0.00398324178496057,0.112135484103586,-0.213682698862047, + -1.00672485945363e-05,-0.00360952267034831,0.124827258421867,-0.245975556573001, + -1.05224229794421e-05,-0.00323580355573583,0.137519032740149,-0.278268414283955, + -1.09775973639037e-05,-0.00286208444112312,0.15021080705843,-0.310561271994909, + -1.14327717486429e-05,-0.00248836532651064,0.162902581376712,-0.342854129705864, + -1.18879461337706e-05,-0.00211464621189883,0.175594355694993,-0.375146987416818, + -1.23431205184543e-05,-0.00174092709728568,0.188286130013275,-0.407439845127772, + -1.27982949030825e-05,-0.00136720798267342,0.200977904331557,-0.439732702838726, + -1.32534692879327e-05,-0.000993488868061165,0.213669678649838,-0.47202556054968, + -1.37086436725609e-05,-0.000619769753448685,0.22636145296812,-0.504318418260634, + -1.41638180575221e-05,-0.000246050638836204,0.239053227286401,-0.536611275971588, + -1.46189924420392e-05,0.000127668475776277,0.251745001604683,-0.568904133682543, + -1.50741668264454e-05,0.000501387590389424,0.264436775922965,-0.601196991393496, + -1.55293412116286e-05,0.00087510670500146,0.277128550241246,-0.633489849104451, + -1.59845155963678e-05,0.0012488258196135,0.289820324559527,-0.665782706815405, + -1.64396899813291e-05,0.00162254493422598,0.302512098877809,-0.698075564526359, + -1.68948643654021e-05,0.00199626404883935,0.315203873196091,-0.730368422237313, + -1.73500387500303e-05,0.00236998316345183,0.327895647514373,-0.762661279948267, + -1.78052131355466e-05,0.00274370227806386,0.340587421832654,-0.794954137659221, + -5.48380948876825e-06,-0.00616520542924962,0.035840695691782,-0.0200949746134528, + -5.78409060808527e-06,-0.00583331493506042,0.0481840256868369,-0.0526053847250636, + -6.08437172744392e-06,-0.00550142444087132,0.0605273556818919,-0.0851157948366744, + -6.38465284680256e-06,-0.00516953394668218,0.0728706856769468,-0.117626204948285, + -6.68493396607794e-06,-0.00483764345249293,0.0852140156720018,-0.150136615059896, + -6.98521508551986e-06,-0.00450575295830391,0.0975573456670566,-0.182647025171507, + -7.28549620487851e-06,-0.00417386246411477,0.109900675662112,-0.215157435283117, + -7.58577732407062e-06,-0.00384197196992553,0.122244005657167,-0.247667845394728, + -7.8860584435958e-06,-0.00351008147573639,0.134587335652221,-0.280178255506339, + -8.18633956262138e-06,-0.00317819098154692,0.146930665647277,-0.31268866561795, + -8.48662068242412e-06,-0.00284630048735846,0.159273995642331,-0.34519907572956, + -8.78690180161623e-06,-0.0025144099931691,0.171617325637386,-0.377709485841171, + -9.08718292080835e-06,-0.00218251949897974,0.183960655632441,-0.410219895952782, + -9.38746404033353e-06,-0.0018506290047906,0.196303985627496,-0.442730306064393, + -9.68774515963666e-06,-0.00151873851060169,0.208647315622551,-0.475240716176004, + -9.98802627905082e-06,-0.00118684801641233,0.220990645617606,-0.507751126287614, + -1.0288307398687e-05,-0.000854957522223643,0.233333975612661,-0.540261536399225, + -1.0588588517213e-05,-0.000523067028033619,0.245677305607716,-0.572771946510836, + -1.08888696364051e-05,-0.000191176533844262,0.258020635602771,-0.605282356622447, + -1.11891507565964e-05,0.000140713960343763,0.270363965597825,-0.637792766734057, + -1.14894318752334e-05,0.000472604454534231,0.282707295592881,-0.670303176845668, + -1.17897129946476e-05,0.000804494948722922,0.295050625587936,-0.702813586957279, + -1.20899941137287e-05,0.0011363854429125,0.307393955582991,-0.73532399706889, + -1.23902752335869e-05,0.00146827593710119,0.319737285578046,-0.7678344071805, + -1.2690556352668e-05,0.00180016643129033,0.3320806155731,-0.800344817292111, + -4.27063925444865e-06,-0.0061147390656839,0.035716069660084,-0.0202394236739863, + -4.46254755315234e-06,-0.0058199496928541,0.0477600945300585,-0.0529353187681507, + -4.65445585189073e-06,-0.00552516032002431,0.059804119400033,-0.0856312138623151, + -4.84636415046258e-06,-0.00523037094719436,0.0718481442700076,-0.11832710895648, + -5.03827244932586e-06,-0.00493558157436491,0.0838921691399819,-0.151023004050644, + -5.23018074807813e-06,-0.00464079220153513,0.0959361940099564,-0.183718899144808, + -5.42208904669161e-06,-0.00434600282870512,0.107980218879931,-0.216414794238973, + -5.61399734533286e-06,-0.00405121345587545,0.120024243749905,-0.249110689333137, + -5.80590564419614e-06,-0.00375642408304577,0.13206826861988,-0.281806584427302, + -5.99781394272636e-06,-0.00346163471021566,0.144112293489855,-0.314502479521466, + -6.18972224153413e-06,-0.00316684533738609,0.156156318359829,-0.347198374615631, + -6.38163054023089e-06,-0.00287205596455631,0.168200343229803,-0.379894269709795, + -6.57353883909417e-06,-0.00257726659172652,0.180244368099778,-0.412590164803959, + -6.7654471376799e-06,-0.00228247721889674,0.192288392969752,-0.445286059898124, + -6.95735543632114e-06,-0.00198768784606673,0.204332417839727,-0.477981954992288, + -7.14926373490687e-06,-0.00169289847323717,0.216376442709701,-0.510677850086453, + -7.34117203382567e-06,-0.00139810910040739,0.228420467579676,-0.543373745180617, + -7.53308033230038e-06,-0.00110331972757738,0.24046449244965,-0.576069640274782, + -7.72498863088611e-06,-0.00080853035474715,0.252508517319625,-0.608765535368946, + -7.91689692991593e-06,-0.00051374098191781,0.2645525421896,-0.64146143046311, + -8.1088052287237e-06,-0.000218951609087803,0.276596567059574,-0.674157325557275, + -8.30071352786454e-06,7.58377637408714e-05,0.288640591929548,-0.706853220651439, + -8.49262182622823e-06,0.000370627136571322,0.300684616799523,-0.739549115745604, + -8.68453012492498e-06,0.000665416509400885,0.312728641669497,-0.772245010839768, + -8.87643842351071e-06,0.000960205882230447,0.324772666539471,-0.804940905933933, + -3.26127385064101e-06,-0.00607407204136683,0.0356127777136462,-0.0203577695523877, + -3.38133523655748e-06,-0.00581066736359478,0.047410060368674,-0.0532056309044808, + -3.50139662258497e-06,-0.0055472626858229,0.0592073430237018,-0.0860534922565739, + -3.62145800847369e-06,-0.00528385800805081,0.0710046256787297,-0.118901353608667, + -3.74151939450118e-06,-0.00502045333027901,0.0828019083337574,-0.15174921496076, + -3.86158078047316e-06,-0.00475704865250703,0.0945991909887852,-0.184597076312853, + -3.98164216658392e-06,-0.00449364397473506,0.106396473643813,-0.217444937664946, + -4.10170355236161e-06,-0.00423023929696287,0.118193756298841,-0.250292799017039, + -4.22176493836135e-06,-0.00396683461919112,0.129991038953869,-0.283140660369132, + -4.34182632458313e-06,-0.00370342994141937,0.141788321608896,-0.315988521721226, + -4.46188771030531e-06,-0.00344002526364706,0.153585604263924,-0.348836383073319, + -4.58194909613852e-06,-0.00317662058587498,0.165382886918952,-0.381684244425412, + -4.70201048224927e-06,-0.00291321590810334,0.17718016957398,-0.414532105777505, + -4.82207186824901e-06,-0.00264981123033148,0.188977452229008,-0.447379967129598, + -4.94213325419324e-06,-0.00238640655255962,0.200774734884035,-0.480227828481691, + -5.06219464035951e-06,-0.00212300187478731,0.212572017539064,-0.513075689833784, + -5.18225602608169e-06,-0.00185959719701523,0.224369300194091,-0.545923551185877, + -5.30231741202591e-06,-0.00159619251924314,0.236166582849119,-0.57877141253797, + -5.42237879808116e-06,-0.00133278784147173,0.247963865504147,-0.611619273890063, + -5.54244018413641e-06,-0.00106938316369964,0.259761148159174,-0.644467135242156, + -5.66250157019166e-06,-0.000805978485928005,0.271558430814202,-0.677314996594249, + -5.78256295591384e-06,-0.000542573808155922,0.28335571346923,-0.710162857946343, + -5.90262434185806e-06,-0.000279169130383394,0.295152996124258,-0.743010719298436, + -6.02268572802434e-06,-1.57644526121992e-05,0.306950278779285,-0.775858580650529, + -6.14274711463469e-06,0.00024764022515944,0.318747561434313,-0.808706442002622, + -2.45087047683751e-06,-0.00604226362942155,0.0355301195261492,-0.0204516039132621, + -2.52519229645976e-06,-0.00580437669403822,0.0471307889492505,-0.0534199566325227, + -2.59951411607506e-06,-0.00556648975865487,0.0587314583723518,-0.0863883093517833, + -2.67383593569037e-06,-0.00532860282327163,0.070332127795453,-0.119356662071044, + -2.74815775527792e-06,-0.00509071588788823,0.0819327972185543,-0.152325014790304, + -2.82247957494874e-06,-0.00485282895250494,0.0935334666416556,-0.185293367509565, + -2.8968013945363e-06,-0.00461494201712143,0.105134136064757,-0.218261720228826, + -2.97112321406834e-06,-0.00437705508173825,0.116734805487858,-0.251230072948086, + -3.04544503382242e-06,-0.00413916814635484,0.12833547491096,-0.284198425667347, + -3.11976685340998e-06,-0.00390128121097155,0.139936144334061,-0.317166778386607, + -3.1940886733306e-06,-0.00366339427558882,0.151536813757162,-0.350135131105868, + -3.26841049264059e-06,-0.00342550734020497,0.163137483180263,-0.383103483825128, + -3.34273231211712e-06,-0.00318762040482135,0.174738152603365,-0.416071836544389, + -3.41705413203774e-06,-0.00294973346943861,0.186338822026466,-0.44904018926365, + -3.49137595168081e-06,-0.00271184653405565,0.197939491449567,-0.48200854198291, + -3.56569777093529e-06,-0.00247395959867136,0.209540160872669,-0.514976894702171, + -3.64001959074489e-06,-0.00223607266328862,0.22114083029577,-0.547945247421431, + -3.71434141055449e-06,-0.00199818572790567,0.232741499718871,-0.580913600140692, + -3.78866322969795e-06,-0.0017602987925216,0.244342169141972,-0.613881952859953, + -3.86298504917448e-06,-0.0015224118571382,0.255942838565074,-0.646850305579213, + -3.93730686887306e-06,-0.00128452492175457,0.267543507988175,-0.679818658298474, + -4.01162868846061e-06,-0.00104663798637139,0.279144177411276,-0.712787011017734, + -4.0859505087143e-06,-0.000808751050989098,0.290744846834377,-0.745755363736995, + -4.16027232774674e-06,-0.000570864115604586,0.302345516257479,-0.778723716456255, + -4.23459414766736e-06,-0.00033297718022185,0.31394618568058,-0.811692069175516, + -1.81862549927109e-06,-0.00601795638562291,0.0354658074895192,-0.0205240892539303, + -1.86460256136611e-06,-0.00580016536697839,0.0469140059682884,-0.0535855193673919, + -1.91057962349583e-06,-0.00558237434833397,0.0583622044470575,-0.0866469494808535, + -1.95655668558392e-06,-0.00536458332968942,0.0698104029258267,-0.119708379594315, + -2.00253374754711e-06,-0.00514679231104487,0.0812586014045958,-0.152769809707777, + -2.04851080978785e-06,-0.0049290012924007,0.0927067998833647,-0.185831239821238, + -2.09448787186206e-06,-0.00471121027375598,0.104154998362134,-0.2188926699347, + -2.14046493379749e-06,-0.00449341925511126,0.115603196840903,-0.251954100048162, + -2.18644199584395e-06,-0.00427562823646688,0.127051395319672,-0.285015530161623, + -2.23241905800142e-06,-0.00405783721782238,0.138499593798441,-0.318076960275085, + -2.27839612010339e-06,-0.00384004619917766,0.149947792277211,-0.351138390388546, + -2.32437318237189e-06,-0.00362225518053361,0.16139599075598,-0.384199820502008, + -2.3703502441963e-06,-0.00340446416188867,0.172844189234749,-0.41726125061547, + -2.41632730607622e-06,-0.00318667314324395,0.184292387713518,-0.450322680728931, + -2.4623043682892e-06,-0.00296888212459967,0.195740586192287,-0.483384110842393, + -2.50828143033566e-06,-0.00275109110595495,0.207188784671057,-0.516445540955854, + -2.55425849249313e-06,-0.00253330008731067,0.218636983149825,-0.549506971069316, + -2.60023555465061e-06,-0.00231550906866618,0.230085181628595,-0.582568401182778, + -2.64621261680809e-06,-0.00209771805002168,0.241533380107364,-0.615629831296239, + -2.69218967896556e-06,-0.00187992703137763,0.252981578586132,-0.648691261409701, + -2.73816674101202e-06,-0.00166213601273357,0.264429777064901,-0.681752691523162, + -2.78414380283643e-06,-0.00144434499408774,0.275877975543671,-0.714814121636624, + -2.83012086488288e-06,-0.00122655397544325,0.28732617402244,-0.747875551750085, + -2.87609792704036e-06,-0.00100876295679919,0.298774372501209,-0.780936981863547, + -2.92207498908681e-06,-0.00079097193815425,0.310222570979979,-0.813998411977009, + -1.33633359245683e-06,-0.00599970816774084,0.0354168541279304,-0.0205789634026486, + -1.36499175208693e-06,-0.00579735326426706,0.0467492838428647,-0.0537108566294048, + -1.39364991171009e-06,-0.00559499836079336,0.0580817135577988,-0.086842749856161, + -1.42230807126387e-06,-0.00539264345731943,0.0694141432727331,-0.119974643082917, + -1.45096623083152e-06,-0.00519028855384562,0.0807465729876673,-0.153106536309673, + -1.47962439062121e-06,-0.00498793365037198,0.0920790027026015,-0.186238429536429, + -1.50828255024438e-06,-0.00478557874689822,0.103411432417536,-0.219370322763186, + -1.53694070975652e-06,-0.00458322384342436,0.11474386213247,-0.252502215989942, + -1.56559886943519e-06,-0.00438086893995082,0.126076291847404,-0.285634109216698, + -1.59425702916938e-06,-0.00417851403647718,0.137408721562338,-0.318766002443454, + -1.62291518851498e-06,-0.00397615913300275,0.148741151277273,-0.35189789567021, + -1.65157334813815e-06,-0.003773804229529,0.160073580992207,-0.385029788896967, + -1.68023150809438e-06,-0.00357144932605591,0.171406010707141,-0.418161682123723, + -1.70888966771754e-06,-0.00336909442258215,0.182738440422075,-0.451293575350479, + -1.73754782695212e-06,-0.00316673951910751,0.19407087013701,-0.484425468577235, + -1.76620598690835e-06,-0.00296438461563442,0.205403299851943,-0.517557361803991, + -1.79486414642049e-06,-0.00276202971216022,0.216735729566878,-0.550689255030747, + -1.82352230582161e-06,-0.00255967480868646,0.228068159281812,-0.583821148257504, + -1.85218046566682e-06,-0.00235731990521293,0.239400588996746,-0.61695304148426, + -1.88083862528998e-06,-0.0021549650017394,0.25073301871168,-0.650084934711016, + -1.90949678435803e-06,-0.00195261009826453,0.262065448426615,-0.683216827937772, + -1.93815494420324e-06,-0.001750255194791,0.273397878141549,-0.716348721164528, + -1.96681310438152e-06,-0.00154790029131835,0.284730307856482,-0.749480614391284, + -1.99547126378263e-06,-0.00134554538784393,0.296062737571417,-0.78261250761804, + -2.02412942296171e-06,-0.00114319048436951,0.307395167286352,-0.815744400844796, + -9.74699892214437e-07,-0.00598618968932808,0.0353802086763759,-0.0206198733992233, + -9.92805531535579e-07,-0.00579546775011153,0.0466261379683687,-0.053804298570271, + -1.01091117085672e-06,-0.00560474581089498,0.0578720672603616,-0.0869887237413188, + -1.02901681015011e-06,-0.00541402387167855,0.0691179965523542,-0.120173148912367, + -1.04712244972105e-06,-0.00522330193246223,0.0803639258443471,-0.153357574083414, + -1.06522808898668e-06,-0.00503257999324558,0.09160985513634,-0.186541999254462, + -1.08333372811353e-06,-0.00484185805402892,0.102855784428333,-0.21972642442551, + -1.1014393675457e-06,-0.00465113611481238,0.114101713720326,-0.252910849596558, + -1.11954500703337e-06,-0.00446041417559606,0.125347643012318,-0.286095274767605, + -1.13765064613247e-06,-0.00426969223637919,0.136593572304311,-0.319279699938653, + -1.15575628562015e-06,-0.00407897029716286,0.147839501596304,-0.352464125109701, + -1.17386192505231e-06,-0.00388824835794654,0.159085430888297,-0.385648550280748, + -1.19196756442896e-06,-0.00369752641873,0.17033136018029,-0.418832975451796, + -1.21007320358357e-06,-0.00350680447951301,0.181577289472283,-0.452017400622844, + -1.22817884296023e-06,-0.00331608254029714,0.192823218764275,-0.485201825793892, + -1.24628448239239e-06,-0.0031253606010806,0.204069148056268,-0.518386250964939, + -1.26439012182455e-06,-0.00293463866186405,0.215315077348261,-0.551570676135987, + -1.28249576081263e-06,-0.00274391672264684,0.226561006640254,-0.584755101307035, + -1.30060140013377e-06,-0.00255319478343052,0.237806935932247,-0.617939526478083, + -1.31870703978798e-06,-0.0023624728442142,0.249052865224239,-0.65112395164913, + -1.3368126789981e-06,-0.00217175090499744,0.260298794516233,-0.684308376820178, + -1.35491831887435e-06,-0.00198102896578201,0.271544723808225,-0.717492801991226, + -1.37302395775141e-06,-0.0017903070265648,0.282790653100218,-0.750677227162274, + -1.39112959696153e-06,-0.00159958508734803,0.294036582392211,-0.783861652333322, + -1.40923523650471e-06,-0.00140886314813216,0.305282511684203,-0.817046077504369, + -7.07019120936569e-07,-0.00597627311205831,0.0353531178182547,-0.020650025616694, + -7.18653093340071e-07,-0.00579419347460122,0.046535188019078,-0.0538731688210115, + -7.30287065708879e-07,-0.00561211383714416,0.0577172582199012,-0.087096312025329, + -7.41921038188709e-07,-0.00543003419968724,0.0688993284207244,-0.120319455229646, + -7.53555010474249e-07,-0.00524795456223004,0.0800813986215478,-0.153542598433964, + -7.65188982898568e-07,-0.00506587492477284,0.0912634688223712,-0.186765741638281, + -7.76822955184109e-07,-0.00488379528731564,0.102445539023195,-0.219988884842599, + -7.88456927747205e-07,-0.004701715649859,0.113627609224017,-0.253212028046916, + -8.00090900254791e-07,-0.00451963601240191,0.124809679424841,-0.286435171251234, + -8.11724872318287e-07,-0.00433755637494437,0.135991749625664,-0.319658314455551, + -8.23358844936894e-07,-0.00415547673748762,0.147173819826487,-0.352881457659869, + -8.34992817166924e-07,-0.0039733971000302,0.158355890027311,-0.386104600864186, + -8.46626789563487e-07,-0.00379131746257366,0.169537960228134,-0.419327744068504, + -8.5826076196005e-07,-0.00360923782511624,0.180720030428957,-0.452550887272821, + -8.69894734578658e-07,-0.00342715818765971,0.19190210062978,-0.485774030477138, + -8.81528706586643e-07,-0.00324507855020184,0.203084170830604,-0.518997173681456, + -8.93162679482806e-07,-0.00306299891274575,0.214266241031427,-0.552220316885773, + -9.04796651823858e-07,-0.00288091927528811,0.225448311232251,-0.585443460090091, + -9.1643062416491e-07,-0.00269883963783113,0.236630381433074,-0.618666603294408, + -9.28064596728007e-07,-0.0025167600003746,0.247812451633897,-0.651889746498726, + -9.39698568624969e-07,-0.00233468036291651,0.25899452183472,-0.685112889703043, + -9.51332541521133e-07,-0.00215260072546064,0.270176592035543,-0.718336032907361, + -9.62966513307073e-07,-0.00197052108800255,0.281358662236367,-0.751559176111678, + -9.7460048587017e-07,-0.00178844145054535,0.29254073243719,-0.784782319315996, + -9.86234458433266e-07,-0.0016063618130886,0.303722802638013,-0.818005462520313, + -5.10771194582593e-07,-0.00596905098598514,0.0353332749568421,-0.0206720619399733, + -5.18382780284599e-07,-0.00579332416002917,0.0464686182828356,-0.0539235016733503, + -5.25994366035176e-07,-0.00561759733407313,0.0576039616088292,-0.0871749414067273, + -5.33605951730243e-07,-0.00544187050811712,0.0687393049348227,-0.120426381140104, + -5.41217537508576e-07,-0.00526614368216127,0.0798746482608161,-0.153677820873481, + -5.48829123175887e-07,-0.00509041685620526,0.0910099915868096,-0.186929260606858, + -5.56440708843198e-07,-0.00491469003024925,0.102145334912803,-0.220180700340235, + -5.64052294704798e-07,-0.00473896320429334,0.113280678238797,-0.253432140073612, + -5.71663880344353e-07,-0.00456323637833722,0.12441602156479,-0.286683579806989, + -5.79275466372486e-07,-0.00438750955238154,0.135551364890784,-0.319935019540366, + -5.86887051956531e-07,-0.00421178272642542,0.146686708216777,-0.353186459273743, + -5.94498637762619e-07,-0.00403605590046952,0.157822051542771,-0.38643789900712, + -6.02110223402175e-07,-0.00386032907451361,0.168957394868764,-0.419689338740497, + -6.09721808986219e-07,-0.00368460224855727,0.180092738194758,-0.452940778473874, + -6.17333395069863e-07,-0.00350887542260159,0.191228081520751,-0.486192218207251, + -6.24944980653908e-07,-0.00333314859664569,0.202363424846745,-0.519443657940628, + -6.32556566015907e-07,-0.00315742177068934,0.213498768172738,-0.552695097674005, + -6.40168151933018e-07,-0.00298169494473344,0.224634111498732,-0.585946537407382, + -6.47779737850129e-07,-0.00280596811877798,0.235769454824725,-0.619197977140759, + -6.55391323656218e-07,-0.00263024129282163,0.246904798150719,-0.652449416874136, + -6.6300290912924e-07,-0.00245451446686529,0.258040141476712,-0.685700856607513, + -6.70614495046351e-07,-0.00227878764090983,0.269175484802705,-0.71895229634089, + -6.78226080741418e-07,-0.00210306081495348,0.280310828128699,-0.752203736074267, + -6.85837666991596e-07,-0.00192733398899891,0.291446171454692,-0.785455175807644, + -6.93449252020528e-07,-0.00175160716304168,0.302581514780686,-0.818706615541021, + -2.3594827396542e-05,-0.00705454434582081,0.0486493044125134,-0.0315387942280043, + -2.68564869033844e-05,-0.00637817687214226,0.064317667428829,-0.0610266075605757, + -3.01181464102129e-05,-0.0057018093984636,0.0799860304451446,-0.0905144208931471, + -3.33798059170554e-05,-0.00502544192478505,0.0956543934614602,-0.120002234225719, + -3.66414654238423e-05,-0.00434907445110644,0.111322756477776,-0.14949004755829, + -3.99031249307125e-05,-0.00367270697742805,0.126991119494091,-0.178977860890861, + -4.31647844377214e-05,-0.00299633950374956,0.142659482510407,-0.208465674223433, + -4.64264439441475e-05,-0.00231997203007028,0.158327845526723,-0.237953487556004, + -4.96881034511287e-05,-0.00164360455639201,0.173996208543038,-0.267441300888576, + -5.29497629578324e-05,-0.000967237082713179,0.189664571559354,-0.296929114221147, + -5.62114224648136e-05,-0.000290869609034905,0.205332934575669,-0.326416927553718, + -5.94730819714617e-05,0.000385497864644035,0.221001297591985,-0.35590474088629, + -6.27347414784429e-05,0.00106186533832275,0.236669660608301,-0.385392554218861, + -6.59964009854797e-05,0.00173823281200103,0.252338023624616,-0.414880367551433, + -6.92580604920723e-05,0.0024146002856793,0.268006386640931,-0.444368180884004, + -7.2519719998887e-05,0.00309096775935847,0.283674749657248,-0.473855994216575, + -7.57813795057016e-05,0.00376733523303674,0.299343112673563,-0.503343807549147, + -7.90430390124053e-05,0.00444370270671568,0.315011475689879,-0.532831620881718, + -8.2304698519664e-05,0.00512007018039395,0.330679838706194,-0.562319434214289, + -8.55663580264787e-05,0.00579643765407201,0.346348201722509,-0.591807247546861, + -8.88280175330713e-05,0.00647280512775117,0.362016564738825,-0.621295060879432, + -9.20896770408852e-05,0.00714917260142833,0.37768492775514,-0.650782874212004, + -9.53513365472558e-05,0.00782554007510772,0.393353290771456,-0.680270687544575, + -9.86129960536264e-05,0.0085019075487871,0.409021653787772,-0.709758500877147, + -0.000101874655560996,0.00917827502246471,0.424690016804087,-0.739246314209718, + -2.34812631053904e-05,-0.00704650783120872,0.0486309746561106,-0.0315599217145, + -2.67125954673958e-05,-0.00637192841193729,0.0642744317962176,-0.0610647100786468, + -2.99439278295122e-05,-0.005697348992666,0.0799178889363246,-0.0905694984427936, + -3.31752601916702e-05,-0.00502276957339476,0.0955613460764316,-0.12007428680694, + -3.64065925536339e-05,-0.00434819015412335,0.111204803216539,-0.149579075171087, + -3.96379249158196e-05,-0.00367361073485217,0.126848260356646,-0.179083863535234, + -4.28692572778666e-05,-0.00299903131558077,0.142491717496753,-0.208588651899381, + -4.61005896399969e-05,-0.00232445189630948,0.15813517463686,-0.238093440263528, + -4.93319220020161e-05,-0.00164987247703818,0.173778631776967,-0.267598228627674, + -5.25632543642574e-05,-0.000975293057767113,0.189422088917073,-0.297103016991821, + -5.57945867262211e-05,-0.000300713638495598,0.20506554605718,-0.326607805355968, + -5.90259190882958e-05,0.000373865780775695,0.220709003197287,-0.356112593720115, + -6.2257251450315e-05,0.00104844520004699,0.236352460337394,-0.385617382084262, + -6.54885838127783e-05,0.00172302461931828,0.251995917477501,-0.415122170448408, + -6.8719916174742e-05,0.00239760403858935,0.267639374617608,-0.444626958812555, + -7.19512485368723e-05,0.00307218345786087,0.283282831757715,-0.474131747176702, + -7.51825808991136e-05,0.00374676287713172,0.298926288897822,-0.503636535540849, + -7.84139132605777e-05,0.0044213422964039,0.314569746037929,-0.533141323904996, + -8.1645245623152e-05,0.0050959217156743,0.330213203178036,-0.562646112269143, + -8.48765779852823e-05,0.00577050113494537,0.345856660318143,-0.592150900633289, + -8.81079103470794e-05,0.00644508055421777,0.36150011745825,-0.621655688997436, + -9.13392427094317e-05,0.00711965997348862,0.377143574598357,-0.651160477361583, + -9.45705750711179e-05,0.00779423939276036,0.392787031738464,-0.68066526572573, + -9.78019074331371e-05,0.00846881881203165,0.408430488878571,-0.710170054089877, + -0.000101033239795378,0.00914339823130295,0.424073946018678,-0.739674842454023, + -2.33242024943875e-05,-0.00703542873146884,0.0486056233416017,-0.0315891012240339, + -2.65138259760017e-05,-0.00636333698488284,0.0642146538181516,-0.0611173340758056, + -2.9703449457491e-05,-0.00569124523829678,0.0798236842947014,-0.0906455669275773, + -3.28930729389665e-05,-0.00501915349171067,0.0954327147712512,-0.120173799779349, + -3.6082696420553e-05,-0.00434706174512456,0.111041745247801,-0.149702032631121, + -3.92723199020839e-05,-0.00367496999853845,0.126650775724351,-0.179230265482893, + -4.24619433836981e-05,-0.00300287825195245,0.142259806200901,-0.208758498334664, + -4.56515668652568e-05,-0.00233078650536656,0.157868836677451,-0.238286731186436, + -4.88411903468156e-05,-0.00165869475878044,0.173477867154,-0.267814964038208, + -5.20308138280967e-05,-0.000986603012194109,0.18908689763055,-0.29734319688998, + -5.52204373099885e-05,-0.000314511265608441,0.2046959281071,-0.326871429741751, + -5.84100607911031e-05,0.000357580480977893,0.22030495858365,-0.356399662593523, + -6.15996842726618e-05,0.001029672227564,0.2359139890602,-0.385927895445295, + -6.47893077543316e-05,0.00170176397414989,0.251523019536749,-0.415456128297067, + -6.79789312355572e-05,0.00237385572073623,0.267132050013299,-0.444984361148838, + -7.11685547172269e-05,0.00304594746732256,0.282741080489849,-0.47451259400061, + -7.43581781992297e-05,0.00371803921390756,0.298350110966399,-0.504040826852382, + -7.75478016801223e-05,0.00439013096049479,0.313959141442949,-0.533569059704153, + -8.07374251622361e-05,0.00506222270707957,0.329568171919498,-0.563097292555925, + -8.39270486433508e-05,0.00573431445366679,0.345177202396049,-0.592625525407697, + -8.71166721247985e-05,0.00640640620025268,0.360786232872598,-0.622153758259469, + -9.03062956064682e-05,0.00707849794683879,0.376395263349148,-0.65168199111124, + -9.34959190880269e-05,0.00775058969342446,0.392004293825698,-0.681210223963012, + -9.66855425695856e-05,0.00842268144001057,0.407613324302248,-0.710738456814784, + -9.98751660515884e-05,0.00909477318659624,0.423222354778797,-0.740266689666556, + -2.31079586765909e-05,-0.0070202419677704,0.0485707173301202,-0.0316292002757349, + -2.62406007479898e-05,-0.00635160320840189,0.0641323835871722,-0.0611896510001301, + -2.93732428194304e-05,-0.00568296444903343,0.0796940498442241,-0.0907501017245252, + -3.25058848908155e-05,-0.00501432568966498,0.095255716101276,-0.12031055244892, + -3.56385269622006e-05,-0.00434568693029658,0.110817382358328,-0.149871003173316, + -3.87711690336134e-05,-0.00367704817092807,0.12637904861538,-0.179431453897711, + -4.19038111050818e-05,-0.00300840941155966,0.141940714872432,-0.208991904622106, + -4.50364531765501e-05,-0.00233977065219126,0.157502381129484,-0.238552355346501, + -4.81690952476854e-05,-0.00167113189282242,0.173064047386536,-0.268112806070896, + -5.13017373190428e-05,-0.0010024931334538,0.188625713643588,-0.297673256795292, + -5.44343793907331e-05,-0.000333854374085396,0.20418737990064,-0.327233707519687, + -5.7567021462035e-05,0.000334784385282783,0.219749046157691,-0.356794158244082, + -6.06996635333368e-05,0.00100342314465141,0.235310712414743,-0.386354608968477, + -6.38323056050272e-05,0.00167206190401981,0.250872378671795,-0.415915059692872, + -6.6964947676218e-05,0.00234070066338865,0.266434044928848,-0.445475510417267, + -7.00975897474088e-05,0.00300933942275705,0.281995711185899,-0.475035961141662, + -7.32302318189326e-05,0.00367797818212545,0.297557377442951,-0.504596411866058, + -7.63628738903455e-05,0.00434661694149385,0.313119043700003,-0.534156862590453, + -7.94955159619803e-05,0.00501525570086181,0.328680709957055,-0.563717313314848, + -8.26281580331711e-05,0.00568389446023065,0.344242376214107,-0.593277764039243, + -8.57608001043619e-05,0.00635253321959972,0.359804042471159,-0.622838214763638, + -8.88934421763299e-05,0.00702117197896701,0.37536570872821,-0.652398665488033, + -9.20260842477427e-05,0.00768981073833608,0.390927374985263,-0.681959116212428, + -9.51587263186005e-05,0.0083584494977047,0.406489041242314,-0.711519566936824, + -9.82913683905684e-05,0.00902708825707288,0.422050707499366,-0.741080017661219, + -2.28120629598982e-05,-0.00699958663889538,0.0485229508093914,-0.0316839277490385, + -2.58675684358667e-05,-0.00633572478445732,0.0640198723657723,-0.0612883496570178, + -2.89230739119184e-05,-0.00567186293001926,0.0795167939221532,-0.090892771564997, + -3.19785793877758e-05,-0.00500800107558119,0.095013715478534,-0.120497193472976, + -3.50340848636888e-05,-0.00434413922114296,0.110510637034915,-0.150101615380956, + -3.80895903398237e-05,-0.00368027736670518,0.126007558591296,-0.179706037288935, + -4.11450958155424e-05,-0.00301641551226661,0.141504480147677,-0.209310459196914, + -4.42006012915663e-05,-0.00235255365782872,0.157001401704058,-0.238914881104894, + -4.72561067673682e-05,-0.00168869180339037,0.172498323260439,-0.268519303012873, + -5.03116122435587e-05,-0.00102482994895259,0.18799524481682,-0.298123724920852, + -5.33671177194717e-05,-0.000360968094514469,0.2034921663732,-0.327728146828831, + -5.64226231957732e-05,0.000302893759923206,0.218989087929581,-0.357332568736811, + -5.94781286712975e-05,0.000966755614361547,0.234486009485962,-0.38693699064479, + -6.25336341470439e-05,0.00163061746880033,0.249982931042344,-0.416541412552769, + -6.55891396231789e-05,0.00229447932323823,0.265479852598724,-0.446145834460749, + -6.86446450990363e-05,0.00295834117767635,0.280976774155105,-0.475750256368728, + -7.17001505750048e-05,0.00362220303211402,0.296473695711486,-0.505354678276707, + -7.47556560505291e-05,0.00428606488655325,0.311970617267867,-0.534959100184686, + -7.78111615270527e-05,0.0049499267409896,0.327467538824247,-0.564563522092666, + -8.08666670026881e-05,0.00561378859542883,0.342964460380629,-0.594167944000645, + -8.39221724785455e-05,0.00627765044986672,0.358461381937009,-0.623772365908625, + -8.6977677954736e-05,0.00694151230430462,0.37395830349339,-0.653376787816603, + -9.00331834308155e-05,0.00760537415874252,0.389455225049771,-0.682981209724583, + -9.30886889062288e-05,0.00826923601318086,0.404952146606152,-0.712585631632562, + -9.61441943824193e-05,0.0089330978676192,0.420449068162533,-0.742190053540541, + -2.24105788531326e-05,-0.006971790591252,0.0484581343463593,-0.031757923720823, + -2.5362961627709e-05,-0.00631450546007623,0.0638673292162421,-0.0614217982266187, + -2.83153444023687e-05,-0.00565722032890054,0.079276524086125,-0.0910856727324144, + -3.12677271770423e-05,-0.00499993519772485,0.0946857189560079,-0.12074954723821, + -3.42201099516048e-05,-0.0043426500665491,0.110094913825891,-0.150413421744006, + -3.71724927262507e-05,-0.00368536493537353,0.125504108695773,-0.180077296249801, + -4.01248755009243e-05,-0.00302807980419784,0.140913303565656,-0.209741170755597, + -4.30772582755701e-05,-0.00237079467302193,0.156322498435539,-0.239405045261393, + -4.60296410502159e-05,-0.00171350954184635,0.171731693305422,-0.269068919767189, + -4.89820238249727e-05,-0.00105622441067066,0.187140888175305,-0.298732794272984, + -5.1934406599341e-05,-0.000398939279494748,0.202550083045188,-0.32839666877878, + -5.48867893742644e-05,0.000258345851680497,0.217959277915071,-0.358060543284576, + -5.78391721481886e-05,0.000915630982857296,0.233368472784954,-0.387724417790371, + -6.07915549233895e-05,0.0015729161140321,0.248777667654836,-0.417388292296167, + -6.37439376979243e-05,0.00223020124520801,0.264186862524719,-0.447052166801963, + -6.66963204726256e-05,0.0028874863763837,0.279596057394602,-0.476716041307758, + -6.96487032471049e-05,0.00354477150755916,0.295005252264485,-0.506379915813554, + -7.26010860216952e-05,0.00420205663873552,0.310414447134368,-0.53604379031935, + -7.55534687965076e-05,0.00485934176991054,0.32582364200425,-0.565707664825145, + -7.85058515710979e-05,0.00551662690108645,0.341232836874134,-0.595371539330941, + -8.14582343454662e-05,0.00617391203226303,0.356642031744017,-0.625035413836737, + -8.44106171206116e-05,0.00683119716343805,0.3720512266139,-0.654699288342532, + -8.73629998947578e-05,0.00748848229461441,0.387460421483782,-0.684363162848328, + -9.03153826692371e-05,0.00814576742578987,0.402869616353665,-0.714027037354124, + -9.32677654439384e-05,0.00880305255696578,0.418278811223548,-0.74369091185992, + -2.18720218072843e-05,-0.00693491643490615,0.048371182282186,-0.0318567150175, + -2.46888569472026e-05,-0.00628662334124291,0.0636629196819949,-0.061599964103931, + -2.75056920869543e-05,-0.00563833024757943,0.0789546570818039,-0.0913432131903619, + -3.03225272269003e-05,-0.00499003715391622,0.0942463944816127,-0.121086462276793, + -3.31393623668741e-05,-0.00434174406025301,0.109538131881422,-0.150829711363224, + -3.59561975066258e-05,-0.00369345096658957,0.124829869281231,-0.180572960449655, + -3.87730326464886e-05,-0.00304515787292625,0.140121606681039,-0.210316209536086, + -4.15898677863513e-05,-0.00239686477926304,0.155413344080848,-0.240059458622517, + -4.44067029262141e-05,-0.00174857168559961,0.170705081480657,-0.269802707708948, + -4.72235380659103e-05,-0.00110027859193629,0.185996818880466,-0.299545956795379, + -5.0040373205773e-05,-0.000451985498272744,0.201288556280275,-0.32928920588181, + -5.28572083459689e-05,0.000196307595390133,0.216580293680084,-0.35903245496824, + -5.56740434858316e-05,0.000844600689053454,0.231872031079893,-0.388775704054671, + -5.84908786257499e-05,0.00149289378271678,0.247163768479702,-0.418518953141103, + -6.1307713765113e-05,0.00214118687638054,0.262455505879511,-0.448262202227533, + -6.41245489049203e-05,0.00278947997004364,0.277747243279319,-0.478005451313964, + -6.69413840450606e-05,0.00343777306370718,0.293038980679128,-0.507748700400395, + -6.97582191853119e-05,0.00408606615736962,0.308330718078937,-0.537491949486826, + -7.25750543248971e-05,0.00473435925103383,0.323622455478746,-0.567235198573257, + -7.53918894643713e-05,0.00538265234469737,0.338914192878555,-0.596978447659688, + -7.82087246042895e-05,0.00603094543836047,0.354205930278364,-0.626721696746119, + -8.10255597444298e-05,0.00667923853202401,0.369497667678173,-0.65646494583255, + -8.38423948844591e-05,0.00732753162568622,0.384789405077981,-0.686208194918981, + -8.66592300241553e-05,0.00797582471934977,0.40008114247779,-0.715951444005412, + -8.94760651637405e-05,0.00862411781301375,0.415372879877599,-0.745694693091843, + -2.11605704003165e-05,-0.00688691882449444,0.0482563103433187,-0.0319864067548445, + -2.38032287121076e-05,-0.00625079780245241,0.0633932707791616,-0.0618338576040809, + -2.64458870239959e-05,-0.00561467678041044,0.0785302312150046,-0.0916813084533172, + -2.90885453357592e-05,-0.00497855575836831,0.0936671916508476,-0.121528759302554, + -3.17312036477446e-05,-0.00434243473632645,0.108804152086691,-0.15137621015179, + -3.43738619594247e-05,-0.0037063137142842,0.123941112522534,-0.181223661001026, + -3.70165202714379e-05,-0.00307019269224251,0.139078072958376,-0.211071111850263, + -3.96591785830069e-05,-0.00243407167019993,0.15421503339422,-0.240918562699499, + -4.2301836894687e-05,-0.00179795064815769,0.169351993830063,-0.270766013548735, + -4.49444952065892e-05,-0.001161829626116,0.184488954265906,-0.300613464397972, + -4.75871535181582e-05,-0.000525708604073527,0.199625914701749,-0.330460915247208, + -5.02298118300604e-05,0.000110412417968719,0.214762875137592,-0.360308366096445, + -5.28724701421845e-05,0.000746533440010078,0.229899835573435,-0.390155816945681, + -5.55151284538091e-05,0.00138265446205232,0.245036796009278,-0.420003267794917, + -5.81577867655447e-05,0.00201877548409479,0.260173756445121,-0.449850718644154, + -6.08004450773914e-05,0.00265489650613682,0.275310716880964,-0.47969816949339, + -6.3443103389238e-05,0.00329101752817884,0.290447677316807,-0.509545620342626, + -6.60857617013066e-05,0.00392713855022042,0.30558463775265,-0.539393071191863, + -6.87284200131533e-05,0.00456325957226245,0.320721598188493,-0.569240522041099, + -7.13710783248889e-05,0.00519938059430447,0.335858558624336,-0.599087972890335, + -7.40137366366245e-05,0.00583550161634649,0.350995519060179,-0.628935423739572, + -7.66563949483601e-05,0.00647162263838874,0.366132479496021,-0.658782874588808, + -7.92990532606508e-05,0.00710774366043054,0.381269439931865,-0.688630325438044, + -8.19417115720533e-05,0.00774386468247323,0.396406400367708,-0.718477776287281, + -8.45843698838999e-05,0.00837998570451504,0.411543360803551,-0.748325227136517, + -2.02394967061814e-05,-0.00682596698169216,0.0481075954312107,-0.0321529493709036, + -2.26649154918684e-05,-0.00620608901611291,0.0630448336788449,-0.0621342100875296, + -2.50903342774722e-05,-0.00558621105053364,0.0779820719264791,-0.0921154708041555, + -2.75157530631731e-05,-0.00496633308495431,0.0929193101741135,-0.122096731520781, + -2.99411718487907e-05,-0.00434645511937515,0.107856548421748,-0.152077992237407, + -3.23665906344639e-05,-0.00372657715379576,0.122793786669382,-0.182059252954033, + -3.47920094202481e-05,-0.00310669918821671,0.137731024917016,-0.212040513670659, + -3.72174282060045e-05,-0.00248682122263744,0.15266826316465,-0.242021774387285, + -3.96428469915389e-05,-0.00186694325705816,0.167605501412285,-0.272003035103911, + -4.20682657774063e-05,-0.00124706529147911,0.182542739659919,-0.301984295820537, + -4.44936845627186e-05,-0.000627187325899392,0.197479977907553,-0.331965556537163, + -4.69191033486416e-05,-7.30936032056206e-06,0.212417216155187,-0.361946817253789, + -4.9344522134287e-05,0.000612568605259156,0.227354454402822,-0.391928077970415, + -5.17699409202099e-05,0.00123244657083754,0.242291692650455,-0.421909338687041, + -5.41953597058553e-05,0.00185232453641726,0.25722893089809,-0.451890599403667, + -5.66207784917783e-05,0.00247220250199587,0.272166169145724,-0.481871860120293, + -5.90461972770351e-05,0.00309208046757603,0.287103407393359,-0.511853120836919, + -6.1471616062625e-05,0.0037119584331553,0.302040645640993,-0.541834381553544, + -6.38970348481038e-05,0.00433183639873458,0.316977883888627,-0.57181564227017, + -6.63224536343598e-05,0.00495171436431319,0.331915122136261,-0.601796902986796, + -6.87478724200608e-05,0.00557159232989202,0.346852360383895,-0.631778163703422, + -7.11732912055396e-05,0.00619147029547173,0.361789598631529,-0.661759424420048, + -7.35987099907964e-05,0.0068113482610519,0.376726836879164,-0.691740685136674, + -7.60241287766084e-05,0.00743122622663073,0.391664075126798,-0.7217219458533, + -7.84495475628644e-05,0.00805110419220867,0.406601313374432,-0.751703206569926, + -1.90777036821049e-05,-0.0067509566582728,0.0479200436444593,-0.0323608586104601, + -2.12423877882506e-05,-0.00615232382186409,0.0626064265192182,-0.0625091655068113, + -2.34070718945212e-05,-0.00555369098545533,0.0772928093939773,-0.0926574724031625, + -2.55717560007362e-05,-0.00495505814904668,0.0919791922687362,-0.122805779299514, + -2.77364401069513e-05,-0.00435642531263802,0.106665575143495,-0.152954086195865, + -2.99011242132496e-05,-0.00375779247622932,0.121351958018254,-0.183102393092216, + -3.2065808319437e-05,-0.00315915963982061,0.136038340893013,-0.213250699988567, + -3.42304924255132e-05,-0.00256052680341168,0.150724723767772,-0.243399006884918, + -3.63951765317561e-05,-0.00196189396700297,0.165411106642531,-0.27354731378127, + -3.85598606380544e-05,-0.00136326113059471,0.18009748951729,-0.303695620677621, + -4.07245447440752e-05,-0.000764628294185554,0.194783872392049,-0.333843927573972, + -4.2889228850318e-05,-0.000165995457776846,0.209470255266808,-0.363992234470323, + -4.50539129565053e-05,0.000432637378632084,0.224156638141567,-0.394140541366674, + -4.72185970629146e-05,0.00103127021504035,0.238843021016326,-0.424288848263025, + -4.9383281169324e-05,0.00162990305144883,0.253529403891085,-0.454437155159377, + -5.15479652752893e-05,0.00222853588785799,0.268215786765844,-0.484585462055728, + -5.37126493814766e-05,0.00282716872426625,0.282902169640602,-0.514733768952079, + -5.58773334877749e-05,0.0034258015606754,0.297588552515362,-0.54488207584843, + -5.80420175938512e-05,0.00402443439708411,0.312274935390121,-0.575030382744781, + -6.02067017001495e-05,0.00462306723349304,0.32696131826488,-0.605178689641132, + -6.23713858056707e-05,0.00522170006990219,0.341647701139639,-0.635326996537484, + -6.45360699130793e-05,0.00582033290630912,0.356334084014397,-0.665475303433835, + -6.67007540189335e-05,0.00641896574271872,0.371020466889157,-0.695623610330186, + -6.88654381252318e-05,0.00701759857912743,0.385706849763916,-0.725771917226537, + -7.10301222313081e-05,0.00761623141553613,0.400393232638675,-0.755920224122888, + -1.76595017411796e-05,-0.00666214638203028,0.0476911883195031,-0.0326114488374637, + -1.95259739344811e-05,-0.00609055012260873,0.0620729675499896,-0.0629610942610814, + -2.13924461277548e-05,-0.00551895386318724,0.076454746780476,-0.0933107396846991, + -2.32589183211673e-05,-0.00494735760376575,0.0908365260109626,-0.123660385108317, + -2.51253905145243e-05,-0.00437576134434436,0.105218305241449,-0.154010030531935, + -2.69918627076871e-05,-0.00380416508492265,0.119600084471935,-0.184359675955552, + -2.88583349011273e-05,-0.00323256882550116,0.133981863702422,-0.21470932137917, + -3.07248070943178e-05,-0.00266097256607967,0.148363642932908,-0.245058966802788, + -3.25912792878413e-05,-0.0020893763066584,0.162745422163395,-0.275408612226406, + -3.44577514810318e-05,-0.00151778004723657,0.177127201393881,-0.305758257650023, + -3.63242236744443e-05,-0.000946183787815302,0.191508980624368,-0.336107903073641, + -3.81906958676903e-05,-0.000374587528393588,0.205890759854854,-0.366457548497259, + -4.00571680611583e-05,0.000197008731027681,0.220272539085341,-0.396807193920877, + -4.19236402542378e-05,0.000768604990449395,0.234654318315827,-0.427156839344494, + -4.37901124479279e-05,0.00134020124987067,0.249036097546314,-0.457506484768112, + -4.56565846410628e-05,0.00191179750929238,0.2634178767768,-0.48785613019173, + -4.75230568347529e-05,0.00248339376871365,0.277799656007287,-0.518205775615347, + -4.93895290277768e-05,0.00305499002813536,0.292181435237773,-0.548555421038965, + -5.12560012206897e-05,0.0036265862875573,0.30656321446826,-0.578905066462583, + -5.31224734140467e-05,0.00419818254697879,0.320944993698746,-0.609254711886201, + -5.49889456074037e-05,0.00476977880640028,0.335326772929233,-0.639604357309818, + -5.68554178010938e-05,0.00534137506582155,0.349708552159719,-0.669954002733436, + -5.87218899936737e-05,0.00591297132524371,0.364090331390206,-0.700303648157054, + -6.05883621879189e-05,0.00648456758466409,0.378472110620692,-0.730653293580672, + -6.24548343816089e-05,0.00705616384408536,0.392853889851178,-0.761002939004289, + -1.59959192743281e-05,-0.00656170866354217,0.0474229351147055,-0.0329010027005708, + -1.75406844489939e-05,-0.00602330309650645,0.0614496844725409,-0.0634832922662185, + -1.90854496235904e-05,-0.00548489752947057,0.0754764338303764,-0.0940655818318661, + -2.06302147984505e-05,-0.00494649196243513,0.0895031831882117,-0.124647871397514, + -2.21749799729221e-05,-0.00440808639539914,0.103529932546047,-0.155230160963162, + -2.37197451475601e-05,-0.00386968082836325,0.117556681903883,-0.185812450528809, + -2.52645103224758e-05,-0.0033312752613277,0.131583431261718,-0.216394740094457, + -2.68092754970861e-05,-0.00279286969429227,0.145610180619553,-0.246977029660105, + -2.83540406713634e-05,-0.00225446412725583,0.159636929977389,-0.277559319225752, + -2.98988058461402e-05,-0.00171605856022028,0.173663679335224,-0.3081416087914, + -3.14435710209171e-05,-0.00117765299318462,0.18769042869306,-0.338723898357048, + -3.29883361955274e-05,-0.000639247426148959,0.201717178050895,-0.369306187922695, + -3.45331013705819e-05,-0.000100841859113743,0.21574392740873,-0.399888477488343, + -3.60778665446371e-05,0.000437563707922806,0.229770676766566,-0.430470767053991, + -3.76226317195805e-05,0.000975969274958244,0.243797426124401,-0.461053056619638, + -3.91673968945794e-05,0.00151437484199346,0.257824175482237,-0.491635346185286, + -4.07121620688011e-05,0.00205278040902979,0.271850924840072,-0.522217635750934, + -4.2256927243689e-05,0.00259118597606567,0.285877674197908,-0.552799925316581, + -4.38016924181328e-05,0.00312959154310133,0.299904423555743,-0.583382214882229, + -4.53464575930207e-05,0.00366799711013677,0.313931172913578,-0.613964504447877, + -4.68912227675755e-05,0.00420640267717287,0.327957922271414,-0.644546794013524, + -4.84359879420193e-05,0.00474480824420898,0.34198467162925,-0.675129083579172, + -4.99807531166852e-05,0.00528321381124464,0.356011420987085,-0.70571137314482, + -5.1525518291351e-05,0.0058216193782803,0.37003817034492,-0.736293662710468, + -5.30702834662389e-05,0.00636002494531551,0.384064919702755,-0.766875952276115, + -1.4133300540814e-05,-0.0064538706340953,0.0471229485411515,-0.0332197073276481, + -1.5353856657227e-05,-0.00595441955359038,0.0607551275041145,-0.06405806242712, + -1.65744127736123e-05,-0.00545496847308546,0.0743873064670775,-0.094896417526592, + -1.77949688899559e-05,-0.00495551739258043,0.0880194854300406,-0.125734772626064, + -1.90155250064106e-05,-0.00445606631207573,0.101651664393003,-0.156573127725536, + -2.0236081122782e-05,-0.00395661523157076,0.115283843355966,-0.187411482825008, + -2.14566372390146e-05,-0.00345716415106567,0.12891602231893,-0.21824983792448, + -2.26771933552472e-05,-0.00295771307056047,0.142548201281893,-0.249088193023952, + -2.38977494717574e-05,-0.00245826199005572,0.156180380244856,-0.279926548123423, + -2.51183055879345e-05,-0.00195881090955052,0.169812559207819,-0.310764903222895, + -2.63388617046667e-05,-0.00145935982904599,0.183444738170782,-0.341603258322367, + -2.75594178210659e-05,-0.000959908748541016,0.197076917133745,-0.372441613421839, + -2.87799739377981e-05,-0.000460457668036485,0.210709096096708,-0.403279968521311, + -3.00005300540862e-05,3.8993412468491e-05,0.22434127505967,-0.434118323620783, + -3.12210861695972e-05,0.000538444492974355,0.237973454022634,-0.464956678720255, + -3.24416422864404e-05,0.00103789557347911,0.251605632985597,-0.495795033819727, + -3.36621984028396e-05,0.00153734665398342,0.265237811948559,-0.526633388919199, + -3.48827545193497e-05,0.00203679773448839,0.278869990911522,-0.557471744018671, + -3.61033106354158e-05,0.00253624881499359,0.292502169874486,-0.588310099118142, + -3.73238667522591e-05,0.00303569989549812,0.306134348837449,-0.619148454217614, + -3.85444228689913e-05,0.00353515097600221,0.319766527800411,-0.649986809317087, + -3.97649789841692e-05,0.00403460205650896,0.333398706763375,-0.680825164416558, + -4.09855351010124e-05,0.00453405313701394,0.347030885726338,-0.71166351951603, + -4.22060912178557e-05,0.00503350421751803,0.360663064689301,-0.742501874615502, + -4.34266473331446e-05,0.00553295529802433,0.374295243652264,-0.773340229714974, + -1.21534947497837e-05,-0.00634438197652659,0.0468046375595618,-0.0335522688691095, + -1.30711203291528e-05,-0.00588829157735871,0.0600208473306649,-0.064657822940321, + -1.39887459086052e-05,-0.00543220117819077,0.0732370571017682,-0.0957633770115324, + -1.49063714880437e-05,-0.00497611077902305,0.0864532668728713,-0.126868931082744, + -1.58239970676211e-05,-0.00452002037985533,0.0996694766439744,-0.157974485153955, + -1.67416226470596e-05,-0.0040639299806875,0.112885686415078,-0.189080039225167, + -1.76592482264426e-05,-0.00360783958151967,0.126101896186181,-0.220185593296378, + -1.85768738057424e-05,-0.00315174918235162,0.139318105957284,-0.25129114736759, + -1.94944993854307e-05,-0.00269565878318412,0.152534315728387,-0.282396701438801, + -2.04121249646749e-05,-0.00223956838401596,0.16575052549949,-0.313502255510013, + -2.13297505440302e-05,-0.00178347798484801,0.178966735270593,-0.344607809581224, + -2.2247376123552e-05,-0.00132738758568007,0.192182945041697,-0.375713363652436, + -2.31650017031293e-05,-0.000871297186512798,0.2053991548128,-0.406818917723647, + -2.40826272824846e-05,-0.000415206787344635,0.218615364583903,-0.437924471794858, + -2.50002528621174e-05,4.08836118228617e-05,0.231831574355006,-0.46903002586607, + -2.5917878440973e-05,0.000496974010991691,0.24504778412611,-0.500135579937281, + -2.68355040207169e-05,0.000953064410158744,0.258263993897212,-0.531241134008493, + -2.77531296001277e-05,0.00140915480932691,0.271480203668316,-0.562346688079704, + -2.86707551794274e-05,0.00186524520849507,0.284696413439419,-0.593452242150916, + -2.95883807592823e-05,0.00232133560766234,0.297912623210522,-0.624557796222127, + -3.0506006338249e-05,0.00277742600683073,0.311128832981626,-0.655663350293339, + -3.14236319178818e-05,0.00323351640599867,0.324345042752729,-0.68676890436455, + -3.23412574978477e-05,0.00368960680516528,0.337561252523831,-0.717874458435762, + -3.32588830770364e-05,0.00414569720433322,0.350777462294934,-0.748980012506973, + -3.41765086567802e-05,0.00460178760350072,0.363993672066038,-0.780085566578185, + -1.01620730509622e-05,-0.00623936560030039,0.0464851674537681,-0.0338805154515821, + -1.081832139678e-05,-0.00582879618279192,0.0592865555669479,-0.0652498016095776, + -1.14745697426533e-05,-0.0054182267652837,0.0720879436801276,-0.0966190877675731, + -1.21308180884849e-05,-0.00500765734777514,0.0848893317933074,-0.127988373925569, + -1.27870664344831e-05,-0.00459708793026703,0.0976907199064871,-0.159357660083564, + -1.3443314780287e-05,-0.00418651851275864,0.110492108019667,-0.19072694624156, + -1.40995631261465e-05,-0.00377594909525014,0.123293496132847,-0.222096232399555, + -1.47558114719781e-05,-0.00336537967774198,0.136094884246026,-0.253465518557551, + -1.54120598174767e-05,-0.00295481026023292,0.148896272359206,-0.284834804715546, + -1.60683081635304e-05,-0.00254424084272498,0.161697660472386,-0.316204090873541, + -1.67245565095842e-05,-0.00213367142521692,0.174499048585566,-0.347573377031537, + -1.73808048555268e-05,-0.00172310200770864,0.187300436698745,-0.378942663189533, + -1.8037053201192e-05,-0.00131253259019992,0.200101824811925,-0.410311949347528, + -1.86933015471902e-05,-0.000901963172691866,0.212903212925105,-0.441681235505523, + -1.93495498930218e-05,-0.000491393755183589,0.225704601038284,-0.473050521663519, + -2.00057982384649e-05,-8.08243376744233e-05,0.238505989151465,-0.504419807821514, + -2.06620465843521e-05,0.000329745079833632,0.251307377264644,-0.53578909397951, + -2.13182949301283e-05,0.00074031449734191,0.264108765377824,-0.567158380137506, + -2.19745432760154e-05,0.00115088391485063,0.276910153491004,-0.598527666295501, + -2.26307916216806e-05,0.00156145333235935,0.289711541604184,-0.629896952453496, + -2.32870399675678e-05,0.00197202274986763,0.302512929717363,-0.661266238611492, + -2.3943288313677e-05,0.00238259216737502,0.315314317830542,-0.692635524769487, + -2.45995366598972e-05,0.0027931615848833,0.328115705943723,-0.724004810927483, + -2.52557850056734e-05,0.00320373100239113,0.340917094056902,-0.755374097085478, + -2.59120333515606e-05,0.00361430041989985,0.353718482170082,-0.786743383243474, + -8.26705109892301e-06,-0.00614399811919378,0.0461819444859536,-0.0341871901170836, + -8.71494151642727e-06,-0.00577840804286384,0.058591957638233,-0.0658028762494132, + -9.16283193405643e-06,-0.00541281796653398,0.0710019707905123,-0.0974185623817426, + -9.61072235172722e-06,-0.00504722789020423,0.0834119839427916,-0.129034248514072, + -1.0058612769176e-05,-0.00468163781387432,0.0958219970950708,-0.160649934646402, + -1.05065031867912e-05,-0.00431604773754446,0.10823201024735,-0.192265620778731, + -1.09543936041567e-05,-0.00395045766121427,0.12064202339963,-0.223881306911061, + -1.14022840220218e-05,-0.00358486758488485,0.133052036551909,-0.25549699304339, + -1.18501744393318e-05,-0.00321927750855455,0.145462049704188,-0.28711267917572, + -1.22980648569748e-05,-0.00285368743222492,0.157872062856467,-0.318728365308049, + -1.27459552746734e-05,-0.00248809735589517,0.170282076008747,-0.350344051440379, + -1.31938456918168e-05,-0.00212250727956453,0.182692089161026,-0.381959737572708, + -1.36417361095154e-05,-0.00175691720323479,0.195102102313306,-0.413575423705038, + -1.40896265271029e-05,-0.00139132712690526,0.207512115465585,-0.445191109837367, + -1.45375169446904e-05,-0.00102573705057507,0.219922128617864,-0.476806795969697, + -1.49854073622224e-05,-0.000660146974245324,0.232332141770144,-0.508422482102026, + -1.54332977795324e-05,-0.000294556897915133,0.244742154922423,-0.540038168234356, + -1.58811881972865e-05,7.10331784146145e-05,0.257152168074702,-0.571653854366686, + -1.63290786149295e-05,0.00043662325474414,0.269562181226981,-0.603269540499015, + -1.67769690324615e-05,0.000802213331074331,0.281972194379261,-0.634885226631344, + -1.72248594498825e-05,0.0011678034074043,0.29438220753154,-0.666500912763674, + -1.76727498673035e-05,0.00153339348373427,0.306792220683819,-0.698116598896004, + -1.81206402853906e-05,0.00189898356006335,0.319202233836098,-0.729732285028333, + -1.85685307022565e-05,0.00226457363639376,0.331612246988378,-0.761347971160663, + -1.90164211203436e-05,0.00263016371272329,0.344022260140657,-0.792963657292992, + -6.55658407081039e-06,-0.00606159083217481,0.0459090008301479,-0.0344593555276549, + -6.85022699883908e-06,-0.00573790517319722,0.0579685928599279,-0.0662937149242715, + -7.14386992681226e-06,-0.00541421951421955,0.070028184889708,-0.0981280743208882, + -7.43751285489647e-06,-0.00509053385524205,0.082087776919488,-0.129962433717505, + -7.7311557828974e-06,-0.00476684819626438,0.0941473689492681,-0.161796793114121, + -8.02479871087058e-06,-0.00444316253728694,0.106206960979048,-0.193631152510738, + -8.31844163906581e-06,-0.00411947687830927,0.118266553008828,-0.225465511907355, + -8.61208456715001e-06,-0.00379579121933193,0.130326145038608,-0.257299871303971, + -8.90572749501217e-06,-0.00347210556035404,0.142385737068388,-0.289134230700588, + -9.19937042309638e-06,-0.00314841990137649,0.154445329098168,-0.320968590097205, + -9.49301335084751e-06,-0.0028247342423986,0.166504921127948,-0.352802949493821, + -9.78665627926478e-06,-0.00250104858342159,0.178564513157728,-0.384637308890438, + -1.00802992069604e-05,-0.00217736292444348,0.190624105187508,-0.416471668287055, + -1.03739421350446e-05,-0.00185367726546581,0.202683697217289,-0.448306027683671, + -1.06675850630733e-05,-0.00152999160648859,0.214743289247068,-0.480140387080288, + -1.09612279913796e-05,-0.00120630594751092,0.226802881276849,-0.511974746476904, + -1.12548709191307e-05,-0.000882620288533476,0.238862473306628,-0.543809105873521, + -1.15485138472149e-05,-0.000558934629555585,0.250922065336409,-0.575643465270138, + -1.18421567755211e-05,-0.000235248970578805,0.262981657366188,-0.607477824666755, + -1.21357997029392e-05,8.84366883999732e-05,0.275041249395969,-0.639312184063371, + -1.24294426315785e-05,0.000412122347376531,0.287100841425748,-0.671146543459988, + -1.27230855595517e-05,0.000735808006354421,0.299160433455528,-0.702980902856604, + -1.30167284865257e-05,0.0010594936653332,0.311220025485309,-0.734815262253221, + -1.33103714157201e-05,0.00138317932430976,0.323279617515089,-0.766649621649837, + -1.36040143425831e-05,0.00170686498328809,0.335339209544868,-0.798483981046454, + -5.08478729989437e-06,-0.00599337229756208,0.0456747726584931,-0.0346900943510097, + -5.27140450777563e-06,-0.00570667872925507,0.057435008107411,-0.0667098425212948, + -5.45802171550425e-06,-0.00541998516094772,0.0691952435563291,-0.09872959069158, + -5.64463892352429e-06,-0.00513329159264081,0.080955479005247,-0.130749338861865, + -5.83125613121127e-06,-0.00484659802433351,0.092715714454165,-0.16276908703215, + -6.01787333912029e-06,-0.00455990445602639,0.104475949903083,-0.194788835202435, + -6.20449054683503e-06,-0.00427321088771926,0.116236185352001,-0.22680858337272, + -6.39110775468854e-06,-0.00398651731941224,0.127996420800919,-0.258828331543005, + -6.57772496270859e-06,-0.00369982375110534,0.139756656249837,-0.290848079713291, + -6.76434217045108e-06,-0.00341313018279799,0.151516891698755,-0.322867827883576, + -6.95095937847112e-06,-0.00312643661449075,0.163277127147673,-0.354887576053861, + -7.13757658643566e-06,-0.0028397430461844,0.17503736259659,-0.386907324224146, + -7.32419379384508e-06,-0.00255304947787649,0.186797598045509,-0.418927072394431, + -7.5108110022537e-06,-0.00226635590957036,0.198557833494426,-0.450946820564716, + -7.69742820949659e-06,-0.00197966234126223,0.210318068943345,-0.482966568735001, + -7.88404541740562e-06,-0.00169296877295522,0.222078304392263,-0.514986316905286, + -8.07066262542566e-06,-0.0014062752046482,0.23383853984118,-0.547006065075571, + -8.25727983344571e-06,-0.00111958163634096,0.245598775290099,-0.579025813245856, + -8.44389704091064e-06,-0.000832888068033499,0.257359010739017,-0.611045561416142, + -8.63051424870864e-06,-0.000546194499726482,0.269119246187934,-0.643065309586427, + -8.81713145639562e-06,-0.000259500931419243,0.280879481636852,-0.675085057756712, + -9.00374866452669e-06,2.71926368875519e-05,0.29263971708577,-0.707104805926997, + -9.19036587232469e-06,0.000313886205194347,0.304399952534688,-0.739124554097282, + -9.37698307978962e-06,0.00060057977350203,0.316160187983606,-0.771144302267567, + -9.56360028792069e-06,0.000887273341809269,0.327920423432524,-0.803164050437852, + -3.86957818909739e-06,-0.00593886466524146,0.0454818542272867,-0.0348782456110755, + -3.98575481037888e-06,-0.00568333287867956,0.0569964413405259,-0.067049165269802, + -4.10193143168813e-06,-0.00542780109211766,0.0685110284537651,-0.0992200849285285, + -4.21810805301126e-06,-0.00517226930555587,0.0800256155670042,-0.131391004587255, + -4.33428467425112e-06,-0.0049167375189938,0.0915402026802435,-0.163561924245982, + -4.45046129576854e-06,-0.00466120573243234,0.103054789793482,-0.195732843904708, + -4.56663791703615e-06,-0.00440567394587021,0.114569376906722,-0.227903763563435, + -4.68281453830377e-06,-0.00415014215930853,0.126083964019961,-0.260074683222161, + -4.79899115973792e-06,-0.00389461037274674,0.1375985511332,-0.292245602880888, + -4.91516778067247e-06,-0.0036390785861844,0.149113138246439,-0.324416522539614, + -5.03134440210662e-06,-0.00338354679962261,0.160627725359679,-0.356587442198341, + -5.14752102331872e-06,-0.00312801501306059,0.172142312472918,-0.388758361857067, + -5.2636976448639e-06,-0.0028724832264988,0.183656899586157,-0.420929281515794, + -5.37987426635356e-06,-0.00261695143993745,0.195171486699396,-0.45310020117452, + -5.49605088751015e-06,-0.00236141965337522,0.206686073812635,-0.485271120833247, + -5.61222750872226e-06,-0.00210588786681343,0.218200660925874,-0.517442040491973, + -5.72840413026743e-06,-0.00185035608025164,0.229715248039114,-0.5496129601507, + -5.84458075114647e-06,-0.0015948242936894,0.241229835152353,-0.581783879809426, + -5.96075737246959e-06,-0.00133929250712739,0.252744422265592,-0.613954799468153, + -6.07693399412579e-06,-0.0010837607205656,0.264259009378832,-0.646125719126879, + -6.19311061533789e-06,-0.000828228934004027,0.27577359649207,-0.678296638785606, + -6.30928723632795e-06,-0.000572697147442014,0.287288183605309,-0.710467558444333, + -6.42546385820619e-06,-0.000317165360880445,0.298802770718549,-0.742638478103059, + -6.54164047908523e-06,-6.16335743179874e-05,0.310317357831788,-0.774809397761785, + -6.65781710051938e-06,0.000193898212243138,0.321831944945027,-0.806980317420512, + -2.89997342294013e-06,-0.0058965229248214,0.04532825336189,-0.0350268606255955, + -2.97158240979145e-06,-0.00566623906565222,0.0566478297080244,-0.0673171860908092, + -3.04319139671216e-06,-0.00543595520648321,0.0679674060541586,-0.0996075115560229, + -3.11480038370227e-06,-0.00520567134731414,0.0792869824002929,-0.131897837021237, + -3.18640937066461e-06,-0.00497538748814519,0.0906065587464271,-0.16418816248645, + -3.25801835751593e-06,-0.00474510362897607,0.101926135092561,-0.196478487951664, + -3.32962734445053e-06,-0.00451481976980717,0.113245711438695,-0.228768813416878, + -3.40123633119083e-06,-0.00428453591063782,0.12456528778483,-0.261059138882091, + -3.47284531831971e-06,-0.00405425205146892,0.135884864130964,-0.293349464347305, + -3.54445430494899e-06,-0.00382396819229935,0.147204440477099,-0.325639789812519, + -3.61606329180031e-06,-0.00359368433313034,0.158524016823233,-0.357930115277732, + -3.6876722789847e-06,-0.00336340047396155,0.169843593169367,-0.390220440742946, + -3.75928126594705e-06,-0.00313311661479254,0.181163169515501,-0.42251076620816, + -3.83089025263184e-06,-0.00290283275562331,0.192482745861635,-0.454801091673373, + -3.90249923953867e-06,-0.0026725488964543,0.20380232220777,-0.487091417138587, + -3.97410822638999e-06,-0.00244226503728528,0.215121898553904,-0.519381742603801, + -4.04571721324132e-06,-0.00221198117811627,0.226441474900038,-0.551672068069014, + -4.11732620053673e-06,-0.00198169731894726,0.237761051246172,-0.583962393534228, + -4.18893518738805e-06,-0.00175141345977869,0.249080627592306,-0.616252718999442, + -4.26054417446142e-06,-0.00152112960060924,0.260400203938441,-0.648543044464655, + -4.33215316086866e-06,-0.00129084574143956,0.271719780284575,-0.680833369929869, + -4.40376214749794e-06,-0.00106056188226988,0.28303935663071,-0.713123695395083, + -4.47537113479335e-06,-0.000830278023101982,0.294358932976843,-0.745414020860297, + -4.54698012153365e-06,-0.000599994163932305,0.305678509322978,-0.77770434632551, + -4.61858910860702e-06,-0.000369710304763959,0.316998085669112,-0.809994671790724, + -2.14724391352228e-06,-0.00586434101126784,0.0452092181363553,-0.0351413215647159, + -2.19137834478467e-06,-0.00565388466844047,0.0563780103181248,-0.0675236114979282, + -2.23551277592215e-06,-0.0054434283256129,0.0675468024998945,-0.0999059014311406, + -2.27964720717067e-06,-0.00523297198278561,0.0787155946816639,-0.132288191364353, + -2.32378163830815e-06,-0.00502251563995793,0.0898843868634336,-0.164670481297565, + -2.3679160694734e-06,-0.00481205929713047,0.101053179045203,-0.197052771230778, + -2.41205050061088e-06,-0.00460160295430301,0.112221971226973,-0.22943506116399, + -2.45618493199817e-06,-0.00439114661147566,0.123390763408742,-0.261817351097202, + -2.50031936310791e-06,-0.0041806902686482,0.134559555590512,-0.294199641030415, + -2.54445379432866e-06,-0.00397023392582097,0.145728347772281,-0.326581930963627, + -2.5885882254939e-06,-0.0037597775829934,0.156897139954051,-0.358964220896839, + -2.63272265654813e-06,-0.00354932124016538,0.168065932135821,-0.391346510830052, + -2.67685708760235e-06,-0.00333886489733759,0.179234724317591,-0.423728800763264, + -2.72099151898963e-06,-0.00312840855451091,0.19040351649936,-0.456111090696476, + -2.76512595021039e-06,-0.00291795221168356,0.201572308681129,-0.488493380629689, + -2.80926038154217e-06,-0.00270749586885599,0.212741100862899,-0.520875670562901, + -2.8533948126519e-06,-0.00249703952602864,0.223909893044668,-0.553257960496114, + -2.89752924420572e-06,-0.00228658318320152,0.235078685226438,-0.585640250429326, + -2.94166367509341e-06,-0.00207612684037328,0.246247477408208,-0.618022540362538, + -2.98579810620314e-06,-0.00186567049754593,0.257416269589977,-0.65040483029575, + -3.02993253686878e-06,-0.00165521415471748,0.268585061771747,-0.682787120228963, + -3.07406696864465e-06,-0.00144475781189124,0.279753853953516,-0.715169410162175, + -3.11820139997643e-06,-0.00123430146906367,0.290922646135286,-0.747551700095387, + -3.16233583042003e-06,-0.00102384512623521,0.302091438317056,-0.7799339900286, + -3.20647026230692e-06,-0.000813388783408531,0.313260230498825,-0.812316279961812, + -1.57521898412616e-06,-0.0058402812355243,0.0451188854488749,-0.0352277756672731, + -1.60264036312696e-06,-0.00564502143455947,0.0561734477297235,-0.0676795277734248, + -1.63006174194735e-06,-0.00544976163359451,0.067228010010572,-0.100131279879576, + -1.65748312089264e-06,-0.00525450183262971,0.0782825722914205,-0.132583031985728, + -1.68490449986569e-06,-0.00505924203166486,0.0893371345722691,-0.16503478409188, + -1.71232587875547e-06,-0.00486398223069984,0.100391696853118,-0.197486536198031, + -1.73974725758974e-06,-0.00466872242973504,0.111446259133966,-0.229938288304183, + -1.76716863670157e-06,-0.00447346262877013,0.122500821414815,-0.262390040410335, + -1.79459001553584e-06,-0.00427820282780533,0.133555383695663,-0.294841792516486, + -1.82201139448113e-06,-0.00408294302684031,0.144609945976512,-0.327293544622638, + -1.84943277348193e-06,-0.00388768322587563,0.155664508257361,-0.35974529672879, + -1.87685415253824e-06,-0.00369242342491072,0.166719070538209,-0.392197048834941, + -1.90427553109496e-06,-0.00349716362394537,0.177773632819058,-0.424648800941093, + -1.9316969103178e-06,-0.0033019038229809,0.188828195099906,-0.457100553047244, + -1.9591182892631e-06,-0.00310664402201621,0.199882757380755,-0.489552305153396, + -1.9865396677643e-06,-0.00291138422105086,0.210937319661604,-0.522004057259548, + -2.01396104693163e-06,-0.00271612442008617,0.221991881942452,-0.5544558093657, + -2.04138242643204e-06,-0.00252086461912215,0.2330464442233,-0.586907561471851, + -2.06880380460017e-06,-0.00232560481815636,0.244101006504149,-0.619359313578003, + -2.09622518376751e-06,-0.00213034501719145,0.255155568784998,-0.651811065684154, + -2.12364656326791e-06,-0.00193508521622743,0.266210131065846,-0.684262817790306, + -2.15106794188014e-06,-0.00173982541526208,0.277264693346695,-0.716714569896458, + -2.17848932004827e-06,-0.00154456561429672,0.288319255627543,-0.749166322002609, + -2.20591069888254e-06,-0.00134930581333093,0.299373817908393,-0.781618074108761, + -2.23333207827192e-06,-0.00115404601236735,0.31042838018924,-0.814069826214913, + -1.14752978243315e-06,-0.00582251324052027,0.0450514188223559,-0.0352921190621095, + -1.16480631602578e-06,-0.00563868670992446,0.0560207754968416,-0.0677955683334324, + -1.18208284960453e-06,-0.00545486017932861,0.0669901321713274,-0.100299017604755, + -1.19935938328042e-06,-0.00527103364873294,0.0779594888458131,-0.132802466876078, + -1.21663591656773e-06,-0.00508720711813671,0.0889288455202991,-0.165305916147401, + -1.23391245032689e-06,-0.00490338058754114,0.0998982021947847,-0.197809365418724, + -1.251188983864e-06,-0.00471955405694524,0.110867558869271,-0.230312814690047, + -1.26846551762316e-06,-0.00453572752634968,0.121836915543756,-0.262816263961369, + -1.28574205116028e-06,-0.00435190099575378,0.132806272218242,-0.295319713232692, + -1.30301858458637e-06,-0.00416807446515799,0.143775628892728,-0.327823162504015, + -1.32029511845655e-06,-0.00398424793456242,0.154744985567213,-0.360326611775338, + -1.33757165204917e-06,-0.00380042140396664,0.165714342241699,-0.392830061046661, + -1.35484818508669e-06,-0.00361659487337018,0.176683698916185,-0.425333510317984, + -1.37212471901238e-06,-0.00343276834277462,0.187653055590671,-0.457836959589306, + -1.38940125271603e-06,-0.00324894181217883,0.198622412265157,-0.490340408860629, + -1.40667778558701e-06,-0.00306511528158193,0.209591768939643,-0.522843858131952, + -1.42395432023434e-06,-0.0028812887509877,0.220561125614128,-0.555347307403275, + -1.44123085354941e-06,-0.00269746222039169,0.231530482288614,-0.587850756674598, + -1.45850738753062e-06,-0.00251363568979657,0.242499838963099,-0.620354205945921, + -1.47578392073466e-06,-0.00232980915920011,0.253469195637585,-0.652857655217243, + -1.49306045427178e-06,-0.00214598262860433,0.264438552312071,-0.685361104488566, + -1.51033698803094e-06,-0.00196215609800854,0.275407908986557,-0.717864553759889, + -1.52761352090192e-06,-0.00177832956741186,0.286377265661043,-0.750368003031212, + -1.54489005521619e-06,-0.00159450303681741,0.297346622335528,-0.782871452302535, + -1.56216658819819e-06,-0.00141067650622029,0.308315979010014,-0.815374901573858, + -8.31630060330046e-07,-0.00580950970757976,0.045001627399384,-0.0353394824502399, + -8.42705339509919e-07,-0.0056341664871114,0.0559081602851909,-0.0678809861777422, + -8.53780618564892e-07,-0.00545882326664299,0.0668146931709978,-0.100422489905245, + -8.64855897703132e-07,-0.00528348004617463,0.0777212260568046,-0.132963993632747, + -8.75931176924638e-07,-0.00510813682570643,0.0886277589426114,-0.165505497360249, + -8.87006455979611e-07,-0.00493279360523791,0.0995342918284183,-0.198047001087752, + -8.98081734979073e-07,-0.00475745038476927,0.110440824714225,-0.230588504815254, + -9.09157014394868e-07,-0.0045821071643013,0.121347357600032,-0.263130008542756, + -9.20232293366574e-07,-0.00440676394383277,0.132253890485839,-0.295671512270259, + -9.31307572282769e-07,-0.00423142072336402,0.143160423371646,-0.328213015997761, + -9.42382851587542e-07,-0.00405607750289616,0.154066956257452,-0.360754519725263, + -9.53458130947826e-07,-0.00388073428242786,0.164973489143259,-0.393296023452766, + -9.64533409919532e-07,-0.00370539106195933,0.175880022029066,-0.425837527180268, + -9.75608688891239e-07,-0.0035300478414908,0.186786554914873,-0.45837903090777, + -9.86683968418056e-07,-0.00335470462102294,0.19769308780068,-0.490920534635273, + -9.97759247445273e-07,-0.00317936140055419,0.208599620686487,-0.523462038362775, + -1.00883452636147e-06,-0.00300401818008611,0.219506153572294,-0.556003542090278, + -1.01990980572175e-06,-0.00282867495961758,0.230412686458101,-0.58854504581778, + -1.03098508485999e-06,-0.0026533317391495,0.241319219343907,-0.621086549545282, + -1.04206036377619e-06,-0.00247798851868009,0.252225752229715,-0.653628053272784, + -1.05313564291443e-06,-0.00230264529821245,0.263132285115521,-0.686169557000287, + -1.06421092227471e-06,-0.00212730207774436,0.274038818001328,-0.718711060727789, + -1.07528620130193e-06,-0.00195195885727539,0.284945350887135,-0.751252564455292, + -1.08636148032915e-06,-0.00177661563680775,0.295851883772941,-0.783794068182794, + -1.09743675957841e-06,-0.00160127241633923,0.306758416658749,-0.816335571910297, + -6.00394642863433e-07,-0.00580005558619484,0.0449652028088316,-0.0353740650941542, + -6.07626607168621e-07,-0.00563094253125529,0.0558258090308201,-0.0679433544966126, + -6.14858571307275e-07,-0.00546182947631557,0.0666864152528086,-0.100512643899071, + -6.22090535612463e-07,-0.00529271642137613,0.077547021474797,-0.133081933301529, + -6.29322499862139e-07,-0.00512360336643647,0.0884076276967856,-0.165651222703988, + -6.36554464250594e-07,-0.00495449031149708,0.0992682339187739,-0.198220512106446, + -6.43786428555781e-07,-0.0047853772565577,0.110128840140762,-0.230789801508905, + -6.51018392694436e-07,-0.00461626420161787,0.120989446362751,-0.263359090911363, + -6.58250356999623e-07,-0.00444715114667871,0.131850052584739,-0.295928380313821, + -6.65482321082767e-07,-0.00427803809173866,0.142710658806728,-0.32849766971628, + -6.72714285276932e-07,-0.00410892503679894,0.153571265028716,-0.361066959118738, + -6.79946249637631e-07,-0.00393981198185989,0.164431871250704,-0.393636248521197, + -6.87178214053841e-07,-0.00377069892692039,0.175292477472693,-0.426205537923655, + -6.94410178525562e-07,-0.00360158587198089,0.186153083694681,-0.458774827326114, + -7.0164214283075e-07,-0.00343247281704162,0.19701368991667,-0.491344116728572, + -7.08874106969404e-07,-0.0032633597621019,0.207874296138658,-0.523913406131031, + -7.16106070886013e-07,-0.00309424670716196,0.218734902360647,-0.556482695533489, + -7.23338035579779e-07,-0.00292513365222269,0.229595508582635,-0.589051984935947, + -7.30569999607411e-07,-0.00275602059728319,0.240456114804624,-0.621621274338406, + -7.37801963746065e-07,-0.00258690754234348,0.251316721026612,-0.654190563740864, + -7.45033928661876e-07,-0.00241779448740465,0.2621773272486,-0.686759853143323, + -7.52265892245418e-07,-0.00224868143246404,0.273037933470589,-0.719329142545781, + -7.59497857050206e-07,-0.00207956837752521,0.283898539692578,-0.751898431948239, + -7.66729821521928e-07,-0.00191045532258594,0.294759145914566,-0.784467721350698, + -7.73961785327515e-07,-0.00174134226764533,0.305619752136555,-0.817037010753156, + -2.84782493201324e-05,-0.00729197454872307,0.0597259588284352,-0.0440726974825753, + -3.18714019584831e-05,-0.00661748196895767,0.0752520089806604,-0.0728230742581764, + -3.52645545967922e-05,-0.00594298938919213,0.0907780591328857,-0.101573451033777, + -3.86577072351846e-05,-0.00526849680942676,0.106304109285111,-0.130323827809379, + -4.20508598735769e-05,-0.0045940042296615,0.121830159437336,-0.15907420458498, + -4.5444012511664e-05,-0.00391951164989557,0.137356209589561,-0.187824581360581, + -4.88371651501396e-05,-0.0032450190701302,0.152882259741787,-0.216574958136182, + -5.22303177883932e-05,-0.00257052649036471,0.168408309894012,-0.245325334911783, + -5.56234704267577e-05,-0.00189603391059934,0.183934360046237,-0.274075711687384, + -5.90166230652334e-05,-0.00122154133083408,0.199460410198462,-0.302826088462985, + -6.2409775703709e-05,-0.000547048751068813,0.214986460350687,-0.331576465238586, + -6.58029283415185e-05,0.000127443828697338,0.230512510502913,-0.360326842014187, + -6.9196080979772e-05,0.000801936408463044,0.246038560655138,-0.389077218789788, + -7.25892336184142e-05,0.00147642898822764,0.261564610807363,-0.417827595565389, + -7.59823862567233e-05,0.00215092156799357,0.277090660959589,-0.446577972340991, + -7.93755388952544e-05,0.00282541414775905,0.292616711111814,-0.475328349116592, + -8.27686915334525e-05,0.00349990672752409,0.308142761264039,-0.504078725892193, + -8.61618441717615e-05,0.0041743993072898,0.323668811416264,-0.532829102667794, + -8.95549968101816e-05,0.00484889188705528,0.33919486156849,-0.561579479443395, + -9.29481494481577e-05,0.00552338446682121,0.354720911720715,-0.590329856218996, + -9.63413020870219e-05,0.00619787704658581,0.37024696187294,-0.619080232994597, + -9.97344547251089e-05,0.00687236962635218,0.385773012025166,-0.647830609770198, + -0.000103127607363307,0.00754686220611767,0.401299062177391,-0.676580986545799, + -0.000106520760002393,0.00822135478588226,0.416825112329616,-0.7053313633214, + -0.000109913912640369,0.00889584736564775,0.432351162481841,-0.734081740097001, + -2.83328205074457e-05,-0.00728071021353133,0.0596970031002054,-0.0441038666928489, + -3.16930733335052e-05,-0.00660803700476242,0.0751964528709227,-0.0728724659747643, + -3.50533261596619e-05,-0.00593536379599358,0.09069590264164,-0.10164106525668, + -3.84135789857354e-05,-0.00526269058722467,0.106195352412357,-0.130409664538595, + -4.17738318117811e-05,-0.00459001737845577,0.121694802183075,-0.159178263820511, + -4.5134084637799e-05,-0.00391734416968681,0.137194251953792,-0.187946863102426, + -4.84943374638447e-05,-0.00324467096091785,0.152693701724509,-0.216715462384341, + -5.18545902896683e-05,-0.00257199775214845,0.168193151495227,-0.245484061666257, + -5.52148431159361e-05,-0.00189932454337971,0.183692601265944,-0.274252660948172, + -5.85750959419817e-05,-0.00122665133461064,0.199192051036661,-0.303021260230087, + -6.19353487680829e-05,-0.000553978125841903,0.214691500807378,-0.331789859512003, + -6.52956015942396e-05,0.000118695082927056,0.230190950578096,-0.360558458793918, + -6.86558544201188e-05,0.000791368291696015,0.245690400348813,-0.389327058075834, + -7.20161072461645e-05,0.00146404150046497,0.26118985011953,-0.418095657357749, + -7.53763600719326e-05,0.00213671470923438,0.276689299890248,-0.446864256639665, + -7.87366128985889e-05,0.00280938791800223,0.292188749660965,-0.47563285592158, + -8.2096865724246e-05,0.00348206112677185,0.307688199431682,-0.504401455203495, + -8.54571185503472e-05,0.00415473433554037,0.323187649202399,-0.533170054485411, + -8.88173713763374e-05,0.00482740754430977,0.338687098973117,-0.561938653767326, + -9.21776242027716e-05,0.00550008075307828,0.354186548743834,-0.590707253049242, + -9.55378770288728e-05,0.00617275396184747,0.369685998514552,-0.619475852331157, + -9.8898129854641e-05,0.00684542717061642,0.385185448285269,-0.648244451613072, + -0.000102258382681186,0.0075181003793845,0.400684898055985,-0.677013050894987, + -0.000105618635506954,0.0081907735881539,0.416184347826703,-0.705781650176903, + -0.000108978888332723,0.0088634467969233,0.43168379759742,-0.734550249458818, + -2.81318302663564e-05,-0.00726519504593853,0.0596569780256893,-0.0441468892027146, + -3.14468683355607e-05,-0.0065950543363637,0.0751196777924643,-0.0729406408048461, + -3.47619064047233e-05,-0.00592491362678882,0.0905823775592394,-0.101734392406978, + -3.80769444739415e-05,-0.00525477291721388,0.106045077326015,-0.130528144009109, + -4.13919825430487e-05,-0.00458463220763905,0.12150777709279,-0.159321895611241, + -4.47070206123779e-05,-0.00391449149806444,0.136970476859564,-0.188115647213372, + -4.80220586816515e-05,-0.00324435078848961,0.15243317662634,-0.216909398815504, + -5.13370967507587e-05,-0.00257421007891478,0.167895876393115,-0.245703150417635, + -5.46521348198659e-05,-0.00190406936933962,0.18335857615989,-0.274496902019767, + -5.79671728889175e-05,-0.00123392865976468,0.198821275926665,-0.303290653621898, + -6.12822109583577e-05,-0.000563787950190076,0.21428397569344,-0.33208440522403, + -6.45972490274649e-05,0.000106352759384976,0.229746675460215,-0.360878156826161, + -6.79122870966831e-05,0.000776493468959361,0.24520937522699,-0.389671908428293, + -7.12273251656237e-05,0.00144663417853463,0.260672074993765,-0.418465660030425, + -7.45423632351194e-05,0.00211677488810902,0.27613477476054,-0.447259411632556, + -7.785740130406e-05,0.00278691559768451,0.291597474527315,-0.476053163234688, + -8.11724393735558e-05,0.0034570563072589,0.30706017429409,-0.504846914836819, + -8.44874774427185e-05,0.00412719701683351,0.322522874060865,-0.533640666438951, + -8.78025155117701e-05,0.00479733772640834,0.33798557382764,-0.562434418041082, + -9.11175535808217e-05,0.00546747843598405,0.353448273594416,-0.591228169643214, + -9.44325916502065e-05,0.00613761914555866,0.368910973361191,-0.620021921245345, + -9.7747629718925e-05,0.00680775985513327,0.384373673127965,-0.648815672847477, + -0.000101062667788532,0.00747790056470787,0.39983637289474,-0.677609424449608, + -0.000104377705857583,0.00814804127428337,0.415299072661516,-0.70640317605174, + -0.000107692743927079,0.00881818198385753,0.43076177242829,-0.735196927653871, + -2.78553677655058e-05,-0.00724395350292695,0.0596019109039985,-0.0442059628311834, + -3.11086956129997e-05,-0.00657733028075719,0.0750140858755764,-0.073034250745218, + -3.43620234603825e-05,-0.00591070705858715,0.0904262608471544,-0.101862538659253, + -3.76153513079458e-05,-0.00524408383641739,0.105838435818732,-0.130690826573287, + -4.08686791554258e-05,-0.00457746061424769,0.12125061079031,-0.159519114487322, + -4.4122007002767e-05,-0.00391083739207754,0.136662785761888,-0.188347402401357, + -4.73753348502193e-05,-0.00324421416990772,0.152074960733466,-0.217175690315391, + -5.0628662697616e-05,-0.00257759094773768,0.167487135705044,-0.246003978229426, + -5.38819905452903e-05,-0.00191096772556809,0.182899310676622,-0.274832266143461, + -5.71353183927981e-05,-0.00124434450339828,0.1983114856482,-0.303660554057495, + -6.03886462401948e-05,-0.000577721281228571,0.213723660619778,-0.33248884197153, + -6.36419740874805e-05,8.8901940941799e-05,0.229135835591356,-0.361317129885565, + -6.68953019351548e-05,0.000755525163111059,0.244548010562934,-0.390145417799599, + -7.0148629782496e-05,0.00142214838528143,0.259960185534512,-0.418973705713634, + -7.34019576296152e-05,0.00208877160745158,0.27537236050609,-0.447801993627669, + -7.66552854771785e-05,0.0027553948296215,0.290784535477669,-0.476630281541703, + -7.99086133247418e-05,0.00342201805179143,0.306196710449247,-0.505458569455738, + -8.3161941171972e-05,0.00408864127396114,0.321608885420824,-0.534286857369773, + -8.64152690194242e-05,0.00475526449613128,0.337021060392403,-0.563115145283807, + -8.96685968673205e-05,0.00542188771830077,0.352433235363981,-0.591943433197842, + -9.29219247146618e-05,0.00608851094047047,0.367845410335558,-0.620771721111877, + -9.6175252562225e-05,0.00675513416264018,0.383257585307136,-0.649600009025911, + -9.94285804094552e-05,0.00742175738481032,0.398669760278714,-0.678428296939946, + -0.000102681908256685,0.00808838060698047,0.414081935250292,-0.707256584853981, + -0.000105935236104471,0.00875500382914973,0.42949411022187,-0.736084872768015, + -2.74775680015188e-05,-0.00721511144957537,0.0595266360380612,-0.044286496017058, + -3.06474705275839e-05,-0.00655335836996551,0.074869813130267,-0.0731618661790941, + -3.38173730536351e-05,-0.00589160529035571,0.0902129902224726,-0.10203723634113, + -3.69872755798528e-05,-0.00522985221074601,0.105556167314678,-0.130912606503166, + -4.0157178105904e-05,-0.00456809913113621,0.120899344406884,-0.159787976665203, + -4.3327080631872e-05,-0.0039063460515264,0.13624252149909,-0.188663346827239, + -4.64969831581175e-05,-0.00324459297191682,0.151585698591295,-0.217538716989275, + -4.96668856841409e-05,-0.00258283989230679,0.166928875683501,-0.246414087151311, + -5.28367882101088e-05,-0.00192108681269676,0.182272052775707,-0.275289457313347, + -5.60066907361878e-05,-0.00125933373308706,0.197615229867913,-0.304164827475383, + -5.91765932622113e-05,-0.000597580653477259,0.212958406960118,-0.33304019763742, + -6.23464957884012e-05,6.41724261325471e-05,0.228301584052324,-0.361915567799456, + -6.55163983140361e-05,0.000725925505743019,0.24364476114453,-0.390790937961492, + -6.86863008405592e-05,0.00138767858535238,0.258987938236736,-0.419666308123528, + -7.18562033665826e-05,0.00204943166496241,0.274331115328942,-0.448541678285564, + -7.50261058927171e-05,0.00271118474457155,0.289674292421147,-0.4774170484476, + -7.81960084190736e-05,0.00337293782418113,0.305017469513353,-0.506292418609637, + -8.1365910945097e-05,0.00403469090379072,0.320360646605558,-0.535167788771673, + -8.45358134712315e-05,0.00469644398340097,0.335703823697764,-0.564043158933709, + -8.77057159969219e-05,0.00535819706301122,0.35104700078997,-0.592918529095745, + -9.08756185235005e-05,0.00601995014262036,0.366390177882175,-0.621793899257781, + -9.40455210495239e-05,0.00668170322222972,0.381733354974381,-0.650669269419817, + -9.72154235756584e-05,0.00734345630183952,0.397076532066586,-0.679544639581854, + -0.000100385326101127,0.00800520938145066,0.412419709158793,-0.70842000974389, + -0.000103555228627927,0.00866696246106002,0.427762886250999,-0.737295379905926, + -2.69658674338924e-05,-0.00717638647988697,0.0594246413539615,-0.0443952168496572, + -3.00244447036385e-05,-0.00652134522800274,0.0746744525616861,-0.0733341486496414, + -3.30830219733569e-05,-0.00586630397611854,0.0899242637694107,-0.102273080449626, + -3.61415992432002e-05,-0.00521126272423444,0.105174074977135,-0.13121201224961, + -3.92001765129601e-05,-0.00455622147235035,0.12042388618486,-0.160150944049594, + -4.22587537827201e-05,-0.00390118022046615,0.135673697392585,-0.189089875849578, + -4.53173310523414e-05,-0.00324613896858172,0.150923508600309,-0.218028807649563, + -4.83759083223512e-05,-0.00259109771669797,0.166173319808034,-0.246967739449547, + -5.14344855919724e-05,-0.00193605646481354,0.181423131015758,-0.275906671249531, + -5.44930628618157e-05,-0.00128101521292945,0.196672942223483,-0.304845603049515, + -5.75516401315479e-05,-0.000625973961045023,0.211922753431208,-0.3337845348495, + -6.06102174010581e-05,2.90672908389578e-05,0.227172564638932,-0.362723466649484, + -6.36687946708459e-05,0.000684108542723383,0.242422375846657,-0.391662398449468, + -6.67273719408001e-05,0.00133914979460736,0.257672187054382,-0.420601330249453, + -6.97859492102548e-05,0.00199419104649201,0.272921998262107,-0.449540262049437, + -7.28445264801536e-05,0.00264923229837621,0.288171809469831,-0.478479193849421, + -7.59031037498303e-05,0.00330427355026042,0.303421620677556,-0.507418125649405, + -7.8961681019396e-05,0.00395931480214462,0.31867143188528,-0.536357057449389, + -8.20202582898499e-05,0.00461435605402771,0.333921243093004,-0.565295989249374, + -8.50788355594156e-05,0.00526939730591214,0.349171054300729,-0.594234921049358, + -8.81374128287593e-05,0.00592443855779701,0.364420865508454,-0.623173852849342, + -9.1195990098436e-05,0.00657947980968121,0.379670676716179,-0.652112784649326, + -9.42545673681128e-05,0.00723452106156586,0.394920487923903,-0.681051716449311, + -9.73131446380116e-05,0.00788956231344917,0.410170299131627,-0.709990648249295, + -0.000100371721908021,0.00854460356533293,0.425420110339352,-0.738929580049279, + -2.62811141993613e-05,-0.00712517025886258,0.0592880832589611,-0.0445400712968631, + -2.91937237537065e-05,-0.00647931637516425,0.0744131092949161,-0.0735636895889239, + -3.21063333081073e-05,-0.00583346249146593,0.0895381353308712,-0.102587307880985, + -3.50189428625636e-05,-0.00518760860776779,0.104663161366826,-0.131610926173046, + -3.79315524170754e-05,-0.00454175472406959,0.119788187402781,-0.160634544465106, + -4.08441619714206e-05,-0.00389590084037161,0.134913213438736,-0.189658162757167, + -4.37567715258491e-05,-0.00325004695667308,0.150038239474691,-0.218681781049228, + -4.66693810802221e-05,-0.00260419307297477,0.165163265510646,-0.247705399341289, + -4.95819906347617e-05,-0.0019583391892769,0.180288291546601,-0.27672901763335, + -5.24946001890791e-05,-0.00131248530557837,0.195413317582556,-0.30575263592541, + -5.54072097435632e-05,-0.000666631421880615,0.210538343618511,-0.334776254217471, + -5.83198192981027e-05,-2.07775381819708e-05,0.225663369654466,-0.363799872509532, + -6.12324288523647e-05,0.000625076345516229,0.240788395690421,-0.392823490801593, + -6.41450384065712e-05,0.00127093022921465,0.255913421726376,-0.421847109093654, + -6.70576479612217e-05,0.00191678411291285,0.271038447762331,-0.450870727385714, + -6.99702575155392e-05,0.00256263799661105,0.286163473798286,-0.479894345677775, + -7.28828670699677e-05,0.00320849188030947,0.301288499834241,-0.508917963969836, + -7.57954766245073e-05,0.00385434576400745,0.316413525870196,-0.537941582261897, + -7.87080861786027e-05,0.00450019964770609,0.331538551906151,-0.566965200553958, + -8.16206957334753e-05,0.00514605353140385,0.346663577942106,-0.595988818846019, + -8.45333052880148e-05,0.00579190741510205,0.361788603978061,-0.625012437138079, + -8.74459148416662e-05,0.00643776129880091,0.376913630014016,-0.65403605543014, + -9.03585243967608e-05,0.00708361518249845,0.392038656049971,-0.683059673722201, + -9.32711339513004e-05,0.00772946906619687,0.407163682085927,-0.712083292014262, + -9.61837435055068e-05,0.00837532294989485,0.422288708121881,-0.741106910306323, + -2.53794224035347e-05,-0.00705877183441364,0.0591081483077737,-0.0447297191618403, + -2.81050807483113e-05,-0.00642536954754025,0.074069130089697,-0.0738642115949753, + -3.0830739092963e-05,-0.00579196726066661,0.0890301118716205,-0.10299870402811, + -3.35563974377118e-05,-0.00515856497379319,0.103991093653544,-0.132133196461245, + -3.62820557824606e-05,-0.00452516268691971,0.118952075435467,-0.16126768889438, + -3.90077141270151e-05,-0.00389176040004591,0.133913057217391,-0.190402181327515, + -4.17333724717084e-05,-0.00325835811317254,0.148874038999314,-0.21953667376065, + -4.44590308165682e-05,-0.00262495582629918,0.163835020781237,-0.248671166193785, + -4.71846891612615e-05,-0.00199155353942582,0.178796002563161,-0.27780565862692, + -4.99103475058993e-05,-0.00135815125255223,0.193756984345084,-0.306940151060055, + -5.26360058507591e-05,-0.000724748965678756,0.208717966127007,-0.33607464349319, + -5.53616641952859e-05,-9.13466788048378e-05,0.223678947908931,-0.365209135926325, + -5.80873225402567e-05,0.000542055608067749,0.238639929690854,-0.39434362835946, + -6.08129808845614e-05,0.00117545789494211,0.253600911472778,-0.423478120792595, + -6.35386392294768e-05,0.00180886018181514,0.268561893254701,-0.452612613225731, + -6.62642975741701e-05,0.00244226246868862,0.283522875036624,-0.481747105658865, + -6.89899559187523e-05,0.00307566475556298,0.298483856818548,-0.510881598092001, + -7.17156142635567e-05,0.00370906704243579,0.313444838600471,-0.540016090525135, + -7.444127260825e-05,0.00434246932930971,0.328405820382395,-0.56915058295827, + -7.71669309531653e-05,0.00497587161618274,0.343366802164317,-0.598285075391405, + -7.98925892977476e-05,0.00560927390305643,0.358327783946241,-0.62741956782454, + -8.26182476426629e-05,0.00624267618992969,0.373288765728164,-0.656554060257675, + -8.53439059870231e-05,0.00687607847680338,0.388249747510087,-0.68568855269081, + -8.80695643321605e-05,0.00750948076367619,0.403210729292011,-0.714823045123946, + -9.07952226765207e-05,0.00814288305055078,0.418171711073935,-0.74395753755708, + -2.42169219448612e-05,-0.0069748910802756,0.0588759956276035,-0.0449724007196165, + -2.67104048698452e-05,-0.00635812307561145,0.0736259484247471,-0.0742487724682725, + -2.92038877948153e-05,-0.00574135507094725,0.0883759012218906,-0.103525144216928, + -3.16973707195078e-05,-0.00512458706628288,0.103125854019034,-0.132801515965584, + -3.41908536445612e-05,-0.00450781906161868,0.117875806816178,-0.16207788771424, + -3.66843365696146e-05,-0.00389105105695464,0.132625759613321,-0.191354259462896, + -3.91778194944736e-05,-0.00327428305229027,0.147375712410465,-0.220630631211552, + -4.16713024194437e-05,-0.00265751504762612,0.162125665207608,-0.249907002960208, + -4.41647853443583e-05,-0.00204074704296209,0.176875618004752,-0.279183374708864, + -4.66582682692174e-05,-0.00142397903829772,0.191625570801895,-0.30845974645752, + -4.91517511940764e-05,-0.000807211033633237,0.206375523599039,-0.337736118206176, + -5.16452341192131e-05,-0.000190443028969423,0.221125476396183,-0.367012489954832, + -5.41387170442942e-05,0.000426324975694392,0.235875429193326,-0.396288861703488, + -5.66321999692088e-05,0.00104309298035887,0.25062538199047,-0.425565233452144, + -5.91256828940123e-05,0.00165986098502291,0.265375334787613,-0.4548416052008, + -6.16191658188159e-05,0.00227662898968739,0.280125287584757,-0.484117976949456, + -6.41126487441745e-05,0.00289339699435098,0.2948752403819,-0.513394348698112, + -6.6606131668534e-05,0.00351016499901591,0.309625193179044,-0.542670720446768, + -6.90996145936706e-05,0.00412693300368039,0.324375145976188,-0.571947092195424, + -7.15930975185852e-05,0.0047437010083442,0.339125098773331,-0.60122346394408, + -7.40865804437219e-05,0.00536046901300846,0.353875051570474,-0.630499835692736, + -7.65800633678593e-05,0.00597723701767316,0.368625004367618,-0.659776207441392, + -7.90735462937731e-05,0.00659400502233654,0.383374957164761,-0.689052579190047, + -8.15670292182435e-05,0.00721077302700124,0.398124909961905,-0.718328950938704, + -8.40605121431581e-05,0.0078275410316655,0.412874862759049,-0.74760532268736, + -2.27583961417144e-05,-0.0068723398930263,0.0585844867841895,-0.045274022225637, + -2.49747339643308e-05,-0.00627734400617658,0.0730704197735651,-0.074726731448029, + -2.7191071786753e-05,-0.00568234811932666,0.0875563527629407,-0.104179440670421, + -2.94074096093e-05,-0.00508735223247692,0.102042285752316,-0.133632149892813, + -3.16237474319025e-05,-0.00449235634562717,0.116528218741692,-0.163084859115205, + -3.38400852544218e-05,-0.00389736045877742,0.131014151731067,-0.192537568337597, + -3.60564230769689e-05,-0.00330236457192745,0.145500084720443,-0.221990277559989, + -3.82727608995159e-05,-0.00270736868507782,0.159986017709819,-0.251442986782381, + -4.04890987221185e-05,-0.00211237279822818,0.174471950699194,-0.280895696004773, + -4.270543654461e-05,-0.0015173769113781,0.18895788368857,-0.310348405227165, + -4.49217743672681e-05,-0.000922381024528462,0.203443816677946,-0.339801114449557, + -4.71381121896486e-05,-0.000327385137678382,0.217929749667321,-0.369253823671949, + -4.93544500122511e-05,0.000267610749171254,0.232415682656697,-0.398706532894342, + -5.15707878347982e-05,0.000862606636021113,0.246901615646072,-0.428159242116734, + -5.37871256572897e-05,0.00145760252287097,0.261387548635448,-0.457611951339126, + -5.60034634798923e-05,0.00205259840972039,0.275873481624823,-0.487064660561518, + -5.82198013021618e-05,0.00264759429657069,0.290359414614199,-0.51651736978391, + -6.04361391250974e-05,0.0032425901834201,0.304845347603575,-0.545970079006302, + -6.26524769475889e-05,0.00383758607026974,0.31933128059295,-0.575422788228694, + -6.48688147699694e-05,0.00443258195711982,0.333817213582326,-0.604875497451086, + -6.70851525922389e-05,0.00502757784396968,0.348303146571701,-0.634328206673478, + -6.93014904147304e-05,0.00562257373081954,0.362789079561077,-0.66378091589587, + -7.15178282366669e-05,0.00621756961767028,0.377275012550453,-0.693233625118262, + -7.37341660600466e-05,0.00681256550451881,0.391760945539828,-0.722686334340654, + -7.59505038830932e-05,0.00740756139136778,0.406246878529203,-0.752139043563046, + -2.09896723926684e-05,-0.00675189391053091,0.0582306870362514,-0.0456356018562426, + -2.28911588340958e-05,-0.00618460437605056,0.0723975777075627,-0.075299701968683, + -2.47926452754677e-05,-0.00561731484157013,0.0865644683788739,-0.104963802081123, + -2.66941317169644e-05,-0.00505002530708998,0.100731359050185,-0.134627902193564, + -2.85956181584335e-05,-0.00448273577260982,0.114898249721496,-0.164292002306004, + -3.04971045997915e-05,-0.00391544623812956,0.129065140392807,-0.193956102418445, + -3.23985910411495e-05,-0.00334815670364919,0.143232031064119,-0.223620202530885, + -3.4300077482452e-05,-0.0027808671691687,0.15739892173543,-0.253284302643326, + -3.62015639240321e-05,-0.00221357763468855,0.171565812406741,-0.282948402755766, + -3.81030503653346e-05,-0.00164628810020817,0.185732703078052,-0.312612502868207, + -4.00045368067481e-05,-0.0010789985657278,0.199899593749363,-0.342276602980647, + -4.19060232480506e-05,-0.000511709031247198,0.214066484420675,-0.371940703093087, + -4.38075096894641e-05,5.55805032329548e-05,0.228233375091986,-0.401604803205528, + -4.57089961309887e-05,0.00062287003771333,0.242400265763297,-0.431268903317968, + -4.76104825724022e-05,0.00119015957219326,0.256567156434608,-0.460933003430409, + -4.95119690139267e-05,0.00175744910667364,0.270734047105919,-0.490597103542849, + -5.14134554552292e-05,0.00232473864115401,0.28490093777723,-0.52026120365529, + -5.33149418967538e-05,0.00289202817563394,0.299067828448541,-0.54992530376773, + -5.52164283381673e-05,0.00345931771011387,0.313234719119852,-0.57958940388017, + -5.71179147794698e-05,0.00402660724459469,0.327401609791164,-0.609253503992611, + -5.90194012208833e-05,0.00459389677907529,0.341568500462475,-0.638917604105051, + -6.09208876626299e-05,0.005161186313555,0.355735391133786,-0.668581704217492, + -6.28223741040435e-05,0.00572847584803515,0.369902281805097,-0.698245804329932, + -6.472386054579e-05,0.00629576538251531,0.384069172476408,-0.727909904442373, + -6.66253469867595e-05,0.00686305491699635,0.39823606314772,-0.757574004554813, + -1.89311786960439e-05,-0.00661695961314956,0.0578186243856483,-0.0460507569456302, + -2.04957256269706e-05,-0.00608364584900739,0.0716157856959496,-0.0759575698560974, + -2.20602725578278e-05,-0.00555033208486505,0.085412947006251,-0.105864382766565, + -2.36248194886157e-05,-0.00501701832072277,0.0992101083165523,-0.135771195677032, + -2.51893664195424e-05,-0.00448370455658043,0.113007269626854,-0.165678008587499, + -2.67539133505523e-05,-0.00395039079243842,0.126804430937155,-0.195584821497966, + -2.83184602813402e-05,-0.00341707702829597,0.140601592247456,-0.225491634408434, + -2.98830072125167e-05,-0.00288376326415407,0.154398753557758,-0.255398447318901, + -3.14475541430825e-05,-0.0023504495000114,0.168195914868059,-0.285305260229368, + -3.3012101074148e-05,-0.00181713573586939,0.18199307617836,-0.315212073139835, + -3.45766480051024e-05,-0.00128382197172727,0.195790237488662,-0.345118886050302, + -3.61411949358348e-05,-0.00075050820758471,0.209587398798963,-0.37502569896077, + -3.77057418669002e-05,-0.000217194443442814,0.223384560109264,-0.404932511871237, + -3.92702887974661e-05,0.000316119320699748,0.237181721419566,-0.434839324781704, + -4.0834835728476e-05,0.000849433084842088,0.250978882729867,-0.464746137692171, + -4.23993826591529e-05,0.00138274684898443,0.264776044040169,-0.494652950602639, + -4.39639295901628e-05,0.00191606061312677,0.27857320535047,-0.524559763513106, + -4.55284765215058e-05,0.00244937437726822,0.292370366660771,-0.554466576423573, + -4.70930234520717e-05,0.00298268814141078,0.306167527971072,-0.58437338933404, + -4.86575703828596e-05,0.00351600190555335,0.319964689281374,-0.614280202244507, + -5.02221173135364e-05,0.00404931566969591,0.333761850591676,-0.644187015154975, + -5.17866642448794e-05,0.00458262943383758,0.347559011901977,-0.674093828065442, + -5.33512111760004e-05,0.00511594319797926,0.361356173212278,-0.704000640975909, + -5.49157581065662e-05,0.00564925696212271,0.37515333452258,-0.733907453886376, + -5.648030503691e-05,0.00618257072626482,0.388950495832881,-0.763814266796844, + -1.66470254656104e-05,-0.00647361313829381,0.0573611600706776,-0.04650446136626, + -1.78751135015004e-05,-0.00598008142069067,0.0707500867390631,-0.076676524233245, + -1.91032015374459e-05,-0.00548654970308754,0.0841390134074487,-0.10684858710023, + -2.03312895733776e-05,-0.00499301798548435,0.0975279400758344,-0.137020649967215, + -2.15593776093093e-05,-0.00449948626788133,0.11091686674422,-0.1671927128342, + -2.27874656453242e-05,-0.0040059545502783,0.124305793412605,-0.197364775701185, + -2.40155536812003e-05,-0.00351242283267506,0.137694720080991,-0.22753683856817, + -2.524364171691e-05,-0.0030188911150717,0.151083646749377,-0.257708901435155, + -2.64717297531192e-05,-0.0025253593974689,0.164472573417762,-0.28788096430214, + -2.76998177888288e-05,-0.00203182767986543,0.177861500086148,-0.318053027169125, + -2.8927905825149e-05,-0.00153829596226274,0.191250426754533,-0.34822509003611, + -3.01559938605811e-05,-0.00104476424465938,0.204639353422919,-0.378397152903095, + -3.13840818968458e-05,-0.000551232527056245,0.218028280091305,-0.40856921577008, + -3.26121699325554e-05,-5.77008094531095e-05,0.23141720675969,-0.438741278637065, + -3.38402579687092e-05,0.000435830908150026,0.244806133428076,-0.46891334150405, + -3.50683460041967e-05,0.000929362625753605,0.258195060096461,-0.499085404371035, + -3.62964340406835e-05,0.00142289434335607,0.271583986764847,-0.52925746723802, + -3.75245220763931e-05,0.00191642606095943,0.284972913433232,-0.559429530105005, + -3.87526101122138e-05,0.00240995777856257,0.298361840101618,-0.58960159297199, + -3.99806981481454e-05,0.0029034894961657,0.311750766770003,-0.619773655838975, + -4.12087861839661e-05,0.00339702121376906,0.325139693438389,-0.64994571870596, + -4.24368742201198e-05,0.00389055293137197,0.338528620106775,-0.680117781572945, + -4.36649622556073e-05,0.00438408464897577,0.351917546775161,-0.710289844439929, + -4.48930502920941e-05,0.0048776163665778,0.365306473443546,-0.740461907306915, + -4.61211383281368e-05,0.00537114808418071,0.378695400111931,-0.7706339701739, + -1.42427884829849e-05,-0.00632971345519029,0.0568795639046676,-0.0469743050743908, + -1.51596241397545e-05,-0.00588030446785154,0.0698411395937946,-0.0774210534359073, + -1.60764597967322e-05,-0.00543089548051295,0.0828027152829215,-0.107867801797424, + -1.69932954535712e-05,-0.00498148649317443,0.0957642909720484,-0.13831455015894, + -1.79101311104657e-05,-0.00453207750583573,0.108725866661175,-0.168761298520457, + -1.88269667673047e-05,-0.00408266851849703,0.121687442350302,-0.199208046881973, + -1.97438024240881e-05,-0.00363325953115845,0.134649018039429,-0.22965479524349, + -2.06606380810381e-05,-0.00318385054381976,0.147610593728556,-0.260101543605006, + -2.15774737381547e-05,-0.00273444155648161,0.160572169417683,-0.290548291966523, + -2.24943093948271e-05,-0.00228503256914259,0.17353374510681,-0.320995040328039, + -2.34111450516661e-05,-0.00183562358180422,0.186495320795937,-0.351441788689556, + -2.43279807084495e-05,-0.00138621459446542,0.199456896485064,-0.381888537051072, + -2.52448163652885e-05,-0.000936805607126612,0.212418472174191,-0.412335285412589, + -2.6161652022072e-05,-0.00048739661978825,0.225380047863317,-0.442782033774105, + -2.7078487678911e-05,-3.79876324492212e-05,0.238341623552444,-0.473228782135622, + -2.7995323335972e-05,0.000411421354889141,0.251303199241571,-0.503675530497138, + -2.89121589926999e-05,0.000860830342227725,0.264264774930698,-0.534122278858655, + -2.9828994649872e-05,0.00131023932956631,0.277226350619825,-0.564569027220171, + -3.0745830306822e-05,0.00175964831690489,0.290187926308952,-0.595015775581688, + -3.1662665963772e-05,0.00220905730424326,0.303149501998079,-0.625462523943204, + -3.25795016201669e-05,0.00265846629158251,0.316111077687206,-0.655909272304721, + -3.34963372773389e-05,0.00310787527892042,0.329072653376333,-0.686356020666237, + -3.44131729342889e-05,0.00355728426625879,0.342034229065459,-0.716802769027754, + -3.53300085910169e-05,0.00400669325359759,0.354995804754586,-0.74724951738927, + -3.62468442477448e-05,0.0044561022409364,0.367957380443713,-0.777696265750787, + -1.18487128997202e-05,-0.00619326655079422,0.0564001055218364,-0.04743450078835, + -1.2499750499384e-05,-0.00578996693775052,0.0689385738635717,-0.0781502941218063, + -1.31507880989923e-05,-0.00538666732470688,0.0814770422053068,-0.108866087455263, + -1.38018256987948e-05,-0.00498336771166341,0.094015510547042,-0.139581880788719, + -1.44528632982921e-05,-0.00458006809861966,0.106553978888777,-0.170297674122175, + -1.51039008980391e-05,-0.00417676848557602,0.119092447230512,-0.201013467455632, + -1.5754938497814e-05,-0.0037734688725326,0.131630915572247,-0.231729260789088, + -1.64059760973112e-05,-0.00337016925948874,0.144169383913983,-0.262445054122544, + -1.70570136970305e-05,-0.00296686964644532,0.156707852255718,-0.293160847456001, + -1.77080512969163e-05,-0.00256357003340191,0.169246320597453,-0.323876640789457, + -1.83590888963026e-05,-0.00216027042035782,0.181784788939188,-0.354592434122913, + -1.90101264960774e-05,-0.00175697080731441,0.194323257280923,-0.38530822745637, + -1.96611640961297e-05,-0.00135367119427099,0.206861725622659,-0.416024020789826, + -2.0312201695627e-05,-0.000950371581227349,0.219400193964394,-0.446739814123282, + -2.09632392947912e-05,-0.000547071968183044,0.231938662306129,-0.477455607456739, + -2.16142768949545e-05,-0.00014377235514007,0.244477130647864,-0.508171400790195, + -2.22653144947849e-05,0.000259527257903347,0.257015598989599,-0.538887194123651, + -2.2916352093949e-05,0.000662826870947431,0.269554067331335,-0.569602987457108, + -2.35673896938904e-05,0.00106612648399063,0.282092535673069,-0.600318780790564, + -2.42184272931656e-05,0.00146942609703471,0.294631004014805,-0.63103457412402, + -2.4869464893329e-05,0.0018727257100779,0.30716947235654,-0.661750367457477, + -2.55205024934924e-05,0.0022760253231211,0.319707940698275,-0.692466160790933, + -2.61715400923235e-05,0.00267932493616518,0.33224640904001,-0.72318195412439, + -2.68225776921538e-05,0.00308262454920882,0.344784877381745,-0.753897747457846, + -2.74736152920951e-05,0.00348592416225246,0.357323345723481,-0.784613540791302, + -9.59285573970403e-06,-0.00607071185607524,0.0559485849309637,-0.0478613003010824, + -1.00341497088624e-05,-0.00571274019390927,0.0680906422344277,-0.0788266141308056, + -1.04754436778542e-05,-0.00535476853174316,0.0802326995378917,-0.109791927960529, + -1.09167376469987e-05,-0.0049967968695771,0.0923747568413559,-0.140757241790252, + -1.13580316161432e-05,-0.0046388252074111,0.10451681414482,-0.171722555619976, + -1.1799325585371e-05,-0.00428085354524532,0.116658871448284,-0.202687869449699, + -1.2240619554349e-05,-0.00392288188307921,0.128800928751748,-0.233653183279422, + -1.26819135233824e-05,-0.0035649102209131,0.140942986055212,-0.264618497109145, + -1.31232074925824e-05,-0.0032069385587471,0.153085043358676,-0.295583810938869, + -1.35645014618935e-05,-0.00284896689658143,0.16522710066214,-0.326549124768592, + -1.40057954307604e-05,-0.00249099523441521,0.177369157965604,-0.357514438598315, + -1.44470893999604e-05,-0.0021330235722492,0.189511215269068,-0.388479752428039, + -1.48883833688829e-05,-0.00177505191008298,0.201653272572532,-0.419445066257762, + -1.53296773383049e-05,-0.00141708024791742,0.213795329875996,-0.450410380087485, + -1.57709713073384e-05,-0.0010591085857512,0.22593738717946,-0.481375693917208, + -1.62122652762609e-05,-0.000701136923585199,0.238079444482924,-0.512341007746932, + -1.66535592456274e-05,-0.00034316526141942,0.250221501786388,-0.543306321576655, + -1.70948532147719e-05,1.48064007463589e-05,0.262363559089852,-0.574271635406378, + -1.75361471838054e-05,0.000372778062912582,0.274505616393316,-0.605236949236102, + -1.79774411530609e-05,0.000730749725078361,0.28664767369678,-0.636202263065825, + -1.84187351220944e-05,0.00108872138724481,0.298789731000244,-0.667167576895548, + -1.88600290911278e-05,0.00144669304941081,0.310931788303708,-0.698132890725272, + -1.93013230600503e-05,0.00180466471157681,0.323073845607172,-0.729098204554995, + -1.97426170291948e-05,0.00216263637374237,0.335215902910635,-0.760063518384718, + -2.01839109986723e-05,0.00252060803590837,0.3473579602141,-0.791028832214441, + -7.57517455252099e-06,-0.00596586621096029,0.0555450709451129,-0.0482375490255339, + -7.86266118284196e-06,-0.0056499052921945,0.0673344695282808,-0.0794228297616014, + -8.15014781332946e-06,-0.00533394437342888,0.0791238681114488,-0.110608110497669, + -8.43763444380308e-06,-0.00501798345466331,0.0909132666946166,-0.141793391233736, + -8.72512107416568e-06,-0.00470202253589747,0.102702665277785,-0.172978671969804, + -9.01260770475032e-06,-0.00438606161713206,0.114492063860952,-0.204163952705871, + -9.30009433519619e-06,-0.00407010069836633,0.12628146244412,-0.235349233441939, + -9.58758096547552e-06,-0.00375413977960026,0.138070861027289,-0.266534514178006, + -9.87506759586587e-06,-0.00343817886083453,0.149860259610457,-0.297719794914074, + -1.01625542266448e-05,-0.00312221794206935,0.161649658193624,-0.328905075650142, + -1.04500408568131e-05,-0.00280625702330339,0.173439056776792,-0.360090356386209, + -1.07375274873145e-05,-0.0024902961045381,0.18522845535996,-0.391275637122276, + -1.10250141178159e-05,-0.00217433518577237,0.197017853943128,-0.422460917858344, + -1.13125007482617e-05,-0.00185837426700641,0.208807252526296,-0.453646198594411, + -1.15999873788741e-05,-0.00154241334824112,0.220596651109464,-0.484831479330479, + -1.18874740092645e-05,-0.00122645242947539,0.232386049692632,-0.516016760066546, + -1.21749606394328e-05,-0.000910491510709432,0.2441754482758,-0.547202040802614, + -1.24624472701562e-05,-0.00059453059194392,0.255964846858968,-0.578387321538681, + -1.27499339002135e-05,-0.000278569673178186,0.267754245442135,-0.609572602274749, + -1.30374205303818e-05,3.73912455882142e-05,0.279543644025304,-0.640757883010816, + -1.33249071612163e-05,0.000353352164352838,0.291333042608471,-0.671943163746884, + -1.36123937919397e-05,0.00066931308311835,0.303122441191639,-0.703128444482952, + -1.3899880421997e-05,0.000985274001884751,0.314911839774807,-0.734313725219019, + -1.41873670521653e-05,0.00130123492065071,0.326701238357975,-0.765499005955087, + -1.44748536839989e-05,0.00161719583941489,0.338490636941143,-0.796684286691154, + -5.85291751924177e-06,-0.00587982223885913,0.055200969110531,-0.0485546865512454, + -6.03458705161763e-06,-0.00560076788768915,0.0666907856685643,-0.079925375916985, + -6.21625658403513e-06,-0.00532171353651917,0.0781806022265976,-0.111296065282725, + -6.39792611628609e-06,-0.00504265918534896,0.0896704187846309,-0.142666754648464, + -6.57959564870358e-06,-0.00476360483417904,0.101160235342664,-0.174037444014204, + -6.76126518128761e-06,-0.00448455048300944,0.112650051900697,-0.205408133379943, + -6.94293471348306e-06,-0.00420549613183918,0.124139868458731,-0.236778822745683, + -7.12460424601158e-06,-0.00392644178066914,0.135629685016764,-0.268149512111422, + -7.30627377809601e-06,-0.00364738742949899,0.147119501574797,-0.299520201477162, + -7.48794331079106e-06,-0.0033683330783294,0.15860931813283,-0.330890890842902, + -7.66961284337508e-06,-0.00308927872715947,0.170099134690864,-0.362261580208641, + -7.851282375404e-06,-0.00281022437598932,0.181588951248897,-0.393632269574381, + -8.03295190798803e-06,-0.0025311700248194,0.19307876780693,-0.42500295894012, + -8.2146214402945e-06,-0.00225211567364947,0.204568584364963,-0.45637364830586, + -8.39629097293404e-06,-0.00197306132247976,0.216058400922997,-0.487744337671599, + -8.57796050512949e-06,-0.00169400697130939,0.22754821748103,-0.519115027037339, + -8.75963003721392e-06,-0.00141495262013946,0.239038034039063,-0.550485716403079, + -8.94129957018652e-06,-0.00113589826896954,0.250527850597097,-0.581856405768818, + -9.12296910238197e-06,-0.00085684391779961,0.26201766715513,-0.613227095134558, + -9.30463863491049e-06,-0.000577789566630127,0.273507483713163,-0.644597784500297, + -9.48630816699492e-06,-0.000298735215459089,0.284997300271197,-0.675968473866037, + -9.66797769930139e-06,-1.96808642889401e-05,0.29648711682923,-0.707339163231776, + -9.84964723171888e-06,0.000259373486879877,0.307976933387262,-0.738709852597516, + -1.00313167636923e-05,0.000538427838051359,0.319466749945297,-0.770080541963256, + -1.02129862968869e-05,0.000817482189219731,0.330956566503329,-0.801451231328995, + -4.44050545927999e-06,-0.00581156574737568,0.0549190472023984,-0.0488120486915552, + -4.55304085171526e-06,-0.00556346920329315,0.066164182659506,-0.0803332001057616, + -4.66557624420605e-06,-0.00531537265921084,0.0774093181166134,-0.111854351519968, + -4.7781116366552e-06,-0.00506727611512836,0.0886544535737209,-0.143375502934175, + -4.89064702915987e-06,-0.00481917957104605,0.0998995890308284,-0.174896654348381, + -5.00318242158126e-06,-0.00457108302696352,0.111144724487936,-0.206417805762588, + -5.11571781386388e-06,-0.00432298648288099,0.122389859945043,-0.237938957176794, + -5.22825320653508e-06,-0.00407488993879868,0.133634995402151,-0.269460108591001, + -5.34078859898424e-06,-0.00382679339471614,0.144880130859259,-0.300981260005207, + -5.45332399143339e-06,-0.00357869685063372,0.156125266316366,-0.332502411419414, + -5.56585938371601e-06,-0.00333060030655119,0.167370401773474,-0.36402356283362, + -5.67839477599863e-06,-0.00308250376246821,0.178615537230581,-0.395544714247827, + -5.79093016844778e-06,-0.00283440721838635,0.189860672687688,-0.427065865662033, + -5.90346556095245e-06,-0.00258631067430382,0.201105808144796,-0.45858701707624, + -6.01600095384569e-06,-0.00233821413022173,0.212350943601904,-0.490108168490446, + -6.12853634596178e-06,-0.00209011758613853,0.223596079059011,-0.521629319904652, + -6.24107173863298e-06,-0.00184202104205666,0.234841214516119,-0.553150471318859, + -6.35360713086008e-06,-0.00159392449797413,0.246086349973226,-0.584671622733065, + -6.46614252330924e-06,-0.00134582795389182,0.257331485430333,-0.616192774147272, + -6.57867791564737e-06,-0.00109773140980884,0.268576620887441,-0.647713925561478, + -6.69121330909572e-06,-0.000849634865727644,0.279821756344548,-0.679235076975685, + -6.80374870098976e-06,-0.000601538321644668,0.291066891801656,-0.710756228389892, + -6.91628409321687e-06,-0.000353441777561692,0.302312027258764,-0.742277379804098, + -7.02881948633216e-06,-0.000105345233480492,0.313557162715871,-0.773798531218305, + -7.14135487844825e-06,0.000142751310602485,0.324802298172979,-0.805319682632511, + -3.31973059683466e-06,-0.00575884980193198,0.0546955368165693,-0.0490145482464725, + -3.38879714462115e-06,-0.0055357471369798,0.0657471645046427,-0.0806540873062349, + -3.45786369237988e-06,-0.00531264447202762,0.0767987921927161,-0.112293626365997, + -3.52693024002759e-06,-0.00508954180707522,0.0878504198807896,-0.14393316542576, + -3.59599678795286e-06,-0.00486643914212315,0.0989020475688629,-0.175572704485522, + -3.66506333560057e-06,-0.00464333647717075,0.109953675256936,-0.207212243545285, + -3.73412988341482e-06,-0.00442023381221845,0.12100530294501,-0.238851782605047, + -3.80319643111804e-06,-0.00419713114726605,0.132056930633084,-0.270491321664809, + -3.87226297915433e-06,-0.00397402848231443,0.143108558321157,-0.302130860724572, + -3.94132952680204e-06,-0.00375092581736203,0.15416018600923,-0.333770399784334, + -4.01039607411668e-06,-0.00352782315240896,0.165211813697304,-0.365409938844097, + -4.07946262231951e-06,-0.00330472048745745,0.176263441385377,-0.397049477903859, + -4.14852917002273e-06,-0.00308161782250505,0.187315069073451,-0.428689016963622, + -4.2175957174484e-06,-0.00285851515755242,0.198366696761524,-0.460328556023384, + -4.28666226548469e-06,-0.00263541249260091,0.209418324449597,-0.491968095083147, + -4.35572881329893e-06,-0.00241230982764851,0.220469952137671,-0.523607634142909, + -4.42479536066909e-06,-0.00218920716269611,0.231521579825744,-0.555247173202671, + -4.4938619088164e-06,-0.00196610449774393,0.242573207513818,-0.586886712262434, + -4.56292845663064e-06,-0.00174300183279197,0.253624835201891,-0.618526251322196, + -4.63199500422284e-06,-0.00151989916783934,0.264676462889964,-0.650165790381959, + -4.70106155192607e-06,-0.00129679650288761,0.275728090578037,-0.681805329441721, + -4.77012809951827e-06,-0.00107369383793454,0.286779718266111,-0.713444868501484, + -4.83919464788762e-06,-0.00085059117298325,0.297831345954185,-0.745084407561246, + -4.90826119481369e-06,-0.000627488508029739,0.308882973642258,-0.776723946621009, + -4.97732774284998e-06,-0.000404385843077559,0.319934601330332,-0.808363485680771, + -2.45340071673705e-06,-0.00571896343692924,0.0545229018106951,-0.0491700415113413, + -2.49581029534984e-06,-0.00551543306426827,0.0654253513504637,-0.0809004868525282, + -2.53821987394875e-06,-0.0053119026916072,0.0763278008902324,-0.112630932193715, + -2.58062945240889e-06,-0.0051083723189459,0.0872302504300012,-0.144361377534902, + -2.62303903095229e-06,-0.00490484194628504,0.0981326999697696,-0.176091822876089, + -2.66544860949569e-06,-0.00470131157362386,0.109035149509538,-0.207822268217276, + -2.7078581883444e-06,-0.00449778120096311,0.119937599049307,-0.239552713558462, + -2.75026776674903e-06,-0.00429425082830182,0.130840048589076,-0.271283158899649, + -2.79267734526467e-06,-0.00409072045564074,0.141742498128844,-0.303013604240836, + -2.83508692394685e-06,-0.00388719008298,0.152644947668613,-0.334744049582023, + -2.87749650229596e-06,-0.00368365971031848,0.163547397208382,-0.36647449492321, + -2.91990608081161e-06,-0.00348012933765762,0.17444984674815,-0.398204940264397, + -2.96231565988236e-06,-0.00327659896499699,0.185352296287919,-0.429935385605584, + -3.00472523795392e-06,-0.00307306859233525,0.196254745827688,-0.46166583094677, + -3.04713481646957e-06,-0.00286953821967395,0.207157195367456,-0.493396276287957, + -3.08954439487419e-06,-0.00266600784701287,0.218059644907225,-0.525126721629144, + -3.13195397350086e-06,-0.00246247747435202,0.228962094446993,-0.556857166970331, + -3.17436355234957e-06,-0.00225894710169117,0.239864543986762,-0.588587612311518, + -3.21677313119828e-06,-0.00205541672903053,0.25076699352653,-0.620318057652705, + -3.25918270949188e-06,-0.00185188635636901,0.261669443066299,-0.652048502993891, + -3.30159228800753e-06,-0.00164835598370772,0.272571892606068,-0.683778948335078, + -3.34400186652317e-06,-0.00144482561104686,0.283474342145836,-0.715509393676265, + -3.38641144503882e-06,-0.00124129523838645,0.294376791685604,-0.747239839017452, + -3.42882102366548e-06,-0.00103776486572427,0.305279241225374,-0.778970284358639, + -3.47123060229215e-06,-0.000834234493063413,0.316181690765143,-0.810700729699826, + -1.79723251893249e-06,-0.00568924620187969,0.0543922282550564,-0.0492872186713995, + -1.82349798166781e-06,-0.00550068362258754,0.065181921298203,-0.0810861694870695, + -1.84976344422272e-06,-0.00531212104329515,0.0759716143413497,-0.112885120302739, + -1.87602890705518e-06,-0.00512355846400303,0.0867613073844965,-0.144684071118409, + -1.90229436969336e-06,-0.0049349958847108,0.0975510004276431,-0.176483021934079, + -1.92855983244256e-06,-0.00474643330541868,0.10834069347079,-0.208281972749749, + -1.95482529502522e-06,-0.00455787072612646,0.119130386513936,-0.240080923565419, + -1.98109075788544e-06,-0.00436930814683434,0.129920079557083,-0.271879874381089, + -2.00735622030157e-06,-0.00418074556754178,0.14070977260023,-0.303678825196759, + -2.03362168277321e-06,-0.00399218298824922,0.151499465643377,-0.335477776012429, + -2.05988714607752e-06,-0.00380362040895799,0.162289158686523,-0.367276726828099, + -2.08615260838263e-06,-0.00361505782966542,0.17307885172967,-0.399075677643769, + -2.11241807129836e-06,-0.00342649525037308,0.183868544772817,-0.430874628459438, + -2.13868353382551e-06,-0.00323793267108075,0.194658237815963,-0.462673579275108, + -2.16494899696329e-06,-0.00304937009178952,0.205447930859109,-0.494472530090778, + -2.19121445943493e-06,-0.00286080751249673,0.216237623902256,-0.526271480906448, + -2.21747992190657e-06,-0.00267224493320417,0.227027316945403,-0.558070431722118, + -2.2437453848223e-06,-0.0024836823539125,0.237817009988549,-0.589869382537788, + -2.27001084740497e-06,-0.00229511977461994,0.248606703031696,-0.621668333353458, + -2.29627631009865e-06,-0.0021065571953276,0.259396396074843,-0.653467284169128, + -2.32254177268132e-06,-0.00191799461603548,0.27018608911799,-0.685266234984798, + -2.34880723537501e-06,-0.00172943203674336,0.280975782161136,-0.717065185800468, + -2.37507269829074e-06,-0.00154086945745124,0.291765475204283,-0.748864136616137, + -2.40133816065136e-06,-0.00135230687815868,0.30255516824743,-0.780663087431807, + -2.42760362356709e-06,-0.00116374429886656,0.313344861290576,-0.812462038247477, + -1.30786010667239e-06,-0.00566735681711797,0.0542948197846209,-0.0493742777079591, + -1.32436299335459e-06,-0.00549003648582658,0.0650005499420833,-0.0812241259903759, + -1.34086588032822e-06,-0.00531271615453555,0.0757062800995456,-0.113073974272793, + -1.35736876705206e-06,-0.00513539582324418,0.086412010257008,-0.144923822555209, + -1.37387165394243e-06,-0.00495807549195304,0.0971177404144702,-0.176773670837626, + -1.39037454066626e-06,-0.00478075516066157,0.107823470571933,-0.208623519120043, + -1.40687742744561e-06,-0.00460343482937042,0.118529200729395,-0.24047336740246, + -1.42338031439149e-06,-0.00442611449807928,0.129234930886857,-0.272323215684876, + -1.43988320094879e-06,-0.00424879416678792,0.13994066104432,-0.304173063967293, + -1.45638608800569e-06,-0.00407147383549677,0.150646391201782,-0.33602291224971, + -1.47288897484055e-06,-0.00389415350420563,0.161352121359244,-0.367872760532127, + -1.48939186145336e-06,-0.00371683317291427,0.172057851516707,-0.399722608814543, + -1.50589474806617e-06,-0.00353951284162246,0.182763581674169,-0.43157245709696, + -1.52239763517859e-06,-0.00336219251033198,0.193469311831631,-0.463422305379377, + -1.53890052201344e-06,-0.00318487217904084,0.204175041989093,-0.495272153661794, + -1.5554034088483e-06,-0.00300755184774948,0.214880772146556,-0.52712200194421, + -1.57190629568316e-06,-0.00283023151645811,0.225586502304018,-0.558971850226627, + -1.58840918262904e-06,-0.00265291118516719,0.23629223246148,-0.590821698509044, + -1.60491206857571e-06,-0.00247559085387472,0.246997962618943,-0.622671546791461, + -1.62141495629875e-06,-0.00229827052258491,0.257703692776405,-0.654521395073878, + -1.63791784313361e-06,-0.00212095019129332,0.268409422933868,-0.686371243356294, + -1.65442072952438e-06,-0.00194362986000129,0.279115153091331,-0.718221091638711, + -1.67092361624821e-06,-0.00176630952871015,0.289820883248793,-0.750070939921128, + -1.68742650341613e-06,-0.00158898919741945,0.300526613406255,-0.781920788203545, + -1.70392938947383e-06,-0.00141166886612698,0.311232343563717,-0.813770636485961, + -9.47073127297027e-07,-0.00565136763978538,0.0542230332692654,-0.0494382805648794, + -9.57627861980503e-07,-0.00548237840085608,0.0648669343832368,-0.0813255469420803, + -9.68182596622347e-07,-0.00531338916192675,0.0755108354972083,-0.113212813319281, + -9.78737331208679e-07,-0.0051443999229972,0.0861547366111798,-0.145100079696482, + -9.89292066044811e-07,-0.00497541068406815,0.0967986377251512,-0.176987346073683, + -9.9984680046461e-07,-0.00480642144513843,0.107442538839123,-0.208874612450884, + -1.01040153527299e-06,-0.00463743220620916,0.118086439953094,-0.240761878828085, + -1.02095626985932e-06,-0.00446844296728,0.128730341067066,-0.272649145205286, + -1.03151100444565e-06,-0.0042994537283505,0.139374242181037,-0.304536411582487, + -1.04206573919852e-06,-0.00413046448942134,0.150018143295009,-0.336423677959688, + -1.05262047372934e-06,-0.00396147525049195,0.16066204440898,-0.368310944336889, + -1.06317520870425e-06,-0.00379248601156279,0.171305945522952,-0.40019821071409, + -1.07372994306854e-06,-0.00362349677263296,0.181949846636923,-0.432085477091291, + -1.08428467815447e-06,-0.00345450753370447,0.192593747750894,-0.463972743468491, + -1.09483941246324e-06,-0.00328551829477419,0.203237648864866,-0.495860009845692, + -1.10539414710509e-06,-0.00311652905584503,0.213881549978837,-0.527747276222893, + -1.11594888219102e-06,-0.00294753981691631,0.224525451092809,-0.559634542600094, + -1.12650361661082e-06,-0.0027785505779867,0.23516935220678,-0.591521808977295, + -1.13705835136368e-06,-0.00260956133905776,0.245813253320751,-0.623409075354496, + -1.14761308589451e-06,-0.00244057210012771,0.256457154434723,-0.655296341731697, + -1.15816781998124e-06,-0.00227158286119788,0.267101055548695,-0.687183608108898, + -1.16872255540024e-06,-0.00210259362226939,0.277744956662666,-0.719070874486099, + -1.17927728982004e-06,-0.00193360438333956,0.288388857776638,-0.7509581408633, + -1.18983202446188e-06,-0.00176461514441062,0.299032758890609,-0.782845407240501, + -1.20038675943679e-06,-0.00159562590548079,0.309676660004581,-0.814732673617702, + -6.83342537374787e-07,-0.00563975911363324,0.0541705732794429,-0.0494849689807362, + -6.90221258703438e-07,-0.00547688257234463,0.0647693169974282,-0.0813995308827608, + -6.97099980240257e-07,-0.0053140060310562,0.0753680607154135,-0.113314092784785, + -7.03978701527275e-07,-0.00515112948976748,0.0859668044333988,-0.14522865468681, + -7.10857422925315e-07,-0.00498825294847893,0.0965655481513841,-0.177143216588835, + -7.17736144240089e-07,-0.00482537640719016,0.107164291869369,-0.209057778490859, + -7.24614865721396e-07,-0.00466249986590173,0.117763035587355,-0.240972340392884, + -7.31493587258214e-07,-0.00449962332461329,0.12836177930534,-0.272886902294908, + -7.38372308461965e-07,-0.00433674678332441,0.138960523023326,-0.304801464196933, + -7.45251029887761e-07,-0.00417387024203575,0.149559266741311,-0.336716026098957, + -7.52129751424579e-07,-0.00401099370074776,0.160158010459296,-0.368630588000982, + -7.59008472850375e-07,-0.00384811715945865,0.170756754177282,-0.400545149903006, + -7.65887194442705e-07,-0.00368524061817066,0.181355497895267,-0.432459711805031, + -7.72765915590945e-07,-0.00352236407688133,0.191954241613252,-0.464374273707056, + -7.79644637072252e-07,-0.00335948753559312,0.202552985331237,-0.49628883560908, + -7.86523358553559e-07,-0.00319661099430468,0.213151729049223,-0.528203397511105, + -7.93402079701799e-07,-0.0030337344530158,0.223750472767208,-0.560117959413129, + -8.00280800850039e-07,-0.00287085791172692,0.234349216485193,-0.592032521315154, + -8.07159522664413e-07,-0.00270798137043915,0.244947960203178,-0.623947083217179, + -8.14038243812654e-07,-0.00254510482915027,0.255546703921164,-0.655861645119203, + -8.20916965182938e-07,-0.00238222828786183,0.266145447639149,-0.687776207021227, + -8.27795686775268e-07,-0.00221935174657339,0.276744191357134,-0.719690768923252, + -8.3467440803453e-07,-0.00205647520528451,0.28734293507512,-0.751605330825277, + -8.41553129293793e-07,-0.00189359866399519,0.297941678793106,-0.783519892727301, + -8.48431850664078e-07,-0.00173072212270675,0.308540422511091,-0.815434454629326, + -3.3514362659734e-05,-0.0075725860829095,0.0705082317074798,-0.0559502033100555, + -3.70593347697179e-05,-0.00689924795748276,0.0859184038549559,-0.0839782955458044, + -4.06043068797157e-05,-0.00622590983205606,0.101328576002432,-0.112006387781553, + -4.41492789896025e-05,-0.00555257170662915,0.116738748149908,-0.140034480017302, + -4.76942510996559e-05,-0.00487923358120257,0.132148920297384,-0.168062572253051, + -5.12392232097092e-05,-0.00420589545577577,0.147559092444861,-0.1960906644888, + -5.47841953195682e-05,-0.00353255733034896,0.162969264592337,-0.224118756724549, + -5.83291674295383e-05,-0.00285921920492205,0.178379436739813,-0.252146848960298, + -6.18741395396749e-05,-0.00218588107949558,0.193789608887289,-0.280174941196047, + -6.5419111649756e-05,-0.00151254295406877,0.209199781034765,-0.308203033431796, + -6.89640837596706e-05,-0.000839204828642082,0.224609953182241,-0.336231125667544, + -7.25090558696961e-05,-0.000165866703215611,0.240020125329717,-0.364259217903294, + -7.60540279799993e-05,0.000507471422210637,0.255430297477193,-0.392287310139042, + -7.95990000896918e-05,0.00118080954763777,0.270840469624669,-0.420315402374791, + -8.31439721994398e-05,0.00185414767306469,0.286250641772146,-0.44834349461054, + -8.66889443094099e-05,0.00252748579849182,0.301660813919622,-0.476371586846289, + -9.0233916419713e-05,0.00320082392391807,0.317070986067098,-0.504399679082038, + -9.37788885297941e-05,0.00387416204934476,0.332481158214574,-0.532427771317787, + -9.73238606397642e-05,0.00454750017477124,0.34789133036205,-0.560455863553536, + -0.000100868832749956,0.00522083830019771,0.363301502509526,-0.588483955789285, + -0.000104413804859926,0.00589417642562484,0.378711674657003,-0.616512048025034, + -0.000107958776969341,0.00656751455105198,0.394121846804478,-0.644540140260783, + -0.000111503749079644,0.00724085267647823,0.409532018951954,-0.672568232496531, + -0.000115048721189059,0.00791419080190581,0.424942191099431,-0.70059632473228, + -0.000118593693299585,0.00858752892733206,0.440352363246907,-0.728624416968029, + -3.333330835599e-05,-0.0075574823956483,0.0704671679721499,-0.0559929789484191, + -3.68423786739347e-05,-0.00688598867887147,0.0858488136336203,-0.0840407260669521, + -4.03514489917822e-05,-0.00621449496209442,0.101230459295091,-0.112088473185485, + -4.3860519309713e-05,-0.00554300124531759,0.116612104956561,-0.140136220304018, + -4.73695896275605e-05,-0.0048715075285406,0.131993750618032,-0.168183967422551, + -5.08786599457411e-05,-0.00420001381176405,0.147375396279502,-0.196231714541084, + -5.43877302634499e-05,-0.00352852009498683,0.162757041940973,-0.224279461659616, + -5.78968005812697e-05,-0.00285702637820995,0.178138687602443,-0.252327208778149, + -6.14058708990894e-05,-0.00218553266143273,0.193520333263914,-0.280374955896682, + -6.49149412169647e-05,-0.00151403894465574,0.208901978925384,-0.308422703015215, + -6.84240115350621e-05,-0.000842545227879077,0.224283624586855,-0.336470450133748, + -7.19330818528818e-05,-0.000171051511102194,0.239665270248325,-0.364518197252281, + -7.54421521707571e-05,0.000500442205674689,0.255046915909795,-0.392565944370814, + -7.89512224884659e-05,0.00117193592245157,0.270428561571266,-0.420613691489347, + -8.24602928068963e-05,0.00184342963922846,0.285810207232737,-0.44866143860788, + -8.59693631239944e-05,0.002514923356006,0.301191852894207,-0.476709185726412, + -8.94784334426468e-05,0.003186417072782,0.316573498555677,-0.504756932844945, + -9.2987503759856e-05,0.00385791078955977,0.331955144217148,-0.532804679963478, + -9.64965740780643e-05,0.00452940450633643,0.347336789878618,-0.560852427082011, + -0.000100005644396273,0.00520089822311309,0.362718435540089,-0.588900174200544, + -0.000103514714713704,0.00587239193989086,0.37810008120156,-0.616947921319077, + -0.000107023785032134,0.00654388565666641,0.39348172686303,-0.64499566843761, + -0.000110532855349676,0.0072153793734433,0.408863372524499,-0.673043415556143, + -0.000114041925667885,0.00788687309022063,0.42424501818597,-0.701091162674675, + -0.000117550995985538,0.00855836680699795,0.439626663847441,-0.729138909793208, + -3.30832550226173e-05,-0.00753669825446041,0.0704104381983693,-0.0560519828707818, + -3.65430231690222e-05,-0.00686777374934983,0.0857526948780803,-0.0841268415701629, + -4.000279131533e-05,-0.00619884924423908,0.101094951557791,-0.112201700269544, + -4.34625594617211e-05,-0.00552992473912817,0.116437208237503,-0.140276558968925, + -4.69223276080011e-05,-0.00486100023401725,0.131779464917214,-0.168351417668306, + -5.03820957543089e-05,-0.00419207572890667,0.147121721596925,-0.196426276367687, + -5.38418639008387e-05,-0.00352315122379609,0.162463978276636,-0.224501135067069, + -5.73016320471464e-05,-0.00285422671868507,0.177806234956347,-0.25257599376645, + -6.07614001935652e-05,-0.00218530221357449,0.193148491636058,-0.280650852465831, + -6.4221168339762e-05,-0.00151637770846347,0.20849074831577,-0.308725711165212, + -6.76809364861253e-05,-0.000847453203352666,0.223833004995481,-0.336800569864593, + -7.11407046325441e-05,-0.000178528698242086,0.239175261675192,-0.364875428563974, + -7.46004727790184e-05,0.000490395806868493,0.254517518354903,-0.392950287263355, + -7.80602409253817e-05,0.00115932031197952,0.269859775034614,-0.421025145962736, + -8.15200090716894e-05,0.00182824481708965,0.285202031714325,-0.449100004662118, + -8.49797772181082e-05,0.0024971693222009,0.300544288394037,-0.477174863361499, + -8.84395453648601e-05,0.00316609382731103,0.315886545073747,-0.50524972206088, + -9.18993135107238e-05,0.0038350183324225,0.331228801753459,-0.533324580760261, + -9.53590816573646e-05,0.00450394283753242,0.346571058433169,-0.561399439459642, + -9.88188498034503e-05,0.00517286734264366,0.361913315112881,-0.589474298159023, + -0.000102278617949647,0.00584179184775513,0.377255571792592,-0.617549156858404, + -0.000105738386096843,0.0065107163528646,0.392597828472303,-0.645624015557786, + -0.000109198154242707,0.00717964085797629,0.407940085152015,-0.673698874257166, + -0.000112657922388903,0.00784856536308709,0.423282341831726,-0.701773732956547, + -0.000116117690535544,0.008517489868197,0.438624598511436,-0.729848591655929, + -3.27396342828523e-05,-0.00750827923529929,0.0703324492112678,-0.0561329271165876, + -3.61321854839003e-05,-0.00684292659055397,0.0856205947112607,-0.0842449787071612, + -3.95247366848095e-05,-0.00617757394580842,0.100908740211254,-0.112357030297735, + -4.29172878858297e-05,-0.00551222130106288,0.116196885711247,-0.140469081888308, + -4.63098390867112e-05,-0.00484686865631734,0.13148503121124,-0.168581133478882, + -4.97023902876204e-05,-0.0041815160115718,0.146773176711233,-0.196693185069456, + -5.30949414886961e-05,-0.00351616336682647,0.162061322211226,-0.224805236660029, + -5.64874926897718e-05,-0.00285081072208104,0.177349467711219,-0.252917288250603, + -5.988004389057e-05,-0.00218545807733528,0.192637613211212,-0.281029339841177, + -6.32725950913682e-05,-0.00152010543258974,0.207925758711205,-0.30914139143175, + -6.66651462923329e-05,-0.000854752787844193,0.223213904211198,-0.337253443022324, + -7.00576974934086e-05,-0.00018940014309865,0.238502049711191,-0.365365494612897, + -7.34502486943733e-05,0.00047595250164667,0.253790195211184,-0.393477546203471, + -7.68427998953936e-05,0.00114130514639199,0.269078340711177,-0.421589597794045, + -8.02353510961362e-05,0.00180665779113798,0.28436648621117,-0.449701649384618, + -8.3627902297323e-05,0.00247201043588285,0.299654631711162,-0.477813700975192, + -8.70204534980656e-05,0.00313736308062862,0.314942777211155,-0.505925752565766, + -9.04130046994744e-05,0.00380271572537372,0.330230922711148,-0.534037804156339, + -9.3805555899884e-05,0.00446806837012015,0.345519068211142,-0.562149855746913, + -9.71981071011818e-05,0.00513342101486525,0.360807213711135,-0.590261907337486, + -0.000100590658302147,0.00579877365961101,0.376095359211128,-0.61837395892806, + -0.000103983209503222,0.00646412630435611,0.391383504711121,-0.646486010518634, + -0.000107375760704298,0.00712947894910121,0.406671650211113,-0.674598062109207, + -0.000110768311905263,0.0077948315938472,0.421959795711107,-0.702710113699781, + -0.000114160863106005,0.00846018423859274,0.437247941211099,-0.730822165290354, + -3.22706733916212e-05,-0.00746975853033011,0.0702259546872205,-0.0562431394968078, + -3.55724877529606e-05,-0.00680935727376503,0.0854402826847812,-0.0844058323284578, + -3.88743021142446e-05,-0.00614895601719984,0.100654610682342,-0.112568525160108, + -4.21761164756396e-05,-0.00548855476063481,0.115868938679903,-0.140731217991758, + -4.54779308367292e-05,-0.00482815350406929,0.131083266677464,-0.168893910823408, + -4.87797451983463e-05,-0.00416775224750454,0.146297594675024,-0.197056603655058, + -5.2081559559658e-05,-0.00350735099093957,0.161511922672585,-0.225219296486708, + -5.53833739207477e-05,-0.00284694973437394,0.176726250670146,-0.253381989318358, + -5.86851882821704e-05,-0.00218654847780897,0.191940578667706,-0.281544682150008, + -6.19870026434821e-05,-0.001526147221244,0.207154906665267,-0.309707374981658, + -6.52888170046828e-05,-0.000865745964678588,0.222369234662828,-0.337870067813308, + -6.859063136605e-05,-0.000205344708113619,0.237583562660389,-0.366032760644958, + -7.18924457273618e-05,0.000455056548451571,0.252797890657949,-0.394195453476608, + -7.51942600885069e-05,0.00111545780501676,0.26801221865551,-0.422358146308258, + -7.84960744497631e-05,0.00177585906158217,0.283226546653071,-0.450520839139908, + -8.17978888113524e-05,0.00243626031814737,0.298440874650632,-0.478683531971558, + -8.50997031728307e-05,0.00309666157471211,0.313655202648192,-0.506846224803208, + -8.84015175338648e-05,0.00375706283127752,0.328869530645753,-0.535008917634858, + -9.17033318954541e-05,0.00441746408784205,0.344083858643313,-0.563171610466508, + -9.50051462561552e-05,0.00507786534440791,0.359298186640874,-0.591334303298158, + -9.83069606179665e-05,0.00573826660097243,0.374512514638435,-0.619496996129808, + -0.000101608774979334,0.00639866785753762,0.389726842635996,-0.647659688961458, + -0.000104910589340035,0.0070590691141037,0.404941170633557,-0.675822381793108, + -0.000108212403701069,0.00771947037066933,0.420155498631118,-0.703985074624758, + -0.000111514218062658,0.00837987162723364,0.435369826628678,-0.732147767456408, + -3.1636631266832e-05,-0.00741816005590101,0.0700818680436263,-0.0563916786934148, + -3.48176043722948e-05,-0.00676459267663321,0.0851964517058617,-0.0846226234696252, + -3.79985774777991e-05,-0.00611102529736535,0.100311035368097,-0.112853568245836, + -4.11795505834145e-05,-0.0054574579180976,0.115425619030333,-0.141084513022046, + -4.43605236890021e-05,-0.0048038905388299,0.130540202692568,-0.169315457798256, + -4.75414967944232e-05,-0.00415032315956199,0.145654786354803,-0.197546402574467, + -5.07224699000108e-05,-0.00349675578029429,0.160769370017039,-0.225777347350677, + -5.39034430053764e-05,-0.00284318840102626,0.175883953679274,-0.254008292126888, + -5.70844161110196e-05,-0.00218962102175879,0.19099853734151,-0.282239236903098, + -6.02653892162741e-05,-0.00153605364249043,0.206113121003745,-0.310470181679309, + -6.34463623219728e-05,-0.000882486263222848,0.221227704665981,-0.338701126455519, + -6.66273354276159e-05,-0.000228918883955043,0.236342288328216,-0.366932071231729, + -6.98083085332035e-05,0.000424648495312541,0.251456871990452,-0.39516301600794, + -7.29892816384581e-05,0.00107821587458079,0.266571455652687,-0.42339396078415, + -7.61702547442678e-05,0.00173178325384793,0.281686039314922,-0.451624905560361, + -7.93512278496333e-05,0.00238535063311596,0.296800622977158,-0.479855850336571, + -8.25322009547769e-05,0.00303891801238443,0.311915206639394,-0.508086795112782, + -8.57131740604755e-05,0.00369248539165201,0.327029790301629,-0.536317739888992, + -8.88941471662852e-05,0.00434605277091893,0.342144373963864,-0.564548684665202, + -9.20751202717618e-05,0.0049996201501874,0.3572589576261,-0.592779629441413, + -9.52560933771274e-05,0.00565318752945476,0.372373541288335,-0.621010574217623, + -9.8437066482604e-05,0.00630675490872301,0.38748812495057,-0.649241518993834, + -0.000101618039588303,0.00696032228798993,0.402602708612805,-0.677472463770044, + -0.00010479901269389,0.00761388966725818,0.417717292275041,-0.705703408546255, + -0.000107979985799145,0.00826745704652598,0.432831875937276,-0.733934353322465, + -3.07901906400759e-05,-0.00735013236564763,0.069889331386681,-0.0565891421576789, + -3.38131421663279e-05,-0.00670593545475512,0.0848708620399048,-0.084910818981211, + -3.68360936923717e-05,-0.00606173854386244,0.0998523926931286,-0.113232495804743, + -3.98590452185543e-05,-0.00541754163296981,0.114833923346352,-0.141554172628275, + -4.28819967447092e-05,-0.00477334472207724,0.129815453999576,-0.169875849451807, + -4.59049482707807e-05,-0.00412914781118445,0.1447969846528,-0.198197526275339, + -4.89278997967135e-05,-0.00348495090029144,0.159778515306024,-0.226519203098871, + -5.19508513228129e-05,-0.00284075398939898,0.174760045959248,-0.254840879922404, + -5.49738028493008e-05,-0.00219655707850663,0.189741576612472,-0.283162556745936, + -5.79967543752336e-05,-0.00155236016761373,0.204723107265696,-0.311484233569468, + -6.10197059012219e-05,-0.000908163256721162,0.219704637918919,-0.339805910393, + -6.40426574273767e-05,-0.000263966345828148,0.234686168572143,-0.368127587216532, + -6.70656089534205e-05,0.000380230565064421,0.249667699225367,-0.396449264040064, + -7.00885604794088e-05,0.00102442747595721,0.264649229878591,-0.424770940863596, + -7.31115120059522e-05,0.00166862438684956,0.279630760531815,-0.453092617687128, + -7.61344635320516e-05,0.00231282129774213,0.294612291185038,-0.48141429451066, + -7.91574150580399e-05,0.00295701820863514,0.309593821838263,-0.509735971334192, + -8.21803665839171e-05,0.00360121511952816,0.324575352491487,-0.538057648157724, + -8.52033181101275e-05,0.00424541203042028,0.33955688314471,-0.566379324981257, + -8.82262696358938e-05,0.00488960894131352,0.354538413797934,-0.594701001804789, + -9.12492211627702e-05,0.0055338058522052,0.369519944451157,-0.623022678628321, + -9.42721726887585e-05,0.00617800276309843,0.384501475104382,-0.651344355451853, + -9.72951242149689e-05,0.00682219967399034,0.399483005757605,-0.679666032275385, + -0.000100318075741401,0.00746639658488268,0.414464536410829,-0.707987709098917, + -0.000103341027266945,0.00811059349577636,0.429446067064053,-0.736309385922449, + -2.96791214308423e-05,-0.00726230382292048,0.069636295537153,-0.0568469051328679, + -3.25003998211115e-05,-0.00663082998881531,0.084443359670137,-0.0852870208916724, + -3.53216782112142e-05,-0.00599935615470987,0.0992504238031211,-0.113727136650477, + -3.81429566014557e-05,-0.00536788232060459,0.114057487936105,-0.142167252409281, + -4.09642349917527e-05,-0.00473640848649948,0.128864552069089,-0.170607368168086, + -4.37855133817444e-05,-0.00410493465239392,0.143671616202073,-0.19904748392689, + -4.66067917720969e-05,-0.0034734608182887,0.158478680335057,-0.227487599685694, + -4.94280701623384e-05,-0.00284198698418359,0.173285744468041,-0.255927715444499, + -5.22493485525799e-05,-0.00221051315007847,0.188092808601025,-0.284367831203303, + -5.50706269425993e-05,-0.00157903931597292,0.202899872734009,-0.312807946962108, + -5.78919053328963e-05,-0.000947565481867807,0.217706936866993,-0.341248062720912, + -6.07131837232489e-05,-0.000316091647762695,0.232514000999977,-0.369688178479717, + -6.35344621134348e-05,0.000315382186342417,0.247321065132961,-0.398128294238521, + -6.63557405037318e-05,0.000946856020447751,0.262128129265945,-0.426568409997325, + -6.91770188938623e-05,0.00157832985455308,0.276935193398929,-0.45500852575613, + -7.19982972839928e-05,0.00220980368865842,0.291742257531913,-0.483448641514934, + -7.48195756743453e-05,0.00284127752276397,0.306549321664898,-0.511888757273739, + -7.76408540641427e-05,0.00347275135686909,0.321356385797881,-0.540328873032543, + -8.04621324547172e-05,0.00410422519097398,0.336163449930865,-0.568768988791347, + -8.32834108451808e-05,0.00473569902507931,0.350970514063849,-0.597209104550152, + -8.61046892349782e-05,0.00536717285918487,0.365777578196833,-0.625649220308956, + -8.89259676255527e-05,0.00599864669328953,0.380584642329817,-0.654089336067761, + -9.17472460152391e-05,0.00663012052739598,0.395391706462802,-0.682529451826565, + -9.45685244054806e-05,0.00726159436150109,0.410198770595786,-0.710969567585369, + -9.7389802795389e-05,0.0078930681956062,0.42500583472877,-0.739409683344174, + -2.82525934522937e-05,-0.00715194177284662,0.0693109329894528,-0.0571754954885706, + -3.08245652365924e-05,-0.00653749439738832,0.0838943054360859,-0.0857665944979433, + -3.33965370209466e-05,-0.00592304702193008,0.0984776778827189,-0.114357693507316, + -3.59685088051898e-05,-0.00530859964647179,0.113061050329352,-0.142948792516689, + -3.85404805894607e-05,-0.00469415227101333,0.127644422775985,-0.171539891526061, + -4.11124523739259e-05,-0.00407970489555531,0.142227795222618,-0.200130990535434, + -4.36844241581413e-05,-0.00346525752009674,0.156811167669251,-0.228722089544807, + -4.62563959423568e-05,-0.00285081014463839,0.171394540115884,-0.257313188554179, + -4.88283677266832e-05,-0.00223636276918016,0.185977912562517,-0.285904287563552, + -5.14003395112317e-05,-0.00162191539372225,0.20056128500915,-0.314495386572925, + -5.3972311295003e-05,-0.00100746801826301,0.215144657455784,-0.343086485582297, + -5.6544283079607e-05,-0.000393020642805331,0.229728029902416,-0.37167758459167, + -5.91162548638779e-05,0.000221426732653018,0.24431140234905,-0.400268683601043, + -6.16882266483154e-05,0.000835874108110923,0.258894774795682,-0.428859782610415, + -6.42601984326419e-05,0.00145032148356949,0.273478147242316,-0.457450881619788, + -6.68321702171903e-05,0.0020647688590274,0.288061519688949,-0.48604198062916, + -6.94041420009617e-05,0.00267921623448619,0.302644892135582,-0.514633079638533, + -7.19761137853991e-05,0.00329366360994454,0.317228264582215,-0.543224178647906, + -7.45480855695035e-05,0.00390811098540333,0.331811637028848,-0.571815277657278, + -7.7120057354052e-05,0.0045225583608608,0.346395009475481,-0.600406376666651, + -7.96920291383785e-05,0.00513700573631937,0.360978381922114,-0.628997475676024, + -8.22640009228159e-05,0.00575145311177749,0.375561754368747,-0.657588574685396, + -8.48359727069203e-05,0.00636590048723606,0.39014512681538,-0.686179673694769, + -8.74079444912468e-05,0.00698034786269464,0.404728499262014,-0.714770772704142, + -8.99799162754622e-05,0.00759479523815232,0.419311871708646,-0.743361871713514, + -2.64721851737232e-05,-0.0070179164517512,0.0689041417036613,-0.0575819404777743, + -2.87482984059895e-05,-0.00642578341161415,0.0832088283563476,-0.0863597959898322, + -3.10244116382419e-05,-0.00583365037147698,0.097513515009034,-0.11513765150189, + -3.3300524870522e-05,-0.00524151733133993,0.11181820166172,-0.143915507013948, + -3.55766381028022e-05,-0.00464938429120298,0.126122888314407,-0.172693362526006, + -3.78527513352211e-05,-0.00405725125106604,0.140427574967093,-0.201471218038064, + -4.01288645674458e-05,-0.00346511821092899,0.154732261619779,-0.230249073550122, + -4.24049777996149e-05,-0.00287298517079182,0.169036948272466,-0.25902692906218, + -4.46810910320616e-05,-0.00228085213065476,0.183341634925152,-0.287804784574238, + -4.69572042641198e-05,-0.00168871909051749,0.197646321577838,-0.316582640086295, + -4.92333174964554e-05,-0.00109658605038065,0.211951008230525,-0.345360495598353, + -5.15094307287911e-05,-0.000504453010243378,0.226255694883211,-0.374138351110411, + -5.37855439609602e-05,8.76800298934555e-05,0.240560381535897,-0.402916206622469, + -5.60616571932959e-05,0.000679813070030511,0.254865068188584,-0.431694062134527, + -5.83377704252985e-05,0.00127194611016801,0.26916975484127,-0.460471917646585, + -6.06138836576342e-05,0.00186407915030484,0.283474441493956,-0.489249773158643, + -6.28899968900809e-05,0.0024562121904419,0.297779128146643,-0.518027628670701, + -6.51661101224166e-05,0.00304834523057895,0.312083814799329,-0.546805484182759, + -6.74422233547523e-05,0.00364047827071601,0.326388501452016,-0.575583339694817, + -6.97183365870879e-05,0.00423261131085262,0.340693188104702,-0.604361195206875, + -7.19944498192016e-05,0.0048247443509899,0.354997874757388,-0.633139050718933, + -7.42705630510931e-05,0.00541687739112762,0.369302561410074,-0.661916906230991, + -7.65466762836509e-05,0.00600901043126445,0.383607248062761,-0.690694761743048, + -7.88227895160976e-05,0.00660114347140084,0.397911934715447,-0.719472617255106, + -8.10989027478781e-05,0.007193276511539,0.412216621368134,-0.748250472767164, + -2.43270513372168e-05,-0.00686177910283986,0.068413046531941,-0.0580663554092568, + -2.62694646791517e-05,-0.00629805522500304,0.0823827061525363,-0.0870667936590905, + -2.82118780211282e-05,-0.00573433134716617,0.0963523657731316,-0.116067231908924, + -3.0154291363188e-05,-0.00517060746932951,0.110322025393727,-0.145067670158758, + -3.20967047051368e-05,-0.00460688359149253,0.124291685014322,-0.174068108408592, + -3.40391180468913e-05,-0.00404315971365532,0.138261344634918,-0.203068546658425, + -3.59815313890066e-05,-0.00347943583581889,0.152231004255513,-0.232068984908259, + -3.79239447310109e-05,-0.00291571195798201,0.166200663876108,-0.261069423158093, + -3.98663580730152e-05,-0.00235198808014525,0.180170323496703,-0.290069861407926, + -4.1808771414853e-05,-0.00178826420230815,0.194139983117299,-0.31907029965776, + -4.37511847566907e-05,-0.00122454032447106,0.208109642737894,-0.348070737907594, + -4.56935980990836e-05,-0.000660816446634849,0.222079302358489,-0.377071176157428, + -4.76360114404217e-05,-9.70925687970858e-05,0.236048961979085,-0.406071614407261, + -4.95784247825926e-05,0.000466631309038901,0.25001862159968,-0.435072052657095, + -5.15208381246524e-05,0.001030355186876,0.263988281220275,-0.464072490906929, + -5.34632514666011e-05,0.00159407906471287,0.277957940840871,-0.493072929156762, + -5.54056648083279e-05,0.00215780294254997,0.291927600461466,-0.522073367406596, + -5.73480781503877e-05,0.00272152682038662,0.305897260082061,-0.55107380565643, + -5.92904914925585e-05,0.00328525069822305,0.319866919702656,-0.580074243906263, + -6.12329048340632e-05,0.00384897457606082,0.333836579323252,-0.609074682156097, + -6.3175318176012e-05,0.00441269845389725,0.347806238943847,-0.638075120405931, + -6.51177315182938e-05,0.00497642233173368,0.361775898564442,-0.667075558655764, + -6.70601448604646e-05,0.00554014620957055,0.375745558185038,-0.696075996905598, + -6.90025582023024e-05,0.00610387008740787,0.389715217805634,-0.725076435155432, + -7.09449715440291e-05,0.00666759396524519,0.403684877426229,-0.754076873405265, + -2.1849580899666e-05,-0.00668850940268417,0.0678446826992698,-0.0586187823892984, + -2.34379189397171e-05,-0.00615959626440699,0.0814284550167798,-0.0878730540815954, + -2.50262569798099e-05,-0.00563068312612991,0.0950122273342897,-0.117127325773892, + -2.66145950201524e-05,-0.00510176998785317,0.1085959996518,-0.14638159746619, + -2.82029330602174e-05,-0.00457285684957609,0.122179771969309,-0.175635869158487, + -2.97912711004766e-05,-0.00404394371129924,0.135763544286819,-0.204890140850784, + -3.13796091405694e-05,-0.00351503057302227,0.149347316604329,-0.234144412543081, + -3.296794718044e-05,-0.00298611743474475,0.162931088921839,-0.263398684235378, + -3.45562852205883e-05,-0.00245720429646812,0.176514861239349,-0.292652955927675, + -3.61446232608476e-05,-0.00192829115819082,0.190098633556859,-0.321907227619972, + -3.77329613007737e-05,-0.00139937801991397,0.203682405874369,-0.351161499312269, + -3.9321299341144e-05,-0.000870464881637334,0.217266178191878,-0.380415771004566, + -4.09096373811813e-05,-0.000341551743359592,0.230849950509389,-0.409670042696863, + -4.24979754214405e-05,0.000187361394917041,0.244433722826898,-0.43892431438916, + -4.40863134615332e-05,0.000716274533194117,0.258017495144408,-0.468178586081457, + -4.56746515014039e-05,0.00124518767147119,0.271601267461918,-0.497432857773754, + -4.72629895422738e-05,0.00177410080974738,0.285185039779428,-0.526687129466051, + -4.88513275819225e-05,0.0023030139480249,0.298768812096938,-0.555941401158348, + -5.04396656219042e-05,0.00283192708630242,0.312352584414448,-0.585195672850645, + -5.20280036628851e-05,0.00336084022457817,0.325936356731957,-0.614449944542942, + -5.36163417024227e-05,0.00388975336285613,0.339520129049468,-0.643704216235239, + -5.52046797419603e-05,0.00441866650113365,0.353103901366978,-0.672958487927536, + -5.67930177822751e-05,0.00494757963941028,0.366687673684487,-0.702212759619833, + -5.83813558223678e-05,0.00547649277768736,0.380271446001997,-0.73146703131213, + -5.99696938625716e-05,0.00600540591596443,0.393855218319507,-0.760721303004427, + -1.91243824914644e-05,-0.00650636573407587,0.0672182056732137,-0.0592179528773268, + -2.03625594114853e-05,-0.0060181223875741,0.0803788342890195,-0.0887475360824455, + -2.16007363314508e-05,-0.00552987904107211,0.0935394629048256,-0.118277119287564, + -2.28389132516105e-05,-0.0050416356945705,0.106700091520631,-0.147806702492683, + -2.40770901714094e-05,-0.00455339234806851,0.119860720136437,-0.177336285697801, + -2.53152670914858e-05,-0.00406514900156663,0.133021348752243,-0.20686586890292, + -2.65534440115345e-05,-0.00357690565506497,0.146181977368049,-0.236395452108039, + -2.77916209314721e-05,-0.00308866230856297,0.159342605983855,-0.265925035313157, + -2.90297978514098e-05,-0.0026004189620612,0.172503234599661,-0.295454618518276, + -3.02679747713475e-05,-0.00211217561555932,0.185663863215467,-0.324984201723395, + -3.15061516915072e-05,-0.00162393226905766,0.198824491831273,-0.354513784928513, + -3.27443286112783e-05,-0.00113568892255556,0.211985120447079,-0.384043368133632, + -3.39825055314935e-05,-0.000647445576053673,0.225145749062885,-0.41357295133875, + -3.52206824517642e-05,-0.000159202229552458,0.23830637767869,-0.443102534543869, + -3.64588593716464e-05,0.000329041116949202,0.251467006294496,-0.472632117748988, + -3.76970362911955e-05,0.000817284463451973,0.264627634910302,-0.502161700954106, + -3.89352132111886e-05,0.00130552780995385,0.277788263526108,-0.531691284159225, + -4.01733901316259e-05,0.00179377115645463,0.290948892141913,-0.561220867364343, + -4.14115670515081e-05,0.00228201450295673,0.30410952075772,-0.590750450569462, + -4.26497439706131e-05,0.00277025784946039,0.317270149373526,-0.620280033774581, + -4.38879208914944e-05,0.00325850119596049,0.330430777989332,-0.649809616979699, + -4.51260978113766e-05,0.00374674454246238,0.343591406605137,-0.679339200184818, + -4.63642747311477e-05,0.00423498788896515,0.356752035220944,-0.708868783389936, + -4.76024516513629e-05,0.00472323123546659,0.36991266383675,-0.738398366595055, + -4.8840628571134e-05,0.00521147458196847,0.383073292452556,-0.767927949800174, + -1.62827888009337e-05,-0.00632553980067685,0.0665637631324394,-0.0598334842902082, + -1.7200413722579e-05,-0.00588224182507047,0.0792847041431977,-0.0896458966530631, + -1.81180386441271e-05,-0.00543894384946414,0.0920056451539559,-0.119458309015918, + -1.90356635656475e-05,-0.00499564587385748,0.104726586164714,-0.149270721378773, + -1.99532884871956e-05,-0.00455234789825099,0.117447527175473,-0.179083133741628, + -2.08709134089102e-05,-0.00410904992264494,0.130168468186231,-0.208895546104483, + -2.17885383304584e-05,-0.00366575194703833,0.142889409196989,-0.238707958467338, + -2.2706163252062e-05,-0.00322245397143184,0.155610350207748,-0.268520370830193, + -2.36237881734436e-05,-0.00277915599582523,0.168331291218506,-0.298332783193048, + -2.45414130948807e-05,-0.00233585802021841,0.181052232229264,-0.328145195555903, + -2.54590380165398e-05,-0.00189256004461225,0.193773173240023,-0.357957607918758, + -2.6376662938199e-05,-0.00144926206900586,0.206494114250781,-0.387770020281613, + -2.72942878601357e-05,-0.00100596409339992,0.219215055261539,-0.417582432644468, + -2.82119127816838e-05,-0.000562666117793542,0.231935996272297,-0.447394845007323, + -2.91295377027323e-05,-0.000119368142186493,0.244656937283056,-0.477207257370178, + -3.0047162624558e-05,0.000323929833420111,0.257377878293814,-0.507019669733033, + -3.09647875461616e-05,0.000767227809026272,0.270098819304572,-0.536832082095888, + -3.18824124679873e-05,0.00121052578463199,0.28281976031533,-0.566644494458743, + -3.28000373893689e-05,0.00165382376023926,0.295540701326089,-0.596456906821598, + -3.37176623109725e-05,0.00209712173584542,0.308261642336847,-0.626269319184453, + -3.46352872323541e-05,0.00254041971145202,0.320982583347605,-0.656081731547308, + -3.55529121540687e-05,0.00298371768705818,0.333703524358364,-0.685894143910163, + -3.64705370755614e-05,0.00342701566266523,0.346424465369122,-0.715706556273017, + -3.7388161997165e-05,0.00387031363827139,0.35914540637988,-0.745518968635873, + -3.83057869188796e-05,0.004313611613878,0.371866347390639,-0.775331380998727, + -1.34803339186668e-05,-0.00615597225470871,0.0659173502755847,-0.0604315489745142, + -1.41271488639794e-05,-0.00575942456010398,0.0782062369907426,-0.0905187647469017, + -1.47739638092781e-05,-0.00536287686549913,0.0904951237059005,-0.120605980519289, + -1.54207787546601e-05,-0.00496632917089457,0.102784010421058,-0.150693196291677, + -1.60675936999588e-05,-0.00456978147628972,0.115072897136216,-0.180780412064064, + -1.67144086452575e-05,-0.00417323378168499,0.127361783851374,-0.210867627836452, + -1.73612235904175e-05,-0.00377668608708004,0.139650670566532,-0.240954843608839, + -1.80080385359105e-05,-0.00338013839247553,0.15193955728169,-0.271042059381227, + -1.86548534811815e-05,-0.00298359069787058,0.164228443996848,-0.301129275153614, + -1.93016684266745e-05,-0.00258704300326595,0.176517330712006,-0.331216490926002, + -1.99484833717234e-05,-0.00219049530866111,0.188806217427164,-0.361303706698389, + -2.05952983170499e-05,-0.00179394761405627,0.201095104142321,-0.391390922470777, + -2.12421132625429e-05,-0.00139739991945187,0.213383990857479,-0.421478138243164, + -2.18889282079804e-05,-0.00100085222484747,0.225672877572637,-0.451565354015551, + -2.25357431529183e-05,-0.000604304530242183,0.237961764287795,-0.481652569787939, + -2.31825580980782e-05,-0.000207756835636896,0.250250651002953,-0.511739785560326, + -2.38293730436823e-05,0.000188790858967502,0.262539537718111,-0.541827001332714, + -2.44761879890643e-05,0.000585338553572123,0.274828424433269,-0.571914217105101, + -2.51230029338911e-05,0.00098188624817741,0.287117311148427,-0.602001432877489, + -2.57698178798282e-05,0.00137843394278114,0.299406197863584,-0.632088648649876, + -2.64166328252102e-05,0.00177498163738621,0.311695084578743,-0.662175864422264, + -2.70634477703702e-05,0.00217152933199083,0.3239839712939,-0.692263080194651, + -2.77102627156411e-05,0.00256807702659545,0.336272858009058,-0.722350295967039, + -2.8357077660579e-05,0.00296462472120052,0.348561744724216,-0.752437511739426, + -2.9003892605739e-05,0.00336117241580602,0.360850631439374,-0.782524727511814, + -1.08642086106003e-05,-0.00600526002682084,0.0653132268553835,-0.0609819924412029, + -1.1299555561145e-05,-0.00565442974138458,0.0772002430266358,-0.0913221302559217, + -1.17349025117452e-05,-0.00530359945594833,0.0890872591978881,-0.121662268070641, + -1.2170249462401e-05,-0.00495276917051202,0.100974275369141,-0.152002405885359, + -1.26055964130012e-05,-0.00460193888507576,0.112861291540393,-0.182342543700078, + -1.30409433636292e-05,-0.00425110859963962,0.124748307711645,-0.212682681514797, + -1.34762903140628e-05,-0.00390027831420325,0.136635323882897,-0.243022819329516, + -1.39116372649406e-05,-0.00354944802876733,0.14852234005415,-0.273362957144235, + -1.43469842153188e-05,-0.00319861774333075,0.160409356225402,-0.303703094958953, + -1.47823311660855e-05,-0.00284778745789493,0.172296372396654,-0.334043232773672, + -1.52176781165747e-05,-0.00249695717245846,0.184183388567907,-0.364383370588391, + -1.56530250674525e-05,-0.00214612688702243,0.196070404739159,-0.39472350840311, + -1.60883720179972e-05,-0.00179529660158639,0.207957420910411,-0.425063646217829, + -1.65237189684309e-05,-0.0014444663161497,0.219844437081664,-0.455403784032547, + -1.6959065918809e-05,-0.001093636030713,0.231731453252916,-0.485743921847266, + -1.73944128696313e-05,-0.000742805745276964,0.243618469424169,-0.516084059661985, + -1.78297598203425e-05,-0.000391975459841154,0.255505485595421,-0.546424197476704, + -1.82651067707207e-05,-4.11451744044555e-05,0.267392501766673,-0.576764335291423, + -1.8700453721654e-05,0.000309685111031133,0.279279517937925,-0.607104473106141, + -1.9135800671366e-05,0.000660515396468053,0.291166534109177,-0.63744461092086, + -1.95711476226323e-05,0.00101134568190409,0.30305355028043,-0.667784748735579, + -2.00064945726774e-05,0.00136217596734101,0.314940566451682,-0.698124886550298, + -2.04418415239438e-05,0.00171300625277615,0.326827582622934,-0.728465024365017, + -2.08771884740999e-05,0.00206383653821307,0.338714598794187,-0.758805162179735, + -2.13125354253663e-05,0.00241466682364866,0.350601614965439,-0.789145299994454, + -8.54427901572641e-06,-0.00587753542442282,0.0647770877488557,-0.0614639088840356, + -8.82605807289716e-06,-0.00556885248833594,0.0763089438781005,-0.0920254814115461, + -9.1078371300124e-06,-0.00526016955224901,0.0878408000073453,-0.122587053939057, + -9.38961618718315e-06,-0.00495148661616218,0.09937265613659,-0.153148626466567, + -9.67139524427063e-06,-0.00464280368007497,0.110904512265835,-0.183710198994078, + -9.95317430141363e-06,-0.0043341207439882,0.12243636839508,-0.214271771521588, + -1.02349533586676e-05,-0.00402543780790132,0.133968224524325,-0.244833344049099, + -1.05167324157551e-05,-0.00371675487181433,0.145500080653569,-0.275394916576609, + -1.07985114729536e-05,-0.00340807193572767,0.157031936782814,-0.30595648910412, + -1.10802905301521e-05,-0.00309938899964091,0.168563792912059,-0.336518061631631, + -1.13620695871841e-05,-0.00279070606355369,0.180095649041304,-0.367079634159141, + -1.16438486443826e-05,-0.00248202312746693,0.191627505170548,-0.397641206686651, + -1.19256277018032e-05,-0.00217334019138038,0.203159361299793,-0.428202779214162, + -1.22074067585576e-05,-0.00186465725529272,0.214691217429038,-0.458764351741672, + -1.24891858162002e-05,-0.00155597431920662,0.226223073558283,-0.489325924269183, + -1.27709648733987e-05,-0.00124729138311963,0.237754929687527,-0.519887496796694, + -1.305274392982e-05,-0.000938608447031974,0.249286785816772,-0.550449069324204, + -1.33345229874626e-05,-0.00062992551094565,0.260818641946017,-0.581010641851715, + -1.36163020447722e-05,-0.000321242574858882,0.272350498075262,-0.611572214379225, + -1.38980811017486e-05,-1.25596387716698e-05,0.283882354204507,-0.642133786906736, + -1.41798601591692e-05,0.000296123297315098,0.295414210333752,-0.672695359434246, + -1.44616392159236e-05,0.000604806233401867,0.306946066462996,-0.703256931961757, + -1.47434182732331e-05,0.000913489169489079,0.318477922592241,-0.733818504489267, + -1.50251973304316e-05,0.0012221721055754,0.330009778721486,-0.764380077016778, + -1.5306976387186e-05,0.00153085504166306,0.341541634850731,-0.794941649544288, + -6.57883096513712e-06,-0.0057735583080733,0.0643226571187663,-0.061867711433839, + -6.75587030443681e-06,-0.00550171923130122,0.0755545343874936,-0.0926148262954412, + -6.93290964365323e-06,-0.00522988015452924,0.0867864116562209,-0.123361941157043, + -7.10994898306394e-06,-0.00495804107775732,0.0980182889249481,-0.154109056018645, + -7.28698832222485e-06,-0.00468620200098524,0.109250166193675,-0.184856170880248, + -7.4640276615523e-06,-0.00441436292421316,0.120482043462403,-0.21560328574185, + -7.6410670009075e-06,-0.0041425238474414,0.13171392073113,-0.246350400603452, + -7.81810634020719e-06,-0.00387068477066943,0.142945797999857,-0.277097515465054, + -7.99514567950688e-06,-0.00359884569389735,0.154177675268585,-0.307844630326656, + -8.17218501869554e-06,-0.00332700661712515,0.165409552537312,-0.338591745188258, + -8.34922435793972e-06,-0.0030551675403534,0.176641429806039,-0.36933886004986, + -8.52626369729492e-06,-0.00278332846358142,0.187873307074766,-0.400085974911463, + -8.70330303670563e-06,-0.00251148938680945,0.199105184343494,-0.430833089773065, + -8.8803423758943e-06,-0.00223965031003726,0.210337061612221,-0.461580204634667, + -9.05738171497195e-06,-0.00196781123326528,0.221568938880948,-0.492327319496269, + -9.23442105438266e-06,-0.00169597215649331,0.232800816149676,-0.523074434357871, + -9.41146039379337e-06,-0.00142413307972133,0.244032693418403,-0.553821549219473, + -9.58849973320408e-06,-0.00115229400294936,0.25526457068713,-0.584568664081075, + -9.76553907283684e-06,-0.000880454926178054,0.266496447955857,-0.615315778942678, + -9.94257841113733e-06,-0.000608615849404526,0.277728325224585,-0.64606289380428, + -1.0119617750326e-05,-0.000336776772632774,0.288960202493312,-0.676810008665882, + -1.02966570902918e-05,-6.49376958614667e-05,0.300192079762039,-0.707557123527484, + -1.04736964294805e-05,0.000206901380910729,0.311423957030767,-0.738304238389086, + -1.06507357684471e-05,0.000478740457682925,0.322655834299494,-0.769051353250689, + -1.08277751080799e-05,0.000750579534454232,0.333887711568221,-0.799798468112291, + -4.97708186809886e-06,-0.00569162186446176,0.0639522252365395,-0.0621938019127339, + -5.08620036032692e-06,-0.00545055470662098,0.0749402664515676,-0.0930907513620787, + -5.19531885256885e-06,-0.00520948754878031,0.0859283076665957,-0.123987700811423, + -5.30443734478303e-06,-0.00496842039093937,0.096916348881624,-0.154884650260768, + -5.41355583683067e-06,-0.00472735323309859,0.107904390096652,-0.185781599710113, + -5.52267432923914e-06,-0.00448628607525814,0.11889243131168,-0.216678549159458, + -5.63179282131454e-06,-0.00424521891741725,0.129880472526708,-0.247575498608802, + -5.74091131361198e-06,-0.0040041517595768,0.140868513741736,-0.278472448058147, + -5.85002980579841e-06,-0.0037630846017358,0.151856554956764,-0.309369397507492, + -5.95914829798483e-06,-0.00352201744389502,0.162844596171792,-0.340266346956836, + -6.06826679033778e-06,-0.00328095028605446,0.17383263738682,-0.371163296406181, + -6.17738528235767e-06,-0.00303988312821324,0.184820678601849,-0.402060245855526, + -6.28650377448858e-06,-0.00279881597037246,0.195808719816877,-0.432957195304871, + -6.39562226689705e-06,-0.00255774881253212,0.206796761031905,-0.463854144754215, + -6.50474075947205e-06,-0.00231668165469179,0.217784802246933,-0.49475109420356, + -6.61385925160296e-06,-0.00207561449685101,0.228772843461961,-0.525648043652905, + -6.72297774373387e-06,-0.00183454733901023,0.239760884676989,-0.556544993102249, + -6.83209623564274e-06,-0.001593480181169,0.250748925892017,-0.587441942551594, + -6.94121472788467e-06,-0.00135241302332845,0.261736967107045,-0.618338892000939, + -7.05033322068171e-06,-0.00111134586548811,0.272725008322073,-0.649235841450284, + -7.15945171236854e-06,-0.00087027870764711,0.283713049537101,-0.680132790899628, + -7.26857020472149e-06,-0.000629211549806108,0.294701090752129,-0.711029740348973, + -7.37768869707445e-06,-0.000388144391965994,0.305689131967157,-0.741926689798318, + -7.48680718920536e-06,-0.000147077234124993,0.316677173182185,-0.772823639247663, + -7.59592568155831e-06,9.3989923715565e-05,0.327665214397213,-0.803720588697007, + -3.71250461386752e-06,-0.00562867394503819,0.0636597386881602,-0.0624493766702425, + -3.77918532362687e-06,-0.00541236153796443,0.0744556803412751,-0.0934637595955922, + -3.84586603335846e-06,-0.00519604913089067,0.08525162199439,-0.124478142520942, + -3.91254674311781e-06,-0.0049797367238168,0.0960475636475049,-0.155492525446291, + -3.97922745293267e-06,-0.00476342431674326,0.10684350530062,-0.186506908371641, + -4.04590816266426e-06,-0.00454711190966939,0.117639446953735,-0.217521291296991, + -4.11258887239585e-06,-0.00433079950259563,0.128435388606849,-0.24853567422234, + -4.17926958218295e-06,-0.00411448709552176,0.139231330259964,-0.27955005714769, + -4.24595029185904e-06,-0.00389817468844811,0.150027271913079,-0.310564440073039, + -4.31263100175716e-06,-0.00368186228137435,0.160823213566194,-0.341578822998389, + -4.37931171159978e-06,-0.00346554987430059,0.171619155219309,-0.372593205923738, + -4.44599242122035e-06,-0.00324923746722683,0.182415096872424,-0.403607588849088, + -4.51267313106296e-06,-0.00303292506015351,0.193211038525538,-0.434621971774438, + -4.5793538410166e-06,-0.00281661265307953,0.204006980178653,-0.465636354699787, + -4.64603455052615e-06,-0.00260030024600555,0.214802921831768,-0.496650737625137, + -4.71271526047978e-06,-0.00238398783893201,0.225598863484883,-0.527665120550486, + -4.77939597043342e-06,-0.0021676754318587,0.236394805137998,-0.558679503475836, + -4.84607667994297e-06,-0.00195136302478427,0.247190746791113,-0.589693886401186, + -4.91275738967456e-06,-0.00173505061771007,0.257986688444228,-0.620708269326535, + -4.97943809918411e-06,-0.00151873821063653,0.268782630097343,-0.651722652251885, + -5.04611880913775e-06,-0.00130242580356299,0.279578571750457,-0.682737035177234, + -5.11279951875832e-06,-0.00108611339648856,0.290374513403573,-0.713751418102584, + -5.17948022848991e-06,-0.000869800989415026,0.301170455056687,-0.744765801027934, + -5.24616093855457e-06,-0.000653488582341932,0.311966396709802,-0.775780183953283, + -5.31284164861923e-06,-0.000437176175268839,0.322762338362916,-0.806794566878633, + -2.73890571138302e-06,-0.00558124015239941,0.0634345469472606,-0.0626450288560269, + -2.77969848899717e-06,-0.00538425722868063,0.0740828399435056,-0.0937493115683843, + -2.82049126643091e-06,-0.00518727430496169,0.0847311329397504,-0.124853594280742, + -2.86128404400343e-06,-0.00499029138124296,0.0953794259359953,-0.155957876993099, + -2.90207682138166e-06,-0.00479330845752379,0.10602771893224,-0.187062159705457, + -2.94286959889867e-06,-0.00459632553380496,0.116676011928485,-0.218166442417814, + -2.9836623762769e-06,-0.00439934261008579,0.12732430492473,-0.249270725130171, + -3.0244551540437e-06,-0.0042023596863674,0.137972597920975,-0.280375007842529, + -3.06524793153296e-06,-0.00400537676264845,0.14862089091722,-0.311479290554886, + -3.10604070891118e-06,-0.00380839383892928,0.159269183913465,-0.342583573267244, + -3.14683348628941e-06,-0.00361141091521033,0.16991747690971,-0.373687855979601, + -3.18762626383418e-06,-0.00341442799149161,0.180565769905955,-0.404792138691959, + -3.22841904148996e-06,-0.00321744506777266,0.1912140629022,-0.435896421404316, + -3.26921181936779e-06,-0.0030204621440546,0.201862355898444,-0.467000704116673, + -3.310004596635e-06,-0.00282347922033499,0.21251064889469,-0.498104986829031, + -3.35079737445731e-06,-0.00262649629661671,0.223158941890934,-0.529209269541388, + -3.39159015150248e-06,-0.00242951337289732,0.233807234887179,-0.560313552253746, + -3.43238292899173e-06,-0.00223253044917837,0.244455527883424,-0.591417834966103, + -3.47317570670302e-06,-0.00203554752545987,0.255103820879669,-0.622522117678461, + -3.51396848374819e-06,-0.00183856460174026,0.265752113875914,-0.653626400390818, + -3.55476126212562e-06,-0.00164158167802286,0.276400406872158,-0.684730683103175, + -3.59555403917078e-06,-0.00144459875430281,0.287048699868404,-0.715834965815533, + -3.63634681643799e-06,-0.00124761583058364,0.297696992864649,-0.74693924852789, + -3.67713959403826e-06,-0.00105063290686536,0.308345285860893,-0.778043531240247, + -3.71793237174955e-06,-0.000853649983146187,0.318993578857139,-0.809147813952605, + -2.00373790508468e-06,-0.00554600914918618,0.0632645060146246,-0.0627921284506976, + -2.02892152043055e-06,-0.00536377545118588,0.0738014540411196,-0.0939640016281287, + -2.0541051357903e-06,-0.00518154175318591,0.0843384020676143,-0.12513587480556, + -2.07928875109453e-06,-0.00499930805518567,0.0948753500941091,-0.156307747982991, + -2.10447236628775e-06,-0.00481707435718537,0.105412298120604,-0.187479621160422, + -2.12965598156423e-06,-0.00463484065918507,0.115949246147099,-0.218651494337853, + -2.15483959725704e-06,-0.00445260696118543,0.126486194173594,-0.249823367515284, + -2.18002321256128e-06,-0.00427037326318513,0.137023142200088,-0.280995240692715, + -2.20520682753245e-06,-0.00408813956518461,0.147560090226583,-0.312167113870146, + -2.23039044294771e-06,-0.00390590586718464,0.158097038253078,-0.343338987047577, + -2.25557405858501e-06,-0.00372367216918468,0.168633986279573,-0.374510860225008, + -2.28075767372271e-06,-0.00354143847118427,0.179170934306068,-0.405682733402439, + -2.30594128919348e-06,-0.0033592047731843,0.189707882332563,-0.43685460657987, + -2.33112490444221e-06,-0.00317697107518389,0.200244830359058,-0.468026479757301, + -2.35630851985746e-06,-0.00299473737718414,0.210781778385552,-0.499198352934732, + -2.38149213493966e-06,-0.00281250367918395,0.221318726412047,-0.530370226112163, + -2.40667575035491e-06,-0.00263026998118354,0.231855674438542,-0.561542099289595, + -2.43185936565915e-06,-0.00244803628318357,0.242392622465037,-0.592713972467026, + -2.45704298085236e-06,-0.00226580258518272,0.252929570491532,-0.623885845644457, + -2.4822265961566e-06,-0.00208356888718297,0.263466518518026,-0.655057718821888, + -2.50741021146084e-06,-0.00190133518918278,0.274003466544521,-0.686229591999319, + -2.53259382654303e-06,-0.00171910149118171,0.284540414571017,-0.71740146517675, + -2.55777744273544e-06,-0.00153686779318329,0.29507736259751,-0.748573338354181, + -2.58296105759559e-06,-0.00135463409518177,0.305614310624006,-0.779745211531612, + -2.6081446727888e-06,-0.00117240039718203,0.316151258650501,-0.810917084709043, + -1.4567048298858e-06,-0.00552011838490268,0.0631379833391577,-0.0629012299352861, + -1.47248479620554e-06,-0.0053489440620324,0.0735921619988165,-0.0941232339108343, + -1.48826476256692e-06,-0.00517776973916217,0.0840463406584754,-0.125345237886383, + -1.50404472887278e-06,-0.00500659541629189,0.0945005193181342,-0.156567241861931, + -1.5198246952064e-06,-0.0048354210934215,0.104954697977793,-0.187789245837479, + -1.53560466154001e-06,-0.00466424677055122,0.115408876637452,-0.219011249813027, + -1.55138462781812e-06,-0.00449307244768082,0.125863055297111,-0.250233253788575, + -1.56716459409623e-06,-0.00432189812481065,0.13631723395677,-0.281455257764124, + -1.58294456037433e-06,-0.00415072380194026,0.146771412616429,-0.312677261739672, + -1.59872452665244e-06,-0.0039795494790702,0.157225591276087,-0.34389926571522, + -1.61450449293055e-06,-0.00380837515619969,0.167679769935746,-0.375121269690768, + -1.6302844594307e-06,-0.00363720083332941,0.178133948595405,-0.406343273666317, + -1.64606442565329e-06,-0.00346602651045935,0.188588127255064,-0.437565277641865, + -1.66184439198691e-06,-0.00329485218758907,0.199042305914723,-0.468787281617413, + -1.67762435832053e-06,-0.00312367786471879,0.209496484574381,-0.500009285592961, + -1.69340432487619e-06,-0.00295250354184895,0.21995066323404,-0.53123128956851, + -1.70918429132083e-06,-0.00278132921897867,0.230404841893699,-0.562453293544058, + -1.72496425698832e-06,-0.0026101548961075,0.240859020553358,-0.593675297519606, + -1.74074422376602e-06,-0.00243898057323833,0.251313199213016,-0.624897301495154, + -1.75652418965555e-06,-0.00226780625036715,0.261767377872676,-0.656119305470703, + -1.77230415632224e-06,-0.00209663192749732,0.272221556532334,-0.687341309446251, + -1.78808412265585e-06,-0.00192545760462703,0.282675735191993,-0.718563313421799, + -1.80386408887845e-06,-0.00175428328175631,0.293129913851653,-0.749785317397347, + -1.81964405499002e-06,-0.00158310895888603,0.303584092511311,-0.781007321372896, + -1.83542402110159e-06,-0.00141193463601486,0.314038271170971,-0.812229325348444, + -1.05409447145877e-06,-0.0055012386522445,0.0630448669403176,-0.0629813351146762, + -1.06416351181027e-06,-0.00533824956799184,0.0734381730101917,-0.0942401464406587, + -1.07423255221728e-06,-0.00517526048373934,0.0838314790800657,-0.125498957766641, + -1.08430159240225e-06,-0.00501227139948646,0.0942247851499398,-0.156757769092624, + -1.09437063283702e-06,-0.00484928231523385,0.104618091219814,-0.188016580418606, + -1.10443967316076e-06,-0.00468629323098124,0.115011397289688,-0.219275391744589, + -1.11450871376206e-06,-0.00452330414672886,0.125404703359562,-0.250534203070571, + -1.1245777540303e-06,-0.00436031506247636,0.135798009429436,-0.281793014396554, + -1.134646794132e-06,-0.00419732597822309,0.14619131549931,-0.313051825722536, + -1.14471583456677e-06,-0.00403433689397037,0.156584621569185,-0.344310637048519, + -1.1547848753346e-06,-0.00387134780971876,0.166977927639058,-0.375569448374502, + -1.16485391526977e-06,-0.00370835872546516,0.177371233708933,-0.406828259700484, + -1.17492295559352e-06,-0.00354536964121266,0.187764539778807,-0.438087071026467, + -1.1849919960838e-06,-0.00338238055696016,0.198157845848681,-0.469345882352449, + -1.19506103646305e-06,-0.00321939147270722,0.208551151918555,-0.500604693678432, + -1.20513007662026e-06,-0.00305640238845473,0.218944457988429,-0.531863505004414, + -1.21519911711054e-06,-0.00289341330420201,0.229337764058303,-0.563122316330397, + -1.22526815760082e-06,-0.00273042421994929,0.239731070128177,-0.594381127656379, + -1.23533719764701e-06,-0.00256743513569657,0.250124376198051,-0.625639938982362, + -1.24540623791525e-06,-0.00240444605144363,0.260517682267925,-0.656898750308344, + -1.25547527873859e-06,-0.00224145696719225,0.270910988337799,-0.688157561634327, + -1.26554431889581e-06,-0.00207846788293908,0.281304294407673,-0.719416372960309, + -1.27561335938609e-06,-0.00191547879868637,0.291697600477547,-0.750675184286292, + -1.28568240009841e-06,-0.00175248971443365,0.302090906547422,-0.781933995612274, + -1.2957514401446e-06,-0.00158950063018182,0.312484212617295,-0.813192806938257, + -7.60159664076054e-07,-0.00548754861970574,0.0629768871422562,-0.0630397150369398, + -7.6670921528299e-07,-0.00533055962925999,0.0733257758731576,-0.0943253512233551, + -7.73258766573193e-07,-0.00517357063881413,0.0836746646040593,-0.12561098740977, + -7.79808318002173e-07,-0.00501658164836838,0.0940235533349608,-0.156896623596186, + -7.86357868931553e-07,-0.00485959265792213,0.104372442065862,-0.188182259782601, + -7.92907420332778e-07,-0.00470260366747643,0.114721330796764,-0.219467895969016, + -7.9945697162298e-07,-0.00454561467703063,0.125070219527666,-0.250753532155431, + -8.06006522802161e-07,-0.0043886256865846,0.135419108258567,-0.282039168341847, + -8.1255607392583e-07,-0.0042316366961388,0.145767996989469,-0.313324804528262, + -8.19105625327055e-07,-0.00407464770569299,0.15611688572037,-0.344610440714677, + -8.25655176561746e-07,-0.00391765871524696,0.166465774451272,-0.375896076901093, + -8.32204728073993e-07,-0.0037606697248016,0.176814663182173,-0.407181713087508, + -8.38754279197662e-07,-0.00360368073435535,0.187163551913075,-0.438467349273923, + -8.45303830487865e-07,-0.00344669174390955,0.197512440643977,-0.469752985460338, + -8.51853381833578e-07,-0.00328970275346396,0.207861329374878,-0.501038621646754, + -8.58402932846225e-07,-0.00313271376301794,0.218210218105779,-0.532324257833169, + -8.64952484302961e-07,-0.00297572477257235,0.228559106836681,-0.563609894019584, + -8.71502035537652e-07,-0.00281873578212632,0.238907995567583,-0.594895530206, + -8.78051586661321e-07,-0.00266174679168008,0.249256884298484,-0.626181166392415, + -8.84601137673968e-07,-0.00250475780123383,0.259605773029386,-0.65746680257883, + -8.91150689130704e-07,-0.00234776881078869,0.269954661760287,-0.688752438765245, + -8.97700239810284e-07,-0.00219077982034177,0.280303550491189,-0.720038074951661, + -9.04249791489065e-07,-0.00203379082989663,0.29065243922209,-0.751323711138076, + -9.10799343278867e-07,-0.00187680183945194,0.301001327952991,-0.782609347324491, + -9.17348894513559e-07,-0.00171981284900591,0.311350216683893,-0.813894983510907, + -3.87513374328075e-05,-0.00790301093123119,0.0810393634870072,-0.0671847208865598, + -4.2471694755325e-05,-0.00723021059810613,0.0963611459252105,-0.0945026907767414, + -4.61920520778425e-05,-0.00655741026498113,0.111682928363414,-0.121820660666923, + -4.99124094003045e-05,-0.00588460993185602,0.127004710801617,-0.149138630557104, + -5.3632766722822e-05,-0.00521180959873102,0.14232649323982,-0.176456600447286, + -5.73531240453673e-05,-0.00453900926560591,0.157648275678024,-0.203774570337468, + -6.10734813678571e-05,-0.00386620893248102,0.172970058116227,-0.231092540227649, + -6.47938386903468e-05,-0.0031934085993558,0.18829184055443,-0.258410510117831, + -6.85141960126701e-05,-0.00252060826623057,0.203613622992633,-0.285728480008012, + -7.22345533355484e-05,-0.0018478079331059,0.218935405430837,-0.313046449898194, + -7.59549106576496e-05,-0.00117500759998013,0.23425718786904,-0.340364419788375, + -7.96752679803614e-05,-0.000502207266855681,0.249578970307243,-0.367682389678557, + -8.33956253027401e-05,0.000170593066269653,0.264900752745447,-0.395000359568739, + -8.71159826254519e-05,0.000843393399394543,0.28022253518365,-0.42231832945892, + -9.08363399479972e-05,0.00151619373251966,0.295544317621853,-0.449636299349102, + -9.45566972703205e-05,0.00218899406564477,0.310866100060056,-0.476954269239283, + -9.82770545928657e-05,0.0028617943987701,0.32618788249826,-0.504272239129465, + -0.000101997411915411,0.00353459473189499,0.341509664936463,-0.531590209019646, + -0.000105717769237734,0.0042073950650201,0.356831447374666,-0.558908178909828, + -0.000109438126560391,0.00488019539814522,0.37215322981287,-0.586226148800009, + -0.000113158483883047,0.00555299573126966,0.387475012251072,-0.613544118690191, + -0.000116878841205481,0.00622579606439499,0.402796794689276,-0.640862088580373, + -0.000120599198527804,0.00689859639752077,0.41811857712748,-0.668180058470554, + -0.000124319555850461,0.00757139673064477,0.433440359565682,-0.695498028360736, + -0.000128039913172673,0.008244197063771,0.448762142003886,-0.722815998250917, + -3.85300721344739e-05,-0.00788329595479953,0.0809844087123069,-0.0672410256727426, + -4.22110033521939e-05,-0.00721235489558286,0.0962754640655238,-0.0945803054201955, + -4.58919345698305e-05,-0.00654141383636603,0.111566519418741,-0.121919585167648, + -4.9572865787717e-05,-0.00587047277714958,0.126857574771957,-0.149258864915101, + -5.32537970052704e-05,-0.00519953171793275,0.142148630125174,-0.176598144662554, + -5.69347282229904e-05,-0.00452859065871603,0.157439685478391,-0.203937424410007, + -6.06156594410434e-05,-0.00385764959949975,0.172730740831608,-0.23127670415746, + -6.42965906586523e-05,-0.00318670854028302,0.188021796184825,-0.258615983904913, + -6.79775218763723e-05,-0.0025157674810663,0.203312851538042,-0.285955263652366, + -7.16584530939257e-05,-0.00184482642184958,0.218603906891258,-0.313294543399819, + -7.53393843120898e-05,-0.0011738853626333,0.233894962244475,-0.340633823147271, + -7.90203155295877e-05,-0.000502944303416575,0.249186017597692,-0.367973102894724, + -8.27012467474741e-05,0.000167996755799704,0.264477072950908,-0.395312382642177, + -8.6382177964861e-05,0.000838937815017315,0.279768128304126,-0.42265166238963, + -9.0063109182803e-05,0.00150987887423359,0.295059183657343,-0.449990942137083, + -9.37440404003009e-05,0.0021808199334501,0.310350239010559,-0.477330221884536, + -9.7424971618354e-05,0.00285176099266704,0.325641294363777,-0.504669501631989, + -0.000101105902836074,0.00352270205188354,0.340932349716993,-0.532008781379442, + -0.000104786834053572,0.00419364311110049,0.35622340507021,-0.559348061126895, + -0.000108467765271736,0.00486458417031654,0.371514460423427,-0.586687340874348, + -0.000112148696488679,0.00553552522953416,0.386805515776644,-0.6140266206218, + -0.000115829627707287,0.00620646628874955,0.40209657112986,-0.641365900369254, + -0.000119510558924674,0.00687740734796627,0.417387626483077,-0.668705180116706, + -0.000123191490142394,0.00754834840718388,0.432678681836294,-0.696044459864159, + -0.000126872421360114,0.00821928946640016,0.447969737189511,-0.723383739611612, + -3.82247026755878e-05,-0.00785619318357883,0.0809085332388486,-0.0673186351740324, + -4.18515377016149e-05,-0.00718784479051343,0.0961571869407825,-0.0946872880442251, + -4.54783727276142e-05,-0.00651949639744787,0.111405840642717,-0.122055940914418, + -4.91052077537246e-05,-0.00585114800438247,0.126654494344651,-0.149424593784611, + -5.27320427798905e-05,-0.00518279961131718,0.141903148046585,-0.176793246654803, + -5.63588778056956e-05,-0.00451445121825145,0.157151801748519,-0.204161899524996, + -5.99857128317782e-05,-0.00384610282518616,0.172400455450453,-0.231530552395189, + -6.36125478577498e-05,-0.00317775443212054,0.187649109152387,-0.258899205265382, + -6.72393828840545e-05,-0.00250940603905536,0.202897762854321,-0.286267858135574, + -7.08662179099151e-05,-0.00184105764598974,0.218146416556255,-0.313636511005767, + -7.44930529361088e-05,-0.00117270925292456,0.233395070258189,-0.34100516387596, + -7.81198879620248e-05,-0.000504360859858943,0.248643723960123,-0.368373816746152, + -8.17467229879965e-05,0.000163987533206678,0.263892377662057,-0.395742469616345, + -8.53735580140791e-05,0.000832335926271854,0.279141031363991,-0.423111122486538, + -8.90003930400507e-05,0.00150068431933792,0.294389685065926,-0.450479775356731, + -9.26272280661333e-05,0.00216903271240287,0.309638338767859,-0.477848428226923, + -9.62540630918829e-05,0.00283738110546872,0.324886992469793,-0.505217081097116, + -9.98808981181876e-05,0.00350572949853367,0.340135646171727,-0.532585733967309, + -0.000103507733144048,0.00417407789159951,0.355384299873661,-0.559954386837501, + -0.000107134568170131,0.00484242628466491,0.370632953575595,-0.587323039707694, + -0.000110761403196546,0.00551077467772965,0.385881607277529,-0.614691692577887, + -0.000114388238221963,0.00617912307079571,0.401130260979463,-0.64206034544808, + -0.00011801507324849,0.00684747146386089,0.416378914681397,-0.669428998318272, + -0.000121641908274683,0.00751581985692606,0.431627568383331,-0.696797651188465, + -0.000125268743299767,0.00818416824999302,0.446876222085266,-0.724166304058658, + -3.7805481504255e-05,-0.00781918500902962,0.080804308743738,-0.0674249973764269, + -4.13586493746843e-05,-0.00715444607824173,0.095994761509842,-0.0948339054985397, + -4.49118172448915e-05,-0.00648970714745345,0.111185214275946,-0.122242813620652, + -4.84649851153485e-05,-0.00582496821666545,0.12637566704205,-0.149651721742765, + -5.20181529854447e-05,-0.00516022928587712,0.141566119808155,-0.177060629864878, + -5.55713208558739e-05,-0.004495490355089,0.156756572574259,-0.204469537986991, + -5.91244887262476e-05,-0.00383075142430112,0.171947025340363,-0.231878446109104, + -6.26776565967879e-05,-0.00316601249351334,0.187137478106467,-0.259287354231217, + -6.62308244668286e-05,-0.00250127356272478,0.202327930872571,-0.286696262353329, + -6.97839923374244e-05,-0.00183653463193689,0.217518383638675,-0.314105170475442, + -7.33371602074095e-05,-0.00117179570114856,0.232708836404779,-0.341514078597555, + -7.68903280778943e-05,-0.00050705677036067,0.247899289170883,-0.368922986719668, + -8.04434959479905e-05,0.000157682160427886,0.263089741936988,-0.39633189484178, + -8.39966638188638e-05,0.000822421091215109,0.278280194703092,-0.423740802963893, + -8.75498316887935e-05,0.00148716002200411,0.293470647469196,-0.451149711086006, + -9.11029995592783e-05,0.00215189895279155,0.3086611002353,-0.478558619208119, + -9.46561674292079e-05,0.00281663788358033,0.323851553001405,-0.505967527330232, + -9.82093353001368e-05,0.00348137681436778,0.339042005767509,-0.533376435452344, + -0.000101762503170177,0.00414611574515589,0.354232458533613,-0.560785343574457, + -0.000105315671040773,0.00481085467594422,0.369422911299717,-0.58819425169657, + -0.00010886883891148,0.00547559360673144,0.384613364065821,-0.615603159818683, + -0.00011242200678141,0.00614033253752044,0.399803816831926,-0.643012067940796, + -0.000115975174651783,0.00680507146830811,0.414994269598029,-0.670420976062908, + -0.000119528342522268,0.00746981039909622,0.430184722364133,-0.697829884185021, + -0.000123081510392309,0.00813454932988522,0.445375175130238,-0.725238792307134, + -3.72341175191859e-05,-0.00776911545554998,0.0806621483403185,-0.0675696216167753, + -4.06879996476817e-05,-0.00710938885211015,0.0957732957329877,-0.0950332661499243, + -4.41418817761219e-05,-0.0064496622486705,0.110884443125657,-0.122496910683073, + -4.75957639044233e-05,-0.00578993564523034,0.125995590518326,-0.149960555216222, + -5.10496460329191e-05,-0.00513020904179062,0.141106737910995,-0.177424199749371, + -5.4503528161276e-05,-0.00447048243835069,0.156217885303664,-0.20488784428252, + -5.7957410289744e-05,-0.00381075583491108,0.171329032696333,-0.232351488815669, + -6.14112924179899e-05,-0.00315102923147093,0.186440180089003,-0.259815133348818, + -6.48651745466244e-05,-0.00249130262803132,0.201551327481672,-0.287278777881967, + -6.83190566749814e-05,-0.00183157602459127,0.216662474874341,-0.314742422415116, + -7.17729388035049e-05,-0.00117184942115189,0.23177362226701,-0.342206066948265, + -7.52268209318063e-05,-0.000512122817711624,0.246884769659679,-0.369669711481414, + -7.86807030599412e-05,0.000147603785728201,0.261995917052348,-0.397133356014562, + -8.21345851884647e-05,0.000807330389168248,0.277107064445018,-0.424597000547711, + -8.55884673173213e-05,0.00146705699260696,0.292218211837686,-0.45206064508086, + -8.90423494456227e-05,0.00212678359604745,0.307329359230356,-0.479524289614009, + -9.24962315739242e-05,0.00278651019948728,0.322440506623025,-0.506987934147158, + -9.59501137020036e-05,0.00344623680292755,0.337551654015694,-0.534451578680307, + -9.94039958305271e-05,0.0041059634063676,0.352662801408363,-0.561915223213456, + -0.000102857877959162,0.00476569000980698,0.367773948801032,-0.589378867746605, + -0.00010631176008713,0.00542541661324725,0.382885096193701,-0.616842512279754, + -0.000109765642215653,0.00608514321668707,0.39799624358637,-0.644306156812903, + -0.000113219524344066,0.0067448698201269,0.413107390979039,-0.671769801346051, + -0.000116673406472811,0.00740459642356628,0.428218538371709,-0.699233445879201, + -0.000120127288600669,0.00806432302700655,0.443329685764378,-0.72669709041235, + -3.64630431560764e-05,-0.00770221594930115,0.0804700980057073,-0.0677641813430692, + -3.97849844228915e-05,-0.00704942226023914,0.0954742529407388,-0.0953014615345548, + -4.31069256898453e-05,-0.00639662857117718,0.11047840787577,-0.12283874172604, + -4.64288669568269e-05,-0.00574383488211527,0.125482562810802,-0.150376021917526, + -4.97508082238363e-05,-0.00509104119305337,0.140486717745833,-0.177913302109012, + -5.30727494907346e-05,-0.00443824750399169,0.155490872680865,-0.205450582300497, + -5.6394690757855e-05,-0.0037854538149299,0.170495027615896,-0.232987862491983, + -5.97166320246423e-05,-0.00313266012586766,0.185499182550928,-0.260525142683468, + -6.30385732917627e-05,-0.00247986643680598,0.200503337485959,-0.288062422874954, + -6.636051455855e-05,-0.00182707274774385,0.215507492420991,-0.31559970306644, + -6.96824558258369e-05,-0.00117427905868239,0.230511647356022,-0.343136983257925, + -7.30043970924577e-05,-0.000521485369620045,0.245515802291054,-0.370674263449411, + -7.6326338359578e-05,0.000131308319441636,0.260519957226085,-0.398211543640897, + -7.96482796265874e-05,0.000784102008503096,0.275524112161116,-0.425748823832382, + -8.29702208930971e-05,0.00143689569756567,0.290528267096148,-0.453286104023868, + -8.6292162160384e-05,0.00208968938662712,0.305532422031179,-0.480823384215353, + -8.9614103427671e-05,0.00274248307568925,0.320536576966211,-0.508360664406839, + -9.29360446944028e-05,0.00339527676475115,0.335540731901242,-0.535897944598325, + -9.62579859613566e-05,0.00404807045381306,0.350544886836274,-0.56343522478981, + -9.95799272280884e-05,0.00470086414287518,0.365549041771305,-0.590972504981296, + -0.000102901868495042,0.00535365783193686,0.380553196706337,-0.618509785172781, + -0.000106223809761885,0.00600645152099899,0.395557351641368,-0.646047065364267, + -0.000109545751028617,0.00665924521006112,0.4105615065764,-0.673584345555752, + -0.000112867692295682,0.0073120388991228,0.425565661511431,-0.701121625747238, + -0.000116189633563191,0.00796483258818403,0.440569816446462,-0.728658905938724, + -3.54362035020206e-05,-0.00761431110991845,0.0802139940284266,-0.0680221884059904, + -3.85861085285266e-05,-0.00697104754351358,0.0950757263030734,-0.0956571173775994, + -4.17360135551159e-05,-0.0063277839771087,0.10993745857772,-0.123292046349208, + -4.48859185816775e-05,-0.00568452041070378,0.124799190852367,-0.150926975320817, + -4.80358236081835e-05,-0.00504125684429868,0.139660923127014,-0.178561904292426, + -5.11857286348283e-05,-0.00439799327789403,0.154522655401661,-0.206196833264035, + -5.4335633661251e-05,-0.00375472971148894,0.169384387676308,-0.233831762235644, + -5.74855386878959e-05,-0.00311146614508406,0.184246119950955,-0.261466691207253, + -6.06354437142076e-05,-0.00246820257867886,0.199107852225602,-0.289101620178862, + -6.37853487409079e-05,-0.00182493901227421,0.213969584500249,-0.316736549150471, + -6.69352537672752e-05,-0.00118167544586889,0.228831316774896,-0.34437147812208, + -7.008515879392e-05,-0.00053841187946424,0.243693049049542,-0.372006407093689, + -7.32350638205093e-05,0.000104851686940632,0.258554781324189,-0.399641336065297, + -7.63849688468765e-05,0.000748115253345949,0.273416513598836,-0.427276265036906, + -7.95348738737989e-05,0.00139137881975016,0.288278245873483,-0.454911194008515, + -8.26847789001661e-05,0.00203464238615525,0.30313997814813,-0.482546122980124, + -8.58346839267554e-05,0.00267790595256034,0.318001710422777,-0.510181051951733, + -8.89845889533447e-05,0.00332116951896522,0.332863442697424,-0.537815980923342, + -9.21344939796009e-05,0.00396443308537009,0.34772517497207,-0.565450909894951, + -9.52843990065233e-05,0.00460769665177452,0.362586907246717,-0.59308583886656, + -9.84343040325575e-05,0.00525096021818028,0.377448639521365,-0.620720767838169, + -0.000101584209059147,0.00589422378458515,0.392310371796011,-0.648355696809777, + -0.00010473411408618,0.00653748735098958,0.407172104070658,-0.675990625781386, + -0.000107884019112658,0.00718075091739445,0.422033836345305,-0.703625554752995, + -0.000111033924139248,0.00782401448379977,0.436895568619952,-0.731260483724604, + -3.40927319410211e-05,-0.00750131884290484,0.0798783290034158,-0.0683578978307025, + -3.70239188101085e-05,-0.00687103020131541,0.0945538257009949,-0.0961198838503931, + -3.9955105679057e-05,-0.0062407415597257,0.109229322398574,-0.123881869870084, + -4.28862925481721e-05,-0.00561045291813633,0.123904819096153,-0.151643855889775, + -4.58174794171762e-05,-0.00498016427654668,0.138580315793732,-0.179405841909465, + -4.87486662862358e-05,-0.00434987563495703,0.153255812491311,-0.207167827929156, + -5.16798531552398e-05,-0.0037195869933675,0.16793130918889,-0.234929813948847, + -5.46110400244659e-05,-0.00308929835177818,0.182606805886469,-0.262691799968537, + -5.75422268935255e-05,-0.00245900971018886,0.197282302584048,-0.290453785988228, + -6.04734137626406e-05,-0.00182872106859922,0.211957799281627,-0.318215772007919, + -6.34046006317002e-05,-0.00119843242700979,0.226633295979206,-0.345977758027609, + -6.63357875003712e-05,-0.000568143785419695,0.241308792676785,-0.3737397440473, + -6.92669743697083e-05,6.21448561692883e-05,0.255984289374364,-0.401501730066991, + -7.21981612387124e-05,0.000692433497758937,0.270659786071943,-0.429263716086681, + -7.51293481078275e-05,0.00132272213934859,0.285335282769523,-0.457025702106372, + -7.80605349766095e-05,0.00195301078093824,0.300010779467101,-0.484787688126063, + -8.09917218458356e-05,0.00258329942252766,0.31468627616468,-0.512549674145753, + -8.39229087151727e-05,0.00321358806411665,0.329361772862259,-0.540311660165444, + -8.68540955839547e-05,0.00384387670570674,0.344037269559839,-0.568073646185135, + -8.97852824530698e-05,0.00447416534729594,0.358712766257418,-0.595835632204825, + -9.27164693222959e-05,0.00510445398888537,0.373388262954996,-0.623597618224516, + -9.56476561917441e-05,0.00573474263047435,0.388063759652575,-0.651359604244207, + -9.8578843060082e-05,0.00636503127206511,0.402739256350155,-0.679121590263897, + -0.000101510029929308,0.00699531991365365,0.417414753047733,-0.706883576283588, + -0.000104441216798534,0.00762560855524308,0.432090249745312,-0.734645562303279, + -3.23751147089935e-05,-0.0073601376514536,0.0794482412780845,-0.0687840802472298, + -3.50372660770093e-05,-0.00674725802378606,0.0938858129100584,-0.0967073649252313, + -3.76994174449974e-05,-0.00613437839611847,0.108323384542032,-0.124630649603233, + -4.03615688129577e-05,-0.00552149876845098,0.122760956174006,-0.152553934281234, + -4.30237201811123e-05,-0.00490861914078367,0.13719852780598,-0.180477218959236, + -4.56858715489616e-05,-0.00429573951311601,0.151636099437954,-0.208400503637237, + -4.83480229169775e-05,-0.00368285988544848,0.166073671069928,-0.236323788315239, + -5.10101742849378e-05,-0.00306998025778105,0.180511242701902,-0.26424707299324, + -5.36723256527871e-05,-0.00245710063011328,0.194948814333875,-0.292170357671241, + -5.63344770208585e-05,-0.00184422100244586,0.209386385965849,-0.320093642349243, + -5.89966283890409e-05,-0.00123134137477865,0.223823957597823,-0.348016927027244, + -6.16587797568902e-05,-0.000618461747110777,0.238261529229797,-0.375940211705246, + -6.4320931124906e-05,-5.58211944312603e-06,0.252699100861771,-0.403863496383247, + -6.69830824929774e-05,0.000607297508224303,0.267136672493745,-0.431786781061249, + -6.96452338608822e-05,0.00122017713589173,0.281574244125719,-0.45971006573925, + -7.23073852292311e-05,0.00183305676355872,0.296011815757692,-0.487633350417252, + -7.49695365971359e-05,0.00244593639122637,0.310449387389666,-0.515556635095253, + -7.76316879649297e-05,0.00305881601889402,0.32488695902164,-0.543479919773254, + -8.02938393329455e-05,0.00367169564656189,0.339324530653614,-0.571403204451256, + -8.29559907012944e-05,0.00428457527422887,0.353762102285588,-0.599326489129257, + -8.56181420687552e-05,0.00489745490189719,0.368199673917562,-0.627249773807259, + -8.8280293436549e-05,0.00551033452956462,0.382637245549536,-0.65517305848526, + -9.09424448052309e-05,0.0061232141572316,0.397074817181509,-0.683096343163262, + -9.36045961724696e-05,0.00673609378489948,0.411512388813483,-0.711019627841263, + -9.62667475407075e-05,0.00734897341256691,0.425949960445457,-0.738942912519264, + -3.02428762286033e-05,-0.00718989029943223,0.0789129219964207,-0.0693085114166922, + -3.25877583167711e-05,-0.00659987447214505,0.0930554171182493,-0.0974302792810717, + -3.49326404048278e-05,-0.00600985864485759,0.107197912240078,-0.125552047145451, + -3.72775224930511e-05,-0.00541984281757057,0.121340407361906,-0.153673815009831, + -3.96224045812188e-05,-0.00482982699028334,0.135482902483735,-0.18179558287421, + -4.19672866693865e-05,-0.00423981116299621,0.149625397605564,-0.209917350738589, + -4.43121687574988e-05,-0.00364979533570886,0.163767892727392,-0.238039118602969, + -4.6657050845722e-05,-0.00305977950842173,0.177910387849221,-0.266160886467348, + -4.90019329335012e-05,-0.00246976368113416,0.19205288297105,-0.294282654331728, + -5.1346815022113e-05,-0.00187974785384726,0.206195378092878,-0.322404422196107, + -5.36916971101142e-05,-0.00128973202655991,0.220337873214707,-0.350526190060487, + -5.60365791982265e-05,-0.000699716199272782,0.234480368336535,-0.378647957924866, + -5.83814612863942e-05,-0.000109700371985211,0.248622863458364,-0.406769725789246, + -6.07263433740624e-05,0.00048031545530236,0.262765358580193,-0.434891493653625, + -6.30712254625632e-05,0.00107033128258904,0.276907853702021,-0.463013261518005, + -6.54161075507309e-05,0.00166034710987639,0.29105034882385,-0.491135029382384, + -6.77609896391207e-05,0.0022503629371633,0.305192843945679,-0.519256797246763, + -7.01058717271774e-05,0.00284037876445042,0.319335339067507,-0.547378565111143, + -7.24507538153452e-05,0.00343039459173822,0.333477834189336,-0.575500332975522, + -7.47956359030688e-05,0.00402041041902557,0.347620329311165,-0.603622100839901, + -7.71405179913476e-05,0.00461042624631247,0.361762824432993,-0.631743868704281, + -7.94854000790712e-05,0.00520044207360026,0.375905319554822,-0.65986563656866, + -8.18302821677941e-05,0.00579045790088673,0.39004781467665,-0.68798740443304, + -8.41751642562949e-05,0.00638047372817363,0.404190309798479,-0.716109172297419, + -8.65200463442406e-05,0.00697048955546142,0.418332804920308,-0.744230940161799, + -2.76906766451257e-05,-0.00699323286277509,0.0782702182224257,-0.0699296381602874, + -2.96804563928443e-05,-0.00643235776638196,0.0920599444313986,-0.0982864859024318, + -3.16702361404242e-05,-0.00587148266998838,0.105849670640372,-0.126643333644576, + -3.36600158881706e-05,-0.00531060757359525,0.119639396849345,-0.155000181386721, + -3.56497956355284e-05,-0.00474973247720156,0.133429123058318,-0.183357029128865, + -3.76395753833858e-05,-0.00418885738080843,0.147218849267291,-0.211713876871009, + -3.96293551312987e-05,-0.00362798228441552,0.161008575476263,-0.240070724613154, + -4.16191348788786e-05,-0.00306710718802206,0.174798301685236,-0.268427572355298, + -4.36089146262364e-05,-0.00250623209162826,0.188588027894209,-0.296784420097443, + -4.55986943740938e-05,-0.00194535699523524,0.202377754103182,-0.325141267839587, + -4.75884741218402e-05,-0.00138448189884222,0.216167480312155,-0.353498115581731, + -4.9578253869309e-05,-0.000823606802448751,0.229957206521128,-0.381854963323876, + -5.15680336170554e-05,-0.000262731706055064,0.243746932730101,-0.41021181106602, + -5.35578133643577e-05,0.000298143390338623,0.257536658939074,-0.438568658808165, + -5.55475931122151e-05,0.000859018486731644,0.271326385148047,-0.466925506550309, + -5.75373728599615e-05,0.00141989358312467,0.28511611135702,-0.495282354292453, + -5.95271526078189e-05,0.00198076867951791,0.298905837565993,-0.523639202034598, + -6.15169323548992e-05,0.00254164377591204,0.312695563774966,-0.551996049776742, + -6.35067121030897e-05,0.00310251887230462,0.326485289983939,-0.580352897518886, + -6.54964918502809e-05,0.00366339396869808,0.340275016192912,-0.608709745261031, + -6.74862715981384e-05,0.00422426906509132,0.354064742401885,-0.637066593003175, + -6.94760513461068e-05,0.00478514416148412,0.367854468610857,-0.66542344074532, + -7.1465831092965e-05,0.00534601925787914,0.381644194819831,-0.693780288487464, + -7.34556108410445e-05,0.0059068943542715,0.395433921028804,-0.722137136229608, + -7.54453905891239e-05,0.0064677694506643,0.409223647237776,-0.750493983971753, + -2.4765843945479e-05,-0.00677712800949692,0.0775312295647967,-0.0706328365407603, + -2.63822469181996e-05,-0.00625194792299394,0.0909172739889085,-0.0992558260825144, + -2.79986498909757e-05,-0.00572676783649095,0.10430331841302,-0.127878815624268, + -2.96150528635852e-05,-0.0052015877499878,0.117689362837132,-0.156501805166023, + -3.12314558363336e-05,-0.00467640766348476,0.131075407261244,-0.185124794707777, + -3.28478588090264e-05,-0.00415122757698183,0.144461451685356,-0.213747784249531, + -3.44642617820523e-05,-0.00362604749047912,0.157847496109467,-0.242370773791285, + -3.60806647545786e-05,-0.00310086740397575,0.171233540533579,-0.270993763333039, + -3.76970677272714e-05,-0.00257568731747249,0.184619584957691,-0.299616752874793, + -3.93134706999643e-05,-0.00205050723096978,0.198005629381803,-0.328239742416547, + -4.09298736725461e-05,-0.0015253271444664,0.211391673805915,-0.356862731958301, + -4.25462766455165e-05,-0.0010001470579637,0.224777718230027,-0.385485721500055, + -4.41626796184313e-05,-0.000474966971460766,0.238163762654138,-0.414108711041809, + -4.57790825910687e-05,5.02131150419416e-05,0.25154980707825,-0.442731700583563, + -4.73954855636505e-05,0.00057539320154576,0.264935851502362,-0.471354690125317, + -4.90118885365654e-05,0.00110057328804825,0.278321895926474,-0.499977679667071, + -5.06282915089251e-05,0.00162575337455162,0.291707940350586,-0.528600669208825, + -5.22446944821731e-05,0.00215093346105433,0.305093984774698,-0.557223658750579, + -5.38610974546438e-05,0.00267611354755748,0.318480029198809,-0.585846648292333, + -5.54775004271146e-05,0.00320129363406085,0.331866073622921,-0.614469637834087, + -5.70939034004736e-05,0.00372647372056267,0.345252118047032,-0.643092627375841, + -5.87103063727223e-05,0.00425165380706627,0.358638162471144,-0.671715616917596, + -6.03267093456372e-05,0.00477683389356942,0.372024206895256,-0.700338606459349, + -6.19431123183301e-05,0.00530201398007257,0.385410251319368,-0.728961596001104, + -6.35595152911339e-05,0.00582719406657572,0.39879629574348,-0.757584585542858, + -2.15765426092307e-05,-0.00655239545050879,0.0767226627807991,-0.0713894207000596, + -2.28274613289781e-05,-0.00606883491992061,0.0896692784930238,-0.100298757132398, + -2.40783800486977e-05,-0.00558527438933248,0.102615894205248,-0.129208093564736, + -2.5329298768334e-05,-0.00510171385874414,0.115562509917473,-0.158117429997074, + -2.65802174880814e-05,-0.00461815332815607,0.128509125629697,-0.187026766429412, + -2.78311362078565e-05,-0.004134592797568,0.141455741341922,-0.21593610286175, + -2.90820549274096e-05,-0.00365103226697949,0.154402357054147,-0.244845439294088, + -3.03329736473512e-05,-0.00316747173639176,0.167348972766371,-0.273754775726425, + -3.15838923667378e-05,-0.00268391120580325,0.180295588478596,-0.302664112158763, + -3.28348110867349e-05,-0.00220035067521507,0.19324220419082,-0.331573448591101, + -3.40857298061215e-05,-0.00171679014462689,0.206188819903045,-0.360482785023439, + -3.53366485258966e-05,-0.00123322961403871,0.219135435615269,-0.389392121455777, + -3.65875672462268e-05,-0.000749669083451199,0.232082051327494,-0.418301457888115, + -3.78384859658354e-05,-0.00026610855286302,0.245028667039718,-0.447210794320453, + -3.9089404685333e-05,0.000217451977725602,0.257975282751943,-0.476120130752791, + -4.03403234051636e-05,0.000701012508313781,0.270921898464167,-0.505029467185129, + -4.15912421247722e-05,0.00118457303890174,0.283868514176392,-0.533938803617467, + -4.28421608440477e-05,0.00166813356949014,0.296815129888616,-0.562848140049805, + -4.40930795638783e-05,0.00215169410007854,0.309761745600841,-0.591757476482143, + -4.53439982843751e-05,0.00263525463066605,0.322708361313066,-0.620666812914481, + -4.65949170036506e-05,0.00311881516125379,0.335654977025289,-0.649576149346819, + -4.78458357230371e-05,0.00360237569184285,0.348601592737515,-0.678485485779157, + -4.90967544434229e-05,0.00408593622243014,0.361548208449739,-0.707394822211495, + -5.03476731626984e-05,0.00456949675301965,0.374494824161964,-0.736304158643833, + -5.15985918828621e-05,0.00505305728360694,0.387441439874189,-0.765213495076171, + -1.82820068112266e-05,-0.00633178907998166,0.0758846509921035,-0.0721601188421155, + -1.92020081763167e-05,-0.00589405962601686,0.0883782051392907,-0.101361143930426, + -2.01220095410737e-05,-0.00545633017205149,0.100871759286478,-0.130562169018737, + -2.10420109060805e-05,-0.00501860071808657,0.113365313433665,-0.159763194107048, + -2.1962012271004e-05,-0.00458087126412166,0.125858867580853,-0.188964219195359, + -2.2882013635761e-05,-0.00414314181015618,0.13835242172804,-0.21816524428367, + -2.38020150007401e-05,-0.00370541235619148,0.150845975875227,-0.247366269371981, + -2.47220163657191e-05,-0.00326768290222657,0.163339530022415,-0.276567294460292, + -2.56420177306982e-05,-0.00282995344826165,0.175833084169602,-0.305768319548603, + -2.65620190952887e-05,-0.00239222399429595,0.18832663831679,-0.334969344636914, + -2.74820204602677e-05,-0.00195449454033114,0.200820192463977,-0.364170369725225, + -2.84020218253578e-05,-0.00151676508636611,0.213313746611164,-0.393371394813536, + -2.93220231902258e-05,-0.00107903563240108,0.225807300758351,-0.422572419901847, + -3.02420245549273e-05,-0.000641306178436052,0.238300854905539,-0.451773444990158, + -3.11620259195733e-05,-0.000203576724470356,0.250794409052726,-0.480974470078469, + -3.20820272849964e-05,0.000234152729494008,0.263287963199913,-0.51017549516678, + -3.30020286495314e-05,0.00067188218345926,0.275781517347101,-0.539376520255091, + -3.39220300145104e-05,0.00110961163742429,0.288275071494288,-0.568577545343402, + -3.48420313798226e-05,0.0015473410913891,0.300768625641475,-0.597778570431713, + -3.57620327445796e-05,0.00198507054535391,0.313262179788662,-0.626979595520024, + -3.66820341088925e-05,0.00242279999931982,0.32575573393585,-0.656180620608335, + -3.76020354743156e-05,0.00286052945328441,0.338249288083037,-0.685381645696646, + -3.85220368391836e-05,0.003298258907249,0.350742842230224,-0.714582670784957, + -3.94420382042737e-05,0.00373598836121447,0.363236396377412,-0.743783695873268, + -4.03620395693638e-05,0.00417371781517817,0.375729950524598,-0.772984720961579, + -1.5063564925144e-05,-0.00612720700004926,0.0750635316699236,-0.0729026729103611, + -1.57071187954771e-05,-0.00573692304783152,0.087115380217898,-0.102384734874635, + -1.63506726658103e-05,-0.00534663909561384,0.0991672287658724,-0.131866796838909, + -1.69942265362821e-05,-0.00495635514339632,0.111219077313847,-0.161348858803183, + -1.76377804065875e-05,-0.00456607119117847,0.123270925861821,-0.190830920767457, + -1.82813342767263e-05,-0.00417578723896062,0.135322774409796,-0.220312982731731, + -1.89248881469761e-05,-0.00378550328674265,0.14737462295777,-0.249795044696005, + -1.95684420172815e-05,-0.0033952193345248,0.159426471505745,-0.279277106660279, + -2.02119958878644e-05,-0.00300493538230762,0.171478320053719,-0.308759168624553, + -2.08555497580587e-05,-0.00261465143008976,0.183530168601693,-0.338241230588827, + -2.14991036285861e-05,-0.00222436747787191,0.195582017149668,-0.367723292553101, + -2.21426574988914e-05,-0.00183408352565428,0.207633865697642,-0.397205354517375, + -2.27862113692523e-05,-0.00144379957343665,0.219685714245616,-0.426687416481649, + -2.34297652392801e-05,-0.00105351562121836,0.231737562793591,-0.456169478445923, + -2.40733191100295e-05,-0.000663231669001396,0.243789411341565,-0.485651540410197, + -2.47168729804459e-05,-0.000272947716783767,0.255841259889539,-0.515133602374471, + -2.53604268505292e-05,0.000117336235434751,0.267893108437514,-0.544615664338745, + -2.60039807205015e-05,0.000507620187652824,0.279944956985489,-0.574097726303019, + -2.66475345908068e-05,0.000897904139870453,0.291996805533463,-0.603579788267293, + -2.72910884614452e-05,0.00128818809208786,0.304048654081438,-0.633061850231567, + -2.79346423320836e-05,0.00167847204430505,0.316100502629412,-0.662543912195841, + -2.85781962020559e-05,0.00206875599652312,0.328152351177386,-0.692025974160114, + -2.92217500724723e-05,0.0024590399487403,0.34020419972536,-0.721508036124388, + -2.98653039435548e-05,0.00284932390095749,0.352256048273335,-0.750990098088662, + -3.05088578134161e-05,0.00323960785317601,0.364307896821309,-0.780472160052936, + -1.20864025979217e-05,-0.00594725462785445,0.0743020124196335,-0.0735807020880631, + -1.25164184503479e-05,-0.00560311911021305,0.0859460900176758,-0.103319379981145, + -1.29464343028574e-05,-0.00525898359257171,0.0975901676157181,-0.133058057874227, + -1.33764501551448e-05,-0.00491484807493003,0.109234245213761,-0.16279673576731, + -1.3806466007571e-05,-0.00457071255728869,0.120878322811803,-0.192535413660392, + -1.42364818601082e-05,-0.00422657703964724,0.132522400409845,-0.222274091553474, + -1.46664977125899e-05,-0.00388244152200601,0.144166478007888,-0.252012769446556, + -1.50965135650161e-05,-0.00353830600436444,0.15581055560593,-0.281751447339638, + -1.55265294173867e-05,-0.0031941704867231,0.167454633203972,-0.31149012523272, + -1.59565452695354e-05,-0.00285003496908121,0.179098710802015,-0.341228803125802, + -1.63865611221836e-05,-0.0025058994514402,0.190742788400057,-0.370967481018885, + -1.68165769746098e-05,-0.0021617639337983,0.2023868659981,-0.400706158911967, + -1.7246592826925e-05,-0.00181762841615729,0.214030943596142,-0.430444836805049, + -1.76766086796842e-05,-0.00147349289851606,0.225675021194184,-0.460183514698131, + -1.81066245319439e-05,-0.00112935738087461,0.237319098792226,-0.489922192591213, + -1.85366403843146e-05,-0.000785221863233154,0.248963176390269,-0.519660870484295, + -1.89666562371293e-05,-0.000441086345591701,0.260607253988312,-0.549399548377378, + -1.93966720890559e-05,-9.69508279502485e-05,0.272251331586354,-0.57913822627046, + -1.98266879414266e-05,0.000247184689690982,0.283895409184396,-0.608876904163542, + -2.02567037944634e-05,0.000591320207332213,0.295539486782438,-0.638615582056624, + -2.0686719646057e-05,0.000935455724974776,0.307183564380481,-0.668354259949706, + -2.11167354994268e-05,0.00127959124261467,0.318827641978523,-0.698092937842788, + -2.15467513519085e-05,0.00162372676025635,0.330471719576565,-0.727831615735871, + -2.19767672036131e-05,0.00196786227789847,0.342115797174608,-0.757570293628953, + -2.24067830565389e-05,0.00231199779553926,0.35375987477265,-0.787308971522035, + -9.46817859062699e-06,-0.00579615041194154,0.0736309015583511,-0.0741701195065835, + -9.74466901729198e-06,-0.00549432899130387,0.0849170501959846,-0.10413187614507, + -1.00211594437905e-05,-0.00519250757066592,0.0962031988336182,-0.134093632783557, + -1.02976498701224e-05,-0.00489068615002786,0.107489347471252,-0.164055389422043, + -1.05741402965931e-05,-0.00458886472938991,0.118775496108885,-0.19401714606053, + -1.08506307232026e-05,-0.00428704330875218,0.130061644746519,-0.223978902699016, + -1.11271211498121e-05,-0.00398522188811445,0.141347793384152,-0.253940659337503, + -1.1403611576144e-05,-0.00368340046747617,0.152633942021786,-0.283902415975989, + -1.16801020029755e-05,-0.00338157904683878,0.163920090659419,-0.313864172614476, + -1.19565924294185e-05,-0.00307975762620094,0.175206239297053,-0.343825929252962, + -1.2233082855917e-05,-0.00277793620556266,0.186492387934687,-0.373787685891449, + -1.25095732820824e-05,-0.00247611478492482,0.19777853657232,-0.403749442529935, + -1.27860637087474e-05,-0.00217429336428698,0.209064685209953,-0.433711199168422, + -1.30625541352458e-05,-0.00187247194364892,0.220350833847587,-0.463672955806908, + -1.33390445619108e-05,-0.00157065052301131,0.23163698248522,-0.493634712445395, + -1.36155349885758e-05,-0.00126882910237369,0.242923131122854,-0.523596469083881, + -1.38920254150188e-05,-0.000967007681735188,0.254209279760488,-0.553558225722368, + -1.41685158416838e-05,-0.000665186261098238,0.265495428398121,-0.583519982360854, + -1.44450062683488e-05,-0.000363364840459957,0.276781577035755,-0.613481738999341, + -1.47214966944587e-05,-6.15434198212306e-05,0.288067725673389,-0.643443495637827, + -1.49979871211237e-05,0.000240278000815497,0.299353874311021,-0.673405252276314, + -1.52744775475666e-05,0.000542099421454001,0.310640022948655,-0.703367008914801, + -1.55509679742316e-05,0.000843920842091617,0.321926171586289,-0.733328765553287, + -1.58274584005635e-05,0.00114574226273012,0.333212320223923,-0.763290522191774, + -1.61039488268955e-05,0.00144756368336862,0.344498468861556,-0.79325227883026, + -7.26597980485466e-06,-0.00567409848383488,0.0730655058317331,-0.0746610077444901, + -7.43868304958761e-06,-0.00540908042356814,0.0840511094225305,-0.10480855246593, + -7.61138629457037e-06,-0.00514406236330178,0.0950367130133277,-0.134956097187369, + -7.78408953930332e-06,-0.00487904430303487,0.106022316604125,-0.165103641908808, + -7.95679278386974e-06,-0.00461402624276808,0.117007920194923,-0.195251186630248, + -8.12949602868596e-06,-0.00434900818250128,0.12799352378572,-0.225398731351687, + -8.30219927366871e-06,-0.00408399012223493,0.138979127376517,-0.255546276073127, + -8.47490251837391e-06,-0.00381897206196802,0.149964730967315,-0.285693820794566, + -8.64760576319012e-06,-0.00355395400170155,0.160950334558112,-0.315841365516006, + -8.82030900756225e-06,-0.00328893594143409,0.17193593814891,-0.345988910237445, + -8.99301225282256e-06,-0.0030239178811684,0.182921541739706,-0.376136454958885, + -9.16571549736123e-06,-0.00275889982090094,0.193907145330504,-0.406283999680324, + -9.33841874239949e-06,-0.00249388176063503,0.204892748921301,-0.436431544401764, + -9.51112198721571e-06,-0.00222886370036846,0.215878352512099,-0.466579089123203, + -9.68382523192091e-06,-0.00196384564010166,0.226863956102896,-0.496726633844643, + -9.85652847673713e-06,-0.00169882757983464,0.237849559693694,-0.526874178566082, + -1.00292317213313e-05,-0.00143380951956784,0.248835163284491,-0.557021723287522, + -1.02019349662585e-05,-0.00116879145930149,0.259820766875288,-0.587169268008961, + -1.03746382108527e-05,-0.000903773399034247,0.270806370466086,-0.617316812730401, + -1.05473414556689e-05,-0.000638755338767893,0.281791974056883,-0.64746435745184, + -1.07200447010403e-05,-0.00037373727850154,0.29277757764768,-0.677611902173279, + -1.08927479450793e-05,-0.000108719218234299,0.303763181238478,-0.707759446894719, + -1.10654511904507e-05,0.00015629884203161,0.314748784829275,-0.737906991616159, + -1.12381544351559e-05,0.000421316902298408,0.325734388420072,-0.768054536337598, + -1.1410857679639e-05,0.000686334962565649,0.33671999201087,-0.798202081059038, + -5.482051736172e-06,-0.00557852921852242,0.0726069333781728,-0.0750554505952252, + -5.58796033722775e-06,-0.00534411450003119,0.0833494278031076,-0.105352281397311, + -5.6938689382835e-06,-0.00510969978153997,0.0940919222280422,-0.135649112199397, + -5.79977753953353e-06,-0.00487528506304891,0.104834416652977,-0.165945943001483, + -5.90568614045051e-06,-0.00464087034455729,0.115576911077912,-0.196242773803569, + -6.01159474145074e-06,-0.00440645562606612,0.126319405502847,-0.226539604605656, + -6.11750334272854e-06,-0.00417204090757506,0.137061899927781,-0.256836435407742, + -6.22341194367326e-06,-0.00393762618908367,0.147804394352716,-0.287133266209828, + -6.32932054495106e-06,-0.00370321147059305,0.15854688877765,-0.317430097011914, + -6.43522914595129e-06,-0.00346879675210143,0.169289383202585,-0.347726927814, + -6.54113774684051e-06,-0.00323438203361004,0.18003187762752,-0.378023758616086, + -6.64704634817381e-06,-0.00299996731511909,0.190774372052455,-0.408320589418172, + -6.75295494911854e-06,-0.0027655525966277,0.20151686647739,-0.438617420220258, + -6.85886355000775e-06,-0.00253113787813608,0.212259360902325,-0.468914251022344, + -6.96477215134106e-06,-0.00229672315964491,0.223001855327259,-0.49921108182443, + -7.0706807523413e-06,-0.00206230844115396,0.233744349752194,-0.529507912626516, + -7.17658935323051e-06,-0.00182789372266257,0.244486844177129,-0.559804743428602, + -7.28249795467484e-06,-0.00159347900417162,0.255229338602063,-0.590101574230688, + -7.38840655545303e-06,-0.00135906428568022,0.265971833026998,-0.620398405032774, + -7.4943151571194e-06,-0.00112464956718972,0.276714327451933,-0.65069523583486, + -7.60022375800862e-06,-0.000890234848697879,0.287456821876868,-0.680992066636946, + -7.70613235945294e-06,-0.000655820130207374,0.298199316301802,-0.711288897439032, + -7.81204095978705e-06,-0.000421405411715092,0.308941810726737,-0.741585728241118, + -7.9179495613424e-06,-0.000186990693224143,0.319684305151672,-0.771882559043204, + -8.02385816189854e-06,4.7424025267695e-05,0.330426799576607,-0.80217938984529, + -4.08043643584932e-06,-0.0055054757741303,0.0722463101057433,-0.0753633723797584, + -4.14487548536235e-06,-0.00529559081989184,0.0827980226927252,-0.105776743350523, + -4.20931453479212e-06,-0.00508570586565316,0.0933497352797074,-0.136190114321287, + -4.27375358424964e-06,-0.0048758209114147,0.103901447866689,-0.166603485292052, + -4.33819263379043e-06,-0.00466593595717624,0.114453160453671,-0.197016856262816, + -4.40263168310917e-06,-0.00445605100293733,0.125004873040654,-0.22743022723358, + -4.46707073264996e-06,-0.0042461660486991,0.135556585627635,-0.257843598204345, + -4.53150978219075e-06,-0.00403628109446053,0.146108298214617,-0.288256969175109, + -4.59594883178704e-06,-0.00382639614022229,0.156660010801599,-0.318670340145874, + -4.66038788093925e-06,-0.00361651118598316,0.167211723388582,-0.349083711116638, + -4.72482693042453e-06,-0.0034066262317447,0.177763435975564,-0.379497082087402, + -4.78926598024287e-06,-0.00319674127750669,0.188315148562545,-0.409910453058167, + -4.85370502956162e-06,-0.00298685632326778,0.198866861149528,-0.440323824028931, + -4.91814407888036e-06,-0.00277697136902888,0.20941857373651,-0.470737194999695, + -4.98258312853217e-06,-0.00256708641479064,0.219970286323492,-0.50115056597046, + -5.04702217807296e-06,-0.00235720146055218,0.230521998910474,-0.531563936941224, + -5.1114612273917e-06,-0.00214731650631328,0.241073711497456,-0.561977307911989, + -5.17590027682147e-06,-0.00193743155207504,0.251625424084438,-0.592390678882753, + -5.24033932691736e-06,-0.00172754659783747,0.262177136671419,-0.622804049853518, + -5.30477837601406e-06,-0.00151766164359834,0.272728849258401,-0.653217420824282, + -5.36921742555485e-06,-0.00130777668936011,0.283280561845383,-0.683630791795046, + -5.43365647542871e-06,-0.00109789173512187,0.293832274432365,-0.714044162765811, + -5.4980955245254e-06,-0.000888006780883188,0.304383987019347,-0.744457533736575, + -5.56253457417721e-06,-0.000678121826644063,0.31493569960633,-0.77487090470734, + -5.626973623718e-06,-0.000468236872406269,0.325487412193311,-0.805284275678104, + -3.00539819664269e-06,-0.00545063936356049,0.0719695296992574,-0.0755983749014439, + -3.0446734750611e-06,-0.00525985279772129,0.0823750505193432,-0.106100688048088, + -3.08394875339624e-06,-0.00506906623188197,0.092780571339429,-0.136603001194732, + -3.12322403189791e-06,-0.00487827966604304,0.103186092159515,-0.167105314341376, + -3.16249931014978e-06,-0.00468749310020378,0.1135916129796,-0.19760762748802, + -3.20177458851267e-06,-0.0044967065343644,0.123997133799686,-0.228109940634663, + -3.24104986715312e-06,-0.00430591996852558,0.134402654619772,-0.258612253781307, + -3.28032514551602e-06,-0.00411513340268654,0.144808175439857,-0.289114566927951, + -3.31960042365687e-06,-0.00392434683684706,0.155213696259943,-0.319616880074595, + -3.35887570235283e-06,-0.00373356027100846,0.165619217080029,-0.350119193221239, + -3.39815098071572e-06,-0.00354277370516876,0.176024737900115,-0.380621506367883, + -3.43742625891208e-06,-0.00335198713932949,0.186430258720201,-0.411123819514527, + -3.47670153744151e-06,-0.00316120057349045,0.196835779540286,-0.441626132661171, + -3.51597681558236e-06,-0.00297041400765119,0.207241300360372,-0.472128445807814, + -3.55525209405627e-06,-0.00277962744181215,0.217646821180458,-0.502630758954458, + -3.59452737264121e-06,-0.00258884087597289,0.228052342000544,-0.533133072101102, + -3.63380265122615e-06,-0.00239805431013385,0.23845786282063,-0.563635385247746, + -3.67307792947802e-06,-0.00220726774429503,0.248863383640715,-0.59413769839439, + -3.712353208285e-06,-0.00201648117845621,0.259268904460801,-0.624640011541034, + -3.75162848553767e-06,-0.00182569461261561,0.269674425280887,-0.655142324687678, + -3.79090376434466e-06,-0.00163490804677657,0.280079946100973,-0.685644637834322, + -3.83017904337368e-06,-0.00144412148093842,0.290485466921058,-0.716146950980966, + -3.86945432140351e-06,-0.00125333491509938,0.300890987741143,-0.74664926412761, + -3.90872959954436e-06,-0.00106254834925945,0.31129650856123,-0.777151577274253, + -3.94800487857339e-06,-0.000871761783421299,0.321702029381315,-0.807653890420898, + -2.19596999972982e-06,-0.00541002868313351,0.0717610344841811,-0.0757746483461988, + -2.22013973152912e-06,-0.00523378236273958,0.0820565633018825,-0.106343676282173, + -2.24430946332843e-06,-0.00505753604234593,0.0923520921195836,-0.136912704218147, + -2.26847919515549e-06,-0.0048812897219519,0.102647620937285,-0.16748173215412, + -2.29264892703807e-06,-0.00470504340155842,0.112943149754986,-0.198050760090094, + -2.31681865875411e-06,-0.00452879708116427,0.123238678572688,-0.228619788026068, + -2.34098839035912e-06,-0.00435255076077012,0.133534207390389,-0.259188815962042, + -2.36515812246374e-06,-0.00417630444037675,0.14382973620809,-0.289757843898016, + -2.38932785395773e-06,-0.00400005811998239,0.154125265025792,-0.32032687183399, + -2.41349758584031e-06,-0.00382381179958857,0.164420793843493,-0.350895899769964, + -2.43766731800044e-06,-0.00364756547919542,0.174716322661194,-0.381464927705938, + -2.46183704960545e-06,-0.00347131915880117,0.185011851478896,-0.412033955641912, + -2.486006781377e-06,-0.00329507283840691,0.195307380296597,-0.442602983577886, + -2.510176512871e-06,-0.0031188265180131,0.205602909114298,-0.473172011513859, + -2.53434624464255e-06,-0.00294258019761906,0.215898437932,-0.503741039449833, + -2.55851597674717e-06,-0.00276633387722569,0.226193966749701,-0.534310067385807, + -2.58268570851872e-06,-0.0025900875568321,0.236489495567402,-0.564879095321781, + -2.60685544040129e-06,-0.00241384123643806,0.246785024385104,-0.595448123257755, + -2.63102517239489e-06,-0.00223759491604425,0.257080553202805,-0.626017151193729, + -2.65519490338928e-06,-0.00206134859564999,0.267376082020506,-0.656586179129703, + -2.67936463604901e-06,-0.0018851022752564,0.277671610838208,-0.687155207065677, + -2.70353436748749e-06,-0.00170885595486236,0.287967139655909,-0.717724235001651, + -2.72770409881495e-06,-0.00153260963446833,0.29826266847361,-0.748293262937625, + -2.75187383091957e-06,-0.00135636331407429,0.308558197291312,-0.778862290873598, + -2.77604356324623e-06,-0.00118011699368115,0.318853726109013,-0.809431318809572, + -1.59498190127616e-06,-0.00538024907151868,0.0716061772516516,-0.075905160244249, + -1.61008542687302e-06,-0.00521488692176708,0.0818200837016172,-0.10652358344674, + -1.62518895227559e-06,-0.00504952477201526,0.0920339901515828,-0.13714200664923, + -1.64029247781694e-06,-0.00488416262226354,0.102247896601548,-0.167760429851721, + -1.65539600327502e-06,-0.00471880047251194,0.112461803051514,-0.198378853054212, + -1.67049952876086e-06,-0.0045534383227599,0.12267570950148,-0.228997276256702, + -1.68560305413568e-06,-0.00438807617300807,0.132889615951445,-0.259615699459193, + -1.70070657945498e-06,-0.00422271402325602,0.143103522401411,-0.290234122661683, + -1.71581010527389e-06,-0.00405735187350476,0.153317428851377,-0.320852545864174, + -1.73091363042666e-06,-0.0038919897237526,0.163531335301342,-0.351470969066664, + -1.74601715607903e-06,-0.00372662757400111,0.173745241751308,-0.382089392269155, + -1.76112068167589e-06,-0.00356126542424939,0.183959148201273,-0.412707815471646, + -1.77622420693968e-06,-0.00339590327449746,0.194173054651239,-0.443326238674136, + -1.79132773248103e-06,-0.00323054112474552,0.204386961101205,-0.473944661876627, + -1.80643125802238e-06,-0.00306517897499448,0.21460086755117,-0.504563085079118, + -1.82153478323066e-06,-0.00289981682524165,0.224814774001136,-0.535181508281608, + -1.83663830866099e-06,-0.00273445467548994,0.235028680451102,-0.565799931484099, + -1.85174183442438e-06,-0.00256909252573867,0.245242586901067,-0.596418354686589, + -1.86684535963266e-06,-0.00240373037598651,0.255456493351033,-0.62703677788908, + -1.88194888584015e-06,-0.00223836822623591,0.265670399800998,-0.65765520109157, + -1.89705241149252e-06,-0.00207300607648442,0.275884306250963,-0.688273624294061, + -1.91215593681182e-06,-0.00190764392673248,0.286098212700929,-0.718892047496552, + -1.9272594620201e-06,-0.00174228177698055,0.296312119150895,-0.749510470699042, + -1.94236298689532e-06,-0.00157691962722728,0.306526025600861,-0.780128893901533, + -1.95746651276973e-06,-0.00141155747747668,0.316739932050826,-0.810747317104024, + -1.15336946768241e-06,-0.0053585681419499,0.0714923588165568,-0.07600086250191, + -1.16298470706488e-06,-0.00520125136338623,0.081646312938949,-0.106655506452041, + -1.17259994661389e-06,-0.00504393458482266,0.0918002670613413,-0.137310150402173, + -1.18221518596862e-06,-0.00488661780625899,0.101954221183733,-0.167964794352304, + -1.19183042551763e-06,-0.00472930102769553,0.112108175306126,-0.198619438302436, + -1.20144566501112e-06,-0.00457198424913197,0.122262129428518,-0.229274082252567, + -1.21106090422707e-06,-0.00441466747056796,0.13241608355091,-0.259928726202699, + -1.22067614383159e-06,-0.00425735069200461,0.142570037673302,-0.29058337015283, + -1.23029138371367e-06,-0.0041000339134416,0.152723991795694,-0.321238014102962, + -1.23990662248552e-06,-0.00394271713487715,0.162877945918087,-0.351892658053093, + -1.24952186242311e-06,-0.00378540035631425,0.173031900040479,-0.382547302003225, + -1.25913710180559e-06,-0.00362808357775046,0.183185854162871,-0.413201945953356, + -1.26875234129908e-06,-0.00347076679918668,0.193339808285263,-0.443856589903487, + -1.27836758057054e-06,-0.00331345002062311,0.203493762407655,-0.474511233853619, + -1.28798281995302e-06,-0.00315613324205932,0.213647716530048,-0.50516587780375, + -1.29759805955754e-06,-0.00299881646349598,0.223801670652439,-0.535820521753882, + -1.30721329905104e-06,-0.00284149968493219,0.233955624774832,-0.566475165704013, + -1.31682853854453e-06,-0.00268418290636885,0.244109578897224,-0.597129809654145, + -1.32644377803803e-06,-0.00252686612780528,0.254263533019616,-0.627784453604276, + -1.33605901742051e-06,-0.00236954934924194,0.264417487142008,-0.658439097554408, + -1.34567425658094e-06,-0.00221223257067749,0.274571441264401,-0.689093741504539, + -1.35528949651853e-06,-0.00205491579211525,0.284725395386792,-0.719748385454671, + -1.36490473578998e-06,-0.00189759901355124,0.294879349509185,-0.750403029404802, + -1.37451997528348e-06,-0.00174028223498723,0.305033303631577,-0.781057673354934, + -1.38413521466596e-06,-0.00158296545642367,0.315187257753969,-0.811712317305065, + -8.31339066226233e-07,-0.00534286518022409,0.0714093462833771,-0.0760705439261344, + -8.37581454998793e-07,-0.00519144046630249,0.0815195955185766,-0.106751560433651, + -8.43823843854619e-07,-0.005040015752381,0.0916298447537761,-0.137432576941169, + -8.50066232516156e-07,-0.00488859103845918,0.101740093988976,-0.168113593448686, + -8.56308621288715e-07,-0.00473716632453769,0.111850343224175,-0.198794609956203, + -8.62551009950252e-07,-0.00458574161061576,0.121960592459375,-0.22947562646372, + -8.68793398778323e-07,-0.00443431689669427,0.132070841694574,-0.260156642971237, + -8.75035787550882e-07,-0.00428289218277278,0.142181090929774,-0.290837659478754, + -8.81278176323441e-07,-0.00413146746885107,0.152291340164973,-0.321518675986271, + -8.87520564929467e-07,-0.00398004275492903,0.162401589400173,-0.352199692493788, + -8.93762954090604e-07,-0.00382861804100831,0.172511838635372,-0.382880709001305, + -9.00005342585608e-07,-0.00367719332708605,0.182622087870572,-0.413561725508822, + -9.06247731247145e-07,-0.00352576861316445,0.192732337105771,-0.444242742016339, + -9.12490119686638e-07,-0.00337434389924218,0.202842586340971,-0.474923758523856, + -9.1873250862573e-07,-0.00322291918532081,0.212952835576171,-0.505604775031373, + -9.24974897342778e-07,-0.00307149447139921,0.22306308481137,-0.53628579153889, + -9.31217286503916e-07,-0.00292006975747805,0.23317333404657,-0.566966808046407, + -9.37459675220964e-07,-0.00276864504355623,0.243283583281769,-0.597647824553924, + -9.4370206382699e-07,-0.00261722032963463,0.253393832516969,-0.628328841061441, + -9.49944452988127e-07,-0.00246579561571325,0.263504081752168,-0.659009857568958, + -9.56186841483131e-07,-0.00231437090179165,0.273614330987368,-0.689690874076475, + -9.62429230311201e-07,-0.00216294618787005,0.283724580222567,-0.720371890583992, + -9.68671618362116e-07,-0.00201152147394756,0.293834829457767,-0.751052907091509, + -9.74914006746097e-07,-0.00186009676002552,0.303945078692966,-0.781733923599026, + -9.81156396129279e-07,-0.00170867204610481,0.314055327928166,-0.812414940106543, + -4.42445513552936e-05,-0.00829168561266924,0.0913637107697273,-0.0777833820791131, + -4.81678903504479e-05,-0.0076189447664301,0.106626091225949,-0.104400178095791, + -5.20912293454634e-05,-0.00694620392019074,0.121888471682171,-0.131016974112468, + -5.60145683403401e-05,-0.00627346307395116,0.137150852138394,-0.157633770129146, + -5.99379073354389e-05,-0.00560072222771202,0.152413232594616,-0.184250566145823, + -6.38612463303989e-05,-0.00492798138147266,0.167675613050838,-0.210867362162501, + -6.77845853253034e-05,-0.0042552405352333,0.18293799350706,-0.237484158179178, + -7.17079243202079e-05,-0.00358249968899371,0.198200373963282,-0.264100954195856, + -7.56312633155565e-05,-0.00290975884275468,0.213462754419504,-0.290717750212533, + -7.95546023104055e-05,-0.00223701799651543,0.228725134875726,-0.317334546229211, + -8.3477941305421e-05,-0.00156427715027618,0.243987515331948,-0.343951342245889, + -8.74012803005475e-05,-0.000891536304036933,0.25924989578817,-0.370568138262566, + -9.13246192953965e-05,-0.000218795457797238,0.274512276244393,-0.397184934279244, + -9.52479582900789e-05,0.000453945388442678,0.289774656700615,-0.423801730295921, + -9.91712972855385e-05,0.00112668623468104,0.305037037156836,-0.450418526312599, + -0.000103094636279999,0.0017994270809214,0.320299417613059,-0.477035322329276, + -0.000107017975275681,0.00247216792715999,0.335561798069281,-0.503652118345954, + -0.000110941314270363,0.00314490877339968,0.350824178525503,-0.530268914362631, + -0.000114864653265156,0.00381764961963915,0.366086558981725,-0.556885710379309, + -0.000118787992260061,0.0044903904658784,0.381348939437947,-0.583502506395986, + -0.000122711331255299,0.0051631313121181,0.39661131989417,-0.610119302412664, + -0.000126634670250536,0.00583587215835646,0.411873700350391,-0.636736098429341, + -0.000130558009245441,0.00650861300459571,0.427136080806613,-0.663352894446019, + -0.000134481348240789,0.00718135385083452,0.442398461262835,-0.689969690462697, + -0.000138404687234917,0.0078540946970751,0.457660841719058,-0.716586486479374, + -4.39774573719187e-05,-0.00826637447153794,0.0912927069884302,-0.0778555991839324, + -4.78572041406056e-05,-0.00759549191827702,0.106521831821564,-0.104495630683952, + -5.17369509092924e-05,-0.00692460936501615,0.121750956654699,-0.131135662183971, + -5.56166976781458e-05,-0.00625372681175529,0.136980081487833,-0.15777569368399, + -5.94964444469714e-05,-0.00558284425849453,0.152209206320967,-0.18441572518401, + -6.33761912157693e-05,-0.00491196170523378,0.167438331154101,-0.211055756684029, + -6.72559379843451e-05,-0.00424107915197269,0.182667455987236,-0.237695788184048, + -7.11356847533651e-05,-0.00357019659871216,0.19789658082037,-0.264335819684067, + -7.50154315221074e-05,-0.00289931404545118,0.213125705653504,-0.290975851184087, + -7.88951782908498e-05,-0.00222843149219032,0.228354830486639,-0.317615882684106, + -8.27749250594811e-05,-0.00155754893892945,0.243583955319773,-0.344255914184125, + -8.66546718284456e-05,-0.000886666385668589,0.258813080152907,-0.370895945684145, + -9.0534418597521e-05,-0.000215783832408389,0.274042204986041,-0.397535977184164, + -9.44141653657082e-05,0.000455098720853586,0.289271329819176,-0.424176008684183, + -9.82939121345616e-05,0.00112598127411401,0.30450045465231,-0.450816040184203, + -0.000102173658903748,0.00179686382737465,0.319729579485444,-0.477456071684222, + -0.000106053405672046,0.00246774638063596,0.334958704318579,-0.504096103184241, + -0.0001099331524409,0.00313862893389683,0.350187829151713,-0.53073613468426, + -0.000113812899210086,0.00380951148715702,0.365416953984847,-0.55737616618428, + -0.000117692645978607,0.00448039404041811,0.380646078817981,-0.584016197684299, + -0.000121572392747349,0.00515127659367876,0.395875203651115,-0.610656229184318, + -0.000125452139515314,0.00582215914694073,0.41110432848425,-0.637296260684337, + -0.000129331886285278,0.00649304170020049,0.426333453317384,-0.663936292184357, + -0.000133211633053909,0.00716392425346113,0.441562578150518,-0.690576323684376, + -0.000137091379821763,0.0078348068067231,0.456791702983653,-0.717216355184395, + -4.36091194501165e-05,-0.00823161628614266,0.091194734657373,-0.0779550620272648, + -4.74291090190593e-05,-0.00756332910621127,0.106377999241316,-0.10462709518735, + -5.12490985878911e-05,-0.00689504192627988,0.121561263825259,-0.131299128347435, + -5.50690881565841e-05,-0.00622675474634815,0.136744528409202,-0.15797116150752, + -5.88890777253881e-05,-0.00555846756641643,0.151927792993146,-0.184643194667606, + -6.27090672943309e-05,-0.00489018038648525,0.167111057577089,-0.211315227827691, + -6.65290568632737e-05,-0.00422189320655386,0.182294322161032,-0.237987260987776, + -7.03490464321055e-05,-0.00355360602662225,0.197477586744975,-0.264659294147861, + -7.41690360009928e-05,-0.00288531884669085,0.212660851328918,-0.291331327307946, + -7.7989025569547e-05,-0.00221703166675891,0.227844115912861,-0.318003360468031, + -8.18090151385453e-05,-0.00154874448682762,0.243027380496804,-0.344675393628117, + -8.56290047071551e-05,-0.000880457306895899,0.258210645080748,-0.371347426788202, + -8.94489942764309e-05,-0.000212170126965283,0.27339390966469,-0.398019459948287, + -9.32689838448741e-05,0.000456117052966887,0.288577174248634,-0.424691493108372, + -9.70889734138725e-05,0.00112440423289839,0.303760438832577,-0.451363526268457, + -0.000100908962982316,0.00179269141283012,0.31894370341652,-0.478035559428543, + -0.000104728952551425,0.0024609785927614,0.334126968000463,-0.504707592588628, + -0.000108548942120423,0.00312926577269268,0.349310232584406,-0.531379625748713, + -0.000112368931688978,0.00379755295262463,0.364493497168349,-0.558051658908798, + -0.000116188921258087,0.00446584013255524,0.379676761752292,-0.584723692068883, + -0.00012000891082653,0.00513412731248808,0.394860026336236,-0.611395725228968, + -0.00012382890039575,0.00580241449241869,0.410043290920179,-0.638067758389054, + -0.000127648889964527,0.00647070167234975,0.425226555504121,-0.664739791549139, + -0.000131468879533081,0.0071389888522817,0.440409820088065,-0.691411824709224, + -0.000135288869101968,0.00780727603221365,0.455593084672008,-0.718083857869309, + -4.3103981690551e-05,-0.00818422557750659,0.0910602743446279,-0.078091223542111, + -4.68426985407444e-05,-0.00751955902889478,0.106180648528959,-0.10480706597173, + -5.05814153909656e-05,-0.00685489248028326,0.12130102271329,-0.131522908401349, + -5.43201322412978e-05,-0.00619022593167173,0.136421396897621,-0.158238750830968, + -5.80588490916023e-05,-0.00552555938305999,0.151541771081952,-0.184954593260587, + -6.17975659417125e-05,-0.00486089283444835,0.166662145266282,-0.211670435690206, + -6.55362827922112e-05,-0.00419622628583705,0.181782519450613,-0.238386278119826, + -6.92749996424324e-05,-0.00353155973722541,0.196902893634944,-0.265102120549445, + -7.30137164928202e-05,-0.00286689318861377,0.212023267819275,-0.291817962979064, + -7.67524333427083e-05,-0.00220222664000191,0.227143642003606,-0.318533805408683, + -8.04911501930961e-05,-0.0015375600913905,0.242264016187936,-0.345249647838302, + -8.42298670430397e-05,-0.000872893542778419,0.257384390372268,-0.371965490267921, + -8.7968583893816e-05,-0.000208226994167227,0.272504764556599,-0.39868133269754, + -9.17073007439262e-05,0.000456439554444632,0.287625138740929,-0.425397175127159, + -9.54460175939253e-05,0.00112110610305649,0.30274551292526,-0.452113017556778, + -9.91847344442576e-05,0.00178577265166791,0.317865887109591,-0.478828859986398, + -0.000102923451294479,0.00245043920027954,0.332986261293922,-0.505544702416017, + -0.000106662168144922,0.00311510574889118,0.348106635478253,-0.532260544845636, + -0.000110400884995254,0.00377977229750237,0.363227009662583,-0.558976387275255, + -0.000114139601845475,0.00444443884611445,0.378347383846915,-0.585692229704874, + -0.000117878318695475,0.00510910539472587,0.393467758031245,-0.612408072134493, + -0.000121617035545918,0.00577377194333772,0.408588132215576,-0.639123914564112, + -0.000125355752395917,0.00643843849194914,0.423708506399907,-0.665839756993731, + -0.00012909446924636,0.00710310504056055,0.438828880584238,-0.69255559942335, + -0.000132833186096248,0.00776777158917241,0.453949254768569,-0.71927144185297, + -4.24165047226421e-05,-0.00812023932709,0.0908770912732962,-0.0782760887561202, + -4.60458757737259e-05,-0.00746061366440209,0.105911877835496,-0.105051410620858, + -4.96752468248096e-05,-0.00680098800171414,0.120946664397695,-0.131826732485596, + -5.33046178758378e-05,-0.00614136233902618,0.135981450959895,-0.158602054350334, + -5.69339889267551e-05,-0.005481736676338,0.151016237522094,-0.185377376215072, + -6.05633599780053e-05,-0.00482211101365038,0.166051024084293,-0.21215269807981, + -6.4192731028867e-05,-0.00416248535096231,0.181085810646493,-0.238928019944548, + -6.78221020800063e-05,-0.00350285968827435,0.196120597208692,-0.265703341809286, + -7.14514731309235e-05,-0.00284323402558639,0.211155383770892,-0.292478663674024, + -7.50808441821738e-05,-0.00218360836289855,0.226190170333091,-0.319253985538762, + -7.87102152332575e-05,-0.00152398270021092,0.24122495689529,-0.3460293074035, + -8.23395862839527e-05,-0.000864357037522412,0.25625974345749,-0.372804629268238, + -8.59689573354805e-05,-0.00020473137483501,0.271294530019689,-0.399579951132976, + -8.95983283857316e-05,0.000454894287853946,0.286329316581889,-0.426355272997714, + -9.32276994374259e-05,0.00111451995054113,0.301364103144088,-0.453130594862452, + -9.68570704880101e-05,0.00177414561322942,0.316398889706287,-0.47990591672719, + -0.00010048644153926,0.00243377127591748,0.331433676268487,-0.506681238591928, + -0.000104115812590289,0.00309339693860511,0.346468462830686,-0.533456560456666, + -0.000107745183640984,0.0037530226012934,0.361503249392886,-0.560231882321404, + -0.000111374554692456,0.00441264826398102,0.376538035955085,-0.587007204186142, + -0.000115003925743262,0.00507227392666953,0.391572822517285,-0.61378252605088, + -0.000118633296794401,0.00573189958935716,0.406607609079484,-0.640557847915618, + -0.000122262667845541,0.00639152525204523,0.421642395641684,-0.667333169780356, + -0.000125892038896347,0.0070511509147333,0.436677182203883,-0.694108491645094, + -0.00012952140994793,0.00771077657742003,0.451711968766082,-0.720883813509833, + -4.14905306511115e-05,-0.00803497930851171,0.0906300224053497,-0.078524279428037, + -4.49749343499617e-05,-0.00738234814739813,0.105549537680614,-0.105379455369414, + -4.84593380489229e-05,-0.00672971698628466,0.120469052955878,-0.132234631310791, + -5.19437417477175e-05,-0.00607708582517108,0.135388568231143,-0.159089807252168, + -5.54281454466232e-05,-0.0054244546640575,0.150308083506407,-0.185944983193545, + -5.89125491455289e-05,-0.00477182350294414,0.165227598781671,-0.212800159134922, + -6.23969528445456e-05,-0.00411919234183078,0.180147114056936,-0.239655335076299, + -6.58813565431182e-05,-0.00346656118071664,0.1950666293322,-0.266510511017676, + -6.93657602419684e-05,-0.00281393001960306,0.209986144607464,-0.293365686959053, + -7.2850163940763e-05,-0.00216129885848959,0.224905659882729,-0.320220862900431, + -7.63345676396132e-05,-0.0015086676973759,0.239825175157993,-0.347076038841807, + -7.98189713385189e-05,-0.000856036536262428,0.254744690433257,-0.373931214783185, + -8.33033750378132e-05,-0.000203405375149623,0.269664205708521,-0.400786390724562, + -8.67877787363858e-05,0.000449225785964513,0.284583720983786,-0.427641566665939, + -9.02721824354025e-05,0.00110185694707776,0.29950323625905,-0.454496742607316, + -9.37565861341971e-05,0.00175448810819145,0.314422751534315,-0.481351918548693, + -9.72409898332138e-05,0.00240711926930492,0.329342266809579,-0.50820709449007, + -0.000100725393532008,0.00305975043041884,0.344261782084843,-0.535062270431447, + -0.000104209797230914,0.00371238159153187,0.359181297360107,-0.561917446372824, + -0.000107694200929487,0.004365012752646,0.374100812635372,-0.588772622314201, + -0.000111178604628392,0.00501764391375925,0.389020327910636,-0.615627798255578, + -0.000114663008327742,0.00567027507487206,0.4039398431859,-0.642482974196955, + -0.000118147412026204,0.00632290623598708,0.418859358461166,-0.669338150138332, + -0.000121631815725332,0.00697553739709988,0.433778873736429,-0.69619332607971, + -0.000125116219423349,0.00762816855821447,0.448698389011694,-0.723048502021087, + -4.02606149702278e-05,-0.00792335697679852,0.0903012669809651,-0.0788525176998919, + -4.35565936896254e-05,-0.00728037590829322,0.105067689406134,-0.105813302622921, + -4.68525724090507e-05,-0.00663739483978809,0.119834111831304,-0.132774087545949, + -5.01485511282818e-05,-0.00599441377128263,0.134600534256473,-0.159734872468978, + -5.34445298475128e-05,-0.00535143270277716,0.149366956681643,-0.186695657392007, + -5.67405085671879e-05,-0.00470845163427203,0.164133379106812,-0.213656442315036, + -6.00364872863079e-05,-0.00406547056576656,0.178899801531981,-0.240617227238064, + -6.333246600565e-05,-0.00342248949726132,0.19366622395715,-0.267578012161093, + -6.66284447251586e-05,-0.00277950842875585,0.20843264638232,-0.294538797084122, + -6.99244234446117e-05,-0.00213652736025094,0.223199068807489,-0.321499582007151, + -7.32204021637872e-05,-0.00149354629174536,0.237965491232659,-0.348460366930179, + -7.65163808830738e-05,-0.000850565223240007,0.252731913657828,-0.375421151853208, + -7.98123596028599e-05,-0.000207584154735319,0.267498336082997,-0.402381936776237, + -8.31083383215914e-05,0.000435396913771147,0.282264758508167,-0.429342721699265, + -8.64043170409889e-05,0.0010783779822765,0.297031180933336,-0.456303506622294, + -8.97002957606086e-05,0.00172135905078119,0.311797603358505,-0.483264291545323, + -9.29962744797841e-05,0.00236434011928655,0.326564025783675,-0.510225076468352, + -9.62922531992927e-05,0.0030073211877919,0.341330448208844,-0.53718586139138, + -9.95882319184682e-05,0.00365030225629703,0.356096870634013,-0.564146646314409, + -0.000102884210638421,0.00429328332480194,0.370863293059183,-0.591107431237438, + -0.000106180189357707,0.00493626439330752,0.385629715484352,-0.618068216160466, + -0.000109476168076772,0.0055792454618131,0.400396137909521,-0.645029001083495, + -0.000112772146795614,0.00622222653031912,0.415162560334691,-0.671989786006524, + -0.000116068125515345,0.00686520759882381,0.42992898275986,-0.698950570929553, + -0.000119364104235298,0.0075081886673285,0.444695405185029,-0.725911355852581, + -3.86569647305435e-05,-0.00778056098095492,0.0898716229858205,-0.0792780987456773, + -4.17143859098856e-05,-0.00715077028090649,0.104438459646998,-0.106375812188959, + -4.47718070892278e-05,-0.00652097958085796,0.119005296308177,-0.133473525632242, + -4.78292282686532e-05,-0.00589118888080975,0.133572132969354,-0.160571239075524, + -5.08866494480786e-05,-0.00526139818076155,0.148138969630532,-0.187668952518806, + -5.39440706273653e-05,-0.00463160748071312,0.16270580629171,-0.214766665962088, + -5.70014918070405e-05,-0.0040018167806648,0.177272642952888,-0.24186437940537, + -6.00589129863827e-05,-0.00337202608061649,0.191839479614066,-0.268962092848653, + -6.31163341656693e-05,-0.00274223538056817,0.206406316275244,-0.296059806291935, + -6.61737553447894e-05,-0.00211244468051919,0.220973152936422,-0.323157519735217, + -6.92311765241871e-05,-0.00148265398047109,0.2355399895976,-0.350255233178499, + -7.22885977036958e-05,-0.000852863280422778,0.250106826258778,-0.377352946621781, + -7.53460188829269e-05,-0.000223072580374017,0.264673662919956,-0.404450660065063, + -7.84034400623801e-05,0.000406718119674077,0.279240499581134,-0.431548373508346, + -8.14608612416112e-05,0.00103650881972239,0.293807336242312,-0.458646086951628, + -8.45182824206203e-05,0.00166629951977137,0.30837417290349,-0.48574380039491, + -8.75757036007396e-05,0.0022960902198188,0.322941009564668,-0.512841513838192, + -9.06331247799708e-05,0.00292588091986756,0.337507846225846,-0.539939227281474, + -9.36905459594239e-05,0.00355567161991521,0.352074682887023,-0.567036940724757, + -9.67479671386551e-05,0.00418546231996419,0.366641519548202,-0.594134654168039, + -9.98053883176642e-05,0.00481525302001318,0.38120835620938,-0.621232367611321, + -0.000102862809497561,0.00544504372006127,0.395775192870558,-0.648330081054603, + -0.000105920230676571,0.00607483442010981,0.410342029531736,-0.675427794497885, + -0.000108977651856024,0.00670462512015879,0.424908866192914,-0.702525507941168, + -0.000112035073035144,0.00733441582020689,0.439475702854092,-0.72962322138445, + -3.66157987935489e-05,-0.0076032241914849,0.08932318112222,-0.0798159268761991, + -3.93813574805502e-05,-0.00699120007977883,0.103636028336712,-0.107086683763949, + -4.21469161677457e-05,-0.00637917596807303,0.117948875551203,-0.1343574406517, + -4.49124748545804e-05,-0.00576715185636689,0.132261722765694,-0.16162819753945, + -4.76780335414984e-05,-0.00515512774466043,0.146574569980186,-0.1888989544272, + -5.04435922285551e-05,-0.00454310363295463,0.160887417194678,-0.216169711314951, + -5.32091509157229e-05,-0.00393107952124849,0.175200264409169,-0.243440468202701, + -5.59747096028351e-05,-0.00331905540954269,0.189513111623661,-0.270711225090451, + -5.87402682897809e-05,-0.00270703129783656,0.203825958838152,-0.297981981978201, + -6.15058269768931e-05,-0.00209500718613054,0.218138806052644,-0.325252738865952, + -6.42713856636723e-05,-0.00148298307442429,0.232451653267135,-0.352523495753702, + -6.7036944350618e-05,-0.000870958962717827,0.246764500481627,-0.379794252641452, + -6.98025030380078e-05,-0.000258934851012471,0.261077347696118,-0.407065009529203, + -7.25680617252866e-05,0.000353089260693107,0.27539019491061,-0.434335766416953, + -7.53336204118993e-05,0.000965113372399795,0.289703042125101,-0.461606523304703, + -7.8099179098956e-05,0.00157713748410537,0.304015889339593,-0.488877280192453, + -8.08647377865679e-05,0.0021891615958114,0.318328736554085,-0.516148037080204, + -8.36302964734026e-05,0.0028011857075172,0.332641583768576,-0.543418793967954, + -8.63958551602373e-05,0.00341320981922344,0.346954430983067,-0.570689550855704, + -8.91614138475161e-05,0.00402523393092924,0.361267278197559,-0.597960307743455, + -9.19269725347949e-05,0.00463725804263548,0.375580125412051,-0.625231064631205, + -9.46925312212965e-05,0.00524928215434128,0.389892972626541,-0.652501821518955, + -9.74580899089084e-05,0.00586130626604708,0.404205819841033,-0.679772578406705, + -0.000100223648595188,0.00647333037775422,0.418518667055525,-0.707043335294456, + -0.000102989207282578,0.00708535448945957,0.432831514270016,-0.734314092182206, + -3.40960517092037e-05,-0.00739098692626106,0.0886437839778648,-0.0804740146847633, + -3.65197484325508e-05,-0.00680237154852958,0.102643171415431,-0.107956507952026, + -3.89434451558979e-05,-0.00621375617079811,0.116642558852997,-0.135439001219288, + -4.13671418791617e-05,-0.00562514079306653,0.130641946290562,-0.16292149448655, + -4.37908386024533e-05,-0.00503652541533495,0.144641333728128,-0.190403987753812, + -4.62145353260501e-05,-0.00444791003760392,0.158640721165694,-0.217886481021075, + -4.86382320492584e-05,-0.00385929465987234,0.17264010860326,-0.245368974288337, + -5.10619287727443e-05,-0.00327067928214098,0.186639496040826,-0.272851467555599, + -5.34856254961191e-05,-0.00268206390440939,0.200638883478392,-0.300333960822862, + -5.59093222192719e-05,-0.0020934485266777,0.214638270915958,-0.327816454090124, + -5.83330189428688e-05,-0.00150483314894667,0.228637658353523,-0.355298947357386, + -6.07567156661326e-05,-0.0009162177712152,0.242637045791089,-0.382781440624649, + -6.31804123895074e-05,-0.000327602393483728,0.256636433228655,-0.410263933891911, + -6.56041091128268e-05,0.000261012984247744,0.270635820666221,-0.437746427159173, + -6.8027805835702e-05,0.00084962836197966,0.284635208103787,-0.465228920426436, + -7.04515025593544e-05,0.00143824373971069,0.298634595541352,-0.492711413693698, + -7.28751992826737e-05,0.00202685911744238,0.312633982978918,-0.52019390696096, + -7.52988960062151e-05,0.00261547449517363,0.326633370416484,-0.547676400228222, + -7.77225927294234e-05,0.00320408987290555,0.34063275785405,-0.575158893495485, + -8.01462894525207e-05,0.0037927052506368,0.354632145291616,-0.602641386762747, + -8.2569986176062e-05,0.00438132062836827,0.368631532729182,-0.630123880030009, + -8.49936828991593e-05,0.00496993600609974,0.382630920166747,-0.657606373297272, + -8.74173796228117e-05,0.00555855138383121,0.396630307604314,-0.685088866564534, + -8.98410763465751e-05,0.00614716676156224,0.410629695041879,-0.712571359831796, + -9.22647730693393e-05,0.00673578213929416,0.424629082479445,-0.740053853099059, + -3.11005306776468e-05,-0.00714803056391161,0.0878328342118803,-0.0812481718479604, + -3.31447504075266e-05,-0.00658930953292436,0.101459703410679,-0.108979746214698, + -3.51889701373231e-05,-0.00603058850193694,0.115086572609478,-0.136711320581436, + -3.72331898670919e-05,-0.00547186747094963,0.128713441808277,-0.164442894948174, + -3.92774095969717e-05,-0.00491314643996243,0.142340311007076,-0.192174469314912, + -4.1321629326796e-05,-0.00435442540897513,0.155967180205875,-0.21990604368165, + -4.33658490568423e-05,-0.00379570437798804,0.169594049404674,-0.247637618048388, + -4.5410068786389e-05,-0.00323698334700051,0.183220918603473,-0.275369192415125, + -4.74542885163798e-05,-0.00267826231601331,0.196847787802272,-0.303100766781863, + -4.9498508246093e-05,-0.00211954128502612,0.210474657001071,-0.330832341148601, + -5.15427279760283e-05,-0.0015608202540387,0.22410152619987,-0.358563915515339, + -5.35869477056861e-05,-0.00100209922305128,0.237728395398669,-0.386295489882077, + -5.56311674355658e-05,-0.000443378192063859,0.251355264597468,-0.414027064248815, + -5.76753871652791e-05,0.000115342838923338,0.264982133796267,-0.441758638615552, + -5.97196068954364e-05,0.000674063869910313,0.278609002995066,-0.46949021298229, + -6.17638266248166e-05,0.00123278490089818,0.292235872193865,-0.497221787349028, + -6.38080463548629e-05,0.00179150593188493,0.305862741392663,-0.524953361715766, + -6.58522660846872e-05,0.00235022696287257,0.319489610591463,-0.552684936082504, + -6.78964858144004e-05,0.00290894799385999,0.333116479790262,-0.580416510449242, + -6.99407055446688e-05,0.00346766902484674,0.346743348989061,-0.60814808481598, + -7.1984925274271e-05,0.00402639005583438,0.360370218187859,-0.635879659182717, + -7.40291450042063e-05,0.00458511108682114,0.373997087386658,-0.663611233549455, + -7.60733647344747e-05,0.00514383211780833,0.387623956585457,-0.691342807916193, + -7.81175844636328e-05,0.00570255314879642,0.401250825784256,-0.719074382282931, + -8.01618041933461e-05,0.00626127417978362,0.414877694983055,-0.746805956649669, + -2.76949814652927e-05,-0.0068837960383844,0.0869067615619287,-0.0821177985406446, + -2.93440439205483e-05,-0.00636170187866747,0.100110309829948,-0.110129170838661, + -3.09931063758595e-05,-0.00583960771895042,0.113313858097968,-0.138140543136678, + -3.26421688311707e-05,-0.00531751355923349,0.126517406365987,-0.166151915434694, + -3.42912312864541e-05,-0.00479541939951644,0.139720954634006,-0.194163287732711, + -3.59402937417097e-05,-0.00427332523979951,0.152924502902026,-0.222174660030727, + -3.75893561969098e-05,-0.00375123108008224,0.166128051170045,-0.250186032328744, + -3.9238418652221e-05,-0.00322913692036531,0.179331599438065,-0.27819740462676, + -4.08874811077542e-05,-0.00270704276064881,0.192535147706084,-0.306208776924777, + -4.25365435630654e-05,-0.00218494860093177,0.205738695974104,-0.334220149222793, + -4.4185606018321e-05,-0.0016628544412145,0.218942244242123,-0.36223152152081, + -4.58346684737987e-05,-0.00114076028149812,0.232145792510142,-0.390242893818826, + -4.74837309288878e-05,-0.000618666121780853,0.245349340778162,-0.418254266116843, + -4.91327933841434e-05,-9.65719620635852e-05,0.258552889046181,-0.446265638414859, + -5.07818558396211e-05,0.000425522197653017,0.271756437314201,-0.474277010712876, + -5.24309182947658e-05,0.000947616357370284,0.28495998558222,-0.502288383010892, + -5.40799807499104e-05,0.00146971051708711,0.29816353385024,-0.530299755308909, + -5.57290432052771e-05,0.00199180467680393,0.311367082118259,-0.558311127606925, + -5.73781056603107e-05,0.00251389883652142,0.324570630386279,-0.586322499904942, + -5.90271681160104e-05,0.0030359929962378,0.337774178654298,-0.614333872202958, + -6.0676230571266e-05,0.00355808715595529,0.350977726922318,-0.642345244500975, + -6.23252930266327e-05,0.00408018131567189,0.364181275190337,-0.670356616798991, + -6.39743554813332e-05,0.00460227547538938,0.377384823458356,-0.698367989097008, + -6.56234179374771e-05,0.00512436963510554,0.390588371726375,-0.726379361395024, + -6.72724803927327e-05,0.00564646379482259,0.403791919994395,-0.754390733693041, + -2.40145463735741e-05,-0.00661209284973829,0.0859012639790929,-0.0830454532095383, + -2.52809823776956e-05,-0.00613263163969541,0.0986475716772185,-0.111355293642768, + -2.65474183817893e-05,-0.0056531704296523,0.111393879375344,-0.139665134075998, + -2.78138543860496e-05,-0.00517370921960947,0.12414018707347,-0.167974974509229, + -2.908029039006e-05,-0.00469424800956642,0.136886494771596,-0.196284814942459, + -3.03467263941815e-05,-0.00421478679952358,0.149632802469721,-0.224594655375689, + -3.16131623983029e-05,-0.00373532558948075,0.162379110167847,-0.252904495808919, + -3.28795984025354e-05,-0.00325586437943781,0.175125417865972,-0.281214336242149, + -3.41460344065458e-05,-0.00277640316939487,0.187871725564098,-0.309524176675379, + -3.54124704106673e-05,-0.00229694195935215,0.200618033262223,-0.337834017108609, + -3.66789064148443e-05,-0.00181748074930899,0.213364340960349,-0.366143857541839, + -3.79453424189102e-05,-0.00133801953926604,0.226110648658475,-0.39445369797507, + -3.92117784225876e-05,-0.000858558329222436,0.238856956356601,-0.4227635384083, + -4.04782144269866e-05,-0.000379097119180161,0.251603264054726,-0.45107337884153, + -4.17446504310526e-05,0.000100364090863003,0.264349571752852,-0.47938321927476, + -4.30110864354516e-05,0.000579825300905501,0.277095879450977,-0.50769305970799, + -4.42775224396286e-05,0.00105928651094844,0.289842187149103,-0.53600290014122, + -4.55439584438055e-05,0.00153874772099138,0.302588494847228,-0.56431274057445, + -4.68103944477605e-05,0.00201820893103477,0.315334802545354,-0.59262258100768, + -4.80768304516044e-05,0.00249767014107771,0.32808111024348,-0.62093242144091, + -4.93432664563365e-05,0.00297713135111977,0.340827417941605,-0.64924226187414, + -5.06097024595142e-05,0.00345659256116404,0.353573725639731,-0.677552102307371, + -5.18761384643573e-05,0.00393605377120609,0.366320033337856,-0.705861942740601, + -5.31425744684233e-05,0.00441551498124904,0.379066341035982,-0.734171783173831, + -5.44090104721562e-05,0.00489497619129242,0.391812648734108,-0.762481623607061, + -2.024860122668e-05,-0.00634846484767609,0.0848676598048198,-0.0839820054716886, + -2.1172586532503e-05,-0.00591578612376553,0.0971464011409162,-0.11259317679516, + -2.20965718385202e-05,-0.00548310739985514,0.109425142477013,-0.141204348118631, + -2.30205571442599e-05,-0.00505042867594441,0.121703883813109,-0.169815519442102, + -2.39445424501938e-05,-0.0046177499520339,0.133982625149205,-0.198426690765574, + -2.48685277561833e-05,-0.0041850712281235,0.146261366485302,-0.227037862089045, + -2.57925130618952e-05,-0.00375239250421255,0.158540107821398,-0.255649033412516, + -2.67164983678292e-05,-0.00331971378030227,0.170818849157494,-0.284260204735988, + -2.76404836739297e-05,-0.0028870350563921,0.183097590493591,-0.312871376059459, + -2.85644689798081e-05,-0.00245435633248103,0.195376331829687,-0.34148254738293, + -2.948845428552e-05,-0.00202167760857042,0.207655073165784,-0.370093718706401, + -3.04124395913985e-05,-0.00158899888466024,0.21993381450188,-0.398704890029873, + -3.13364248972769e-05,-0.00115632016074962,0.232212555837976,-0.427316061353344, + -3.22604102030999e-05,-0.000723641436839007,0.244491297174073,-0.455927232676815, + -3.31843955089228e-05,-0.000290962712928167,0.256770038510169,-0.484538404000286, + -3.41083808149678e-05,0.000141716010982007,0.269048779846266,-0.513149575323758, + -3.50323661209018e-05,0.000574394734892403,0.281327521182362,-0.541760746647229, + -3.59563514263916e-05,0.00100707345880346,0.293606262518458,-0.5703719179707, + -3.68803367324366e-05,0.00143975218271386,0.305885003854555,-0.598983089294172, + -3.78043220388147e-05,0.00187243090662337,0.31816374519065,-0.627594260617643, + -3.87283073436384e-05,0.00230510963053554,0.330442486526747,-0.656205431941114, + -3.96522926497944e-05,0.00273778835444594,0.342721227862844,-0.684816603264585, + -4.05762779555063e-05,0.00317046707835678,0.354999969198941,-0.713427774588056, + -4.15002632626615e-05,0.0036031458022654,0.367278710535036,-0.742038945911528, + -4.24242485678183e-05,0.00403582452617757,0.379557451871134,-0.770650117234999, + -1.66046072638815e-05,-0.00610674845149206,0.0838632239709511,-0.0848764364913305, + -1.72458415884369e-05,-0.0057222667830471,0.0956898557338712,-0.11377538641115, + -1.78870759132144e-05,-0.00533778511460259,0.107516487496791,-0.142674336330969, + -1.85283102375478e-05,-0.00495330344615741,0.119343119259711,-0.171573286250788, + -1.91695445621587e-05,-0.00456882177771267,0.131169751022631,-0.200472236170607, + -1.98107788866309e-05,-0.0041843401092676,0.142996382785551,-0.229371186090426, + -2.04520132112695e-05,-0.00379985844082287,0.154823014548471,-0.258270136010245, + -2.10932475357417e-05,-0.0034153767723778,0.166649646311391,-0.287169085930064, + -2.1734481860658e-05,-0.00303089510393328,0.178476278074311,-0.316068035849883, + -2.23757161850746e-05,-0.00264641343548822,0.190302909837231,-0.344966985769702, + -2.30169505094913e-05,-0.00226193176704315,0.202129541600151,-0.373865935689521, + -2.3658184834241e-05,-0.00187745009859852,0.213956173363071,-0.40276488560934, + -2.42994191586021e-05,-0.00149296843015323,0.225782805125991,-0.431663835529159, + -2.49406534835739e-05,-0.00110848676170927,0.23760943688891,-0.460562785448978, + -2.55818878076575e-05,-0.000724005093263758,0.24943606865183,-0.489461735368798, + -2.62231221324072e-05,-0.000339523424818688,0.261262700414751,-0.518360685288616, + -2.68643564570459e-05,4.49582436257145e-05,0.27308933217767,-0.547259635208436, + -2.75055907817956e-05,0.00042943991207034,0.28491596394059,-0.576158585128255, + -2.81468251061012e-05,0.000813921580515409,0.29674259570351,-0.605057535048074, + -2.87880594307399e-05,0.00119840324896048,0.30856922746643,-0.633956484967893, + -2.94292937557117e-05,0.0015828849174051,0.32039585922935,-0.662855434887712, + -3.00705280801283e-05,0.00196736658584973,0.33222249099227,-0.691754384807531, + -3.0711762404656e-05,0.0023518482542948,0.34404912275519,-0.72065333472735, + -3.13529967286286e-05,0.00273632992274031,0.35587575451811,-0.749552284647169, + -3.19942310532673e-05,0.00312081159118538,0.36770238628103,-0.778451234566988, + -1.32643123506859e-05,-0.00589635286828044,0.0829389981464266,-0.0856864416886958, + -1.36895836624906e-05,-0.00555849310559758,0.0943514979743686,-0.114846006629252, + -1.41148549741288e-05,-0.00522063334291434,0.105763997802311,-0.144005571569809, + -1.45401262860168e-05,-0.00488277358023126,0.117176497630253,-0.173165136510365, + -1.49653975977104e-05,-0.00454491381754829,0.128588997458195,-0.202324701450922, + -1.53906689097094e-05,-0.00420705405486566,0.140001497286137,-0.231484266391479, + -1.58159402214308e-05,-0.00386919429218235,0.151413997114079,-0.260643831332035, + -1.62412115330968e-05,-0.00353133452949927,0.162826496942022,-0.289803396272592, + -1.66664828447627e-05,-0.00319347476681631,0.174238996769964,-0.318962961213148, + -1.70917541563731e-05,-0.00285561500413323,0.185651496597906,-0.348122526153705, + -1.75170254682055e-05,-0.00251775524144993,0.197063996425848,-0.377282091094261, + -1.79422967802045e-05,-0.00217989547876729,0.20847649625379,-0.406441656034818, + -1.8367568092037e-05,-0.00184203571608421,0.219888996081732,-0.435601220975374, + -1.87928394033143e-05,-0.00150417595340047,0.231301495909675,-0.464760785915931, + -1.92181107154799e-05,-0.00116631619071805,0.242713995737617,-0.493920350856488, + -1.96433820269792e-05,-0.000828456428034752,0.254126495565559,-0.523079915797044, + -2.00686533391448e-05,-0.000490596665352339,0.265538995393501,-0.552239480737601, + -2.04939246503111e-05,-0.000152736902668593,0.276951495221443,-0.581399045678157, + -2.09191959623656e-05,0.000185122860014042,0.288363995049385,-0.610558610618714, + -2.1344467273976e-05,0.000522982622697121,0.299776494877327,-0.63971817555927, + -2.17697385852533e-05,0.000860842385380867,0.311188994705269,-0.668877740499827, + -2.21950098975299e-05,0.00119870214806284,0.322601494533211,-0.698037305440383, + -2.26202812092513e-05,0.00153656191074658,0.334013994361154,-0.72719687038094, + -2.30455525206397e-05,0.00187442167343033,0.345426494189096,-0.756356435321496, + -2.34708238334713e-05,0.00221228143611096,0.356838994017037,-0.785516000262053, + -1.03507837654337e-05,-0.00572130633451018,0.0821302691350132,-0.0863854481388437, + -1.06223777410486e-05,-0.0054259575270364,0.0931817986578394,-0.115769914822122, + -1.08939717166356e-05,-0.0051306087195625,0.104233328180666,-0.1451543815054, + -1.11655656923615e-05,-0.00483525991208866,0.115284857703492,-0.174538848188678, + -1.1437159667893e-05,-0.00453991110461482,0.126336387226318,-0.203923314871956, + -1.17087536436467e-05,-0.00424456229714121,0.137387916749144,-0.233307781555234, + -1.19803476191782e-05,-0.00394921348966715,0.14843944627197,-0.262692248238512, + -1.22519415948763e-05,-0.00365386468219342,0.159490975794797,-0.29207671492179, + -1.25235355705189e-05,-0.0033585158747198,0.170542505317623,-0.321461181605068, + -1.2795129546217e-05,-0.00306316706724585,0.181594034840449,-0.350845648288346, + -1.30667235220261e-05,-0.00276781825977235,0.192645564363275,-0.380230114971624, + -1.33383174975577e-05,-0.00247246945229818,0.203697093886102,-0.409614581654902, + -1.36099114729227e-05,-0.00217712064482378,0.214748623408928,-0.43899904833818, + -1.38815054488983e-05,-0.00188177183735094,0.225800152931754,-0.468383515021458, + -1.41530994243189e-05,-0.00158642302987677,0.23685168245458,-0.497767981704736, + -1.44246933997394e-05,-0.0012910742224026,0.247903211977407,-0.527152448388014, + -1.46962873759371e-05,-0.00099572541492976,0.258954741500232,-0.556536915071292, + -1.49678813512466e-05,-0.000700376607455366,0.270006271023059,-0.58592138175457, + -1.52394753272223e-05,-0.000405027799981639,0.281057800545885,-0.615305848437848, + -1.55110693027538e-05,-0.000109678992508133,0.292109330068711,-0.644690315121126, + -1.57826632779523e-05,0.000185669814966261,0.303160859591537,-0.674074781804404, + -1.6054257254039e-05,0.00048101862244021,0.314212389114364,-0.703459248487682, + -1.63258512295705e-05,0.00077636742991416,0.32526391863719,-0.73284371517096, + -1.65974452052131e-05,0.00107171623738722,0.336315448160016,-0.762228181854238, + -1.68690391808557e-05,0.00136706504486162,0.347366977682842,-0.791612648537516, + -7.91750545015013e-06,-0.00558100423806918,0.0814530923693547,-0.08696399491889, + -8.08614557601395e-06,-0.00532243997700249,0.092203342817765,-0.116534606063426, + -8.25478570212757e-06,-0.00506387571593603,0.102953593266175,-0.146105217207961, + -8.42342582799138e-06,-0.00480531145486918,0.113703843714586,-0.175675828352497, + -8.59206595399398e-06,-0.00454674719380255,0.124454094162996,-0.205246439497032, + -8.76070607985779e-06,-0.00428818293273603,0.135204344611406,-0.234817050641568, + -8.92934620588814e-06,-0.00402961867166962,0.145954595059816,-0.264387661786104, + -9.09798633169645e-06,-0.00377105441060277,0.156704845508226,-0.293958272930639, + -9.26662645783782e-06,-0.00351249014953625,0.167455095956637,-0.323528884075175, + -9.43526658375715e-06,-0.00325392588846962,0.178205346405047,-0.35309949521971, + -9.60390670950995e-06,-0.00299536162740277,0.188955596853457,-0.382670106364246, + -9.77254683542927e-06,-0.00273679736633614,0.199705847301868,-0.412240717508781, + -9.94118696140411e-06,-0.00247823310526929,0.210456097750278,-0.441811328653317, + -1.0109827087379e-05,-0.0022196688442031,0.221206348198688,-0.471381939797853, + -1.02784672133538e-05,-0.00196110458313625,0.231956598647098,-0.500952550942388, + -1.04471073394397e-05,-0.00170254032207007,0.242706849095508,-0.530523162086924, + -1.06157474655255e-05,-0.00144397606100322,0.253457099543919,-0.560093773231459, + -1.07843875909452e-05,-0.00118541179993636,0.264207349992329,-0.589664384375995, + -1.09530277171421e-05,-0.000926847538869513,0.27495760044074,-0.619234995520531, + -1.1121667843339e-05,-0.00066828327780355,0.28570785088915,-0.648805606665066, + -1.12903079687587e-05,-0.000409719016736254,0.29645810133756,-0.678376217809602, + -1.14589480951777e-05,-0.000151154755669847,0.30720835178597,-0.707946828954137, + -1.16275882211525e-05,0.000107409505396561,0.317958602234381,-0.737517440098673, + -1.17962283469053e-05,0.000365973766463412,0.328708852682791,-0.767088051243209, + -1.19648684726581e-05,0.000624538027530264,0.339459103131201,-0.796658662387744, + -5.95790820895337e-06,-0.0054718284239843,0.0809066293812432,-0.0874265160356373, + -6.0607982790839e-06,-0.00524371553294883,0.0914143830249319,-0.11714594097893, + -6.16368834926995e-06,-0.00501560264191359,0.10192213666862,-0.146865365922222, + -6.26657841937273e-06,-0.00478748975087784,0.112429890312309,-0.176584790865514, + -6.36946848930897e-06,-0.00455937685984231,0.122937643955998,-0.206304215808806, + -6.47235855966155e-06,-0.0043312639688069,0.133445397599686,-0.236023640752099, + -6.57524862973657e-06,-0.00410315107777159,0.143953151243375,-0.265743065695391, + -6.67813869986711e-06,-0.00387503818673596,0.154460904887064,-0.295462490638683, + -6.78102877010867e-06,-0.00364692529570076,0.164968658530752,-0.325181915581976, + -6.88391884018369e-06,-0.00341881240466524,0.175476412174441,-0.354901340525268, + -6.98680891053627e-06,-0.00319069951363016,0.185984165818129,-0.38462076546856, + -7.08969898027823e-06,-0.00296258662259441,0.196491919461818,-0.414340190411853, + -7.19258905035325e-06,-0.00273447373155866,0.206999673105507,-0.444059615355145, + -7.29547912092787e-06,-0.00250636084052402,0.217507426749195,-0.473779040298437, + -7.39836919072534e-06,-0.00227824794948805,0.228015180392884,-0.503498465241729, + -7.50125926129996e-06,-0.00205013505845342,0.238522934036572,-0.533217890185022, + -7.60414933109743e-06,-0.00182202216741723,0.249030687680261,-0.562937315128314, + -7.70703940156103e-06,-0.00159390927638214,0.259538441323949,-0.592656740071606, + -7.80992947124748e-06,-0.00136579638534617,0.270046194967638,-0.622376165014899, + -7.91281954204415e-06,-0.00113768349431131,0.280553948611327,-0.652095589958191, + -8.01570961173059e-06,-0.000909570603275345,0.291061702255015,-0.681815014901483, + -8.11859968186113e-06,-0.000681457712240263,0.301569455898704,-0.711534439844776, + -8.22148975176962e-06,-0.000453344821204293,0.312077209542392,-0.741253864788068, + -8.32437982167811e-06,-0.000225231930168768,0.322584963186081,-0.77097328973136, + -8.42726989214171e-06,2.88096086675793e-06,0.33309271682977,-0.800692714674652, + -4.42546953025036e-06,-0.00538878111252727,0.0804786202161186,-0.0877861327909007, + -4.48779988349024e-06,-0.00518498642541804,0.0907968232344126,-0.117621262582057, + -4.55013023675788e-06,-0.00498119173830891,0.101115026252706,-0.147456392373214, + -4.61246059024756e-06,-0.00477739705120006,0.111433229271,-0.177291522164371, + -4.67479094318213e-06,-0.00457360236409032,0.121751432289295,-0.207126651955527, + -4.7371212966163e-06,-0.00436980767698159,0.132069635307588,-0.236961781746684, + -4.79945164988393e-06,-0.0041660129898724,0.142387838325882,-0.266796911537841, + -4.86178200304055e-06,-0.00396221830276289,0.152706041344176,-0.296632041328998, + -4.92411235641921e-06,-0.00375842361565404,0.16302424436247,-0.326467171120154, + -4.9864427094648e-06,-0.00355462892854463,0.173342447380764,-0.356302300911311, + -5.04877306284346e-06,-0.00335083424143545,0.183660650399058,-0.386137430702468, + -5.11110341644416e-06,-0.00314703955432694,0.193978853417352,-0.415972560493624, + -5.17343376926771e-06,-0.00294324486721709,0.204297056435646,-0.445807690284781, + -5.2357641228129e-06,-0.00273945018010835,0.21461525945394,-0.475642820075938, + -5.29809447613605e-06,-0.00253565549299939,0.224933462472233,-0.505477949867095, + -5.36042482957022e-06,-0.00233186080589065,0.235251665490527,-0.535313079658251, + -5.42275518278235e-06,-0.00212806611878147,0.245569868508821,-0.565148209449408, + -5.4850855356614e-06,-0.00192427143167118,0.255888071527116,-0.594983339240564, + -5.54741588909557e-06,-0.00172047674456244,0.266206274545409,-0.624818469031721, + -5.60974624219668e-06,-0.00151668205745326,0.276524477563703,-0.654653598822878, + -5.67207659529778e-06,-0.00131288737034385,0.286842680581997,-0.684488728614035, + -5.734406948954e-06,-0.00110909268323489,0.297160883600291,-0.714323858405191, + -5.79673730238817e-06,-0.000905297996126819,0.307479086618584,-0.744158988196348, + -5.85906765526722e-06,-0.000701503309016527,0.317797289636879,-0.773994117987505, + -5.92139800892344e-06,-0.000497708621907567,0.328115492655173,-0.803829247778661, + -3.25436557427339e-06,-0.00532667556094296,0.0801511491377326,-0.0880597373212555, + -3.29221476833008e-06,-0.00514175923455507,0.0903245483128141,-0.11798289796775, + -3.330063962248e-06,-0.00495684290816711,0.100497947487895,-0.147906058614245, + -3.36791315613816e-06,-0.00477192658177927,0.110671346662977,-0.17782921926074, + -3.40576235008383e-06,-0.00458701025539121,0.120844745838058,-0.207752379907234, + -3.44361154408501e-06,-0.00440209392900348,0.131018145013139,-0.237675540553729, + -3.48146073786415e-06,-0.00421717760261509,0.141191544188221,-0.267598701200224, + -3.51930993164329e-06,-0.00403226127622691,0.151364943363303,-0.297521861846718, + -3.55715912608856e-06,-0.00384734494983974,0.161538342538384,-0.327445022493213, + -3.59500831970117e-06,-0.00366242862345145,0.171711741713465,-0.357368183139708, + -3.63285751364684e-06,-0.00347751229706339,0.181885140888546,-0.387291343786202, + -3.67070670792558e-06,-0.00329259597067599,0.192058540063628,-0.417214504432697, + -3.70855590137165e-06,-0.00310767964428749,0.202231939238709,-0.447137665079192, + -3.74640509592794e-06,-0.00292276331790009,0.212405338413791,-0.477060825725686, + -3.78425428926299e-06,-0.00273784699151181,0.222578737588872,-0.506983986372181, + -3.82210348337519e-06,-0.00255293066512396,0.232752136763953,-0.536907147018676, + -3.85995267759842e-06,-0.00236801433873612,0.242925535939035,-0.566830307665171, + -3.89780187082245e-06,-0.00218309801234695,0.253098935114117,-0.596753468311665, + -3.93565106526772e-06,-0.00199818168596,0.263272334289198,-0.62667662895816, + -3.97350025937993e-06,-0.00181326535957194,0.273445733464279,-0.656599789604654, + -4.01134945315906e-06,-0.00162834903318387,0.28361913263936,-0.686522950251149, + -4.04919864704922e-06,-0.00144343270679581,0.293792531814442,-0.716446110897644, + -4.08704784093938e-06,-0.00125851638040819,0.303965930989523,-0.746369271544139, + -4.12489703482954e-06,-0.00107360005402013,0.314139330164604,-0.776292432190633, + -4.16274622849766e-06,-0.000888683727631623,0.324312729339686,-0.806215592837128, + -2.37504888861428e-06,-0.005280810421116,0.079905056501776,-0.0882644842368586, + -2.39826720455083e-06,-0.00511023439952679,0.0899697611605282,-0.11825352115406, + -2.42148552068167e-06,-0.00493965837793764,0.10003446581928,-0.148242558071262, + -2.4447038368125e-06,-0.00476908235634865,0.110099170478033,-0.178231594988464, + -2.46792215274905e-06,-0.00459850633475933,0.120163875136785,-0.208220631905666, + -2.49114046879662e-06,-0.00442793031317035,0.130228579795537,-0.238209668822868, + -2.5143587848997e-06,-0.00425735429158125,0.140293284454289,-0.26819870574007, + -2.53757710094726e-06,-0.00408677826999182,0.150357989113042,-0.298187742657271, + -2.5607954168283e-06,-0.00391620224840272,0.160422693771794,-0.328176779574473, + -2.58401373265382e-06,-0.00374562622681296,0.170487398430546,-0.358165816491675, + -2.60723204908997e-06,-0.00357505020522431,0.180552103089298,-0.388154853408877, + -2.63045036485998e-06,-0.00340447418363476,0.190616807748051,-0.418143890326079, + -2.65366868101857e-06,-0.00323389816204567,0.200681512406803,-0.448132927243281, + -2.67688699728819e-06,-0.00306332214045724,0.210746217065555,-0.478121964160482, + -2.70010531333575e-06,-0.00289274611886792,0.220810921724307,-0.508111001077684, + -2.72332362893923e-06,-0.00272217009727838,0.230875626383059,-0.538100037994886, + -2.74654194531987e-06,-0.00255159407568883,0.240940331041812,-0.568089074912088, + -2.76976026114539e-06,-0.00238101805409974,0.251005035700564,-0.59807811182929, + -2.79297857763705e-06,-0.00221044203251108,0.261069740359316,-0.628067148746492, + -2.81619689346257e-06,-0.00203986601092243,0.271134445018068,-0.658056185663694, + -2.83941520973219e-06,-0.00186928998933267,0.281199149676821,-0.688045222580896, + -2.86263352566873e-06,-0.00169871396774379,0.291263854335573,-0.718034259498098, + -2.88585184138324e-06,-0.00152813794615403,0.301328558994325,-0.748023296415299, + -2.90907015798592e-06,-0.0013575619245656,0.311393263653077,-0.778012333332501, + -2.93228847381144e-06,-0.00118698590297628,0.321457968311829,-0.808001370249703, + -1.7235237572133e-06,-0.00524724759180278,0.0797225997427357,-0.0884158125911222, + -1.73799350300374e-06,-0.0050873877606607,0.0897067850021773,-0.118453538630706, + -1.75246324873868e-06,-0.00492752792951845,0.099690970261619,-0.14849126467029, + -1.76693299461239e-06,-0.00476766809837637,0.109675155521061,-0.178528990709874, + -1.78140274020855e-06,-0.00460780826723406,0.119659340780502,-0.208566716749458, + -1.79587248605451e-06,-0.00444794843609186,0.129643526039944,-0.238604442789041, + -1.81034223178944e-06,-0.00428808860494978,0.139627711299386,-0.268642168828625, + -1.82481197752438e-06,-0.00412822877380759,0.149611896558827,-0.298679894868209, + -1.83928172348136e-06,-0.00396836894266572,0.159596081818269,-0.328717620907793, + -1.85375146899425e-06,-0.00380850911152297,0.169580267077711,-0.358755346947377, + -1.86822121511776e-06,-0.00364864928038133,0.179564452337152,-0.388793072986961, + -1.88269096079718e-06,-0.00348878944923925,0.189548637596594,-0.418830799026545, + -1.89716070664314e-06,-0.00332892961809717,0.199532822856036,-0.448868525066129, + -1.91163045226705e-06,-0.00316906978695464,0.209517008115478,-0.478906251105712, + -1.92610019800199e-06,-0.00300920995581233,0.219501193374919,-0.508943977145296, + -1.94056994406999e-06,-0.00284935012467114,0.22948537863436,-0.53898170318488, + -1.95503968924982e-06,-0.00268949029352794,0.239469563893803,-0.569019429224464, + -1.96950943509577e-06,-0.00252963046238563,0.249453749153244,-0.599057155264048, + -1.98397918105275e-06,-0.00236977063124399,0.259437934412686,-0.629094881303632, + -1.99844892678769e-06,-0.00220991080010169,0.269422119672128,-0.659132607343215, + -2.0129186724116e-06,-0.00205005096895983,0.279406304931569,-0.689170333382799, + -2.02738841803551e-06,-0.00189019113781708,0.289390490191011,-0.719208059422383, + -2.04185816365943e-06,-0.00173033130667477,0.299374675450453,-0.749245785461967, + -2.05632790994947e-06,-0.00157047147553335,0.309358860709894,-0.779283511501551, + -2.07079765657259e-06,-0.00141061164439282,0.319343045969335,-0.809321237541135, + -1.24551046420951e-06,-0.00522284953621327,0.0795886724021008,-0.0885266361822533, + -1.25470114031856e-06,-0.00507090084651973,0.0895137913536916,-0.11860001914428, + -1.2638918163721e-06,-0.00491895215682614,0.0994389103052823,-0.148673402106307, + -1.27308249239788e-06,-0.00476700346713244,0.109364029256873,-0.178746785068334, + -1.28227316836815e-06,-0.00461505477743873,0.119289148208464,-0.20882016803036, + -1.29146384436618e-06,-0.00446310608774481,0.129214267160055,-0.238893550992387, + -1.30065452041972e-06,-0.00431115739805121,0.139139386111646,-0.268966933954414, + -1.30984519647326e-06,-0.00415920870835773,0.149064505063237,-0.299040316916441, + -1.31903587241577e-06,-0.00400726001866381,0.158989624014828,-0.329113699878468, + -1.32822654869136e-06,-0.00385531132897055,0.168914742966418,-0.359187082840494, + -1.33741722446734e-06,-0.0037033626392764,0.178839861918009,-0.389260465802521, + -1.34660790079844e-06,-0.00355141394958336,0.1887649808696,-0.419333848764548, + -1.35579857651891e-06,-0.00339946525988921,0.198690099821191,-0.449407231726575, + -1.36498925273898e-06,-0.00324751657019573,0.208615218772781,-0.479480614688602, + -1.37417992884803e-06,-0.00309556788050225,0.218540337724372,-0.509553997650628, + -1.38337060473503e-06,-0.0029436191908081,0.228465456675963,-0.539627380612655, + -1.39256128084408e-06,-0.00279167050111506,0.238390575627554,-0.569700763574682, + -1.40175195695313e-06,-0.00263972181142091,0.248315694579145,-0.599774146536709, + -1.41094263272912e-06,-0.00248777312172699,0.258240813530736,-0.629847529498736, + -1.42013330928226e-06,-0.00233582443203462,0.268165932482326,-0.659920912460763, + -1.42932398450313e-06,-0.00218387574233914,0.278091051433918,-0.689994295422789, + -1.43851466094524e-06,-0.00203192705264632,0.288016170385508,-0.720067678384816, + -1.44770533738736e-06,-0.0018799783629535,0.297941289337099,-0.750141061346843, + -1.45689601238619e-06,-0.00172802967325802,0.30786640828869,-0.78021444430887, + -1.46608668905035e-06,-0.00157608098356521,0.317791527240281,-0.810287827270897, + -8.97327714383112e-07,-0.00520519823579557,0.0794910877134545,-0.0886072515340195, + -9.03283094738638e-07,-0.00505903788916073,0.0893731881145652,-0.1187065720723, + -9.09238475260699e-07,-0.00491287754252623,0.0992552885156758,-0.14880589261058, + -9.15193855616225e-07,-0.00476671719589161,0.109137388916786,-0.17890521314886, + -9.2114923611053e-07,-0.004620556849257,0.119019489317897,-0.20900453368714, + -9.27104616577079e-07,-0.00447439650262238,0.128901589719008,-0.23910385422542, + -9.33059996988117e-07,-0.00432823615598754,0.138783690120118,-0.269203174763701, + -9.39015377343644e-07,-0.00418207580935293,0.148665790521229,-0.299302495301981, + -9.44970757810193e-07,-0.00403591546271831,0.158547890922339,-0.329401815840261, + -9.50926138276742e-07,-0.00388975511608391,0.16842999132345,-0.359501136378541, + -9.56881518854313e-07,-0.0037435947694493,0.178312091724561,-0.389600456916821, + -9.62836899154329e-07,-0.00359743442281468,0.188194192125671,-0.419699777455102, + -9.68792279287811e-07,-0.0034512740761794,0.198076292526782,-0.449799097993382, + -9.74747660031916e-07,-0.00330511372954501,0.207958392927893,-0.479898418531662, + -9.80703040553976e-07,-0.00315895338291083,0.217840493329003,-0.509997739069942, + -9.86658420853992e-07,-0.00301279303627555,0.227722593730114,-0.540097059608222, + -9.92613801042985e-07,-0.00286663268964049,0.237604694131225,-0.570196380146503, + -9.9856918178709e-07,-0.00272047234300632,0.247486794532335,-0.600295700684783, + -1.00452456253119e-06,-0.00257431199637237,0.257368894933445,-0.630395021223063, + -1.01047994260917e-06,-0.00242815164973686,0.267250995334557,-0.660494341761343, + -1.01643532313123e-06,-0.00228199130310269,0.277133095735667,-0.690593662299623, + -1.02239070354226e-06,-0.00213583095646808,0.287015196136777,-0.720692982837904, + -1.02834608450841e-06,-0.00198967060983435,0.296897296537888,-0.750792303376184, + -1.0343014641423e-06,-0.0018435102631984,0.306779396938999,-0.780891623914464, + -1.04025684477538e-06,-0.00169734991656423,0.316661497340109,-0.810990944452744, + -5.0058779060641e-05,-0.00874943061523603,0.10152775478316,-0.087746140739364, + -5.42177514088749e-05,-0.00807646185555561,0.116761755025814,-0.113667167375043, + -5.83767237571919e-05,-0.00740349309587529,0.131995755268469,-0.139588194010721, + -6.2535696105398e-05,-0.00673052433619481,0.147229755511123,-0.1655092206464, + -6.6694668453382e-05,-0.00605755557651411,0.162463755753778,-0.191430247282079, + -7.08536408016713e-05,-0.00538458681683374,0.177697755996432,-0.217351273917757, + -7.50126131497386e-05,-0.00471161805715326,0.192931756239087,-0.243272300553436, + -7.91715854980835e-05,-0.004038649297473,0.208165756481741,-0.269193327189115, + -8.33305578462062e-05,-0.0033656805377924,0.223399756724396,-0.295114353824793, + -8.74895301944956e-05,-0.0026927117781117,0.238633756967051,-0.321035380460472, + -9.16485025426739e-05,-0.00201974301843144,0.253867757209705,-0.346956407096151, + -9.58074748910742e-05,-0.00134677425875118,0.269101757452359,-0.372877433731829, + -9.9966447239086e-05,-0.000673805499070479,0.284335757695014,-0.398798460367508, + -0.000104125419587375,-8.36739390219776e-07,0.299569757937668,-0.424719487003187, + -0.000108284391935221,0.000672132020290483,0.314803758180323,-0.450640513638865, + -0.000112443364283843,0.00134510077997052,0.330037758422977,-0.476561540274544, + -0.000116602336632132,0.00201806953965122,0.345271758665632,-0.502482566910223, + -0.000120761308980089,0.00269103829933193,0.360505758908287,-0.528403593545901, + -0.000124920281328378,0.00336400705901219,0.375739759150941,-0.55432462018158, + -0.000129079253676556,0.00403697581869222,0.390973759393595,-0.580245646817259, + -0.000133238226024845,0.00470994457837337,0.40620775963625,-0.606166673452937, + -0.000137397198373135,0.00538291333805319,0.421441759878904,-0.632087700088616, + -0.000141556170721313,0.00605588209773389,0.436675760121559,-0.658008726724294, + -0.000145715143068936,0.00672885085741504,0.451909760364213,-0.683929753359973, + -0.000149874115417781,0.00740181961709441,0.467143760606868,-0.709850779995652, + -4.97389312965335e-05,-0.00871725152278963,0.101438073036634,-0.0878372532864131, + -5.38493482503399e-05,-0.00804611588991389,0.116635893956205,-0.113783773714845, + -5.79597652041741e-05,-0.00737498025703809,0.131833714875777,-0.139730294143276, + -6.20701821580361e-05,-0.00670384462416251,0.147031535795348,-0.165676814571708, + -6.61805991118425e-05,-0.00603270899128661,0.16222935671492,-0.19162333500014, + -7.02910160657599e-05,-0.00536157335841103,0.177427177634491,-0.217569855428571, + -7.44014330195109e-05,-0.00469043772553546,0.192624998554062,-0.243516375857003, + -7.85118499734283e-05,-0.00401930209265977,0.207822819473634,-0.269462896285435, + -8.26222669273458e-05,-0.00334816645978409,0.223020640393205,-0.295409416713866, + -8.67326838813742e-05,-0.00267703082690862,0.238218461312777,-0.321355937142298, + -9.08431008350696e-05,-0.00200589519403271,0.253416282232348,-0.347302457570729, + -9.49535177888206e-05,-0.00133475956115681,0.268614103151919,-0.373248977999161, + -9.90639347425715e-05,-0.000663623928281121,0.283811924071491,-0.399195498427593, + -0.0001031743516966,7.51170459456496e-06,0.299009744991062,-0.425142018856025, + -0.000107284768650406,0.000678647337470251,0.314207565910634,-0.451088539284456, + -0.000111395185603991,0.00134978297034594,0.329405386830205,-0.477035059712888, + -0.000115505602558241,0.0020209186032214,0.344603207749776,-0.50298158014132, + -0.000119616019511937,0.00269205423609775,0.359801028669348,-0.528928100569751, + -0.000123726436465854,0.00336318986897277,0.374998849588919,-0.554874620998183, + -0.000127836853419994,0.00403432550184801,0.39019667050849,-0.580821141426614, + -0.000131947270374022,0.0047054611347237,0.405394491428062,-0.606767661855046, + -0.000136057687327273,0.00537659676760027,0.420592312347634,-0.632714182283478, + -0.00014016810428108,0.00604773240047596,0.435790133267205,-0.658660702711909, + -0.000144278521235108,0.00671886803335164,0.450987954186777,-0.684607223140341, + -0.000148388938189248,0.00739000366622689,0.466185775106348,-0.710553743568773, + -4.92982031372602e-05,-0.00867311516561137,0.101314412654826,-0.0879626281311997, + -5.33421268683332e-05,-0.00800454587266874,0.116462378068205,-0.113944229132099, + -5.7386050599656e-05,-0.00733597657972618,0.131610343481584,-0.139925830132997, + -6.14299743308677e-05,-0.00666740728678361,0.146758308894964,-0.165907431133896, + -6.54738980620517e-05,-0.00599883799384104,0.161906274308343,-0.191889032134795, + -6.95178217931525e-05,-0.00533026870089848,0.177054239721722,-0.217870633135694, + -7.35617455243087e-05,-0.00466169940795569,0.192202205135101,-0.243852234136593, + -7.76056692556315e-05,-0.00399313011501334,0.20735017054848,-0.269833835137492, + -8.16495929867878e-05,-0.00332456082207044,0.22249813596186,-0.29581543613839, + -8.56935167174999e-05,-0.00265599152912732,0.237646101375239,-0.321797037139289, + -8.97374404488782e-05,-0.00198742223618509,0.252794066788618,-0.347778638140188, + -9.37813641801455e-05,-0.00131885294324285,0.267942032201997,-0.373760239141087, + -9.78252879109132e-05,-0.00065028365029951,0.283089997615376,-0.399741840141986, + -0.000101869211642236,1.82856426431677e-05,0.298237963028756,-0.425723441142885, + -0.00010591313537367,0.000686854935585179,0.313385928442135,-0.451705042143783, + -0.00010995705910477,0.00135542422852786,0.328533893855514,-0.477686643144682, + -0.000114000982836093,0.00202399352147054,0.343681859268893,-0.503668244145581, + -0.000118044906567416,0.00269256281441299,0.358829824682273,-0.52964984514648, + -0.000122088830298406,0.00336113210735567,0.373977790095652,-0.555631446147378, + -0.000126132754029729,0.00402970140029835,0.389125755509031,-0.581613047148278, + -0.000130176677760607,0.00469827069324102,0.40427372092241,-0.607594648149176, + -0.000134220601491708,0.0053668399861837,0.419421686335789,-0.633576249150075, + -0.000138264525223142,0.00603540927912594,0.434569651749168,-0.659557850150974, + -0.000142308448954243,0.00670397857206861,0.449717617162547,-0.685539451151873, + -0.00014635237268501,0.00737254786501174,0.464865582575927,-0.711521052152772, + -4.86944684676138e-05,-0.00861303707949579,0.101144856267737,-0.0881340518436699, + -5.26480844179056e-05,-0.00794805899594692,0.116224521346548,-0.114163618143973, + -5.66017003680308e-05,-0.00728308091239793,0.13130418642536,-0.140193184444275, + -6.05553163181283e-05,-0.00661810282884889,0.146383851504171,-0.166222750744578, + -6.45089322683368e-05,-0.00595312474529996,0.161463516582983,-0.192252317044881, + -6.84625482184065e-05,-0.0052881466617507,0.176543181661794,-0.218281883345184, + -7.24161641684762e-05,-0.00462316857820155,0.191622846740606,-0.244311449645486, + -7.63697801186014e-05,-0.00395819049465262,0.206702511819417,-0.270341015945789, + -8.03233960689487e-05,-0.00329321241110403,0.221782176898228,-0.296370582246092, + -8.42770120189629e-05,-0.00262823432755477,0.23686184197704,-0.322400148546395, + -8.82306279688105e-05,-0.00196325624400551,0.251941507055851,-0.348429714846697, + -9.21842439194354e-05,-0.00129827816045691,0.267021172134663,-0.374459281147, + -9.6137859869394e-05,-0.00063330007690765,0.282100837213475,-0.400488847447303, + -0.000100091475819797,3.1678006640723e-05,0.297180502292286,-0.426518413747606, + -0.000104045091769978,0.000696656090189762,0.312260167371097,-0.452547980047908, + -0.000107998707720047,0.0013616341737388,0.327339832449909,-0.478577546348211, + -0.000111952323670228,0.00202661225728784,0.34241949752872,-0.504607112648514, + -0.000115905939620076,0.00269159034083732,0.357499162607532,-0.530636678948817, + -0.000119859555570367,0.00335656842438614,0.372578827686343,-0.556666245249119, + -0.000123813171520326,0.00402154650793562,0.387658492765155,-0.582695811549422, + -0.000127766787470285,0.00468652459148489,0.402738157843967,-0.608725377849725, + -0.000131720403420799,0.00535150267503326,0.417817822922778,-0.634754944150028, + -0.00013567401937109,0.00601648075858252,0.43289748800159,-0.66078451045033, + -0.00013962763532116,0.00668145884213089,0.447977153080401,-0.686814076750633, + -0.000143581251271452,0.00734643692568016,0.463056818159213,-0.712843643050936, + -4.78740650391163e-05,-0.00853210234720342,0.100914156200479,-0.0883664036473179, + -5.17064108839782e-05,-0.0078721436731175,0.115900999343048,-0.114460983262689, + -5.55387567290067e-05,-0.00721218499903176,0.130887842485617,-0.14055556287806, + -5.93711025739241e-05,-0.00655222632494612,0.145874685628185,-0.166650142493431, + -6.32034484186472e-05,-0.00589226765085993,0.160861528770754,-0.192744722108802, + -6.703579426387e-05,-0.0052323089767744,0.175848371913323,-0.218839301724173, + -7.08681401085376e-05,-0.00457235030268832,0.190835215055892,-0.244933881339544, + -7.47004859534828e-05,-0.00391239162860257,0.205822058198461,-0.271028460954915, + -7.85328317984835e-05,-0.00325243295451694,0.220808901341029,-0.297123040570286, + -8.23651776432621e-05,-0.00259247428043086,0.235795744483598,-0.323217620185658, + -8.61975234884294e-05,-0.00193251560634544,0.250782587626167,-0.349312199801029, + -9.00298693327639e-05,-0.00127255693225892,0.265769430768736,-0.3754067794164, + -9.38622151779311e-05,-0.00061259825817328,0.280756273911305,-0.401501359031771, + -9.76945610230429e-05,4.73604159121344e-05,0.295743117053873,-0.427595938647142, + -0.000101526906867488,0.000707319089998659,0.310729960196442,-0.453690518262513, + -0.000105359252712933,0.00136727776408385,0.325716803339011,-0.479785097877884, + -0.00010919159855749,0.00202723643816993,0.34070364648158,-0.505879677493255, + -0.000113023944402602,0.00268719511225557,0.355690489624149,-0.531974257108626, + -0.000116856290247713,0.00334715378634121,0.370677332766717,-0.558068836723997, + -0.000120688636091937,0.00400711246042773,0.385664175909286,-0.584163416339368, + -0.000124520981937382,0.00466707113451292,0.400651019051855,-0.610257995954739, + -0.000128353327782604,0.00532702980859856,0.415637862194424,-0.63635257557011, + -0.000132185673626606,0.00598698848268553,0.430624705336993,-0.662447155185481, + -0.000136018019472162,0.00664694715677072,0.445611548479562,-0.688541734800853, + -0.000139850365317384,0.00730690583085591,0.46059839162213,-0.714636314416224, + -4.67713460918506e-05,-0.0084245841700562,0.10060354094776,-0.0886776457729838, + -5.0443330422395e-05,-0.0077716230812121,0.115465602675248,-0.11485931265026, + -5.41153147529116e-05,-0.00711866199236821,0.130327664402736,-0.141040979527536, + -5.77872990834838e-05,-0.00646570090352439,0.145189726130224,-0.167222646404813, + -6.14592834138339e-05,-0.00581273981468011,0.160051787857712,-0.193404313282089, + -6.51312677444338e-05,-0.00515977872583639,0.1749138495852,-0.219585980159366, + -6.88032520751447e-05,-0.00450681763699257,0.189775911312688,-0.245767647036642, + -7.24752364054115e-05,-0.00385385654814829,0.204637973040176,-0.271949313913918, + -7.61472207359004e-05,-0.00320089545930435,0.219500034767663,-0.298130980791195, + -7.98192050663893e-05,-0.00254793437046019,0.234362096495151,-0.324312647668471, + -8.34911893968782e-05,-0.00189497328161625,0.249224158222639,-0.350494314545747, + -8.71631737274225e-05,-0.00124201219277209,0.264086219950127,-0.376675981423024, + -9.08351580578559e-05,-0.000589051103927929,0.278948281677615,-0.4028576483003, + -9.45071423888999e-05,6.39099849153446e-05,0.293810343405103,-0.429039315177576, + -9.81791267187226e-05,0.000716871073760394,0.308672405132591,-0.455220982054853, + -0.000101851111049656,0.00136983216260345,0.323534466860079,-0.481402648932129, + -0.000105523095380033,0.00202279325144783,0.338396528587567,-0.507584315809405, + -0.000109195079710855,0.00267575434029133,0.353258590315054,-0.533765982686682, + -0.000112867064041122,0.00332871542913571,0.368120652042542,-0.559947649563958, + -0.000116539048371611,0.00398167651797987,0.382982713770031,-0.586129316441234, + -0.000120211032702211,0.00463463760682314,0.397844775497518,-0.612310983318511, + -0.000123883017032922,0.00528759869566731,0.412706837225006,-0.638492650195787, + -0.000127555001363078,0.00594055978451191,0.427568898952494,-0.664674317073063, + -0.000131226985694011,0.00659352087335519,0.442430960679982,-0.69085598395034, + -0.000134898970024611,0.00724648196219935,0.45729302240747,-0.717037650827616, + -4.53107414451481e-05,-0.00828438459144798,0.100191196783747,-0.0890880408760064, + -4.87750104347096e-05,-0.00764113027100488,0.114887948612064,-0.115384538564649, + -5.22392794244375e-05,-0.00699787595056189,0.129584700440381,-0.141681036253292, + -5.57035484139712e-05,-0.0063546216301188,0.144281452268698,-0.167977533941934, + -5.91678174035049e-05,-0.00571136730967536,0.158978204097015,-0.194274031630577, + -6.26320863932328e-05,-0.0050681129892326,0.173674955925332,-0.220570529319219, + -6.60963553827387e-05,-0.00442485866878917,0.188371707753649,-0.246867027007862, + -6.95606243724112e-05,-0.00378160434834629,0.203068459581966,-0.273163524696505, + -7.30248933621391e-05,-0.00313835002790341,0.217765211410283,-0.299460022385147, + -7.6489162351423e-05,-0.00249509570745987,0.2324619632386,-0.32575652007379, + -7.99534313412065e-05,-0.00185184138701699,0.247158715066917,-0.352053017762433, + -8.34177003307124e-05,-0.00120858706657367,0.261855466895234,-0.378349515451075, + -8.68819693206069e-05,-0.00056533274613102,0.276552218723551,-0.404646013139718, + -9.03462383102793e-05,7.79215743120787e-05,0.291248970551867,-0.430942510828361, + -9.38105072993967e-05,0.000721175894756065,0.305945722380185,-0.457239008517003, + -9.72747762897352e-05,0.00136443021519783,0.320642474208501,-0.483535506205646, + -0.00010073904527852,0.00200768453564182,0.335339226036818,-0.509832003894289, + -0.000104203314268525,0.00265093885608425,0.350035977865135,-0.536128501582931, + -0.000107667583258086,0.00329419317652779,0.364732729693452,-0.562424999271574, + -0.000111131852247759,0.00393744749697111,0.37942948152177,-0.588721496960216, + -0.000114596121237875,0.00458070181741332,0.394126233350086,-0.615017994648859, + -0.000118060390227548,0.00522395613785687,0.408822985178404,-0.641314492337501, + -0.000121524659216776,0.00586721045829952,0.42351973700672,-0.667610990026144, + -0.000124988928206005,0.00651046477874351,0.438216488835037,-0.693907487714787, + -0.000128453197195788,0.00715371909918661,0.452913240663354,-0.720203985403429, + -4.34132682335386e-05,-0.00810596430317584,0.0996539807637659,-0.0896180681046644, + -4.66157490368324e-05,-0.00747605506734977,0.114135926939613,-0.116062870332676, + -4.98182298401817e-05,-0.00684614583152376,0.12861787311546,-0.142507672560687, + -5.30207106436142e-05,-0.00621623659569792,0.143099819291307,-0.168952474788699, + -5.62231914469913e-05,-0.00558632735987197,0.157581765467154,-0.19539727701671, + -5.94256722504793e-05,-0.00495641812404612,0.172063711643001,-0.221842079244722, + -6.26281530536899e-05,-0.00432650888821984,0.186545657818849,-0.248286881472733, + -6.58306338569559e-05,-0.00369659965239377,0.201027603994696,-0.274731683700745, + -6.90331146602774e-05,-0.00306669041656749,0.215509550170543,-0.301176485928756, + -7.2235595464043e-05,-0.00243678118074242,0.22999149634639,-0.327621288156768, + -7.54380762672535e-05,-0.00180687194491602,0.244473442522237,-0.354066090384779, + -7.86405570706306e-05,-0.00117696270909007,0.258955388698084,-0.380510892612791, + -8.18430378738411e-05,-0.000547053473264114,0.273437334873931,-0.406955694840802, + -8.50455186776067e-05,8.28557625613957e-05,0.287919281049778,-0.433400497068814, + -8.82479994805951e-05,0.000712764998388238,0.302401227225626,-0.459845299296825, + -9.14504802842497e-05,0.00134267423421375,0.316883173401473,-0.486290101524837, + -9.46529610874602e-05,0.0019725834700397,0.33136511957732,-0.512734903752848, + -9.78554418905597e-05,0.00260249270586632,0.345847065753167,-0.53917970598086, + -0.000101057922694325,0.00323240194169117,0.360329011929014,-0.565624508208871, + -0.000104260403497647,0.00386231117751779,0.374810958104862,-0.592069310436883, + -0.000107462884300746,0.00449222041334396,0.389292904280709,-0.618514112664894, + -0.000110665365104734,0.00512212964916925,0.403774850456555,-0.644958914892906, + -0.000113867845907278,0.00575203888499631,0.418256796632403,-0.671403717120917, + -0.000117070326711044,0.0063819481208216,0.43273874280825,-0.697848519348929, + -0.000120272807514366,0.00701185735664733,0.447220688984097,-0.72429332157694, + -4.10094967634722e-05,-0.00788585184550522,0.0989709743399407,-0.0902845607802442, + -4.3893562496955e-05,-0.00727401952321172,0.113180717835569,-0.116915851331686, + -4.67776282303267e-05,-0.00666218720091816,0.127390461331197,-0.143547141883127, + -4.96616939639205e-05,-0.00605035487862482,0.141600204826825,-0.170178432434568, + -5.25457596971535e-05,-0.00543852255633093,0.155809948322453,-0.19680972298601, + -5.5429825430664e-05,-0.00482669023403759,0.170019691818081,-0.223441013537451, + -5.831389116423e-05,-0.00421485791174392,0.184229435313709,-0.250072304088892, + -6.11979568976295e-05,-0.00360302558945047,0.198439178809337,-0.276703594640334, + -6.4082022630918e-05,-0.00299119326715669,0.212648922304965,-0.303334885191775, + -6.69660883643175e-05,-0.0023793609448628,0.226858665800594,-0.329966175743216, + -6.9850154097828e-05,-0.00176752862256957,0.241068409296222,-0.356597466294657, + -7.2734219831061e-05,-0.00115569630027568,0.25527815279185,-0.383228756846099, + -7.56182855647936e-05,-0.000543863977982451,0.269487896287478,-0.40986004739754, + -7.85023512981375e-05,6.79683443107759e-05,0.283697639783105,-0.436491337948982, + -8.13864170315926e-05,0.000679800666604446,0.297907383278734,-0.463122628500423, + -8.42704827652696e-05,0.00129163298889812,0.312117126774362,-0.489753919051864, + -8.71545484990577e-05,0.00190346531119112,0.32632687026999,-0.516385209603306, + -9.00386142319576e-05,0.00251529763348501,0.340536613765618,-0.543016500154747, + -9.29226799651905e-05,0.00312712995577891,0.354746357261246,-0.569647790706188, + -9.58067456986456e-05,0.00373896227807258,0.368956100756874,-0.59627908125763, + -9.86908114323226e-05,0.00435079460036603,0.383165844252503,-0.622910371809071, + -0.000101574877165889,0.00496262692265903,0.39737558774813,-0.649541662360512, + -0.000104458942898678,0.00557445924495381,0.411585331243759,-0.676172952911953, + -0.000107343008632244,0.00618629156724682,0.425795074739386,-0.702804243463395, + -0.000110227074366587,0.00679812388953938,0.440004818235014,-0.729435534014836, + -3.80596517962906e-05,-0.0076245671120399,0.0981291654083597,-0.0910950680558131, + -4.05734806585289e-05,-0.00703666671454195,0.112004749814571,-0.117953143009374, + -4.30873095206841e-05,-0.00644876631704372,0.125880334220783,-0.144811217962935, + -4.5601138383089e-05,-0.00586086591954604,0.139755918626994,-0.171669292916496, + -4.81149672451053e-05,-0.00527296552204759,0.153631503033206,-0.198527367870057, + -5.06287961075103e-05,-0.0046850651245498,0.167507087439417,-0.225385442823618, + -5.31426249695266e-05,-0.00409716472705157,0.181382671845629,-0.252243517777179, + -5.56564538321536e-05,-0.00350926432955401,0.19525825625184,-0.27910159273074, + -5.81702826940589e-05,-0.00292136393205555,0.209133840658052,-0.305959667684301, + -6.06841115561307e-05,-0.0023334635345571,0.223009425064263,-0.332817742637863, + -6.31979404187577e-05,-0.00174556313705998,0.236885009470474,-0.359675817591423, + -6.57117692809961e-05,-0.00115766273956175,0.250760593876686,-0.386533892544985, + -6.82255981431235e-05,-0.000569762342063518,0.264636178282898,-0.413391967498546, + -7.07394270053063e-05,1.81380554347133e-05,0.278511762689109,-0.440250042452107, + -7.32532558677113e-05,0.000606038452932056,0.29238734709532,-0.467108117405668, + -7.57670847297831e-05,0.00119393885043051,0.306262931501532,-0.493966192359229, + -7.82809135917439e-05,0.00178183924792896,0.320138515907744,-0.52082426731279, + -8.07947424543709e-05,0.00236973964542653,0.334014100313955,-0.547682342266351, + -8.33085713164428e-05,0.00295764004292476,0.347889684720166,-0.574540417219912, + -8.58224001789587e-05,0.00354554044042255,0.361765269126378,-0.601398492173473, + -8.83362290406975e-05,0.00413344083792078,0.375640853532589,-0.628256567127034, + -9.08500579029914e-05,0.00472134123541901,0.389516437938801,-0.655114642080595, + -9.33638867655073e-05,0.00530924163291679,0.403392022345012,-0.681972717034156, + -9.58777156273571e-05,0.00589714203041458,0.417267606751223,-0.708830791987717, + -9.83915444897621e-05,0.00648504242791326,0.431143191157436,-0.735688866941278, + -3.45779145164704e-05,-0.00732835531256426,0.0971305622271952,-0.0920415337166216, + -3.66844091888585e-05,-0.00677111474302738,0.110611573274943,-0.11916443497771, + -3.87909038613854e-05,-0.00621387417349073,0.12409258432269,-0.146287336238799, + -4.08973985337735e-05,-0.00565663360395396,0.137573595370438,-0.173410237499888, + -4.30038932061061e-05,-0.00509939303441687,0.151054606418186,-0.200533138760977, + -4.5110387878633e-05,-0.00454215246488043,0.164535617465933,-0.227656040022065, + -4.72168825510488e-05,-0.00398491189534356,0.178016628513681,-0.254778941283154, + -4.93233772231871e-05,-0.00342767132580635,0.191497639561429,-0.281901842544243, + -5.14298718957695e-05,-0.00287043075626969,0.204978650609177,-0.309024743805332, + -5.35363665684074e-05,-0.00231319018673326,0.218459661656924,-0.336147645066421, + -5.56428612406012e-05,-0.00175594961719616,0.231940672704672,-0.363270546327509, + -5.77493559131281e-05,-0.00119870904765929,0.24542168375242,-0.390393447588598, + -5.9855850585655e-05,-0.000641468478122853,0.258902694800167,-0.417516348849687, + -6.19623452577933e-05,-8.42279085857545e-05,0.272383705847915,-0.444639250110776, + -6.40688399304867e-05,0.0004730126609509,0.285864716895663,-0.471762151371865, + -6.61753346027361e-05,0.00103025323048822,0.299345727943411,-0.498885052632953, + -6.82818292755405e-05,0.00158749380002421,0.312826738991158,-0.526007953894042, + -7.03883239473457e-05,0.00214473436956153,0.326307750038906,-0.553130855155131, + -7.24948186198171e-05,0.00270197493909818,0.339788761086653,-0.580253756416219, + -7.46013132923995e-05,0.00325921550863484,0.353269772134401,-0.607376657677308, + -7.67078079648709e-05,0.00381645607817171,0.366750783182149,-0.634499558938397, + -7.88143026374533e-05,0.00437369664770859,0.380231794229897,-0.661622460199486, + -8.09207973094805e-05,0.00493093721724591,0.393712805277644,-0.688745361460574, + -8.30272919819519e-05,0.00548817778678234,0.407193816325392,-0.715868262721663, + -8.51337866539792e-05,0.00604541835631967,0.42067482737314,-0.742991163982752, + -3.06525281011105e-05,-0.00700973400874272,0.0959984432618401,-0.0930958073532768, + -3.23392300514425e-05,-0.00649009642664439,0.10903440525097,-0.120513700187626, + -3.40259320015801e-05,-0.00597045884454606,0.122070367240099,-0.147931593021976, + -3.57126339517455e-05,-0.00545082126244745,0.135106329229229,-0.175349485856326, + -3.73993359019109e-05,-0.00493118368034906,0.148142291218359,-0.202767378690675, + -3.90860378523539e-05,-0.00441154609825101,0.161178253207488,-0.230185271525025, + -4.07727398021307e-05,-0.00389190851615162,0.174214215196619,-0.257603164359374, + -4.24594417525737e-05,-0.00337227093405379,0.187250177185748,-0.285021057193724, + -4.41461437028501e-05,-0.00285263335195518,0.200286139174878,-0.312438950028074, + -4.58328456530155e-05,-0.00233299576985702,0.213322101164008,-0.339856842862423, + -4.75195476034584e-05,-0.00181335818775841,0.226358063153138,-0.367274735696773, + -4.92062495536238e-05,-0.00129372060566046,0.239394025142267,-0.394692628531123, + -5.08929515037337e-05,-0.000774083023561634,0.252429987131397,-0.422110521365472, + -5.25796534536216e-05,-0.000254445441462803,0.265465949120527,-0.449528414199822, + -5.42663554041756e-05,0.00026519214063514,0.278501911109656,-0.476946307034171, + -5.59530573540634e-05,0.000784829722733971,0.291537873098786,-0.504364199868521, + -5.76397593043954e-05,0.00130446730483214,0.304573835087916,-0.531782092702871, + -5.93264612549493e-05,0.0018241048869303,0.317609797077046,-0.55919998553722, + -6.10131632049482e-05,0.00234374246902935,0.330645759066176,-0.58661787837157, + -6.2699865154392e-05,0.00286338005112841,0.343681721055305,-0.614035771205919, + -6.43865671061672e-05,0.00338301763322457,0.356717683044434,-0.641453664040269, + -6.60732690552779e-05,0.00390265521532474,0.369753645033565,-0.668871556874619, + -6.77599710058319e-05,0.00442229279742268,0.382789607022694,-0.696289449708968, + -6.94466729558307e-05,0.00494193037952151,0.395825569011824,-0.723707342543318, + -7.11333749062737e-05,0.00546156796161945,0.408861531000954,-0.751125235377668, + -2.64494376026603e-05,-0.00668598208688942,0.0947791461911116,-0.094210172661096, + -2.77343182182865e-05,-0.00621005569337407,0.107338354713484,-0.121939871049442, + -2.90191988338018e-05,-0.00573412929985873,0.119897563235857,-0.149669569437788, + -3.0304079449428e-05,-0.00525820290634327,0.13245677175823,-0.177399267826133, + -3.15889600651653e-05,-0.00478227651282837,0.145015980280602,-0.205128966214479, + -3.28738406804585e-05,-0.00430635011931257,0.157575188802975,-0.232858664602825, + -3.41587212962513e-05,-0.00383042372579745,0.170134397325348,-0.260588362991171, + -3.54436019119331e-05,-0.0033544973322821,0.182693605847721,-0.288318061379517, + -3.67284825276704e-05,-0.00287857093876709,0.195252814370094,-0.316047759767862, + -3.8013363142908e-05,-0.00240264454525096,0.207812022892467,-0.343777458156208, + -3.92982437585898e-05,-0.00192671815173595,0.220371231414839,-0.371507156544554, + -4.0583124373994e-05,-0.00145079175822027,0.232930439937212,-0.3992368549329, + -4.18680049897313e-05,-0.000974865364705257,0.245489648459585,-0.426966553321246, + -4.31528856047469e-05,-0.000498938971188911,0.258048856981958,-0.454696251709591, + -4.44377662207618e-05,-2.30125776745638e-05,0.27060806550433,-0.482425950097937, + -4.57226468366656e-05,0.000452913815840672,0.283167274026703,-0.510155648486283, + -4.70075274520143e-05,0.000928840209356574,0.295726482549076,-0.537885346874629, + -4.8292408067363e-05,0.00140476660287181,0.308285691071449,-0.565615045262975, + -4.95772886830448e-05,0.00188069299638705,0.320844899593822,-0.59334474365132, + -5.08621692989486e-05,0.00235661938990184,0.333404108116194,-0.621074442039666, + -5.21470499141863e-05,0.00283254578341818,0.345963316638568,-0.648804140428012, + -5.34319305303121e-05,0.00330847217693275,0.35852252516094,-0.676533838816358, + -5.47168111455498e-05,0.00378439857044865,0.371081733683313,-0.704263537204703, + -5.60016917613426e-05,0.00426032496396367,0.383640942205686,-0.731993235593049, + -5.72865723769134e-05,0.00473625135747913,0.396200150728059,-0.759722933981395, + -2.21904635240855e-05,-0.00637564714269551,0.0935364647369939,-0.0953246333844103, + -2.31200732917491e-05,-0.00594752312316504,0.105612365103849,-0.123366164024534, + -2.40496830592185e-05,-0.0055193991036343,0.117688265470703,-0.151407694664657, + -2.49792928268544e-05,-0.00509127508410401,0.129764165837558,-0.17944922530478, + -2.59089025945736e-05,-0.00466315106457338,0.141840066204413,-0.207490755944904, + -2.68385123621262e-05,-0.00423502704504308,0.153915966571267,-0.235532286585027, + -2.77681221296788e-05,-0.00380690302551245,0.165991866938122,-0.26357381722515, + -2.8697731897287e-05,-0.00337877900598182,0.178067767304977,-0.291615347865274, + -2.96273416646731e-05,-0.00295065498645108,0.190143667671832,-0.319656878505397, + -3.05569514327808e-05,-0.00252253096692101,0.202219568038687,-0.34769840914552, + -3.14865612001669e-05,-0.00209440694739049,0.214295468405541,-0.375739939785644, + -3.24161709682191e-05,-0.00166628292786086,0.226371368772395,-0.403781470425767, + -3.33457807355497e-05,-0.00123815890832968,0.238447269139251,-0.43182300106589, + -3.42753905027138e-05,-0.000810034888798272,0.250523169506106,-0.459864531706014, + -3.5205000270655e-05,-0.000381910869267976,0.26259906987296,-0.487906062346137, + -3.61346100381521e-05,4.62131502620977e-05,0.274674970239815,-0.51594759298626, + -3.70642198060933e-05,0.000474337169792172,0.286750870606669,-0.543989123626384, + -3.79938295733684e-05,0.000902461189323134,0.298826770973524,-0.572030654266507, + -3.89234393414206e-05,0.00133058520885299,0.310902671340379,-0.600072184906631, + -3.98530491085847e-05,0.00175870922838461,0.322978571707234,-0.628113715546754, + -4.07826588758597e-05,0.00218683324791513,0.335054472074088,-0.656155246186877, + -4.1712268643912e-05,0.00261495726744476,0.347130372440943,-0.684196776827001, + -4.26418784115201e-05,0.00304308128697528,0.359206272807797,-0.712238307467124, + -4.35714881793503e-05,0.0034712053065058,0.371282173174652,-0.740279838107247, + -4.45010979468474e-05,0.00389932932603676,0.383358073541507,-0.76832136874737, + -1.81092964162965e-05,-0.00609442506540392,0.092339161418845,-0.0963791729933219, + -1.87491388606575e-05,-0.00571530823008992,0.103951741424497,-0.124715769627209, + -1.93889813051573e-05,-0.00533619139477615,0.11556432143015,-0.153052366261096, + -2.00288237498514e-05,-0.0049570745594627,0.127176901435802,-0.181388962894984, + -2.06686661942124e-05,-0.00457795772414893,0.138789481441454,-0.209725559528871, + -2.13085086385179e-05,-0.00419884088883482,0.150402061447107,-0.238062156162758, + -2.19483510832119e-05,-0.00381972405352127,0.162014641452759,-0.266398752796645, + -2.25881935274619e-05,-0.00344060721820716,0.173627221458412,-0.294735349430532, + -2.32280359721004e-05,-0.00306149038289383,0.185239801464064,-0.32307194606442, + -2.3867878416739e-05,-0.0026823735475805,0.196852381469716,-0.351408542698307, + -2.45077208610445e-05,-0.00230325671226628,0.208464961475369,-0.379745139332194, + -2.51475633050724e-05,-0.00192413987695206,0.220077541481021,-0.408081735966081, + -2.57874057499885e-05,-0.00154502304163917,0.231690121486673,-0.436418332599969, + -2.64272481942385e-05,-0.00116590620632495,0.243302701492326,-0.464754929233856, + -2.70670906388215e-05,-0.000786789371011176,0.254915281497978,-0.493091525867743, + -2.77069330829605e-05,-0.000407672535697179,0.26652786150363,-0.52142812250163, + -2.83467755275435e-05,-2.85557003834036e-05,0.278140441509283,-0.549764719135517, + -2.89866179723486e-05,0.000350561134929706,0.289753021514935,-0.578101315769404, + -2.96264604167096e-05,0.000729677970243703,0.301365601520587,-0.606437912403291, + -3.02663028611816e-05,0.0011087948055577,0.31297818152624,-0.634774509037179, + -3.09061453060977e-05,0.00148791164087081,0.324590761531892,-0.663111105671066, + -3.15459877504587e-05,0.00186702847618481,0.336203341537545,-0.691447702304953, + -3.21858301944866e-05,0.0022461453114988,0.347815921543197,-0.71978429893884, + -3.28256726390697e-05,0.0026252621468128,0.35942850154885,-0.748120895572728, + -3.34655150839858e-05,0.00300437898212547,0.371041081554501,-0.776457492206615, + -1.44024434682866e-05,-0.00585225334547468,0.0912463662770427,-0.0973260229863607, + -1.48235312124601e-05,-0.00552027537389832,0.102437970731987,-0.125927553466052, + -1.52446189566335e-05,-0.00518829740232207,0.113629575186932,-0.154529083945742, + -1.56657067008348e-05,-0.00485631943074571,0.124821179641876,-0.183130614425433, + -1.60867944450915e-05,-0.00452434145916925,0.136012784096821,-0.211732144905124, + -1.6507882189154e-05,-0.004192363487593,0.147204388551766,-0.240333675384815, + -1.69289699337161e-05,-0.0038603855160172,0.15839599300671,-0.268935205864506, + -1.73500576775565e-05,-0.00352840754444017,0.169587597461655,-0.297536736344197, + -1.7771145421952e-05,-0.00319642957286415,0.180779201916599,-0.326138266823888, + -1.81922331660145e-05,-0.00286445160128768,0.191970806371544,-0.354739797303579, + -1.86133209100214e-05,-0.00253247362971076,0.203162410826489,-0.38334132778327, + -1.9034408654417e-05,-0.00220049565813518,0.214354015281433,-0.41194285826296, + -1.94554963985905e-05,-0.00186851768655849,0.225545619736378,-0.440544388742651, + -1.98765841425974e-05,-0.0015365397149818,0.236737224191323,-0.469145919222342, + -2.02976718876036e-05,-0.00120456174340688,0.247928828646267,-0.497747449702033, + -2.07187596309444e-05,-0.000872583771829083,0.259120433101212,-0.526348980181724, + -2.11398473756175e-05,-0.000540605800253502,0.270312037556156,-0.554950510661415, + -2.15609351198465e-05,-0.000208627828677033,0.281503642011101,-0.583552041141106, + -2.19820228638534e-05,0.000123350142899881,0.292695246466046,-0.612153571620797, + -2.24031106076383e-05,0.000455328114476128,0.30388685092099,-0.640755102100487, + -2.28241983523114e-05,0.000787306086052375,0.315078455375935,-0.669356632580178, + -2.32452860965404e-05,0.00111928405762818,0.326270059830879,-0.697958163059869, + -2.36663738407694e-05,0.00145126202920487,0.337461664285824,-0.72655969353956, + -2.40874615848874e-05,0.00178324000078112,0.348653268740768,-0.755161224019251, + -2.45085493290054e-05,0.00211521797235692,0.359844873195712,-0.783762754498942, + -1.11956750544762e-05,-0.00565263731943455,0.0902970633076586,-0.0981369688707207, + -1.14627406947176e-05,-0.0053633973446745,0.101124377882493,-0.126965406477688, + -1.17298063349314e-05,-0.00507415736991468,0.111951692457328,-0.155793844084655, + -1.19968719753671e-05,-0.00478491739515507,0.122779007032162,-0.184622281691623, + -1.22639376156641e-05,-0.00449567742039525,0.133606321606997,-0.21345071929859, + -1.25310032560999e-05,-0.00420643744563565,0.144433636181831,-0.242279156905557, + -1.27980688963691e-05,-0.00391719747087582,0.155260950756666,-0.271107594512525, + -1.30651345369714e-05,-0.00362795749611622,0.1660882653315,-0.299936032119492, + -1.33322001771297e-05,-0.00333871752135617,0.176915579906335,-0.32876446972646, + -1.35992658176209e-05,-0.00304947754659657,0.187742894481169,-0.357592907333427, + -1.38663314576681e-05,-0.00276023757183652,0.198570209056004,-0.386421344940394, + -1.41333970979374e-05,-0.00247099759707647,0.209397523630839,-0.415249782547362, + -1.44004627384842e-05,-0.00218175762231732,0.220224838205673,-0.444078220154329, + -1.46675283788644e-05,-0.00189251764755749,0.231052152780507,-0.472906657761296, + -1.49345940188006e-05,-0.00160327767279722,0.241879467355342,-0.501735095368264, + -1.52016596595139e-05,-0.00131403769803762,0.252706781930176,-0.530563532975231, + -1.54687252994501e-05,-0.00102479772327735,0.263534096505011,-0.559391970582198, + -1.57357909403855e-05,-0.000735557748518634,0.274361411079845,-0.588220408189166, + -1.60028565808767e-05,-0.000446317773758809,0.28518872565468,-0.617048845796133, + -1.62699222199247e-05,-0.000157077798997651,0.296016040229514,-0.645877283403101, + -1.65369878610822e-05,0.000132162175761508,0.306843354804349,-0.674705721010068, + -1.68040535013514e-05,0.000421402150521111,0.317670669379184,-0.703534158617035, + -1.70711191419537e-05,0.00071064212528027,0.328497983954018,-0.732362596224003, + -1.7338184782334e-05,0.000999882100040317,0.339325298528852,-0.76119103383097, + -1.76052504223811e-05,0.00128912207480036,0.350152613103687,-0.790019471437937, + -8.53627198391105e-06,-0.00549387608430107,0.0895071105732167,-0.0988038979201813, + -8.70110285366987e-06,-0.00524142307825587,0.10003224520615,-0.127818945950395, + -8.86593372320665e-06,-0.00498897007221011,0.110557379839084,-0.156833993980609, + -9.03076459266017e-06,-0.00473651706616451,0.121082514472018,-0.185849042010823, + -9.19559546241899e-06,-0.00448406406011925,0.131607649104952,-0.214864090041036, + -9.36042633220557e-06,-0.00423161105407388,0.142132783737886,-0.24387913807125, + -9.5252572017146e-06,-0.00397915804802829,0.152657918370819,-0.272894186101464, + -9.6900880716122e-06,-0.00372670504198336,0.163183053003753,-0.301909234131678, + -9.8549189410102e-06,-0.00347425203593765,0.173708187636687,-0.330924282161892, + -1.00197498106858e-05,-0.00322179902989195,0.184233322269621,-0.359939330192105, + -1.01845806801393e-05,-0.00296934602384646,0.194758456902554,-0.388954378222319, + -1.03494115502034e-05,-0.00271689301780165,0.205283591535488,-0.417969426252533, + -1.05142424191573e-05,-0.00246444001175528,0.215808726168422,-0.446984474282747, + -1.06790732894435e-05,-0.00221198700571046,0.226333860801355,-0.47599952231296, + -1.08439041586195e-05,-0.00195953399966431,0.236858995434289,-0.505014570343174, + -1.10087350281285e-05,-0.00170708099361883,0.247384130067223,-0.534029618373388, + -1.11735658978596e-05,-0.00145462798757379,0.257909264700157,-0.563044666403602, + -1.13383967679237e-05,-0.00120217498152897,0.26843439933309,-0.592059714433815, + -1.15032276370997e-05,-0.00094972197548282,0.278959533966024,-0.621074762464029, + -1.16680585069417e-05,-0.000697268969437559,0.289484668598958,-0.650089810494243, + -1.18328893772279e-05,-0.000444815963393186,0.300009803231891,-0.679104858524457, + -1.19977202459598e-05,-0.000192362957346592,0.310534937864825,-0.70811990655467, + -1.21625511158019e-05,6.00900486991129e-05,0.321060072497759,-0.737134954584884, + -1.2327381985866e-05,0.000312543054743486,0.331585207130693,-0.766150002615098, + -1.24922128547089e-05,0.000564996060790079,0.342110341763627,-0.795165050645312, + -6.40692016448674e-06,-0.0053710999246836,0.0888728918428511,-0.0993343209497565, + -6.50696889714641e-06,-0.0051489622806824,0.0991560307723809,-0.128497784266617, + -6.60701762988936e-06,-0.00492682463668104,0.109439169701911,-0.157661247583477, + -6.70706636268781e-06,-0.0047046869926799,0.119722308631441,-0.186824710900338, + -6.80711509537524e-06,-0.00448254934867875,0.130005447560971,-0.215988174217198, + -6.90716382828471e-06,-0.00426041170467784,0.140288586490501,-0.245151637534059, + -7.0072125607501e-06,-0.00403827406067636,0.150571725420031,-0.274315100850919, + -7.10726129382611e-06,-0.00381613641667555,0.160854864349561,-0.303478564167779, + -7.20731002623598e-06,-0.00359399877267408,0.17113800327909,-0.33264202748464, + -7.30735875920097e-06,-0.00337186112867305,0.18142114220862,-0.3618054908015, + -7.40740749172186e-06,-0.0031497234846718,0.19170428113815,-0.39096895411836, + -7.5074562244648e-06,-0.00292758584067077,0.20198742006768,-0.420132417435221, + -7.60750495754081e-06,-0.00270544819666951,0.21227055899721,-0.449295880752081, + -7.7075536905058e-06,-0.00248331055266848,0.22255369792674,-0.478459344068942, + -7.80760242291567e-06,-0.00226117290866701,0.23283683685627,-0.507622807385802, + -7.90765115599168e-06,-0.00203903526466642,0.2431199757858,-0.536786270702662, + -8.0076998886236e-06,-0.00181689762066495,0.25340311471533,-0.565949734019523, + -8.10774862125552e-06,-0.00159475997666414,0.263686253644859,-0.595113197336383, + -8.20779735388744e-06,-0.00137262233266267,0.27396939257439,-0.624276660653243, + -8.30784608663038e-06,-0.00115048468866163,0.284252531503919,-0.653440123970104, + -8.40789482015047e-06,-0.000928347044661493,0.294535670433449,-0.682603587286964, + -8.50794355211626e-06,-0.000706209400658686,0.30481880936298,-0.711767050603825, + -8.60799228508125e-06,-0.0004840717566581,0.315101948292509,-0.740930513920685, + -8.70804101815725e-06,-0.000261934112657958,0.325385087222038,-0.770093977237545, + -8.80808975034508e-06,-3.97964686555952e-05,0.335668226151569,-0.799257440554406, + -4.7493710347013e-06,-0.00527815649809937,0.0883781638102335,-0.0997450522043126, + -4.80971551430898e-06,-0.00508013826492776,0.0984729004798276,-0.129023440389591, + -4.8700599936391e-06,-0.00488212003175592,0.108567637149422,-0.158301828574869, + -4.93040447338555e-06,-0.00468410179858436,0.118662373819016,-0.187580216760147, + -4.99074895271567e-06,-0.00448608356541258,0.12875711048861,-0.216858604945425, + -5.05109343229559e-06,-0.00428806533224102,0.138851847158204,-0.246136993130703, + -5.11143791193103e-06,-0.00409004709906957,0.148946583827798,-0.275415381315981, + -5.17178239123339e-06,-0.00389202886589768,0.159041320497392,-0.30469376950126, + -5.23212687070229e-06,-0.0036940106327259,0.169136057166986,-0.333972157686538, + -5.2924713502267e-06,-0.00349599239955434,0.17923079383658,-0.363250545871816, + -5.35281583002867e-06,-0.00329797416638278,0.189325530506175,-0.392528934057094, + -5.41316030960859e-06,-0.003099955933211,0.199420267175769,-0.421807322242372, + -5.47350478896647e-06,-0.00290193770003966,0.209515003845362,-0.45108571042765, + -5.53384926815781e-06,-0.00270391946686721,0.219609740514957,-0.480364098612928, + -5.59419374790426e-06,-0.00250590123369587,0.229704477184551,-0.509642486798207, + -5.65453822720663e-06,-0.00230788300052409,0.239799213854145,-0.538920874983485, + -5.71488270706411e-06,-0.00210986476735253,0.249893950523739,-0.568199263168763, + -5.77522718625545e-06,-0.00191184653418097,0.259988687193333,-0.597477651354041, + -5.83557166555781e-06,-0.0017138283010083,0.270083423862928,-0.626756039539319, + -5.89591614541529e-06,-0.00151581006783719,0.280178160532522,-0.656034427724597, + -5.95626062516175e-06,-0.00131779183466607,0.290272897202115,-0.685312815909875, + -6.01660510446411e-06,-0.00111977360149407,0.30036763387171,-0.714591204095153, + -6.07694958443261e-06,-0.000921755368323396,0.310462370541303,-0.743869592280432, + -6.13729406373498e-06,-0.000723737135150948,0.320557107210898,-0.77314798046571, + -6.19763854325939e-06,-0.000525718901979388,0.330651843880492,-0.802426368650988, + -3.48715964956781e-06,-0.00520890474348573,0.0880008344408879,-0.100056566544096, + -3.523667049532e-06,-0.00502955531331717,0.0979520895970044,-0.12942211815829, + -3.56017444960721e-06,-0.00485020588314866,0.107903344753121,-0.158787669772483, + -3.59668184971018e-06,-0.00467085645298015,0.117854599909237,-0.188153221386677, + -3.63318924967437e-06,-0.00449150702281154,0.127805855065354,-0.21751877300087, + -3.6696966495553e-06,-0.0043121575926427,0.13775711022147,-0.246884324615064, + -3.70620404976929e-06,-0.00413280816247441,0.147708365377587,-0.276249876229257, + -3.74271144976124e-06,-0.00395345873230579,0.157659620533703,-0.305615427843451, + -3.77921884947563e-06,-0.00377410930213684,0.16761087568982,-0.334980979457644, + -3.81572624991167e-06,-0.00359475987196856,0.177562130845936,-0.364346531071838, + -3.8522336498481e-06,-0.00341541044180005,0.187513386002053,-0.393712082686032, + -3.88874105000658e-06,-0.00323606101163154,0.197464641158169,-0.423077634300225, + -3.92524844994302e-06,-0.00305671158146303,0.207415896314286,-0.452443185914419, + -3.96175585004599e-06,-0.0028773621512943,0.217367151470402,-0.481808737528612, + -3.99826324992691e-06,-0.00269801272112535,0.227318406626519,-0.511174289142806, + -4.03477065002988e-06,-0.00251866329095707,0.237269661782635,-0.540539840756999, + -4.07127805013285e-06,-0.00233931386078856,0.247220916938752,-0.569905392371193, + -4.1077854501248e-06,-0.00215996443062028,0.257172172094868,-0.599270943985386, + -4.14429285000573e-06,-0.00198061500045155,0.267123427250985,-0.62863649559958, + -4.18080025044176e-06,-0.00180126557028304,0.277074682407101,-0.658002047213773, + -4.21730765043371e-06,-0.00162191614011453,0.287025937563218,-0.687367598827967, + -4.25381505009259e-06,-0.00144256670994558,0.296977192719334,-0.71673315044216, + -4.29032245052863e-06,-0.00126321727977796,0.30692844787545,-0.746098702056354, + -4.32682984996546e-06,-0.00108386784960768,0.316879703031568,-0.775464253670547, + -4.36333724973537e-06,-0.000904518419439171,0.326830958187684,-0.804829805284741, + -2.54199221810802e-06,-0.00515790214524514,0.0877179488119476,-0.100289131280884, + -2.5643166282896e-06,-0.00499270161256504,0.0975617543160146,-0.129719755790012, + -2.58664103830464e-06,-0.00482750107988472,0.107405559820082,-0.15915038029914, + -2.60896544848621e-06,-0.00466230054720473,0.117249365324149,-0.188581004808268, + -2.63128985850125e-06,-0.00449710001452464,0.127093170828216,-0.218011629317396, + -2.65361426871058e-06,-0.00433189948184465,0.136936976332283,-0.247442253826524, + -2.67593867891991e-06,-0.00416669894916466,0.14678078183635,-0.276872878335652, + -2.69826308918475e-06,-0.00400149841648467,0.156624587340417,-0.30630350284478, + -2.72058749889448e-06,-0.0038362978838038,0.166468392844484,-0.335734127353908, + -2.7429119090483e-06,-0.00367109735112403,0.176312198348551,-0.365164751863036, + -2.76523631953518e-06,-0.00350589681844427,0.186156003852618,-0.394595376372163, + -2.78756072946695e-06,-0.00334069628576406,0.195999809356685,-0.424026000881291, + -2.80988513956526e-06,-0.00317549575308407,0.205843614860751,-0.453456625390419, + -2.83220954977459e-06,-0.00301029522040386,0.215687420364818,-0.482887249899547, + -2.85453395976187e-06,-0.00284509468772387,0.225531225868885,-0.512317874408675, + -2.87685836974916e-06,-0.00267989415504299,0.235375031372953,-0.541748498917803, + -2.89918278006951e-06,-0.00251469362236367,0.245218836877019,-0.571179123426931, + -2.92150719050088e-06,-0.00234949308968391,0.255062642381086,-0.600609747936059, + -2.94383160026612e-06,-0.00218429255700325,0.264906447885153,-0.630040372445187, + -2.9661560106975e-06,-0.00201909202432349,0.274750253389221,-0.659470996954315, + -2.98848042024069e-06,-0.00185389149164283,0.284594058893288,-0.688901621463443, + -3.01080483111615e-06,-0.00168869095896396,0.294437864397354,-0.718332245972571, + -3.03312924121446e-06,-0.0015234904262833,0.304281669901422,-0.747762870481698, + -3.05545365031357e-06,-0.00135828989360176,0.314125475405489,-0.777193494990826, + -3.07777806130005e-06,-0.00119308936092244,0.323969280909556,-0.806624119499954, + -1.8430865197927e-06,-0.00512065534514089,0.0875085860192835,-0.100460717415729, + -1.8569617065145e-06,-0.00496600983648232,0.0972729333748349,-0.129939352670936, + -1.87083689301426e-06,-0.00481136432782359,0.107037280730386,-0.159417987926143, + -1.88471207970831e-06,-0.00465671881916507,0.116801628085938,-0.18889662318135, + -1.89858726634684e-06,-0.00450207331050667,0.126565975441489,-0.218375258436557, + -1.91246245301313e-06,-0.00434742780184805,0.13633032279704,-0.247853893691764, + -1.92633763973493e-06,-0.00419278229318942,0.146094670152592,-0.277332528946971, + -1.9402128262902e-06,-0.0040381367845308,0.155859017508143,-0.306811164202179, + -1.95408801273445e-06,-0.00388349127587184,0.165623364863695,-0.336289799457386, + -1.96796319962278e-06,-0.00372884576721355,0.175387712219246,-0.365768434712593, + -1.98183838573396e-06,-0.00357420025855437,0.185152059574797,-0.3952470699678, + -1.99571357228923e-06,-0.00341955474989608,0.194916406930348,-0.424725705223007, + -2.00958875951063e-06,-0.00326490924123801,0.2046807542859,-0.454204340478215, + -2.0234639460659e-06,-0.0031102637325795,0.214445101641451,-0.483682975733422, + -2.03733913262116e-06,-0.00295561822392054,0.224209448997003,-0.513161610988629, + -2.05121431928745e-06,-0.00280097271526225,0.233973796352554,-0.542640246243836, + -2.06508950584272e-06,-0.00264632720660352,0.243738143708105,-0.572118881499043, + -2.07896469239799e-06,-0.00249168169794434,0.253502491063657,-0.60159751675425, + -2.09283987928632e-06,-0.00233703618928649,0.263266838419208,-0.631076152009458, + -2.10671506528648e-06,-0.00218239068062687,0.27303118577476,-0.660554787264665, + -2.12059025206379e-06,-0.00202774517196813,0.282795533130311,-0.690033422519872, + -2.1344654388411e-06,-0.00187309966331028,0.292559880485862,-0.719512057775079, + -2.14834062617353e-06,-0.00171845415465288,0.302324227841413,-0.748990693030286, + -2.1622158127288e-06,-0.0015638086459937,0.312088575196965,-0.778469328285493, + -2.17609099806282e-06,-0.00140916313733364,0.321852922552516,-0.8079479635407, + -1.33107356933837e-06,-0.00509361934727198,0.087355110602369,-0.100586213915024, + -1.33986652878226e-06,-0.00494675606574968,0.0970612452386173,-0.130099963782301, + -1.3486594881984e-06,-0.00479989278422721,0.106767379874866,-0.159613713649577, + -1.35745244772556e-06,-0.00465302950270519,0.116473514511114,-0.189127463516854, + -1.36624540691965e-06,-0.00450616622118238,0.126179649147362,-0.21864121338413, + -1.37503836644681e-06,-0.00435930293966025,0.135885783783611,-0.248154963251406, + -1.38383132580744e-06,-0.00421243965813756,0.145591918419859,-0.277668713118683, + -1.39262428516806e-06,-0.00406557637661531,0.155298053056108,-0.307182462985959, + -1.40141724502829e-06,-0.00391871309509373,0.165004187692355,-0.336696212853236, + -1.41021020416687e-06,-0.00377184981357082,0.174710322328604,-0.366209962720512, + -1.41900316336097e-06,-0.00362498653204812,0.184416456964853,-0.395723712587788, + -1.42779612311017e-06,-0.00347812325052632,0.194122591601101,-0.425237462455065, + -1.43658908258182e-06,-0.00333125996900407,0.203828726237349,-0.454751212322341, + -1.44538204216449e-06,-0.00318439668748161,0.213534860873598,-0.484264962189618, + -1.45417500119205e-06,-0.00303753340595914,0.223240995509846,-0.513778712056894, + -1.46296796088574e-06,-0.00289067012443711,0.232947130146094,-0.543292461924171, + -1.47176092013535e-06,-0.00274380684291464,0.242653264782342,-0.572806211791447, + -1.48055387994006e-06,-0.0025969435613924,0.252359399418591,-0.602319961658723, + -1.48934683941171e-06,-0.00245008027987037,0.262065534054839,-0.631833711526, + -1.49813979866131e-06,-0.00230321699834768,0.271771668691087,-0.661347461393276, + -1.50693275735581e-06,-0.00215635371682454,0.281477803327336,-0.690861211260553, + -1.51572571716052e-06,-0.00200949043530274,0.291183937963584,-0.720374961127829, + -1.52451867696524e-06,-0.00186262715378094,0.300890072599832,-0.749888710995105, + -1.533311636992e-06,-0.00171576387225958,0.31059620723608,-0.779402460862382, + -1.54210459568649e-06,-0.00156890059073556,0.320302341872329,-0.808916210729658, + -9.58531469835711e-07,-0.00507408061420334,0.087243389692799,-0.100677416388633, + -9.64218329235766e-07,-0.00493290601486351,0.0969071673851203,-0.13021668521061, + -9.69905188913378e-07,-0.00479173141552414,0.106570945077441,-0.159755954032586, + -9.75592048313434e-07,-0.00465055681618431,0.116234722769763,-0.189295222854562, + -9.81278907741245e-07,-0.00450938221684438,0.125898500462084,-0.218834491676539, + -9.86965767113546e-07,-0.00436820761750445,0.135562278154405,-0.248373760498515, + -9.92652626763402e-07,-0.00422703301816485,0.145226055846727,-0.277913029320492, + -9.98339485969169e-07,-0.00408585841882503,0.154889833539048,-0.307452298142468, + -1.00402634573005e-06,-0.00394468381948543,0.164553611231369,-0.336991566964444, + -1.00971320521337e-06,-0.00380350922014583,0.17421738892369,-0.366530835786421, + -1.01540006491874e-06,-0.00366233462080645,0.183881166616011,-0.396070104608397, + -1.02108692418001e-06,-0.00352116002146663,0.193544944308333,-0.425609373430374, + -1.02677378344129e-06,-0.00337998542212614,0.203208722000654,-0.45514864225235, + -1.03246064275808e-06,-0.00323881082278676,0.212872499692975,-0.484687911074327, + -1.03814750251896e-06,-0.00309763622344739,0.222536277385296,-0.514227179896303, + -1.04383436183575e-06,-0.00295646162410712,0.232200055077618,-0.543766448718279, + -1.04952122137458e-06,-0.00281528702476774,0.241863832769939,-0.573305717540256, + -1.05520808113546e-06,-0.00267411242542837,0.25152761046226,-0.602844986362232, + -1.0608949406743e-06,-0.00253293782608832,0.261191388154582,-0.632384255184209, + -1.06658179988006e-06,-0.00239176322674828,0.270855165846903,-0.661923524006185, + -1.07226865964094e-06,-0.00225058862740868,0.280518943539224,-0.691462792828161, + -1.07795551851364e-06,-0.00210941402806819,0.290182721231546,-0.721002061650138, + -1.0836423781635e-06,-0.00196823942872948,0.299846498923866,-0.750541330472114, + -1.08932923759131e-06,-0.00182706482938944,0.309510276616188,-0.780080599294091, + -1.09501609724116e-06,-0.00168589023004984,0.319174054308509,-0.809619868116067, + -5.62710645622966e-05,-0.00929027179783393,0.111581322726033,-0.0970644369926607, + -6.07047215306356e-05,-0.00861705818975056,0.126820653135254,-0.122291084080049, + -6.51383784987802e-05,-0.00794384458166708,0.142059983544474,-0.147517731167437, + -6.9572035467147e-05,-0.00727063097358371,0.157299313953695,-0.172744378254826, + -7.40056924353194e-05,-0.00659741736550012,0.172538644362916,-0.197971025342214, + -7.84393494034918e-05,-0.00592420375741654,0.187777974772136,-0.223197672429603, + -8.28730063719418e-05,-0.0052509901493335,0.203017305181357,-0.248424319516991, + -8.73066633402808e-05,-0.00457777654125024,0.218256635590577,-0.273650966604379, + -9.17403203085643e-05,-0.00390456293316666,0.233495965999798,-0.298877613691768, + -9.61739772764036e-05,-0.00323134932508262,0.248735296409019,-0.324104260779156, + -0.000100607634244854,-0.00255813571699948,0.26397462681824,-0.349330907866544, + -0.000105041291213193,-0.00188492210891611,0.27921395722746,-0.374557554953933, + -0.000109474948181809,-0.00121170850083296,0.294453287636681,-0.399784202041321, + -0.000113908605149815,-0.000538494892749375,0.309692618045902,-0.42501084912871, + -0.000118342262118154,0.000134718715334214,0.324931948455123,-0.450237496216098, + -0.000122775919086493,0.00080793232341736,0.340171278864343,-0.475464143303486, + -0.000127209576054721,0.00148114593150073,0.355410609273564,-0.500690790390875, + -0.00013164323302306,0.00215435953958409,0.370649939682784,-0.525917437478263, + -0.000136076889990622,0.00282757314766835,0.385889270092005,-0.551144084565651, + -0.000140510546959405,0.00350078675575149,0.401128600501226,-0.57637073165304, + -0.000144944203927633,0.00417400036383464,0.416367930910446,-0.601597378740428, + -0.000149377860895306,0.00484721397191867,0.431607261319667,-0.626824025827817, + -0.000153811517863756,0.00552042758000182,0.446846591728888,-0.652050672915205, + -0.000158245174832095,0.00619364118808541,0.462085922138109,-0.677277320002594, + -0.000162678831800656,0.00686685479616855,0.477325252547329,-0.702503967089982, + -5.58898615238002e-05,-0.00924955997740112,0.111469737258622,-0.0971782211083355, + -6.02689985940985e-05,-0.00857811775207085,0.12666948406076,-0.122433034186761, + -6.46481356645356e-05,-0.00790667552674051,0.141869230862897,-0.147687847265187, + -6.9027272734612e-05,-0.00723523330140985,0.157068977665035,-0.172942660343612, + -7.34064098051879e-05,-0.00656379107607996,0.172268724467172,-0.198197473422038, + -7.77855468755417e-05,-0.00589234885074974,0.187468471269309,-0.223452286500464, + -8.21646839457291e-05,-0.00522090662541919,0.202668218071447,-0.248707099578889, + -8.65438210163605e-05,-0.00454946440008919,0.217867964873584,-0.273961912657315, + -9.09229580866588e-05,-0.00387802217475897,0.233067711675721,-0.299216725735741, + -9.53020951567907e-05,-0.00320657994942852,0.248267458477859,-0.324471538814167, + -9.96812322275331e-05,-0.00253513772409852,0.263467205279996,-0.349726351892592, + -0.000104060369297776,-0.0018636954987683,0.278666952082133,-0.374981164971018, + -0.000108439506367519,-0.00119225327343742,0.293866698884271,-0.400235978049443, + -0.000112818643438484,-0.000520811048107639,0.309066445686408,-0.425490791127869, + -0.000117197780508782,0.00015063117722236,0.324266192488545,-0.450745604206295, + -0.000121576917578969,0.000822073402552803,0.339465939290682,-0.476000417284721, + -0.000125956054649046,0.00149351562788413,0.354665686092821,-0.501255230363146, + -0.000130335191719788,0.00216495785321369,0.369865432894958,-0.526510043441572, + -0.000134714328789864,0.00283640007854435,0.385065179697095,-0.551764856519997, + -0.000139093465860385,0.00350784230387413,0.400264926499232,-0.577019669598423, + -0.000143472602930794,0.0041792845292048,0.41546467330137,-0.602274482676849, + -0.000147851740001426,0.00485072675453413,0.430664420103507,-0.627529295755275, + -0.000152230877071502,0.00552216897986435,0.445864166905644,-0.6527841088337, + -0.000156610014141356,0.0061936112051959,0.461063913707782,-0.678038921912126, + -0.000160989151211655,0.00686505343052612,0.476263660509919,-0.703293734990551, + -5.53650565652264e-05,-0.00919379537165227,0.111315987704391,-0.0973346360612716, + -5.96696161429267e-05,-0.00852484240257845,0.126461231965598,-0.122628167919875, + -6.39741757204604e-05,-0.00785588943350446,0.141606476226805,-0.147921699778478, + -6.82787352981884e-05,-0.00718693646443092,0.156751720488012,-0.173215231637081, + -7.25832948758054e-05,-0.00651798349535715,0.171896964749218,-0.198508763495684, + -7.68878544534224e-05,-0.00584903052628316,0.187042209010425,-0.223802295354287, + -8.11924140310949e-05,-0.00518007755720939,0.202187453271632,-0.24909582721289, + -8.54969736086564e-05,-0.00451112458813552,0.217332697532839,-0.274389359071493, + -8.98015331861068e-05,-0.00384217161906153,0.232477941794046,-0.299682890930096, + -9.41060927638349e-05,-0.00317321864998799,0.247623186055253,-0.3249764227887, + -9.84106523415074e-05,-0.00250426568091422,0.26276843031646,-0.350269954647302, + -0.000102715211918958,-0.00183531271184001,0.277913674577667,-0.375563486505906, + -0.000107019771497074,-0.00116635974276669,0.293058918838874,-0.400857018364509, + -0.000111324331074081,-0.000497406773692033,0.308204163100081,-0.426150550223112, + -0.000115628890651753,0.000171546195381511,0.323349407361288,-0.451444082081715, + -0.000119933450229315,0.000840499164455499,0.338494651622495,-0.476737613940318, + -0.000124238009806876,0.00150945213352949,0.353639895883702,-0.502031145798921, + -0.00012854256938466,0.00217840510260281,0.368785140144908,-0.527324677657524, + -0.000132847128962554,0.00284735807167635,0.383930384406115,-0.552618209516127, + -0.000137151688540449,0.0035163110407499,0.399075628667322,-0.577911741374731, + -0.000141456248116789,0.00418526400982522,0.414220872928529,-0.603205273233334, + -0.000145760807695128,0.00485421697889832,0.429366117189736,-0.628498805091937, + -0.000150065367272689,0.00552316994797231,0.444511361450943,-0.65379233695054, + -0.000154369926850584,0.00619212291704541,0.45965660571215,-0.679085868809143, + -0.000158674486428256,0.00686107588611895,0.474801849973357,-0.704379400667746, + -5.46470261018894e-05,-0.00911802876212842,0.111105388761253,-0.0975482068911161, + -5.88504542051171e-05,-0.0084525760314943,0.126176049380055,-0.122894605830889, + -6.30538823081228e-05,-0.00778712330085995,0.141246709998856,-0.148241004770662, + -6.72573104111285e-05,-0.0071216705702255,0.156317370617657,-0.173587403710435, + -7.14607385142174e-05,-0.00645621783959116,0.171388031236459,-0.198933802650208, + -7.56641666170843e-05,-0.00579076510895682,0.18645869185526,-0.224280201589981, + -7.98675947204508e-05,-0.0051253123783227,0.201529352474061,-0.249626600529754, + -8.40710228234287e-05,-0.00445985964768836,0.216600013092862,-0.274972999469527, + -8.82744509264621e-05,-0.00379440691705413,0.231670673711663,-0.3003193984093, + -9.24778790298286e-05,-0.00312895418642012,0.246741334330465,-0.325665797349073, + -9.66813071330286e-05,-0.00246350145578611,0.261811994949266,-0.351012196288846, + -0.000100884735236006,-0.00179804872515166,0.276882655568067,-0.376358595228619, + -0.00010508816333854,-0.00113259599451632,0.291953316186869,-0.401704994168392, + -0.00010929159144224,-0.000467143263882974,0.30702397680567,-0.427051393108165, + -0.000113495019545162,0.000198309466751478,0.322094637424471,-0.452397792047938, + -0.000117698447647752,0.000863762197386597,0.337165298043273,-0.477744190987711, + -0.000121901875751007,0.00152921492802016,0.352235958662074,-0.503090589927484, + -0.000126105303854152,0.00219466765865461,0.367306619280875,-0.528436988867257, + -0.000130308731957296,0.00286012038928884,0.382377279899676,-0.55378338780703, + -0.000134512160060329,0.0035255731199233,0.397447940518477,-0.579129786746803, + -0.000138715588163807,0.00419102585055731,0.412518601137279,-0.604476185686576, + -0.00014291901626684,0.00485647858119176,0.42758926175608,-0.629822584626349, + -0.00014712244436943,0.00552193131182621,0.442659922374881,-0.655168983566122, + -0.000151325872472796,0.00618738404246022,0.457730582993683,-0.680515382505895, + -0.000155529300575608,0.00685283677309467,0.472801243612484,-0.705861781445668, + -5.36729334582597e-05,-0.00901621422295495,0.110819244155366,-0.097837145662461, + -5.77408420101566e-05,-0.00835568333326708,0.125788697382655,-0.123255068178225, + -6.18087505618037e-05,-0.00769515244357899,0.140758150609944,-0.148672990693989, + -6.58766591136173e-05,-0.00703462155389123,0.155727603837232,-0.174090913209753, + -6.99445676652366e-05,-0.00637409066420302,0.170697057064521,-0.199508835725517, + -7.40124762173e-05,-0.00571355977451549,0.185666510291809,-0.22492675824128, + -7.80803847689193e-05,-0.0050530288848275,0.200635963519098,-0.250344680757045, + -8.21482933206497e-05,-0.00439249799513952,0.215605416746386,-0.275762603272808, + -8.6216201872491e-05,-0.00373196710545165,0.230574869973675,-0.301180525788572, + -9.02841104244989e-05,-0.003071436215764,0.245544323200964,-0.326598448304336, + -9.43520189762292e-05,-0.00241090532607613,0.260513776428252,-0.3520163708201, + -9.84199275280151e-05,-0.00175037443638826,0.275483229655541,-0.377434293335864, + -0.000102487836079579,-0.00108984354669972,0.29045268288283,-0.402852215851628, + -0.000106555744631143,-0.000429312657011849,0.305422136110118,-0.428270138367392, + -0.000110623653183262,0.000231218232675579,0.320391589337406,-0.453688060883156, + -0.000114691561734936,0.00089174912236345,0.335361042564695,-0.47910598339892, + -0.000118759470286611,0.00155228001205199,0.350330495791984,-0.504523905914684, + -0.000122827378838397,0.00221281090173986,0.365299949019272,-0.529941828430447, + -0.000126895287390294,0.00287334179142751,0.380269402246561,-0.555359750946211, + -0.000130963195941747,0.00353387268111582,0.395238855473849,-0.580777673461975, + -0.000135031104494421,0.00419440357080259,0.410208308701138,-0.606195595977739, + -0.000139099013045429,0.00485493446049112,0.425177761928426,-0.631613518493503, + -0.000143166921596993,0.00551546535017922,0.440147215155715,-0.657031441009267, + -0.00014723483014889,0.00617599623986775,0.455116668383004,-0.682449363525031, + -0.000151302738700565,0.00683652712955496,0.470086121610292,-0.707867286040795, + -5.23665861979217e-05,-0.00888141198140296,0.110434705288464,-0.0982232166583781, + -5.62557988355028e-05,-0.00822779229853743,0.125268383429118,-0.123736706750919, + -6.01450114732227e-05,-0.00757417261567206,0.140102061569772,-0.14925019684346, + -6.40342241108316e-05,-0.00692055293280636,0.154935739710426,-0.174763686936001, + -6.7923436748496e-05,-0.00626693324994099,0.16976941785108,-0.200277177028542, + -7.18126493859939e-05,-0.00561331356707528,0.184603095991734,-0.225790667121083, + -7.57018620237693e-05,-0.00495969388421003,0.199436774132388,-0.251304157213624, + -7.95910746613782e-05,-0.00430607420134432,0.214270452273042,-0.276817647306165, + -8.34802872992091e-05,-0.00365245451847929,0.229104130413696,-0.302331137398706, + -8.73694999366514e-05,-0.00299883483561314,0.24393780855435,-0.327844627491247, + -9.12587125742048e-05,-0.00234521515274766,0.258771486695004,-0.353358117583788, + -9.51479252120913e-05,-0.0016915954698824,0.273605164835658,-0.378871607676329, + -9.90371378495336e-05,-0.0010379757870167,0.288438842976312,-0.404385097768869, + -0.000102926350487142,-0.000384356104151218,0.303272521116966,-0.42989858786141, + -0.000106815563124862,0.000269263578714041,0.31810619925762,-0.455412077953951, + -0.000110704775762693,0.000922883261579521,0.332939877398274,-0.480925568046492, + -0.000114593988400191,0.001576502944445,0.347773555538928,-0.506439058139033, + -0.000118483201037578,0.0022301226273107,0.362607233679582,-0.531952548231574, + -0.000122372413675853,0.00288374231017552,0.377440911820236,-0.557466038324115, + -0.000126261626313795,0.003537361993041,0.39227458996089,-0.582979528416656, + -0.000130150838950849,0.00419098167590715,0.407108268101545,-0.608493018509197, + -0.000134040051588125,0.00484460135877285,0.421941946242198,-0.634006508601738, + -0.000137929264225845,0.005498221041639,0.436775624382853,-0.659519998694279, + -0.000141818476864009,0.00615184072450292,0.451609302523506,-0.68503348878682, + -0.000145707689501173,0.00680546040736907,0.46644298066416,-0.710546978879361, + -5.06414664759591e-05,-0.00870641494209479,0.109925519599893,-0.0987305867049729, + -5.4300090960635e-05,-0.00806246084650675,0.124579815825865,-0.124369670603822, + -5.7958715445644e-05,-0.00741850675091893,0.139234112051837,-0.150008754502671, + -6.16173399302089e-05,-0.00677455265533078,0.153888408277809,-0.175647838401519, + -6.52759644150236e-05,-0.00613059855974274,0.168542704503781,-0.201286922300368, + -6.89345888998938e-05,-0.00548664446415503,0.183197000729753,-0.226926006199217, + -7.25932133845419e-05,-0.00484269036856666,0.197851296955725,-0.252565090098066, + -7.62518378695787e-05,-0.00419873627297918,0.212505593181697,-0.278204173996915, + -7.99104623543934e-05,-0.00355478217739136,0.227159889407669,-0.303843257895764, + -8.35690868390415e-05,-0.0029108280818031,0.241814185633641,-0.329482341794613, + -8.72277113236342e-05,-0.00226687398621461,0.256468481859614,-0.355121425693461, + -9.08863358084488e-05,-0.00162291989062679,0.271122778085585,-0.38076050959231, + -9.45449602932635e-05,-0.000978965795038311,0.285777074311558,-0.406399593491159, + -9.82035847781892e-05,-0.000335011699450938,0.30043137053753,-0.432038677390008, + -0.000101862209262782,0.000308942396137546,0.315085666763502,-0.457677761288857, + -0.00010552083374793,0.000952896491724697,0.329739962989474,-0.483316845187706, + -0.000109179458232411,0.0015968505873134,0.344394259215446,-0.508955929086555, + -0.000112838082717559,0.00224080468290078,0.359048555441418,-0.534595012985404, + -0.000116496707201819,0.00288475877848993,0.37370285166739,-0.560234096884252, + -0.000120155331686522,0.00352871287407774,0.388357147893362,-0.585873180783101, + -0.000123813956171559,0.00417266696966534,0.403011444119334,-0.61151226468195, + -0.000127472580656374,0.00481662106525338,0.417665740345306,-0.637151348580799, + -0.000131131205141188,0.00546057516084097,0.432320036571278,-0.662790432479648, + -0.000134789829626225,0.00610452925642901,0.44697433279725,-0.688429516378497, + -0.000138448454110485,0.0067484833520175,0.461628629023222,-0.714068600277346, + -4.84092007519699e-05,-0.00848499191781982,0.109264353836443,-0.0993830256763889, + -5.17786513329621e-05,-0.007854441457956,0.123686396404011,-0.125183613578783, + -5.51481019137601e-05,-0.00722389099809195,0.13810843897158,-0.150984201481176, + -5.85175524945858e-05,-0.00659334053822791,0.152530481539148,-0.17678478938357, + -6.18870030755225e-05,-0.00596279007836398,0.166952524106717,-0.202585377285963, + -6.52564536562927e-05,-0.0053322396184996,0.181374566674286,-0.228385965188357, + -6.86259042370074e-05,-0.00470168915863556,0.195796609241854,-0.25418655309075, + -7.19953548179442e-05,-0.00407113869877151,0.210218651809423,-0.279987140993144, + -7.53648053989919e-05,-0.00344058823890747,0.224640694376991,-0.305787728895538, + -7.87342559796511e-05,-0.00281003777904343,0.23906273694456,-0.331588316797931, + -8.21037065606434e-05,-0.00217948731917939,0.253484779512128,-0.357388904700325, + -8.54731571413025e-05,-0.00154893685931512,0.267906822079697,-0.383189492602718, + -8.88426077221283e-05,-0.000918386399451299,0.282328864647265,-0.408990080505112, + -9.22120583030095e-05,-0.000287835939587255,0.296750907214834,-0.434790668407506, + -9.55815088841128e-05,0.000342714520276566,0.311172949782402,-0.460591256309899, + -9.8950959464883e-05,0.000973264980140609,0.325594992349971,-0.486391844212293, + -0.000102320410045764,0.00160381544000487,0.34001703491754,-0.512192432114686, + -0.000105689860626312,0.00223436589986914,0.354439077485108,-0.53799302001708, + -0.000109059311206972,0.0028649163597334,0.368861120052677,-0.563793607919474, + -0.000112428761788186,0.00349546681959723,0.383283162620245,-0.589594195821867, + -0.000115798212368845,0.00412601727946127,0.397705205187814,-0.615394783724261, + -0.000119167662950281,0.00475656773932487,0.412127247755382,-0.641195371626654, + -0.000122537113530941,0.00538711819918891,0.42654929032295,-0.666995959529048, + -0.000125906564111822,0.00601766865905295,0.440971332890519,-0.692796547431442, + -0.000129276014692481,0.00664821911891789,0.455393375458088,-0.718597135333835, + -4.5595620421085e-05,-0.00821381402702714,0.108427395723077,-0.100198949943295, + -4.8615583543743e-05,-0.00760157123076188,0.122556482353515,-0.126201510813993, + -5.16355466664287e-05,-0.00698932843449651,0.136685568983954,-0.152204071684692, + -5.46555097888923e-05,-0.00637708563823103,0.150814655614392,-0.17820663255539, + -5.76754729117446e-05,-0.00576484284196588,0.16494374224483,-0.204209193426089, + -6.06954360342082e-05,-0.00515260004570006,0.179072828875269,-0.230211754296787, + -6.37153991569495e-05,-0.00454035724943513,0.193201915505707,-0.256214315167486, + -6.67353622795797e-05,-0.00392811445316954,0.207331002136145,-0.282216876038184, + -6.97553254023209e-05,-0.00331587165690439,0.221460088766583,-0.308219436908882, + -7.27752885247845e-05,-0.00270362886063857,0.235589175397022,-0.334221997779581, + -7.57952516476923e-05,-0.00209138606437387,0.24971826202746,-0.360224558650279, + -7.88152147704335e-05,-0.00147914326810827,0.263847348657898,-0.386227119520978, + -8.18351778930637e-05,-0.000866900471843124,0.277976435288336,-0.412229680391676, + -8.48551410155274e-05,-0.00025465767557753,0.292105521918775,-0.438232241262375, + -8.78751041384351e-05,0.00035758512068762,0.306234608549213,-0.464234802133073, + -9.08950672607878e-05,0.000969827916953658,0.320363695179652,-0.490237363003771, + -9.39150303838066e-05,0.00158207071321814,0.334492781810089,-0.51623992387447, + -9.69349935058261e-05,0.0021943135094844,0.348621868440528,-0.542242484745168, + -9.99549566289559e-05,0.00280655630574911,0.362750955070966,-0.568245045615867, + -0.000102974919751309,0.0034187991020147,0.376880041701404,-0.594247606486565, + -0.000105994882873661,0.00403104189828074,0.391009128331843,-0.620250167357264, + -0.000109014845996902,0.004643284694545,0.405138214962281,-0.646252728227962, + -0.000112034809119255,0.00525552749081104,0.419267301592719,-0.672255289098661, + -0.000115054772241496,0.00586777028707708,0.433396388223158,-0.698257849969359, + -0.000118074735364515,0.00648001308334178,0.447525474853596,-0.724260410840057, + -4.2164673495132e-05,-0.00789477635516589,0.107401453686758,-0.101184488415708, + -4.47814931092694e-05,-0.00730694190386327,0.121172972355841,-0.127431008362911, + -4.73983127236843e-05,-0.0067191074525611,0.134944491024923,-0.153677528310114, + -5.00151323377107e-05,-0.00613127300125815,0.148716009694006,-0.179924048257317, + -5.26319519519869e-05,-0.00554343854995598,0.162487528363088,-0.206170568204519, + -5.52487715662631e-05,-0.00495560409865359,0.176259047032171,-0.232417088151722, + -5.78655911804837e-05,-0.00436776964735119,0.190030565701253,-0.258663608098925, + -6.04824107948154e-05,-0.0037799351960488,0.203802084370336,-0.284910128046128, + -6.30992304090361e-05,-0.00319210074474663,0.217573603039418,-0.31115664799333, + -6.57160500232568e-05,-0.00260426629344401,0.231345121708501,-0.337403167940533, + -6.83328696375884e-05,-0.00201643184214162,0.245116640377584,-0.363649687887736, + -7.09496892515871e-05,-0.00142859739083878,0.258888159046666,-0.389896207834939, + -7.35665088654747e-05,-0.000840762939536388,0.272659677715749,-0.416142727782142, + -7.61833284801394e-05,-0.000252928488234216,0.286431196384831,-0.442389247729344, + -7.88001480944711e-05,0.000334905963068177,0.300202715053914,-0.468635767676547, + -8.14169677081367e-05,0.000922740414371459,0.313974233722997,-0.49488228762375, + -8.40337873225794e-05,0.00151057486567385,0.327745752392079,-0.521128807570953, + -8.66506069369111e-05,0.00209840931697602,0.341517271061162,-0.547375327518156, + -8.92674265513538e-05,0.00268624376827731,0.355288789730243,-0.573621847465358, + -9.18842461650193e-05,0.00327407821958081,0.369060308399326,-0.599868367412561, + -9.4501065779018e-05,0.00386191267088387,0.382831827068409,-0.626114887359764, + -9.71178853942378e-05,0.00444974712218471,0.396603345737491,-0.652361407306967, + -9.97347050075703e-05,0.0050375815734891,0.410374864406575,-0.67860792725417, + -0.000102351524621902,0.00562541602479083,0.424146383075657,-0.704854447201373, + -0.000104968344236789,0.00621325047609211,0.437917901744739,-0.731100967148575, + -3.81458826478609e-05,-0.00753687964632804,0.106192467225051,-0.102326156082606, + -4.03234014009213e-05,-0.00698046723672974,0.119544693813782,-0.128855283150168, + -4.25009201538151e-05,-0.00642405482713104,0.132896920402514,-0.155384410217729, + -4.4678438906931e-05,-0.00586764241753279,0.146249146991246,-0.181913537285291, + -4.68559576597416e-05,-0.00531123000793399,0.159601373579978,-0.208442664352852, + -4.90334764128297e-05,-0.00475481759833585,0.17295360016871,-0.234971791420414, + -5.12109951657513e-05,-0.00419840518873738,0.186305826757441,-0.261500918487976, + -5.3388513918895e-05,-0.0036419927791389,0.199658053346173,-0.288030045555537, + -5.55660326718166e-05,-0.00308558036954043,0.213010279934905,-0.314559172623098, + -5.77435514247937e-05,-0.00252916795994218,0.226362506523636,-0.34108829969066, + -5.99210701777153e-05,-0.00197275555034326,0.239714733112369,-0.367617426758221, + -6.20985889311365e-05,-0.00141634314074546,0.2530669597011,-0.394146553825783, + -6.42761076836695e-05,-0.000859930731146763,0.266419186289832,-0.420675680893344, + -6.64536264366467e-05,-0.000303518321548291,0.279771412878564,-0.447204807960906, + -6.86311451896238e-05,0.000252894088050626,0.293123639467296,-0.473733935028468, + -7.08086639424899e-05,0.000809306497648876,0.306475866056027,-0.500263062096029, + -7.29861826960221e-05,0.00136571890724668,0.319828092644759,-0.526792189163591, + -7.51637014483331e-05,0.00192213131684582,0.333180319233491,-0.553321316231152, + -7.73412202011992e-05,0.00247854372644496,0.346532545822223,-0.579850443298713, + -7.95187389548424e-05,0.00303495613604232,0.359884772410954,-0.606379570366275, + -8.16962577082636e-05,0.00359136854564035,0.373236998999686,-0.632908697433836, + -8.38737764603525e-05,0.00414778095523971,0.386589225588418,-0.659437824501398, + -8.60512952136627e-05,0.00470419336483818,0.39994145217715,-0.685966951568959, + -8.82288139665288e-05,0.00526060577443621,0.413293678765881,-0.712496078636521, + -9.04063327205051e-05,0.0058170181840338,0.426645905354613,-0.739025205704083, + -3.36547882024141e-05,-0.00715643983893677,0.104832389040387,-0.103586357827746, + -3.53845704886835e-05,-0.00663864511414669,0.117715461255131,-0.130427433807054, + -3.71143527748141e-05,-0.00612085038935617,0.130598533469875,-0.157268509786362, + -3.88441350612223e-05,-0.00560305566456609,0.143481605684618,-0.18410958576567, + -4.05739173472974e-05,-0.00508526093977568,0.156364677899362,-0.210950661744977, + -4.23036996333725e-05,-0.00456746621498516,0.169247750114106,-0.237791737724285, + -4.40334819199473e-05,-0.00404967149019542,0.18213082232885,-0.264632813703593, + -4.57632642059669e-05,-0.00353187676540467,0.195013894543594,-0.291473889682901, + -4.74930464920975e-05,-0.00301408204061415,0.207896966758337,-0.318314965662209, + -4.92228287781726e-05,-0.00249628731582363,0.220780038973081,-0.345156041641517, + -5.09526110645253e-05,-0.00197849259103378,0.233663111187825,-0.371997117620825, + -5.2682393350767e-05,-0.0014606978662437,0.246546183402568,-0.398838193600132, + -5.44121756368421e-05,-0.000942903141452955,0.259429255617313,-0.42567926957944, + -5.61419579230282e-05,-0.000425108416662878,0.272312327832056,-0.452520345558748, + -5.78717402093254e-05,9.2686308127643e-05,0.2851954000468,-0.479361421538056, + -5.96015224957336e-05,0.000610481032917498,0.298078472261543,-0.506202497517364, + -6.13313047819197e-05,0.00112827575770802,0.310961544476287,-0.533043573496672, + -6.30610870679948e-05,0.00164607048249854,0.323844616691031,-0.559884649475979, + -6.4790869354181e-05,0.0021638652072884,0.336727688905775,-0.586725725455287, + -6.65206516408112e-05,0.00268165993207869,0.349610761120519,-0.613566801434595, + -6.82504339269974e-05,0.00319945465686899,0.362493833335263,-0.640407877413903, + -6.99802162127394e-05,0.00371724938165974,0.375376905550006,-0.667248953393211, + -7.17099984990366e-05,0.00423504410644959,0.38825997776475,-0.694090029372519, + -7.34397807856668e-05,0.00475283883123989,0.401143049979494,-0.720931105351827, + -7.5169563071853e-05,0.00527063355603019,0.414026122194237,-0.747772181331134, + -2.88924011872804e-05,-0.00677473419631736,0.103380081712184,-0.104905388275511, + -3.01988382318263e-05,-0.00630179432450795,0.115764984726713,-0.13207297555694, + -3.15052752763723e-05,-0.00582885445269854,0.128149887741241,-0.159240562838369, + -3.28117123206684e-05,-0.00535591458088891,0.14053479075577,-0.186408150119798, + -3.41181493653253e-05,-0.00488297470907961,0.152919693770299,-0.213575737401227, + -3.54245864099267e-05,-0.00441003483727009,0.165304596784827,-0.240743324682656, + -3.67310234544171e-05,-0.00393709496546057,0.177689499799356,-0.267910911964085, + -3.80374604989631e-05,-0.00346415509365161,0.190074402813884,-0.295078499245513, + -3.93438975432314e-05,-0.00299121522184165,0.202459305828413,-0.322246086526942, + -4.0650334588388e-05,-0.00251827535003324,0.214844208842941,-0.349413673808371, + -4.19567716326008e-05,-0.00204533547822305,0.22722911185747,-0.3765812610898, + -4.32632086773688e-05,-0.0015723956064142,0.239614014871999,-0.403748848371229, + -4.45696457216371e-05,-0.00109945573460446,0.251998917886528,-0.430916435652658, + -4.58760827662941e-05,-0.000626515862795385,0.264383820901056,-0.458084022934087, + -4.718251981084e-05,-0.000153575990985644,0.276768723915585,-0.485251610215516, + -4.84889568551639e-05,0.000319363880824097,0.289153626930114,-0.512419197496944, + -4.97953938994877e-05,0.00079230375263406,0.301538529944643,-0.539586784778373, + -5.11018309442557e-05,0.00126524362444269,0.313923432959171,-0.566754372059802, + -5.24082679886906e-05,0.00173818349625243,0.3263083359737,-0.593921959341231, + -5.37147050329034e-05,0.00221112336806195,0.338693238988228,-0.62108954662266, + -5.50211420778934e-05,0.00268406323987103,0.351078142002757,-0.648257133904089, + -5.63275791223283e-05,0.00315700311168055,0.363463045017285,-0.675424721185518, + -5.76340161670963e-05,0.00362994298348962,0.375847948031814,-0.702592308466946, + -5.89404532111981e-05,0.00410288285529958,0.388232851046343,-0.729759895748375, + -6.02468902568543e-05,0.00457582272710733,0.400617754060871,-0.756927483029804, + -2.41152995490712e-05,-0.00641349477086245,0.101913187729533,-0.106211365668085, + -2.505222062818e-05,-0.0059894485064711,0.11379768301813,-0.133702233113146, + -2.59891417071501e-05,-0.00556540224207958,0.125682178306728,-0.161193100558208, + -2.69260627863144e-05,-0.00514135597768839,0.137566673595326,-0.188683968003269, + -2.78629838653122e-05,-0.00471730971329676,0.149451168883923,-0.21617483544833, + -2.87999049443655e-05,-0.00429326344890557,0.161335664172521,-0.243665702893392, + -2.97368260233632e-05,-0.00386921718451394,0.173220159461118,-0.271156570338453, + -3.06737471025276e-05,-0.00344517092012242,0.185104654749716,-0.298647437783514, + -3.16106681816364e-05,-0.00302112465573146,0.196989150038313,-0.326138305228576, + -3.25475892608562e-05,-0.00259707839134005,0.208873645326911,-0.353629172673637, + -3.3484510339854e-05,-0.00217303212694886,0.220758140615508,-0.381120040118699, + -3.44214314187963e-05,-0.00174898586255723,0.232642635904106,-0.40861090756376, + -3.5358352497572e-05,-0.00132493959816515,0.244527131192704,-0.436101775008821, + -3.62952735766253e-05,-0.000900893333774189,0.256411626481301,-0.463592642453883, + -3.72321946559007e-05,-0.000476847069383002,0.268296121769899,-0.491083509898944, + -3.8169115735065e-05,-5.28008049915929e-05,0.280180617058496,-0.518574377344005, + -3.91060368140073e-05,0.00037124545940026,0.292065112347094,-0.546065244789067, + -4.00429578930606e-05,0.000795291723791447,0.303949607635692,-0.573556112234128, + -4.09798789721139e-05,0.00121933798818263,0.315834102924289,-0.601046979679189, + -4.19168000509451e-05,0.00164338425257471,0.327718598212887,-0.628537847124251, + -4.28537211297764e-05,0.0020674305169659,0.339603093501484,-0.656028714569312, + -4.37906422097178e-05,0.00249147678135619,0.351487588790081,-0.683519582014373, + -4.47275632883271e-05,0.00291552304574871,0.36337208407868,-0.711010449459434, + -4.56644843674914e-05,0.0033395693101399,0.375256579367277,-0.738501316904496, + -4.66014054466557e-05,0.00376361557453109,0.387141074655875,-0.765992184349557, + -1.95831580042938e-05,-0.00609011418887767,0.100512430000829,-0.107435178400323, + -2.02225283721935e-05,-0.00571594628149952,0.111921526641904,-0.135228987062119, + -2.08618987400933e-05,-0.00534177837412131,0.123330623282978,-0.163022795723914, + -2.1501269108215e-05,-0.00496761046674332,0.134739719924052,-0.19081660438571, + -2.2140639475865e-05,-0.00459344255936489,0.146148816565127,-0.218610413047505, + -2.27800098440145e-05,-0.00421927465198702,0.157557913206201,-0.246404221709301, + -2.3419380211942e-05,-0.0038451067446087,0.168967009847276,-0.274198030371096, + -2.4058750580036e-05,-0.00347093883723071,0.18037610648835,-0.301991839032892, + -2.4698120947908e-05,-0.00309677092985261,0.191785203129424,-0.329785647694687, + -2.533749131578e-05,-0.00272260302247407,0.203194299770499,-0.357579456356483, + -2.59768616835965e-05,-0.00234843511509619,0.214603396411573,-0.385373265018278, + -2.66162320516905e-05,-0.00197426720771854,0.226012493052647,-0.413167073680073, + -2.72556024196735e-05,-0.00160009930033977,0.237421589693722,-0.440960882341869, + -2.78949727875455e-05,-0.00122593139296145,0.248830686334796,-0.468754691003664, + -2.85343431551954e-05,-0.000851763485583357,0.26023978297587,-0.49654849966546, + -2.91737135230674e-05,-0.000477595578204815,0.271648879616945,-0.524342308327255, + -2.98130838913835e-05,-0.000103427670827383,0.283057976258019,-0.552136116989051, + -3.04524542588114e-05,0.000270740236551603,0.294467072899094,-0.579929925650846, + -3.10918246271275e-05,0.000644908143929257,0.305876169540168,-0.607723734312642, + -3.17311949951105e-05,0.00101907605130735,0.317285266181242,-0.635517542974437, + -3.23705653630935e-05,0.00139324395868501,0.328694362822316,-0.663311351636233, + -3.30099357310765e-05,0.00176741186606355,0.340103459463391,-0.691105160298028, + -3.36493060989485e-05,0.0021415797734412,0.351512556104465,-0.718898968959823, + -3.42886764667094e-05,0.00251574768081975,0.362921652745539,-0.746692777621619, + -3.49280468350255e-05,0.0028899155881974,0.374330749386614,-0.774486586283414, + -1.55049761480508e-05,-0.0058146927621745,0.0992446118064855,-0.108524254763767, + -1.59224191787766e-05,-0.00548822537001237,0.110225382031673,-0.136587652154269, + -1.63398622096689e-05,-0.00516175797785046,0.12120615225686,-0.16465104954477, + -1.67573052405334e-05,-0.00483529058568855,0.132186922482047,-0.192714446935271, + -1.717474827162e-05,-0.00450882319352675,0.143167692707234,-0.220777844325773, + -1.7592191302318e-05,-0.0041823558013645,0.154148462932421,-0.248841241716274, + -1.80096343331271e-05,-0.00385588840920259,0.165129233157608,-0.276904639106775, + -1.84270773641582e-05,-0.00352942101704068,0.176110003382795,-0.304968036497277, + -1.88445203948562e-05,-0.00320295362487877,0.187090773607982,-0.333031433887778, + -1.92619634257762e-05,-0.00287648623271641,0.198071543833169,-0.361094831278279, + -1.96794064567518e-05,-0.0025500188405545,0.209052314058356,-0.389158228668781, + -2.00968494876164e-05,-0.00222355144839259,0.220033084283543,-0.417221626059282, + -2.0514292518814e-05,-0.00189708405623112,0.23101385450873,-0.445285023449783, + -2.0931735549512e-05,-0.00157061666406899,0.241994624733917,-0.473348420840284, + -2.1349178579988e-05,-0.00124414927190641,0.252975394959105,-0.501411818230786, + -2.17666216112411e-05,-0.000917681879745391,0.263956165184291,-0.529475215621287, + -2.21840646423832e-05,-0.000591214487583702,0.274936935409478,-0.557538613011788, + -2.26015076730812e-05,-0.000264747095420903,0.285917705634666,-0.58560201040229, + -2.30189507038903e-05,6.1720296741008e-05,0.296898475859853,-0.613665407792791, + -2.34363937343662e-05,0.000388187688903585,0.30787924608504,-0.641728805183292, + -2.38538367656194e-05,0.000714655081065274,0.318860016310227,-0.669792202573794, + -2.42712797965394e-05,0.00104112247322696,0.329840786535414,-0.697855599964295, + -2.46887228279036e-05,0.00136758986538821,0.340821556760601,-0.725918997354796, + -2.51061658587126e-05,0.00169405725755034,0.351802326985788,-0.753982394745298, + -2.55236088895217e-05,0.00202052464971203,0.362783097210975,-0.782045792135799, + -1.20061388099169e-05,-0.00558981272839293,0.0981514582102102,-0.109449762027059, + -1.22690225870248e-05,-0.00530634073274416,0.108764333946017,-0.137742258436595, + -1.25319063639107e-05,-0.00502286873709501,0.119377209681824,-0.166034754846131, + -1.27947901409908e-05,-0.00473939674144608,0.129990085417631,-0.194327251255667, + -1.30576739180155e-05,-0.00445592474579715,0.140602961153438,-0.222619747665203, + -1.33205576947071e-05,-0.00417245275014788,0.151215836889245,-0.250912244074739, + -1.35834414717872e-05,-0.00388898075449895,0.161828712625052,-0.279204740484274, + -1.38463252486454e-05,-0.00360550875884957,0.17244158836086,-0.30749723689381, + -1.41092090258366e-05,-0.00332203676320098,0.183054464096666,-0.335789733303346, + -1.43720928026392e-05,-0.00303856476755171,0.193667339832474,-0.364082229712882, + -1.46349765797193e-05,-0.00275509277190289,0.204280215568281,-0.392374726122418, + -1.48978603571326e-05,-0.00247162077625451,0.214893091304087,-0.420667222531954, + -1.51607441337687e-05,-0.0021881487806048,0.225505967039895,-0.44895971894149, + -1.54236279108488e-05,-0.00190467678495598,0.236118842775702,-0.477252215351026, + -1.5686511687929e-05,-0.00162120478930694,0.246731718511509,-0.505544711760562, + -1.59493954646761e-05,-0.00133773279365745,0.257344594247316,-0.533837208170097, + -1.62122792415342e-05,-0.00105426079800797,0.267957469983124,-0.562129704579633, + -1.64751630186144e-05,-0.000770788802359146,0.278570345718931,-0.590422200989169, + -1.67380467960276e-05,-0.000487316806710769,0.289183221454737,-0.618714697398705, + -1.70009305727747e-05,-0.000203844811061504,0.299796097190545,-0.647007193808241, + -1.72638143497439e-05,7.96271845868723e-05,0.310408972926351,-0.675299690217777, + -1.75266981270461e-05,0.000363099180236137,0.321021848662159,-0.703592186627313, + -1.77895819037932e-05,0.000646571175885402,0.331634724397966,-0.731884683036849, + -1.80524656806513e-05,0.000930043171534667,0.342247600133773,-0.760177179446385, + -1.83153494573984e-05,0.00121351516718393,0.35286047586958,-0.788469675855921, + -9.12489553736573e-06,-0.0054123496580194,0.0972475554035802,-0.110205947423729, + -9.28615369125141e-06,-0.00516568791187411,0.107557184001185,-0.138685629109336, + -9.44741184549791e-06,-0.00491902616572915,0.117866812598789,-0.167165310794943, + -9.60866999932808e-06,-0.00467236441958374,0.128176441196394,-0.195644992480551, + -9.7699281534358e-06,-0.00442570267343856,0.138486069793999,-0.224124674166158, + -9.93118630748802e-06,-0.00417904092729326,0.148795698391604,-0.252604355851765, + -1.00924444614847e-05,-0.0039323791811483,0.159105326989208,-0.281084037537372, + -1.02537026154259e-05,-0.0036857174350029,0.169414955586813,-0.30956371922298, + -1.04149607694781e-05,-0.00343905568885772,0.179724584184417,-0.338043400908587, + -1.05762189235303e-05,-0.00319239394271231,0.190034212782022,-0.366523082594194, + -1.0737477077416e-05,-0.00294573219656713,0.200343841379627,-0.395002764279802, + -1.08987352316903e-05,-0.00269907045042239,0.210653469977231,-0.423482445965409, + -1.10599933854649e-05,-0.00245240870427654,0.220963098574836,-0.451962127651016, + -1.12212515392951e-05,-0.00220574695813136,0.231272727172441,-0.480441809336623, + -1.13825096936804e-05,-0.00195908521198662,0.241582355770045,-0.508921491022231, + -1.15437678472885e-05,-0.00171242346584055,0.25189198436765,-0.537401172707838, + -1.17050260016738e-05,-0.00146576171969559,0.262201612965255,-0.565880854393445, + -1.1866284155726e-05,-0.00121909997355085,0.272511241562859,-0.594360536079053, + -1.20275423095562e-05,-0.000972438227405448,0.282820870160464,-0.62284021776466, + -1.21888004632753e-05,-0.000725776481259377,0.293130498758069,-0.651319899450267, + -1.23500586176606e-05,-0.000479114735114639,0.303440127355674,-0.679799581135874, + -1.25113167716018e-05,-0.000232452988969456,0.313749755953278,-0.708279262821482, + -1.2672574925876e-05,1.42087571752825e-05,0.324059384550883,-0.736758944507089, + -1.28338330798172e-05,0.000260870503320465,0.334369013148487,-0.765238626192696, + -1.29950912333143e-05,0.000507532249466092,0.344678641746092,-0.793718307878304, + -6.83115584967919e-06,-0.00527595995553259,0.0965256040382916,-0.110804190206857, + -6.92852758998885e-06,-0.00505949294417618,0.106593629701304,-0.139431960232983, + -7.02589933029851e-06,-0.0048430259328196,0.116661655364317,-0.168059730259109, + -7.12327107088573e-06,-0.00462655892146346,0.126729681027329,-0.196687500285235, + -7.22064281111212e-06,-0.00441009191010688,0.136797706690342,-0.225315270311362, + -7.31801455144954e-06,-0.00419362489875008,0.146865732353354,-0.253943040337488, + -7.41538629184246e-06,-0.00397715788739395,0.156933758016367,-0.282570810363614, + -7.51275803234641e-06,-0.0037606908760377,0.167001783679379,-0.311198580389741, + -7.61012977251729e-06,-0.00354422386468078,0.177069809342392,-0.339826350415867, + -7.70750151302124e-06,-0.00332775685332454,0.187137835005404,-0.368454120441993, + -7.80487325330315e-06,-0.00311128984196807,0.197205860668417,-0.397081890468119, + -7.90224499347403e-06,-0.00289482283061138,0.207273886331429,-0.425709660494246, + -7.99961673392247e-06,-0.00267835581925491,0.217341911994442,-0.454337430520372, + -8.09698847425988e-06,-0.00246188880789866,0.227409937657454,-0.482965200546498, + -8.19436021448627e-06,-0.00224542179654175,0.237477963320467,-0.511592970572624, + -8.29173195504573e-06,-0.00202895478518572,0.247545988983479,-0.54022074059875, + -8.38910369549417e-06,-0.00181248777382947,0.257614014646492,-0.568848510624877, + -8.48647543549852e-06,-0.00159602076247278,0.267682040309504,-0.597476280651003, + -8.58384717605798e-06,-0.00137955375111654,0.277750065972517,-0.62610405067713, + -8.68121891695051e-06,-0.00116308673976029,0.28781809163553,-0.654731820703256, + -8.77859065673281e-06,-0.000946619728403153,0.297886117298542,-0.683359590729382, + -8.87596239718125e-06,-0.00073015271704735,0.307954142961554,-0.711987360755509, + -8.9733341371856e-06,-0.00051368570568977,0.318022168624567,-0.740615130781635, + -9.07070587707892e-06,-0.000297218694333079,0.32809019428758,-0.769242900807761, + -9.16807761852656e-06,-8.0751682978164e-05,0.338158219950592,-0.797870670833887, + -5.05375034340338e-06,-0.0051732050509341,0.0959647446968884,-0.11126552299452, + -5.11222258181565e-06,-0.00498067081721709,0.105845437000755,-0.140007490816054, + -5.17069482022792e-06,-0.00478813658350008,0.115726129304622,-0.168749458637588, + -5.22916705875121e-06,-0.00459560234978307,0.125606821608488,-0.197491426459123, + -5.28763929735776e-06,-0.00440306811606639,0.135487513912355,-0.226233394280657, + -5.34611153563125e-06,-0.00421053388234915,0.145368206216221,-0.254975362102192, + -5.40458377390474e-06,-0.0040179996486317,0.155248898520088,-0.283717329923726, + -5.46305601234476e-06,-0.0038254654149148,0.165129590823955,-0.31245929774526, + -5.5215282513954e-06,-0.00363293118119867,0.175010283127821,-0.341201265566795, + -5.58000048955787e-06,-0.00344039694748122,0.184890975431688,-0.369943233388329, + -5.63847272777585e-06,-0.00324786271376376,0.194771667735555,-0.398685201209863, + -5.69694496660444e-06,-0.00305532848004719,0.204652360039421,-0.427427169031398, + -5.75541720493344e-06,-0.00286279424633018,0.214533052343288,-0.456169136852932, + -5.81388944331795e-06,-0.00267026001261317,0.224413744647155,-0.484911104674467, + -5.87236168192451e-06,-0.00247772577889616,0.234294436951021,-0.513653072496001, + -5.93083392042004e-06,-0.00228519154517914,0.244175129254888,-0.542395040317535, + -5.98930615891557e-06,-0.00209265731146235,0.254055821558755,-0.57113700813907, + -6.04777839718906e-06,-0.00190012307774512,0.263936513862621,-0.599878975960604, + -6.10625063512948e-06,-0.00170758884402744,0.273817206166488,-0.628620943782139, + -6.16472287373604e-06,-0.00151505461031043,0.283697898470355,-0.657362911603673, + -6.22319511245362e-06,-0.0013225203765943,0.293578590774221,-0.686104879425207, + -6.28166735094915e-06,-0.00112998614287729,0.303459283078088,-0.714846847246742, + -6.34013958988877e-06,-0.000937451909160725,0.313339975381954,-0.743588815068276, + -6.3986118283843e-06,-0.000744917675443713,0.323220667685821,-0.77233078288981, + -6.45708406588064e-06,-0.000552383441724924,0.333101359989688,-0.801072750711345, + -3.70501094104636e-06,-0.00509692020875624,0.0955383278748698,-0.11161430732803, + -3.7402543903442e-06,-0.00492285513785695,0.105276798533111,-0.140442612828188, + -3.77549783975306e-06,-0.00474879006695772,0.115015269191353,-0.169270918328346, + -3.81074128913417e-06,-0.0045747249960586,0.124753739849594,-0.198099223828504, + -3.8459847386263e-06,-0.00440065992515948,0.134492210507836,-0.226927529328662, + -3.88122818795189e-06,-0.00422659485426036,0.144230681166077,-0.25575583482882, + -3.91647163738851e-06,-0.00405252978336113,0.153969151824318,-0.284584140328978, + -3.95171508704717e-06,-0.00387846471246234,0.16370762248256,-0.313412445829136, + -3.98695853615072e-06,-0.00370439964156266,0.173446093140801,-0.342240751329294, + -4.02220198564285e-06,-0.00353033457066365,0.183184563799043,-0.371069056829453, + -4.05744543519049e-06,-0.00335626949976464,0.192923034457284,-0.399897362329611, + -4.09268888440506e-06,-0.00318220442886541,0.202661505115525,-0.428725667829769, + -4.12793233373066e-06,-0.00300813935796618,0.212399975773767,-0.457553973329927, + -4.16317578322278e-06,-0.00283407428706717,0.222138446432008,-0.486382278830085, + -4.19841923238184e-06,-0.00266000921616749,0.23187691709025,-0.515210584330243, + -4.23366268209602e-06,-0.00248594414526915,0.241615387748491,-0.544038889830401, + -4.26890613147712e-06,-0.00231187907436925,0.251353858406733,-0.572867195330559, + -4.30414958030312e-06,-0.00213781400346957,0.261092329064974,-0.601695500830717, + -4.33939303035036e-06,-0.00196374893257145,0.270830799723215,-0.630523806330875, + -4.37463647950942e-06,-0.00178968386167178,0.280569270381457,-0.659352111831033, + -4.40987992955666e-06,-0.00161561879077343,0.290307741039698,-0.688180417331191, + -4.44512337882674e-06,-0.0014415537198742,0.300046211697939,-0.717008722831349, + -4.48036682809683e-06,-0.00126748864897497,0.309784682356181,-0.745837028331507, + -4.51561027725589e-06,-0.00109342357807574,0.319523153014422,-0.774665333831665, + -4.55085372697006e-06,-0.000919358507176504,0.329261623672664,-0.803493639331823, + -2.69772602098928e-06,-0.00504088952996201,0.0952194047193457,-0.11187407580856, + -2.71920955394189e-06,-0.00488079001395125,0.104851620627799,-0.140766684103981, + -2.74069308667246e-06,-0.00472069049794011,0.114483836536253,-0.169659292399401, + -2.76217661970835e-06,-0.00456059098192918,0.124116052444707,-0.198551900694822, + -2.78366015249443e-06,-0.00440049146591825,0.133748268353161,-0.227444508990243, + -2.80514368550255e-06,-0.00424039194990744,0.143380484261615,-0.256337117285663, + -2.82662721828864e-06,-0.00408029243389629,0.153012700170069,-0.285229725581084, + -2.84811075090818e-06,-0.00392019291788492,0.162644916078522,-0.314122333876505, + -2.86959428402733e-06,-0.00376009340187444,0.172277131986976,-0.343014942171925, + -2.8910778172575e-06,-0.00359999388586396,0.18190934789543,-0.371907550467346, + -2.91256134976603e-06,-0.00343989436985281,0.191541563803883,-0.400800158762767, + -2.93404488260762e-06,-0.00327979485384167,0.201173779712337,-0.429692767058187, + -2.95552841544922e-06,-0.00311969533783074,0.210805995620791,-0.458585375353608, + -2.97701194795774e-06,-0.00295959582181915,0.220438211529245,-0.487477983649028, + -2.99849548135445e-06,-0.00279949630580867,0.230070427437699,-0.516370591944449, + -3.01997901475115e-06,-0.00263939678979885,0.239702643346152,-0.54526320023987, + -3.04146254703763e-06,-0.00247929727378682,0.249334859254606,-0.57415580853529, + -3.06294608021229e-06,-0.00231919775777634,0.25896707516306,-0.603048416830711, + -3.08442961283184e-06,-0.00215909824176519,0.268599291071514,-0.631941025126132, + -3.10591314622854e-06,-0.00199899872575493,0.278231506979967,-0.660833633421552, + -3.12739667862605e-06,-0.00183889920974245,0.287863722888422,-0.689726241716973, + -3.14888021157866e-06,-0.00167879969373175,0.297495938796876,-0.718618850012394, + -3.17036374397617e-06,-0.0015187001777206,0.307128154705329,-0.747511458307814, + -3.19184727737287e-06,-0.00135860066171034,0.316760370613783,-0.776404066603235, + -3.21333080999242e-06,-0.00119850114569919,0.326392586522236,-0.805296674898655, + -1.95435807170963e-06,-0.00500005209382431,0.0949837906642617,-0.112065393789132, + -1.96767481369653e-06,-0.00485035286914359,0.104537570109605,-0.141005360720634, + -1.98099155565568e-06,-0.00470065364446282,0.114091349554949,-0.169945327652136, + -1.99430829761482e-06,-0.00455095441978193,0.123645129000292,-0.198885294583638, + -2.00762503965723e-06,-0.00440125519510115,0.133198908445636,-0.227825261515139, + -2.02094178164414e-06,-0.00425155597042037,0.14275268789098,-0.256765228446641, + -2.03425852379757e-06,-0.00410185674573993,0.152306467336323,-0.285705195378143, + -2.04757526545141e-06,-0.00395215752105882,0.161860246781667,-0.314645162309645, + -2.06089200749382e-06,-0.00380245829637804,0.171414026227011,-0.343585129241147, + -2.07420874948072e-06,-0.00365275907169726,0.180967805672354,-0.372525096172648, + -2.08752549157865e-06,-0.00350305984701693,0.190521585117697,-0.40146506310415, + -2.10084223362106e-06,-0.00335336062233571,0.200075364563041,-0.430405030035652, + -2.11415897566347e-06,-0.00320366139765516,0.209629144008385,-0.459344996967154, + -2.1274757172618e-06,-0.00305396217297416,0.219182923453728,-0.488284963898656, + -2.14079245919319e-06,-0.00290426294829316,0.228736702899072,-0.517224930830157, + -2.15410920179071e-06,-0.00275456372361349,0.238290482344415,-0.546164897761659, + -2.16742594305597e-06,-0.00260486449893138,0.247844261789759,-0.575104864693161, + -2.1807426852094e-06,-0.00245516527425083,0.257398041235103,-0.604044831624663, + -2.19405942758488e-06,-0.00230546604957071,0.266951820680446,-0.632984798556165, + -2.20737616873912e-06,-0.00215576682488861,0.27650560012579,-0.661924765487666, + -2.22069291133664e-06,-0.00200606760020872,0.286059379571133,-0.690864732419168, + -2.23400965326803e-06,-0.00185636837552838,0.295613159016477,-0.71980469935067, + -2.24732639497738e-06,-0.00170666915084627,0.305166938461821,-0.748744666282172, + -2.26064313746388e-06,-0.00155696992616683,0.314720717907164,-0.777684633213674, + -2.27395987917323e-06,-0.00140727070148605,0.324274497352508,-0.806624600145176, + -1.41056460697953e-06,-0.00497045281280539,0.0948112979073366,-0.112205140109363, + -1.41898454053546e-06,-0.00482841191805494,0.104307687476285,-0.141179699686594, + -1.42740447453549e-06,-0.00468637102330483,0.113804077045234,-0.170154259263824, + -1.43582440809142e-06,-0.00454433012855426,0.123300466614182,-0.199128818841055, + -1.44424434178614e-06,-0.00440228923380392,0.132796856183131,-0.228103378418286, + -1.45266427548085e-06,-0.00426024833905336,0.14229324575208,-0.257077937995516, + -1.46108420917557e-06,-0.00411820744430313,0.151789635321028,-0.286052497572747, + -1.46950414287028e-06,-0.00397616654955235,0.161286024889977,-0.315027057149978, + -1.47792407700909e-06,-0.00383412565480268,0.170782414458926,-0.344001616727208, + -1.48634401081482e-06,-0.00369208476005234,0.180278804027874,-0.372976176304439, + -1.49476394395442e-06,-0.00355004386530133,0.189775193596823,-0.40195073588167, + -1.50318387792669e-06,-0.00340800297055122,0.199271583165772,-0.4309252954589, + -1.51160381134385e-06,-0.00326596207580043,0.20876797273472,-0.459899855036131, + -1.52002374542715e-06,-0.00312392118105076,0.218264362303669,-0.488874414613362, + -1.52844367906635e-06,-0.0029818802863002,0.227760751872617,-0.517848974190592, + -1.53686361281657e-06,-0.00283983939154964,0.237257141441566,-0.546823533767823, + -1.54528354645578e-06,-0.00269779849679908,0.246753531010515,-0.575798093345054, + -1.55370347998396e-06,-0.00255575760204829,0.256249920579464,-0.604772652922284, + -1.56212341373418e-06,-0.00241371670729817,0.265746310148412,-0.633747212499515, + -1.57054334770645e-06,-0.00227167581254806,0.275242699717361,-0.662721772076746, + -1.57896328145668e-06,-0.0021296349177975,0.28473908928631,-0.691696331653976, + -1.58738321520691e-06,-0.00198759402304738,0.294235478855258,-0.720670891231207, + -1.59580314862406e-06,-0.00184555312829637,0.303731868424207,-0.749645450808438, + -1.60422308270736e-06,-0.0017035122335467,0.313228257993155,-0.778620010385669, + -1.61264301612452e-06,-0.00156147133879569,0.322724647562104,-0.807594569962899, + -1.01531944154964e-06,-0.00494908414239981,0.0946858537565381,-0.112306602157747, + -1.02075476535179e-06,-0.00481263610113947,0.104140524546712,-0.141306277535443, + -1.02619008929272e-06,-0.00467618805987946,0.113595195336887,-0.170305952913139, + -1.03162541342794e-06,-0.00453974001861945,0.123049866127061,-0.199305628290835, + -1.03706073723009e-06,-0.00440329197735922,0.132504536917236,-0.228305303668531, + -1.04249606130979e-06,-0.00426684393609933,0.14195920770741,-0.257304979046227, + -1.04793138483439e-06,-0.00413039589483866,0.151413878497584,-0.286304654423923, + -1.05336670891409e-06,-0.00399394785357865,0.160868549287759,-0.315304329801619, + -1.05880203271624e-06,-0.0038574998123182,0.170323220077933,-0.344304005179315, + -1.06423735674044e-06,-0.00372105177105819,0.179777890868107,-0.373303680557011, + -1.06967268070912e-06,-0.00358460372979841,0.189232561658282,-0.402303355934707, + -1.07510800434474e-06,-0.00344815568853796,0.198687232448456,-0.431303031312403, + -1.08054332814689e-06,-0.00331170764727751,0.20814190323863,-0.460302706690099, + -1.08597865233762e-06,-0.00317525960601772,0.217596574028805,-0.489302382067795, + -1.09141397608425e-06,-0.00303881156475749,0.227051244818979,-0.518302057445491, + -1.09684930049703e-06,-0.00290236352349793,0.236505915609153,-0.547301732823187, + -1.10228462413264e-06,-0.00276591548223704,0.245960586399328,-0.576301408200883, + -1.1077199479903e-06,-0.00262946744097725,0.255415257189502,-0.605301083578579, + -1.11315527184797e-06,-0.00249301939971724,0.264869927979676,-0.634300758956275, + -1.1185905955946e-06,-0.00235657135845635,0.274324598769851,-0.663300434333971, + -1.12402591978533e-06,-0.00222012331719679,0.283779269560025,-0.692300109711667, + -1.12946124342095e-06,-0.00208367527593634,0.2932339403502,-0.721299785089364, + -1.13489656750065e-06,-0.00194722723467633,0.302688611140374,-0.750299460467059, + -1.14033189158036e-06,-0.00181077919341588,0.312143281930549,-0.779299135844755, + -1.14576721554904e-06,-0.00167433115215676,0.321597952720722,-0.808298811222452, + -6.29745544075688e-05,-0.00993262689014757,0.121579107247871,-0.105719242678498, + -6.77301365100968e-05,-0.00925954296093956,0.136860984208181,-0.130248224071424, + -7.24857186124306e-05,-0.00858645903173139,0.15214286116849,-0.154777205464349, + -7.72413007151806e-05,-0.00791337510252366,0.1674247381288,-0.179306186857274, + -8.19968828174034e-05,-0.00724029117331548,0.18270661508911,-0.2038351682502, + -8.67524649198481e-05,-0.00656720724410742,0.197988492049419,-0.228364149643125, + -9.15080470225149e-05,-0.00589412331489947,0.213270369009729,-0.25289313103605, + -9.62636291250152e-05,-0.00522103938569174,0.228552245970039,-0.277422112428976, + -0.000101019211227404,-0.00454795545648334,0.243834122930349,-0.301951093821901, + -0.000105774793329905,-0.00387487152727539,0.259115999890658,-0.326480075214826, + -0.000110530375432516,-0.00320178759806744,0.274397876850968,-0.351009056607751, + -0.00011528595753485,-0.00252870366885904,0.289679753811278,-0.375538038000677, + -0.000120041539637072,-0.00185561973965109,0.304961630771587,-0.400067019393602, + -0.000124797121740072,-0.00118253581044359,0.320243507731897,-0.424596000786527, + -0.000129552703841962,-0.000509451881234746,0.335525384692207,-0.449124982179453, + -0.000134308285944407,0.000163632047972984,0.350807261652516,-0.473653963572378, + -0.000139063868047185,0.000836715977180935,0.366089138612826,-0.498182944965303, + -0.000143819450149629,0.00150979990638889,0.381371015573136,-0.522711926358228, + -0.000148575032251963,0.0021828838355975,0.396652892533446,-0.547240907751154, + -0.00015333061435463,0.00285596776480501,0.411934769493755,-0.571769889144079, + -0.000158086196456964,0.00352905169401296,0.427216646454065,-0.596298870537004, + -0.000162841778559852,0.00420213562322047,0.442498523414374,-0.62082785192993, + -0.000167597360662075,0.00487521955242931,0.457780400374685,-0.645356833322855, + -0.000172352942764409,0.00554830348163726,0.473062277334994,-0.66988581471578, + -0.000177108524866965,0.00622138741084477,0.488344154295304,-0.694414796108706, + -6.25212171991851e-05,-0.00988116932849398,0.121441629470806,-0.105860539473836, + -6.72150409196381e-05,-0.00920973978907358,0.136679928207829,-0.130420880930384, + -7.1908864640341e-05,-0.00853831024965357,0.151918226944851,-0.154981222386931, + -7.6602688361016e-05,-0.00786688071023356,0.167156525681874,-0.179541563843478, + -8.12965120814968e-05,-0.00719545117081322,0.182394824418896,-0.204101905300026, + -8.59903358020331e-05,-0.00652402163139298,0.197633123155919,-0.228662246756573, + -9.06841595224583e-05,-0.00585259209197264,0.212871421892942,-0.25322258821312, + -9.53779832431056e-05,-0.00518116255255241,0.228109720629964,-0.277782929669668, + -0.000100071806963364,-0.00450973301313162,0.243348019366987,-0.302343271126215, + -0.000104765630684178,-0.00383830347371217,0.258586318104009,-0.326903612582762, + -0.000109459454404603,-0.00316687393429138,0.273824616841032,-0.351463954039309, + -0.000114153278125251,-0.00249544439487148,0.289062915578055,-0.376024295495857, + -0.000118847101845843,-0.00182401485545158,0.304301214315077,-0.400584636952404, + -0.000123540925566545,-0.00115258531603146,0.319539513052099,-0.425144978408951, + -0.000128234749287026,-0.000481155776610898,0.334777811789122,-0.449705319865499, + -0.000132928573007951,0.000190273762809001,0.350016110526145,-0.474265661322046, + -0.000137622396728099,0.000861703302229566,0.365254409263168,-0.498826002778593, + -0.000142316220448691,0.00153313284164946,0.38049270800019,-0.523386344235141, + -0.00014701004416906,0.00220456238107047,0.395731006737213,-0.547946685691688, + -0.00015170386788943,0.00287599192049059,0.410969305474235,-0.572507027148235, + -0.000156397691610133,0.00354742145991072,0.426207604211258,-0.597067368604782, + -0.000161091515330503,0.00421885099933128,0.441445902948281,-0.62162771006133, + -0.000165785339051427,0.00489028053875096,0.456684201685303,-0.646188051517877, + -0.000170479162772241,0.00556171007817108,0.471922500422326,-0.670748392974424, + -0.000175172986492944,0.00623313961759075,0.487160799159348,-0.695308734430971, + -6.18977128422071e-05,-0.00981079287236147,0.121252355724612,-0.106054555342661, + -6.65071626657632e-05,-0.009141702933808,0.136430705448179,-0.13065795757759, + -7.11166124893192e-05,-0.00847261299525459,0.151609055171746,-0.155261359812518, + -7.57260623130973e-05,-0.00780352305670173,0.166787404895312,-0.179864762047447, + -8.03355121364868e-05,-0.0071344331181481,0.181965754618879,-0.204468164282375, + -8.49449619601539e-05,-0.00646534317959502,0.197144104342446,-0.229071566517304, + -8.95544117838765e-05,-0.00579625324104172,0.212322454066012,-0.253674968752232, + -9.41638616073215e-05,-0.00512716330248808,0.227500803789579,-0.278278370987161, + -9.87733114308775e-05,-0.00445807336393478,0.242679153513146,-0.302881773222089, + -0.000103382761254323,-0.00378898342538125,0.257857503236713,-0.327485175457018, + -0.000107992211077879,-0.00311989348682795,0.27303585296028,-0.352088577691946, + -0.000112601660901435,-0.00245080354827487,0.288214202683846,-0.376691979926875, + -0.000117211110725379,-0.00178171360972179,0.303392552407413,-0.401295382161804, + -0.000121820560548769,-0.00111262367116849,0.31857090213098,-0.425898784396732, + -0.000126430010372269,-0.000443533732614743,0.333749251854547,-0.450502186631661, + -0.000131039460196103,0.000225556205937671,0.348927601578113,-0.475105588866589, + -0.000135648910019603,0.000894646144491418,0.36410595130168,-0.499708991101518, + -0.000140258359843437,0.00156373608304428,0.379284301025247,-0.524312393336446, + -0.000144867809666827,0.00223282602159802,0.394462650748814,-0.548915795571375, + -0.000149477259490216,0.00290191596015132,0.40964100047238,-0.573519197806303, + -0.00015408670931405,0.00357100589870463,0.424819350195947,-0.598122600041232, + -0.000158696159137661,0.00424009583725793,0.439997699919514,-0.62272600227616, + -0.000163305608961384,0.00490918577581079,0.45517604964308,-0.647329404511088, + -0.000167915058784551,0.00557827571436498,0.470354399366647,-0.671932806746017, + -0.00017252450860894,0.00624736565291695,0.485532749090214,-0.696536208980946, + -6.10457847530221e-05,-0.00971537180219301,0.120993383697517,-0.106319056823321, + -6.55410138808432e-05,-0.00904959816023088,0.136089797416879,-0.130981163739001, + -7.00362430086365e-05,-0.00838382451826869,0.151186211136242,-0.155643270654681, + -7.45314721367629e-05,-0.00771805087630673,0.166282624855604,-0.180305377570362, + -7.9026701264362e-05,-0.00705227723434443,0.181379038574967,-0.204967484486042, + -8.3521930392183e-05,-0.00638650359238202,0.196475452294329,-0.229629591401722, + -8.80171595203927e-05,-0.00572072995042039,0.211571866013692,-0.254291698317403, + -9.25123886481583e-05,-0.00505495630845831,0.226668279733054,-0.278953805233083, + -9.70076177758683e-05,-0.00438918266649591,0.241764693452417,-0.303615912148763, + -0.000101502846903911,-0.00372340902453394,0.256861107171779,-0.328278019064444, + -0.000105998076032121,-0.0030576353825722,0.271957520891141,-0.352940125980124, + -0.000110493305159665,-0.00239186174060957,0.287053934610504,-0.377602232895804, + -0.000114988534287708,-0.00172608809864805,0.302150348329866,-0.402264339811485, + -0.000119483763415751,-0.00106031445668608,0.317246762049229,-0.426926446727165, + -0.000123978992543461,-0.000394540814723676,0.332343175768591,-0.451588553642845, + -0.000128474221671282,0.000271232827238288,0.347439589487953,-0.476250660558526, + -0.000132969450799325,0.000937006469200252,0.362536003207316,-0.500912767474206, + -0.000137464679927479,0.00160278011116244,0.377632416926678,-0.525574874389886, + -0.000141959909054634,0.00226855375312529,0.392728830646041,-0.550236981305567, + -0.000146455138183121,0.00293432739508637,0.407825244365403,-0.574899088221247, + -0.00015095036731072,0.003600101037049,0.422921658084766,-0.599561195136928, + -0.000155445596438319,0.00426587467901118,0.438018071804128,-0.624223302052608, + -0.000159940825566474,0.00493164832097337,0.453114485523491,-0.648885408968288, + -0.000164436054694406,0.00559742196293511,0.468210899242853,-0.673547515883969, + -0.000168931283822338,0.00626319560489685,0.483307312962215,-0.698209622799649, + -5.98921521896556e-05,-0.00958750637341704,0.12064204552938,-0.10667614793544, + -6.42346775772129e-05,-0.00892644199013992,0.135627461276786,-0.13141750930249, + -6.85772029647147e-05,-0.00826537760686286,0.150612877024192,-0.156158870669541, + -7.291972835205e-05,-0.00760431322358557,0.165598292771598,-0.180900232036592, + -7.72622537394962e-05,-0.00694324884030839,0.180583708519004,-0.205641593403642, + -8.16047791267205e-05,-0.00628218445703088,0.195569124266409,-0.230382954770693, + -8.59473045145553e-05,-0.00562112007375415,0.210554540013815,-0.255124316137744, + -9.02898299017241e-05,-0.00496005569047653,0.225539955761221,-0.279865677504794, + -9.46323552894479e-05,-0.0042989913071998,0.240525371508627,-0.304607038871845, + -9.89748806765056e-05,-0.00363792692392195,0.255510787256033,-0.329348400238896, + -0.000103317406064285,-0.002976862540645,0.270496203003439,-0.354089761605946, + -0.000107659931451454,-0.0023157981573676,0.285481618750845,-0.378831122972997, + -0.000112002456839178,-0.00165473377409064,0.300467034498251,-0.403572484340048, + -0.000116344982226346,-0.000993669390813468,0.315452450245656,-0.428313845707098, + -0.000120687507614403,-0.000332605007536735,0.330437865993062,-0.453055207074149, + -0.000125030033001017,0.000328459375741552,0.345423281740468,-0.4777965684412, + -0.000129372558388852,0.000989523759018063,0.360408697487874,-0.502537929808251, + -0.000133715083776242,0.00165058814229546,0.37539411323528,-0.527279291175301, + -0.000138057609163633,0.00231165252557264,0.390379528982685,-0.552020652542352, + -0.000142400134551246,0.00297271690884982,0.405364944730091,-0.576762013909403, + -0.000146742659938637,0.00363378129212766,0.420350360477498,-0.601503375276453, + -0.000151085185326139,0.00429484567540417,0.435335776224903,-0.626244736643504, + -0.000155427710713751,0.00495591005868112,0.450321191972309,-0.650986098010554, + -0.000159770236100587,0.00561697444195897,0.465306607719715,-0.675727459377605, + -0.000164112761488311,0.00627803882523637,0.480292023467121,-0.700468820744656, + -5.8348834089228e-05,-0.00941885030773526,0.120170863833363,-0.107151938233032, + -6.24906356596067e-05,-0.00876447526894952,0.135007706822138,-0.131998898697129, + -6.66324372299021e-05,-0.0081101002301639,0.149844549810914,-0.156845859161226, + -7.0774238800253e-05,-0.00745572519137827,0.164681392799689,-0.181692819625323, + -7.49160403704097e-05,-0.00680135015259253,0.179518235788465,-0.20653978008942, + -7.90578419407328e-05,-0.00614697511380669,0.194355078777241,-0.231386740553517, + -8.31996435113336e-05,-0.00549260007502139,0.209191921766016,-0.256233701017614, + -8.73414450815457e-05,-0.00483822503623554,0.224028764754792,-0.281080661481711, + -9.14832466518689e-05,-0.00418384999745003,0.238865607743567,-0.305927621945808, + -9.5625048221859e-05,-0.00352947495866363,0.253702450732343,-0.330774582409905, + -9.97668497922377e-05,-0.00287509991987811,0.268539293721119,-0.355621542874002, + -0.000103908651362561,-0.0022207248810926,0.283376136709894,-0.380468503338099, + -0.000108050452932607,-0.00156634984230664,0.29821297969867,-0.405315463802196, + -0.000112192254502985,-0.000911974803520899,0.313049822687446,-0.430162424266293, + -0.000116334056073586,-0.000257599764735605,0.327886665676221,-0.45500938473039, + -0.000120475857643632,0.000396775274050354,0.342723508664997,-0.479856345194487, + -0.000124617659214232,0.00105115031283565,0.357560351653772,-0.504703305658584, + -0.0001287594607845,0.00170552535162138,0.372397194642548,-0.529550266122681, + -0.000132901262354546,0.00235990039040757,0.387234037631324,-0.554397226586777, + -0.000137043063925257,0.00301427542919264,0.402070880620099,-0.579244187050875, + -0.000141184865494748,0.00366865046797926,0.416907723608875,-0.604091147514971, + -0.000145326667065682,0.00432302550676456,0.43174456659765,-0.628938107979068, + -0.000149468468635949,0.00497740054555029,0.446581409586426,-0.653785068443165, + -0.000153610270206439,0.00563177558433559,0.461418252575202,-0.678632028907262, + -0.000157752071776374,0.00628615062312221,0.476255095563977,-0.703478989371359, + -5.63174605223149e-05,-0.00920099165407712,0.119548666053613,-0.10777489048742, + -6.02013293527492e-05,-0.00855609208950081,0.134189810952349,-0.132760111853219, + -6.40851981831558e-05,-0.00791119252492445,0.148830955851085,-0.157745333219018, + -6.79690670135624e-05,-0.00726629296034842,0.163472100749821,-0.182730554584817, + -7.18529358439413e-05,-0.00662139339577195,0.178113245648558,-0.207715775950616, + -7.57368046744866e-05,-0.00597649383119592,0.192754390547294,-0.232700997316415, + -7.96206735047544e-05,-0.00533159426661944,0.20739553544603,-0.257686218682214, + -8.35045423352998e-05,-0.00468669470204341,0.222036680344766,-0.282671440048013, + -8.73884111656231e-05,-0.00404179513746716,0.236677825243503,-0.307656661413812, + -9.12722799961685e-05,-0.00339689557289113,0.251318970142239,-0.332641882779611, + -9.51561488269359e-05,-0.00275199600831511,0.265960115040975,-0.35762710414541, + -9.90400176567041e-05,-0.00210709644373797,0.280601259939712,-0.382612325511209, + -0.000102923886487694,-0.00146219687916305,0.295242404838447,-0.407597546877008, + -0.000106807755317906,-0.00081729731458613,0.309883549737184,-0.432582768242807, + -0.000110691624148562,-0.0001723977500101,0.32452469463592,-0.457567989608606, + -0.000114575492978775,0.000472501814566373,0.339165839534656,-0.482553210974405, + -0.00011845936180932,0.0011174013791424,0.353806984433392,-0.507538432340204, + -0.000122343230639532,0.00176230094371865,0.368448129332128,-0.532523653706003, + -0.000126227099469967,0.0024072005082949,0.383089274230864,-0.557508875071802, + -0.000130110968300734,0.00305210007287071,0.397730419129601,-0.582494096437601, + -0.000133994837131057,0.00369699963744763,0.412371564028337,-0.6074793178034, + -0.000137878705961714,0.00434189920202321,0.427012708927073,-0.6324645391692, + -0.000141762574792148,0.00498679876659924,0.441653853825809,-0.657449760534998, + -0.000145646443622138,0.0056316983311766,0.456294998724546,-0.682434981900797, + -0.000149530312452351,0.00627659789575219,0.470936143623282,-0.707420203266596, + -5.37001857960906e-05,-0.00892710193971546,0.118743687487011,-0.108572101661111, + -5.72623515026072e-05,-0.00829551638681869,0.133132453292541,-0.133734259758329, + -6.08245172088462e-05,-0.00766393083392147,0.14752121909807,-0.158896417855547, + -6.43866829152517e-05,-0.00703234528102437,0.1619099849036,-0.184058575952765, + -6.79488486214352e-05,-0.00640075972812737,0.176298750709129,-0.209220734049983, + -7.15110143278408e-05,-0.00576917417523037,0.190687516514659,-0.234382892147201, + -7.50731800343574e-05,-0.0051375886223336,0.205076282320188,-0.259545050244419, + -7.86353457406519e-05,-0.0045060030694366,0.219465048125718,-0.284707208341637, + -8.21975114469464e-05,-0.0038744175165395,0.233853813931247,-0.309869366438855, + -8.5759677153241e-05,-0.00324283196364239,0.248242579736777,-0.335031524536073, + -8.9321842859702e-05,-0.0026112464107455,0.262631345542306,-0.360193682633291, + -9.28840085657745e-05,-0.00197966085784795,0.277020111347836,-0.38535584073051, + -9.64461742721801e-05,-0.00134807530495129,0.291408877153366,-0.410517998827728, + -0.000100008339978697,-0.000716489752054184,0.305797642958895,-0.435680156924946, + -0.000103570505685102,-8.49041991572985e-05,0.320186408764425,-0.460842315022164, + -0.000107132671391619,0.000546681353739142,0.334575174569954,-0.486004473119382, + -0.000110694837098024,0.00117826690663647,0.348963940375484,-0.5111666312166, + -0.000114257002804541,0.00180985245953291,0.363352706181013,-0.536328789313818, + -0.000117819168510502,0.00244143801243069,0.377741471986543,-0.561490947411036, + -0.000121381334216908,0.00307302356532757,0.392130237792072,-0.586653105508254, + -0.000124943499923313,0.00370460911822468,0.406519003597602,-0.611815263605472, + -0.000128505665629497,0.00433619467112178,0.420907769403132,-0.63697742170269, + -0.00013206783133568,0.00496778022401889,0.435296535208661,-0.662139579799908, + -0.000135629997041975,0.005599365776916,0.44968530101419,-0.687301737897126, + -0.000139192162749269,0.00623095132981177,0.46407406681972,-0.712463895994345, + -5.04194275811609e-05,-0.00859436858308127,0.117729450459499,-0.109563016714011, + -5.35954980609432e-05,-0.00798119474293357,0.131801481508245,-0.134945103076613, + -5.6771568540559e-05,-0.00736802090278554,0.14587351255699,-0.160327189439214, + -5.99476390202303e-05,-0.00675484706263751,0.159945543605736,-0.185709275801816, + -6.31237094999015e-05,-0.0061416732224896,0.174017574654482,-0.211091362164417, + -6.62997799796838e-05,-0.0055284993823419,0.188089605703227,-0.236473448527019, + -6.94758504594106e-05,-0.00491532554219376,0.202161636751973,-0.26185553488962, + -7.26519209392484e-05,-0.00430215170204606,0.216233667800718,-0.287237621252222, + -7.58279914190307e-05,-0.00368897786189848,0.230305698849464,-0.312619707614823, + -7.90040618981469e-05,-0.00307580402174956,0.24437772989821,-0.338001793977425, + -8.21801323784843e-05,-0.00246263018160287,0.258449760946955,-0.363383880340026, + -8.5356202857878e-05,-0.00184945634145417,0.272521791995701,-0.388765966702628, + -8.85322733373828e-05,-0.00123628250130636,0.286593823044446,-0.41414805306523, + -9.17083438173316e-05,-0.000623108661158556,0.300665854093192,-0.439530139427831, + -9.48844142971694e-05,-9.93482101030452e-06,0.314737885141938,-0.464912225790433, + -9.80604847767852e-05,0.000603239019137281,0.328809916190683,-0.490294312153034, + -0.000101236555256401,0.00121641285928531,0.342881947239428,-0.515676398515636, + -0.000104412625736128,0.00182958669943356,0.356953978288174,-0.541058484878237, + -0.000107588696215632,0.00244276053958115,0.371026009336919,-0.566440571240839, + -0.000110764766695914,0.00305593437972851,0.385098040385665,-0.591822657603441, + -0.000113940837175419,0.00366910821987654,0.39917007143441,-0.617204743966042, + -0.000117116907655146,0.00428228206002457,0.413242102483156,-0.642586830328644, + -0.000120292978134873,0.00489545590017215,0.427314133531901,-0.667968916691245, + -0.000123469048614377,0.00550862974032063,0.441386164580647,-0.693351003053847, + -0.000126645119093882,0.00612180358046865,0.455458195629393,-0.718733089416449, + -4.64460278921386e-05,-0.00820674271006061,0.116493502208095,-0.11075103683136, + -4.91805722405425e-05,-0.00761837050000824,0.130181364503788,-0.136396797868077, + -5.19151165888632e-05,-0.00702999828995587,0.143869226799482,-0.162042558904794, + -5.46496609374336e-05,-0.00644162607990362,0.157557089095175,-0.18768831994151, + -5.73842052857265e-05,-0.00585325386985114,0.171244951390868,-0.213334080978227, + -6.01187496341304e-05,-0.00526488165979855,0.184932813686562,-0.238979842014944, + -6.28532939825344e-05,-0.00467650944974629,0.198620675982255,-0.264625603051661, + -6.55878383311048e-05,-0.00408813723969415,0.212308538277948,-0.290271364088377, + -6.83223826792312e-05,-0.00349976502964156,0.225996400573641,-0.315917125125094, + -7.10569270276351e-05,-0.00291139281958896,0.239684262869335,-0.341562886161811, + -7.37914713760945e-05,-0.00232302060953637,0.253372125165028,-0.367208647198527, + -7.65260157243874e-05,-0.00173464839948423,0.267059987460721,-0.392854408235244, + -7.92605600729024e-05,-0.00114627618943186,0.280747849756415,-0.418500169271961, + -8.19951044211953e-05,-0.000557903979379715,0.294435712052108,-0.444145930308678, + -8.47296487699323e-05,3.04682306722093e-05,0.308123574347801,-0.469791691345394, + -8.74641931178921e-05,0.000618840440725466,0.321811436643495,-0.495437452382111, + -9.0198737466296e-05,0.00120721265077783,0.335499298939188,-0.521083213418828, + -9.2933281814811e-05,0.0017955848608302,0.349187161234881,-0.546728974455544, + -9.56678261633259e-05,0.00238395707088235,0.362875023530574,-0.572374735492261, + -9.84023705118409e-05,0.00297232928093427,0.376562885826267,-0.598020496528978, + -0.000101136914860578,0.00356070149098686,0.390250748121961,-0.623666257565694, + -0.00010387145920876,0.00414907370103945,0.403938610417654,-0.649312018602411, + -0.000106606003557275,0.00473744591109115,0.417626472713347,-0.674957779639128, + -0.000109340547905235,0.00532581812114419,0.43131433500904,-0.700603540675844, + -0.000112075092253416,0.00591419033119722,0.445002197304734,-0.726249301712561, + -4.18297581402938e-05,-0.00777687143813749,0.115047391134535,-0.11211525475144, + -4.40881495395451e-05,-0.00722065799464855,0.128288147089261,-0.138063796616735, + -4.63465409387964e-05,-0.00666444455115955,0.141528903043987,-0.16401233848203, + -4.86049323382143e-05,-0.00610823110767067,0.154769658998713,-0.189960880347325, + -5.08633237373823e-05,-0.00555201766418167,0.168010414953439,-0.21590942221262, + -5.31217151366059e-05,-0.00499580422069246,0.181251170908165,-0.241857964077916, + -5.53801065355519e-05,-0.00443959077720324,0.194491926862891,-0.267806505943211, + -5.76384979351641e-05,-0.0038833773337148,0.207732682817617,-0.293755047808506, + -5.98968893344987e-05,-0.00332716389022569,0.220973438772344,-0.319703589673801, + -6.21552807334447e-05,-0.00277095044673636,0.23421419472707,-0.345652131539097, + -6.44136721326682e-05,-0.00221473700324726,0.247454950681796,-0.371600673404392, + -6.66720635322804e-05,-0.0016585235597586,0.260695706636522,-0.397549215269687, + -6.89304549309488e-05,-0.00110231011626927,0.273936462591248,-0.423497757134982, + -7.11888463303945e-05,-0.000546096672780827,0.287177218545974,-0.449446299000277, + -7.34472377298401e-05,1.01167707082794e-05,0.3004179745007,-0.475394840865573, + -7.57056291289526e-05,0.000566330214197608,0.313658730455426,-0.501343382730868, + -7.79640205280652e-05,0.00112254365768694,0.326899486410152,-0.527291924596163, + -8.02224119273998e-05,0.00167875710117538,0.340140242364878,-0.553240466461458, + -8.24808033266233e-05,0.00223497054466448,0.353380998319604,-0.579189008326753, + -8.4739194726291e-05,0.00279118398815292,0.36662175427433,-0.605137550192049, + -8.69975861250705e-05,0.00334739743164292,0.379862510229057,-0.631086092057344, + -8.92559775244051e-05,0.00390361087513158,0.393103266183783,-0.657034633922639, + -9.15143689239617e-05,0.0044598243186198,0.406344022138508,-0.682983175787934, + -9.37727603226302e-05,0.00501603776210979,0.419584778093235,-0.708931717653229, + -9.60311517219647e-05,0.0055722512055989,0.432825534047961,-0.734880259518525, + -3.67191166250336e-05,-0.0073257366447137,0.113433942679541,-0.113606353119257, + -3.84979696033683e-05,-0.00680918514886164,0.126178719976784,-0.139885836245955, + -4.02768225816474e-05,-0.00629263365300958,0.138923497274027,-0.166165319372653, + -4.20556755598711e-05,-0.00577608215715764,0.15166827457127,-0.192444802499352, + -4.38345285381225e-05,-0.00525953066130547,0.164413051868513,-0.21872428562605, + -4.5613381516374e-05,-0.00474297916545308,0.177157829165756,-0.245003768752748, + -4.73922344947364e-05,-0.00422642766960135,0.189902606462999,-0.271283251879447, + -4.91710874727658e-05,-0.00370987617374885,0.202647383760242,-0.297562735006145, + -5.09499404511837e-05,-0.00319332467789701,0.215392161057485,-0.323842218132843, + -5.27287934293796e-05,-0.00267677318204451,0.228136938354728,-0.350121701259542, + -5.45076464076866e-05,-0.00216022168619268,0.24088171565197,-0.37640118438624, + -5.62864993864931e-05,-0.00164367019034106,0.253626492949213,-0.402680667512938, + -5.80653523644115e-05,-0.00112711869448856,0.266371270246456,-0.428960150639636, + -5.98442053427739e-05,-0.000610567198636502,0.279116047543699,-0.455239633766335, + -6.16230583205812e-05,-9.40157027837785e-05,0.291860824840942,-0.481519116893033, + -6.34019112990547e-05,0.000422535793068279,0.304605602138186,-0.507798600019731, + -6.51807642774171e-05,0.000939087288919893,0.317350379435428,-0.53407808314643, + -6.69596172556686e-05,0.0014556387847724,0.330095156732671,-0.560357566273128, + -6.8738470234031e-05,0.00197219028062401,0.342839934029914,-0.586637049399826, + -7.05173232119494e-05,0.00248874177647673,0.355584711327157,-0.612916532526524, + -7.22961761907559e-05,0.00300529327232768,0.368329488624399,-0.639196015653223, + -7.40750291690073e-05,0.00352184476817996,0.381074265921642,-0.665475498779921, + -7.58538821471477e-05,0.00403839626403224,0.393819043218885,-0.691754981906619, + -7.76327351259543e-05,0.00455494775988408,0.406563820516128,-0.718034465033317, + -7.94115881033175e-05,0.00507149925573724,0.419308597813372,-0.744313948160016, + -3.13549085854958e-05,-0.0068791841975252,0.111726695670886,-0.115150719626607, + -3.26862352426349e-05,-0.0064086962548392,0.123949750500439,-0.141772966591723, + -3.40175619001626e-05,-0.00593820831215364,0.136172805329992,-0.168395213556839, + -3.53488885571629e-05,-0.00546772036946741,0.148395860159545,-0.195017460521955, + -3.66802152145795e-05,-0.00499723242678152,0.160618914989097,-0.22163970748707, + -3.80115418720517e-05,-0.00452674448409573,0.17284196981865,-0.248261954452186, + -3.93428685289687e-05,-0.00405625654140951,0.185065024648203,-0.274884201417302, + -4.06741951866074e-05,-0.00358576859872439,0.197288079477756,-0.301506448382418, + -4.200552184358e-05,-0.00311528065603772,0.209511134307309,-0.328128695347534, + -4.33368485008301e-05,-0.00264479271335216,0.221734189136861,-0.35475094231265, + -4.46681751583022e-05,-0.00217430477066638,0.233957243966414,-0.381373189277765, + -4.59995018154968e-05,-0.00170381682798015,0.246180298795967,-0.407995436242881, + -4.733082847308e-05,-0.00123332888529482,0.25840335362552,-0.434617683207997, + -4.86621551304411e-05,-0.000762840942609033,0.270626408455073,-0.461239930173113, + -4.99934817871361e-05,-0.000292352999922585,0.282849463284626,-0.487862177138229, + -5.13248084446083e-05,0.000178134942763419,0.295072518114179,-0.514484424103345, + -5.26561351020804e-05,0.000648622885449202,0.307295572943732,-0.541106671068461, + -5.39874617587754e-05,0.00111911082813543,0.319518627773284,-0.567728918033576, + -5.53187884164696e-05,0.00158959877082121,0.331741682602837,-0.594351164998692, + -5.66501150739418e-05,0.00206008671350677,0.34396473743239,-0.620973411963808, + -5.79814417306368e-05,0.002530574656193,0.356187792261943,-0.647595658928924, + -5.93127683879979e-05,0.00300106259887878,0.368410847091495,-0.67421790589404, + -6.06440950461362e-05,0.00347155054156367,0.380633901921048,-0.700840152859155, + -6.19754217027202e-05,0.00394203848425034,0.392856956750601,-0.727462399824271, + -6.33067483596372e-05,0.00441252642693746,0.405080011580155,-0.754084646789387, + -2.60307091927425e-05,-0.00646224896747605,0.110018582726155,-0.116663596750258, + -2.69766889140211e-05,-0.00604182010861598,0.121722634733857,-0.143621618654476, + -2.7922668635133e-05,-0.00562139124975558,0.13342668674156,-0.170579640558694, + -2.88686483561618e-05,-0.00520096239089529,0.145130738749262,-0.197537662462911, + -2.98146280773848e-05,-0.00478053353203534,0.156834790756964,-0.224495684367129, + -3.07606077985523e-05,-0.00436010467317494,0.168538842764666,-0.251453706271347, + -3.17065875199973e-05,-0.00393967581431509,0.180242894772368,-0.278411728175565, + -3.26525672407763e-05,-0.00351924695545458,0.191946946780071,-0.305369750079783, + -3.35985469621103e-05,-0.00309881809659429,0.203650998787773,-0.332327771984, + -3.45445266833888e-05,-0.00267838923773422,0.215355050795475,-0.359285793888218, + -3.54905064045008e-05,-0.00225796037887416,0.227059102803177,-0.386243815792436, + -3.64364861255018e-05,-0.00183753152001342,0.23876315481088,-0.413201837696654, + -3.73824658466138e-05,-0.00141710266115314,0.250467206818582,-0.440159859600872, + -3.83284455679478e-05,-0.000996673802293291,0.262171258826284,-0.46711788150509, + -3.92744252892818e-05,-0.000576244943433446,0.273875310833986,-0.494075903409308, + -4.02204050102828e-05,-0.000155816084572935,0.285579362841688,-0.521033925313525, + -4.11663847311727e-05,0.000264612774287576,0.297283414849391,-0.547991947217743, + -4.21123644527288e-05,0.000685041633147865,0.308987466857093,-0.574949969121961, + -4.30583441738408e-05,0.00110547049200793,0.320691518864795,-0.601907991026179, + -4.40043238946197e-05,0.00152589935086844,0.332395570872497,-0.628866012930397, + -4.49503036163978e-05,0.00194632820972718,0.344099622880199,-0.655824034834615, + -4.58962833372878e-05,0.00236675706858813,0.355803674887901,-0.682782056738832, + -4.68422630587328e-05,0.0027871859274482,0.367507726895604,-0.70974007864305, + -4.77882427791787e-05,0.00320761478630915,0.379211778903306,-0.736698100547268, + -4.87342225002907e-05,0.00362804364516967,0.390915830911009,-0.763656122451486, + -2.10314592080929e-05,-0.00609374080828951,0.108402638682531,-0.118066882661525, + -2.16712753431936e-05,-0.00572412522208843,0.119618278202666,-0.145336356324801, + -2.23110914782942e-05,-0.00535450963588713,0.1308339177228,-0.172605829988076, + -2.29509076133394e-05,-0.00498489404968572,0.142049557242935,-0.199875303651351, + -2.35907237484678e-05,-0.00461527846348464,0.15326519676307,-0.227144777314626, + -2.42305398835407e-05,-0.00424566287728301,0.164480836283205,-0.254414250977901, + -2.48703560185581e-05,-0.00387604729108204,0.175696475803339,-0.281683724641176, + -2.55101721538531e-05,-0.00350643170488096,0.186912115323474,-0.308953198304451, + -2.6149988288815e-05,-0.00313681611867933,0.198127754843609,-0.336222671967726, + -2.67898044238324e-05,-0.00276720053247792,0.209343394363743,-0.363492145631001, + -2.74296205591273e-05,-0.00239758494627673,0.220559033883878,-0.390761619294276, + -2.80694366939782e-05,-0.00202796936007554,0.231774673404012,-0.418031092957551, + -2.87092528290511e-05,-0.00165835377387391,0.242990312924148,-0.445300566620827, + -2.93490689644571e-05,-0.00128873818767317,0.254205952444282,-0.472570040284102, + -2.9988885099419e-05,-0.000919122601471978,0.265421591964417,-0.499839513947377, + -3.06287012343809e-05,-0.000549507015270567,0.276637231484551,-0.527108987610652, + -3.12685173700089e-05,-0.000179891429070045,0.287852871004686,-0.554378461273927, + -3.19083335046377e-05,0.000189724157132032,0.299068510524821,-0.581647934937202, + -3.25481496394886e-05,0.000559339743333886,0.310284150044956,-0.608917408600477, + -3.31879657751166e-05,0.000928955329534631,0.32149978956509,-0.636186882263752, + -3.38277819096344e-05,0.00129857091573626,0.332715429085225,-0.663456355927027, + -3.44675980448184e-05,0.00166818650193745,0.34393106860536,-0.690725829590302, + -3.51074141802243e-05,0.00203780208813775,0.355146708125494,-0.717995303253577, + -3.57472303149642e-05,0.00240741767434072,0.36636234764563,-0.745264776916852, + -3.63870464499261e-05,0.00277703326054146,0.377577987165764,-0.772534250580128, + -1.65758040944763e-05,-0.00578344312304624,0.106952708469109,-0.119304118994317, + -1.6990122348931e-05,-0.0054621357738901,0.117732136048038,-0.146848190605967, + -1.74044406033302e-05,-0.00514082842473396,0.128511563626968,-0.174392262217617, + -1.78187588577017e-05,-0.00481952107557782,0.139290991205897,-0.201936333829267, + -1.82330771119621e-05,-0.00449821372642145,0.150070418784826,-0.229480405440917, + -1.86473953663335e-05,-0.00417690637726531,0.160849846363755,-0.257024477052567, + -1.90617136206495e-05,-0.00385559902810917,0.171629273942684,-0.284568548664217, + -1.94760318754095e-05,-0.00353429167895336,0.182408701521614,-0.312112620275867, + -1.98903501293923e-05,-0.00321298432979655,0.193188129100543,-0.339656691887517, + -2.03046683838748e-05,-0.00289167698064086,0.203967556679472,-0.367200763499167, + -2.07189866382462e-05,-0.00257036963148471,0.214746984258401,-0.394744835110817, + -2.11333048927287e-05,-0.00224906228232857,0.225526411837331,-0.422288906722467, + -2.15476231468781e-05,-0.00192775493317199,0.23630583941626,-0.449832978334117, + -2.19619414013605e-05,-0.00160644758401629,0.247085266995189,-0.477377049945767, + -2.2376259655732e-05,-0.00128514023485971,0.257864694574119,-0.504921121557417, + -2.27905779105475e-05,-0.000963832885704674,0.268644122153047,-0.532465193169067, + -2.32048961646969e-05,-0.000642525536548089,0.279423549731976,-0.560009264780717, + -2.36192144187353e-05,-0.000321218187390837,0.290202977310906,-0.587553336392367, + -2.40335326733288e-05,8.91617646381349e-08,0.300982404889835,-0.615097408004017, + -2.44478509274781e-05,0.000321396510921002,0.311761832468765,-0.642641479615667, + -2.48621691818496e-05,0.000642703860077365,0.322541260047694,-0.670185551227317, + -2.52764874364431e-05,0.00096401120923284,0.333320687626623,-0.697729622838967, + -2.56908056909255e-05,0.00128531855838965,0.344100115205553,-0.725273694450617, + -2.6105123945297e-05,0.00160662590754557,0.354879542784482,-0.752817766062266, + -2.65194421992243e-05,0.00192793325670149,0.36565897036341,-0.780361837673917, + -1.27851988466487e-05,-0.0055325338806973,0.105712093385572,-0.120347092032078, + -1.30442277671561e-05,-0.00525450996101073,0.116119728993648,-0.148122645898807, + -1.33032566877189e-05,-0.00497648604132428,0.126527364601724,-0.175898199765535, + -1.35622856080042e-05,-0.00469846212163749,0.1369350002098,-0.203673753632264, + -1.38213145283728e-05,-0.00442043820195093,0.147342635817875,-0.231449307498992, + -1.40803434488523e-05,-0.00414241428226414,0.157750271425951,-0.259224861365721, + -1.43393723691654e-05,-0.00386439036257746,0.168157907034027,-0.287000415232449, + -1.45984012895339e-05,-0.00358636644289079,0.178565542642103,-0.314775969099177, + -1.48574302101245e-05,-0.00330834252320455,0.188973178250179,-0.342551522965906, + -1.51164591307151e-05,-0.0030303186035181,0.199380813858255,-0.370327076832634, + -1.53754880508616e-05,-0.00275229468383098,0.209788449466331,-0.398102630699363, + -1.56345169712857e-05,-0.00247427076414453,0.220196085074407,-0.425878184566091, + -1.58935458915987e-05,-0.00219624684445741,0.230603720682483,-0.45365373843282, + -1.61525748119118e-05,-0.00191822292477051,0.24101135629056,-0.481429292299548, + -1.64116037325579e-05,-0.00164019900508472,0.251418991898635,-0.509204846166277, + -1.66706326526489e-05,-0.00136217508539738,0.261826627506711,-0.536980400033005, + -1.6929661573073e-05,-0.00108415116571092,0.272234263114787,-0.564755953899733, + -1.71886904938301e-05,-0.000806127246024246,0.282641898722863,-0.592531507766462, + -1.74477194138101e-05,-0.000528103326337348,0.293049534330939,-0.62030706163319, + -1.77067483342341e-05,-0.000250079406650894,0.303457169939015,-0.648082615499919, + -1.79657772552133e-05,2.79445130351164e-05,0.313864805547091,-0.675858169366647, + -1.82248061755264e-05,0.000305968432722015,0.324272441155167,-0.703633723233375, + -1.84838350959504e-05,0.000583992352408469,0.334680076763243,-0.731409277100104, + -1.87428640165965e-05,0.000862016272094479,0.345087712371318,-0.759184830966833, + -1.90018929370206e-05,0.00114004019178093,0.355495347979394,-0.786960384833561, + -9.68577017024241e-06,-0.0053360922584294,0.104692886225837,-0.121193558443921, + -9.84367642783979e-06,-0.00509492241656495,0.114796041205658,-0.149156980977209, + -1.00015826854094e-05,-0.00485375257470044,0.12489919618548,-0.177120403510496, + -1.01594889428958e-05,-0.00461258273283627,0.135002351165301,-0.205083826043784, + -1.03173952006874e-05,-0.00437141289097198,0.145105506145123,-0.233047248577072, + -1.04753014579795e-05,-0.00413024304910736,0.155208661124944,-0.261010671110359, + -1.06332077154936e-05,-0.00388907320724252,0.165311816104766,-0.288974093643647, + -1.07911139729522e-05,-0.00364790336537824,0.175414971084587,-0.316937516176935, + -1.09490202308549e-05,-0.00340673352351439,0.185518126064408,-0.344900938710223, + -1.11069264882024e-05,-0.00316556368164944,0.19562128104423,-0.37286436124351, + -1.12648327459386e-05,-0.00292439383978538,0.205724436024051,-0.400827783776798, + -1.14227390032307e-05,-0.00268322399792087,0.215827591003873,-0.428791206310086, + -1.15806452609668e-05,-0.00244205415605614,0.225930745983695,-0.456754628843373, + -1.17385515185919e-05,-0.0022008843141923,0.236033900963516,-0.484718051376661, + -1.18964577762171e-05,-0.00195971447232801,0.246137055943337,-0.512681473909949, + -1.20543640338422e-05,-0.0017185446304635,0.256240210923159,-0.540644896443237, + -1.22122702916894e-05,-0.00147737478859966,0.26634336590298,-0.568608318976524, + -1.23701765487594e-05,-0.00123620494673449,0.276446520882802,-0.596571741509812, + -1.25280828060514e-05,-0.000995035104869757,0.286549675862623,-0.6245351640431, + -1.26859890642317e-05,-0.000753865263006137,0.296652830842444,-0.652498586576387, + -1.28438953214127e-05,-0.000512695421141185,0.306755985822266,-0.680462009109675, + -1.30018015789268e-05,-0.000271525579276233,0.316859140802088,-0.708425431642963, + -1.3159707836996e-05,-3.0355737413057e-05,0.326962295781909,-0.736388854176251, + -1.33176140946212e-05,0.000210814104451451,0.33706545076173,-0.764352276709538, + -1.34755203520243e-05,0.000451983946315959,0.347168605741552,-0.792315699242826, + -7.2325036896137e-06,-0.00518605697630781,0.103883116689497,-0.121859629957562, + -7.32735110889338e-06,-0.00497497609359365,0.113744955782084,-0.149970883480184, + -7.42219852797876e-06,-0.00476389521087928,0.12360679487467,-0.178082137002806, + -7.51704594720293e-06,-0.00455281432816523,0.133468633967257,-0.206193390525428, + -7.61189336639934e-06,-0.00434173344545075,0.143330473059844,-0.23430464404805, + -7.70674078554023e-06,-0.00413065256273648,0.153192312152431,-0.262415897570672, + -7.8015882050142e-06,-0.00391957168002266,0.163054151245017,-0.290527151093294, + -7.89643562409958e-06,-0.00370849079730817,0.172915990337604,-0.318638404615916, + -7.99128304357355e-06,-0.00349740991459435,0.18277782943019,-0.346749658138538, + -8.08613046243689e-06,-0.00328632903187964,0.192639668522777,-0.37486091166116, + -8.18097788191086e-06,-0.00307524814916582,0.202501507615364,-0.402972165183782, + -8.27582530082971e-06,-0.00286416726645156,0.21236334670795,-0.431083418706404, + -8.37067272030367e-06,-0.00265308638373751,0.222225185800537,-0.459194672229025, + -8.46552013933355e-06,-0.00244200550102325,0.232087024893123,-0.487305925751648, + -8.5603675582524e-06,-0.00223092461830832,0.241948863985711,-0.515417179274269, + -8.65521497794841e-06,-0.00201984373559494,0.251810703078297,-0.543528432796891, + -8.75006239686726e-06,-0.00180876285288023,0.261672542170884,-0.571639686319513, + -8.84490981600816e-06,-0.00159768197016574,0.271534381263471,-0.599750939842135, + -8.93975723492701e-06,-0.00138660108745103,0.281396220356057,-0.627862193364757, + -9.03460465440098e-06,-0.00117552020473699,0.291258059448644,-0.655973446887379, + -9.1294520736529e-06,-0.000964439322022947,0.301119898541231,-0.684084700410001, + -9.22429949312686e-06,-0.000753358439308904,0.310981737633817,-0.712195953932623, + -9.31914691215674e-06,-0.000542277556595305,0.320843576726404,-0.740307207455245, + -9.41399433107559e-06,-0.000331196673879486,0.330705415818991,-0.768418460977867, + -9.50884175066058e-06,-0.000120115791166331,0.340567254911577,-0.796529714500489, + -5.34007546679205e-06,-0.00507356282331128,0.103256638053844,-0.122371115145682, + -5.39678075442418e-06,-0.00488623968474178,0.112932136346901,-0.150595890054283, + -5.45348604188978e-06,-0.00469891654617194,0.122607634639959,-0.178820664962884, + -5.51019132954966e-06,-0.00451159340760265,0.132283132933017,-0.207045439871485, + -5.56689661695975e-06,-0.0043242702690327,0.141958631226075,-0.235270214780086, + -5.62360190464739e-06,-0.00413694713046309,0.151634129519133,-0.263494989688686, + -5.68030719250157e-06,-0.00394962399189414,0.16130962781219,-0.291719764597287, + -5.73701247985614e-06,-0.00376230085332385,0.170985126105248,-0.319944539505888, + -5.79371776743276e-06,-0.00357497771475446,0.180660624398306,-0.348169314414489, + -5.85042305523142e-06,-0.00338765457618506,0.190336122691364,-0.37639408932309, + -5.90712834280804e-06,-0.00320033143761544,0.200011620984422,-0.404618864231691, + -5.96383363049569e-06,-0.00301300829904583,0.209687119277479,-0.432843639140292, + -6.02053891785026e-06,-0.00282568516047577,0.219362617570537,-0.461068414048892, + -6.07724420587097e-06,-0.00263836202190704,0.229038115863595,-0.489293188957493, + -6.13394949333657e-06,-0.0024510388833372,0.238713614156653,-0.517517963866094, + -6.19065478102421e-06,-0.00226371574476758,0.248389112449711,-0.545742738774695, + -6.24736006860083e-06,-0.00207639260619819,0.258064610742768,-0.573967513683296, + -6.3040653559554e-06,-0.00188906946762835,0.267740109035826,-0.602192288591897, + -6.36077064286589e-06,-0.0017017463290574,0.277415607328884,-0.630417063500498, + -6.41747593155273e-06,-0.00151442319048956,0.287091105621942,-0.658641838409098, + -6.47418121857424e-06,-0.00132710005191905,0.296766603915,-0.686866613317699, + -6.53088650603983e-06,-0.00113977691334988,0.306442102208057,-0.7150913882263, + -6.58759179406054e-06,-0.00095245377478026,0.316117600501115,-0.743316163134901, + -6.64429708141512e-06,-0.000765130636210642,0.325793098794173,-0.771540938043502, + -6.70100236921378e-06,-0.000577807497641025,0.335468597087231,-0.799765712952103, + -3.90904127570146e-06,-0.00499034883416188,0.102781846791002,-0.12275657864062, + -3.94309277224059e-06,-0.00482130462420516,0.112316323756452,-0.151066905098329, + -3.97714426855766e-06,-0.00465226041424815,0.121850800721901,-0.179377231556038, + -4.01119576504128e-06,-0.0044832162042916,0.13138527768735,-0.207687558013747, + -4.04524726149713e-06,-0.00431417199433459,0.140919754652799,-0.235997884471456, + -4.07929875795299e-06,-0.00414512778437792,0.150454231618248,-0.264308210929165, + -4.11335025451987e-06,-0.00397608357442136,0.159988708583697,-0.292618537386874, + -4.14740175075368e-06,-0.00380703936446403,0.169523185549146,-0.320928863844583, + -4.1814532475426e-06,-0.0036379951545078,0.179057662514595,-0.349239190302292, + -4.21550474383192e-06,-0.00346895094455069,0.188592139480044,-0.377549516760001, + -4.24955624012124e-06,-0.00329990673459335,0.198126616445493,-0.40585984321771, + -4.28360773652159e-06,-0.0031308625246369,0.207661093410942,-0.434170169675419, + -4.31765923269989e-06,-0.00296181831467934,0.217195570376391,-0.462480496133128, + -4.35171072910023e-06,-0.00279277410472245,0.226730047341841,-0.490790822590837, + -4.38576222550058e-06,-0.002623729894766,0.236264524307289,-0.519101149048546, + -4.41981372201194e-06,-0.00245468568480933,0.245799001272738,-0.547411475506255, + -4.45386521885638e-06,-0.00228564147485288,0.255333478238187,-0.575721801963964, + -4.48791671492366e-06,-0.00211659726489577,0.264867955203636,-0.604032128421673, + -4.521968211324e-06,-0.00194755305493866,0.274402432169085,-0.632342454879382, + -4.55601970794639e-06,-0.00177850884498199,0.283936909134535,-0.660652781337091, + -4.59007120434674e-06,-0.00160946463502487,0.293471386099984,-0.6889631077948, + -4.62412270096912e-06,-0.00144042042506864,0.303005863065433,-0.717273434252509, + -4.65817419748049e-06,-0.00127137621511197,0.312540340030881,-0.745583760710219, + -4.69222569388084e-06,-0.00110233200515442,0.322074816996331,-0.773894087167927, + -4.72627718983709e-06,-0.000933287795197302,0.33160929396178,-0.802204413625637, + -2.84309424389284e-06,-0.00492939236769374,0.10242759579158,-0.12304297548658, + -2.86378587022185e-06,-0.00477413800038395,0.111856965424429,-0.151416866183584, + -2.88447749688392e-06,-0.00461888363307472,0.121286335057277,-0.179790756880588, + -2.90516912349048e-06,-0.00446362926576527,0.130715704690126,-0.208164647577591, + -2.92586074984724e-06,-0.00430837489845559,0.140145074322974,-0.236538538274595, + -2.94655237625951e-06,-0.00415312053114569,0.149574443955823,-0.264912428971599, + -2.96724400289383e-06,-0.00399786616383646,0.159003813588672,-0.293286319668603, + -2.9879356293061e-06,-0.00384261179652712,0.16843318322152,-0.321660210365607, + -3.00862725571838e-06,-0.00368735742921711,0.177862552854369,-0.35003410106261, + -3.02931888240821e-06,-0.00353210306190799,0.187291922487217,-0.378407991759614, + -3.0500105089315e-06,-0.00337684869459842,0.196721292120066,-0.406781882456618, + -3.07070213556582e-06,-0.00322159432728908,0.206150661752915,-0.435155773153622, + -3.09139376175604e-06,-0.00306633995997907,0.215580031385763,-0.463529663850625, + -3.11208538839036e-06,-0.0029110855926695,0.225009401018612,-0.491903554547629, + -3.13277701480263e-06,-0.00275583122536016,0.234438770651461,-0.520277445244633, + -3.15346864099286e-06,-0.00260057685805037,0.243868140284309,-0.548651335941637, + -3.17416026784922e-06,-0.00244532249074125,0.253297509917158,-0.577025226638641, + -3.1948518942615e-06,-0.00229006812343147,0.262726879550006,-0.605399117335645, + -3.21554352022968e-06,-0.00213481375612101,0.272156249182856,-0.633773008032648, + -3.23623514719706e-06,-0.00197955938881211,0.281585618815704,-0.662146898729652, + -3.2569267739424e-06,-0.00182430502150321,0.291014988448552,-0.690520789426656, + -3.27761840013263e-06,-0.00166905065419254,0.300444358081402,-0.71889468012366, + -3.29831002621184e-06,-0.00151379628688275,0.30987372771425,-0.747268570820663, + -3.31900165273513e-06,-0.00135854191957341,0.319303097347098,-0.775642461517667, + -3.33969327903638e-06,-0.00120328755226318,0.328732466979948,-0.804016352214671, + -2.05796516150603e-06,-0.00488505214499968,0.102166349102288,-0.123253529805505, + -2.07075676403323e-06,-0.00474004941776607,0.111518266397154,-0.151674151900921, + -2.08354836644942e-06,-0.00459504669053246,0.120870183692019,-0.180094773996338, + -2.09633996905989e-06,-0.00445004396329896,0.130222100986884,-0.208515396091754, + -2.10913157144832e-06,-0.00430504123606523,0.13957401828175,-0.23693601818717, + -2.12192317400328e-06,-0.00416003850883184,0.148925935576615,-0.265356640282587, + -2.13471477655824e-06,-0.00401503578159823,0.15827785287148,-0.293777262378003, + -2.14750637872463e-06,-0.00387003305436417,0.167629770166346,-0.32219788447342, + -2.16029798144612e-06,-0.00372503032713078,0.176981687461211,-0.350618506568836, + -2.1730895840566e-06,-0.0035800275998974,0.186333604756076,-0.379039128664252, + -2.18588118605645e-06,-0.00343502487266312,0.195685522050941,-0.407459750759669, + -2.1986727890555e-06,-0.00329002214543039,0.205037439345807,-0.435880372855085, + -2.21146439149944e-06,-0.00314501941819612,0.214389356640672,-0.464300994950502, + -2.22425599416542e-06,-0.00300001669096317,0.223741273935537,-0.492721617045918, + -2.23704759660937e-06,-0.00285501396372934,0.233093191230403,-0.521142239141334, + -2.24983919916433e-06,-0.00271001123649595,0.242445108525268,-0.549562861236751, + -2.26263080149725e-06,-0.00256500850926233,0.251797025820133,-0.577983483332167, + -2.27542240405221e-06,-0.00242000578202872,0.261148943114998,-0.606404105427583, + -2.28821400682921e-06,-0.00227500305479555,0.270500860409863,-0.634824727523, + -2.30100560871804e-06,-0.00213000032756128,0.279852777704729,-0.663245349618416, + -2.31379721193914e-06,-0.00198499760032833,0.289204694999594,-0.691665971713833, + -2.32658881405001e-06,-0.00183999487309405,0.29855661229446,-0.720086593809249, + -2.33938041693804e-06,-0.00169499214586155,0.307908529589324,-0.748507215904666, + -2.35217201871585e-06,-0.00154998941862683,0.31726044688419,-0.776927838000082, + -2.36496362127081e-06,-0.00140498669139344,0.326612364179055,-0.805348460095498, + -1.48444435693618e-06,-0.00485296004430896,0.101975341671248,-0.123407126393293, + -1.49251400780037e-06,-0.00471549649036385,0.111270662757443,-0.151861838425099, + -1.50058365874783e-06,-0.0045780329364189,0.120565983843638,-0.180316550456906, + -1.50865330961203e-06,-0.00444056938247384,0.129861304929834,-0.208771262488712, + -1.51672296055949e-06,-0.00430310582852889,0.139156626016029,-0.237225974520518, + -1.52479261117389e-06,-0.00416564227458338,0.148451947102225,-0.265680686552325, + -1.53286226201033e-06,-0.00402817872063843,0.15774726818842,-0.294135398584131, + -1.54093191312432e-06,-0.00389071516669337,0.167042589274616,-0.322590110615937, + -1.54900156357218e-06,-0.00375325161274787,0.176337910360811,-0.351044822647743, + -1.55707121457516e-06,-0.00361578805880303,0.185633231447007,-0.37949953467955, + -1.56514086557813e-06,-0.00347832450485797,0.194928552533202,-0.407954246711356, + -1.57321051619252e-06,-0.00334086095091291,0.204223873619397,-0.436408958743162, + -1.58128016713999e-06,-0.00320339739696784,0.213519194705593,-0.464863670774968, + -1.58934981797643e-06,-0.00306593384302278,0.222814515791788,-0.493318382806774, + -1.59741946859082e-06,-0.00292847028907728,0.232109836877984,-0.521773094838581, + -1.60548911953828e-06,-0.00279100673513222,0.241405157964179,-0.550227806870387, + -1.61355877048575e-06,-0.00265354318118738,0.250700479050375,-0.578682518902193, + -1.6216284208781e-06,-0.00251607962724143,0.259995800136571,-0.607137230933999, + -1.62969807260271e-06,-0.00237861607329748,0.269291121222766,-0.635591942965806, + -1.63776772243995e-06,-0.00224115251935109,0.278586442308961,-0.664046654997612, + -1.64583737360946e-06,-0.00210368896540647,0.287881763395157,-0.692501367029418, + -1.65390702455692e-06,-0.00196622541146185,0.297177084481352,-0.720956079061224, + -1.66197667539336e-06,-0.00182876185751635,0.306472405567547,-0.749410791093031, + -1.67004632600776e-06,-0.00169129830357084,0.315767726653743,-0.777865503124837, + -1.67811597717726e-06,-0.00155383474962623,0.325063047739938,-0.806320215156643, + -1.06802781960069e-06,-0.0048298157695611,0.101836565852121,-0.123518538352924, + -1.0732272373859e-06,-0.00469785286076918,0.111090784084086,-0.151997977669832, + -1.07842665530988e-06,-0.00456588995197749,0.120345002316051,-0.18047741698674, + -1.0836260731506e-06,-0.00443392704318579,0.129599220548016,-0.208956856303648, + -1.08882549065825e-06,-0.00430196413439365,0.138853438779981,-0.237436295620556, + -1.09402490860999e-06,-0.00417000122560218,0.148107657011946,-0.265915734937464, + -1.09922432633969e-06,-0.00403803831681016,0.157361875243911,-0.294395174254372, + -1.10442374395836e-06,-0.00390607540801846,0.166616093475876,-0.32287461357128, + -1.10962316202112e-06,-0.00377411249922677,0.175870311707841,-0.351354052888188, + -1.11482257997286e-06,-0.00364214959043552,0.185124529939806,-0.379833492205096, + -1.120021997425e-06,-0.00351018668164294,0.194378748171771,-0.408312931522004, + -1.12522141537674e-06,-0.00337822377285169,0.203632966403736,-0.436792370838912, + -1.13042083282888e-06,-0.00324626086405955,0.212887184635701,-0.46527181015582, + -1.13562025083613e-06,-0.00311429795526763,0.222141402867666,-0.493751249472728, + -1.14081966873236e-06,-0.00298233504647594,0.231395621099631,-0.522230688789636, + -1.14601908662859e-06,-0.00285037213768424,0.240649839331596,-0.550710128106544, + -1.15121850452482e-06,-0.00271840922889321,0.24990405756356,-0.579189567423452, + -1.15641792186594e-06,-0.00258644632010041,0.259158275795526,-0.60766900674036, + -1.16161733965114e-06,-0.00245448341130849,0.268412494027491,-0.636148446057268, + -1.16681675754737e-06,-0.00232252050251702,0.277666712259456,-0.664627885374176, + -1.17201617599871e-06,-0.00219055759372644,0.28692093049142,-0.693107324691084, + -1.17721559300676e-06,-0.00205859468493319,0.296175148723386,-0.721586764007992, + -1.1824150104589e-06,-0.00192663177614127,0.30542936695535,-0.7500662033249, + -1.18761442902127e-06,-0.00179466886735025,0.314683585187315,-0.778545642641808, + -1.19281384669545e-06,-0.00166270595855789,0.323937803419281,-0.807025081958716, + -7.0283698254292e-05,-0.010701056425712,0.131582598851909,-0.113678199740911, + -7.54190551024159e-05,-0.0100290541223641,0.146948784494001,-0.137500626106234, + -8.05544119503732e-05,-0.00935705181901603,0.162314970136092,-0.161323052471557, + -8.56897687984692e-05,-0.00868504951566784,0.177681155778183,-0.18514547883688, + -9.08251256466208e-05,-0.00801304721231988,0.193047341420274,-0.208967905202204, + -9.59604824944948e-05,-0.00734104490897158,0.208413527062365,-0.232790331567527, + -0.000101095839342424,-0.00666904260562329,0.223779712704456,-0.25661275793285, + -0.000106231196190631,-0.00599704030227532,0.239145898346548,-0.280435184298173, + -0.000111366553038783,-0.00532503799892758,0.254512083988638,-0.304257610663496, + -0.000116501909886713,-0.00465303569557918,0.26987826963073,-0.32808003702882, + -0.000121637266734698,-0.00398103339223121,0.285244455272821,-0.351902463394143, + -0.000126772623582849,-0.00330903108888325,0.300610640914912,-0.375724889759466, + -0.000131907980430834,-0.00263702878553507,0.315976826557003,-0.39954731612479, + -0.000137043337278819,-0.0019650264821871,0.331343012199094,-0.423369742490113, + -0.000142178694126582,-0.00129302417883848,0.346709197841186,-0.447192168855436, + -0.000147314050975234,-0.000621021875491401,0.362075383483276,-0.47101459522076, + -0.000152449407822886,5.09804278574499e-05,0.377441569125368,-0.494837021586083, + -0.000157584764670871,0.000722982731205635,0.392807754767459,-0.518659447951406, + -0.000162720121518634,0.00139498503455426,0.40817394040955,-0.542481874316729, + -0.000167855478367285,0.00206698733790134,0.423540126051641,-0.566304300682053, + -0.000172990835215159,0.00273898964124974,0.438906311693732,-0.590126727047376, + -0.000178126192063366,0.00341099194459726,0.454272497335823,-0.613949153412699, + -0.000183261548911129,0.00408299424794611,0.469638682977915,-0.637771579778022, + -0.000188396905759003,0.00475499655129452,0.485004868620006,-0.661594006143345, + -0.00019353226260721,0.00542699885464248,0.500371054262097,-0.685416432508669, + -6.974458098577e-05,-0.0106358594249302,0.13141425677876,-0.113853306286322, + -7.48092974050818e-05,-0.00996531066807438,0.146732136582974,-0.137710954815312, + -7.98740138244769e-05,-0.00929476191121881,0.162050016387189,-0.161568603344303, + -8.49387302438442e-05,-0.00862421315436301,0.177367896191403,-0.185426251873293, + -9.00034466631006e-05,-0.00795366439750711,0.192685775995618,-0.209283900402283, + -9.50681630824124e-05,-0.00728311564065121,0.208003655799832,-0.233141548931274, + -0.000100132879501724,-0.00661256688379541,0.223321535604046,-0.256999197460264, + -0.000105197595920981,-0.00594201812693962,0.238639415408261,-0.280856845989255, + -0.000110262312340181,-0.00527146937008349,0.253957295212475,-0.304714494518245, + -0.000115327028759826,-0.00460092061322825,0.26927517501669,-0.328572143047235, + -0.000120391745179027,-0.00393037185637257,0.284593054820904,-0.352429791576226, + -0.00012545646159845,-0.00325982309951689,0.299910934625118,-0.376287440105216, + -0.000130521178017928,-0.00258927434266143,0.315228814429332,-0.400145088634206, + -0.000135585894436963,-0.00191872558580508,0.330546694233547,-0.424002737163197, + -0.000140650610856219,-0.0012481768289494,0.345864574037761,-0.447860385692187, + -0.000145715327275697,-0.000577628072093717,0.361182453841976,-0.471718034221177, + -0.000150780043694954,9.29206847621877e-05,0.37650033364619,-0.495575682750168, + -0.000155844760114543,0.00076346944161787,0.391818213450405,-0.519433331279158, + -0.000160909476534021,0.00143401819847311,0.407136093254619,-0.543290979808148, + -0.000165974192952945,0.00210456695532946,0.422453973058833,-0.567148628337139, + -0.000171038909372534,0.00277511571218492,0.437771852863048,-0.591006276866129, + -0.00017610362579179,0.00344566446904082,0.453089732667262,-0.61486392539512, + -0.000181168342211158,0.00411621322589673,0.468407612471477,-0.63872157392411, + -0.000186233058630081,0.00478676198275263,0.483725492275691,-0.6625792224531, + -0.000191297775049892,0.00545731073960765,0.499043372079905,-0.686436870982091, + -6.90038965986128e-05,-0.0105468463361844,0.131182692667461,-0.114093437132613, + -7.39722384737462e-05,-0.00987837748463394,0.14643418593165,-0.137999387271059, + -7.89405803488519e-05,-0.00920990863308335,0.16168567919584,-0.161905337409505, + -8.39089222240408e-05,-0.00854143978153299,0.17693717246003,-0.185811287547951, + -8.88772640992297e-05,-0.00787297092998251,0.192188665724219,-0.209717237686397, + -9.38456059744741e-05,-0.00720450207843215,0.207440158988409,-0.233623187824843, + -9.88139478494965e-05,-0.00653603322688157,0.222691652252599,-0.257529137963289, + -0.000103782289724741,-0.0058675643753312,0.237943145516789,-0.281435088101735, + -0.000108750631599541,-0.00519909552377995,0.253194638780979,-0.30534103824018, + -0.000113718973475063,-0.00453062667223025,0.268446132045168,-0.329246988378627, + -0.000118687315350363,-0.00386215782068011,0.283697625309357,-0.353152938517072, + -0.000123655657225052,-0.00319368896912864,0.298949118573548,-0.377058888655518, + -0.000128623999100186,-0.00252522011757828,0.314200611837737,-0.400964838793964, + -0.000133592340975541,-0.00185675126602791,0.329452105101927,-0.42487078893241, + -0.000138560682850453,-0.00118828241447755,0.344703598366117,-0.448776739070856, + -0.000143529024725475,-0.000519813562926519,0.359955091630307,-0.472682689209302, + -0.000148497366600941,0.000148655288623178,0.375206584894496,-0.496588639347748, + -0.000153465708475631,0.000817124140174652,0.390458078158686,-0.520494589486194, + -0.00015843405035143,0.00148559299172391,0.405709571422875,-0.54440053962464, + -0.000163402392226009,0.00215406184327582,0.420961064687066,-0.568306489763086, + -0.000168370734101697,0.00282253069482508,0.436212557951255,-0.592212439901532, + -0.000173339075976831,0.00349099954637566,0.451464051215445,-0.616118390039978, + -0.000178307417851631,0.00415946839792625,0.466715544479634,-0.640024340178424, + -0.000183275759727097,0.00482793724947639,0.481967037743824,-0.66393029031687, + -0.00018824410160212,0.00549640610102786,0.497218531008015,-0.687836240455316, + -6.79933548632383e-05,-0.0104264414366823,0.130866238235245,-0.114420231454212, + -7.28314784274042e-05,-0.00976096412066174,0.146027120756868,-0.138391915303833, + -7.76696019917367e-05,-0.00909548680464123,0.161188003278491,-0.162363599153453, + -8.25077255560136e-05,-0.00843000948862083,0.176348885800115,-0.186335283003074, + -8.73458491201795e-05,-0.00776453217260031,0.191509768321738,-0.210306966852694, + -9.2183972684512e-05,-0.00709905485657991,0.206670650843361,-0.234278650702315, + -9.70220962485113e-05,-0.00643357754055895,0.221831533364985,-0.258250334551935, + -0.000101860219812455,-0.00576810022453822,0.236992415886608,-0.282222018401556, + -0.000106698343377232,-0.00510262290851826,0.252153298408232,-0.306193702251176, + -0.000111536466941176,-0.00443714559249719,0.267314180929855,-0.330165386100797, + -0.000116374590505619,-0.00377166827647701,0.282475063451478,-0.354137069950417, + -0.000121212714069729,-0.00310619096045683,0.297635945973101,-0.378108753800038, + -0.000126050837634173,-0.00244071364443643,0.312796828494725,-0.402080437649658, + -0.000130888961198394,-0.00177523632841603,0.327957711016348,-0.426052121499279, + -0.000135727084762283,-0.00110975901239496,0.343118593537972,-0.450023805348899, + -0.000140565208326726,-0.000444281696374782,0.358279476059595,-0.47399548919852, + -0.00014540333189117,0.000221195619645842,0.373440358581218,-0.49796717304814, + -0.000150241455454836,0.00088667293566691,0.388601241102842,-0.521938856897761, + -0.000155079579019279,0.00155215025168709,0.403762123624465,-0.545910540747381, + -0.000159917702584167,0.00221762756770705,0.418923006146088,-0.569882224597001, + -0.000164755826147722,0.00288310488372812,0.434083888667712,-0.593853908446622, + -0.000169593949711833,0.00354858219974918,0.449244771189335,-0.617825592296242, + -0.000174432073275721,0.00421405951576981,0.464405653710959,-0.641797276145863, + -0.000179270196840164,0.00487953683178999,0.479566536232582,-0.665768959995483, + -0.000184108320405385,0.00554501414780928,0.494727418754205,-0.689740643845104, + -6.66276904059682e-05,-0.0102656124561046,0.130437622391132,-0.114860371003274, + -7.12921731370331e-05,-0.00960445780326635,0.145475983522797,-0.138920587621312, + -7.59566558684033e-05,-0.00894330315042857,0.160514344654462,-0.162980804239351, + -8.06211385996902e-05,-0.00828214849759057,0.175552705786127,-0.18704102085739, + -8.52856213309217e-05,-0.00762099384475246,0.190591066917792,-0.211101237475428, + -8.99501040623196e-05,-0.00695983919191467,0.205629428049457,-0.235161454093467, + -9.46145867933845e-05,-0.00629868453907645,0.220667789181123,-0.259221670711505, + -9.92790695242274e-05,-0.00563752988623789,0.235706150312788,-0.283281887329544, + -0.000103943552255625,-0.0049763752334,0.250744511444453,-0.307342103947582, + -0.000108608034987245,-0.00431522058056255,0.265782872576118,-0.331402320565621, + -0.000113272517718366,-0.00365406592772421,0.280821233707783,-0.35546253718366, + -0.000117937000449819,-0.00299291127488654,0.295859594839448,-0.379522753801698, + -0.000122601483180551,-0.00233175662204821,0.310897955971113,-0.403582970419737, + -0.000127265965912282,-0.00167060196921076,0.325936317102778,-0.427643187037775, + -0.000131930448643458,-0.0010094473163722,0.340974678234444,-0.451703403655814, + -0.000136594931374523,-0.000348292663534089,0.356013039366109,-0.475763620273853, + -0.00014125941410581,0.000312861989303359,0.371051400497773,-0.499823836891891, + -0.00014592389683743,0.000974016642141251,0.386089761629439,-0.52388405350993, + -0.000150588379568162,0.00163517129498025,0.401128122761104,-0.547944270127968, + -0.00015525286229956,0.00229632594781792,0.416166483892769,-0.572004486746007, + -0.000159917345030403,0.00295748060065604,0.431204845024434,-0.596064703364045, + -0.000164581827761578,0.0036186352534946,0.4462432061561,-0.620124919982084, + -0.000169246310493087,0.00427978990633227,0.461281567287765,-0.644185136600123, + -0.00017391079322393,0.00494094455917082,0.47631992841943,-0.668245353218161, + -0.000178575275956216,0.00560209921200761,0.491358289551095,-0.6923055698362, + -6.48056721373191e-05,-0.0100543813491858,0.129864086951448,-0.115444948418722, + -6.92427046365407e-05,-0.00939948934531509,0.144738862039717,-0.139622751054774, + -7.36797371359565e-05,-0.00874459734144473,0.159613637127985,-0.163800553690826, + -7.81167696349838e-05,-0.0080897053375738,0.174488412216254,-0.187978356326877, + -8.25538021343997e-05,-0.00743481333370333,0.189363187304522,-0.212156158962929, + -8.69908346334269e-05,-0.00677992132983252,0.204237962392791,-0.236333961598981, + -9.14278671325097e-05,-0.0061250293259616,0.219112737481059,-0.260511764235033, + -9.58648996318701e-05,-0.00547013732209112,0.233987512569328,-0.284689566871085, + -0.000100301932131119,-0.00481524531822042,0.248862287657596,-0.308867369507137, + -0.000104738964630258,-0.00416035331434972,0.263737062745865,-0.333045172143189, + -0.000109175997129507,-0.00350546131047902,0.278611837834134,-0.35722297477924, + -0.000113613029628867,-0.00285056930660854,0.293486612922402,-0.381400777415292, + -0.000118050062128283,-0.00219567730273829,0.30836138801067,-0.405578580051344, + -0.000122487094627366,-0.00154078529886692,0.32323616309894,-0.429756382687396, + -0.000126924127126449,-0.000885893294996887,0.338110938187207,-0.453934185323448, + -0.000131361159625532,-0.000231001291125299,0.352985713275477,-0.4781119879595, + -0.000135798192124725,0.000423890712745179,0.367860488363745,-0.502289790595551, + -0.000140235224623919,0.0010787827166161,0.382735263452014,-0.526467593231604, + -0.000144672257123224,0.0017336747204868,0.397610038540282,-0.550645395867655, + -0.000149109289622196,0.00238856672435706,0.41248481362855,-0.574823198503707, + -0.000153546322121834,0.00304345872822775,0.427359588716819,-0.599001001139759, + -0.000157983354621138,0.00369835073209801,0.442234363805087,-0.623178803775811, + -0.000162420387120443,0.00435324273596871,0.457109138893356,-0.647356606411863, + -0.00016685741961997,0.00500813473983897,0.471983913981624,-0.671534409047915, + -0.000171294452118498,0.005663026743711,0.486858689069894,-0.695712211683967, + -6.24161043309979e-05,-0.00978305435470772,0.129108997826724,-0.116207128616983, + -6.65622104957797e-05,-0.00913722239051584,0.143769017645452,-0.140538241545485, + -7.0708316660506e-05,-0.00849139042632396,0.15842903746418,-0.164869354473987, + -7.48544228252879e-05,-0.00784555846213197,0.173089057282909,-0.189200467402489, + -7.90005289902362e-05,-0.00719972649794032,0.187749077101637,-0.213531580330991, + -8.31466351550736e-05,-0.00655389453374877,0.202409096920365,-0.237862693259493, + -8.72927413196334e-05,-0.00590806256955678,0.217069116739093,-0.262193806187995, + -9.14388474844152e-05,-0.00526223060536468,0.231729136557821,-0.286524919116497, + -9.55849536494191e-05,-0.00461639864117314,0.24638915637655,-0.310856032044999, + -9.97310598142565e-05,-0.00397056667698092,0.261049176195278,-0.335187144973501, + -0.000103877165978983,-0.00332473471278938,0.275709196014006,-0.359518257902003, + -0.000108023272143987,-0.00267890274859783,0.290369215832734,-0.383849370830505, + -0.000112169378308713,-0.00203307078440607,0.305029235651462,-0.408180483759007, + -0.000116315484473328,-0.00138723882021408,0.31968925547019,-0.432511596687509, + -0.000120461590638166,-0.000741406856022087,0.334349275288919,-0.456842709616011, + -0.000124607696803225,-9.55748918307631e-05,0.349009295107647,-0.481173822544513, + -0.00012875380296784,0.000550257072361449,0.363669314926375,-0.505504935473015, + -0.000132899909132567,0.00119608903655366,0.378329334745104,-0.529836048401517, + -0.000137046015297848,0.00184192100074432,0.392989354563831,-0.554167161330019, + -0.00014119212146213,0.00248775296493697,0.40764937438256,-0.578498274258522, + -0.000145338227627079,0.00313358492912874,0.422309394201288,-0.602829387187023, + -0.000149484333792138,0.00377941689332006,0.436969414020016,-0.627160500115526, + -0.000153630439957309,0.00442524885751139,0.451629433838744,-0.651491613044027, + -0.000157776546122146,0.00507108082170316,0.466289453657472,-0.67582272597253, + -0.000161922652286539,0.00571691278589626,0.480949473476201,-0.700153838901032, + -5.93517939788124e-05,-0.00944439753518178,0.128135943825456,-0.117177247569262, + -6.31372292670129e-05,-0.00881156468885913,0.142520212767342,-0.141703497055529, + -6.692266455538e-05,-0.00817873184253648,0.156904481709227,-0.166229746541796, + -7.07080998436083e-05,-0.00754589899621405,0.171288750651113,-0.190755996028063, + -7.44935351320586e-05,-0.00691306614989151,0.185673019592998,-0.215282245514331, + -7.82789704202869e-05,-0.00628023330356875,0.200057288534884,-0.239808495000598, + -8.20644057086817e-05,-0.00564740045724643,0.214441557476769,-0.264334744486865, + -8.584984099691e-05,-0.00501456761092367,0.228825826418655,-0.288860993973132, + -8.96352762851382e-05,-0.00438173476460091,0.243210095360541,-0.313387243459399, + -9.34207115736441e-05,-0.00374890191827881,0.257594364302426,-0.337913492945666, + -9.72061468619834e-05,-0.00311606907195605,0.271978633244312,-0.362439742431933, + -0.000100991582150489,-0.00248323622563396,0.286362902186197,-0.386965991918201, + -0.000104777017438384,-0.00185040337931053,0.300747171128083,-0.411492241404468, + -0.000108562452727168,-0.00121757053298865,0.315131440069968,-0.436018490890735, + -0.000112347888015285,-0.000584737686665671,0.329515709011854,-0.460544740377002, + -0.000116133323303735,4.80951596568691e-05,0.34389997795374,-0.485070989863269, + -0.000119918758591964,0.000680928005979187,0.358284246895625,-0.509597239349536, + -0.000123704193880414,0.00131376085230173,0.372668515837511,-0.534123488835803, + -0.00012748962916842,0.00194659369862449,0.387052784779396,-0.55864973832207, + -0.000131275064456982,0.00257942654494681,0.401437053721282,-0.583175987808338, + -0.000135060499745321,0.00321225939126935,0.415821322663167,-0.607702237294604, + -0.000138845935033549,0.00384509223759233,0.430205591605053,-0.632228486780872, + -0.000142631370321888,0.00447792508391487,0.444589860546938,-0.656754736267139, + -0.000146416805610117,0.00511075793023696,0.458974129488824,-0.681280985753406, + -0.000150202240898789,0.00574359077655906,0.473358398430709,-0.705807235239673, + -5.55336637548809e-05,-0.00903667762364446,0.126916173561392,-0.118374916019083, + -5.88895474387674e-05,-0.00842216465480727,0.140956295096243,-0.143142072971484, + -6.22454311227094e-05,-0.00780765168597031,0.154996416631094,-0.167909229923885, + -6.56013148067625e-05,-0.00719313871713345,0.169036538165945,-0.192676386876286, + -6.8957198490649e-05,-0.00657862574829626,0.183076659700796,-0.217443543828687, + -7.23130821745355e-05,-0.00596411277945952,0.197116781235647,-0.242210700781088, + -7.56689658584775e-05,-0.00534959981062233,0.211156902770499,-0.266977857733489, + -7.90248495423085e-05,-0.00473508684178525,0.22519702430535,-0.29174501468589, + -8.2380733226306e-05,-0.00412057387294817,0.239237145840201,-0.31651217163829, + -8.5736616910137e-05,-0.0035060609041111,0.253277267375052,-0.341279328590691, + -8.90925005940235e-05,-0.0028915479352738,0.267317388909903,-0.366046485543092, + -9.24483842782431e-05,-0.00227703496643761,0.281357510444754,-0.390813642495493, + -9.58042679619631e-05,-0.00166252199760053,0.295397631979605,-0.415580799447894, + -9.91601516459051e-05,-0.00104800902876301,0.309437753514457,-0.440347956400295, + -0.000102516035329958,-0.000433496059926153,0.323477875049308,-0.465115113352696, + -0.000105871919013789,0.000181016908910703,0.337517996584159,-0.489882270305097, + -0.000109227802697842,0.00079552987774778,0.35155811811901,-0.514649427257498, + -0.000112583686382117,0.00141004284658441,0.365598239653861,-0.539416584209899, + -0.000115939570065615,0.00202455581542171,0.379638361188712,-0.5641837411623, + -0.00011929545374989,0.00263906878425901,0.393678482723564,-0.5889508981147, + -0.000122651337433832,0.00325358175309542,0.407718604258414,-0.613718055067102, + -0.000126007221117441,0.00386809472193317,0.421758725793266,-0.638485212019502, + -0.000129363104801827,0.00448260769076914,0.435798847328116,-0.663252368971903, + -0.000132718988485436,0.00509712065960732,0.449838968862968,-0.688019525924304, + -0.000136074872169378,0.00571163362844374,0.463879090397819,-0.712786682876705, + -5.09436093744098e-05,-0.00856684132877095,0.125439218184938,-0.119799017709532, + -5.38129069865834e-05,-0.00797738717200214,0.139064782083119,-0.144852628504658, + -5.66822045991455e-05,-0.00738793301523377,0.152690345981301,-0.169906239299785, + -5.95515022115412e-05,-0.00679847885846518,0.166315909879482,-0.194959850094912, + -6.24207998238813e-05,-0.0062090247016966,0.179941473777664,-0.220013460890039, + -6.52900974362769e-05,-0.0056195705449279,0.193567037675845,-0.245067071685166, + -6.81593950485615e-05,-0.0050301163881592,0.207192601574027,-0.270120682480292, + -7.10286926610681e-05,-0.00444066223139084,0.220818165472208,-0.295174293275419, + -7.38979902731862e-05,-0.0038512080746218,0.23444372937039,-0.320227904070546, + -7.67672878857484e-05,-0.00326175391785366,0.248069293268571,-0.345281514865673, + -7.96365854983105e-05,-0.00267229976108507,0.261694857166753,-0.370335125660799, + -8.25058831107617e-05,-0.00208284560431671,0.275320421064934,-0.395388736455926, + -8.53751807230463e-05,-0.00149339144754768,0.288945984963116,-0.420442347251053, + -8.8244478335775e-05,-0.000903937290779755,0.302571548861297,-0.44549595804618, + -9.11137759475045e-05,-0.000314483134010279,0.316197112759479,-0.470549568841306, + -9.39830735600111e-05,0.000274971022758086,0.32982267665766,-0.495603179636433, + -9.68523711722957e-05,0.000864425179527117,0.343448240555842,-0.52065679043156, + -9.97216687849134e-05,0.00145387933629504,0.357073804454023,-0.545710401226687, + -0.000102590966397198,0.00204333349306363,0.370699368352205,-0.570764012021814, + -0.000105460264009705,0.00263278764983221,0.384324932250386,-0.59581762281694, + -0.000108329561621989,0.00322224180660102,0.397950496148568,-0.620871233612067, + -0.000111198859234385,0.00381169596336983,0.41157606004675,-0.645924844407194, + -0.000114068156847225,0.00440115012013775,0.425201623944931,-0.670978455202321, + -0.000116937454459176,0.00499060427690656,0.438827187843112,-0.696032065997447, + -0.000119806752071905,0.00558005843367493,0.452452751741294,-0.721085676792574, + -4.56577545911163e-05,-0.00805233202422462,0.123724364207198,-0.121418673593989, + -4.80081934708387e-05,-0.00749571544070993,0.13687138683906,-0.146798073379543, + -5.03586323506999e-05,-0.00693909885719535,0.150018409470922,-0.172177473165096, + -5.27090712304501e-05,-0.00638248227368088,0.163165432102784,-0.19755687295065, + -5.50595101101448e-05,-0.00582586569016597,0.176312454734646,-0.222936272736204, + -5.7409948990117e-05,-0.0052692491066515,0.189459477366507,-0.248315672521757, + -5.97603878697561e-05,-0.00471263252313681,0.202606499998369,-0.273695072307311, + -6.21108267498949e-05,-0.00415601593962278,0.215753522630231,-0.299074472092865, + -6.44612656295895e-05,-0.00359939935610809,0.228900545262093,-0.324453871878418, + -6.68117045091732e-05,-0.00304278277259296,0.242047567893955,-0.349833271663972, + -6.91621433889233e-05,-0.00248616618907849,0.255194590525816,-0.375212671449525, + -7.15125822687845e-05,-0.00192954960556424,0.268341613157678,-0.400592071235079, + -7.38630211487568e-05,-0.00137293302204955,0.28148863578954,-0.425971471020633, + -7.62134600283959e-05,-0.000816316438534637,0.294635658421402,-0.451350870806186, + -7.85638989085902e-05,-0.000259699855020612,0.307782681053263,-0.47673027059174, + -8.09143377878963e-05,0.000296916728494745,0.320929703685126,-0.502109670377294, + -8.32647766675354e-05,0.000853533312009436,0.334076726316987,-0.527489070162847, + -8.56152155473966e-05,0.00141014989552346,0.347223748948849,-0.552868469948401, + -8.79656544272578e-05,0.00196676647903837,0.360370771580711,-0.578247869733954, + -9.0316093307341e-05,0.0025233830625524,0.373517794212572,-0.603627269519508, + -9.26665321868692e-05,0.00307999964606731,0.386664816844434,-0.629006669305062, + -9.50169710671744e-05,0.00363661622958222,0.399811839476297,-0.654386069090615, + -9.73674099468136e-05,0.00419323281309669,0.412958862108158,-0.679765468876169, + -9.97178488257866e-05,0.00474984939661205,0.42610588474002,-0.705144868661722, + -0.000102068287705981,0.00530646598012652,0.439252907371882,-0.730524268447276, + -3.98642425261941e-05,-0.00751983369950515,0.121827962154871,-0.123170110142105, + -4.16988114729511e-05,-0.00700393910405428,0.134449055234155,-0.14890180620879, + -4.35333804199578e-05,-0.00648804450860363,0.147070148313438,-0.174633502275476, + -4.53679493667702e-05,-0.00597214991315298,0.159691241392722,-0.200365198342161, + -4.72025183136937e-05,-0.00545625531770222,0.172312334472005,-0.226096894408846, + -4.90370872608392e-05,-0.00494036072225201,0.184933427551288,-0.251828590475532, + -5.08716562076517e-05,-0.00442446612680114,0.197554520630572,-0.277560286542217, + -5.27062251546306e-05,-0.00390857153135049,0.210175613709855,-0.303291982608902, + -5.45407941014986e-05,-0.00339267693589984,0.222796706789139,-0.329023678675588, + -5.63753630486996e-05,-0.00287678234044941,0.235417799868422,-0.354755374742273, + -5.82099319949014e-05,-0.0023608877449981,0.248038892947705,-0.380487070808958, + -6.00445009424355e-05,-0.00184499314954811,0.260659986026989,-0.406218766875644, + -6.18790698894145e-05,-0.00132909855409769,0.273281079106272,-0.431950462942329, + -6.37136388359494e-05,-0.000813203958646369,0.285902172185556,-0.457682159009014, + -6.55482077830394e-05,-0.000297309363195719,0.298523265264839,-0.4834138550757, + -6.73827767299073e-05,0.000218585232255153,0.311144358344123,-0.509145551142385, + -6.92173456765532e-05,0.000734479827706025,0.323765451423406,-0.53487724720907, + -7.10519146235322e-05,0.00125037442315645,0.33638654450269,-0.560608943275756, + -7.28864835708443e-05,0.00176626901860644,0.349007637581973,-0.586340639342441, + -7.47210525179343e-05,0.00228216361405664,0.361628730661256,-0.612072335409126, + -7.65556214641361e-05,0.00279805820950862,0.37424982374054,-0.637804031475811, + -7.83901904113371e-05,0.00331395280495883,0.386870916819823,-0.663535727542497, + -8.0224759357983e-05,0.00382984740040948,0.399492009899106,-0.689267423609182, + -8.2059328304851e-05,0.00434574199586057,0.41211310297839,-0.714999119675867, + -8.38938972518299e-05,0.00486163659131122,0.424734196057674,-0.740730815742553, + -3.38488750320498e-05,-0.00700035280528066,0.119840674312775,-0.124963691076466, + -3.5208687984567e-05,-0.00653179367099987,0.13191407999209,-0.151056160642918, + -3.65685009369177e-05,-0.00606323453671886,0.143987485671406,-0.177148630209371, + -3.79283138893238e-05,-0.00559467540243797,0.156060891350721,-0.203241099775823, + -3.92881268418965e-05,-0.00512611626815707,0.168134297030036,-0.229333569342276, + -4.06479397943027e-05,-0.00465755713387617,0.180207702709352,-0.255426038908728, + -4.20077527468199e-05,-0.00418899799959549,0.192281108388667,-0.281518508475181, + -4.33675656990595e-05,-0.00372043886531404,0.204354514067983,-0.307610978041633, + -4.47273786516877e-05,-0.00325187973103369,0.216427919747298,-0.333703447608086, + -4.60871916042049e-05,-0.00278332059675268,0.228501325426613,-0.359795917174538, + -4.74470045566666e-05,-0.00231476146247189,0.240574731105929,-0.385888386740991, + -4.88068175088507e-05,-0.00184620232819088,0.252648136785244,-0.411980856307443, + -5.01666304619786e-05,-0.00137764319391054,0.264721542464559,-0.438073325873896, + -5.15264434139961e-05,-0.00090908405962975,0.276794948143874,-0.464165795440348, + -5.28862563664578e-05,-0.000440524925348296,0.28886835382319,-0.490258265006801, + -5.42460693191416e-05,2.80342089320484e-05,0.300941759502505,-0.516350734573253, + -5.56058822713812e-05,0.000496593343213725,0.313015165181821,-0.542443204139705, + -5.69656952237318e-05,0.000965152477494291,0.325088570861136,-0.568535673706158, + -5.83255081765266e-05,0.00143371161177441,0.337161976540451,-0.594628143272611, + -5.96853211287662e-05,0.00190227074605609,0.349235382219767,-0.620720612839063, + -6.10451340810059e-05,0.00237082988033732,0.361308787899083,-0.646813082405516, + -6.24049470336896e-05,0.00283938901461767,0.373382193578398,-0.672905551971968, + -6.37647599857072e-05,0.00330794814889934,0.385455599257713,-0.69899802153842, + -6.51245729381689e-05,0.00377650728318013,0.397529004937029,-0.725090491104873, + -6.64843858908526e-05,0.00424506641746092,0.409602410616344,-0.751182960671325, + -2.79442657529771e-05,-0.00652223857923007,0.117872205432874,-0.126700888047118, + -2.89011271974171e-05,-0.00610498108625279,0.129406360135984,-0.153142789645814, + -2.98579886420236e-05,-0.00568772359327585,0.140940514839095,-0.179584691244511, + -3.08148500869354e-05,-0.00527046610029913,0.152474669542205,-0.206026592843207, + -3.17717115314586e-05,-0.00485320860732186,0.164008824245316,-0.232468494441903, + -3.27285729762039e-05,-0.00443595111434514,0.175542978948426,-0.258910396040599, + -3.36854344210602e-05,-0.00401869362136842,0.187077133651536,-0.285352297639295, + -3.46422958656389e-05,-0.00360143612839137,0.198611288354647,-0.311794199237991, + -3.55991573102177e-05,-0.00318417863541431,0.210145443057757,-0.338236100836688, + -3.65560187545744e-05,-0.00276692114243682,0.221679597760868,-0.364678002435384, + -3.75128801993752e-05,-0.00234966364946021,0.233213752463978,-0.39111990403408, + -3.84697416441204e-05,-0.00193240615648338,0.244747907167089,-0.417561805632776, + -3.94266030888657e-05,-0.00151514866350633,0.256282061870199,-0.444003707231472, + -4.03834645334999e-05,-0.00109789117052905,0.26781621657331,-0.470445608830168, + -4.13403259781342e-05,-0.000680633677552667,0.27935037127642,-0.496887510428865, + -4.22971874232125e-05,-0.000263376184575614,0.290884525979531,-0.523329412027561, + -4.32540488672917e-05,0.000153881308401882,0.302418680682641,-0.549771313626257, + -4.4210910312481e-05,0.000571138801378268,0.313952835385752,-0.576213215224953, + -4.51677717566712e-05,0.000988396294355542,0.325486990088862,-0.602655116823649, + -4.61246332010834e-05,0.00140565378733282,0.337021144791973,-0.629097018422346, + -4.70814946462728e-05,0.0018229112803092,0.348555299495083,-0.655538920021042, + -4.8038356090907e-05,0.00224016877328603,0.360089454198193,-0.681980821619738, + -4.89952175354302e-05,0.00265742626626331,0.371623608901304,-0.708422723218434, + -4.99520789802865e-05,0.00307468375924014,0.383157763604414,-0.73486462481713, + -5.09089404246987e-05,0.00349194125221786,0.394691918307525,-0.761306526415827, + -2.24592565011283e-05,-0.00610527692785379,0.116028072975099,-0.128295001417611, + -2.3100440174062e-05,-0.00573983429560132,0.127059789399198,-0.155057554205601, + -2.37416238467736e-05,-0.0053743916633483,0.138091505823298,-0.181820106993591, + -2.43828075195407e-05,-0.00500894903109528,0.149123222247398,-0.208582659781582, + -2.50239911924188e-05,-0.00464350639884259,0.160154938671497,-0.235345212569572, + -2.5665174865297e-05,-0.0042780637665899,0.171186655095597,-0.262107765357563, + -2.63063585380641e-05,-0.00391262113433699,0.182218371519697,-0.288870318145553, + -2.69475422106091e-05,-0.00354717850208375,0.193250087943797,-0.315632870933544, + -2.75887258834318e-05,-0.00318173586983117,0.204281804367896,-0.342395423721534, + -2.82299095563654e-05,-0.00281629323757815,0.215313520791996,-0.369157976509524, + -2.8871093229188e-05,-0.00245085060532579,0.226345237216095,-0.395920529297515, + -2.95122769018441e-05,-0.00208540797307255,0.237376953640195,-0.422683082085505, + -3.01534605749998e-05,-0.0017199653408202,0.248408670064294,-0.449445634873496, + -3.07946442472673e-05,-0.00135452270856651,0.259440386488395,-0.476208187661486, + -3.1435827920423e-05,-0.000989080076313931,0.270472102912494,-0.502970740449476, + -3.20770115933566e-05,-0.000623637444061798,0.281503819336593,-0.529733293237467, + -3.27181952659572e-05,-0.000258194811808332,0.292535535760693,-0.556495846025457, + -3.33593789390019e-05,0.000107247820443801,0.303567252184793,-0.583258398813448, + -3.40005626117135e-05,0.0004726904526966,0.314598968608892,-0.610020951601438, + -3.4641746284314e-05,0.00083813308495051,0.325630685032993,-0.636783504389428, + -3.52829299572477e-05,0.00120357571720264,0.336662401457092,-0.663546057177419, + -3.59241136304034e-05,0.00156901834945522,0.347694117881191,-0.690308609965409, + -3.65652973028929e-05,0.00193446098170824,0.358725834305291,-0.7170711627534, + -3.72064809761596e-05,0.00229990361396037,0.36975755072939,-0.74383371554139, + -3.78476646492043e-05,0.00266534624621295,0.38078926715349,-0.770596268329381, + -1.76185693750164e-05,-0.00575830935917143,0.114388256464148,-0.129686928029868, + -1.80302668530696e-05,-0.00544183030858969,0.124975310299501,-0.156729462738776, + -1.84419643305955e-05,-0.00512535125800728,0.135562364134854,-0.183771997447684, + -1.88536618085378e-05,-0.00480887220742543,0.146149417970207,-0.210814532156592, + -1.92653592862579e-05,-0.00449239315684313,0.15673647180556,-0.2378570668655, + -1.96770567640892e-05,-0.00417591410626117,0.167323525640913,-0.264899601574408, + -2.00887542417538e-05,-0.00385943505567909,0.177910579476266,-0.291942136283316, + -2.0500451719474e-05,-0.00354295600509702,0.188497633311619,-0.318984670992224, + -2.09121491975273e-05,-0.00322647695451517,0.199084687146972,-0.346027205701132, + -2.13238466753585e-05,-0.00290999790393309,0.209671740982325,-0.37306974041004, + -2.17355441529121e-05,-0.0025935188533508,0.220258794817679,-0.400112275118947, + -2.21472416310764e-05,-0.00227703980276939,0.230845848653031,-0.427154809827856, + -2.25589391089631e-05,-0.00196056075218709,0.241432902488385,-0.454197344536763, + -2.29706365868498e-05,-0.00164408170160546,0.252019956323738,-0.481239879245671, + -2.33823340642925e-05,-0.00132760265102294,0.262607010159091,-0.508282413954579, + -2.37940315421792e-05,-0.00101112360044087,0.273194063994444,-0.535324948663487, + -2.42057290202879e-05,-0.000694644549859236,0.283781117829797,-0.562367483372395, + -2.46174264979526e-05,-0.000378165499276939,0.29436817166515,-0.589410018081303, + -2.50291239757283e-05,-6.16864486948643e-05,0.304955225500503,-0.616452552790211, + -2.5440821453504e-05,0.00025479260188721,0.315542279335856,-0.643495087499119, + -2.58525189312797e-05,0.000571271652469285,0.326129333171209,-0.670537622208027, + -2.62642164092775e-05,0.000887750703050916,0.336716387006562,-0.697580156916935, + -2.66759138870531e-05,0.00120422975363343,0.347303440841916,-0.724622691625842, + -2.70876113644958e-05,0.00152070880421595,0.357890494677269,-0.75166522633475, + -2.74993088424935e-05,0.00183718785479758,0.368477548512622,-0.778707761043658, + -1.35356444470602e-05,-0.00548053117374969,0.112996219523963,-0.130850566397133, + -1.379112801983e-05,-0.00520765459392381,0.123207282120401,-0.158127163521725, + -1.40466115924887e-05,-0.00493477801409814,0.133418344716838,-0.185403760646317, + -1.43020951651751e-05,-0.00466190143427248,0.143629407313276,-0.212680357770909, + -1.45575787380281e-05,-0.0043890248544467,0.153840469909714,-0.239956954895501, + -1.4813062310659e-05,-0.0041161482746207,0.164051532506152,-0.267233552020093, + -1.50685458835675e-05,-0.00384327169479537,0.17426259510259,-0.294510149144685, + -1.53240294563095e-05,-0.0035703951149697,0.184473657699027,-0.321786746269277, + -1.55795130290515e-05,-0.00329751853514404,0.194684720295465,-0.349063343393869, + -1.58349966017934e-05,-0.00302464195531815,0.204895782891903,-0.376339940518461, + -1.60904801742578e-05,-0.00275176537549227,0.215106845488341,-0.403616537643053, + -1.63459637469998e-05,-0.0024788887956666,0.225317908084778,-0.430893134767645, + -1.66014473197418e-05,-0.00220601221584094,0.235528970681216,-0.458169731892237, + -1.68569308922617e-05,-0.0019331356360146,0.245740033277654,-0.485446329016829, + -1.71124144652257e-05,-0.00166025905618916,0.255951095874092,-0.512722926141421, + -1.73678980380787e-05,-0.00138738247636394,0.266162158470529,-0.539999523266013, + -1.76233816108207e-05,-0.00111450589653783,0.276373221066967,-0.567276120390605, + -1.78788651831185e-05,-0.000841629316711723,0.286584283663405,-0.594552717515197, + -1.81343487561936e-05,-0.000568752736886502,0.296795346259843,-0.621829314639789, + -1.83898323284915e-05,-0.000295876157060171,0.307006408856281,-0.649105911764381, + -1.86453159012334e-05,-2.2999577234728e-05,0.317217471452719,-0.676382508888973, + -1.89007994746415e-05,0.000249877002590271,0.327428534049156,-0.703659106013565, + -1.91562830463843e-05,0.00052275358241749,0.337639596645594,-0.730935703138157, + -1.94117666195703e-05,0.000795630162242489,0.347850659242032,-0.758212300262749, + -1.96672501920903e-05,0.00106850674206882,0.35806172183847,-0.785488897387341, + -1.02210907211298e-05,-0.00526479979132233,0.111860171746584,-0.131788490061392, + -1.03758516132035e-05,-0.00502884141754323,0.121765353500718,-0.159253747756793, + -1.05306125047777e-05,-0.00479288304376324,0.131670535254852,-0.186719005452195, + -1.06853733966572e-05,-0.00455692466998392,0.141575717008986,-0.214184263147596, + -1.08401342883702e-05,-0.00432096629620426,0.15148089876312,-0.241649520842997, + -1.09948951803052e-05,-0.00408500792242505,0.161386080517254,-0.269114778538399, + -1.11496560720736e-05,-0.0038490495486454,0.171291262271389,-0.2965800362338, + -1.13044169638421e-05,-0.00361309117486552,0.181196444025523,-0.324045293929201, + -1.14591778557216e-05,-0.00337713280108631,0.191101625779657,-0.351510551624603, + -1.16139387474901e-05,-0.0031411744273071,0.201006807533791,-0.378975809320004, + -1.17686996394806e-05,-0.00290521605352767,0.210911989287925,-0.406441067015405, + -1.19234605313601e-05,-0.00266925767974802,0.22081717104206,-0.433906324710807, + -1.20782214225734e-05,-0.00243329930596792,0.230722352796194,-0.461371582406208, + -1.22329823145639e-05,-0.00219734093218849,0.240627534550328,-0.488836840101609, + -1.23877432067765e-05,-0.00196138255840927,0.250532716304462,-0.516302097797011, + -1.25425040981009e-05,-0.00172542418462962,0.260437898058596,-0.543767355492412, + -1.26972649903134e-05,-0.00148946581085019,0.270343079812731,-0.571232613187813, + -1.28520258819709e-05,-0.00125350743707053,0.280248261566865,-0.598697870883215, + -1.30067867732953e-05,-0.00101754906329088,0.290153443320999,-0.626163128578616, + -1.31615476660629e-05,-0.000781590689512335,0.300058625075133,-0.653628386274017, + -1.33163085576093e-05,-0.000545632315732902,0.309963806829266,-0.681093643969419, + -1.34710694490447e-05,-0.000309673941952582,0.319868988583401,-0.70855890166482, + -1.36258303411463e-05,-7.37155681727053e-05,0.329774170337536,-0.736024159360221, + -1.37805912330258e-05,0.000162242805606283,0.33967935209167,-0.763489417055623, + -1.39353521244612e-05,0.000398201179385715,0.349584533845804,-0.790954674751024, + -7.61269064772363e-06,-0.00510106851568781,0.110962392421196,-0.132522487820334, + -7.70515579273656e-06,-0.00489510769763823,0.120626441929424,-0.160135386993876, + -7.79762093761072e-06,-0.00468914687958821,0.130290491437652,-0.187748286167419, + -7.8900860826514e-06,-0.00448318606153864,0.13995454094588,-0.215361185340961, + -7.98255122769209e-06,-0.00427722524348906,0.149618590454108,-0.242974084514503, + -8.07501637256625e-06,-0.00407126442543915,0.159282639962336,-0.270586983688046, + -8.16748151727387e-06,-0.00386530360738924,0.168946689470564,-0.298199882861588, + -8.25994666237007e-06,-0.00365934278933966,0.178610738978792,-0.325812782035131, + -8.35241180741075e-06,-0.00345338197129008,0.188274788487019,-0.353425681208673, + -8.44487695211837e-06,-0.00324742115324006,0.197938837995247,-0.381038580382215, + -8.53734209715906e-06,-0.00304146033519048,0.207602887503475,-0.408651479555758, + -8.62980724247731e-06,-0.00283549951714113,0.217266937011703,-0.4362643787293, + -8.72227238712941e-06,-0.00262953869909088,0.226930986519931,-0.463877277902843, + -8.81473753222561e-06,-0.00242357788104131,0.236595036028159,-0.491490177076385, + -8.90720267698875e-06,-0.00221761706299173,0.246259085536387,-0.519103076249928, + -8.99966782164086e-06,-0.00201165624494148,0.255923135044615,-0.54671597542347, + -9.09213296673705e-06,-0.00180569542689168,0.265587184552843,-0.574328874597013, + -9.18459811194428e-06,-0.00159973460884277,0.275251234061071,-0.601941773770555, + -9.27706325681843e-06,-0.00139377379079253,0.284915283569299,-0.629554672944097, + -9.36952840124849e-06,-0.00118781297274184,0.294579333077527,-0.65716757211764, + -9.46199354678878e-06,-0.000981852154693375,0.304243382585755,-0.684780471291182, + -9.55445869210703e-06,-0.000775891336643575,0.313907432093983,-0.712393370464725, + -9.64692383687016e-06,-0.000569930518594219,0.32357148160221,-0.740006269638267, + -9.73938898196636e-06,-0.00036396970054442,0.333235531110438,-0.76761916881181, + -9.8318541272846e-06,-0.000158008882495064,0.342899580618667,-0.795232067985352, + -5.60968746154966e-06,-0.00497889556875963,0.110270734505491,-0.133083736804912, + -5.66472350171932e-06,-0.004796528543909,0.119749362317796,-0.1608095295516, + -5.71975954172244e-06,-0.00461416151905814,0.129227990130102,-0.188535322298289, + -5.77479558172556e-06,-0.00443179449420739,0.138706617942407,-0.216261115044977, + -5.82983162217277e-06,-0.00424942746935697,0.148185245754712,-0.243986907791666, + -5.8848676622314e-06,-0.00406706044450655,0.157663873567016,-0.271712700538355, + -5.93990370212349e-06,-0.00388469341965525,0.167142501379322,-0.299438493285043, + -5.9949397420711e-06,-0.00370232639480439,0.176621129191627,-0.327164286031732, + -6.04997578240729e-06,-0.00351995936995397,0.186099757003932,-0.354890078778421, + -6.1050118223549e-06,-0.00333759234510289,0.195578384816237,-0.382615871525109, + -6.16004786246904e-06,-0.00315522532025247,0.205057012628542,-0.410341664271798, + -6.21508390308279e-06,-0.0029728582954025,0.214535640440847,-0.438067457018487, + -6.27011994280835e-06,-0.00279049127055142,0.224014268253152,-0.465793249765175, + -6.32515598286698e-06,-0.00260812424570056,0.233492896065457,-0.493519042511864, + -6.38019202292561e-06,-0.00242575722084948,0.242971523877762,-0.521244835258553, + -6.43522806320629e-06,-0.00224339019599951,0.252450151690067,-0.548970628005241, + -6.49026410359799e-06,-0.00206102317114909,0.261928779502372,-0.57669642075193, + -6.54530014321253e-06,-0.00187865614629779,0.271407407314677,-0.604422213498619, + -6.60033618393729e-06,-0.00169628912144804,0.280886035126982,-0.632148006245307, + -6.65537222377388e-06,-0.00151392209659695,0.290364662939287,-0.659873798991996, + -6.71040826361047e-06,-0.00133155507174543,0.299843290751592,-0.687599591738684, + -6.76544430378012e-06,-0.00114918804689479,0.309321918563898,-0.715325384485373, + -6.82048034428284e-06,-0.000966821022044595,0.318800546376202,-0.743051177232062, + -6.87551638389738e-06,-0.000784453997193513,0.328279174188507,-0.770776969978751, + -6.93055242428908e-06,-0.000602086972343319,0.337757802000812,-0.798502762725439, + -4.10027489805564e-06,-0.00488884778478804,0.109748227384138,-0.13350533452058, + -4.13320112943594e-06,-0.004724578386053,0.119086977347266,-0.161315930400744, + -4.1661273611493e-06,-0.00456030898731841,0.128425727310393,-0.189126526280908, + -4.19905359239081e-06,-0.00439603958858314,0.137764477273521,-0.216937122161073, + -4.23197982385437e-06,-0.00423177018984811,0.147103227236649,-0.244747718041237, + -4.264906055651e-06,-0.00406750079111351,0.156441977199777,-0.272558313921401, + -4.29783228705904e-06,-0.00390323139237858,0.165780727162905,-0.300368909801565, + -4.3307585185226e-06,-0.00373896199364343,0.175119477126033,-0.328179505681729, + -4.36368475026372e-06,-0.00357469259490872,0.184458227089161,-0.355990101561893, + -4.39661098144972e-06,-0.00341042319617335,0.193796977052289,-0.383800697442057, + -4.42953721291328e-06,-0.00324615379743864,0.203135727015416,-0.411611293322221, + -4.46246344421031e-06,-0.00308188439870349,0.212474476978544,-0.439421889202385, + -4.4953896758404e-06,-0.00291761499996834,0.221813226941672,-0.46723248508255, + -4.52831590758151e-06,-0.00275334560123386,0.2311519769048,-0.495043080962714, + -4.56124213898956e-06,-0.00258907620249915,0.240490726867927,-0.522853676842878, + -4.59416837017557e-06,-0.00242480680376356,0.249829476831056,-0.550664272723042, + -4.62709460191668e-06,-0.00226053740502841,0.259168226794184,-0.578474868603206, + -4.66002083332473e-06,-0.00209626800629392,0.268506976757311,-0.60628546448337, + -4.69294706528789e-06,-0.00193199860755966,0.277845726720439,-0.634096060363534, + -4.72587329725105e-06,-0.00176772920882495,0.287184476683567,-0.661906656243698, + -4.75879952788194e-06,-0.00160345981008936,0.296523226646695,-0.689717252123862, + -4.79172575928999e-06,-0.00143919041135465,0.305861976609822,-0.717527848004027, + -4.8246519910311e-06,-0.00127492101261906,0.315200726572951,-0.745338443884191, + -4.85757822221711e-06,-0.00111065161388435,0.324539476536078,-0.773149039764355, + -4.89050445406924e-06,-0.000946382215150088,0.333878226499206,-0.800959635644519, + -2.9788671481179e-06,-0.00482306122726872,0.109359315352207,-0.133817820434063, + -2.99881215790054e-06,-0.00467241318619205,0.118594060224239,-0.161691271931431, + -3.01875716784972e-06,-0.0045217651451156,0.127828805096271,-0.189564723428799, + -3.03870217749358e-06,-0.00437111710403848,0.137063549968304,-0.217438174926168, + -3.05864718730398e-06,-0.00422046906296181,0.146298294840336,-0.245311626423536, + -3.07859219716988e-06,-0.00406982102188536,0.155533039712368,-0.273185077920904, + -3.09853720698028e-06,-0.00391917298080835,0.1647677845844,-0.301058529418273, + -3.1184822169017e-06,-0.00376852493973168,0.174002529456433,-0.328931980915641, + -3.13842722687863e-06,-0.003617876898655,0.183237274328465,-0.356805432413009, + -3.15837223624493e-06,-0.00346722885757789,0.192472019200497,-0.384678883910378, + -3.17831724633288e-06,-0.00331658081650188,0.201706764072529,-0.412552335407746, + -3.19826225603226e-06,-0.00316593277542476,0.210941508944561,-0.440425786905114, + -3.21820726600919e-06,-0.00301528473434809,0.220176253816593,-0.468299238402483, + -3.23815227576407e-06,-0.00286463669327119,0.229410998688626,-0.496172689899851, + -3.25809728551896e-06,-0.00271398865219474,0.238645743560658,-0.524046141397219, + -3.27804229527384e-06,-0.00256334061111763,0.24788048843269,-0.551919592894588, + -3.29798730525077e-06,-0.00241269257004095,0.257115233304723,-0.579793044391956, + -3.31793231478361e-06,-0.00226204452896428,0.266349978176754,-0.607666495889325, + -3.33787732498259e-06,-0.00211139648788761,0.275584723048787,-0.635539947386693, + -3.3578223344044e-06,-0.00196074844681071,0.284819467920819,-0.663413398884061, + -3.37776734393724e-06,-0.00181010040573382,0.294054212792851,-0.69128685038143, + -3.3977123540252e-06,-0.00165945236465737,0.303288957664883,-0.719160301878798, + -3.41765736378008e-06,-0.00150880432358003,0.312523702536916,-0.747033753376166, + -3.43760237364599e-06,-0.00135815628250402,0.321758447408948,-0.774907204873535, + -3.45754738451109e-06,-0.00120750824142801,0.33099319228098,-0.802780656370903, + -2.15447966761539e-06,-0.00477530097020373,0.109073020878775,-0.134047143901708, + -2.16677689013345e-06,-0.00463476167236698,0.118231261847959,-0.161966723136284, + -2.17907411254048e-06,-0.00449422237453001,0.127389502817143,-0.18988630237086, + -2.19137133533609e-06,-0.00435368307669359,0.136547743786326,-0.217805881605436, + -2.20366855779863e-06,-0.00421314377885684,0.145705984755509,-0.245725460840013, + -2.21596578053873e-06,-0.00407260448102031,0.154864225724693,-0.273645040074589, + -2.22826300316781e-06,-0.00393206518318401,0.164022466693876,-0.301564619309165, + -2.24056022557484e-06,-0.0037915258853467,0.17318070766306,-0.329484198543741, + -2.25285744842596e-06,-0.00365098658751051,0.182338948632243,-0.357403777778317, + -2.2651546708885e-06,-0.00351044728967387,0.191497189601427,-0.385323357012893, + -2.27745189324002e-06,-0.00336990799183656,0.200655430570611,-0.41324293624747, + -2.2897491158691e-06,-0.00322936869400037,0.209813671539794,-0.441162515482046, + -2.30204633844266e-06,-0.00308882939616351,0.218971912508977,-0.469082094716622, + -2.31434356090521e-06,-0.00294829009832664,0.228130153478161,-0.497001673951198, + -2.32664078381184e-06,-0.00280775080049023,0.237288394447344,-0.524921253185774, + -2.33893800649643e-06,-0.00266721150265403,0.246446635416527,-0.55284083242035, + -2.35123522906999e-06,-0.00252667220481717,0.255604876385711,-0.580760411654927, + -2.36353245142151e-06,-0.00238613290698053,0.264763117354894,-0.608679990889503, + -2.37582967355099e-06,-0.002245593609143,0.273921358324078,-0.636599570124079, + -2.38812689645762e-06,-0.00210505431130636,0.283079599293262,-0.664519149358655, + -2.40042411892016e-06,-0.00196451501347017,0.292237840262445,-0.692438728593231, + -2.41272134204884e-06,-0.00182397571563353,0.301396081231629,-0.720358307827807, + -2.42501856440036e-06,-0.00168343641779733,0.310554322200812,-0.748277887062384, + -2.43731578664086e-06,-0.00154289711995981,0.319712563169996,-0.77619746629696, + -2.44961300954749e-06,-0.00140235782212317,0.328870804139179,-0.804117045531536, + -1.5531331770402e-06,-0.00474078261675359,0.108863975224288,-0.13421421309183, + -1.56087352429224e-06,-0.00460766781943001,0.117966385942351,-0.16216739779983, + -1.5686138719051e-06,-0.00447455302210653,0.127068796660415,-0.190120582507831, + -1.57635421910163e-06,-0.00434143822478306,0.136171207378478,-0.218073767215831, + -1.58409456674224e-06,-0.0042083234274598,0.145273618096541,-0.246026951923831, + -1.59183491404979e-06,-0.00407520863013622,0.154376028814604,-0.273980136631832, + -1.59957526157939e-06,-0.00394209383281274,0.163478439532668,-0.301933321339832, + -1.60731560899796e-06,-0.0038089790354896,0.172580850250731,-0.329886506047832, + -1.61505595641653e-06,-0.00367586423816602,0.181683260968794,-0.357839690755832, + -1.62279630350204e-06,-0.00354274944084199,0.190785671686858,-0.385792875463833, + -1.63053665125368e-06,-0.00340963464351884,0.199888082404921,-0.413746060171833, + -1.63827699861674e-06,-0.0032765198461957,0.208990493122984,-0.441699244879833, + -1.64601734586878e-06,-0.00314340504887145,0.218092903841048,-0.469652429587833, + -1.65375769334286e-06,-0.00301029025154831,0.227195314559111,-0.497605614295834, + -1.66149804081694e-06,-0.00287717545422472,0.236297725277174,-0.525558799003834, + -1.66923838840205e-06,-0.00274406065690158,0.245400135995237,-0.553511983711834, + -1.67697873554307e-06,-0.002610945859578,0.2545025467133,-0.581465168419835, + -1.68471908268408e-06,-0.00247783106225441,0.263604957431364,-0.609418353127835, + -1.69245943026919e-06,-0.00234471626493082,0.272707368149427,-0.637371537835835, + -1.70019977785429e-06,-0.00221160146760724,0.281809778867491,-0.665324722543835, + -1.70794012566144e-06,-0.00207848667028498,0.290912189585553,-0.693277907251836, + -1.71568047235837e-06,-0.00194537187296007,0.300014600303617,-0.721231091959836, + -1.72342081961041e-06,-0.00181225707563692,0.30911701102168,-0.749184276667836, + -1.73116116708449e-06,-0.00167914227831378,0.318219421739743,-0.777137461375836, + -1.73890151422551e-06,-0.00154602748098931,0.327321832457807,-0.805090646083837, + -1.1169632548047e-06,-0.00471591413422234,0.108712239322846,-0.1343352819284, + -1.121941169413e-06,-0.00458821119745223,0.117774141990799,-0.16231281927477, + -1.12691908421558e-06,-0.00446050826068234,0.126836044658752,-0.19029035662114, + -1.13189699885163e-06,-0.00433280532391223,0.135897947326706,-0.218267893967511, + -1.13687491370973e-06,-0.00420510238714211,0.144959849994659,-0.246245431313881, + -1.14185282829027e-06,-0.004077399450372,0.154021752662612,-0.274222968660251, + -1.14683074303734e-06,-0.00394969651360211,0.163083655330565,-0.302200506006622, + -1.15180865795095e-06,-0.00382199357683199,0.172145557998518,-0.330178043352992, + -1.15678657253149e-06,-0.00369429064006188,0.181207460666472,-0.358155580699362, + -1.16176448744509e-06,-0.00356658770329221,0.190269363334425,-0.386133118045733, + -1.16674240202563e-06,-0.00343888476652188,0.199331266002378,-0.414110655392103, + -1.17172031710577e-06,-0.00331118182975199,0.208393168670331,-0.442088192738473, + -1.17669823140876e-06,-0.00318347889298121,0.217455071338285,-0.470065730084843, + -1.18167614615583e-06,-0.00305577595621154,0.226516974006237,-0.498043267431214, + -1.18665406068086e-06,-0.00292807301944142,0.23557887667419,-0.526020804777584, + -1.19163197520589e-06,-0.00280037008267087,0.244640779342144,-0.553998342123954, + -1.19660989028603e-06,-0.0026726671459012,0.253702682010097,-0.581975879470325, + -1.20158780514412e-06,-0.00254496420913153,0.26276458467805,-0.609953416816695, + -1.20656572011324e-06,-0.00241726127236142,0.271826487346003,-0.637930954163065, + -1.21154363419418e-06,-0.00228955833559086,0.280888390013956,-0.665908491509436, + -1.21652154938534e-06,-0.00216185539882119,0.28995029268191,-0.693886028855806, + -1.22149946402139e-06,-0.00203415246205108,0.299012195349863,-0.721863566202176, + -1.22647737854642e-06,-0.00190644952528052,0.308074098017816,-0.749841103548547, + -1.23145529307145e-06,-0.0017787465885104,0.317136000685769,-0.777818640894917, + -1.23643320815159e-06,-0.00165104365174118,0.326197903353722,-0.805796178241287, + -7.83414222345902e-05,-0.0116289112638718,0.141662584592908,-0.120891389200109, + -8.39283406746938e-05,-0.0109598102246087,0.157160732718559,-0.143991459763914, + -8.95152591147141e-05,-0.0102907091853457,0.17265888084421,-0.167091530327719, + -9.51021775547067e-05,-0.00962160814608259,0.188157028969861,-0.190191600891524, + -0.000100689095994588,-0.00895250710681939,0.203655177095512,-0.213291671455329, + -0.000106276014434692,-0.00828340606755651,0.219153325221162,-0.236391742019134, + -0.000111862932874962,-0.00761430502829374,0.234651473346813,-0.259491812582939, + -0.000117449851314677,-0.00694520398903031,0.250149621472464,-0.282591883146744, + -0.000123036769755003,-0.00627610294976755,0.265647769598115,-0.305691953710549, + -0.000128623688194773,-0.00560700191050412,0.281145917723766,-0.328792024274354, + -0.000134210606634488,-0.00493790087124046,0.296644065849417,-0.351892094838159, + -0.000139797525074647,-0.00426879983197748,0.312142213975068,-0.374992165401964, + -0.000145384443514751,-0.00359969879271449,0.327640362100719,-0.398092235965769, + -0.000150971361955077,-0.00293059775345195,0.34313851022637,-0.421192306529575, + -0.000156558280394958,-0.00226149671418896,0.358636658352021,-0.44429237709338, + -0.000162145198835062,-0.00159239567492575,0.374134806477672,-0.467392447657185, + -0.000167732117275166,-0.000923294635662764,0.389632954603323,-0.49049251822099, + -0.000173319035714825,-0.00025419359639911,0.405131102728974,-0.513592588784795, + -0.00017890595415504,0.000414907442863433,0.420629250854625,-0.5366926593486, + -0.000184492872595365,0.0010840084821262,0.436127398980275,-0.559792729912405, + -0.00019007979103558,0.00175310952138918,0.451625547105926,-0.58289280047621, + -0.00019566670947524,0.00242221056065306,0.467123695231578,-0.605992871040015, + -0.000201253627915454,0.0030913115999156,0.482621843357228,-0.62909294160382, + -0.000206840546355225,0.00376041263917903,0.498119991482879,-0.652193012167625, + -0.000212427464795661,0.00442951367844158,0.51361813960853,-0.67529308273143, + -7.76990489378682e-05,-0.0115458433149976,0.141457128654798,-0.121108633483948, + -8.32042916177889e-05,-0.0108778664364927,0.156901322561119,-0.144248658146241, + -8.87095342972932e-05,-0.0102098895579871,0.172345516467441,-0.167388682808533, + -9.42147769772417e-05,-0.00954191267948201,0.187789710373762,-0.190528707470825, + -9.97200196568016e-05,-0.00887393580097673,0.203233904280083,-0.213668732133118, + -0.000105225262336306,-0.00820595892247145,0.218678098186404,-0.23680875679541, + -0.00011073050501631,-0.00753798204396627,0.234122292092726,-0.259948781457702, + -0.000116235747695925,-0.00687000516546088,0.249566485999047,-0.283088806119995, + -0.000121740990375485,-0.00620202828695549,0.265010679905369,-0.306228830782287, + -0.000127246233055045,-0.00553405140845031,0.28045487381169,-0.329368855444579, + -0.000132751475734882,-0.00486607452994514,0.295899067718011,-0.352508880106872, + -0.000138256718414831,-0.00419809765144019,0.311343261624332,-0.375648904769164, + -0.000143761961094335,-0.0035301207729348,0.326787455530654,-0.398788929431456, + -0.000149267203773618,-0.00286214389442874,0.342231649436975,-0.421928954093749, + -0.000154772446453899,-0.00219416701592423,0.357675843343296,-0.445068978756041, + -0.000160277689133403,-0.00152619013741884,0.373120037249618,-0.468209003418333, + -0.000165782931813463,-0.000858213258914331,0.388564231155939,-0.491349028080626, + -0.000171288174493189,-0.000190236380408715,0.40400842506226,-0.514489052742918, + -0.000176793417172361,0.000477740498097567,0.419452618968582,-0.53762907740521, + -0.00018229865985242,0.0011457173766023,0.434896812874903,-0.560769102067503, + -0.000187803902531813,0.00181369425510791,0.450341006781225,-0.583909126729795, + -0.000193309145211762,0.00248167113361264,0.465785200687546,-0.607049151392087, + -0.000198814387891377,0.00314964801211826,0.481229394593867,-0.630189176054379, + -0.000204319630571437,0.0038176248906221,0.496673588500188,-0.653329200716672, + -0.000209824873250497,0.00448560176912904,0.51211778240651,-0.676469225378964, + -7.68175610340871e-05,-0.0114326568479056,0.141174780546538,-0.121406109441676, + -8.22115473388119e-05,-0.010766331768774,0.156544907596779,-0.144600843868951, + -8.76055336435644e-05,-0.0101000066896424,0.17191503464702,-0.167795578296226, + -9.29995199482891e-05,-0.00943368161051072,0.187285161697261,-0.190990312723501, + -9.83935062529584e-05,-0.00876735653137894,0.202655288747502,-0.214185047150775, + -0.000103787492557905,-0.00810103145224761,0.218025415797743,-0.23737978157805, + -0.000109181478862685,-0.00743470637311616,0.233395542847984,-0.260574516005325, + -0.000114575465167299,-0.00676838129398427,0.248765669898226,-0.2837692504326, + -0.000119969451471913,-0.0061020562148526,0.264135796948467,-0.306963984859875, + -0.000125363437776804,-0.00543573113572116,0.279505923998708,-0.330158719287149, + -0.000130757424081807,-0.00476940605659015,0.294876051048948,-0.353353453714424, + -0.000136151410386254,-0.00410308097745804,0.31024617809919,-0.376548188141699, + -0.000141545396690979,-0.00343675589832637,0.325616305149431,-0.399742922568974, + -0.000146939382995703,-0.00277043081919448,0.340986432199672,-0.422937656996249, + -0.000152333369300539,-0.00210410574006326,0.356356559249913,-0.446132391423524, + -0.000157727355605375,-0.00143778066093181,0.371726686300154,-0.469327125850798, + -0.000163121341910211,-0.00077145558180014,0.387096813350395,-0.492521860278073, + -0.000168515328215157,-0.000105130502668471,0.402466940400637,-0.515716594705348, + -0.00017390931451966,0.000561194576463198,0.417837067450878,-0.538911329132623, + -0.000179303300824163,0.00122751965559464,0.433207194501118,-0.562106063559898, + -0.000184697287129332,0.00189384473472609,0.448577321551359,-0.585300797987172, + -0.000190091273433723,0.00256016981385798,0.463947448601601,-0.608495532414447, + -0.000195485259738781,0.00322649489298943,0.479317575651842,-0.631690266841722, + -0.000200879246043284,0.00389281997212132,0.494687702702083,-0.654885001268997, + -0.000206273232348009,0.00455914505125321,0.510057829752324,-0.678079735696272, + -7.56168926999978e-05,-0.011279968639008,0.140789429704878,-0.121810129195623, + -8.08608735217153e-05,-0.0106160952802743,0.15605861693504,-0.145079168201847, + -8.61048543434606e-05,-0.00995222192154066,0.171327804165203,-0.168348207208072, + -9.13488351651504e-05,-0.00928834856280691,0.186596991395366,-0.191617246214297, + -9.65928159866736e-05,-0.00862447520407306,0.201866178625529,-0.214886285220522, + -0.000101836796808419,-0.00796060184533942,0.217135365855692,-0.238155324226746, + -0.000107080777629887,-0.00729672848660523,0.232404553085855,-0.261424363232971, + -0.000112324758451576,-0.00663285512787182,0.247673740316018,-0.284693402239196, + -0.000117568739273433,-0.0059689817691384,0.262942927546181,-0.307962441245421, + -0.000122812720095233,-0.00530510841040477,0.278212114776344,-0.331231480251646, + -0.000128056700916812,-0.00464123505167069,0.293481302006507,-0.35450051925787, + -0.000133300681738557,-0.00397736169293683,0.30875048923667,-0.377769558264095, + -0.000138544662560136,-0.0033134883342032,0.324019676466833,-0.40103859727032, + -0.000143788643382048,-0.00264961497546978,0.339288863696996,-0.424307636276545, + -0.000149032624203405,-0.00198574161673548,0.354558050927159,-0.44757667528277, + -0.000154276605025094,-0.00132186825800229,0.369827238157321,-0.470845714288995, + -0.000159520585847117,-0.000657994899268433,0.385096425387485,-0.494114753295219, + -0.000164764566668807,5.87845946498078e-06,0.400365612617647,-0.517383792301444, + -0.000170008547490497,0.000669751818198616,0.41563479984781,-0.540652831307669, + -0.000175252528312075,0.0013336251769327,0.430903987077973,-0.563921870313894, + -0.000180496509133099,0.00199749853566722,0.446173174308137,-0.587190909320118, + -0.000185740489955455,0.00266137189439997,0.461442361538299,-0.610459948326343, + -0.000190984470776923,0.00332524525313405,0.476711548768462,-0.633728987332568, + -0.000196228451598501,0.00398911861186768,0.491980735998625,-0.656998026338793, + -0.000201472432420524,0.00465299197060132,0.507249923228788,-0.680267065345017, + -7.39979141961555e-05,-0.0110767637999118,0.140268433623546,-0.122352798324143, + -7.9042448202532e-05,-0.0104165614610069,0.155401415260391,-0.145721641363983, + -8.4086982208631e-05,-0.00975635912210149,0.170534396897237,-0.169090484403822, + -8.91315162152573e-05,-0.00909615678319675,0.185667378534082,-0.192459327443662, + -9.4176050221495e-05,-0.00843595444429157,0.200800360170928,-0.215828170483502, + -9.92205842277882e-05,-0.00777575210538639,0.215933341807773,-0.239197013523341, + -0.000104265118234192,-0.00711554976648143,0.231066323444619,-0.262565856563181, + -0.000109309652240597,-0.00645534742757659,0.246199305081464,-0.28593469960302, + -0.000114354186246668,-0.00579514508867085,0.26133228671831,-0.30930354264286, + -0.000119398720253128,-0.005134942749766,0.276465268355156,-0.332672385682699, + -0.000124443254259476,-0.00447474041086093,0.291598249992001,-0.356041228722539, + -0.000129487788265714,-0.00381453807195586,0.306731231628846,-0.379410071762378, + -0.000134532322272118,-0.00315433573305079,0.321864213265692,-0.402778914802218, + -0.000139576856278745,-0.00249413339414595,0.336997194902537,-0.426147757842057, + -0.00014462139028526,-0.00183393105524154,0.352130176539383,-0.449516600881897, + -0.000149665924291109,-0.00117372871633559,0.367263158176228,-0.472885443921737, + -0.000154710458297846,-0.000513526377431184,0.382396139813074,-0.496254286961576, + -0.000159754992303918,0.000146675961474108,0.397529121449919,-0.519623130001416, + -0.0001647995263101,0.000806878300379399,0.412662103086765,-0.542991973041255, + -0.000169844060316393,0.00146708063928491,0.427795084723611,-0.566360816081095, + -0.000174888594323241,0.00212728297818909,0.442928066360456,-0.589729659120934, + -0.000179933128329313,0.00278748531709461,0.458061047997301,-0.613098502160774, + -0.000184977662335606,0.00344768765599968,0.473194029634147,-0.636467345200613, + -0.000190022196341788,0.00410788999490519,0.488327011270993,-0.659836188240453, + -0.000195066730348414,0.00476809233380981,0.503459992907838,-0.683205031280293, + -7.18444281493369e-05,-0.0108111761873713,0.139572979280439,-0.123070936765675, + -7.66287251092457e-05,-0.0101564987311539,0.154524611041197,-0.146571854967693, + -8.14130220691545e-05,-0.00950182127493626,0.169476242801955,-0.170072773169711, + -8.61973190288134e-05,-0.00884714381871832,0.184427874562713,-0.193573691371729, + -9.09816159885835e-05,-0.00819246636250082,0.199379506323472,-0.217074609573747, + -9.57659129484645e-05,-0.0075377889062832,0.21433113808423,-0.240575527775765, + -0.000100550209908123,-0.00688311145006515,0.229282769844989,-0.264076445977783, + -0.000105334506867838,-0.00622843399384765,0.244234401605747,-0.287577364179801, + -0.000110118803827775,-0.00557375653763015,0.259186033366505,-0.311078282381819, + -0.000114903100787545,-0.00491907908141243,0.274137665127263,-0.334579200583837, + -0.00011968739774737,-0.00426440162519492,0.289089296888022,-0.358080118785855, + -0.000124471694707418,-0.00360972416897787,0.304040928648779,-0.381581036987873, + -0.000129255991667243,-0.00295504671276015,0.318992560409538,-0.405081955189891, + -0.000134040288626625,-0.00230036925654198,0.333944192170296,-0.428582873391909, + -0.000138824585586783,-0.0016456918003247,0.348895823931055,-0.452083791593927, + -0.000143608882546498,-0.000991014344106977,0.363847455691813,-0.475584709795945, + -0.000148393179506434,-0.000336336887889921,0.378799087452571,-0.499085627997963, + -0.000153177476465927,0.000318340568328024,0.393750719213329,-0.522586546199981, + -0.000157961773425641,0.000973018024546191,0.408702350974088,-0.546087464401999, + -0.000162746070385467,0.00162769548076369,0.423653982734846,-0.569588382604017, + -0.000167530367345181,0.00228237293698141,0.438605614495604,-0.593089300806035, + -0.000172314664304896,0.00293705039319914,0.453557246256363,-0.616590219008053, + -0.000177098961265387,0.00359172784941597,0.468508878017121,-0.640091137210071, + -0.00018188325822488,0.00424640530563369,0.483460509777879,-0.663592055412089, + -0.000186667555184261,0.0049010827618523,0.498412141538638,-0.687092973614107, + -6.90314003069792e-05,-0.0104722002027698,0.138660364701854,-0.12400280290648, + -7.34845469011758e-05,-0.00982582607415372,0.153374801509756,-0.147675103622728, + -7.79376934958442e-05,-0.00917945194553793,0.168089238317658,-0.171347404338977, + -8.23908400900408e-05,-0.00853307781692147,0.18280367512556,-0.195019705055226, + -8.68439866842374e-05,-0.00788670368830502,0.197518111933462,-0.218692005771475, + -9.12971332787116e-05,-0.00724032955968901,0.212232548741364,-0.242364306487724, + -9.57502798729082e-05,-0.00659395543107255,0.226946985549266,-0.266036607203973, + -0.000100203426467271,-0.00594758130245654,0.241661422357168,-0.289708907920222, + -0.000104656573061634,-0.00530120717384031,0.25637585916507,-0.31338120863647, + -0.000109109719655998,-0.00465483304522429,0.271090295972972,-0.337053509352719, + -0.000113562866250083,-0.00400845891660806,0.285804732780874,-0.360725810068968, + -0.000118016012845112,-0.00336208478799249,0.300519169588776,-0.384398110785217, + -0.000122469159439254,-0.00271571065937581,0.315233606396678,-0.408070411501466, + -0.000126922306033284,-0.0020693365307598,0.329948043204579,-0.431742712217715, + -0.000131375452627314,-0.00142296240214268,0.344662480012482,-0.455415012933963, + -0.000135828599222121,-0.000776588273527334,0.359376916820384,-0.479087313650212, + -0.000140281745816262,-0.000130214144910878,0.374091353628285,-0.502759614366461, + -0.000144734892410292,0.0005161599837058,0.388805790436188,-0.52643191508271, + -0.000149188039004544,0.00116253411232203,0.40352022724409,-0.550104215798959, + -0.000153641185599573,0.00180890824093716,0.418234664051991,-0.573776516515208, + -0.000158094332193714,0.00245528236955384,0.432949100859893,-0.597448817231456, + -0.000162547478788189,0.00310165649816962,0.447663537667795,-0.621121117947705, + -0.000167000625382552,0.00374803062678586,0.462377974475697,-0.644793418663954, + -0.000171453771976915,0.00439440475540209,0.477092411283599,-0.668465719380203, + -0.000175906918571167,0.00504077888401788,0.491806848091501,-0.692138020096452, + -6.54427559836912e-05,-0.0100525494061992,0.137489370775112,-0.125181671037007, + -6.94881053941165e-05,-0.00941851850435549,0.151900710412697,-0.149070781201855, + -7.35334548044864e-05,-0.00878448760251183,0.166312050050283,-0.172959891366703, + -7.75788042147729e-05,-0.00815045670066783,0.180723389687868,-0.196849001531552, + -8.1624153625004e-05,-0.00751642579882406,0.195134729325454,-0.2207381116964, + -8.5669503035235e-05,-0.00688239489698028,0.209546068963039,-0.244627221861248, + -8.97148524458546e-05,-0.00624836399513673,0.223957408600625,-0.268516332026096, + -9.37602018560302e-05,-0.00561433309329273,0.23836874823821,-0.292405442190945, + -9.78055512662612e-05,-0.00498030219144896,0.252780087875795,-0.316294552355793, + -0.000101850900676825,-0.00434627128960541,0.267191427513381,-0.340183662520641, + -0.00010589625008689,-0.00371224038776119,0.281602767150966,-0.364072772685489, + -0.000109941599497287,-0.00307820948591742,0.296014106788552,-0.387961882850338, + -0.000113986948907407,-0.0024441785840732,0.310425446426138,-0.411850993015186, + -0.000118032298318083,-0.00181014768222987,0.324836786063723,-0.435740103180034, + -0.000122077647728536,-0.00117611678038654,0.339248125701308,-0.459629213344882, + -0.000126122997138767,-0.000542085878542098,0.353659465338894,-0.483518323509731, + -0.000130168346549442,9.19450233007879e-05,0.368070804976479,-0.507407433674579, + -0.000134213695959118,0.00072597592514545,0.382482144614065,-0.531296543839427, + -0.000138259045369793,0.001360006826989,0.39689348425165,-0.555185654004275, + -0.000142304394780024,0.00199403772883233,0.411304823889235,-0.579074764169124, + -0.000146349744190699,0.00262806863067588,0.425716163526821,-0.602963874333972, + -0.00015039509360093,0.00326209953251988,0.440127503164406,-0.62685298449882, + -0.000154440443011494,0.00389613043436299,0.454538842801991,-0.650742094663668, + -0.000158485792421281,0.00453016133620832,0.468950182439578,-0.674631204828516, + -0.000162531141831401,0.00516419223805231,0.483361522077163,-0.698520314993365, + -6.10006916742234e-05,-0.00955241818104746,0.136029599275224,-0.126625996462491, + -6.45644653196609e-05,-0.00893631688648289,0.150064975374546,-0.15078073718515, + -6.81282389652926e-05,-0.00832021559191864,0.164100351473868,-0.174935477907808, + -7.16920126107579e-05,-0.00770411429735429,0.17813572757319,-0.199090218630467, + -7.52557862562231e-05,-0.00708801300278983,0.192171103672513,-0.223244959353126, + -7.88195599014663e-05,-0.00647191170822492,0.206206479771835,-0.247399700075785, + -8.23833335472646e-05,-0.00585581041366079,0.220241855871157,-0.271554440798444, + -8.59471071922857e-05,-0.00523970911909566,0.23427723197048,-0.295709181521103, + -8.9510880837973e-05,-0.00462360782453164,0.248312608069802,-0.319863922243762, + -9.30746544831051e-05,-0.00400750652996651,0.262347984169125,-0.344018662966421, + -9.66384281291255e-05,-0.00339140523540271,0.276383360268447,-0.36817340368908, + -0.00010020220177398,-0.00277530394083758,0.290418736367769,-0.392328144411739, + -0.000103765975419834,-0.00215920264627356,0.304454112467091,-0.416482885134398, + -0.000107329749065022,-0.00154310135170888,0.318489488566414,-0.440637625857057, + -0.000110893522710542,-0.000927000057144189,0.332524864665736,-0.464792366579716, + -0.000114457296356285,-0.000310898762580392,0.346560240765058,-0.488947107302375, + -0.000118021070001584,0.000305202531984516,0.36059561686438,-0.513101848025034, + -0.000121584843646771,0.00092130382654898,0.374630992963702,-0.537256588747693, + -0.000125148617292625,0.00153740512111322,0.388666369063025,-0.561411329470351, + -0.000128712390937147,0.00215350641567902,0.402701745162347,-0.58556607019301, + -0.00013227616458289,0.00276960771024282,0.416737121261669,-0.609720810915669, + -0.000135839938228743,0.0033857090048075,0.430772497360992,-0.633875551638328, + -0.000139403711874597,0.0040018102993713,0.444807873460314,-0.658030292360987, + -0.000142967485519341,0.00461791159393732,0.458843249559637,-0.682185033083646, + -0.000146531259164751,0.00523401288850156,0.472878625658959,-0.706339773806305, + -5.5703650192529e-05,-0.0089830523772978,0.134274251811519,-0.128327688174916, + -5.87275555902489e-05,-0.00839205339918936,0.147860149854505,-0.152795392521159, + -6.17514609882464e-05,-0.00780105442108114,0.161446047897492,-0.177263096867402, + -6.47753663862716e-05,-0.00721005544297315,0.175031945940478,-0.201730801213645, + -6.77992717841303e-05,-0.00661905646486483,0.188617843983464,-0.226198505559887, + -7.08231771822665e-05,-0.00602805748675694,0.202203742026451,-0.25066620990613, + -7.38470825800697e-05,-0.00543705850864851,0.215789640069437,-0.275133914252372, + -7.68709879779839e-05,-0.0048460595305404,0.229375538112424,-0.299601618598615, + -7.98948933761201e-05,-0.0042550605524323,0.24296143615541,-0.324069322944858, + -8.29187987739788e-05,-0.0036640615743242,0.256547334198396,-0.348537027291101, + -8.5942704172004e-05,-0.00307306259621587,0.270133232241383,-0.373004731637343, + -8.89666095700292e-05,-0.00248206361810821,0.283719130284369,-0.397472435983586, + -9.19905149677769e-05,-0.00189106463999944,0.297305028327356,-0.421940140329828, + -9.50144203657466e-05,-0.00130006566189156,0.310890926370342,-0.446407844676071, + -9.80383257632722e-05,-0.000709066683782344,0.324476824413329,-0.470875549022314, + -0.000101062231161464,-0.000118067705674907,0.338062722456315,-0.495343253368556, + -0.000104086136559878,0.000472931272432753,0.351648620499301,-0.519810957714799, + -0.000107110041957181,0.00106393025054174,0.365234518542288,-0.544278662061042, + -0.000110133947355151,0.00165492922865007,0.378820416585274,-0.568746366407284, + -0.000113157852753343,0.00224592820675795,0.392406314628261,-0.593214070753527, + -0.000116181758151424,0.00283692718486561,0.405992212671247,-0.61768177509977, + -0.00011920566354906,0.0034279261629746,0.419578110714234,-0.642149479446012, + -0.000122229568947252,0.00401892514108226,0.43316400875722,-0.666617183792255, + -0.000125253474345,0.00460992411919081,0.446749906800206,-0.691084888138498, + -0.000128277379742858,0.00520092309729936,0.460335804843193,-0.71555259248474, + -4.96617395167875e-05,-0.00836817782865384,0.132253064403274,-0.130242626607584, + -5.21170075100941e-05,-0.00781059006857521,0.14532472226681,-0.155062513471054, + -5.45722755033728e-05,-0.0072530023084969,0.158396380130346,-0.179882400334524, + -5.70275434969014e-05,-0.00669541454841849,0.171468037993881,-0.204702287197994, + -5.94828114901524e-05,-0.00613782678833974,0.184539695857417,-0.229522174061464, + -6.19380794834035e-05,-0.00558023902826121,0.197611353720953,-0.254342060924934, + -6.4393347476599e-05,-0.00502265126818258,0.210683011584489,-0.279161947788404, + -6.68486154701831e-05,-0.00446506350810427,0.223754669448024,-0.303981834651874, + -6.93038834631565e-05,-0.00390747574802552,0.23682632731156,-0.328801721515344, + -7.17591514568516e-05,-0.00334988798794744,0.249897985175096,-0.353621608378814, + -7.42144194501582e-05,-0.00279230022786892,0.262969643038631,-0.378441495242285, + -7.66696874434647e-05,-0.00223471246779017,0.276041300902167,-0.403261382105755, + -7.91249554369378e-05,-0.00167712470771209,0.289112958765703,-0.428081268969225, + -8.15802234301888e-05,-0.00111953694763356,0.302184616629239,-0.452901155832695, + -8.40354914234398e-05,-0.000561949187554811,0.315256274492774,-0.477721042696165, + -8.64907594170239e-05,-4.36142747672896e-06,0.32832793235631,-0.502540929559635, + -8.89460274100529e-05,0.000553226332601797,0.341399590219845,-0.527360816423105, + -9.14012954035259e-05,0.00111081409268077,0.354471248083382,-0.552180703286575, + -9.385656339711e-05,0.00166840185275863,0.367542905946917,-0.577000590150046, + -9.63118313906941e-05,0.00222598961283715,0.380614563810453,-0.601820477013516, + -9.87670993839451e-05,0.00278357737291524,0.393686221673988,-0.626640363876986, + -0.00010122236737653,0.00334116513299509,0.406757879537525,-0.651460250740456, + -0.000103677635370003,0.00389875289307318,0.41982953740106,-0.676280137603926, + -0.000106132903363476,0.0044563406531517,0.432901195264596,-0.701100024467396, + -0.000108588171356838,0.00501392841322978,0.445972853128131,-0.725919911330866, + -4.31106498472444e-05,-0.00774140441284921,0.130039117898095,-0.132289312478137, + -4.50083614302044e-05,-0.00722559384707899,0.142551279483455,-0.157485611956012, + -4.69060730135529e-05,-0.00670978328130956,0.155063441068814,-0.182681911433887, + -4.88037845968181e-05,-0.00619397271553979,0.167575602654174,-0.207878210911763, + -5.07014961800833e-05,-0.00567816214977002,0.180087764239534,-0.233074510389638, + -5.25992077629045e-05,-0.00516235158399958,0.192599925824894,-0.258270809867513, + -5.44969193461142e-05,-0.00464654101823014,0.205112087410254,-0.283467109345389, + -5.63946309291019e-05,-0.0041307304524596,0.217624248995614,-0.308663408823264, + -5.82923425126447e-05,-0.0036149198866906,0.230136410580973,-0.333859708301139, + -6.01900540958544e-05,-0.0030991093209205,0.242648572166333,-0.359056007779015, + -6.20877656791197e-05,-0.00258329875515106,0.255160733751693,-0.38425230725689, + -6.39854772621629e-05,-0.00206748818938096,0.267672895337053,-0.409448606734765, + -6.58831888453726e-05,-0.0015516776236113,0.280185056922412,-0.434644906212641, + -6.77809004285823e-05,-0.00103586705784142,0.292697218507772,-0.459841205690516, + -6.967861201157e-05,-0.000520056492071319,0.305209380093132,-0.485037505168391, + -7.15763235950018e-05,-4.24592630188236e-06,0.317721541678492,-0.510233804646267, + -7.34740351782115e-05,0.000511564639467998,0.330233703263851,-0.535430104124142, + -7.53717467607551e-05,0.00102737520523877,0.342745864849211,-0.560626403602018, + -7.72694583445199e-05,0.00154318577100776,0.355258026434571,-0.585822703079893, + -7.91671699273966e-05,0.00205899633677742,0.36777018801993,-0.611019002557768, + -8.10648815107173e-05,0.00257480690254752,0.380282349605291,-0.636215302035643, + -8.29625930941491e-05,0.00309061746831718,0.39279451119065,-0.661411601513519, + -8.48603046766927e-05,0.00360642803408773,0.40530667277601,-0.686607900991394, + -8.67580162601245e-05,0.00412223859985694,0.41781883436137,-0.71180420046927, + -8.86557278433342e-05,0.00463804916562705,0.43033099594673,-0.737000499947145, + -3.63868331456629e-05,-0.00713947377690205,0.127742968489222,-0.134359797139464, + -3.77790412184609e-05,-0.00667232986491384,0.139678744397291,-0.159936886144286, + -3.91712492913698e-05,-0.00620518595292563,0.15161452030536,-0.185513975149108, + -4.05634573641955e-05,-0.00573804204093731,0.163550296213429,-0.21109106415393, + -4.19556654374653e-05,-0.00527089812894943,0.175486072121498,-0.236668153158752, + -4.33478735101245e-05,-0.00480375421696089,0.187421848029568,-0.262245242163574, + -4.47400815835053e-05,-0.00433661030497334,0.199357623937637,-0.287822331168396, + -4.61322896562755e-05,-0.00386946639298502,0.211293399845706,-0.313399420173218, + -4.75244977292677e-05,-0.00340232248099692,0.223229175753775,-0.33897650917804, + -4.89167058019824e-05,-0.00293517856900838,0.235164951661845,-0.364553598182862, + -5.03089138752522e-05,-0.0024680346570205,0.247100727569914,-0.390130687187684, + -5.17011219481889e-05,-0.00200089074503262,0.259036503477983,-0.415707776192506, + -5.30933300211256e-05,-0.00153374683304408,0.270972279386053,-0.441284865197328, + -5.44855380941733e-05,-0.0010666029210562,0.282908055294122,-0.46686195420215, + -5.58777461671101e-05,-0.000599459009068326,0.294843831202191,-0.492439043206972, + -5.72699542398247e-05,-0.000132315097079561,0.30677960711026,-0.518016132211794, + -5.86621623130945e-05,0.000334828814908095,0.318715383018329,-0.543593221216616, + -6.00543703859202e-05,0.000801972726896416,0.330651158926399,-0.569170310221438, + -6.1446578459079e-05,0.00126911663888407,0.342586934834467,-0.59474739922626, + -6.28387865322377e-05,0.00173626055087217,0.354522710742537,-0.620324488231082, + -6.42309946051745e-05,0.00220340446286027,0.366458486650606,-0.645901577235904, + -6.56232026785553e-05,0.00267054837484748,0.378394262558675,-0.671478666240726, + -6.70154107510479e-05,0.00313769228683647,0.390330038466744,-0.697055755245548, + -6.84076188239846e-05,0.00360483619882501,0.402265814374814,-0.72263284425037, + -6.97998268970323e-05,0.00407198011081267,0.414201590282883,-0.748209933255191, + -2.98635966270167e-05,-0.0065938869575296,0.125492570526292,-0.136341083487356, + -3.08332553230206e-05,-0.00617936697725818,0.136867013534308,-0.162282557268965, + -3.18029140187748e-05,-0.00576484699698687,0.148241456542323,-0.188224031050575, + -3.27725727150008e-05,-0.00535032701671589,0.159615899550339,-0.214165504832184, + -3.37422314108382e-05,-0.00493580703644436,0.170990342558355,-0.240106978613793, + -3.47118901066756e-05,-0.00452128705617283,0.182364785566371,-0.266048452395403, + -3.56815488028461e-05,-0.00410676707590207,0.193739228574386,-0.291989926177012, + -3.66512074982395e-05,-0.00369224709562976,0.205113671582402,-0.317931399958621, + -3.76208661945765e-05,-0.00327772711535901,0.216488114590418,-0.343872873740231, + -3.85905248906915e-05,-0.00286320713508803,0.227862557598434,-0.36981434752184, + -3.95601835864179e-05,-0.00244868715481639,0.239237000606449,-0.395755821303449, + -4.05298422825329e-05,-0.00203416717454519,0.250611443614465,-0.421697295085058, + -4.14995009785368e-05,-0.00161964719427399,0.261985886622481,-0.447638768866668, + -4.24691596747628e-05,-0.00120512721400279,0.273360329630497,-0.473580242648277, + -4.34388183704337e-05,-0.00079060723373181,0.284734772638512,-0.499521716429886, + -4.44084770662156e-05,-0.000376087253459501,0.296109215646529,-0.525463190211496, + -4.53781357624417e-05,3.84327268108109e-05,0.307483658654544,-0.551404663993105, + -4.63477944582236e-05,0.000452952707082455,0.31885810166256,-0.577346137774714, + -4.73174531544496e-05,0.000867472687353654,0.330232544670576,-0.603287611556324, + -4.82871118500094e-05,0.00128199266762508,0.341606987678591,-0.629229085337933, + -4.92567705456803e-05,0.00169651264789694,0.352981430686607,-0.655170559119542, + -5.02264292421284e-05,0.00211103262816748,0.364355873694623,-0.681112032901152, + -5.11960879381324e-05,0.00252555260843934,0.375730316702639,-0.707053506682761, + -5.21657466340253e-05,0.00294007258871032,0.387104759710655,-0.73299498046437, + -5.31354053298072e-05,0.00335459256898218,0.398479202718671,-0.75893645424598, + -2.38714405217944e-05,-0.00612474157325127,0.12340583332653,-0.138138670353154, + -2.45149233846498e-05,-0.00576310787245682,0.134262714435169,-0.164410744145986, + -2.51584062475607e-05,-0.00540147417166226,0.145119595543808,-0.190682817938819, + -2.58018891103884e-05,-0.00503984047086781,0.155976476652448,-0.216954891731652, + -2.64453719731605e-05,-0.00467820677007325,0.166833357761087,-0.243226965524484, + -2.70888548359327e-05,-0.00431657306927857,0.177690238869726,-0.269499039317317, + -2.77323376986494e-05,-0.0039549393684839,0.188547119978366,-0.295771113110149, + -2.8375820561477e-05,-0.00359330566768934,0.199404001087005,-0.322043186902982, + -2.90193034245267e-05,-0.00323167196689522,0.210260882195644,-0.348315260695815, + -2.96627862874654e-05,-0.00287003826610088,0.221117763304283,-0.374587334488647, + -3.03062691501821e-05,-0.00250840456530632,0.231974644412922,-0.40085940828148, + -3.09497520128987e-05,-0.00214677086451154,0.242831525521562,-0.427131482074312, + -3.15932348756709e-05,-0.00178513716371698,0.253688406630201,-0.453403555867145, + -3.2236717738332e-05,-0.00142350346292197,0.264545287738841,-0.479675629659977, + -3.28802006013262e-05,-0.00106186976212808,0.275402168847479,-0.50594770345281, + -3.35236834638764e-05,-0.000700236061333293,0.286259049956119,-0.532219777245643, + -3.41671663269816e-05,-0.000338602360539397,0.297115931064758,-0.558491851038475, + -3.48106491898648e-05,2.30313402553861e-05,0.307972812173397,-0.584763924831308, + -3.54541320526369e-05,0.000384665041049725,0.318829693282036,-0.61103599862414, + -3.60976149156311e-05,0.000746298741844509,0.329686574390676,-0.637308072416973, + -3.67410977779592e-05,0.00110793244263974,0.340543455499315,-0.663580146209806, + -3.73845806413975e-05,0.00146956614343319,0.351400336607954,-0.689852220002638, + -3.80280635043917e-05,0.00183119984422753,0.362257217716593,-0.716124293795471, + -3.86715463659426e-05,0.00219283354502364,0.373114098825233,-0.742396367588303, + -3.93150292291589e-05,0.00255446724581754,0.383970979933872,-0.768668441381136, + -1.86366938105809e-05,-0.00573912733790094,0.121567614308078,-0.139692465084808, + -1.90462613730846e-05,-0.00542716192069048,0.131970783245955,-0.166250302289411, + -1.94558289357549e-05,-0.00511519650348025,0.142373952183832,-0.192808139494014, + -1.9865396498453e-05,-0.00480323108627001,0.152777121121708,-0.219365976698617, + -2.0274964060929e-05,-0.00449126566905966,0.163180290059585,-0.24592381390322, + -2.0684531623516e-05,-0.00417930025184954,0.173583458997461,-0.272481651107823, + -2.1094099185881e-05,-0.00386733483463853,0.183986627935338,-0.299039488312425, + -2.1503666748357e-05,-0.00355536941742818,0.194389796873215,-0.325597325517028, + -2.19132343111106e-05,-0.00324340400021828,0.204792965811091,-0.352155162721631, + -2.23228018736976e-05,-0.00293143858300771,0.215196134748968,-0.378712999926234, + -2.27323694361736e-05,-0.00261947316579736,0.225599303686844,-0.405270837130837, + -2.31419369985941e-05,-0.00230750774858701,0.236002472624721,-0.43182867433544, + -2.35515045611256e-05,-0.00199554233137622,0.246405641562598,-0.458386511540042, + -2.39610721237682e-05,-0.00168357691416698,0.256808810500474,-0.484944348744645, + -2.43706396862997e-05,-0.00137161149695619,0.267211979438351,-0.511502185949248, + -2.47802072484982e-05,-0.00105964607974518,0.277615148376227,-0.538060023153851, + -2.51897748111407e-05,-0.000747680662535055,0.288018317314104,-0.564617860358454, + -2.55993423736722e-05,-0.000435715245324486,0.298421486251981,-0.591175697563057, + -2.60089099364258e-05,-0.000123749828114139,0.308824655189857,-0.617733534767659, + -2.64184774992904e-05,0.000188215589095542,0.319227824127734,-0.644291371972262, + -2.68280450617109e-05,0.000500181006305667,0.32963099306561,-0.670849209176865, + -2.72376126240204e-05,0.00081214642351668,0.340034162003487,-0.697407046381468, + -2.76471801867739e-05,0.0011241118407268,0.350437330941364,-0.723964883586071, + -2.80567477494165e-05,0.00143607725793737,0.36084049987924,-0.750522720790674, + -2.84663153122811e-05,0.0017480426751475,0.371243668817117,-0.777080557995277, + -1.4260055230586e-05,-0.00543356155125818,0.120019828200091,-0.140980278113756, + -1.45122872499681e-05,-0.00516554912953837,0.130042494802027,-0.167774961175394, + -1.47645192689616e-05,-0.0048975367078179,0.140065161403963,-0.194569644237031, + -1.50167512882882e-05,-0.00462952428609797,0.150087828005898,-0.221364327298668, + -1.52689833078923e-05,-0.00436151186437828,0.160110494607834,-0.248159010360306, + -1.55212153267748e-05,-0.0040934994426578,0.17013316120977,-0.274953693421943, + -1.57734473457127e-05,-0.00382548702093755,0.180155827811705,-0.30174837648358, + -1.60256793652613e-05,-0.00355747459921774,0.190178494413641,-0.328543059545217, + -1.62779113848099e-05,-0.00328946217749815,0.200201161015577,-0.355337742606855, + -1.653014340397e-05,-0.00302144975577789,0.210223827617513,-0.382132425668492, + -1.67823754227414e-05,-0.00275343733405742,0.220246494219448,-0.408927108730129, + -1.703460744229e-05,-0.00248542491233761,0.230269160821384,-0.435721791791767, + -1.7286839461228e-05,-0.00221741249061735,0.240291827423319,-0.462516474853404, + -1.75390714806101e-05,-0.00194940006889754,0.250314494025255,-0.489311157915041, + -1.77913034997701e-05,-0.00168138764717707,0.260337160627191,-0.516105840976678, + -1.80435355188191e-05,-0.00141337522545681,0.270359827229127,-0.542900524038316, + -1.82957675384232e-05,-0.00114536280373745,0.280382493831062,-0.569695207099953, + -1.85479995576943e-05,-0.000877350382017195,0.290405160432998,-0.59648989016159, + -1.88002315768543e-05,-0.000609337960297385,0.300427827034933,-0.623284573223228, + -1.90524635962364e-05,-0.000341325538577575,0.310450493636869,-0.650079256284865, + -1.93046956153964e-05,-7.33131168568768e-05,0.320473160238805,-0.676873939346502, + -1.95569276342233e-05,0.000194699304863377,0.330495826840741,-0.703668622408139, + -1.98091596533834e-05,0.000462711726583187,0.340518493442676,-0.730463305469777, + -2.00613916727654e-05,0.000730724148303885,0.350541160044612,-0.757257988531414, + -2.03136236925916e-05,0.000998736570022807,0.360563826646548,-0.784052671593051, + -1.07328730314382e-05,-0.00519819406153044,0.118765218956076,-0.142010988540715, + -1.08846820860431e-05,-0.00496718408670926,0.128480436889489,-0.168995232888765, + -1.1036491140648e-05,-0.00473617411188787,0.138195654822903,-0.195979477236816, + -1.11883001951973e-05,-0.0045051641370667,0.147910872756316,-0.222963721584867, + -1.13401092496357e-05,-0.00427415416224508,0.15762609068973,-0.249947965932917, + -1.14919183045181e-05,-0.00404314418742424,0.167341308623143,-0.276932210280968, + -1.16437273588454e-05,-0.00381213421260274,0.177056526556556,-0.303916454629019, + -1.17955364132283e-05,-0.00358112423778101,0.18677174448997,-0.330900698977069, + -1.19473454683883e-05,-0.00335011426296039,0.196486962423383,-0.35788494332512, + -1.20991545226046e-05,-0.00311910428813889,0.206202180356796,-0.384869187673171, + -1.22509635775425e-05,-0.00288809431331805,0.215917398290209,-0.411853432021221, + -1.24027726319254e-05,-0.00265708433849654,0.225632616223623,-0.438837676369272, + -1.25545816863637e-05,-0.00242607436367481,0.235347834157037,-0.465821920717322, + -1.27063907413572e-05,-0.0021950643888542,0.24506305209045,-0.492806165065373, + -1.28581997957955e-05,-0.00196405441403269,0.254778270023863,-0.519790409413424, + -1.30100088499008e-05,-0.00173304443921074,0.264493487957277,-0.546774653761474, + -1.31618179046722e-05,-0.0015020344643899,0.27420870589069,-0.573758898109525, + -1.33136269595546e-05,-0.00127102448956906,0.283923923824103,-0.600743142457575, + -1.3465436014215e-05,-0.00104001451474733,0.293639141757517,-0.627727386805626, + -1.36172450683203e-05,-0.000809004539925162,0.30335435969093,-0.654711631153677, + -1.37690541234248e-05,-0.000577994565105211,0.313069577624343,-0.681695875501727, + -1.39208631779741e-05,-0.000346984590283483,0.322784795557757,-0.708680119849778, + -1.40726722323015e-05,-0.0001159746154622,0.33250001349117,-0.735664364197829, + -1.42244812871839e-05,0.000115035359359084,0.342215231424584,-0.762648608545879, + -1.43762903414002e-05,0.000346045334179923,0.351930449357996,-0.78963285289393, + -7.97329846330408e-06,-0.0050206983726272,0.117779134256373,-0.142813096422442, + -8.06351369583846e-06,-0.00481960848891561,0.127253302217248,-0.169944859023851, + -8.15372892820632e-06,-0.00461851860520368,0.136727470178124,-0.197076621625259, + -8.24394416065743e-06,-0.00441742872149198,0.146201638138999,-0.224208384226668, + -8.33415939338611e-06,-0.00421633883778072,0.155675806099874,-0.251340146828076, + -8.42437462572621e-06,-0.00401524895406868,0.16514997406075,-0.278471909429485, + -8.51458985817732e-06,-0.00381415907035687,0.174624142021625,-0.305603672030893, + -8.60480509079498e-06,-0.00361306918664561,0.1840983099825,-0.332735434632302, + -8.69502032330161e-06,-0.00341197930293369,0.193572477943376,-0.35986719723371, + -8.78523555536415e-06,-0.00321088941922154,0.203046645904251,-0.386998959835118, + -8.87545078837038e-06,-0.00300979953551028,0.212520813865127,-0.414130722436527, + -8.96566602048843e-06,-0.00280870965179836,0.221994981826002,-0.441262485037935, + -9.05588125266199e-06,-0.00260761976808599,0.231469149786878,-0.468394247639344, + -9.14609648561271e-06,-0.00240652988437517,0.240943317747753,-0.495526010240752, + -9.23631171811934e-06,-0.00220544000066347,0.250417485708628,-0.522657772842161, + -9.32652695018188e-06,-0.0020043501169511,0.259891653669504,-0.549789535443569, + -9.41674218302158e-06,-0.00180326023324007,0.269365821630379,-0.576921298044978, + -9.50695741586127e-06,-0.00160217034952836,0.278839989591254,-0.604053060646386, + -9.59717264825688e-06,-0.00140108046581622,0.28831415755213,-0.631184823247794, + -9.68738788065249e-06,-0.00119999058210496,0.297788325513005,-0.658316585849203, + -9.77760311282605e-06,-0.000998900698392813,0.30726249347388,-0.685448348450612, + -9.86781834555472e-06,-0.00079781081468111,0.316736661434756,-0.71258011105202, + -9.95803357817238e-06,-0.000596720930969408,0.326210829395632,-0.739711873653428, + -1.00482488109011e-05,-0.000395631047258593,0.335684997356506,-0.766843636254837, + -1.01384640428526e-05,-0.000194541163546003,0.345159165317382,-0.793975398856246, + -5.86381318926077e-06,-0.00488889587612285,0.117022668274179,-0.143423778154074, + -5.91727077381421e-06,-0.0047112464395086,0.126312262852083,-0.170667853206788, + -5.97072835856194e-06,-0.00453359700289468,0.135601857429986,-0.197911928259501, + -6.02418594308762e-06,-0.00435594756628055,0.144891452007889,-0.225156003312214, + -6.07764352777984e-06,-0.0041782981296663,0.154181046585792,-0.252400078364928, + -6.13110111252757e-06,-0.00400064869305228,0.163470641163695,-0.279644153417641, + -6.18455869710877e-06,-0.00382299925643825,0.172760235741598,-0.306888228470355, + -6.23801628163445e-06,-0.0036453498198239,0.182049830319502,-0.334132303523068, + -6.29147386627116e-06,-0.0034677003832102,0.191339424897405,-0.361376378575781, + -6.34493145068582e-06,-0.0032900509465954,0.200629019475308,-0.388620453628495, + -6.39838903576662e-06,-0.00311240150998193,0.209918614053211,-0.415864528681208, + -6.45184662007026e-06,-0.00293475207336735,0.219208208631115,-0.443108603733922, + -6.50530420442941e-06,-0.00275710263675299,0.228497803209018,-0.470352678786635, + -6.55876178967674e-06,-0.00257945320013953,0.237787397786921,-0.497596753839348, + -6.61221937381384e-06,-0.00240180376352517,0.247076992364824,-0.524840828892062, + -6.66567695839504e-06,-0.00222415432691059,0.256366586942728,-0.552084903944775, + -6.71913454353135e-06,-0.00204650489029734,0.26565618152063,-0.579328978997489, + -6.77259212755743e-06,-0.00186885545368232,0.274945776098534,-0.606573054050202, + -6.82604971236067e-06,-0.0016912060170684,0.284235370676437,-0.633817129102916, + -6.87950729705289e-06,-0.00151355658045382,0.293524965254341,-0.661061204155629, + -6.93296488174511e-06,-0.00133590714384058,0.302814559832243,-0.688305279208342, + -6.98642246665937e-06,-0.00115825770722644,0.312104154410147,-0.715549354261056, + -7.03988005135159e-06,-0.000980608270612304,0.32139374898805,-0.742793429313769, + -7.09333763571074e-06,-0.000802958833997724,0.330683343565954,-0.770037504366483, + -7.14679521995887e-06,-0.000625309397383145,0.339972938143857,-0.797281579419196, + -4.27964828755845e-06,-0.00479210159281818,0.116453052555298,-0.143881008226318, + -4.31151111096595e-06,-0.00463237697131769,0.125603858447749,-0.171209173939623, + -4.34337393440121e-06,-0.00447265234981753,0.134754664340201,-0.198537339652928, + -4.37523675778095e-06,-0.00431292772831715,0.143905470232653,-0.225865505366233, + -4.40709958121621e-06,-0.00415320310681677,0.153056276125104,-0.253193671079537, + -4.43896240476249e-06,-0.00399347848531673,0.162207082017556,-0.280521836792842, + -4.47082522814224e-06,-0.00383375386381624,0.171357887910008,-0.307850002506147, + -4.5026880515775e-06,-0.00367402924231608,0.180508693802459,-0.335178168219452, + -4.53455087517929e-06,-0.00351430462081592,0.189659499694911,-0.362506333932757, + -4.56641369855904e-06,-0.00335457999931554,0.198810305587362,-0.389834499646062, + -4.59827652221634e-06,-0.00319485537781539,0.207961111479814,-0.417162665359367, + -4.63013934548506e-06,-0.00303513075631501,0.217111917372266,-0.444490831072671, + -4.66200216919788e-06,-0.00287540613481552,0.226262723264717,-0.471818996785977, + -4.69386499224456e-06,-0.00271568151331381,0.235413529157169,-0.499147162499281, + -4.72572781595737e-06,-0.00255595689181431,0.24456433504962,-0.526475328212586, + -4.75759063889303e-06,-0.00239623227031349,0.253715140942072,-0.553803493925891, + -4.78945346271686e-06,-0.00223650764881378,0.262865946834523,-0.581131659639196, + -4.82131628631866e-06,-0.00207678302731362,0.272016752726975,-0.608459825352501, + -4.85317910980942e-06,-0.00191705840581324,0.281167558619427,-0.635787991065806, + -4.88504193318917e-06,-0.0017573337843122,0.290318364511879,-0.66311615677911, + -4.91690475667994e-06,-0.00159760916281293,0.29946917040433,-0.690444322492415, + -4.94876757994867e-06,-0.00143788454131233,0.308619976296781,-0.71777248820572, + -4.98063040299535e-06,-0.00127815991981128,0.317770782189233,-0.745100653919025, + -5.01249322704123e-06,-0.00111843529831246,0.326921588081684,-0.77242881963233, + -5.04435604997688e-06,-0.000958710676811414,0.336072393974136,-0.799756985345635, + -3.10574873518821e-06,-0.00472157448926613,0.116030106103755,-0.144219077599153, + -3.12498907284464e-06,-0.00457530959310426,0.125077966126535,-0.171609418743631, + -3.14422941033454e-06,-0.00442904469694194,0.134125826149315,-0.19899975988811, + -3.16346974793547e-06,-0.00428277980078007,0.143173686172094,-0.226390101032589, + -3.18271008570292e-06,-0.00413651490461797,0.152221546194874,-0.253780442177068, + -3.20195042313731e-06,-0.00399025000845588,0.161269406217654,-0.281170783321546, + -3.22119076090477e-06,-0.003843985112294,0.170317266240434,-0.308561124466025, + -3.24043109861671e-06,-0.00369772021613213,0.179365126263213,-0.335951465610504, + -3.2596714360511e-06,-0.00355145531997003,0.188412986285993,-0.363341806754983, + -3.27891177376305e-06,-0.00340519042380794,0.197460846308773,-0.390732147899461, + -3.29815211125295e-06,-0.00325892552764584,0.206508706331552,-0.41812248904394, + -3.31739244885387e-06,-0.00311266063148352,0.215556566354332,-0.445512830188419, + -3.33663278639929e-06,-0.00296639573532165,0.224604426377112,-0.472903171332897, + -3.3558731239447e-06,-0.00282013083915955,0.233652286399891,-0.500293512477376, + -3.37511346182318e-06,-0.00267386594299812,0.242700146422671,-0.527683853621855, + -3.39435379925757e-06,-0.0025276010468358,0.25174800644545,-0.555074194766334, + -3.41359413669196e-06,-0.00238133615067326,0.260795866468231,-0.582464535910813, + -3.43283447412635e-06,-0.00223507125451139,0.26984372649101,-0.609854877055291, + -3.45207481278198e-06,-0.0020888063583504,0.27889158651379,-0.63724521819977, + -3.47131515021637e-06,-0.00194254146218809,0.287939446536569,-0.664635559344249, + -3.49055548765076e-06,-0.00179627656602577,0.296987306559349,-0.692025900488727, + -3.50979582541822e-06,-0.00165001166986434,0.306035166582128,-0.719416241633206, + -3.52903616240852e-06,-0.00150374677370069,0.315083026604909,-0.746806582777685, + -3.54827650017597e-06,-0.00135748187754015,0.324130886627688,-0.774196923922164, + -3.56751683794343e-06,-0.00121121698137738,0.333178746650468,-0.801587265066642, + -2.24442413485071e-06,-0.00467047220604022,0.115719317089902,-0.144466729416384, + -2.25625542663033e-06,-0.00453417860675587,0.12469158770153,-0.171902617007109, + -2.26808671810463e-06,-0.00439788500747085,0.133663858313158,-0.199338504597833, + -2.27991800971772e-06,-0.00426159140818638,0.142636128924786,-0.226774392188558, + -2.2917493013308e-06,-0.00412529780890181,0.151608399536414,-0.254210279779283, + -2.30358059283287e-06,-0.00398900420961679,0.160580670148042,-0.281646167370008, + -2.31541188433493e-06,-0.00385271061033232,0.16955294075967,-0.309082054960733, + -2.32724317605904e-06,-0.00371641701104752,0.178525211371299,-0.336517942551458, + -2.33907446739456e-06,-0.00358012341176273,0.187497481982927,-0.363953830142183, + -2.35090575911867e-06,-0.00344382981247815,0.196469752594555,-0.391389717732908, + -2.36273705034318e-06,-0.00330753621319291,0.205442023206184,-0.418825605323633, + -2.37456834206728e-06,-0.00317124261390833,0.214414293817812,-0.446261492914358, + -2.38639963390241e-06,-0.0030349490146242,0.22338656442944,-0.473697380505083, + -2.3982309255155e-06,-0.00289865541533918,0.232358835041068,-0.501133268095808, + -2.41006221624041e-06,-0.00276236181605372,0.241331105652696,-0.528569155686533, + -2.42189350818656e-06,-0.00262606821676936,0.250303376264325,-0.556005043277258, + -2.43372479991066e-06,-0.00248977461748501,0.259275646875953,-0.583440930867983, + -2.44555609141273e-06,-0.00235348101820021,0.268247917487581,-0.610876818458708, + -2.45738738324786e-06,-0.00221718741891586,0.277220188099209,-0.638312706049433, + -2.46921867474992e-06,-0.00208089381963106,0.286192458710837,-0.665748593640157, + -2.48104996558585e-06,-0.00194460022034537,0.295164729322466,-0.693184481230882, + -2.492881257532e-06,-0.00180830662106102,0.304136999934094,-0.720620368821607, + -2.50471254914508e-06,-0.00167201302177711,0.313109270545721,-0.748056256412333, + -2.51654384053612e-06,-0.00153571942249142,0.32208154115735,-0.775492144003057, + -2.5283751325933e-06,-0.00139942582320751,0.331053811768978,-0.802928031593782, + -1.61701508455403e-06,-0.00463359054262125,0.115492685151383,-0.144646913928178, + -1.62444550891316e-06,-0.00450461101635524,0.124409865127504,-0.172115939834917, + -1.63187593338332e-06,-0.00437563149008913,0.133327045103625,-0.199584965741655, + -1.63930635782572e-06,-0.00424665196382312,0.142244225079746,-0.227053991648394, + -1.64673678221261e-06,-0.00411767243755701,0.151161405055867,-0.254523017555133, + -1.65416720676603e-06,-0.00398869291129123,0.160078585031988,-0.281992043461872, + -1.66159763098639e-06,-0.00385971338502467,0.16899576500811,-0.309461069368611, + -1.66902805531777e-06,-0.00373073385875888,0.17791294498423,-0.33693009527535, + -1.67645847970466e-06,-0.00360175433249266,0.186830124960351,-0.364399121182089, + -1.68388890409155e-06,-0.00347277480622621,0.195747304936473,-0.391868147088828, + -1.69131932875599e-06,-0.00334379527996087,0.204664484912593,-0.419337172995567, + -1.69874975308737e-06,-0.00321481575369464,0.213581664888715,-0.446806198902306, + -1.70618017758528e-06,-0.00308583622742886,0.222498844864835,-0.474275224809045, + -1.71361060208319e-06,-0.00295685670116286,0.231416024840956,-0.501744250715784, + -1.72104102613702e-06,-0.00282787717489619,0.240333204817078,-0.529213276622522, + -1.72847145074595e-06,-0.00269889764863018,0.249250384793199,-0.556682302529261, + -1.73590187513284e-06,-0.0025699181223644,0.25816756476932,-0.584151328436, + -1.74333229963075e-06,-0.0024409385960984,0.267084744745441,-0.611620354342739, + -1.7507627237956e-06,-0.00231195906983217,0.276001924721561,-0.639089380249478, + -1.75819314807146e-06,-0.00218297954356572,0.284919104697683,-0.666558406156217, + -1.76562357279142e-06,-0.00205400001730016,0.293836284673804,-0.694027432062956, + -1.77305399695626e-06,-0.00192502049103371,0.302753464649925,-0.721496457969695, + -1.78048442101009e-06,-0.00179604096476726,0.311670644626046,-0.748965483876434, + -1.78791484584107e-06,-0.0016670614385017,0.320587824602167,-0.776434509783173, + -1.79534527022795e-06,-0.0015380819122357,0.329505004578288,-0.803903535689912, + -1.16240584427385e-06,-0.00460704651822252,0.115328342070984,-0.144777362090541, + -1.16717554787815e-06,-0.00448339330890912,0.124205588726908,-0.172270379140496, + -1.17194525128816e-06,-0.00435974009959517,0.133082835382833,-0.199763396190452, + -1.1767149548092e-06,-0.00423608689028143,0.141960082038757,-0.227256413240407, + -1.18148465860779e-06,-0.00411243368096836,0.150837328694681,-0.254749430290363, + -1.18625436212882e-06,-0.00398878047165452,0.159714575350606,-0.282242447340318, + -1.19102406553884e-06,-0.00386512726234067,0.168591822006531,-0.309735464390273, + -1.19579376944845e-06,-0.00374147405302749,0.177469068662455,-0.337228481440229, + -1.20056347291397e-06,-0.00361782084371387,0.186346315318379,-0.364721498490184, + -1.20533317649052e-06,-0.00349416763440002,0.195223561974304,-0.39221451554014, + -1.21010288028911e-06,-0.00337051442508707,0.204100808630228,-0.419707532590095, + -1.21487258364361e-06,-0.00324686121577322,0.212978055286152,-0.44720054964005, + -1.21964228705362e-06,-0.00312320800645915,0.221855301942077,-0.474693566690006, + -1.22441199090773e-06,-0.00299955479714575,0.230732548598002,-0.502186583739961, + -1.22918169453978e-06,-0.00287590158783235,0.239609795253926,-0.529679600789916, + -1.23395139783877e-06,-0.00275224837851806,0.248487041909851,-0.557172617839872, + -1.23872110158185e-06,-0.00262859516920511,0.257364288565775,-0.584665634889827, + -1.24349080532493e-06,-0.00250494195989193,0.266241535221699,-0.612158651939783, + -1.24826050884597e-06,-0.00238128875057786,0.275118781877624,-0.639651668989738, + -1.25303021247802e-06,-0.00225763554126424,0.283996028533548,-0.667144686039693, + -1.25779991599906e-06,-0.00213398233195061,0.292873275189473,-0.694637703089649, + -1.26256961985316e-06,-0.00201032912263743,0.301750521845397,-0.722130720139604, + -1.26733932326317e-06,-0.00188667591332292,0.310627768501322,-0.749623737189559, + -1.27210902689523e-06,-0.00176302270401019,0.319505015157246,-0.777116754239515, + -1.27687873019422e-06,-0.00163936949469612,0.328382261813171,-0.80460977128947, + -8.73291886486771e-05,-0.0127624485212806,0.151902411475711,-0.127284967931506, + -9.34580568415777e-05,-0.0120993984572826,0.16758783910667,-0.149638100422294, + -9.95869250347003e-05,-0.0114363483932849,0.183273266737629,-0.171991232913083, + -0.000105715793227823,-0.0107732983292872,0.198958694368588,-0.194344365403871, + -0.000111844661420668,-0.0101102482652893,0.214644121999547,-0.216697497894659, + -0.000117973529613624,-0.0094471982012917,0.230329549630505,-0.239050630385448, + -0.000124102397806525,-0.00878414813729345,0.246014977261465,-0.261403762876236, + -0.000130231265999703,-0.00812109807329597,0.261700404892424,-0.283756895367024, + -0.000136360134192937,-0.0074580480092985,0.277385832523382,-0.306110027857813, + -0.000142489002385615,-0.00679499794530014,0.293071260154341,-0.328463160348601, + -0.000148617870578516,-0.00613194788130222,0.3087566877853,-0.350816292839389, + -0.000154746738771361,-0.00546889781730409,0.32444211541626,-0.373169425330177, + -0.000160875606964317,-0.00480584775330617,0.340127543047218,-0.395522557820966, + -0.000167004475157606,-0.0041427976893087,0.355812970678177,-0.417875690311754, + -0.00017313334335034,-0.00347974762531078,0.371498398309136,-0.440228822802542, + -0.000179262211543407,-0.00281669756131331,0.387183825940095,-0.462581955293331, + -0.000185391079736252,-0.00215364749731495,0.402869253571054,-0.484935087784119, + -0.000191519947929319,-0.00149059743331703,0.418554681202013,-0.507288220274907, + -0.000197648816121943,-0.000827547369319115,0.434240108832972,-0.529641352765695, + -0.000203777684315898,-0.000164497305322531,0.449925536463931,-0.551994485256484, + -0.000209906552507744,0.00049855275867694,0.46561096409489,-0.574347617747272, + -0.000216035420701588,0.0011616028226733,0.481296391725848,-0.596700750238061, + -0.0002221642888941,0.00182465288667188,0.496981819356807,-0.619053882728849, + -0.000228293157086945,0.00248770295067002,0.512667246987767,-0.641407015219637, + -0.000234422025280234,0.00315075301466727,0.528352674618725,-0.663760147710425, + -8.656088771547e-05,-0.0126556753030974,0.151651922568162,-0.127555576576485, + -9.25941748554093e-05,-0.0119932199685446,0.1672765765241,-0.149954550029706, + -9.86274619952376e-05,-0.0113307646339917,0.182901230480038,-0.172353523482928, + -0.000104660749135455,-0.0106683092994392,0.198525884435976,-0.194752496936149, + -0.000110694036275394,-0.0100058539648865,0.214150538391914,-0.217151470389371, + -0.000116727323415555,-0.00934339863033407,0.229775192347852,-0.239550443842592, + -0.000122760610555384,-0.00868094329578128,0.24539984630379,-0.261949417295814, + -0.000128793897695378,-0.00801848796122862,0.261024500259728,-0.284348390749035, + -0.00013482718483554,-0.00735603262667617,0.276649154215666,-0.306747364202256, + -0.000140860471975313,-0.00669357729212283,0.292273808171605,-0.329146337655478, + -0.000146893759115585,-0.00603112195757061,0.307898462127543,-0.351545311108699, + -0.000152927046255469,-0.00536866662301794,0.323523116083481,-0.373944284561921, + -0.000158960333395464,-0.00470621128846505,0.339147770039419,-0.396343258015142, + -0.000164993620535681,-0.0040437559539126,0.354772423995357,-0.418742231468364, + -0.000171026907675897,-0.00338130061936015,0.370397077951295,-0.441141204921585, + -0.000177060194815448,-0.00271884528480704,0.386021731907233,-0.463540178374807, + -0.000183093481955776,-0.00205638995025481,0.401646385863171,-0.485939151828028, + -0.000189126769095771,-0.00139393461570192,0.417271039819109,-0.508338125281249, + -0.000195160056235766,-0.000731479281149472,0.432895693775047,-0.530737098734471, + -0.000201193343375428,-6.90239465961362e-05,0.448520347730985,-0.553136072187692, + -0.000207226630516311,0.000593431387955423,0.464145001686923,-0.575535045640914, + -0.000213259917655639,0.0012558867225092,0.479769655642861,-0.597934019094135, + -0.000219293204796189,0.00191834205706076,0.495394309598799,-0.620332992547356, + -0.000225326491934852,0.00258079739161543,0.511018963554738,-0.642731966000578, + -0.000231359779075513,0.00324325272616699,0.526643617510675,-0.665130939453799, + -8.55080122962038e-05,-0.0125105253220902,0.151308041069526,-0.127925490462723, + -9.14113310258036e-05,-0.0118490322212319,0.166849370103956,-0.150387127134128, + -9.73146497552646e-05,-0.0111875391203735,0.182390699138386,-0.172848763805533, + -0.000103217968484504,-0.0105260460195149,0.197932028172816,-0.195310400476937, + -0.000109121287213965,-0.00986455291865618,0.213473357207247,-0.217772037148342, + -0.000115024605943592,-0.00920305981779801,0.229014686241677,-0.240233673819746, + -0.000120927924672942,-0.00854156671693929,0.244556015276107,-0.262695310491151, + -0.000126831243402625,-0.00788007361608134,0.260097344310537,-0.285156947162556, + -0.000132734562131809,-0.00721858051522228,0.275638673344968,-0.30761858383396, + -0.000138637880861492,-0.00655708741436434,0.291180002379398,-0.330080220505365, + -0.000144541199591286,-0.00589559431350595,0.306721331413828,-0.35254185717677, + -0.000150444518320469,-0.00523410121264756,0.322262660448258,-0.375003493848174, + -0.000156347837049875,-0.0045726081117885,0.337803989482688,-0.397465130519579, + -0.000162251155779392,-0.00391111501093011,0.353345318517119,-0.419926767190984, + -0.000168154474508686,-0.00324962191007194,0.368886647551548,-0.442388403862388, + -0.000174057793238536,-0.00258812880921355,0.384427976585979,-0.464850040533793, + -0.000179961111968385,-0.00192663570835561,0.399969305620409,-0.487311677205198, + -0.000185864430697014,-0.00126514260749633,0.415510634654839,-0.509773313876602, + -0.000191767749426863,-0.000603649506638604,0.431051963689269,-0.532234950548007, + -0.000197671068156047,5.78435942206745e-05,0.4465932927237,-0.554696587219412, + -0.000203574386886118,0.000719336695078177,0.462134621758129,-0.577158223890816, + -0.000209477705615302,0.00138082979593701,0.47767595079256,-0.599619860562221, + -0.000215381024344818,0.00204232289679496,0.493217279826989,-0.622081497233625, + -0.000221284343074779,0.00270381599765335,0.50875860886142,-0.64454313390503, + -0.000227187661803518,0.00336530909851263,0.52429993789585,-0.667004770576434, + -8.40765343565752e-05,-0.0123153346921183,0.150839373759823,-0.128426721198822, + -8.98050404665729e-05,-0.0116554206815792,0.166267338987168,-0.150973266093856, + -9.55335465764873e-05,-0.0109955066710401,0.181695304214512,-0.173519810988889, + -0.000101262052686402,-0.0103355926605008,0.197123269441857,-0.196066355883923, + -0.000106990558796427,-0.00967567864996166,0.212551234669201,-0.218612900778957, + -0.000112719064906508,-0.00901576463942277,0.227979199896546,-0.24115944567399, + -0.000118447571016311,-0.00835585062888344,0.24340716512389,-0.263705990569024, + -0.000124176077126781,-0.00769593661834467,0.258835130351235,-0.286252535464058, + -0.000129904583236029,-0.007036022607805,0.274263095578579,-0.308799080359092, + -0.000135633089346276,-0.00637610859726601,0.289691060805924,-0.331345625254125, + -0.000141361595455747,-0.00571619458672634,0.305119026033268,-0.353892170149159, + -0.000147090101566105,-0.00505628057618757,0.320546991260613,-0.376438715044193, + -0.000152818607675909,-0.00439636656564857,0.335974956487957,-0.398985259939227, + -0.000158547113785823,-0.00373645255510913,0.351402921715302,-0.42153180483426, + -0.000164275619895626,-0.00307653854456991,0.366830886942646,-0.444078349729294, + -0.000170004126005985,-0.00241662453403158,0.38225885216999,-0.466624894624328, + -0.000175732632115233,-0.00175671052349102,0.397686817397336,-0.489171439519362, + -0.000181461138225147,-0.00109679651295203,0.41311478262468,-0.511717984414395, + -0.000187189644335728,-0.000436882502413471,0.428542747852024,-0.534264529309429, + -0.000192918150445087,0.000223031508126414,0.443970713079369,-0.556811074204463, + -0.000198646656555335,0.000882945518665412,0.459398678306714,-0.579357619099497, + -0.000204375162665471,0.00154285952920397,0.474826643534058,-0.60190416399453, + -0.000210103668775163,0.00220277353974385,0.490254608761402,-0.624450708889564, + -0.000215832174885411,0.00286268755028196,0.505682573988746,-0.646997253784598, + -0.000221560680994881,0.00352260156082229,0.521110539216092,-0.669543798679631, + -8.21511521776341e-05,-0.0120566655294801,0.150206964936421,-0.129097847323293, + -8.76479867296109e-05,-0.0113993623803532,0.165482313665983,-0.151758080631578, + -9.31448212816988e-05,-0.0107420592312264,0.180757662395545,-0.174418313939864, + -9.86416558337311e-05,-0.0100847560820992,0.196033011125107,-0.197078547248149, + -0.000104138490385652,-0.00942745293297198,0.211308359854669,-0.219738780556434, + -0.000109635324937685,-0.00877014978384527,0.226583708584231,-0.24239901386472, + -0.000115132159489939,-0.00811284663471845,0.241859057313794,-0.265059247173005, + -0.000120628994041971,-0.00745554348559141,0.257134406043356,-0.28771948048129, + -0.000126125828593893,-0.00679824033646415,0.272409754772918,-0.310379713789576, + -0.00013162266314598,-0.00614093718733755,0.28768510350248,-0.333039947097861, + -0.00013711949769768,-0.00548363403821006,0.302960452232042,-0.355700180406146, + -0.00014261633224999,-0.00482633088908324,0.318235800961604,-0.378360413714431, + -0.000148113166802299,-0.00416902773995664,0.333511149691166,-0.401020647022717, + -0.000153610001353832,-0.00351172459082871,0.348786498420729,-0.423680880331002, + -0.00015910683590592,-0.00285442144170234,0.364061847150291,-0.446341113639288, + -0.000164603670457897,-0.00219711829257552,0.379337195879853,-0.469001346947573, + -0.000170100505009874,-0.00153981514344803,0.394612544609415,-0.491661580255858, + -0.000175597339562183,-0.000882511994321211,0.409887893338977,-0.514321813564143, + -0.000181094174114271,-0.000225208845194613,0.425163242068539,-0.536982046872429, + -0.000186591008666359,0.000432094303932207,0.440438590798101,-0.559642280180714, + -0.000192087843218003,0.00108939745305969,0.455713939527663,-0.582302513488999, + -0.000197584677770202,0.00174670060218673,0.470989288257226,-0.604962746797284, + -0.00020308151232229,0.00240400375131378,0.486264636986788,-0.62762298010557, + -0.000208578346874155,0.00306130690044037,0.50153998571635,-0.650283213413855, + -0.000214075181426243,0.00371861004956786,0.516815334445912,-0.67294344672214, + -7.9598691956756e-05,-0.0117204850187089,0.149365022520053,-0.129982272811832, + -8.47945646269554e-05,-0.0110674919238278,0.164437803124756,-0.152792327333694, + -8.99904372966831e-05,-0.0104144988289463,0.17951058372946,-0.175602381855556, + -9.51863099667993e-05,-0.00976150573406531,0.194583364334164,-0.198412436377418, + -0.00010038218263686,-0.00910851263918422,0.209656144938868,-0.22122249089928, + -0.000105578055306865,-0.00845551954430324,0.224728925543571,-0.244032545421142, + -0.000110773927976981,-0.00780252644942214,0.239801706148275,-0.266842599943004, + -0.000115969800647042,-0.00714953335454105,0.254874486752979,-0.289652654464866, + -0.000121165673316936,-0.00649654025965951,0.269947267357683,-0.312462708986727, + -0.000126361545986609,-0.00584354716477797,0.285020047962387,-0.335272763508589, + -0.000131557418656891,-0.00519055406989732,0.30009282856709,-0.358082818030451, + -0.000136753291327008,-0.00453756097501623,0.315165609171794,-0.380892872552313, + -0.000141949163996791,-0.00388456788013491,0.330238389776498,-0.403702927074175, + -0.000147145036666907,-0.00323157478525382,0.345311170381202,-0.426512981596037, + -0.00015234090933669,-0.00257858169037251,0.360383950985905,-0.449323036117899, + -0.000157536782006695,-0.00192558859549119,0.375456731590609,-0.472133090639761, + -0.000162732654677367,-0.00127259550061121,0.390529512195313,-0.494943145161623, + -0.000167928527346595,-0.000619602405728337,0.405602292800017,-0.517753199683485, + -0.000173124400017155,3.33906891516467e-05,0.42067507340472,-0.540563254205346, + -0.000178320272686827,0.000686383784033406,0.435747854009424,-0.563373308727208, + -0.00018351614535661,0.0013393768789145,0.450820634614128,-0.58618336324907, + -0.000188712018027282,0.00199236997379471,0.465893415218831,-0.608993417770932, + -0.00019390789069651,0.00264536306867713,0.480966195823535,-0.631803472292794, + -0.00019910376336707,0.00329835616355734,0.496038976428239,-0.654613526814656, + -0.000204299636036853,0.00395134925843887,0.511111757032943,-0.677423581336518, + -7.62792891767228e-05,-0.0112945458857542,0.148264101903325,-0.131123667596917, + -8.10943977086476e-05,-0.01064857893753,0.163073027057669,-0.154127073796322, + -8.59095062408777e-05,-0.0100026119893064,0.177881952212014,-0.177130479995727, + -9.07246147730523e-05,-0.00935664504108236,0.192690877366359,-0.200133886195133, + -9.55397233051158e-05,-0.00871067809285875,0.207499802520703,-0.223137292394539, + -0.00010035483183729,-0.00806471114463458,0.222308727675048,-0.246140698593944, + -0.000105169940369076,-0.00741874419641042,0.237117652829393,-0.269144104793349, + -0.000109985048901251,-0.00677277724818648,0.251926577983738,-0.292147510992755, + -0.000114800157433426,-0.00612681029996276,0.266735503138082,-0.31515091719216, + -0.000119615265965489,-0.00548084335173882,0.281544428292427,-0.338154323391566, + -0.00012443037449783,-0.00483487640351488,0.296353353446771,-0.361157729590971, + -0.000129245483029838,-0.00418890945529138,0.311162278601116,-0.384161135790377, + -0.000134060591561846,-0.00354294250706721,0.325971203755461,-0.407164541989783, + -0.000138875700094188,-0.00289697555884327,0.340780128909806,-0.430167948189188, + -0.000143690808625863,-0.00225100861061889,0.35558905406415,-0.453171354388594, + -0.000148505917158426,-0.00160504166239539,0.370397979218495,-0.476174760587999, + -0.000153321025690656,-0.000959074714171892,0.385206904372839,-0.499178166787405, + -0.000158136134222553,-0.000313107765947507,0.400015829527184,-0.52218157298681, + -0.000162951242754339,0.000332859182276657,0.414824754681529,-0.545184979186215, + -0.000167766351286791,0.000978826130500376,0.429633679835874,-0.568188385385621, + -0.000172581459819021,0.0016247930787241,0.444442604990218,-0.591191791585027, + -0.000177396568350918,0.00227076002694782,0.459251530144563,-0.614195197784432, + -0.000182211676882593,0.00291672697517287,0.474060455298908,-0.637198603983837, + -0.000187026785414601,0.00356269392339659,0.488869380453252,-0.660202010183243, + -0.000191841893946942,0.00420866087162119,0.503678305607598,-0.683205416382648, + -7.20690026665693e-05,-0.0107721304816955,0.146858109530938,-0.132557585748381, + -7.64187099734359e-05,-0.0101373334437707,0.16133167394459,-0.155803896930067, + -8.07684172806078e-05,-0.00950253640584642,0.175805238358242,-0.179050208111753, + -8.51181245872246e-05,-0.0088677393679214,0.190278802771894,-0.202296519293439, + -8.94678318940079e-05,-0.0082329423299965,0.204752367185546,-0.225542830475125, + -9.38175392010132e-05,-0.00759814529207226,0.219225931599198,-0.248789141656811, + -9.8167246507963e-05,-0.00696334825414757,0.23369949601285,-0.272035452838497, + -0.000102516953814635,-0.00632855121622278,0.248173060426502,-0.295281764020183, + -0.000106866661121807,-0.00569375417829843,0.262646624840154,-0.318528075201869, + -0.000111216368428646,-0.00505895714037363,0.277120189253806,-0.341774386383555, + -0.000115566075735485,-0.00442416010244906,0.291593753667458,-0.365020697565241, + -0.000119915783042379,-0.00378936306452426,0.30606731808111,-0.388267008746927, + -0.00012426549034894,-0.00315456602659925,0.320540882494762,-0.411513319928613, + -0.000128615197656057,-0.00251976898867512,0.335014446908414,-0.434759631110299, + -0.000132964904963062,-0.0018849719507501,0.349488011322066,-0.458005942291985, + -0.000137314612269512,-0.00125017491282531,0.363961575735718,-0.481252253473671, + -0.000141664319576518,-0.000615377874900513,0.37843514014937,-0.504498564655357, + -0.000146014026883745,1.94191630233931e-05,0.392908704563022,-0.527744875837043, + -0.000150363734190528,0.000654216200948632,0.407382268976674,-0.550991187018729, + -0.000154713441497201,0.00128901323887343,0.421855833390326,-0.574237498200415, + -0.000159063148804206,0.00192381027679822,0.436329397803979,-0.597483809382101, + -0.0001634128561111,0.00255860731472213,0.45080296221763,-0.620730120563787, + -0.000167762563417884,0.00319340435264737,0.465276526631282,-0.643976431745472, + -0.000172112270724556,0.00382820139057216,0.479750091044934,-0.667222742927159, + -0.000176461978032005,0.00446299842849607,0.494223655458586,-0.690469054108844, + -6.68952954001878e-05,-0.010156644295174,0.14511596475665,-0.13429931895994, + -7.07005536468297e-05,-0.00953893425820018,0.159176361672187,-0.157840678833533, + -7.45058118937769e-05,-0.00892122422122676,0.173236758587724,-0.181382038707125, + -7.83110701403356e-05,-0.00830351418425301,0.187297155503261,-0.204923398580718, + -8.21163283871162e-05,-0.00768580414727915,0.201357552418798,-0.22846475845431, + -8.59215866339524e-05,-0.00706809411030562,0.215417949334335,-0.252006118327903, + -8.97268448806776e-05,-0.00645038407333187,0.229478346249873,-0.275547478201496, + -9.35321031275693e-05,-0.00583267403635834,0.243538743165409,-0.299088838075088, + -9.73373613737949e-05,-0.00521496399938415,0.257599140080947,-0.322630197948681, + -0.000101142619620631,-0.00459725396241062,0.271659536996483,-0.346171557822274, + -0.000104947877867301,-0.00397954392543665,0.285719933912021,-0.369712917695866, + -0.000108753136114581,-0.00336183388846356,0.299780330827558,-0.393254277569459, + -0.000112558394360973,-0.00274412385148959,0.313840727743095,-0.416795637443052, + -0.000116363652607809,-0.00212641381451606,0.327901124658631,-0.440336997316644, + -0.000120168910854535,-0.00150870377754231,0.341961521574168,-0.463878357190237, + -0.000123974169101371,-0.00089099374056878,0.356021918489706,-0.48741971706383, + -0.000127779427347763,-0.000273283703594585,0.370082315405243,-0.510961076937422, + -0.000131584685594821,0.000344426333379166,0.38414271232078,-0.534502436811015, + -0.000135389943841213,0.000962136370352695,0.398203109236317,-0.558043796684608, + -0.000139195202088049,0.001579846407326,0.412263506151853,-0.5815851565582, + -0.000143000460335108,0.00219755644429931,0.42632390306739,-0.605126516431793, + -0.000146805718581722,0.0028152664812735,0.440384299982927,-0.628667876305386, + -0.000150610976828891,0.00343297651824681,0.454444696898464,-0.652209236178978, + -0.000154416235075172,0.00405068655522145,0.468505093814002,-0.675750596052571, + -0.000158221493322341,0.00466839659219387,0.482565490729538,-0.699291955926163, + -6.0780462052018e-05,-0.00946545187349679,0.143036825947692,-0.136330413343041, + -6.39823372760584e-05,-0.00887255943138299,0.156607356780888,-0.160215839539132, + -6.71842125000155e-05,-0.00827966698926896,0.170177887614084,-0.184101265735222, + -7.03860877238061e-05,-0.00768677454715472,0.183748418447281,-0.207986691931312, + -7.35879629475966e-05,-0.00709388210504058,0.197318949280477,-0.231872118127402, + -7.67898381713872e-05,-0.00650098966292656,0.210889480113673,-0.255757544323493, + -7.99917133952888e-05,-0.00590809722081254,0.224460010946869,-0.279642970519583, + -8.31935886192459e-05,-0.0053152047786984,0.238030541780065,-0.303528396715674, + -8.6395463843314e-05,-0.00472231233658471,0.251601072613261,-0.327413822911764, + -8.95973390669935e-05,-0.00412941989447035,0.265171603446458,-0.351299249107854, + -9.27992142909506e-05,-0.00353652745235622,0.278742134279654,-0.375184675303945, + -9.60010895147967e-05,-0.00294363501024231,0.29231266511285,-0.399070101500035, + -9.92029647391979e-05,-0.00235074256812884,0.305883195946046,-0.422955527696125, + -0.000102404839962378,-0.00175785012601404,0.319453726779242,-0.446840953892216, + -0.000105606715186668,-0.00116495768390057,0.333024257612438,-0.470726380088306, + -0.000108808590410403,-0.000572065241786213,0.346594788445635,-0.494611806284396, + -0.00011201046563436,2.08272003276999e-05,0.360165319278831,-0.518497232480487, + -0.000115212340858095,0.000613719642441835,0.373735850112027,-0.542382658676577, + -0.000118414216081719,0.00120661208455619,0.387306380945223,-0.566268084872667, + -0.000121616091305676,0.00179950452667033,0.400876911778419,-0.590153511068757, + -0.000124817966529855,0.00239239696878402,0.414447442611616,-0.614038937264848, + -0.000128019841753702,0.00298528941089815,0.428017973444812,-0.637924363460938, + -0.000131221716976992,0.00357818185301317,0.441588504278008,-0.661809789657028, + -0.000134423592201283,0.00417107429512598,0.455159035111204,-0.685695215853119, + -0.000137625467425462,0.00476396673723967,0.4687295659444,-0.709580642049209, + -5.38781856682657e-05,-0.00873048154270528,0.140664345468733,-0.138589310431118, + -5.64530216378145e-05,-0.00817139984803095,0.153679878558344,-0.162857392608368, + -5.90278576074188e-05,-0.00761231815335672,0.166695411647955,-0.187125474785619, + -6.16026935769121e-05,-0.00705323645868217,0.179710944737566,-0.21139355696287, + -6.41775295465163e-05,-0.00649415476400783,0.192726477827178,-0.235661639140121, + -6.67523655160651e-05,-0.0059350730693335,0.205742010916789,-0.259929721317371, + -6.93272014853363e-05,-0.00537599137465872,0.2187575440064,-0.284197803494622, + -7.19020374552182e-05,-0.00481690967998483,0.231773077096011,-0.308465885671873, + -7.44768734245449e-05,-0.00425782798531027,0.244788610185622,-0.332733967849124, + -7.70517093943157e-05,-0.00369874629063616,0.257804143275233,-0.357002050026375, + -7.96265453638645e-05,-0.00313966459596182,0.270819676364844,-0.381270132203625, + -8.22013813331912e-05,-0.00258058290128682,0.283835209454456,-0.405538214380876, + -8.47762173025179e-05,-0.00202150120661226,0.296850742544067,-0.429806296558127, + -8.73510532720667e-05,-0.00146241951193793,0.309866275633678,-0.454074378735378, + -8.99258892417265e-05,-0.000903337817263816,0.322881808723289,-0.478342460912629, + -9.25007252112753e-05,-0.000344256122589481,0.335897341812901,-0.50261054308988, + -9.50755611812681e-05,0.000214825572083965,0.348912874902511,-0.52687862526713, + -9.76503971504838e-05,0.000773907266759188,0.361928407992123,-0.551146707444381, + -0.000100225233120366,0.0013329889614333,0.374943941081734,-0.575414789621632, + -0.000102800069089248,0.00189207065610786,0.387959474171345,-0.599682871798883, + -0.000105374905059352,0.00245115235078242,0.400975007260957,-0.623950953976133, + -0.000107949741028457,0.00301023404545697,0.413990540350567,-0.648219036153384, + -0.00011052457699845,0.00356931574013064,0.427006073440178,-0.672487118330635, + -0.000113099412967888,0.0041283974348052,0.44002160652979,-0.696755200507886, + -0.000115674248937658,0.00468747912947931,0.453037139619401,-0.721023282685136, + -4.64810320248976e-05,-0.00799368659322441,0.138092214199511,-0.140972902274679, + -4.84502474501491e-05,-0.00747740205714353,0.150510477396081,-0.165644763659224, + -5.04194628750954e-05,-0.00696111752106221,0.162928740592652,-0.19031662504377, + -5.23886783001526e-05,-0.00644483298498111,0.175347003789223,-0.214988486428315, + -5.43578937252098e-05,-0.0059285484488999,0.187765266985793,-0.239660347812861, + -5.63271091501005e-05,-0.00541226391281868,0.200183530182364,-0.264332209197406, + -5.82963245754353e-05,-0.0048959793767378,0.212601793378934,-0.289004070581952, + -6.02655400004926e-05,-0.00437969484065648,0.225020056575505,-0.313675931966498, + -6.22347554256053e-05,-0.0038634103045756,0.237438319772075,-0.338347793351043, + -6.42039708504405e-05,-0.00334712576849405,0.249856582968646,-0.363019654735589, + -6.61731862753312e-05,-0.00283084123241273,0.262274846165217,-0.387691516120134, + -6.81424017007215e-05,-0.00231455669633229,0.274693109361787,-0.41236337750468, + -7.01116171258898e-05,-0.00179827216025097,0.287111372558358,-0.437035238889225, + -7.2080832551058e-05,-0.00128198762417009,0.299529635754928,-0.461707100273771, + -7.40500479757822e-05,-0.000765703088088543,0.311947898951499,-0.486378961658317, + -7.60192634009504e-05,-0.000249418552007663,0.324366162148069,-0.511050823042862, + -7.79884788262297e-05,0.000266865984072995,0.336784425344639,-0.535722684427408, + -7.99576942508429e-05,0.000783150520154985,0.349202688541211,-0.560394545811953, + -8.19269096763442e-05,0.00129943505623586,0.361620951737781,-0.585066407196499, + -8.38961251011794e-05,0.00181571959231652,0.374039214934351,-0.609738268581045, + -8.58653405260146e-05,0.00233200412839807,0.386457478130922,-0.63441012996559, + -8.78345559512939e-05,0.00284828866447917,0.398875741327492,-0.659081991350136, + -8.9803771375907e-05,0.00336457320056072,0.411294004524063,-0.683753852734681, + -9.17729868015194e-05,0.00388085773664137,0.423712267720634,-0.708425714119227, + -9.37422022265766e-05,0.00439714227272248,0.436130530917204,-0.733097575503772, + -3.89821285236847e-05,-0.00729802825722803,0.135453996894149,-0.143352537693825, + -4.04110093917831e-05,-0.00683179390766009,0.147264063411592,-0.168427508069446, + -4.18398902599648e-05,-0.00636555955809226,0.159074129929035,-0.193502478445067, + -4.32687711283686e-05,-0.00589932520852465,0.170884196446478,-0.218577448820688, + -4.46976519963282e-05,-0.0054330908589566,0.18269426296392,-0.243652419196309, + -4.61265328644545e-05,-0.00496685650938855,0.194504329481363,-0.26872738957193, + -4.75554137328027e-05,-0.00450062215982117,0.206314395998806,-0.293802359947551, + -4.89842946007624e-05,-0.00403438781025289,0.218124462516249,-0.318877330323172, + -5.04131754691661e-05,-0.00356815346068551,0.229934529033691,-0.343952300698793, + -5.18420563370703e-05,-0.00310191911111746,0.241744595551134,-0.369027271074413, + -5.32709372054185e-05,-0.00263568476154963,0.253554662068577,-0.394102241450035, + -5.46998180733782e-05,-0.00216945041198136,0.26536472858602,-0.419177211825655, + -5.6128698941893e-05,-0.00170321606241397,0.277174795103463,-0.444252182201277, + -5.75575798100747e-05,-0.00123698171284636,0.288984861620905,-0.469327152576897, + -5.89864606779233e-05,-0.000770747363278312,0.300794928138348,-0.494402122952518, + -6.04153415465492e-05,-0.000304513013710928,0.312604994655791,-0.519477093328139, + -6.18442224145088e-05,0.000161721335857568,0.324415061173234,-0.54455206370376, + -6.32731032823575e-05,0.000627955685425619,0.336225127690677,-0.569627034079381, + -6.47019841513163e-05,0.00109419003499278,0.348035194208119,-0.594702004455002, + -6.6130865019165e-05,0.00156042438456039,0.359845260725562,-0.619776974830623, + -6.75597458875687e-05,0.002026658734128,0.371655327243005,-0.644851945206244, + -6.89886267553064e-05,0.00249289308369649,0.383465393760448,-0.669926915581865, + -7.04175076234881e-05,0.00295912743326499,0.395275460277891,-0.695001885957486, + -7.18463884916698e-05,0.00342536178283215,0.407085526795333,-0.720076856333107, + -7.32752693595184e-05,0.00389159613240064,0.418895593312776,-0.745151826708728, + -3.17964670884519e-05,-0.00667772081892115,0.132897299000605,-0.145600406155269, + -3.27809494870546e-05,-0.00626551471094228,0.144121908926038,-0.171056164268487, + -3.37654318859348e-05,-0.00585330860296396,0.155346518851471,-0.196511922381706, + -3.47499142847596e-05,-0.00544110249498531,0.166571128776903,-0.221967680494924, + -3.57343966835288e-05,-0.00502889638700665,0.177795738702336,-0.247423438608142, + -3.67188790822426e-05,-0.004616690279028,0.189020348627769,-0.27287919672136, + -3.77033614809563e-05,-0.00420448417104913,0.200244958553202,-0.298334954834579, + -3.86878438798366e-05,-0.00379227806307081,0.211469568478635,-0.323790712947797, + -3.96723262785503e-05,-0.00338007195509182,0.222694178404068,-0.349246471061015, + -4.06568086773751e-05,-0.0029678658471135,0.233918788329501,-0.374702229174233, + -4.16412910760888e-05,-0.00255565973913474,0.245143398254934,-0.400157987287452, + -4.26257734748026e-05,-0.00214345363115598,0.256368008180367,-0.42561374540067, + -4.36102558739604e-05,-0.00173124752317766,0.2675926181058,-0.451069503513888, + -4.45947382724521e-05,-0.00131904141519867,0.278817228031233,-0.476525261627106, + -4.55792206711658e-05,-0.000906835307219911,0.290041837956666,-0.501981019740325, + -4.65637030702126e-05,-0.000494629199241814,0.301266447882099,-0.527436777853543, + -4.75481854688153e-05,-8.24230912630508e-05,0.312491057807532,-0.552892535966761, + -4.8532667867307e-05,0.000329783016716156,0.323715667732965,-0.578348294079979, + -4.95171502662428e-05,0.000741989124694697,0.334940277658398,-0.603804052193198, + -5.05016326650676e-05,0.00115419523267324,0.346164887583831,-0.629259810306416, + -5.14861150640034e-05,0.00156640134065178,0.357389497509264,-0.654715568419634, + -5.24705974627171e-05,0.00197860744863032,0.368614107434696,-0.680171326532852, + -5.34550798614308e-05,0.00239081355660931,0.379838717360129,-0.70562708464607, + -5.44395622602556e-05,0.0028030196645874,0.391063327285562,-0.731082842759289, + -5.54240446589693e-05,0.00321522577256594,0.402287937210995,-0.756538600872507, + -2.52727788376539e-05,-0.00615220143011774,0.130551960505155,-0.147615564001963, + -2.59195085329789e-05,-0.00579402623130587,0.141242690388364,-0.173412688796775, + -2.65662382286092e-05,-0.00543585103249455,0.151933420271573,-0.199209813591588, + -2.72129679239619e-05,-0.00507767583368268,0.162624150154781,-0.225006938386401, + -2.78596976193146e-05,-0.00471950063487103,0.17331488003799,-0.250804063181213, + -2.85064273149449e-05,-0.0043613254360596,0.184005609921199,-0.276601187976026, + -2.91531570103531e-05,-0.00400315023724773,0.194696339804408,-0.302398312770838, + -2.97998867058169e-05,-0.00364497503843642,0.205387069687616,-0.328195437565651, + -3.04466164013362e-05,-0.00328679983962465,0.216077799570825,-0.353992562360464, + -3.10933460967444e-05,-0.00292862464081312,0.226768529454033,-0.379789687155276, + -3.17400757922082e-05,-0.00257044944200135,0.237459259337242,-0.405586811950089, + -3.23868054877829e-05,-0.00221227424319004,0.248149989220451,-0.431383936744901, + -3.30335351829136e-05,-0.00185409904437783,0.25884071910366,-0.457181061539714, + -3.36802648788215e-05,-0.00149592384556718,0.269531448986868,-0.482978186334526, + -3.43269945740632e-05,-0.00113774864675498,0.280222178870077,-0.508775311129339, + -3.4973724269638e-05,-0.000779573447943438,0.290912908753286,-0.534572435924152, + -3.56204539648797e-05,-0.000421398249131455,0.301603638636494,-0.560369560718964, + -3.62671836601214e-05,-6.3223050319694e-05,0.312294368519703,-0.586166685513777, + -3.69139133561402e-05,0.000294952148491401,0.322985098402912,-0.611963810308589, + -3.75606430509379e-05,0.00065312734730405,0.333675828286121,-0.637760935103402, + -3.82073727468457e-05,0.00101130254611492,0.344366558169329,-0.663558059898215, + -3.88541024425315e-05,0.00136947774492535,0.355057288052537,-0.689355184693027, + -3.95008321372181e-05,0.00172765294373844,0.365748017935746,-0.71515230948784, + -4.0147561833126e-05,0.00208582814254976,0.376438747818955,-0.740949434282653, + -4.07942915287007e-05,0.00244400334136152,0.387129477702164,-0.766746559077465, + -1.96334074151483e-05,-0.00572576222337406,0.128506016863772,-0.14933910996327, + -2.00413254359821e-05,-0.00541801129124064,0.138733348553683,-0.175428202539342, + -2.04492434565662e-05,-0.00511026035910667,0.148960680243594,-0.201517295115414, + -2.08571614775388e-05,-0.00480250942697347,0.159188011933505,-0.227606387691486, + -2.12650794982894e-05,-0.00449475849484016,0.169415343623416,-0.253695480267558, + -2.1672997519262e-05,-0.00418700756270685,0.179642675313327,-0.27978457284363, + -2.20809155400126e-05,-0.00387925663057298,0.189870007003238,-0.305873665419702, + -2.24888335607631e-05,-0.00357150569843956,0.200097338693149,-0.331962757995774, + -2.28967515816247e-05,-0.00326375476630614,0.21032467038306,-0.358051850571846, + -2.33046696022643e-05,-0.00295600383417249,0.220552002072971,-0.384140943147918, + -2.37125876229038e-05,-0.00264825290203885,0.230779333762882,-0.41023003572399, + -2.41205056435989e-05,-0.00234050196990521,0.241006665452793,-0.436319128300062, + -2.4528423664627e-05,-0.00203275103777201,0.251233997142704,-0.462408220876134, + -2.49363416854331e-05,-0.00172500010563859,0.261461328832615,-0.488497313452206, + -2.53442597062392e-05,-0.00141724917350494,0.271688660522526,-0.514586406028278, + -2.57521777269343e-05,-0.0011094982413713,0.281915992212437,-0.54067549860435, + -2.61600957482955e-05,-0.000801747309238765,0.292143323902348,-0.566764591180422, + -2.65680137689905e-05,-0.000493996377105343,0.302370655592259,-0.592853683756494, + -2.69759317897966e-05,-0.000186245444971256,0.31259798728217,-0.618942776332566, + -2.73838498099366e-05,0.000121505487162388,0.322825318972081,-0.645031868908638, + -2.77917678311868e-05,0.000429256419295587,0.333052650661992,-0.67112096148471, + -2.81996858518818e-05,0.000737007351429231,0.343279982351903,-0.697210054060782, + -2.86076038726879e-05,0.00104475828356287,0.353507314041814,-0.723299146636854, + -2.90155218938271e-05,0.00135250921569563,0.363734645731725,-0.749388239212926, + -2.94234399143001e-05,0.00166026014782972,0.373961977421636,-0.775477331788998, + -1.49608233049603e-05,-0.00539140627700752,0.126797767634769,-0.150754933422575, + -1.52100834727165e-05,-0.00512799092456584,0.13663976283128,-0.177083865749572, + -1.54593436405559e-05,-0.00486457557212427,0.146481758027791,-0.20341279807657, + -1.57086038082288e-05,-0.00460116021968238,0.156323753224302,-0.229741730403567, + -1.59578639760127e-05,-0.00433774486724092,0.166165748420813,-0.256070662730564, + -1.62071241436856e-05,-0.00407432951479891,0.176007743617324,-0.282399595057562, + -1.64563843115251e-05,-0.00381091416235746,0.185849738813835,-0.308728527384559, + -1.67056444788094e-05,-0.0035474988099149,0.195691734010347,-0.335057459711557, + -1.69549046468709e-05,-0.00328408345747366,0.205533729206857,-0.361386392038554, + -1.72041648142107e-05,-0.00302066810503154,0.215375724403368,-0.387715324365552, + -1.74534249820502e-05,-0.00275725275258987,0.22521771959988,-0.414044256692549, + -1.77026851503337e-05,-0.00249383740014864,0.235059714796391,-0.440373189019546, + -1.7951945317618e-05,-0.00223042204770652,0.244901709992902,-0.466702121346544, + -1.82012054855685e-05,-0.00196700669526528,0.254743705189412,-0.493031053673541, + -1.84504656528528e-05,-0.00170359134282272,0.264585700385924,-0.519359986000539, + -1.86997258205812e-05,-0.00144017599038104,0.274427695582435,-0.545688918327536, + -1.89489859885317e-05,-0.00117676063793981,0.284269690778946,-0.572017850654533, + -1.9198246155927e-05,-0.000913345285497469,0.294111685975457,-0.598346782981531, + -1.94475063239885e-05,-0.000649929933056015,0.303953681171968,-0.624675715308529, + -1.9696766491939e-05,-0.000386514580614339,0.313795676368479,-0.651004647635526, + -1.99460266590012e-05,-0.000123099228172219,0.32363767156499,-0.677333579962523, + -2.01952868267297e-05,0.000140316124269457,0.333479666761501,-0.703662512289521, + -2.04445469950132e-05,0.000403731476710689,0.343321661958012,-0.729991444616518, + -2.06938071626306e-05,0.000667146829152809,0.353163657154523,-0.756320376943516, + -2.0943067330137e-05,0.000930562181594929,0.363005652351034,-0.782649309270513, + -1.12229718828294e-05,-0.0051360203707892,0.125422688095384,-0.151879915816704, + -1.13720107837723e-05,-0.00490971168928833,0.134955497843117,-0.178399419570831, + -1.15210496851037e-05,-0.00468340300778758,0.144488307590851,-0.204918923324958, + -1.16700885856025e-05,-0.0044570943262856,0.154021117338585,-0.231438427079086, + -1.18191274869339e-05,-0.00423078564478518,0.163553927086318,-0.257957930833213, + -1.19681663877658e-05,-0.00400447696328388,0.173086736834052,-0.28447743458734, + -1.21172052887086e-05,-0.00377816828178279,0.182619546581785,-0.310996938341467, + -1.22662441899291e-05,-0.00355185960028193,0.192152356329519,-0.337516442095594, + -1.24152830907054e-05,-0.0033255509187804,0.201685166077253,-0.364035945849721, + -1.25643219918703e-05,-0.00309924223727998,0.211217975824986,-0.390555449603849, + -1.27133608925911e-05,-0.00287293355577822,0.22075078557272,-0.417074953357976, + -1.28623997939226e-05,-0.0026466248742778,0.230283595320453,-0.443594457112103, + -1.30114386945879e-05,-0.00242031619277605,0.239816405068187,-0.47011396086623, + -1.31604775958083e-05,-0.00219400751127519,0.24934921481592,-0.496633464620357, + -1.33095164970287e-05,-0.00196769882977454,0.258882024563654,-0.523152968374484, + -1.3458555397361e-05,-0.00174139014827257,0.268414834311387,-0.549672472128611, + -1.36075942983593e-05,-0.00151508146677148,0.277947644059121,-0.576191975882739, + -1.37566331999128e-05,-0.00128877278527129,0.287480453806854,-0.602711479636866, + -1.39056721008002e-05,-0.00106246410377064,0.297013263554587,-0.629230983390993, + -1.40547110014655e-05,-0.000836155422268892,0.306546073302321,-0.65575048714512, + -1.4203749903019e-05,-0.000609846740768472,0.316078883050054,-0.682269990899247, + -1.43527888035733e-05,-0.000383538059266719,0.325611692797788,-0.708789494653374, + -1.45018277047937e-05,-0.000157229377765855,0.335144502545522,-0.735308998407502, + -1.4650866605348e-05,6.90793037358972e-05,0.344677312293256,-0.761828502161629, + -1.47999055070125e-05,0.000295387985235873,0.354210122040989,-0.788348005915756, + -8.31577803500627e-06,-0.00494467412969601,0.124347900164765,-0.152750402278653, + -8.40386687445127e-06,-0.00474822162272148,0.133639642622223,-0.179417365982568, + -8.49195571367423e-06,-0.00455176911574662,0.142931385079682,-0.206084329686484, + -8.58004455289718e-06,-0.00435531660877198,0.15222312753714,-0.232751293390399, + -8.66813339217565e-06,-0.00415886410179722,0.161514869994598,-0.259418257094314, + -8.75622223101002e-06,-0.0039624115948218,0.170806612452057,-0.286085220798229, + -8.84431107045502e-06,-0.00376595908784738,0.180098354909515,-0.312752184502144, + -8.93239990995554e-06,-0.00356950658087274,0.189390097366974,-0.339419148206059, + -9.02048874912298e-06,-0.00337305407389787,0.198681839824432,-0.366086111909974, + -9.10857758806838e-06,-0.00317660156692279,0.20797358228189,-0.39275307561389, + -9.19666642751338e-06,-0.00298014905994859,0.217265324739348,-0.419420039317805, + -9.28475526718042e-06,-0.00278369655297395,0.226557067196807,-0.44608700302172, + -9.37284410640338e-06,-0.0025872440459993,0.235848809654265,-0.472753966725635, + -9.46093294507122e-06,-0.00239079153902422,0.245140552111723,-0.49942093042955, + -9.54902178451622e-06,-0.0021943390320498,0.254432294569181,-0.526087894133466, + -9.63711062396122e-06,-0.00199788652507493,0.26372403702664,-0.552754857837381, + -9.72519946285111e-06,-0.00180143401809985,0.273015779484098,-0.579421821541296, + -9.81328830229611e-06,-0.00160498151112498,0.282307521941557,-0.606088785245211, + -9.90137714129702e-06,-0.00140852900415034,0.291599264399015,-0.632755748949126, + -9.98946598051997e-06,-0.00121207649717503,0.300891006856474,-0.659422712653041, + -1.0077554820187e-05,-0.00101562399020105,0.310182749313932,-0.686089676356957, + -1.0165643659743e-05,-0.000819171483227077,0.31947449177139,-0.712756640060872, + -1.02537324984109e-05,-0.000622718976251324,0.328766234228849,-0.739423603764787, + -1.03418213375228e-05,-0.00042626646927646,0.338057976686307,-0.766090567468702, + -1.04299101771899e-05,-0.000229813962302483,0.347349719143765,-0.792757531172617, + -6.10357661676164e-06,-0.00480328062227675,0.123526931414982,-0.153410240587686, + -6.15554023142284e-06,-0.0046301253796257,0.132634880473999,-0.180188980554842, + -6.20750384611179e-06,-0.00445697013697488,0.141742829533017,-0.206967720521998, + -6.25946746068973e-06,-0.00428381489432383,0.150850778592034,-0.233746460489154, + -6.31143107515664e-06,-0.00411065965167245,0.159958727651052,-0.26052520045631, + -6.36339469017866e-06,-0.00393750440902196,0.169066676710069,-0.287303940423466, + -6.41535830492312e-06,-0.00376434916637103,0.178174625769087,-0.314082680390621, + -6.46732191927901e-06,-0.00359119392371943,0.187282574828105,-0.340861420357777, + -6.51928553385694e-06,-0.00341803868106871,0.196390523887122,-0.367640160324933, + -6.57124914887897e-06,-0.003244883438418,0.20549847294614,-0.394418900292089, + -6.62321276334588e-06,-0.00307172819576684,0.214606422005158,-0.421197640259245, + -6.67517637775727e-06,-0.00289857295311524,0.223714371064175,-0.447976380226401, + -6.72713999216867e-06,-0.00272541771046386,0.232822320123193,-0.474755120193557, + -6.77910360702416e-06,-0.00255226246781337,0.241930269182211,-0.501533860160712, + -6.83106722165761e-06,-0.00237910722516221,0.251038218241228,-0.528312600127868, + -6.88303083629105e-06,-0.00220595198251106,0.260146167300246,-0.555091340095024, + -6.93499445092449e-06,-0.00203279673986034,0.269254116359263,-0.58187008006218, + -6.98695806566896e-06,-0.00185964149720919,0.278362065418281,-0.608648820029336, + -7.03892168052445e-06,-0.00168648625455869,0.287470014477298,-0.635427559996492, + -7.09088529504687e-06,-0.00151333101190732,0.296577963536316,-0.662206299963648, + -7.14284891001338e-06,-0.00134017576925727,0.305685912595333,-0.688985039930803, + -7.19481252464682e-06,-0.00116702052660589,0.314793861654351,-0.715763779897959, + -7.24677613916924e-06,-0.000993865283954065,0.323901810713369,-0.742542519865115, + -7.29873975402473e-06,-0.000820710041304018,0.333009759772386,-0.769321259832271, + -7.35070336865817e-06,-0.000647554798652639,0.342117708831404,-0.796099999799427, + -4.44801885537971e-06,-0.00469981956135423,0.122910765884985,-0.153902641662708, + -4.47887572457839e-06,-0.00454442440526293,0.131880963461904,-0.180764794113541, + -4.50973259363829e-06,-0.00438902924917117,0.140851161038824,-0.207626946564374, + -4.54058946264269e-06,-0.00423363409307931,0.149821358615744,-0.234489099015206, + -4.57144633198014e-06,-0.004078238936988,0.158791556192663,-0.261351251466039, + -4.60230320109556e-06,-0.00392284378089647,0.167761753769583,-0.288213403916872, + -4.63316007021097e-06,-0.00376744862480494,0.176731951346503,-0.315075556367705, + -4.66401693932639e-06,-0.00361205346871318,0.185702148923423,-0.341937708818537, + -4.69487380849731e-06,-0.00345665831262187,0.194672346500342,-0.36879986126937, + -4.72573067777926e-06,-0.00330126315653057,0.203642544077262,-0.395662013720203, + -4.7565875465061e-06,-0.00314586800043881,0.212612741654181,-0.422524166171036, + -4.78744441567702e-06,-0.00299047284434684,0.221582939231101,-0.449386318621868, + -4.81830128473693e-06,-0.00283507768825508,0.230553136808021,-0.476248471072701, + -4.84915815379683e-06,-0.00267968253216377,0.239523334384941,-0.503110623523534, + -4.8800150231898e-06,-0.00252428737607224,0.24849353196186,-0.529972775974366, + -4.91087189258277e-06,-0.00236889221998071,0.25746372953878,-0.556834928425199, + -4.94172876119858e-06,-0.00221349706388918,0.266433927115699,-0.583697080876032, + -4.97258563092462e-06,-0.00205810190779876,0.275404124692619,-0.610559233326865, + -5.00344250009555e-06,-0.00190270675170634,0.284374322269539,-0.637421385777697, + -5.03429936904443e-06,-0.00174731159561459,0.293344519846459,-0.66428353822853, + -5.06515623788228e-06,-0.00159191643952283,0.302314717423378,-0.691145690679363, + -5.09601310771934e-06,-0.00143652128343286,0.311284915000297,-0.718007843130195, + -5.12686997633516e-06,-0.00128112612733977,0.320255112577218,-0.744869995581028, + -5.15772684561711e-06,-0.00112573097124891,0.329225310154137,-0.771732148031861, + -5.18858371423292e-06,-0.000970335815156265,0.338195507731057,-0.798594300482694, + -3.22438332248098e-06,-0.00462463571043847,0.122454373884297,-0.154265820390697, + -3.24295788739493e-06,-0.00448254515153534,0.131322643807124,-0.18118949512744, + -3.26153245189253e-06,-0.00434045459263144,0.140190913729951,-0.208113169864183, + -3.28010701661219e-06,-0.00419836403372775,0.149059183652778,-0.235036844600927, + -3.29868158122082e-06,-0.0040562734748244,0.157927453575604,-0.26196051933767, + -3.31725614638456e-06,-0.00391418291592127,0.166795723498431,-0.288884194074413, + -3.33583071099319e-06,-0.0037720923570177,0.175663993421258,-0.315807868811157, + -3.35440527521325e-06,-0.00363000179811346,0.184532263344085,-0.3427315435479, + -3.37297983982188e-06,-0.00348791123920966,0.193400533266912,-0.369655218284643, + -3.39155440481909e-06,-0.00334582068030653,0.202268803189739,-0.396578893021386, + -3.41012896953874e-06,-0.00320373012140318,0.211137073112565,-0.423502567758129, + -3.42870353464697e-06,-0.00306163956250005,0.220005343035392,-0.450426242494873, + -3.44727809897805e-06,-0.00291954900359603,0.228873612958219,-0.477349917231616, + -3.46585266364219e-06,-0.00277745844469224,0.237741882881046,-0.504273591968359, + -3.48442722819531e-06,-0.00263536788578911,0.246610152803872,-0.531197266705102, + -3.50300179308149e-06,-0.00249327732688531,0.255478422726699,-0.558120941441846, + -3.52157635719053e-06,-0.00235118676798152,0.264346692649526,-0.585044616178589, + -3.54015092218773e-06,-0.00220909620907839,0.273214962572353,-0.611968290915332, + -3.55872548751801e-06,-0.00206700565017526,0.282083232495179,-0.638891965652076, + -3.57730005173806e-06,-0.00192491509127146,0.290951502418006,-0.665815640388819, + -3.5958746168463e-06,-0.00178282453236811,0.299819772340833,-0.692739315125562, + -3.61444918117737e-06,-0.00164073397346387,0.30868804226366,-0.719662989862305, + -3.63302374650765e-06,-0.00149864341456096,0.317556312186487,-0.746586664599048, + -3.6515983107277e-06,-0.00135655285565761,0.326424582109313,-0.773510339335792, + -3.67017287539184e-06,-0.00121446229675293,0.335292852032141,-0.800434014072535, + -2.32827667848157e-06,-0.00457026498761604,0.122119613964616,-0.15453138438555, + -2.33966838714128e-06,-0.0044380134468488,0.130913176657392,-0.181500045523643, + -2.35106009521813e-06,-0.00430576190608123,0.139706739350168,-0.208468706661736, + -2.3624518039056e-06,-0.00417351036531433,0.148500302042944,-0.235437367799828, + -2.37384351248204e-06,-0.00404125882454709,0.15729386473572,-0.262406028937921, + -2.38523522066991e-06,-0.0039090072837793,0.166087427428497,-0.289374690076014, + -2.39662692919085e-06,-0.00377675574301195,0.174880990121273,-0.316343351214107, + -2.4080186377673e-06,-0.00364450420224505,0.183674552814049,-0.343312012352199, + -2.41941034606619e-06,-0.00351225266147748,0.192468115506825,-0.370280673490292, + -2.4308020544761e-06,-0.00338000112071013,0.201261678199602,-0.397249334628385, + -2.44219376299704e-06,-0.00324774957994278,0.210055240892378,-0.424217995766477, + -2.45358547168451e-06,-0.00311549803917566,0.218848803585154,-0.45118665690457, + -2.46497717992789e-06,-0.00298324649840853,0.22764236627793,-0.478155318042663, + -2.47636888839331e-06,-0.00285099495764096,0.236435928970707,-0.505123979180756, + -2.4877605971918e-06,-0.0027187434168745,0.245229491663482,-0.532092640318848, + -2.49915230521314e-06,-0.00258649187610605,0.254023054356259,-0.559061301456941, + -2.51054401390061e-06,-0.00245424033533936,0.262816617049035,-0.586029962595034, + -2.52193572225501e-06,-0.00232198879457179,0.271610179741811,-0.612998623733127, + -2.53332743027634e-06,-0.00218973725380378,0.280403742434588,-0.639967284871219, + -2.5447191394079e-06,-0.00205748571303754,0.289197305127364,-0.666935946009312, + -2.55611084742924e-06,-0.00192523417226953,0.29799086782014,-0.693904607147405, + -2.56750255700489e-06,-0.00179298263150374,0.306784430512916,-0.720873268285498, + -2.5788942649152e-06,-0.00166073109073617,0.315577993205692,-0.747841929423591, + -2.59028597304756e-06,-0.00152847954996815,0.324371555898468,-0.774810590561683, + -2.60167768129094e-06,-0.00139622800920058,0.333165118591245,-0.801779251699776, + -1.67644137261114e-06,-0.00453107958152321,0.121875824737514,-0.154724345946967, + -1.68357980206979e-06,-0.0044060357095308,0.130615011347768,-0.18172569467229, + -1.69071823136191e-06,-0.00428099183753794,0.139354197958022,-0.208727043397613, + -1.69785666087607e-06,-0.00415594796554553,0.148093384568276,-0.235728392122936, + -1.7049950902237e-06,-0.00403090409355278,0.15683257117853,-0.262729740848259, + -1.71213351973787e-06,-0.00390586022156025,0.165571757788784,-0.289731089573582, + -1.71927194902999e-06,-0.0037808163495674,0.174310944399038,-0.316732438298905, + -1.72641037865517e-06,-0.0036557724775752,0.183050131009291,-0.343733787024228, + -1.73354880789178e-06,-0.00353072860558257,0.191789317619545,-0.37073513574955, + -1.74068723712839e-06,-0.00340568473358949,0.2005285042298,-0.397736484474873, + -1.74782566630949e-06,-0.00328064086159663,0.209267690840053,-0.424737833200196, + -1.75496409560161e-06,-0.00315559698960377,0.218006877450308,-0.451739181925519, + -1.76210252567088e-06,-0.00303055311761202,0.226746064060561,-0.478740530650842, + -1.769240954963e-06,-0.00290550924561916,0.235485250670815,-0.505741879376165, + -1.77637938436614e-06,-0.00278046537362675,0.244224437281069,-0.532743228101488, + -1.78351781343622e-06,-0.00265542150163389,0.252963623891323,-0.559744576826811, + -1.79065624295038e-06,-0.00253037762964103,0.261702810501577,-0.586745925552133, + -1.79779467246455e-06,-0.00240533375764884,0.270441997111831,-0.613747274277456, + -1.80493310175667e-06,-0.00228028988565621,0.279181183722085,-0.640748623002779, + -1.81207153138185e-06,-0.00215524601366379,0.287920370332339,-0.667749971728102, + -1.81920996067397e-06,-0.00203020214167093,0.296659556942593,-0.694751320453425, + -1.82634838985507e-06,-0.00190515826967808,0.305398743552847,-0.721752669178748, + -1.83348681981332e-06,-0.00178011439768611,0.3141379301631,-0.748754017904071, + -1.84062524877238e-06,-0.0016550705256928,0.322877116773355,-0.775755366629394, + -1.84776367817552e-06,-0.00153002665369995,0.331616303383609,-0.802756715354716, + -1.20461177616216e-06,-0.00450290613835991,0.121699209898508,-0.154863910318333, + -1.20918555218674e-06,-0.00438310611066661,0.130399018822513,-0.181888901174916, + -1.21375932843337e-06,-0.00426330608297343,0.139098827746517,-0.208913892031499, + -1.21833310390285e-06,-0.00414350605527936,0.147798636670522,-0.235938882888083, + -1.22290687998294e-06,-0.00402370602758606,0.156498445594527,-0.262963873744666, + -1.22748065589651e-06,-0.00390390599989243,0.165198254518532,-0.289988864601249, + -1.23205443181007e-06,-0.00378410597219925,0.173898063442536,-0.317013855457833, + -1.23662820789017e-06,-0.00366430594450584,0.182597872366541,-0.344038846314416, + -1.24120198369271e-06,-0.00354450591681221,0.191297681290545,-0.371063837170999, + -1.24577575971729e-06,-0.00342470588911881,0.19999749021455,-0.398088828027582, + -1.25034953579739e-06,-0.00330490586142562,0.208697299138554,-0.425113818884165, + -1.25492331148891e-06,-0.00318510583373177,0.217397108062559,-0.452138809740749, + -1.25949708773554e-06,-0.00306530580603881,0.226096916986563,-0.479163800597332, + -1.26407086342706e-06,-0.00294550577834496,0.234796725910568,-0.506188791453915, + -1.2686446392296e-06,-0.00282570575065111,0.243496534834573,-0.533213782310498, + -1.27321841558725e-06,-0.00270590572295837,0.252196343758577,-0.560238773167082, + -1.27779219138979e-06,-0.00258610569526452,0.260896152682582,-0.587263764023665, + -1.28236596719233e-06,-0.00246630566757089,0.269595961606587,-0.614288754880248, + -1.28693974266181e-06,-0.00234650563987682,0.278295770530592,-0.641313745736832, + -1.29151351868639e-06,-0.00222670561218363,0.286995579454596,-0.668338736593415, + -1.29608729471098e-06,-0.00210690558449,0.295695388378601,-0.695363727449998, + -1.30066107051352e-06,-0.00198710555679638,0.304395197302605,-0.722388718306581, + -1.30523484676015e-06,-0.00186730552910364,0.31309500622661,-0.749413709163165, + -1.30980862256269e-06,-0.00174750550141001,0.321794815150614,-0.776438700019748, + -1.31438239836523e-06,-0.00162770547371593,0.330494624074619,-0.803463690876331, + -9.74813355643089e-05,-0.0141674375286459,0.162402249079949,-0.132751372904114, + -0.000104267816828707,-0.0135156735364591,0.178340305057565,-0.154321479317847, + -0.000111054298092883,-0.0128639095442722,0.194278361035181,-0.17589158573158, + -0.000117840779357337,-0.0122121455520854,0.210216417012796,-0.197461692145313, + -0.000124627260621624,-0.0115603815598984,0.226154472990412,-0.219031798559046, + -0.000131413741886022,-0.0109086175677116,0.242092528968028,-0.240601904972779, + -0.000138200223150531,-0.0102568535755247,0.258030584945644,-0.262172011386512, + -0.000144986704414818,-0.00960508958333794,0.27396864092326,-0.283742117800245, + -0.000151773185678716,-0.00895332559115047,0.289906696900876,-0.305312224213978, + -0.000158559666943503,-0.00830156159896456,0.305844752878491,-0.326882330627711, + -0.000165346148207846,-0.00764979760677731,0.321782808856107,-0.348452437041444, + -0.000172132629471466,-0.00699803361458984,0.337720864833723,-0.370022543455177, + -0.000178919110736309,-0.00634626962240348,0.353658920811339,-0.39159264986891, + -0.000185705592000263,-0.00569450563021601,0.369596976788955,-0.413162756282643, + -0.000192492073264772,-0.00504274163802965,0.38553503276657,-0.434732862696375, + -0.000199278554529281,-0.00439097764584306,0.401473088744186,-0.456302969110108, + -0.000206065035793346,-0.00373921365365559,0.417411144721802,-0.477873075523841, + -0.000212851517058077,-0.00308744966146879,0.433349200699418,-0.499443181937574, + -0.000219637998322253,-0.00243568566928243,0.449287256677033,-0.521013288351307, + -0.000226424479586318,-0.00178392167709474,0.465225312654649,-0.54258339476504, + -0.000233210960850716,-0.00113215768490837,0.481163368632265,-0.564153501178773, + -0.000239997442115225,-0.000480393692722014,0.49710142460988,-0.585723607592506, + -0.000246783923379956,0.000171370299464346,0.513039480587496,-0.607293714006238, + -0.000253570404643355,0.000823134291652927,0.528977536565112,-0.628863820419972, + -0.000260356885907753,0.00147489828383973,0.544915592542728,-0.650433926833705, + -9.65572740553866e-05,-0.014028497454653,0.162096622487676,-0.133090820295134, + -0.000103230369417728,-0.0133764810638287,0.177965576355787,-0.154714222971821, + -0.000109903464780126,-0.0127244646730047,0.193834530223897,-0.176337625648509, + -0.000116576560142301,-0.0120724482821802,0.209703484092008,-0.197961028325197, + -0.000123249655504754,-0.0114204318913559,0.225572437960119,-0.219584431001884, + -0.000129922750866984,-0.0107684155005316,0.24144139182823,-0.241207833678572, + -0.00013659584622927,-0.0101163991097073,0.25731034569634,-0.262831236355259, + -0.000143268941591779,-0.00946438271888339,0.273179299564451,-0.284454639031947, + -0.000149942036954065,-0.00881236632805904,0.289048253432562,-0.306078041708635, + -0.000156615132316462,-0.00816034993723491,0.304917207300672,-0.327701444385322, + -0.000163288227678748,-0.00750833354641078,0.320786161168783,-0.34932484706201, + -0.000169961323041257,-0.00685631715558643,0.336655115036894,-0.370948249738697, + -0.00017663441840321,-0.00620430076476186,0.352524068905005,-0.392571652415385, + -0.000183307513765607,-0.00555228437393773,0.368393022773115,-0.414195055092073, + -0.000189980609127893,-0.0049002679831136,0.384261976641226,-0.43581845776876, + -0.000196653704490402,-0.00424825159228925,0.400130930509337,-0.457441860445448, + -0.000203326799852799,-0.00359623520146535,0.415999884377447,-0.479065263122136, + -0.000209999895215085,-0.00294421881064122,0.431868838245558,-0.500688665798823, + -0.000216672990577482,-0.00229220241981709,0.447737792113668,-0.52231206847551, + -0.000223346085939324,-0.00164018602899185,0.463606745981779,-0.543935471152198, + -0.000230019181302055,-0.000988169638167946,0.47947569984989,-0.565558873828886, + -0.000236692276664119,-0.00033615324734404,0.495344653718,-0.587182276505574, + -0.000243365372026849,0.000315863143479866,0.511213607586111,-0.608805679182261, + -0.000250038467389024,0.000967879534304661,0.527082561454222,-0.630429081858949, + -0.000256711562751422,0.00161989592512812,0.542951515322332,-0.652052484535637, + -9.52928558560773e-05,-0.0138401336541844,0.161677504997964,-0.133553902126001, + -0.000101812081613084,-0.0131879760277055,0.177451846744137,-0.155250012773586, + -0.00010833130737059,-0.012535818401227,0.193226188490309,-0.176946123421171, + -0.000114850533127819,-0.0118836607747481,0.209000530236482,-0.198642234068756, + -0.000121369758885159,-0.0112315031482696,0.224774871982655,-0.220338344716342, + -0.000127888984642277,-0.0105793455217907,0.240549213728828,-0.242034455363927, + -0.000134408210399339,-0.00992718789531177,0.256323555475001,-0.263730566011512, + -0.000140927436156624,-0.00927503026883314,0.272097897221174,-0.285426676659097, + -0.00014744666191413,-0.00862287264235473,0.287872238967346,-0.307122787306682, + -0.000153965887671081,-0.00797071501587543,0.303646580713519,-0.328818897954267, + -0.000160485113428255,-0.00731855738939657,0.319420922459692,-0.350515008601852, + -0.000167004339185484,-0.00666639976291794,0.335195264205865,-0.372211119249437, + -0.000173523564942935,-0.00601424213643975,0.350969605952038,-0.393907229897022, + -0.00018004279069983,-0.00536208450996045,0.366743947698211,-0.415603340544608, + -0.000186562016457503,-0.00470992688348226,0.382518289444383,-0.437299451192192, + -0.000193081242214621,-0.00405776925700319,0.398292631190556,-0.458995561839777, + -0.00019960046797185,-0.00340561163052455,0.414066972936729,-0.480691672487363, + -0.000206119693728524,-0.00275345400404503,0.429841314682902,-0.502387783134948, + -0.000212638919486308,-0.00210129637756706,0.445615656429075,-0.524083893782533, + -0.000219158145243648,-0.00144913875108843,0.461389998175247,-0.545780004430118, + -0.000225677371000765,-0.000796981124609797,0.47716433992142,-0.567476115077703, + -0.000232196596757661,-0.000144823498130275,0.492938681667593,-0.589172225725288, + -0.000238715822515001,0.000507334128347914,0.508713023413766,-0.610868336372873, + -0.000245235048272341,0.00115949175482699,0.524487365159939,-0.632564447020458, + -0.00025175427402957,0.00181164938130562,0.540261706906112,-0.654260557668043, + -9.35773171724386e-05,-0.0135877673676663,0.16110716638979,-0.134179662358041, + -9.98901491691129e-05,-0.01293579158175,0.176753033212161,-0.155974022934056, + -0.000106202981165704,-0.0122838157958333,0.192398900034533,-0.177768383510071, + -0.000112515813162462,-0.0116318400099168,0.208044766856905,-0.199562744086086, + -0.000118828645158886,-0.0109798642240001,0.223690633679277,-0.221357104662101, + -0.000125141477155644,-0.0103278884380839,0.239336500501648,-0.243151465238116, + -0.000131454309152346,-0.00967591265216727,0.25498236732402,-0.264945825814131, + -0.000137767141149103,-0.00902393686625103,0.270628234146391,-0.286740186390146, + -0.00014407997314575,-0.00837196108033433,0.286274100968763,-0.308534546966161, + -0.000150392805142396,-0.00771998529441764,0.301919967791135,-0.330328907542176, + -0.000156705637138765,-0.00706800950850095,0.317565834613507,-0.35212326811819, + -0.000163018469135578,-0.00641603372258448,0.333211701435879,-0.373917628694206, + -0.000169331301132059,-0.00576405793666801,0.34885756825825,-0.39571198927022, + -0.000175644133128872,-0.00511208215075176,0.364503435080622,-0.417506349846236, + -0.000181956965125463,-0.00446010636483507,0.380149301902994,-0.43930071042225, + -0.000188269797122276,-0.0038081305789186,0.395795168725365,-0.461095070998265, + -0.000194582629118534,-0.00315615479300213,0.411441035547736,-0.48288943157428, + -0.000200895461115125,-0.00250417900708499,0.427086902370109,-0.504683792150295, + -0.000207208293111827,-0.00185220322116852,0.442732769192481,-0.52647815272631, + -0.000213521125108751,-0.00120022743525228,0.458378636014852,-0.548272513302325, + -0.000219833957105675,-0.000548251649336695,0.474024502837223,-0.57006687387834, + -0.000226146789102044,0.000103724136580219,0.489670369659595,-0.591861234454355, + -0.000232459621098746,0.000755699922497133,0.505316236481967,-0.61365559503037, + -0.000238772453095115,0.00140767570841405,0.520962103304339,-0.635449955606385, + -0.00024508528509215,0.00205965149432963,0.53660797012671,-0.6572443161824, + -9.12763325408017e-05,-0.0132549861448596,0.160339171693365,-0.135014457284623, + -9.73166533757563e-05,-0.012603920691451,0.175812526399135,-0.156939888097433, + -0.000103356974210655,-0.0119528552380422,0.191285881104906,-0.178865318910243, + -0.000109397295045666,-0.0113017897846338,0.206759235810677,-0.200790749723053, + -0.000115437615880509,-0.0106507243312249,0.222232590516448,-0.222716180535863, + -0.000121477936715408,-0.00999965887781618,0.237705945222219,-0.244641611348672, + -0.000127518257550474,-0.00934859342440775,0.253179299927989,-0.266567042161482, + -0.000133558578384985,-0.00869752797099843,0.26865265463376,-0.288492472974292, + -0.000139598899220106,-0.00804646251759,0.284126009339531,-0.310417903787102, + -0.000145639220055005,-0.00739539706418135,0.299599364045302,-0.332343334599912, + -0.000151679540889793,-0.0067443316107727,0.315072718751072,-0.354268765412722, + -0.000157719861724637,-0.00609326615736361,0.330546073456844,-0.376194196225532, + -0.00016376018255948,-0.00544220070395474,0.346019428162614,-0.398119627038342, + -0.000169800503394657,-0.00479113525054675,0.361492782868385,-0.420045057851152, + -0.000175840824229168,-0.00414006979713699,0.376966137574156,-0.441970488663961, + -0.000181881145064344,-0.00348900434372923,0.392439492279926,-0.463895919476771, + -0.000187921465898966,-0.00283793889031991,0.407912846985697,-0.485821350289581, + -0.000193961786734143,-0.00218687343691171,0.423386201691468,-0.507746781102391, + -0.000200002107569208,-0.00153580798350306,0.438859556397239,-0.529672211915201, + -0.000206042428403941,-0.000884742530093963,0.45433291110301,-0.551597642728011, + -0.000212082749239451,-0.000233677076686423,0.46980626580878,-0.573523073540821, + -0.00021812307007385,0.000417388376722894,0.485279620514551,-0.595448504353631, + -0.000224163390908694,0.00106845383013132,0.500752975220321,-0.61737393516644, + -0.000230203711743759,0.00171951928354064,0.516226329926093,-0.639299365979251, + -0.000236244032578714,0.00237058473694907,0.531699684631864,-0.66122479679206, + -8.82374095284577e-05,-0.0128253175285241,0.159319636936119,-0.136109234287343, + -9.39254667058353e-05,-0.0121766047217775,0.174564812783837,-0.158206554837878, + -9.9613523883324e-05,-0.011527891915031,0.189809988631556,-0.180303875388413, + -0.000105301581060924,-0.0108791791082846,0.205055164479274,-0.202401195938947, + -0.00011098963823819,-0.0102304663015381,0.220300340326992,-0.224498516489482, + -0.000116677695415845,-0.00958175349479196,0.23554551617471,-0.246595837040017, + -0.000122365752593112,-0.00893304068804524,0.250790692022428,-0.268693157590552, + -0.000128053809770712,-0.00828432788129851,0.266035867870147,-0.290790478141087, + -0.000133741866948089,-0.00763561507455224,0.281281043717865,-0.312887798691621, + -0.000139429924125523,-0.00698690226780552,0.296526219565583,-0.334985119242156, + -0.0001451179813029,-0.0063381894610588,0.311771395413301,-0.357082439792691, + -0.0001508060384805,-0.00568947665431252,0.32701657126102,-0.379179760343226, + -0.000156494095657767,-0.00504076384756602,0.342261747108738,-0.401277080893761, + -0.000162182152835366,-0.00439205104081974,0.357506922956456,-0.423374401444295, + -0.000167870210012744,-0.00374333823407302,0.372752098804174,-0.44547172199483, + -0.000173558267190344,-0.00309462542732675,0.387997274651892,-0.467569042545365, + -0.000179246324367499,-0.00244591262058003,0.40324245049961,-0.4896663630959, + -0.000184934381544877,-0.00179719981383308,0.418487626347329,-0.511763683646435, + -0.000190622438722476,-0.00114848700708681,0.433732802195047,-0.533861004196969, + -0.000196310495899743,-0.000499774200339864,0.448977978042766,-0.555958324747504, + -0.000201998553077343,0.00014893860640619,0.464223153890484,-0.578055645298039, + -0.000207686610254498,0.000797651413153133,0.479468329738202,-0.600152965848574, + -0.000213374667432431,0.00144636421989919,0.49471350558592,-0.622250286399108, + -0.000219062724609587,0.00209507702664569,0.509958681433638,-0.644347606949643, + -0.000224750781787408,0.00274378983339219,0.525203857281357,-0.666444927500178, + -8.43049934345363e-05,-0.0122855440681731,0.157991628026262,-0.137513206647351, + -8.95502806999571e-05,-0.0116417768731061,0.172940957703181,-0.159830963359894, + -9.47955679653223e-05,-0.010998009678039,0.187890287380099,-0.182148720072438, + -0.000100040855230688,-0.0103542424829719,0.202839617057018,-0.204466476784981, + -0.000105286142495997,-0.00971047528790492,0.217788946733937,-0.226784233497524, + -0.000110531429761307,-0.00906670809283783,0.232738276410855,-0.249101990210067, + -0.000115776717026672,-0.00842294089777051,0.247687606087774,-0.27141974692261, + -0.000121022004292204,-0.00777917370270398,0.262636935764693,-0.293737503635154, + -0.00012626729155768,-0.00713540650763678,0.277586265441612,-0.316055260347697, + -0.000131512578822324,-0.00649163931256913,0.29253559511853,-0.33837301706024, + -0.0001367578660878,-0.00584787211750215,0.307484924795449,-0.360690773772783, + -0.000142003153352888,-0.00520410492243473,0.322434254472368,-0.383008530485326, + -0.000147248440618641,-0.00456033772736819,0.337383584149286,-0.405326287197869, + -0.000152493727884173,-0.00391657053230121,0.352332913826205,-0.427644043910413, + -0.00015773901514915,-0.00327280333723379,0.367282243503124,-0.449961800622956, + -0.000162984302414571,-0.00262903614216681,0.382231573180043,-0.472279557335499, + -0.000168229589679658,-0.00198526894709938,0.397180902856961,-0.494597314048042, + -0.00017347487694519,-0.0013415017520324,0.41213023253388,-0.516915070760586, + -0.000178720164210611,-0.000697734556965424,0.427079562210799,-0.539232827473128, + -0.000183965451476253,-5.39673618988878e-05,0.442028891887717,-0.561550584185672, + -0.00018921073874123,0.000589799833168758,0.456978221564636,-0.583868340898215, + -0.000194456026006318,0.00123356702823596,0.471927551241555,-0.606186097610758, + -0.000199701313271627,0.00187733422330361,0.486876880918474,-0.628503854323301, + -0.000204946600537048,0.00252110141837036,0.501826210595393,-0.650821611035845, + -0.000210191887802802,0.00316486861343668,0.516775540272311,-0.673139367748388, + -7.93491674057067e-05,-0.0116305897499808,0.156304265631554,-0.139262949186268, + -8.40577919143937e-05,-0.0109960276981653,0.170879818105791,-0.161855431057774, + -8.8766416422692e-05,-0.0103614656463494,0.185455370580027,-0.184447912929279, + -9.34750409314344e-05,-0.00972690359453376,0.200030923054264,-0.207040394800784, + -9.81836654398993e-05,-0.00909234154271821,0.214606475528501,-0.22963287667229, + -0.000102892289948364,-0.00845777949090232,0.229182028002737,-0.252225358543795, + -0.000107600914456663,-0.00782321743908621,0.243757580476974,-0.274817840415301, + -0.000112309538965294,-0.00718865538727065,0.258333132951211,-0.297410322286806, + -0.000117018163473759,-0.00655409333545487,0.272908685425448,-0.320002804158311, + -0.000121726787982279,-0.00591953128363887,0.287484237899685,-0.342595286029817, + -0.000126435412490911,-0.00528496923182353,0.302059790373921,-0.365187767901322, + -0.000131144036999542,-0.00465040718000798,0.316635342848158,-0.387780249772827, + -0.00013585266150784,-0.00401584512819197,0.331210895322394,-0.410372731644333, + -0.000140561286016583,-0.00338128307637642,0.345786447796631,-0.432965213515838, + -0.00014526991052477,-0.00274672102455997,0.360362000270868,-0.455557695387344, + -0.000149978535033402,-0.00211215897274442,0.374937552745105,-0.478150177258849, + -0.000154687159542144,-0.00147759692092908,0.389513105219341,-0.500742659130354, + -0.000159395784050553,-0.000843034869112858,0.404088657693578,-0.52333514100186, + -0.000164104408558963,-0.0002084728172973,0.418664210167815,-0.545927622873365, + -0.000168813033067816,0.000426089234518034,0.433239762642051,-0.56852010474487, + -0.000173521657576226,0.00106065128633359,0.447815315116288,-0.591112586616376, + -0.000178230282084746,0.00169521333814959,0.462390867590525,-0.613705068487881, + -0.000182938906593266,0.00232977538996559,0.476966420064761,-0.636297550359386, + -0.000187647531101343,0.00296433744178204,0.491541972538998,-0.658890032230892, + -0.000192356155610529,0.00359889949359671,0.506117525013235,-0.681482514102397, + -7.33084283427998e-05,-0.0108690271586309,0.154227234967652,-0.141367541756875, + -7.7395808252001e-05,-0.0102500226536285,0.168345754685598,-0.164290463402033, + -8.14831881611466e-05,-0.00963101814862588,0.182464274403545,-0.187213385047191, + -8.55705680705143e-05,-0.00901201364362358,0.196582794121492,-0.210136306692349, + -8.96579479794934e-05,-0.00839300913862084,0.210701313839439,-0.233059228337508, + -9.37453278886391e-05,-0.00777400463361799,0.224819833557386,-0.255982149982666, + -9.78327077979513e-05,-0.00715500012861559,0.238938353275333,-0.278905071627824, + -0.000101920087707263,-0.00653599562361329,0.253056872993279,-0.301827993272982, + -0.000106007467616687,-0.00591699111861121,0.267175392711226,-0.32475091491814, + -0.000110094847525444,-0.00529798661360847,0.281293912429172,-0.347673836563299, + -0.000114182227434312,-0.00467898210860529,0.295412432147119,-0.370596758208457, + -0.000118269607344068,-0.00405997760360322,0.309530951865066,-0.393519679853615, + -0.000122356987252714,-0.00344097309860025,0.323649471583013,-0.416442601498773, + -0.000126444367162137,-0.00282196859359796,0.33776799130096,-0.439365523143932, + -0.000130531747071783,-0.00220296408859588,0.351886511018906,-0.46228844478909, + -0.000134619126980651,-0.00158395958359314,0.366005030736853,-0.485211366434248, + -0.00013870650688963,-0.000964955078589957,0.3801235504548,-0.508134288079406, + -0.00014279388679872,-0.000345950573587661,0.394242070172747,-0.531057209724564, + -0.000146881266707699,0.000273053931415079,0.408360589890693,-0.553980131369722, + -0.000150968646617455,0.000892058436416931,0.42247910960864,-0.576903053014881, + -0.000155056026526768,0.00151106294141945,0.436597629326587,-0.599825974660039, + -0.000159143406435525,0.00213006744642241,0.450716149044534,-0.622748896305197, + -0.000163230786345059,0.00274907195142449,0.46483466876248,-0.645671817950355, + -0.000167318166253705,0.00336807645642789,0.478953188480428,-0.668594739595514, + -0.00017140554616335,0.00398708096142952,0.493071708198374,-0.691517661240672, + -6.62387076846849e-05,-0.0100268952049943,0.151768758559499,-0.143793472285164, + -6.96463069615461e-05,-0.00943192434013529,0.165350365663682,-0.167097286624643, + -7.30539062381852e-05,-0.00883695347527602,0.178931972767865,-0.190401100964121, + -7.64615055150464e-05,-0.00824198261041698,0.192513579872047,-0.2137049153036, + -7.98691047917965e-05,-0.00764701174555782,0.20609518697623,-0.237008729643079, + -8.32767040687687e-05,-0.00705204088069888,0.219676794080413,-0.260312543982558, + -8.66843033453524e-05,-0.00645707001583928,0.233258401184596,-0.283616358322036, + -9.0091902622158e-05,-0.00586209915098057,0.246840008288779,-0.306920172661515, + -9.34995018992413e-05,-0.00526712828612164,0.260421615392961,-0.330223987000994, + -9.69071011758804e-05,-0.0046721574212627,0.274003222497144,-0.353527801340473, + -0.000100314700452242,-0.00407718655640266,0.287584829601327,-0.376831615679952, + -0.000103722299729547,-0.00348221569154439,0.30116643670551,-0.400135430019431, + -0.000107129899006408,-0.00288724482668568,0.314748043809692,-0.423439244358909, + -0.000110537498283048,-0.00229227396182585,0.328329650913876,-0.446743058698388, + -0.000113945097559465,-0.00169730309696625,0.341911258018059,-0.470046873037867, + -0.000117352696836104,-0.00110233223210687,0.355492865122241,-0.493350687377346, + -0.000120760296113631,-0.000507361367248826,0.369074472226424,-0.516654501716824, + -0.000124167895390159,8.76094976105524e-05,0.382656079330607,-0.539958316056303, + -0.000127575494666909,0.000682580362469709,0.39623768643479,-0.563262130395782, + -0.000130983093942993,0.00127755122732998,0.409819293538973,-0.586565944735261, + -0.000134390693220521,0.00187252209218736,0.423400900643154,-0.60986975907474, + -0.00013779829249716,0.00246749295704696,0.436982507747338,-0.633173573414219, + -0.000141205891773799,0.00306246382190656,0.450564114851521,-0.656477387753697, + -0.000144613491050771,0.00365743468676527,0.464145721955704,-0.679781202093176, + -0.000148021090327299,0.00425240555162532,0.477727329059887,-0.703085016432655, + -5.83493734662988e-05,-0.00914679607477842,0.148990860315642,-0.146456348314583, + -6.1060915826916e-05,-0.00858576022960544,0.161970663058358,-0.17017825790191, + -6.37724581875609e-05,-0.00802472438443202,0.174950465801074,-0.193900167489237, + -6.64840005480949e-05,-0.0074636885392585,0.18793026854379,-0.217622077076563, + -6.91955429087954e-05,-0.00690265269408552,0.200910071286505,-0.24134398666389, + -7.19070852696069e-05,-0.00634161684891255,0.213889874029221,-0.265065896251217, + -7.46186276303629e-05,-0.00578058100373946,0.226869676771936,-0.288787805838544, + -7.73301699908968e-05,-0.00521954515856615,0.239849479514652,-0.312509715425871, + -8.00417123514308e-05,-0.00465850931339284,0.252829282257368,-0.336231625013198, + -8.27532547122423e-05,-0.00409747346821976,0.265809085000084,-0.359953534600524, + -8.54647970731648e-05,-0.0035364376230469,0.278788887742799,-0.383675444187851, + -8.81763394339208e-05,-0.00297540177787403,0.291768690485515,-0.407397353775178, + -9.08878817946768e-05,-0.00241436593270072,0.304748493228231,-0.431119263362505, + -9.35994241548777e-05,-0.00185333008752675,0.317728295970947,-0.454841172949832, + -9.63109665156336e-05,-0.00129229424235366,0.330708098713663,-0.478563082537159, + -9.90225088760566e-05,-0.000731258397180579,0.343687901456378,-0.502284992124486, + -0.000101734051237257,-0.000170222552007715,0.356667704199094,-0.526006901711812, + -0.000104445593597458,0.000390813293166037,0.36964750694181,-0.549728811299139, + -0.000107157135958214,0.000951849138338901,0.382627309684525,-0.573450720886466, + -0.000109868678319414,0.00151288498351176,0.395607112427241,-0.597172630473793, + -0.00011258022068017,0.00207392082868463,0.408586915169957,-0.62089454006112, + -0.000115291763040704,0.00263495667385749,0.421566717912672,-0.644616449648447, + -0.000118003305400793,0.00319599251903213,0.434546520655388,-0.668338359235773, + -0.000120714847761549,0.00375702836420455,0.447526323398104,-0.692060268823101, + -0.000123426390122194,0.0043180642093783,0.46050612614082,-0.715782178410427, + -5.00008437605282e-05,-0.0082806122605158,0.146012545416299,-0.149226898824529, + -5.20510459185441e-05,-0.00776331374063288,0.158352378488708,-0.173383809511919, + -5.41012480767544e-05,-0.00724601522075019,0.170692211561116,-0.19754072019931, + -5.61514502348537e-05,-0.00672871670086739,0.183032044633524,-0.221697630886701, + -5.82016523930085e-05,-0.0062114181809847,0.195371877705932,-0.245854541574092, + -6.02518545513853e-05,-0.005694119661102,0.207711710778341,-0.270011452261483, + -6.23020567090404e-05,-0.00517682114121887,0.220051543850749,-0.294168362948873, + -6.43522588675838e-05,-0.00465952262133662,0.232391376923157,-0.318325273636264, + -6.64024610255165e-05,-0.00414222410145371,0.244731209995565,-0.342482184323655, + -6.84526631838933e-05,-0.00362492558157146,0.257071043067973,-0.366639095011046, + -7.05028653420481e-05,-0.00310762706168832,0.269410876140382,-0.390796005698437, + -7.25530674999808e-05,-0.00259032854180563,0.28175070921279,-0.414952916385828, + -7.46032696582466e-05,-0.00207303002192294,0.294090542285198,-0.439109827073218, + -7.66534718161793e-05,-0.00155573150204003,0.306430375357606,-0.463266737760609, + -7.87036739744451e-05,-0.00103843298215733,0.318770208430015,-0.487423648448, + -8.07538761323778e-05,-0.00052113446227442,0.331110041502423,-0.511580559135391, + -8.28040782908657e-05,-3.83594239217189e-06,0.343449874574831,-0.535737469822782, + -8.48542804487984e-05,0.000513462577490742,0.355789707647239,-0.559894380510173, + -8.69044826065091e-05,0.0010307610973741,0.368129540719647,-0.584051291197563, + -8.89546847649969e-05,0.00154805961725657,0.380469373792056,-0.608208201884954, + -9.10048869232627e-05,0.00206535813713948,0.392809206864464,-0.632365112572345, + -9.30550890809734e-05,0.00258265665702284,0.405149039936873,-0.656522023259736, + -9.51052912396833e-05,0.00309995517690442,0.41748887300928,-0.680678933947127, + -9.7155493397727e-05,0.00361725369678734,0.429828706081689,-0.704835844634518, + -9.92056955558818e-05,0.00413455221666981,0.442168539154097,-0.728992755321908, + -4.1649144156386e-05,-0.00747778791928899,0.1429938539503,-0.151953420834266, + -4.31194110468991e-05,-0.00701196418013939,0.154690116754021,-0.176538419755143, + -4.45896779373012e-05,-0.00654614044099,0.166386379557741,-0.201123418676019, + -4.60599448279808e-05,-0.00608031670184073,0.178082642361462,-0.225708417596895, + -4.75302117183274e-05,-0.00561449296269123,0.189778905165182,-0.250293416517771, + -4.9000478609118e-05,-0.00514866922354185,0.201475167968903,-0.274878415438647, + -5.04707454994646e-05,-0.00468284548439235,0.213171430772624,-0.299463414359523, + -5.19410123900332e-05,-0.00421702174524308,0.224867693576344,-0.324048413280399, + -5.34112792803243e-05,-0.00375119800609336,0.236563956380065,-0.348633412201276, + -5.48815461711705e-05,-0.00328537426694431,0.248260219183785,-0.373218411122152, + -5.6351813061406e-05,-0.00281955052779437,0.259956481987506,-0.397803410043028, + -5.78220799517526e-05,-0.00235372678864443,0.271652744791227,-0.422388408963904, + -5.92923468426543e-05,-0.00188790304949538,0.283349007594947,-0.44697340788478, + -6.07626137333339e-05,-0.00142207931034699,0.295045270398667,-0.471558406805656, + -6.22328806233474e-05,-0.000956255571196385,0.306741533202388,-0.496143405726533, + -6.37031475140271e-05,-0.000490431832047111,0.318437796006109,-0.520728404647409, + -6.51734144045957e-05,-2.46080928978376e-05,0.330134058809829,-0.545313403568285, + -6.66436812952753e-05,0.000441215646250992,0.341830321613549,-0.569898402489161, + -6.81139481855109e-05,0.000907039385401376,0.353526584417271,-0.594483401410037, + -6.95842150765236e-05,0.00137286312454998,0.365222847220991,-0.619068400330913, + -7.10544819670922e-05,0.00183868686369948,0.376919110024712,-0.64365339925179, + -7.25247488566616e-05,0.00230451060284986,0.388615372828432,-0.668238398172666, + -7.39950157475633e-05,0.00277033434199936,0.400311635632153,-0.692823397093541, + -7.54652826381319e-05,0.00323615808114841,0.412007898435873,-0.717408396014418, + -7.69355495288115e-05,0.00370198182029746,0.423704161239594,-0.741993394935294, + -3.37508690498589e-05,-0.00677438140676512,0.140103258196382,-0.154493536871263, + -3.47523332031585e-05,-0.00636407390783766,0.15118765866025,-0.179477356628077, + -3.57537973568189e-05,-0.00595376640891054,0.162272059124119,-0.204461176384891, + -3.67552615102018e-05,-0.00554345890998331,0.173356459587987,-0.229444996141705, + -3.77567256637512e-05,-0.00513315141105608,0.184440860051856,-0.254428815898518, + -3.87581898171896e-05,-0.00472284391212874,0.195525260515725,-0.279412635655332, + -3.97596539704614e-05,-0.00431253641320106,0.206609660979594,-0.304396455412146, + -4.07611181241219e-05,-0.00390222891427427,0.217694061443462,-0.32938027516896, + -4.17625822773382e-05,-0.0034919214153466,0.228778461907331,-0.354364094925773, + -4.27640464311652e-05,-0.00308161391641959,0.239862862371199,-0.379347914682587, + -4.37655105844925e-05,-0.00267130641749236,0.250947262835068,-0.404331734439401, + -4.47669747383195e-05,-0.00226099891856557,0.262031663298936,-0.429315554196214, + -4.57684388915913e-05,-0.0018506914196379,0.273116063762805,-0.454299373953028, + -4.67699030453073e-05,-0.00144038392071111,0.284200464226674,-0.479283193709842, + -4.77713671985791e-05,-0.00103007642178388,0.295284864690542,-0.504267013466656, + -4.8772831352295e-05,-0.000619768922857089,0.30636926515441,-0.529250833223469, + -4.97742955052338e-05,-0.000209461423928969,0.317453665618279,-0.554234652980283, + -5.07757596593938e-05,0.000200846074997596,0.328538066082148,-0.579218472737097, + -5.17772238124437e-05,0.000611153573925272,0.339622466546017,-0.604202292493911, + -5.27786879659375e-05,0.0010214610728525,0.350706867009885,-0.629186112250724, + -5.37801521195425e-05,0.00143176857178018,0.361791267473754,-0.654169932007538, + -5.47816162728143e-05,0.00184207607070741,0.372875667937623,-0.679153751764352, + -5.57830804270854e-05,0.00225238356963331,0.383960068401491,-0.704137571521165, + -5.67845445798021e-05,0.00266269106856232,0.39504446886536,-0.729121391277979, + -5.77860087340731e-05,0.00307299856748777,0.406128869329228,-0.754105211034793, + -2.6667957315929e-05,-0.00618777214258726,0.137481549880341,-0.156742000544548, + -2.73189038292321e-05,-0.00583271698214405,0.148014448552917,-0.182078849119217, + -2.79698503422576e-05,-0.00547766182170062,0.158547347225494,-0.207415697693885, + -2.86207968553387e-05,-0.00512260666125741,0.16908024589807,-0.232752546268554, + -2.92717433685863e-05,-0.00476755150081409,0.179613144570646,-0.258089394843222, + -2.99226898816118e-05,-0.00441249634037066,0.190146043243222,-0.28342624341789, + -3.05736363946929e-05,-0.00405744117992723,0.200678941915799,-0.308763091992559, + -3.12245829076074e-05,-0.00370238601948381,0.211211840588375,-0.334099940567227, + -3.18755294210771e-05,-0.00334733085904082,0.221744739260951,-0.359436789141895, + -3.25264759336585e-05,-0.00299227569859672,0.232277637933528,-0.384773637716564, + -3.31774224470172e-05,-0.00263722053815374,0.242810536606104,-0.410110486291232, + -3.38283689602648e-05,-0.00228216537771053,0.25334343527868,-0.435447334865901, + -3.44793154735124e-05,-0.0019271102172671,0.263876333951256,-0.460784183440569, + -3.51302619864269e-05,-0.0015720550568239,0.274409232623832,-0.486121032015237, + -3.57812084994524e-05,-0.00121699989638069,0.284942131296408,-0.511457880589906, + -3.64321550127e-05,-0.000861944735937481,0.295475029968985,-0.536794729164574, + -3.70831015263917e-05,-0.000506889575494718,0.306007928641561,-0.562131577739243, + -3.77340480390842e-05,-0.0001518344150504,0.316540827314138,-0.587468426313911, + -3.83849945514436e-05,0.000203220745393473,0.327073725986714,-0.612805274888579, + -3.90359410652463e-05,0.000558275905836236,0.33760662465929,-0.638142123463248, + -3.96868875783829e-05,0.000913331066279444,0.348139523331866,-0.663478972037916, + -4.03378340910754e-05,0.00126838622672309,0.358672422004442,-0.688815820612585, + -4.09887806041009e-05,0.00162344138716675,0.369205320677019,-0.714152669187253, + -4.16397271180147e-05,0.00197849654760862,0.379738219349595,-0.739489517761921, + -4.22906736302631e-05,0.00233355170805405,0.390271118022172,-0.76482636633659, + -2.06117743312972e-05,-0.00571810715990129,0.135217681313593,-0.158643951709748, + -2.10185152314524e-05,-0.00541428565188995,0.145276817734889,-0.184279423553027, + -2.14252561317463e-05,-0.00511046414387861,0.155335954156185,-0.209914895396306, + -2.18319970321512e-05,-0.00480664263586728,0.165395090577481,-0.235550367239585, + -2.22387379325006e-05,-0.00450282112785594,0.175454226998777,-0.261185839082864, + -2.26454788325725e-05,-0.0041989996198446,0.185513363420073,-0.286821310926142, + -2.30522197330885e-05,-0.00389517811183371,0.195572499841369,-0.312456782769421, + -2.34589606333269e-05,-0.00359135660382237,0.205631636262665,-0.3380922546127, + -2.38657015336763e-05,-0.00328753509581126,0.215690772683961,-0.363727726455979, + -2.42724424338592e-05,-0.0029837135877997,0.225749909105257,-0.389363198299257, + -2.4679183333931e-05,-0.00267989207978769,0.235809045526554,-0.414998670142536, + -2.5085924234336e-05,-0.0023760705717768,0.24586818194785,-0.440634141985815, + -2.54926651341858e-05,-0.0020722490637648,0.255927318369146,-0.466269613829093, + -2.58994060349238e-05,-0.00176842755575413,0.265986454790442,-0.491905085672372, + -2.63061469346626e-05,-0.00146460604774235,0.276045591211738,-0.517540557515651, + -2.67128878348455e-05,-0.00116078453973079,0.286104727633034,-0.54317602935893, + -2.71196287353614e-05,-0.000856963031720337,0.29616386405433,-0.568811501202208, + -2.75263696358774e-05,-0.000553141523708556,0.306223000475627,-0.594446973045487, + -2.79331105359493e-05,-0.000249320015697219,0.316282136896922,-0.620082444888766, + -2.83398514364652e-05,5.45014923138964e-05,0.326341273318218,-0.645717916732044, + -2.87465923365371e-05,0.000358323000325456,0.336400409739515,-0.671353388575323, + -2.9153333236831e-05,0.000662144508337015,0.346459546160811,-0.696988860418602, + -2.95600741369029e-05,0.00096596601634813,0.356518682582107,-0.722624332261881, + -2.99668150374188e-05,0.00126978752435924,0.366577819003403,-0.748259804105159, + -3.03735559383789e-05,0.00157360903236947,0.376636955424698,-0.773895275948438, + -1.56401730516953e-05,-0.00535386897811518,0.133343846221497,-0.16019196666412, + -1.5886728459702e-05,-0.00509479837193472,0.14301247643955,-0.18607049063933, + -1.61332838677364e-05,-0.00483572776575414,0.152681106657604,-0.211949014614541, + -1.63798392761039e-05,-0.00457665715957412,0.162349736875657,-0.237827538589751, + -1.66263946840273e-05,-0.00431758655339332,0.172018367093711,-0.263706062564962, + -1.68729500921727e-05,-0.00405851594721307,0.181686997311764,-0.289584586540172, + -1.71195055003182e-05,-0.00379944534103283,0.191355627529818,-0.315463110515383, + -1.73660609084636e-05,-0.00354037473485214,0.201024257747871,-0.341341634490593, + -1.7612616316609e-05,-0.00328130412867189,0.210692887965925,-0.367220158465803, + -1.7859171724699e-05,-0.0030222335224912,0.220361518183979,-0.393098682441014, + -1.81057271327889e-05,-0.00276316291631096,0.230030148402032,-0.418977206416224, + -1.83522825406568e-05,-0.00250409231013027,0.239698778620085,-0.444855730391435, + -1.85988379493018e-05,-0.00224502170395069,0.249367408838139,-0.470734254366645, + -1.88453933576138e-05,-0.00198595109777044,0.259036039056192,-0.496612778341856, + -1.90919487651486e-05,-0.00172688049158976,0.268704669274245,-0.522491302317066, + -1.93385041739047e-05,-0.00146780988540973,0.278373299492299,-0.548369826292277, + -1.95850595816616e-05,-0.0012087392792286,0.288041929710353,-0.574248350267487, + -1.98316149898625e-05,-0.000949668673048576,0.297710559928406,-0.600126874242698, + -2.00781703979525e-05,-0.000690598066868109,0.30737919014646,-0.626005398217908, + -2.03247258061534e-05,-0.000431527460687864,0.317047820364513,-0.651883922193118, + -2.05712812143544e-05,-0.000172456854507619,0.326716450582567,-0.677762446168329, + -2.08178366216671e-05,8.66137516739585e-05,0.33638508080062,-0.703640970143539, + -2.10643920308673e-05,0.000345684357853315,0.346053711018674,-0.72951949411875, + -2.13109474387352e-05,0.000604754964034004,0.355722341236727,-0.75539801809396, + -2.1557502846381e-05,0.000863825570214694,0.365390971454781,-0.781276542069171, + -1.16930969399354e-05,-0.00507804538306245,0.131846195381745,-0.161412865062537, + -1.18395365694135e-05,-0.00485620558137778,0.141203732622371,-0.187483080957628, + -1.19859761988916e-05,-0.00463436577969289,0.150561269862996,-0.213553296852719, + -1.21324158283698e-05,-0.00441252597800801,0.159918807103622,-0.239623512747811, + -1.22788554581255e-05,-0.00419068617632368,0.169276344344247,-0.265693728642902, + -1.24252950874371e-05,-0.00396884637463835,0.178633881584873,-0.291763944537993, + -1.25717347168597e-05,-0.00374700657295346,0.187991418825499,-0.317834160433084, + -1.27181743465044e-05,-0.00352516677126924,0.197348956066124,-0.343904376328175, + -1.28646139760935e-05,-0.00330332696958435,0.206706493306749,-0.369974592223267, + -1.30110536054051e-05,-0.00308148716789947,0.216064030547375,-0.396044808118358, + -1.31574932349388e-05,-0.0028596473662148,0.225421567788,-0.422115024013449, + -1.33039328644724e-05,-0.00263780756452947,0.234779105028626,-0.44818523990854, + -1.3450372494006e-05,-0.00241596776284525,0.244136642269251,-0.474255455803631, + -1.35968121236507e-05,-0.00219412796116059,0.253494179509877,-0.500325671698722, + -1.37432517531844e-05,-0.00197228815947548,0.262851716750503,-0.526395887593814, + -1.3889691382829e-05,-0.00175044835779126,0.272209253991128,-0.552466103488905, + -1.40361310118076e-05,-0.00152860855610526,0.281566791231754,-0.578536319383996, + -1.41825706413412e-05,-0.00130676875442082,0.290924328472379,-0.604606535279087, + -1.43290102712079e-05,-0.0010849289527366,0.300281865713005,-0.630676751174178, + -1.44754499006305e-05,-0.00086308915105171,0.30963940295363,-0.656746967069269, + -1.46218895299421e-05,-0.00064124934936638,0.318996940194256,-0.68281718296436, + -1.47683291598089e-05,-0.000419409547681937,0.328354477434881,-0.708887398859452, + -1.49147687897866e-05,-0.000197569745997939,0.337712014675507,-0.734957614754543, + -1.50612084185431e-05,2.42700556878361e-05,0.347069551916133,-0.761027830649634, + -1.52076480481877e-05,0.000246109857371835,0.356427089156758,-0.787098046544725, + -8.64146219878292e-06,-0.00487274493939027,0.13068220539379,-0.162352081725297, + -8.72754007852361e-06,-0.00468071059261466,0.139798559965167,-0.188569762999573, + -8.81361795840307e-06,-0.00448867624583893,0.148914914536545,-0.214787444273849, + -8.89969583817152e-06,-0.00429664189906354,0.158031269107922,-0.241005125548125, + -8.98577371788445e-06,-0.00410460755228781,0.1671476236793,-0.2672228068224, + -9.0718515977084e-06,-0.0039125732055123,0.176263978250677,-0.293440488096676, + -9.15792947747684e-06,-0.00372053885873669,0.185380332822054,-0.319658169370952, + -9.24400735718978e-06,-0.00352850451196107,0.194496687393432,-0.345875850645227, + -9.33008523701373e-06,-0.00333647016518546,0.203613041964809,-0.372093531919503, + -9.41616311667115e-06,-0.00314443581840984,0.212729396536187,-0.398311213193779, + -9.50224099660613e-06,-0.00295240147163445,0.221845751107564,-0.424528894468055, + -9.58831887598599e-06,-0.00276036712485839,0.230962105678942,-0.45074657574233, + -9.67439675603199e-06,-0.00256833277808322,0.240078460250319,-0.476964257016606, + -9.76047463574492e-06,-0.00237629843130738,0.249194814821697,-0.503181938290882, + -9.84655251534683e-06,-0.00218426408453176,0.258311169393074,-0.529399619565157, + -9.93263039517078e-06,-0.00199222973775615,0.267427523964451,-0.555617300839433, + -1.00187082752168e-05,-0.00180019539098142,0.276543878535828,-0.581834982113709, + -1.01047861549297e-05,-0.00160816104420536,0.285660233107206,-0.608052663387985, + -1.01908640346426e-05,-0.00141612669742974,0.294776587678584,-0.63427034466226, + -1.02769419145776e-05,-0.00122409235065435,0.303892942249961,-0.660488025936536, + -1.03630197941795e-05,-0.00103205800387896,0.313009296821338,-0.686705707210812, + -1.04490976741145e-05,-0.000840023657103561,0.322125651392715,-0.712923388485088, + -1.05351755533833e-05,-0.000647989310326835,0.331242005964093,-0.739141069759363, + -1.06212534334293e-05,-0.000455954963551886,0.340358360535471,-0.765358751033639, + -1.07073313136974e-05,-0.000263920616776936,0.349474715106848,-0.791576432307915, + -6.33000884706081e-06,-0.00472178870364792,0.12979697585986,-0.163060852918376, + -6.38055721335906e-06,-0.00455291819349901,0.138730250963072,-0.189389817581125, + -6.43110558001814e-06,-0.00438404768335054,0.147663526066284,-0.215718782243874, + -6.48165394667721e-06,-0.00421517717320241,0.156596801169495,-0.242047746906623, + -6.53220231316975e-06,-0.00404630666305394,0.165530076272707,-0.268376711569372, + -6.58275067955127e-06,-0.00387743615290526,0.174463351375918,-0.294705676232121, + -6.63329904609933e-06,-0.00370856564275646,0.18339662647913,-0.32103464089487, + -6.68384741286943e-06,-0.00353969513260854,0.192329901582342,-0.347363605557619, + -6.73439577908441e-06,-0.00337082462245952,0.201263176685553,-0.373692570220368, + -6.78494414596553e-06,-0.00320195411231161,0.210196451788765,-0.400021534883117, + -6.83549251234705e-06,-0.00303308360216259,0.219129726891977,-0.426350499545865, + -6.88604087883959e-06,-0.00286421309201446,0.228063001995188,-0.452679464208614, + -6.93658924511009e-06,-0.00269534258186543,0.2369962770984,-0.479008428871363, + -6.98713761171366e-06,-0.00252647207171686,0.245929552201611,-0.505337393534112, + -7.03768597798415e-06,-0.00235760156156806,0.254862827304823,-0.531666358196861, + -7.08823434503181e-06,-0.00218873105142081,0.263796102408034,-0.55799532285961, + -7.13878271152435e-06,-0.00201986054127157,0.272729377511246,-0.584324287522359, + -7.18933107768382e-06,-0.00185099003112277,0.281662652614458,-0.610653252185108, + -7.23987944450943e-06,-0.00168211952097463,0.290595927717669,-0.636982216847857, + -7.290427811113e-06,-0.00151324901082672,0.29952920282088,-0.663311181510606, + -7.34097617716145e-06,-0.00134437850067659,0.308462477924093,-0.689640146173355, + -7.39152454387604e-06,-0.00117550799052868,0.317395753027304,-0.715969110836104, + -7.44207291070165e-06,-0.00100663748038077,0.326329028130516,-0.742298075498853, + -7.49262127719419e-06,-0.000837766970232412,0.335262303233727,-0.768627040161602, + -7.54316964357571e-06,-0.000668896460084056,0.344195578336938,-0.794956004824351, + -4.60617266223595e-06,-0.00461173345207377,0.129134773440109,-0.16358800181086, + -4.6360770110665e-06,-0.00446046600189209,0.1379312845014,-0.189999733543656, + -4.6659813601746e-06,-0.00430919855171075,0.146727795562692,-0.216411465276453, + -4.69588570917168e-06,-0.00415793110152907,0.155524306623983,-0.24282319700925, + -4.72579005805773e-06,-0.00400666365134761,0.164320817685275,-0.269234928742047, + -4.75569440705481e-06,-0.00385539620116604,0.173117328746566,-0.295646660474844, + -4.78559875621842e-06,-0.00370412875098491,0.181913839807858,-0.32205839220764, + -4.81550310504897e-06,-0.0035528613008029,0.190710350869149,-0.348470123940437, + -4.84540745371298e-06,-0.00340159385062111,0.199506861930441,-0.374881855673234, + -4.87531180287659e-06,-0.00325032640043998,0.208303372991732,-0.401293587406031, + -4.90521615181816e-06,-0.00309905895025842,0.217099884053024,-0.427705319138827, + -4.93512050103728e-06,-0.00294779150007685,0.225896395114315,-0.454117050871624, + -4.96502484970129e-06,-0.00279652404989505,0.234692906175607,-0.480528782604421, + -4.99492919903144e-06,-0.00264525659971415,0.243489417236898,-0.506940514337218, + -5.02483354802852e-06,-0.0024939891495328,0.25228592829819,-0.533352246070015, + -5.05473789735866e-06,-0.00234272169935168,0.261082439359481,-0.559763977802811, + -5.08464224591165e-06,-0.00219145424916989,0.269878950420772,-0.586175709535608, + -5.11454659557486e-06,-0.00204018679898921,0.278675461482064,-0.612587441268405, + -5.14445094412785e-06,-0.00188891934880653,0.287471972543356,-0.638999173001202, + -5.17435529268084e-06,-0.00173765189862474,0.296268483604647,-0.665410904733998, + -5.20425964178894e-06,-0.00158638444844339,0.305064994665939,-0.691822636466795, + -5.23416399056398e-06,-0.0014351169982616,0.31386150572723,-0.718234368199592, + -5.26406834000515e-06,-0.00128384954808025,0.322658016788522,-0.744646099932389, + -5.29397268922427e-06,-0.00113258209789935,0.331454527849813,-0.771057831665186, + -5.32387703788828e-06,-0.000981314647717557,0.340251038911105,-0.797469563397983, + -3.33536137761548e-06,-0.00453197127607574,0.128645489278008,-0.163975845292442, + -3.35330629214203e-06,-0.00439385947448934,0.137341051779052,-0.190448471905349, + -3.3712512069739e-06,-0.00425574767290315,0.146036614280096,-0.216921098518255, + -3.38919612141719e-06,-0.00411763587131653,0.15473217678114,-0.243393725131162, + -3.40714103619355e-06,-0.00397952406973046,0.163427739282184,-0.269866351744068, + -3.42508595096991e-06,-0.0038414122681445,0.172123301783228,-0.296338978356975, + -3.44303086557973e-06,-0.00370330046655787,0.180818864284272,-0.322811604969881, + -3.46097577996751e-06,-0.00356518866497146,0.189514426785315,-0.349284231582788, + -3.47892069452183e-06,-0.00342707686338506,0.198209989286359,-0.375756858195695, + -3.49686560979778e-06,-0.00328896506179954,0.206905551787403,-0.402229484808601, + -3.51481052418556e-06,-0.00315085326021314,0.215601114288447,-0.428702111421508, + -3.53275543873988e-06,-0.00301274145862673,0.224296676789491,-0.455174738034414, + -3.55070035351623e-06,-0.00287462965704055,0.232992239290534,-0.481647364647321, + -3.5686452678485e-06,-0.0027365178554537,0.241687801791578,-0.508119991260227, + -3.58659018273588e-06,-0.00259840605386774,0.250383364292622,-0.534592617873134, + -3.60453509751224e-06,-0.00246029425228222,0.259078926793666,-0.56106524448604, + -3.6224800122886e-06,-0.00232218245069538,0.26777448929471,-0.587537871098947, + -3.64042492673189e-06,-0.00218407064910897,0.276470051795754,-0.614010497711853, + -3.65836984095314e-06,-0.00204595884752257,0.285165614296797,-0.64048312432476, + -3.67631475572949e-06,-0.00190784704593616,0.293861176797841,-0.666955750937666, + -3.69425967094994e-06,-0.00176973524435065,0.302556739298885,-0.693428377550573, + -3.71220458550425e-06,-0.00163162344276424,0.311252301799929,-0.71990100416348, + -3.73014950005857e-06,-0.00149351164117739,0.319947864300973,-0.746373630776386, + -3.74809441494595e-06,-0.00135539983959188,0.328643426802016,-0.772846257389292, + -3.76603932938924e-06,-0.00121728803800547,0.33733898930306,-0.799318884002199, + -2.40647533106264e-06,-0.00447440157313828,0.128287254317087,-0.164258928304319, + -2.41745189122344e-06,-0.0043460014150305,0.136908960986774,-0.190776001470766, + -2.42842845105118e-06,-0.00421760125692239,0.14553066765646,-0.217293074637212, + -2.43940501060136e-06,-0.00408920109881394,0.154152374326147,-0.243810147803659, + -2.45038157059563e-06,-0.00396080094070594,0.162774080995833,-0.270327220970106, + -2.46135813081194e-06,-0.00383240078259828,0.171395787665519,-0.296844294136552, + -2.47233469019559e-06,-0.00370400062448972,0.180017494335206,-0.323361367302999, + -2.48331125013435e-06,-0.00357560046638183,0.188639201004892,-0.349878440469445, + -2.49428781012861e-06,-0.00344720030827372,0.197260907674579,-0.376395513635892, + -2.50526437001186e-06,-0.00331880015016583,0.205882614344265,-0.402912586802339, + -2.51624092972857e-06,-0.0031903999920575,0.214504321013952,-0.429429659968785, + -2.5272174895008e-06,-0.00306199983394961,0.223126027683638,-0.455946733135232, + -2.53819404938405e-06,-0.00293359967584106,0.231747734353325,-0.482463806301679, + -2.54917060948934e-06,-0.00280519951773339,0.240369441023011,-0.508980879468125, + -2.56014716915054e-06,-0.00267679935962506,0.248991147692698,-0.535497952634572, + -2.57112372914481e-06,-0.00254839920151695,0.257612854362384,-0.562015025801018, + -2.58210028902806e-06,-0.00241999904340928,0.26623456103207,-0.588532098967465, + -2.59307684924437e-06,-0.00229159888530139,0.274856267701757,-0.615049172133912, + -2.60405340890557e-06,-0.00216319872719284,0.283477974371444,-0.641566245300358, + -2.61502996845575e-06,-0.00203479856908428,0.29209968104113,-0.668083318466805, + -2.62600652878309e-06,-0.00190639841097662,0.300721387710817,-0.694600391633251, + -2.63698308833327e-06,-0.00177799825286895,0.309343094380502,-0.721117464799698, + -2.64795964821651e-06,-0.00164959809476084,0.317964801050189,-0.747634537966145, + -2.65893620798874e-06,-0.00152119793665273,0.326586507719875,-0.774151611132592, + -2.66991276809403e-06,-0.00139279777854417,0.335208214389562,-0.800668684299038, + -1.73173381648462e-06,-0.00443296884346656,0.128026715296367,-0.164464346390841, + -1.7385968573147e-06,-0.00431167376626507,0.136594736571357,-0.19101367202599, + -1.74545989839459e-06,-0.0041903786890638,0.145162757846347,-0.217562997661139, + -1.75232293919692e-06,-0.00406908361186265,0.153730779121336,-0.244112323296288, + -1.75918597999924e-06,-0.00394778853466127,0.162298800396326,-0.270661648931437, + -1.76604902096811e-06,-0.00382649345746011,0.170866821671316,-0.297210974566586, + -1.77291206215902e-06,-0.00370519838025896,0.179434842946306,-0.323760300201735, + -1.7797751027393e-06,-0.00358390330305736,0.188002864221296,-0.350309625836884, + -1.78663814376367e-06,-0.0034626082258562,0.196570885496286,-0.376858951472033, + -1.79350118501009e-06,-0.00334131314865527,0.205138906771276,-0.403408277107182, + -1.80036422559038e-06,-0.00322001807145345,0.213706928046266,-0.429957602742331, + -1.80722726617066e-06,-0.00309872299425185,0.222274949321256,-0.456506928377479, + -1.81409030741708e-06,-0.00297742791705091,0.230842970596246,-0.483056254012628, + -1.82095334844146e-06,-0.00285613283984976,0.239410991871236,-0.509605579647777, + -1.82781638924379e-06,-0.00273483776264882,0.247979013146225,-0.536154905282926, + -1.83467943026816e-06,-0.00261354268544767,0.256547034421215,-0.562704230918075, + -1.84154247073742e-06,-0.00249224760824562,0.265115055696205,-0.589253556553224, + -1.8484055117618e-06,-0.00237095253104425,0.273683076971196,-0.615802882188373, + -1.85526855300822e-06,-0.00224965745384376,0.282251098246185,-0.642352207823522, + -1.86213159347748e-06,-0.00212836237664105,0.290819119521176,-0.668901533458671, + -1.86899463494594e-06,-0.002007067299441,0.299387140796165,-0.69545085909382, + -1.8758576754152e-06,-0.00188577222223918,0.307955162071155,-0.722000184728969, + -1.88272071677265e-06,-0.00176447714503825,0.316523183346145,-0.748549510364117, + -1.88958375779702e-06,-0.00164318206783776,0.325091204621134,-0.775098835999267, + -1.89644679871037e-06,-0.00152188699063638,0.333659225896124,-0.801648161634415, + -1.24381567481735e-06,-0.00440320973356756,0.127838147741034,-0.164612777327467, + -1.24820488994759e-06,-0.00428707894052194,0.136367328783441,-0.19118540794135, + -1.25259410488354e-06,-0.00417094814747587,0.144896509825848,-0.217758038555233, + -1.25698331998603e-06,-0.00405481735443025,0.153425690868254,-0.244330669169116, + -1.26137253486647e-06,-0.00393868656138407,0.161954871910661,-0.270903299782999, + -1.26576175007997e-06,-0.00382255576833823,0.170484052953068,-0.297475930396882, + -1.27015096473837e-06,-0.00370642497529206,0.179013233995475,-0.324048561010765, + -1.2745401800629e-06,-0.00359029418224655,0.187542415037882,-0.350621191624647, + -1.27892939499885e-06,-0.00347416338920081,0.196071596080288,-0.37719382223853, + -1.28331861010134e-06,-0.00335803259615486,0.204600777122695,-0.403766452852413, + -1.28770782503729e-06,-0.0032419018031089,0.213129958165102,-0.430339083466296, + -1.29209704036182e-06,-0.00312577101006362,0.221659139207508,-0.456911714080179, + -1.29648625513124e-06,-0.00300964021701722,0.230188320249916,-0.483484344694062, + -1.30087547001168e-06,-0.00289350942397104,0.238717501292323,-0.510056975307944, + -1.30526468522518e-06,-0.00277737863092575,0.247246682334729,-0.536629605921828, + -1.30965389977256e-06,-0.00266124783787891,0.255775863377136,-0.56320223653571, + -1.31404311498606e-06,-0.0025451170448334,0.264305044419543,-0.589774867149593, + -1.31843233008855e-06,-0.00242898625178789,0.27283422546195,-0.616347497763476, + -1.32282154530206e-06,-0.00231285545874149,0.281363406504357,-0.642920128377359, + -1.32721076029352e-06,-0.00219672466569554,0.289892587546764,-0.669492758991242, + -1.33159997572907e-06,-0.00208059387265047,0.29842176858917,-0.696065389605125, + -1.33598918983235e-06,-0.00196446307960363,0.306950949631577,-0.722638020219008, + -1.34037840537893e-06,-0.00184833228655856,0.315480130673984,-0.749210650832891, + -1.34476762025937e-06,-0.00173220149351216,0.324009311716391,-0.775783281446774, + -1.34915683547288e-06,-0.0016160707004671,0.332538492758797,-0.802355912060657, + -0.000109105830328471,-0.01594016039724,0.173284557167582,-0.137133789376549, + -0.000116700637134093,-0.0153082751560351,0.189553833512804,-0.157869207663768, + -0.000124295443939881,-0.0146763899148304,0.205823109858027,-0.178604625950987, + -0.000131890250745614,-0.0140445046736256,0.222092386203249,-0.199340044238205, + -0.000139485057550959,-0.0134126194324204,0.238361662548472,-0.220075462525424, + -0.000147079864356747,-0.0127807341912156,0.254630938893694,-0.240810880812643, + -0.000154674671162314,-0.0121488489500108,0.270900215238916,-0.261546299099862, + -0.000162269477968269,-0.0115169637088064,0.287169491584139,-0.282281717387081, + -0.000169864284774002,-0.0108850784676011,0.303438767929361,-0.3030171356743, + -0.000177459091579402,-0.0102531932263963,0.319708044274584,-0.323752553961518, + -0.000185053898385412,-0.0096213079851919,0.335977320619806,-0.344487972248737, + -0.00019264870519109,-0.00898942274398706,0.352246596965028,-0.365223390535956, + -0.000200243511996878,-0.00835753750278223,0.368515873310251,-0.385958808823175, + -0.000207838318802556,-0.0077256522615774,0.384785149655473,-0.406694227110394, + -0.000215433125608011,-0.00709376702037212,0.401054426000696,-0.427429645397613, + -0.000223027932413689,-0.00646188177916751,0.417323702345918,-0.448165063684831, + -0.000230622739219033,-0.00582999653796201,0.433592978691141,-0.46890048197205, + -0.000238217546024933,-0.0051981112967574,0.449862255036363,-0.489635900259269, + -0.00024581235283061,-0.00456622605555301,0.466131531381585,-0.510371318546488, + -0.000253407159636398,-0.0039343408143484,0.482400807726808,-0.531106736833707, + -0.000261001966441965,-0.00330245557314335,0.49867008407203,-0.551842155120926, + -0.000268596773247864,-0.00267057033193874,0.514939360417253,-0.572577573408145, + -0.000276191580052987,-0.00203868509073324,0.531208636762475,-0.593312991695363, + -0.000283786386859997,-0.00140679984952996,0.547477913107697,-0.614048409982582, + -0.000291381193664564,-0.00077491460832313,0.56374718945292,-0.634783828269801, + -0.000107986145649386,-0.0157563919054167,0.172910847280786,-0.137563969118022, + -0.00011544434687738,-0.015122889278699,0.189100722839485,-0.158362325876307, + -0.00012290254810543,-0.0144893866519814,0.205290598398184,-0.179160682634591, + -0.000130360749333591,-0.0138558840252641,0.221480473956883,-0.199959039392875, + -0.000137818950561586,-0.0132223813985465,0.237670349515582,-0.220757396151159, + -0.00014527715178958,-0.0125888787718289,0.253860225074281,-0.241555752909443, + -0.000152735353017519,-0.0119553761451112,0.27005010063298,-0.262354109667727, + -0.000160193554245958,-0.0113218735183942,0.286239976191679,-0.283152466426011, + -0.000167651755474063,-0.0106883708916767,0.302429851750378,-0.303950823184295, + -0.000175109956702058,-0.0100548682649593,0.318619727309077,-0.324749179942579, + -0.000182568157930163,-0.00942136563824159,0.334809602867776,-0.345547536700863, + -0.000190026359157991,-0.00878786301152368,0.350999478426475,-0.366345893459147, + -0.000197484560386041,-0.00815436038480599,0.367189353985174,-0.387144250217431, + -0.000204942761614424,-0.00752085775808897,0.383379229543872,-0.407942606975715, + -0.000212400962842474,-0.00688735513137151,0.399569105102571,-0.428740963733999, + -0.000219859164070302,-0.00625385250465382,0.41575898066127,-0.449539320492283, + -0.000227317365298796,-0.0056203498779368,0.431948856219969,-0.470337677250567, + -0.000234775566526846,-0.00498684725121934,0.448138731778668,-0.491136034008851, + -0.000242233767754785,-0.00435334462450143,0.464328607337367,-0.511934390767135, + -0.000249691968982613,-0.0037198419977833,0.480518482896066,-0.532732747525419, + -0.000257150170210663,-0.00308633937106562,0.496708358454766,-0.553531104283703, + -0.000264608371438824,-0.00245283674434882,0.512898234013464,-0.574329461041987, + -0.000272066572667096,-0.00181933411763158,0.529088109572162,-0.595127817800271, + -0.000279524773895368,-0.00118583149091389,0.545277985130862,-0.615926174558556, + -0.000286982975122863,-0.000552328864196205,0.561467860689561,-0.636724531316839, + -0.000106456655496245,-0.0155080632490269,0.17239894562501,-0.138149426872396, + -0.000113729904062443,-0.0148726439950433,0.188480277429105,-0.159033440421043, + -0.000121003152628307,-0.0142372247410596,0.2045616092332,-0.179917453969689, + -0.000128276401194283,-0.0136018054870759,0.220642941037294,-0.200801467518335, + -0.000135549649760425,-0.0129663862330924,0.236724272841389,-0.221685481066982, + -0.000142822898326567,-0.0123309669791092,0.252805604645483,-0.242569494615628, + -0.00015009614689232,-0.011695547725125,0.268886936449578,-0.263453508164275, + -0.000157369395458518,-0.0110601284711418,0.284968268253673,-0.284337521712921, + -0.000164642644024382,-0.0104247092171579,0.301049600057767,-0.305221535261567, + -0.000171915892590357,-0.00978928996317419,0.317130931861862,-0.326105548810214, + -0.000179189141156444,-0.00915387070919071,0.333212263665957,-0.34698956235886, + -0.00018646238972253,-0.00851845145520724,0.349293595470051,-0.367873575907507, + -0.000193735638288284,-0.00788303220122333,0.365374927274146,-0.388757589456153, + -0.000201008886854592,-0.00724761294723986,0.381456259078241,-0.409641603004799, + -0.000208282135420568,-0.00661219369325639,0.397537590882335,-0.430525616553446, + -0.000215555383986432,-0.00597677443927247,0.41361892268643,-0.451409630102092, + -0.000222828632552297,-0.00534135518528855,0.429700254490525,-0.472293643650739, + -0.000230101881118827,-0.00470593593130575,0.445781586294619,-0.493177657199385, + -0.000237375129684358,-0.00407051667732161,0.461862918098714,-0.514061670748031, + -0.000244648378250667,-0.00343509742333836,0.477944249902808,-0.534945684296678, + -0.000251921626816864,-0.00279967816935489,0.494025581706903,-0.555829697845324, + -0.000259194875382618,-0.00216425891537098,0.510106913510998,-0.576713711393971, + -0.000266468123948482,-0.00152883966138706,0.526188245315092,-0.597597724942617, + -0.000273741372515235,-0.000893420407404921,0.542269577119186,-0.618481738491264, + -0.000281014621080322,-0.000258001153419674,0.558350908923282,-0.63936575203991, + -0.000104386300676274,-0.0151768206276401,0.171703447155883,-0.138937991401145, + -0.000111412241128483,-0.0145393389677697,0.187637700220449,-0.159937377760249, + -0.000118438181580471,-0.0139018573078993,0.203571953285014,-0.180936764119353, + -0.000125464122032959,-0.0132643756480294,0.21950620634958,-0.201936150478457, + -0.000132490062485169,-0.0126268939881592,0.235440459414145,-0.222935536837561, + -0.000139516002937545,-0.0119894123282891,0.25137471247871,-0.243934923196665, + -0.000146541943389478,-0.0113519306684184,0.267308965543276,-0.264934309555769, + -0.000153567883841965,-0.0107144490085487,0.283243218607841,-0.285933695914873, + -0.000160593824293953,-0.010076967348678,0.299177471672407,-0.306933082273977, + -0.000167619764746607,-0.00943948568880848,0.315111724736972,-0.327932468633081, + -0.00017464570519854,-0.00880200402893783,0.331045977801538,-0.348931854992185, + -0.00018167164565086,-0.0081645223690674,0.346980230866104,-0.369931241351289, + -0.000188697586103181,-0.00752704070919763,0.362914483930669,-0.390930627710393, + -0.00019572352655528,-0.0068895590493272,0.378848736995234,-0.411930014069497, + -0.000202749467007712,-0.00625207738945743,0.3947829900598,-0.432929400428601, + -0.000209775407460033,-0.005614595729587,0.410717243124366,-0.453928786787705, + -0.00021680134791191,-0.00497711406971635,0.426651496188931,-0.474928173146809, + -0.000223827288364231,-0.00433963240984636,0.442585749253496,-0.495927559505913, + -0.000230853228816774,-0.00370215074997637,0.458520002318062,-0.516926945865017, + -0.00023787916926854,-0.00306466909010572,0.474454255382627,-0.537926332224121, + -0.000244905109720861,-0.00242718743023529,0.490388508447193,-0.558925718583225, + -0.000251931050173404,-0.00178970577036575,0.506322761511758,-0.579925104942329, + -0.000258956990625614,-0.00115222411049531,0.522257014576324,-0.600924491301433, + -0.000265982931078046,-0.000514742450625771,0.538191267640889,-0.621923877660537, + -0.000273008871529479,0.000122739209245992,0.554125520705455,-0.642923264019641, + -0.000101618181613972,-0.0147425973284282,0.170768974501748,-0.139985417343589, + -0.000108318973942922,-0.0141032990303317,0.186506307265792,-0.161138049848469, + -0.000115019766271818,-0.013464000732235,0.202243640029836,-0.182290682353348, + -0.000121720558600491,-0.0128247024341381,0.217980972793881,-0.203443314858227, + -0.000128421350929386,-0.0121854041360413,0.233718305557925,-0.224595947363106, + -0.000135122143258115,-0.0115461058379448,0.249455638321969,-0.245748579867986, + -0.000141822935586899,-0.0109068075398477,0.265192971086014,-0.266901212372865, + -0.000148523727915739,-0.010267509241751,0.280930303850058,-0.288053844877744, + -0.000155224520244635,-0.00962821094365451,0.296667636614102,-0.309206477382624, + -0.00016192531257353,-0.00898891264555779,0.312404969378146,-0.330359109887503, + -0.000168626104902536,-0.00834961434746107,0.328142302142191,-0.351511742392382, + -0.00017532689723132,-0.00771031604936456,0.343879634906235,-0.372664374897262, + -0.000182027689559994,-0.00707101775126762,0.359616967670279,-0.393817007402141, + -0.000188728481888889,-0.00643171945317045,0.375354300434324,-0.41496963990702, + -0.000195429274217673,-0.00579242115507395,0.391091633198368,-0.436122272411899, + -0.000202130066547013,-0.00515312285697811,0.406828965962411,-0.457274904916779, + -0.000208830858875686,-0.00451382455888139,0.422566298726456,-0.478427537421658, + -0.000215531651204248,-0.00387452626078399,0.4383036314905,-0.499580169926537, + -0.000222232443533144,-0.00323522796268749,0.454040964254544,-0.520732802431416, + -0.000228933235861817,-0.00259592966459055,0.469778297018588,-0.541885434936296, + -0.000235634028191267,-0.00195663136649493,0.485515629782632,-0.563038067441175, + -0.000242334820519607,-0.0013173330683971,0.501252962546677,-0.584190699946054, + -0.00024903561284928,-0.000678034770301039,0.516990295310721,-0.605343332450933, + -0.000255736405177176,-3.87364722032046e-05,0.532727628074766,-0.626495964955813, + -0.000262437197506737,0.000600561825892854,0.54846496083881,-0.647648597460692, + -9.79777821442096e-05,-0.0141862851340914,0.169532192762625,-0.141351208302306, + -0.00010426064261726,-0.0135462027558207,0.185010077374992,-0.162703666104494, + -0.000110543503090199,-0.0129061203775498,0.200487961987359,-0.184056123906683, + -0.000116826363563138,-0.0122660379992791,0.215965846599726,-0.205408581708871, + -0.000123109224036189,-0.0116259556210084,0.231443731212093,-0.226761039511059, + -0.00012939208450935,-0.0109858732427379,0.24692161582446,-0.248113497313248, + -0.000135674944982123,-0.0103457908644669,0.262399500436827,-0.269465955115436, + -0.000141957805455062,-0.00970570848619601,0.277877385049195,-0.290818412917624, + -0.000148240665928057,-0.00906562610792538,0.293355269661561,-0.312170870719813, + -0.000154523526401051,-0.00842554372965476,0.308833154273928,-0.333523328522001, + -0.000160806386874102,-0.00778546135138392,0.324311038886295,-0.354875786324189, + -0.000167089247347096,-0.00714537897311307,0.339788923498663,-0.376228244126378, + -0.000173372107820091,-0.00650529659484267,0.355266808111029,-0.397580701928566, + -0.000179654968292975,-0.00586521421657138,0.370744692723397,-0.418933159730754, + -0.00018593782876597,-0.00522513183830053,0.386222577335764,-0.440285617532943, + -0.000192220689238742,-0.00458504946002991,0.401700461948131,-0.461638075335131, + -0.000198503549711626,-0.00394496708175884,0.417178346560498,-0.48299053313732, + -0.000204786410184954,-0.00330488470348889,0.432656231172864,-0.504342990939508, + -0.000211069270657838,-0.00266480232521782,0.448134115785232,-0.525695448741696, + -0.000217352131130943,-0.00202471994694742,0.463612000397598,-0.547047906543884, + -0.000223634991603716,-0.00138463756867635,0.479089885009966,-0.568400364346073, + -0.0002299178520766,-0.000744555190405727,0.494567769622332,-0.589752822148261, + -0.000236200712549262,-0.000104472812134215,0.5100456542347,-0.611105279950449, + -0.000242483573022922,0.00053560956613552,0.525523538847066,-0.632457737752638, + -0.000248766433494918,0.00117569194440748,0.541001423459434,-0.653810195554826, + -9.32933258415147e-05,-0.0134943641406834,0.167927850514354,-0.143089848855785, + -9.90547590565272e-05,-0.0128558854187758,0.1830710808969,-0.164696682602766, + -0.000104816192271817,-0.0122174066968684,0.198214311279446,-0.186303516349747, + -0.000110577625486996,-0.0115789279749612,0.213357541661992,-0.207910350096727, + -0.000116339058702009,-0.0109404492530535,0.228500772044538,-0.229517183843708, + -0.00012210049191741,-0.0103019705311462,0.243644002427084,-0.251124017590689, + -0.000127861925132644,-0.00966349180923909,0.258787232809629,-0.27273085133767, + -0.000133623358347434,-0.00902501308733106,0.273930463192176,-0.294337685084651, + -0.000139384791562724,-0.00838653436542369,0.289073693574721,-0.315944518831631, + -0.00014514622477807,-0.00774805564351677,0.304216923957267,-0.337551352578612, + -0.000150907657993193,-0.00710957692160918,0.319360154339813,-0.359158186325593, + -0.00015666909120815,-0.00647109819970138,0.334503384722359,-0.380765020072574, + -0.000162430524423662,-0.00583261947779445,0.349646615104905,-0.402371853819555, + -0.00016819195763873,-0.00519414075588664,0.364789845487451,-0.423978687566536, + -0.000173953390853354,-0.00455566203397884,0.379933075869997,-0.445585521313516, + -0.000179714824068866,-0.00391718331207191,0.395076306252542,-0.467192355060497, + -0.000185476257284267,-0.00327870459016433,0.410219536635089,-0.488799188807478, + -0.00019123769049878,-0.0026402258682563,0.425362767017635,-0.510406022554459, + -0.000196999123714736,-0.00200174714634982,0.44050599740018,-0.53201285630144, + -0.000202760556929249,-0.00136326842444134,0.455649227782726,-0.55361969004842, + -0.000208521990144983,-0.000724789702534867,0.470792458165272,-0.575226523795402, + -0.00021428342335994,-8.63109806270579e-05,0.485935688547818,-0.596833357542382, + -0.00022004485657523,0.000552167741279863,0.501078918930363,-0.618440191289363, + -0.000225806289790631,0.00119064646318723,0.51622214931291,-0.640047025036344, + -0.000231567723006143,0.00182912518509415,0.531365379695455,-0.661653858783325, + -8.74321996301441e-05,-0.0126652446511913,0.165900610755314,-0.145236662353547, + -9.25676095201999e-05,-0.0120327796731364,0.180623854433982,-0.167157590759539, + -9.77030194103667e-05,-0.0114003146950816,0.19534709811265,-0.18907851916553, + -0.000102838429300367,-0.0107678497170266,0.210070341791318,-0.210999447571521, + -0.000107973839190256,-0.0101353847389716,0.224793585469987,-0.232920375977512, + -0.000113109249080201,-0.00950291976091644,0.239516829148655,-0.254841304383503, + -0.000118244658970479,-0.00887045478286175,0.254240072827323,-0.276762232789494, + -0.000123380068860479,-0.00823798980480683,0.268963316505992,-0.298683161195486, + -0.000128515478750646,-0.00760552482675192,0.28368656018466,-0.320604089601477, + -0.000133650888640258,-0.00697305984869656,0.298409803863328,-0.342525018007468, + -0.000138786298530258,-0.00634059487064143,0.313133047541997,-0.364445946413459, + -0.000143921708420591,-0.00570812989258673,0.327856291220665,-0.38636687481945, + -0.000149057118310703,-0.00507566491453182,0.342579534899333,-0.408287803225441, + -0.000154192528200481,-0.00444319993647646,0.357302778578002,-0.430208731631433, + -0.000159327938090703,-0.00381073495842199,0.37202602225667,-0.452129660037424, + -0.000164463347980814,-0.00317826998036708,0.386749265935338,-0.474050588443415, + -0.000169598757870371,-0.0025458050023115,0.401472509614007,-0.495971516849406, + -0.000174734167761037,-0.00191334002425725,0.416195753292675,-0.517892445255397, + -0.000179869577650926,-0.00128087504620233,0.430918996971343,-0.539813373661388, + -0.000185004987540704,-0.000648410068146976,0.445642240650011,-0.56173430206738, + -0.000190140397430705,-1.5945090091396e-05,0.46036548432868,-0.583655230473371, + -0.00019527580732126,0.000616519887962408,0.475088728007348,-0.605576158879362, + -0.000200411217210816,0.00124898486601799,0.489811971686016,-0.627497087285353, + -0.000205546627100706,0.00188144984407357,0.504535215364685,-0.649418015691344, + -0.000210682036990595,0.00251391482212826,0.519258459043353,-0.671338944097335, + -8.03522994982098e-05,-0.0117156773980369,0.163423066677582,-0.147789874344073, + -8.47715379367342e-05,-0.0110961896811264,0.177637083345373,-0.170084356507939, + -8.91907763753697e-05,-0.0104767019642161,0.191851100013164,-0.192378838671805, + -9.36100148137831e-05,-0.00985721424730535,0.206065116680955,-0.214673320835671, + -9.80292532525295e-05,-0.00923772653039512,0.220279133348745,-0.236967802999537, + -0.000102448491691109,-0.00861823881348456,0.234493150016536,-0.259262285163402, + -0.000106867730129467,-0.007998751096574,0.248707166684327,-0.281556767327269, + -0.00011128696856777,-0.00737926337966299,0.262921183352118,-0.303851249491134, + -0.000115706207006794,-0.00675977566275332,0.277135200019908,-0.326145731655, + -0.000120125445445096,-0.00614028794584232,0.2913492166877,-0.348440213818866, + -0.000124544683883454,-0.00552080022893175,0.30556323335549,-0.370734695982732, + -0.000128963922322312,-0.00490131251202142,0.319777250023281,-0.393029178146598, + -0.000133383160760614,-0.00428182479511041,0.333991266691072,-0.415323660310464, + -0.000137802399199249,-0.0036623370782003,0.348205283358863,-0.43761814247433, + -0.000142221637638107,-0.00304284936128996,0.362419300026654,-0.459912624638195, + -0.000146640876075965,-0.00242336164437895,0.376633316694444,-0.482207106802061, + -0.000151060114515045,-0.00180387392746884,0.390847333362235,-0.504501588965927, + -0.000155479352953347,-0.00118438621055805,0.405061350030026,-0.526796071129793, + -0.000159898591392205,-0.000564898493647936,0.419275366697816,-0.549090553293658, + -0.000164317829830507,5.45892232630685e-05,0.433489383365607,-0.571385035457525, + -0.00016873706826892,0.000674076940173407,0.447703400033398,-0.593679517621391, + -0.000173156306707778,0.00129356465708375,0.461917416701189,-0.615973999785256, + -0.000177575545145969,0.00191305237399453,0.47613143336898,-0.638268481949122, + -0.000181994783584494,0.00253254009090487,0.49034545003677,-0.660562964112988, + -0.000186414022022685,0.00315202780781609,0.504559466704562,-0.682857446276854, + -7.21564063035918e-05,-0.0106839855395054,0.16051674839087,-0.150694371754829, + -7.58030394666376e-05,-0.0100869894380015,0.174138615339031,-0.173413803326167, + -7.94496726294613e-05,-0.00948999333649747,0.187760482287193,-0.196133234897505, + -8.30963057922296e-05,-0.00889299723499326,0.201382349235354,-0.218852666468843, + -8.67429389552199e-05,-0.00829600113348927,0.215004216183516,-0.241572098040181, + -9.03895721179881e-05,-0.00769900503198517,0.228626083131678,-0.264291529611519, + -9.40362052809229e-05,-0.00710200893048119,0.242247950079839,-0.287010961182857, + -9.76828384439687e-05,-0.0065050128289772,0.255869817028001,-0.309730392754196, + -0.000101329471606626,-0.00590801672747299,0.269491683976163,-0.332449824325534, + -0.000104976104769783,-0.00531102062596944,0.283113550924324,-0.355169255896872, + -0.000108622737932884,-0.00471402452446545,0.296735417872486,-0.37788868746821, + -0.000112269371095208,-0.0041170284229608,0.310357284820648,-0.400608119039548, + -0.00011591600425831,-0.00352003232145681,0.323979151768809,-0.423327550610886, + -0.000119562637421078,-0.00292303621995305,0.33760101871697,-0.446046982182224, + -0.000123209270583957,-0.00232604011844884,0.351222885665132,-0.468766413753562, + -0.000126855903747169,-0.00172904401694551,0.364844752613293,-0.491485845324901, + -0.00013050253691016,-0.00113204791544108,0.378466619561455,-0.514205276896239, + -0.000134149170072262,-0.000535051813936205,0.392088486509617,-0.536924708467577, + -0.000137795803236029,6.19442875668952e-05,0.405710353457779,-0.559644140038915, + -0.000141442436398798,0.000658940389070661,0.41933222040594,-0.582363571610253, + -0.000145089069561788,0.00125593649057487,0.432954087354102,-0.605083003181591, + -0.000148735702724334,0.00185293259207953,0.446575954302264,-0.627802434752929, + -0.000152382335887324,0.00244992869358285,0.460197821250425,-0.650521866324267, + -0.000156028969050426,0.00304692479508706,0.473819688198587,-0.673241297895606, + -0.000159675602212972,0.00364392089659127,0.487441555146748,-0.695960729466943, + -6.31249316708771e-05,-0.00962659538787658,0.157267814668057,-0.153836009010444, + -6.5993282822141e-05,-0.00906323379249774,0.170233775287234,-0.177015085298738, + -6.8861633973627e-05,-0.0084998721971189,0.183199735906411,-0.200194161587033, + -7.1729985125224e-05,-0.00793651060174061,0.196165696525587,-0.223373237875327, + -7.45983362764324e-05,-0.00737314900636155,0.209131657144764,-0.246552314163621, + -7.74666874279739e-05,-0.00680978741098315,0.222097617763941,-0.269731390451916, + -8.03350385792378e-05,-0.00624642581560386,0.235063578383118,-0.29291046674021, + -8.32033897309459e-05,-0.00568306422022569,0.248029539002295,-0.316089543028504, + -8.60717408822098e-05,-0.00511970262484707,0.260995499621471,-0.339268619316798, + -8.89400920337513e-05,-0.00455634102946822,0.273961460240648,-0.362447695605093, + -9.18084431853483e-05,-0.00399297943408983,0.286927420859825,-0.385626771893387, + -9.46767943366122e-05,-0.00342961783871032,0.299893381479002,-0.408805848181681, + -9.75451454879872e-05,-0.00286625624333214,0.312859342098179,-0.431984924469975, + -0.000100413496639362,-0.0023028946479533,0.325825302717356,-0.45516400075827, + -0.000103281847790404,-0.00173953305257379,0.338791263336533,-0.478343077046564, + -0.000106150198942334,-0.00117617145719606,0.351757223955709,-0.501522153334859, + -0.000109018550093376,-0.000612809861816555,0.364723184574886,-0.524701229623152, + -0.000111886901245306,-4.94482664388229e-05,0.377689145194062,-0.547880305911447, + -0.000114755252396459,0.000513913328940685,0.39065510581324,-0.571059382199741, + -0.000117623603548167,0.00107727492431886,0.403621066432416,-0.594238458488035, + -0.000120491954699542,0.00164063651969792,0.416587027051594,-0.61741753477633, + -0.000123360305850473,0.00220399811507699,0.42955298767077,-0.640596611064624, + -0.000126228657002292,0.00276735971045516,0.442518948289947,-0.663775687352918, + -0.000129097008153445,0.00333072130583423,0.455484908909124,-0.686954763641212, + -0.000131965359305153,0.00389408290121196,0.4684508695283,-0.710133839929507, + -5.36989799683751e-05,-0.00860697714783887,0.153826301483036,-0.157054126272231, + -5.58410042438839e-05,-0.0080881480926922,0.166103784343122,-0.180704036866835, + -5.79830285193927e-05,-0.00756931903754554,0.178381267203208,-0.204353947461439, + -6.01250527950126e-05,-0.00705048998239888,0.190658750063294,-0.228003858056044, + -6.22670770706324e-05,-0.00653166092725233,0.20293623292338,-0.251653768650648, + -6.44091013461412e-05,-0.00601283187210577,0.215213715783466,-0.275303679245252, + -6.65511256217055e-05,-0.005494002816959,0.227491198643552,-0.298953589839857, + -6.86931498969368e-05,-0.00497517376181222,0.239768681503637,-0.322603500434461, + -7.08351741727231e-05,-0.00445634470666589,0.252046164363723,-0.346253411029066, + -7.2977198448454e-05,-0.00393751565151934,0.264323647223809,-0.36990332162367, + -7.51192227238517e-05,-0.00341868659637234,0.276601130083895,-0.393553232218274, + -7.72612469992495e-05,-0.00289985754122579,0.288878612943981,-0.417203142812879, + -7.94032712747583e-05,-0.00238102848607946,0.301156095804066,-0.440853053407483, + -8.15452955508222e-05,-0.00186219943093335,0.313433578664152,-0.464502964002087, + -8.368731982622e-05,-0.00134337037578613,0.325711061524238,-0.488152874596692, + -8.58293441013958e-05,-0.00082454132063936,0.337988544384324,-0.511802785191296, + -8.79713683772376e-05,-0.00030571226549303,0.35026602724441,-0.5354526957859, + -9.01133926527464e-05,0.0002131167896533,0.362543510104495,-0.559102606380505, + -9.22554169279222e-05,0.000731945844800741,0.374820992964582,-0.582752516975109, + -9.43974412039861e-05,0.00125077489994663,0.387098475824667,-0.606402427569713, + -9.6539465479939e-05,0.00176960395509296,0.399375958684753,-0.630052338164318, + -9.86814897548927e-05,0.00228843301024018,0.411653441544839,-0.653702248758922, + -0.000100823514030179,0.00280726206538695,0.423930924404925,-0.677352159353526, + -0.000102965538306021,0.00332609112053284,0.43620840726501,-0.701002069948131, + -0.000105107562582085,0.00384492017567917,0.448485890125097,-0.724651980542735, + -4.44035621398609e-05,-0.00768086929031253,0.150382527841535,-0.160171929786963, + -4.59204429688609e-05,-0.00721496318449477,0.161976967681695,-0.184277998046331, + -4.7437323798083e-05,-0.00674905707867723,0.173571407521856,-0.208384066305698, + -4.89542046269165e-05,-0.00628315097285903,0.185165847362017,-0.232490134565065, + -5.04710854561941e-05,-0.0058172448670416,0.196760287202177,-0.256596202824433, + -5.19879662854161e-05,-0.00535133876122384,0.208354727042338,-0.2807022710838, + -5.35048471145272e-05,-0.0048854326554062,0.219949166882498,-0.304808339343168, + -5.50217279433607e-05,-0.0044195265495881,0.231543606722659,-0.328914407602535, + -5.65386087725273e-05,-0.00395362044377046,0.24313804656282,-0.353020475861902, + -5.80554896018604e-05,-0.00348771433795303,0.25473248640298,-0.37712654412127, + -5.95723704307494e-05,-0.00302180823213516,0.266326926243141,-0.401232612380637, + -6.10892512595829e-05,-0.00255590212631707,0.277921366083302,-0.425338680640005, + -6.26061320891935e-05,-0.00208999602050008,0.289515805923462,-0.449444748899372, + -6.4123012917805e-05,-0.00162408991468155,0.301110245763623,-0.473550817158739, + -6.56398937477487e-05,-0.00115818380886457,0.312704685603783,-0.497656885418107, + -6.71567745762491e-05,-0.000692277703046695,0.324299125443944,-0.521762953677474, + -6.86736554054157e-05,-0.000226371597228825,0.335893565284104,-0.545869021936842, + -7.01905362348043e-05,0.000239534508588601,0.347488005124265,-0.569975090196209, + -7.17074170636378e-05,0.000705440614406694,0.359082444964426,-0.594081158455576, + -7.32242978928044e-05,0.00117134672022434,0.370676884804586,-0.618187226714944, + -7.47411787215269e-05,0.00163725282604288,0.382271324644747,-0.642293294974311, + -7.62580595510265e-05,0.00210315893186008,0.393865764484908,-0.666399363233678, + -7.777494037986e-05,0.00256906503767729,0.405460204325068,-0.690505431493046, + -7.92918212088045e-05,0.00303497114349627,0.417054644165229,-0.714611499752413, + -8.08087020380821e-05,0.00350087724931347,0.42864908400539,-0.738717568011781, + -3.57351169674724e-05,-0.0068846383866169,0.147126696986295,-0.163033675097257, + -3.675587589963e-05,-0.00647582090672838,0.158080307984815,-0.187558437816273, + -3.77766348318431e-05,-0.00606700342684019,0.169033918983334,-0.212083200535288, + -3.87973937637787e-05,-0.00565818594695144,0.179987529981854,-0.236607963254304, + -3.98181526960473e-05,-0.00524936846706325,0.190941140980373,-0.26113272597332, + -4.08389116279828e-05,-0.00484055098717451,0.201894751978893,-0.285657488692335, + -4.18596705600294e-05,-0.00443173350728587,0.212848362977413,-0.310182251411351, + -4.28804294919649e-05,-0.00402291602739746,0.223801973975932,-0.334707014130366, + -4.39011884246221e-05,-0.00361409854750949,0.234755584974452,-0.359231776849382, + -4.49219473565576e-05,-0.00320528106762108,0.245709195972971,-0.383756539568398, + -4.59427062884377e-05,-0.002796463587732,0.256662806971491,-0.408281302287413, + -4.69634652204842e-05,-0.00238764610784359,0.267616417970011,-0.432806065006429, + -4.79842241528639e-05,-0.00197882862795562,0.27857002896853,-0.457330827725444, + -4.90049830847994e-05,-0.00157001114806676,0.28952363996705,-0.48185559044446, + -5.0025742017179e-05,-0.00116119366817857,0.30047725096557,-0.506380353163476, + -5.10465009491146e-05,-0.000752376188289716,0.311430861964089,-0.530905115882491, + -5.20672598811611e-05,-0.000343558708401526,0.322384472962609,-0.555429878601507, + -5.30880188135407e-05,6.52587714866648e-05,0.333338083961128,-0.579954641320523, + -5.41087777455873e-05,0.000474076251375077,0.344291694959648,-0.604479404039538, + -5.51295366776339e-05,0.000882893731263934,0.355245305958168,-0.629004166758554, + -5.61502956092363e-05,0.00129171121115279,0.366198916956687,-0.653528929477569, + -5.7171054541616e-05,0.0017005286910412,0.377152527955207,-0.678053692196585, + -5.81918134735515e-05,0.00210934617092962,0.388106138953726,-0.7025784549156, + -5.92125724054871e-05,0.00251816365081803,0.399059749952246,-0.727103217634616, + -6.02333313378667e-05,0.002926981130706,0.410013360950765,-0.751627980353632, + -2.80616207928297e-05,-0.00623162031375268,0.144208856291756,-0.165533033883148, + -2.87177831424512e-05,-0.00587935717506471,0.154591916809099,-0.190423471238744, + -2.93739454922948e-05,-0.00552709403637697,0.164974977326443,-0.215313908594339, + -3.00301078419163e-05,-0.005174830897689,0.175358037843786,-0.240204345949934, + -3.06862701915378e-05,-0.00482256775900081,0.18574109836113,-0.26509478330553, + -3.13424325412703e-05,-0.00447030462031317,0.196124158878473,-0.289985220661125, + -3.19985948911694e-05,-0.00411804148162553,0.206507219395816,-0.314875658016721, + -3.26547572409019e-05,-0.00376577834293768,0.216890279913159,-0.339766095372316, + -3.33109195904679e-05,-0.00341351520424982,0.227273340430502,-0.364656532727911, + -3.39670819403115e-05,-0.00306125206556218,0.237656400947846,-0.389546970083507, + -3.4623244289822e-05,-0.00270898892687432,0.248039461465189,-0.414437407439102, + -3.52794066397211e-05,-0.00235672578818669,0.258422521982532,-0.439327844794698, + -3.59355689892871e-05,-0.00200446264949861,0.268805582499875,-0.464218282150293, + -3.65917313391861e-05,-0.00165219951081075,0.279188643017219,-0.489108719505888, + -3.72478936885301e-05,-0.00129993637212289,0.289571703534562,-0.513999156861484, + -3.79040560385402e-05,-0.000947673233435031,0.299954764051906,-0.538889594217079, + -3.85602183881062e-05,-0.000595410094747173,0.310337824569249,-0.563780031572675, + -3.92163807378942e-05,-0.000243146956059759,0.320720885086592,-0.58867046892827, + -3.98725430877933e-05,0.000109116182628544,0.331103945603936,-0.613560906283865, + -4.05287054374703e-05,0.000461379321315736,0.341487006121278,-0.638451343639461, + -4.11848677873694e-05,0.000813642460003816,0.351870066638622,-0.663341780995056, + -4.18410301369354e-05,0.00116590559869145,0.362253127155965,-0.688232218350652, + -4.24971924866124e-05,0.00151816873737953,0.372636187673308,-0.713122655706247, + -4.31533548365115e-05,0.00187043187606761,0.383019248190652,-0.738013093061842, + -4.38095171861885e-05,0.00222269501475481,0.393402308707995,-0.762903530417438, + -2.15747166540936e-05,-0.00571608225660958,0.141715902605768,-0.167622889635366, + -2.19807473527678e-05,-0.00541591788672946,0.151614112640134,-0.192819088311429, + -2.23867780511644e-05,-0.0051157535168489,0.161512322674499,-0.218015286987492, + -2.27928087498386e-05,-0.00481558914696845,0.171410532708865,-0.243211485663555, + -2.31988394482907e-05,-0.00451542477708822,0.18130874274323,-0.268407684339618, + -2.36048701467428e-05,-0.00421526040720788,0.191206952777595,-0.293603883015681, + -2.40109008453615e-05,-0.00391509603732754,0.201105162811961,-0.318800081691744, + -2.44169315438691e-05,-0.0036149316674472,0.211003372846326,-0.343996280367807, + -2.48229622423213e-05,-0.00331476729756663,0.220901582880691,-0.36919247904387, + -2.5228992941051e-05,-0.00301460292768652,0.230799792915057,-0.394388677719934, + -2.563502363917e-05,-0.00271443855780573,0.240698002949422,-0.419584876395997, + -2.60410543381218e-05,-0.00241427418792584,0.250596212983787,-0.44478107507206, + -2.64470850361853e-05,-0.00211410981804483,0.260494423018153,-0.469977273748123, + -2.6853115735137e-05,-0.00181394544816516,0.270392633052518,-0.495173472424186, + -2.72591464335337e-05,-0.00151378107828504,0.280290843086883,-0.520369671100249, + -2.76651771315972e-05,-0.00121361670840336,0.290189053121249,-0.545565869776312, + -2.80712078305489e-05,-0.00091345233852369,0.300087263155614,-0.570762068452375, + -2.84772385291676e-05,-0.00061328796864335,0.30998547318998,-0.595958267128438, + -2.88832692273422e-05,-0.00031312359876301,0.319883683224345,-0.621154465804501, + -2.92892999259609e-05,-1.29592288824476e-05,0.32978189325871,-0.646350664480564, + -2.96953306242465e-05,0.000287205140998115,0.339680103293076,-0.671546863156627, + -3.01013613230872e-05,0.000587369510878233,0.349578313327441,-0.69674306183269, + -3.05073920217058e-05,0.000887533880758351,0.359476523361806,-0.721939260508753, + -3.09134227202135e-05,0.00118769825063847,0.369374733396172,-0.747135459184816, + -3.13194534186101e-05,0.00148786262051903,0.379272943430537,-0.77233165786088, + -1.63001788559547e-05,-0.00532077392692598,0.139670925317938,-0.169307643692151, + -1.65442853462539e-05,-0.00506580930210265,0.149173110051875,-0.194750334320838, + -1.6788391836553e-05,-0.00481084467727899,0.158675294785811,-0.220193024949525, + -1.70324983266856e-05,-0.00455588005245511,0.168177479519748,-0.245635715578211, + -1.72766048168183e-05,-0.00430091542763145,0.177679664253684,-0.271078406206898, + -1.75207113071174e-05,-0.0040459508028079,0.187181848987621,-0.296521096835585, + -1.7764817796917e-05,-0.0037909861779839,0.196684033721557,-0.321963787464272, + -1.80089242878267e-05,-0.00353602155316124,0.206186218455493,-0.347406478092958, + -1.82530307779594e-05,-0.00328105692833747,0.21568840318943,-0.372849168721645, + -1.84971372681475e-05,-0.00302609230351369,0.225190587923366,-0.398291859350332, + -1.87412437586687e-05,-0.00277112767869059,0.234692772657302,-0.423734549979019, + -1.89853502483572e-05,-0.00251616305386615,0.244194957391239,-0.449177240607705, + -1.92294567386009e-05,-0.0022611984290426,0.253697142125175,-0.474619931236392, + -1.94735632289555e-05,-0.00200623380421949,0.263199326859112,-0.500062621865079, + -1.97176697189771e-05,-0.00175126917939505,0.272701511593049,-0.525505312493765, + -1.99617762091098e-05,-0.00149630455457128,0.282203696326985,-0.550948003122452, + -2.02058826991314e-05,-0.00124133992974795,0.291705881060921,-0.576390693751139, + -2.04499891895971e-05,-0.000986375304924625,0.301208065794857,-0.601833384379825, + -2.06940956798407e-05,-0.000731410680101074,0.310710250528794,-0.627276075008513, + -2.09382021705284e-05,-0.000476446055277524,0.320212435262731,-0.652718765637199, + -2.11823086608831e-05,-0.000221481430453974,0.329714619996667,-0.678161456265886, + -2.14264151506827e-05,3.34831943695768e-05,0.339216804730603,-0.703604146894573, + -2.16705216405932e-05,0.000288447819194015,0.34871898946454,-0.729046837523259, + -2.1914628131614e-05,0.000543412444016234,0.358221174198476,-0.754489528151946, + -2.21587346217467e-05,0.000798377068840228,0.367723358932412,-0.779932218780633, + -1.21448269517765e-05,-0.00502405522464089,0.138048404985096,-0.170626264827203, + -1.22888283335398e-05,-0.00480646542779262,0.147237416215967,-0.196261879459866, + -1.24328297151921e-05,-0.00458887563094412,0.156426427446838,-0.221897494092528, + -1.25768310970664e-05,-0.00437128583409563,0.16561543867771,-0.247533108725191, + -1.27208324789962e-05,-0.00415369603724758,0.174804449908581,-0.273168723357854, + -1.2864833860482e-05,-0.00393610624039864,0.183993461139452,-0.298804337990516, + -1.30088352421898e-05,-0.00371851644355048,0.193182472370323,-0.324439952623179, + -1.31528366240086e-05,-0.0035009266467021,0.202371483601194,-0.350075567255842, + -1.32968380054943e-05,-0.00328333684985305,0.211560494832066,-0.375711181888504, + -1.34408393874796e-05,-0.00306574705300511,0.220749506062937,-0.401346796521167, + -1.35848407692984e-05,-0.00284815725615672,0.229938517293808,-0.42698241115383, + -1.37288421505621e-05,-0.00263056745930768,0.23912752852468,-0.452618025786492, + -1.3872843532492e-05,-0.00241297766245951,0.248316539755551,-0.478253640419155, + -1.40168449143108e-05,-0.00219538786561113,0.257505550986422,-0.503889255051817, + -1.41608462963516e-05,-0.00197779806876341,0.266694562217293,-0.52952486968448, + -1.43048476775043e-05,-0.00176020827191392,0.275883573448165,-0.555160484317143, + -1.44488490594341e-05,-0.00154261847506576,0.285072584679036,-0.580796098949805, + -1.4592850441475e-05,-0.00132502867821804,0.294261595909907,-0.606431713582468, + -1.47368518227387e-05,-0.00110743888136833,0.303450607140779,-0.632067328215131, + -1.48808532045575e-05,-0.000889849084520389,0.31263961837165,-0.657702942847793, + -1.50248545867093e-05,-0.00067225928767245,0.321828629602521,-0.683338557480456, + -1.5168855968084e-05,-0.000454669490823179,0.331017640833392,-0.708974172113119, + -1.53128573500139e-05,-0.000237079693974795,0.340206652064264,-0.734609786745781, + -1.54568587319437e-05,-1.94898971273005e-05,0.349395663295134,-0.760245401378444, + -1.56008601130964e-05,0.000198099899721971,0.358584674526006,-0.785881016011107, + -8.95157708807881e-06,-0.0048046795498099,0.136794614071217,-0.171634645401195, + -9.03575203842211e-06,-0.00461685737120388,0.145742230488012,-0.19741779355406, + -9.11992698859887e-06,-0.00442903519259796,0.154689846904808,-0.223200941706924, + -9.20410193916421e-06,-0.00424121301399194,0.163637463321604,-0.248984089859788, + -9.28827688967404e-06,-0.00405339083538625,0.1725850797384,-0.274767238012652, + -9.37245183979529e-06,-0.00386556865677967,0.181532696155196,-0.300550386165516, + -9.45662679013859e-06,-0.00367774647817343,0.190480312571992,-0.32633353431838, + -9.54080174025984e-06,-0.0034899242995674,0.199427928988787,-0.352116682471244, + -9.6249766904366e-06,-0.00330210212096071,0.208375545405584,-0.377899830624108, + -9.7091516412795e-06,-0.00311427994235558,0.217323161822379,-0.403682978776972, + -9.79332659145626e-06,-0.00292645776374933,0.226270778239175,-0.429466126929836, + -9.87750154191058e-06,-0.00273863558514309,0.235218394655971,-0.4552492750827, + -9.96167649225388e-06,-0.00255081340653729,0.244166011072767,-0.481032423235564, + -1.00458514427082e-05,-0.00236299122793127,0.253113627489563,-0.506815571388428, + -1.01300263929405e-05,-0.0021751690493248,0.262061243906359,-0.532598719541292, + -1.02142013433948e-05,-0.00198734687071922,0.271008860323154,-0.558381867694156, + -1.02983762936271e-05,-0.0017995246921132,0.27995647673995,-0.58416501584702, + -1.03825512443034e-05,-0.0016117025135074,0.288904093156746,-0.609948163999884, + -1.04667261942026e-05,-0.00142388033490048,0.297851709573542,-0.635731312152748, + -1.0550901144657e-05,-0.00123605815629535,0.306799325990337,-0.661514460305613, + -1.06350760952223e-05,-0.00104823597768933,0.315746942407133,-0.687297608458477, + -1.07192510453435e-05,-0.00086041379908286,0.324694558823929,-0.713080756611341, + -1.08034259959089e-05,-0.000672591620477281,0.333642175240725,-0.738863904764205, + -1.08876009466963e-05,-0.000484769441871702,0.342589791657521,-0.764647052917069, + -1.09717758959293e-05,-0.000296947263264347,0.351537408074317,-0.790430201069933, + -6.54405703920391e-06,-0.00464417901219771,0.135845304757493,-0.172392176104683, + -6.59326360402668e-06,-0.00447939661998475,0.144610491681815,-0.198286156590327, + -6.64247016851638e-06,-0.00431461422777157,0.153375678606136,-0.224180137075972, + -6.69167673317261e-06,-0.00414983183555828,0.162140865530458,-0.250074117561616, + -6.7408832976068e-06,-0.00398504944334488,0.17090605245478,-0.275968098047261, + -6.79008986248508e-06,-0.00382026705113203,0.179671239379102,-0.301862078532905, + -6.83929642719683e-06,-0.00365548465891896,0.188436426303424,-0.32775605901855, + -6.88850299124244e-06,-0.003490702266705,0.197201613227746,-0.353650039504194, + -6.93770955639827e-06,-0.0033259198744926,0.205966800152067,-0.379544019989839, + -6.98691612105451e-06,-0.00316113748227931,0.214731987076389,-0.405438000475483, + -7.0361226854887e-06,-0.00299635509006579,0.223497174000711,-0.431331980961128, + -7.08532925053351e-06,-0.00283157269785339,0.232262360925033,-0.457225961446772, + -7.1345358144681e-06,-0.00266679030563921,0.241027547849355,-0.483119941932417, + -7.18374237940189e-06,-0.00250200791342658,0.249792734773677,-0.509013922418061, + -7.23294894389159e-06,-0.00233722552121307,0.258557921697999,-0.534907902903706, + -7.28215550860334e-06,-0.00217244312899911,0.267323108622321,-0.56080188338935, + -7.33136207287099e-06,-0.00200766073678604,0.276088295546643,-0.586695863874995, + -7.38056863802683e-06,-0.00184287834457386,0.284853482470964,-0.612589844360639, + -7.42977520329369e-06,-0.00167809595236124,0.293618669395286,-0.638483824846284, + -7.47898176722828e-06,-0.00151331356014683,0.302383856319608,-0.664377805331928, + -7.52818833149593e-06,-0.00134853116793376,0.31114904324393,-0.690271785817573, + -7.57739489587461e-06,-0.00118374877571981,0.319914230168252,-0.716165766303217, + -7.62660146136351e-06,-0.00101896638350807,0.328679417092573,-0.742059746788862, + -7.67580802552015e-06,-0.000854183991294111,0.337444604016895,-0.767953727274507, + -7.72501459012087e-06,-0.000689401599081485,0.346209790941217,-0.793847707760151, + -4.75483127965193e-06,-0.00452759542177628,0.135137534898178,-0.172953685658474, + -4.78383286778294e-06,-0.00438026641063038,0.143766897509781,-0.198929819135989, + -4.81283445530334e-06,-0.00423293739948372,0.152396260121385,-0.224905952613504, + -4.84183604326782e-06,-0.00408560838833749,0.161025622732988,-0.250882086091019, + -4.87083763128782e-06,-0.00393827937719138,0.169654985344592,-0.276858219568534, + -4.89983921914128e-06,-0.00379095036604515,0.178284347956195,-0.302834353046049, + -4.92884080693923e-06,-0.00364362135489826,0.186913710567799,-0.328810486523564, + -4.95784239501473e-06,-0.0034962923437527,0.195543073179402,-0.354786620001079, + -4.98684398253513e-06,-0.00334896333260581,0.204172435791006,-0.380762753478594, + -5.01584557038859e-06,-0.00320163432145959,0.212801798402609,-0.406738886956109, + -5.04484715857512e-06,-0.00305430531031337,0.221431161014213,-0.432715020433624, + -5.07384874637307e-06,-0.00290697629916736,0.230060523625816,-0.458691153911139, + -5.10285033417102e-06,-0.00275964728802069,0.23868988623742,-0.484667287388654, + -5.13185192185794e-06,-0.00261231827687425,0.247319248849023,-0.510643420866169, + -5.16085350998896e-06,-0.00246498926572802,0.255948611460627,-0.536619554343684, + -5.18985509767589e-06,-0.00231766025458158,0.26457797407223,-0.5625956878212, + -5.21885668591793e-06,-0.00217033124343602,0.273207336683833,-0.588571821298715, + -5.24785827338281e-06,-0.00202300223228935,0.281836699295437,-0.61454795477623, + -5.27685986151383e-06,-0.0018756732211429,0.290466061907041,-0.640524088253745, + -5.30586144931178e-06,-0.00172834420999646,0.299095424518645,-0.66650022173126, + -5.33486303722075e-06,-0.00158101519885046,0.307724787130248,-0.692476355208775, + -5.3638646250187e-06,-0.00143368618770356,0.316354149741852,-0.71845248868629, + -5.39286621292767e-06,-0.00128635717655756,0.324983512353455,-0.744428622163805, + -5.4218678006146e-06,-0.00113902816541112,0.333612874965059,-0.77040475564132, + -5.45086938952277e-06,-0.000991699154266001,0.342242237576662,-0.796380889118835, + -3.43922470513736e-06,-0.00444332830486172,0.134615878561166,-0.173365776959723, + -3.456573557159e-06,-0.00430901187057042,0.143145234348802,-0.199402202435999, + -3.47392240895861e-06,-0.00417469543627902,0.151674590136438,-0.225438627912275, + -3.49127126109128e-06,-0.00404037900198784,0.160203945924074,-0.251475053388551, + -3.50862011305741e-06,-0.00390606256769666,0.168733301711709,-0.277511478864826, + -3.525968964746e-06,-0.00377174613340459,0.177262657499346,-0.303547904341102, + -3.54331781660111e-06,-0.00363742969911329,0.185792013286981,-0.329584329817378, + -3.56066666862276e-06,-0.003503113264822,0.194321369074617,-0.355620755293654, + -3.57801552119952e-06,-0.00336879683053137,0.202850724862253,-0.38165718076993, + -3.59536437283259e-06,-0.00323448039624008,0.211380080649888,-0.407693606246206, + -3.61271322479872e-06,-0.00310016396194857,0.219909436437524,-0.433730031722482, + -3.6300620769314e-06,-0.00296584752765772,0.22843879222516,-0.459766457198758, + -3.64741092828691e-06,-0.00283153109336509,0.236968148012796,-0.485802882675033, + -3.6647597805306e-06,-0.00269721465907424,0.245497503800432,-0.511839308151309, + -3.68210863277429e-06,-0.00256289822478362,0.254026859588067,-0.537875733627585, + -3.69945748446288e-06,-0.00242858179049144,0.262556215375704,-0.563912159103861, + -3.71680633626248e-06,-0.00229426535620014,0.271085571163339,-0.589948584580137, + -3.73415518806208e-06,-0.00215994892190841,0.279614926950975,-0.615985010056413, + -3.75150403997271e-06,-0.00202563248761711,0.288144282738611,-0.642021435532689, + -3.76885289155027e-06,-0.00189131605332538,0.296673638526247,-0.668057861008965, + -3.78620174457112e-06,-0.0017569996190363,0.305202994313881,-0.694094286485241, + -3.80355059570459e-06,-0.00162268318474323,0.313732350101518,-0.720130711961517, + -3.82089944783726e-06,-0.00148836675045194,0.322261705889154,-0.746167137437792, + -3.83824829952584e-06,-0.00135405031616065,0.33079106167679,-0.772203562914068, + -3.85559715188055e-06,-0.00121973388186936,0.339320417464426,-0.798239988390344, + -2.47942191083927e-06,-0.00438262522385557,0.13423463834927,-0.173666007356582, + -2.49000601110216e-06,-0.00425789771663643,0.14269096035358,-0.199746358755731, + -2.50059011175363e-06,-0.00413317020941784,0.15114728235789,-0.22582671015488, + -2.51117421229408e-06,-0.00400844270219913,0.1596036043622,-0.251907061554029, + -2.52175831255697e-06,-0.0038837151949801,0.168059926366511,-0.277987412953179, + -2.5323424130419e-06,-0.00375898768776128,0.176516248370821,-0.304067764352328, + -2.54292651363786e-06,-0.0036342601805428,0.184972570375131,-0.330148115751477, + -2.55351061434483e-06,-0.00350953267332432,0.193428892379441,-0.356228467150626, + -2.56409471427466e-06,-0.00338480516610473,0.201885214383751,-0.382308818549775, + -2.57467881437101e-06,-0.00326007765888514,0.210341536388062,-0.408389169948924, + -2.58526291518901e-06,-0.0031353501516671,0.218797858392372,-0.434469521348073, + -2.5958470154519e-06,-0.00301062264444774,0.227254180396682,-0.460549872747223, + -2.60643111593684e-06,-0.00288589513722948,0.235710502400992,-0.486630224146372, + -2.61701521631075e-06,-0.00276116763001033,0.244166824405302,-0.512710575545521, + -2.62759931701773e-06,-0.00263644012279163,0.252623146409612,-0.53879092694467, + -2.63818341694755e-06,-0.00251171261557226,0.261079468413923,-0.564871278343819, + -2.64876751787657e-06,-0.00238698510835422,0.269535790418233,-0.590951629742968, + -2.65935161791742e-06,-0.00226225760113508,0.277992112422543,-0.617031981142118, + -2.66993571862439e-06,-0.00213753009391615,0.286448434426853,-0.643112332541267, + -2.68051981955342e-06,-0.00201280258669856,0.294904756431163,-0.669192683940416, + -2.69110391970528e-06,-0.00188807507947875,0.303361078435473,-0.695273035339565, + -2.70168801930204e-06,-0.00176334757225893,0.311817400439784,-0.721353386738714, + -2.71227212034209e-06,-0.00163862006504134,0.320273722444093,-0.747433738137863, + -2.722856220716e-06,-0.00151389255782197,0.328730044448404,-0.773514089537012, + -2.73344032131195e-06,-0.00138916505060394,0.337186366452713,-0.799594440936162, + -1.78318752480644e-06,-0.00433899864963383,0.133957736860613,-0.173883578033694, + -1.78979057968709e-06,-0.00422127725885069,0.142361041414946,-0.199995761628658, + -1.79639363401263e-06,-0.00410355586806677,0.150764345969279,-0.226107945223622, + -1.80299668883777e-06,-0.00398583447728329,0.159167650523613,-0.252220128818586, + -1.80959974349637e-06,-0.00386811308649992,0.167570955077946,-0.278332312413549, + -1.816202798266e-06,-0.00375039169571623,0.17597425963228,-0.304444496008513, + -1.82280585298011e-06,-0.00363267030493275,0.184377564186613,-0.330556679603477, + -1.82940890763872e-06,-0.00351494891414927,0.192780868740946,-0.356668863198441, + -1.83601196235283e-06,-0.00339722752336558,0.20118417329528,-0.382781046793404, + -1.84261501723348e-06,-0.00327950613258277,0.209587477849613,-0.408893230388368, + -1.84921807167004e-06,-0.0031617847417984,0.217990782403947,-0.435005413983332, + -1.85582112677274e-06,-0.00304406335101559,0.22639408695828,-0.461117597578296, + -1.86242418098725e-06,-0.00292634196023167,0.234797391512613,-0.487229781173259, + -1.8690272358679e-06,-0.00280862056944797,0.243200696066947,-0.513341964768223, + -1.87563029052651e-06,-0.00269089917866472,0.25160400062128,-0.539454148363187, + -1.8822333456292e-06,-0.00257317778788146,0.260007305175614,-0.56556633195815, + -1.8888363997327e-06,-0.00245545639709754,0.268410609729947,-0.591678515553114, + -1.89543945450232e-06,-0.00233773500631429,0.27681391428428,-0.617790699148078, + -1.90204250860582e-06,-0.00222001361552948,0.285217218838614,-0.643902882743042, + -1.90864556393056e-06,-0.00210229222474689,0.293620523392947,-0.670015066338005, + -1.91524861914427e-06,-0.00198457083396431,0.30202382794728,-0.696127249932969, + -1.92185167358083e-06,-0.00186684944317994,0.310427132501614,-0.722239433527933, + -1.92845472835046e-06,-0.00174912805239646,0.318830437055948,-0.748351617122897, + -1.93505778334213e-06,-0.00163140666161343,0.327233741610281,-0.774463800717861, + -1.94166083788971e-06,-0.00151368527082996,0.335637046164614,-0.800575984312824, + -1.28023268458621e-06,-0.00430769541124465,0.13375752027218,-0.174040638482477, + -1.28444787067528e-06,-0.00419506150919025,0.142122504725356,-0.200175801180263, + -1.28866305693087e-06,-0.00408242760713606,0.150487489178533,-0.226310963878049, + -1.29287824313096e-06,-0.00396979370508199,0.15885247363171,-0.252446126575835, + -1.29709342916451e-06,-0.00385715980302748,0.167217458084887,-0.27858128927362, + -1.3013086154201e-06,-0.00374452590097341,0.175582442538064,-0.304716451971406, + -1.30552380173121e-06,-0.00363189199891956,0.183947426991241,-0.330851614669192, + -1.30973898798681e-06,-0.00351925809686526,0.192312411444418,-0.356986777366977, + -1.31395417385383e-06,-0.0034066241948103,0.200677395897595,-0.383121940064763, + -1.31816936016493e-06,-0.00329399029275668,0.209042380350771,-0.409257102762549, + -1.32238454653155e-06,-0.00318135639070261,0.217407364803948,-0.435392265460334, + -1.32659973217653e-06,-0.00306872248864742,0.225772349257126,-0.46152742815812, + -1.33081491859866e-06,-0.0029560885865938,0.234137333710302,-0.487662590855906, + -1.33503010513181e-06,-0.00284345468453995,0.242502318163479,-0.513797753553691, + -1.33924529055474e-06,-0.00273082078248432,0.250867302616656,-0.539932916251477, + -1.34346047697687e-06,-0.00261818688043114,0.259232287069832,-0.566068078949263, + -1.34767566317695e-06,-0.00250555297837662,0.26759727152301,-0.592203241647048, + -1.35189084937704e-06,-0.00239291907632255,0.275962255976187,-0.618338404344834, + -1.35610603602121e-06,-0.00228028517426893,0.284327240429363,-0.64447356704262, + -1.36032122188823e-06,-0.00216765127221441,0.29269222488254,-0.670608729740405, + -1.36453640819933e-06,-0.0020550173701599,0.301057209335717,-0.696743892438191, + -1.36875159373329e-06,-0.00194238346810494,0.309422193788894,-0.722879055135977, + -1.37296678082155e-06,-0.0018297495660522,0.31778717824207,-0.749014217833762, + -1.37718196691061e-06,-0.00171711566399724,0.326152162695248,-0.775149380531548, + -1.38139715266661e-06,-0.00160448176194272,0.334517147148425,-0.801284543229334, + -0.000122614663452481,-0.0182265374582882,0.184700687434548,-0.14020061472181, + -0.000131218248003218,-0.0176287050077489,0.201397418238037,-0.160027840678904, + -0.000139821832554121,-0.0170308725572099,0.218094149041525,-0.179855066635997, + -0.000148425417104747,-0.0164330401066703,0.234790879845014,-0.19968229259309, + -0.000157029001655817,-0.0158352076561317,0.251487610648502,-0.219509518550184, + -0.000165632586206443,-0.0152373752055923,0.268184341451991,-0.239336744507277, + -0.000174236170757125,-0.014639542755053,0.284881072255479,-0.25916397046437, + -0.000182839755308362,-0.0140417103045141,0.301577803058968,-0.278991196421464, + -0.000191443339859043,-0.0134438778539749,0.318274533862456,-0.298818422378557, + -0.000200046924409891,-0.012846045403436,0.334971264665945,-0.31864564833565, + -0.000208650508960684,-0.0122482129528969,0.351667995469433,-0.338472874292744, + -0.000217254093511254,-0.0116503805023573,0.368364726272922,-0.358300100249837, + -0.000225857678061936,-0.0110525480518178,0.38506145707641,-0.37812732620693, + -0.000234461262613062,-0.0104547156012789,0.401758187879899,-0.397954552164024, + -0.000243064847163854,-0.00985688315073996,0.418454918683387,-0.417781778121117, + -0.000251668431714425,-0.00925905070020061,0.435151649486876,-0.43760900407821, + -0.000260272016265217,-0.00866121824966148,0.451848380290364,-0.457436230035304, + -0.00026887560081601,-0.00806338579912236,0.468545111093853,-0.477263455992397, + -0.000277479185367469,-0.0074655533485839,0.485241841897341,-0.49709068194949, + -0.000286082769917928,-0.00686772089804411,0.50193857270083,-0.516917907906583, + -0.000294686354469054,-0.00626988844750542,0.518635303504318,-0.536745133863677, + -0.000303289939019624,-0.00567205599696585,0.535332034307807,-0.55657235982077, + -0.000311893523570195,-0.00507422354642673,0.552028765111295,-0.576399585777863, + -0.000320497108121431,-0.00447639109588804,0.568725495914784,-0.596226811734957, + -0.000329100692672002,-0.00387855864534847,0.585422226718272,-0.61605403769205, + -0.00012124524057977,-0.0179782783708148,0.18424235710624,-0.140753479772638, + -0.00012968129392199,-0.0173765912123108,0.200846784262435,-0.160656432524923, + -0.000138117347264211,-0.0167749040538067,0.217451211418631,-0.180559385277208, + -0.000146553400606431,-0.0161732168953023,0.234055638574827,-0.200462338029494, + -0.000154989453948706,-0.0155715297367984,0.250660065731022,-0.220365290781779, + -0.000163425507290871,-0.0149698425782943,0.267264492887218,-0.240268243534064, + -0.000171861560632869,-0.0143681554197899,0.283868920043414,-0.260171196286349, + -0.000180297613975089,-0.0137664682612855,0.30047334719961,-0.280074149038634, + -0.000188733667317309,-0.0131647811027815,0.317077774355806,-0.299977101790919, + -0.000197169720659307,-0.0125630939442771,0.333682201512001,-0.319880054543204, + -0.000205605774001527,-0.0119614067857732,0.350286628668197,-0.339783007295489, + -0.000214041827343858,-0.011359719627269,0.366891055824393,-0.359685960047774, + -0.000222477880685967,-0.0107580324687648,0.383495482980589,-0.37958891280006, + -0.000230913934028076,-0.0101563453102604,0.400099910136784,-0.399491865552345, + -0.000239349987370407,-0.00955465815175627,0.41670433729298,-0.41939481830463, + -0.000247786040712406,-0.0089529709932521,0.433308764449176,-0.439297771056915, + -0.000256222094054626,-0.00835128383474792,0.449913191605372,-0.4592007238092, + -0.000264658147396735,-0.00774959667624375,0.466517618761567,-0.479103676561485, + -0.000273094200738955,-0.00714790951773936,0.483122045917763,-0.49900662931377, + -0.000281530254081508,-0.00654622235923563,0.499726473073959,-0.518909582066055, + -0.000289966307423395,-0.00594453520073124,0.516330900230155,-0.53881253481834, + -0.000298402360764616,-0.00534284804222596,0.532935327386351,-0.558715487570626, + -0.000306838414107946,-0.00474116088372289,0.549539754542546,-0.57861844032291, + -0.000315274467450166,-0.00413947372521895,0.566144181698742,-0.598521393075196, + -0.000323710520791942,-0.00353778656671411,0.582748608854938,-0.618424345827481, + -0.000119378181690943,-0.0176441252191403,0.183615232002131,-0.141503731285682, + -0.000127588016705371,-0.0170376200221406,0.200093694121303,-0.161509447167207, + -0.000135797851719244,-0.0164311148251405,0.216572156240475,-0.181515163048732, + -0.000144007686733449,-0.0158246096281407,0.233050618359647,-0.201520878930258, + -0.000152217521747489,-0.0152181044311408,0.249529080478819,-0.221526594811783, + -0.000160427356761805,-0.0146115992341411,0.266007542597991,-0.241532310693308, + -0.0001686371917759,-0.0140050940371412,0.282486004717163,-0.261538026574833, + -0.000176847026789773,-0.0133985888401411,0.298964466836335,-0.281543742456359, + -0.000185056861803923,-0.012792083643141,0.315442928955508,-0.301549458337884, + -0.000193266696818295,-0.0121855784461413,0.33192139107468,-0.321555174219409, + -0.000201476531832334,-0.0115790732491414,0.348399853193852,-0.341560890100934, + -0.000209686366846373,-0.0109725680521415,0.364878315313024,-0.36156660598246, + -0.000217896201860079,-0.0103660628551412,0.381356777432196,-0.381572321863985, + -0.000226106036874563,-0.00975955765814196,0.397835239551368,-0.40157803774551, + -0.000234315871889046,-0.00915305246114251,0.41431370167054,-0.421583753627035, + -0.000242525706902641,-0.00854654726414172,0.430792163789712,-0.441589469508561, + -0.000250735541916902,-0.00794004206714205,0.447270625908884,-0.461595185390086, + -0.000258945376931052,-0.00733353687014215,0.463749088028056,-0.481600901271611, + -0.000267155211945314,-0.00672703167314248,0.480227550147228,-0.501606617153136, + -0.000275365046959131,-0.00612052647614236,0.4967060122664,-0.521612333034661, + -0.000283574881973836,-0.00551402127914269,0.513184474385572,-0.541618048916187, + -0.00029178471698732,-0.00490751608214213,0.529662936504745,-0.561623764797712, + -0.00029999455200147,-0.00430101088514245,0.546141398623917,-0.581629480679237, + -0.000308204387015398,-0.00369450568814234,0.562619860743089,-0.601635196560763, + -0.000316414222030104,-0.00308800049114355,0.57909832286226,-0.621640912442288, + -0.000116857500888801,-0.0172007722457338,0.182764509922216,-0.142510314726809, + -0.000124765947903338,-0.0165885507931877,0.199072691324401,-0.162653903924753, + -0.000132674394917875,-0.0159763293406416,0.215380872726586,-0.182797493122697, + -0.000140582841932135,-0.0153641078880949,0.231689054128772,-0.202941082320641, + -0.000148491288946673,-0.014751886435549,0.247997235530957,-0.223084671518585, + -0.00015639973596121,-0.014139664983003,0.264305416933141,-0.243228260716529, + -0.000164308182975581,-0.0135274435304569,0.280613598335327,-0.263371849914473, + -0.000172216629990285,-0.0129152220779107,0.296921779737512,-0.283515439112417, + -0.000180125077004878,-0.0123030006253648,0.313229961139696,-0.303659028310361, + -0.000188033524019304,-0.0116907791728189,0.329538142541881,-0.323802617508305, + -0.000195941971033564,-0.0110785577202723,0.345846323944066,-0.343946206706248, + -0.000203850418047935,-0.010466336267726,0.362154505346251,-0.364089795904193, + -0.00021175886506275,-0.00985411481518028,0.378462686748436,-0.384233385102137, + -0.000219667312077121,-0.00924189336263415,0.394770868150621,-0.404376974300081, + -0.000227575759091714,-0.00862967191008779,0.411079049552806,-0.424520563498025, + -0.000235484206106307,-0.0080174504575421,0.427387230954991,-0.444664152695969, + -0.000243392653120789,-0.00740522900499574,0.443695412357177,-0.464807741893913, + -0.000251301100135048,-0.00679300755244938,0.460003593759361,-0.484951331091857, + -0.000259209547149863,-0.00618078609990369,0.476311775161546,-0.5050949202898, + -0.000267117994163901,-0.00556856464735755,0.492619956563731,-0.525238509487744, + -0.000275026441178161,-0.00495634319481031,0.508928137965917,-0.545382098685688, + -0.000282934888193087,-0.00434412174226528,0.525236319368101,-0.565525687883633, + -0.000290843335207902,-0.00373190028971937,0.541544500770286,-0.585669277081576, + -0.000298751782222162,-0.00311967883717301,0.557852682172471,-0.605812866279521, + -0.000306660229236422,-0.00250745738462665,0.574160863574656,-0.625956455477464, + -0.000113499264498385,-0.0166236968541382,0.181623997566467,-0.143840374637536, + -0.000121013399512926,-0.0160052391047554,0.197704930157943,-0.16416614423249, + -0.000128527534527689,-0.0153867813553729,0.21378586274942,-0.184491913827443, + -0.000136041669542286,-0.0147683236059902,0.229866795340896,-0.204817683422397, + -0.000143555804556716,-0.0141498658566074,0.245947727932373,-0.22514345301735, + -0.000151069939571424,-0.0135314081072249,0.26202866052385,-0.245469222612303, + -0.000158584074586021,-0.0129129503578422,0.278109593115326,-0.265794992207257, + -0.000166098209600452,-0.0122944926084594,0.294190525706803,-0.28612076180221, + -0.000173612344615326,-0.011676034859077,0.310271458298279,-0.306446531397163, + -0.000181126479629756,-0.0110575771096939,0.326352390889757,-0.326772300992117, + -0.000188640614644298,-0.0104391193603111,0.342433323481233,-0.34709807058707, + -0.000196154749659061,-0.00982066161092843,0.35851425607271,-0.367423840182024, + -0.000203668884673602,-0.0092022038615458,0.374595188664186,-0.387749609776977, + -0.000211183019688033,-0.00858374611216273,0.390676121255663,-0.408075379371931, + -0.000218697154702685,-0.00796528836278032,0.40675705384714,-0.428401148966884, + -0.000226211289717226,-0.00734683061339725,0.422837986438617,-0.448726918561837, + -0.000233725424731879,-0.00672837286401484,0.438918919030093,-0.469052688156791, + -0.000241239559746531,-0.00610991511463244,0.454999851621569,-0.489378457751744, + -0.000248753694761072,-0.00549145736524936,0.471080784213046,-0.509704227346697, + -0.000256267829775281,-0.00487299961586629,0.487161716804523,-0.530029996941651, + -0.000263781964790377,-0.00425454186648411,0.503242649396,-0.550355766536604, + -0.00027129609980503,-0.00363608411710192,0.519323581987476,-0.570681536131558, + -0.000278810234819682,-0.00301762636771885,0.535404514578953,-0.59100730572651, + -0.000286324369834112,-0.00239916861833578,0.55148544717043,-0.611333075321464, + -0.000293838504849098,-0.00178071086895359,0.567566379761906,-0.631658844916418, + -0.000109103850067294,-0.015891206727496,0.180119204645341,-0.145562895609843, + -0.000116114444255633,-0.0152669061543458,0.195902033200158,-0.166124601610413, + -0.000123125038444472,-0.0146426055811961,0.211684861754975,-0.186686307610983, + -0.000130135632633088,-0.0140183050080465,0.227467690309792,-0.207248013611553, + -0.000137146226821649,-0.0133940044348966,0.243250518864608,-0.227809719612123, + -0.000144156821010155,-0.0127697038617467,0.259033347419425,-0.248371425612694, + -0.000151167415198716,-0.0121454032885968,0.274816175974242,-0.268933131613264, + -0.000158178009387611,-0.0115211027154469,0.290599004529059,-0.289494837613834, + -0.00016518860357595,-0.0108968021422968,0.306381833083876,-0.310056543614404, + -0.0001721991977649,-0.0102725015691476,0.322164661638692,-0.330618249614974, + -0.000179209791953405,-0.00964820099599795,0.337947490193509,-0.351179955615544, + -0.000186220386142022,-0.00902390042284784,0.353730318748326,-0.371741661616114, + -0.000193230980330417,-0.00839959984969796,0.369513147303142,-0.392303367616684, + -0.000200241574519033,-0.00777529927654808,0.385295975857959,-0.412865073617254, + -0.000207252168707539,-0.00715099870339819,0.401078804412776,-0.433426779617824, + -0.000214262762895934,-0.00652669813024809,0.416861632967593,-0.453988485618394, + -0.000221273357084772,-0.0059023975570982,0.43264446152241,-0.474550191618964, + -0.000228283951273611,-0.00527809698394899,0.448427290077226,-0.495111897619534, + -0.000235294545462117,-0.00465379641079888,0.464210118632043,-0.515673603620104, + -0.000242305139650068,-0.00402949583764878,0.47999294718686,-0.536235309620674, + -0.000249315733839128,-0.00340519526449912,0.495775775741677,-0.556797015621244, + -0.000256326328027301,-0.00278089469134857,0.511558604296494,-0.577358721621814, + -0.000263336922216251,-0.00215659411819979,0.52734143285131,-0.597920427622384, + -0.000270347516405423,-0.00153229354505013,0.543124261406127,-0.618482133622954, + -0.000277358110593817,-0.000907992971900029,0.558907089960944,-0.639043839623524, + -0.000103483394497561,-0.0149909277874961,0.178175621500553,-0.147736534938755, + -0.000109871070723244,-0.0143628630069459,0.193576152530571,-0.168595967735466, + -0.000116258746948983,-0.0137347982263959,0.208976683560588,-0.189455400532177, + -0.000122646423174944,-0.0131067334458459,0.224377214590606,-0.210314833328888, + -0.000129034099400849,-0.012478668665296,0.239777745620624,-0.231174266125599, + -0.000135421775626365,-0.0118506038847459,0.255178276650641,-0.25203369892231, + -0.00014180945185216,-0.0112225391041958,0.270578807680659,-0.272893131719021, + -0.000148197128078009,-0.0105944743236457,0.285979338710676,-0.293752564515732, + -0.000154584804303692,-0.0099664095430958,0.301379869740694,-0.314611997312443, + -0.000160972480529487,-0.00933834476254547,0.316780400770712,-0.335471430109154, + -0.000167360156755558,-0.00871027998199603,0.332180931800729,-0.356330862905865, + -0.000173747832981519,-0.00808221520144614,0.347581462830746,-0.377190295702576, + -0.000180135509207147,-0.00745415042089581,0.362981993860764,-0.398049728499287, + -0.000186523185432441,-0.00682608564034526,0.378382524890782,-0.418909161295998, + -0.000192910861658957,-0.00619802085979604,0.393783055920799,-0.439768594092709, + -0.000199298537884474,-0.00556995607924549,0.409183586950817,-0.46062802688942, + -0.000205686214110434,-0.00494189129869649,0.424584117980834,-0.481487459686132, + -0.000212073890336173,-0.00431382651814616,0.439984649010852,-0.502346892482842, + -0.000218461566561912,-0.00368576173759583,0.455385180040869,-0.523206325279553, + -0.000224849242787761,-0.0030576969570455,0.470785711070888,-0.544065758076264, + -0.000231236919014166,-0.00242963217649672,0.486186242100904,-0.564925190872976, + -0.000237624595239572,-0.00180156739594572,0.501586773130923,-0.585784623669687, + -0.000244012271465643,-0.0011735026153965,0.516987304160939,-0.606644056466397, + -0.000250399947690605,-0.000545437834845064,0.532387835190958,-0.627503489263109, + -0.000256787623916233,8.26269457046003e-05,0.547788366220975,-0.648362922059819, + -9.65080703466126e-05,-0.0139279477482086,0.175734129785176,-0.150391361531562, + -0.000102155929316838,-0.0133007690298704,0.190658466457635,-0.171614430100443, + -0.000107803788287064,-0.0126735903115325,0.205582803130094,-0.192837498669323, + -0.000113451647257512,-0.0120464115931944,0.220507139802553,-0.214060567238203, + -0.000119099506227849,-0.0114192328748565,0.235431476475013,-0.235283635807083, + -0.000124747365197964,-0.0107920541565183,0.250355813147472,-0.256506704375964, + -0.000130395224168134,-0.01016487543818,0.265280149819931,-0.277729772944844, + -0.000136043083138415,-0.00953769671984195,0.28020448649239,-0.298952841513724, + -0.000141690942108696,-0.00891051800150411,0.295128823164849,-0.320175910082604, + -0.000147338801078978,-0.0082833392831656,0.310053159837308,-0.341398978651484, + -0.000152986660049148,-0.00765616056482754,0.324977496509767,-0.362622047220365, + -0.00015863451901954,-0.0070289818464897,0.339901833182226,-0.383845115789245, + -0.000164282377990155,-0.00640180312815208,0.354826169854685,-0.405068184358125, + -0.000169930236960325,-0.0057746244098138,0.369750506527144,-0.426291252927005, + -0.000175578095930828,-0.00514744569147618,0.384674843199603,-0.447514321495886, + -0.000181225954900999,-0.0045202669731379,0.399599179872063,-0.468737390064766, + -0.000186873813871058,-0.00389308825479961,0.414523516544522,-0.489960458633646, + -0.000192521672841117,-0.00326590953646155,0.429447853216981,-0.511183527202526, + -0.000198169531811732,-0.00263873081812349,0.44437218988944,-0.532406595771406, + -0.00020381739078168,-0.00201155209978499,0.459296526561899,-0.553629664340286, + -0.000209465249751961,-0.00138437338144692,0.474220863234358,-0.574852732909167, + -0.000215113108721687,-0.000757194663108418,0.489145199906817,-0.596075801478047, + -0.000220760967692302,-0.000130015944771245,0.504069536579276,-0.617298870046927, + -0.000226408826662916,0.000497162773566817,0.518993873251735,-0.638521938615808, + -0.000232056685632753,0.00112434149190532,0.533918209924195,-0.659745007184688, + -8.8167383742177e-05,-0.0127318878404413,0.172773369911458,-0.153507625942697, + -9.29801404675468e-05,-0.0121134777557286,0.187125744444409,-0.175157534147167, + -9.77928971929165e-05,-0.0114950676710156,0.201478118977361,-0.196807442351636, + -0.000102605653918175,-0.0108766575863025,0.215830493510312,-0.218457350556106, + -0.000107418410643711,-0.0102582475015902,0.230182868043263,-0.240107258760576, + -0.000112231167369248,-0.00963983741687757,0.244535242576215,-0.261757166965045, + -0.000117043924094729,-0.00902142733216471,0.258887617109166,-0.283407075169515, + -0.000121856680820098,-0.00840301724745185,0.273239991642118,-0.305056983373984, + -0.00012666943754569,-0.00778460716273943,0.287592366175069,-0.326706891578454, + -0.00013148219427106,-0.00716619707802657,0.30194474070802,-0.348356799782923, + -0.000136294950996541,-0.00654778699331393,0.316297115240971,-0.370006707987393, + -0.000141107707721688,-0.00592937690860063,0.330649489773923,-0.391656616191862, + -0.000145920464447613,-0.00531096682388865,0.345001864306874,-0.413306524396332, + -0.000150733221172539,-0.0046925567391749,0.359354238839826,-0.434956432600801, + -0.000155545977898242,-0.00407414665446293,0.373706613372777,-0.456606340805271, + -0.000160358734623389,-0.00345573656974962,0.388058987905728,-0.47825624900974, + -0.000165171491349203,-0.00283732648503743,0.402411362438679,-0.49990615721421, + -0.000169984248074462,-0.00221891640032479,0.41676373697163,-0.521556065418679, + -0.000174797004800054,-0.00160050631561126,0.431116111504583,-0.543205973623149, + -0.000179609761525645,-0.000982096230899288,0.445468486037533,-0.564855881827618, + -0.000184422518250682,-0.000363686146186204,0.459820860570485,-0.586505790032088, + -0.000189235274976163,0.00025472393852688,0.474173235103436,-0.608155698236558, + -0.000194048031701421,0.000873134023239963,0.488525609636388,-0.629805606441026, + -0.000198860788426458,0.00149154410795305,0.502877984169339,-0.651455514645497, + -0.000203673545152272,0.0021099541926648,0.51723035870229,-0.673105422849966, + -7.86289681380947e-05,-0.0114584727726581,0.169334019550029,-0.156999449137054, + -8.25550523894658e-05,-0.0108598557752654,0.18302882216364,-0.179127637854081, + -8.64811366408369e-05,-0.0102612387778728,0.196723624777251,-0.201255826571108, + -9.04072208925411e-05,-0.0096626217804805,0.210418427390862,-0.223384015288135, + -9.43333051438566e-05,-0.00906400478308766,0.224113230004473,-0.245512204005161, + -9.82593893955053e-05,-0.00846538778569528,0.237808032618083,-0.267640392722188, + -0.000102185473646876,-0.00786677078830267,0.251502835231694,-0.289768581439215, + -0.000106111557898247,-0.00726815379091006,0.265197637845305,-0.311896770156242, + -0.000110037642149785,-0.00666953679351745,0.278892440458916,-0.334024958873268, + -0.000113963726401156,-0.00607091979612462,0.292587243072527,-0.356153147590295, + -0.000117889810652638,-0.00547230279873223,0.306282045686137,-0.378281336307322, + -0.000121815894904453,-0.00487368580133984,0.319976848299748,-0.400409525024349, + -0.000125741979156158,-0.00427506880394768,0.333671650913359,-0.422537713741375, + -0.000129668063407085,-0.0036764518065544,0.34736645352697,-0.444665902458402, + -0.000133594147658234,-0.00307783480916135,0.361061256140581,-0.466794091175429, + -0.000137520231909716,-0.00247921781176896,0.374756058754192,-0.488922279892456, + -0.00014144631616142,-0.00188060081437658,0.388450861367802,-0.511050468609482, + -0.000145372400413013,-0.00128198381698441,0.402145663981413,-0.533178657326509, + -0.000149298484664273,-0.000683366819591136,0.415840466595024,-0.555306846043536, + -0.000153224568916088,-8.47498221991927e-05,0.429535269208634,-0.577435034760563, + -0.000157150653167459,0.000513867175193194,0.443230071822245,-0.59956322347759, + -0.000161076737418275,0.00111248417258691,0.456924874435856,-0.621691412194616, + -0.000165002821670424,0.00171110116997841,0.470619677049467,-0.643819600911643, + -0.000168928905921573,0.00230971816737124,0.484314479663078,-0.66594778962867, + -0.000172854990173166,0.00290833516476408,0.498009282276689,-0.688075978345696, + -6.82638380566924e-05,-0.0101818832773357,0.165533897607265,-0.160714117803524, + -7.13127930284108e-05,-0.0096159520438085,0.178509811924003,-0.183351110527767, + -7.43617479999625e-05,-0.00905002081028106,0.19148572624074,-0.205988103252009, + -7.74107029712368e-05,-0.00848408957675328,0.204461640557478,-0.228625095976252, + -8.04596579429551e-05,-0.00791815834322585,0.217437554874215,-0.251262088700495, + -8.35086129143958e-05,-0.00735222710969841,0.230413469190953,-0.273899081424738, + -8.65575678858921e-05,-0.00678629587617108,0.24338938350769,-0.296536074148981, + -8.96065228574439e-05,-0.00622036464264353,0.256365297824428,-0.319173066873224, + -9.26554778290511e-05,-0.0056544334091162,0.269341212141165,-0.341810059597467, + -9.57044328000478e-05,-0.00508850217558798,0.282317126457903,-0.36444705232171, + -9.87533877719882e-05,-0.0045225709420611,0.29529304077464,-0.387084045045953, + -0.000101802342743373,-0.00395663970853333,0.308268955091378,-0.409721037770196, + -0.00010485129771487,-0.003390708475006,0.321244869408115,-0.432358030494439, + -0.000107900252686366,-0.00282477724147867,0.334220783724852,-0.454995023218682, + -0.000110949207658084,-0.00225884600795134,0.34719669804159,-0.477632015942924, + -0.000113998162629358,-0.00169291477442379,0.360172612358327,-0.500269008667167, + -0.000117047117600966,-0.00112698354089602,0.373148526675065,-0.52290600139141, + -0.000120096072572351,-0.000561052307368692,0.386124440991802,-0.545542994115653, + -0.000123145027543736,4.87892615907981e-06,0.39910035530854,-0.568179986839896, + -0.000126193982515899,0.000570810159685742,0.412076269625277,-0.590816979564139, + -0.000129242937486951,0.00113674139321418,0.425052183942015,-0.613453972288382, + -0.000132291892458669,0.00170267262674129,0.438028098258752,-0.636090965012625, + -0.000135340847430832,0.00226860386026795,0.451004012575489,-0.658727957736868, + -0.000138389802401662,0.00283453509379639,0.463979926892227,-0.681364950461111, + -0.000141438757373047,0.00340046632732349,0.476955841208964,-0.704001943185353, + -5.76086222014993e-05,-0.00897866422883398,0.161561041172487,-0.164453825550056, + -5.98549438223239e-05,-0.0084578203509732,0.173793070280581,-0.187603051923676, + -6.2101265443093e-05,-0.00793697647311231,0.186025099388675,-0.210752278297296, + -6.43475870640287e-05,-0.00741613259525187,0.198257128496769,-0.233901504670916, + -6.65939086847422e-05,-0.00689528871739109,0.210489157604863,-0.257050731044537, + -6.88402303057334e-05,-0.00637444483953065,0.222721186712957,-0.280199957418157, + -7.10865519266135e-05,-0.00585360096167009,0.234953215821051,-0.303349183791777, + -7.33328735476046e-05,-0.00533275708380976,0.247185244929145,-0.326498410165397, + -7.55791951681517e-05,-0.00481191320594854,0.259417274037239,-0.349647636539017, + -7.78255167890318e-05,-0.00429106932808798,0.271649303145333,-0.372796862912638, + -8.00718384098564e-05,-0.0037702254502272,0.283881332253427,-0.395946089286258, + -8.2318160030348e-05,-0.00324938157236643,0.296113361361521,-0.419095315659878, + -8.45644816517277e-05,-0.00272853769450632,0.308345390469615,-0.442244542033498, + -8.68108032721082e-05,-0.0022076938166451,0.32057741957771,-0.465393768407119, + -8.90571248933769e-05,-0.00168684993878498,0.332809448685804,-0.488542994780739, + -9.13034465139795e-05,-0.00116600606092376,0.345041477793898,-0.511692221154359, + -9.35497681350261e-05,-0.00064516218306343,0.357273506901992,-0.534841447527979, + -9.57960897559618e-05,-0.000124318305202875,0.369505536010086,-0.557990673901599, + -9.80424113763423e-05,0.00039652557265768,0.38173756511818,-0.58113990027522, + -0.000100288732997611,0.000917369450518457,0.393969594226274,-0.60428912664884, + -0.000102535054617992,0.00143821332837968,0.406201623334368,-0.62743835302246, + -0.000104781376239038,0.00195905720624001,0.418433652442462,-0.65058757939608, + -0.000107027697860196,0.00247990108410034,0.430665681550556,-0.6737368057697, + -0.000109274019480687,0.00300074496196157,0.44289771065865,-0.696886032143321, + -0.000111520341101068,0.00352158883982234,0.455129739766744,-0.720035258516941, + -4.72626734265291e-05,-0.00790980246243134,0.157640135075173,-0.168015448572707, + -4.88320054694569e-05,-0.00744332688314142,0.169144905200348,-0.191652516051101, + -5.04013375124401e-05,-0.00697685130385139,0.180649675325522,-0.215289583529495, + -5.19706695553124e-05,-0.00651037572456115,0.192154445450698,-0.238926651007889, + -5.35400015984067e-05,-0.00604390014527156,0.203659215575872,-0.262563718486283, + -5.5109333641723e-05,-0.00557742456598165,0.215163985701047,-0.286200785964677, + -5.66786656842622e-05,-0.00511094898669118,0.226668755826222,-0.309837853443071, + -5.82479977276895e-05,-0.00464447340740182,0.238173525951397,-0.333474920921464, + -5.98173297702287e-05,-0.00417799782811112,0.249678296076572,-0.357111988399858, + -6.1386661813323e-05,-0.00371152224882132,0.261183066201747,-0.380749055878252, + -6.29559938565283e-05,-0.00324504666953151,0.272687836326922,-0.404386123356646, + -6.45253258990675e-05,-0.00277857109024127,0.284192606452097,-0.42802319083504, + -6.60946579422728e-05,-0.00231209551095146,0.295697376577272,-0.451660258313434, + -6.7663989985367e-05,-0.00184561993166121,0.307202146702447,-0.475297325791828, + -6.92333220281283e-05,-0.00137914435237096,0.318706916827622,-0.498934393270221, + -7.08026540713336e-05,-0.000912668773081382,0.330211686952797,-0.522571460748615, + -7.23719861140948e-05,-0.000446193193791578,0.341716457077972,-0.546208528227009, + -7.3941318156745e-05,2.02823854995593e-05,0.353221227203147,-0.569845595705403, + -7.55106502005054e-05,0.00048675796478781,0.364725997328321,-0.593482663183797, + -7.70799822429336e-05,0.000953233544079168,0.376230767453497,-0.617119730662191, + -7.86493142861389e-05,0.00141970912336831,0.387735537578671,-0.640756798140585, + -8.0218646328678e-05,0.00188618470265922,0.399240307703847,-0.664393865618979, + -8.17879783723274e-05,0.00235266028194836,0.410745077829021,-0.688030933097372, + -8.33573104147556e-05,0.00281913586123927,0.422249847954197,-0.711668000575766, + -8.4926642458405e-05,0.00328561144052886,0.433754618079372,-0.73530506805416, + -3.77579533709094e-05,-0.00700940703286379,0.153983378606066,-0.171232582099896, + -3.88005017408211e-05,-0.00660167608253526,0.164815467990088,-0.195310305415285, + -3.98430501106772e-05,-0.00619394513220661,0.17564755737411,-0.219388028730674, + -4.08855984803114e-05,-0.00578621418187775,0.186479646758132,-0.243465752046064, + -4.1928146850001e-05,-0.0053784832315491,0.197311736142154,-0.267543475361453, + -4.29706952199682e-05,-0.00497075228122057,0.208143825526177,-0.291621198676842, + -4.40132435897134e-05,-0.00456302133089204,0.218975914910199,-0.315698921992231, + -4.50557919596806e-05,-0.00415529038056328,0.229808004294221,-0.339776645307621, + -4.60983403293147e-05,-0.00374755943023453,0.240640093678243,-0.36385436862301, + -4.71408886992819e-05,-0.00333982847990599,0.251472183062265,-0.387932091938399, + -4.81834370690271e-05,-0.00293209752957768,0.262304272446287,-0.412009815253788, + -4.92259854384391e-05,-0.00252436657924804,0.27313636183031,-0.436087538569177, + -5.02685338086284e-05,-0.00211663562891995,0.283968451214332,-0.460165261884566, + -5.13110821781515e-05,-0.00170890467859097,0.294800540598354,-0.484242985199956, + -5.23536305482297e-05,-0.00130117372826288,0.305632629982376,-0.508320708515345, + -5.33961789178639e-05,-0.000893442777933906,0.316464719366399,-0.532398431830734, + -5.443872728772e-05,-0.000485711827605373,0.327296808750421,-0.556476155146123, + -5.54812756574652e-05,-7.79808772761736e-05,0.338128898134443,-0.580553878461512, + -5.65238240276544e-05,0.000329750073051471,0.348960987518465,-0.604631601776902, + -5.75663723968445e-05,0.000737481023381115,0.359793076902488,-0.62870932509229, + -5.86089207670337e-05,0.00114521197370943,0.37062516628651,-0.65278704840768, + -5.96514691363348e-05,0.00155294292403862,0.381457255670532,-0.676864771723069, + -6.0694017506524e-05,0.00196067387436694,0.392289345054554,-0.700942495038458, + -6.17365658760471e-05,0.00236840482469569,0.403121434438577,-0.725020218353847, + -6.27791142463474e-05,0.00277613577502356,0.413953523822598,-0.749097941669236, + -2.94584137228715e-05,-0.00628396626851779,0.150747391027488,-0.174002534052311, + -3.01208270984121e-05,-0.00593417615710912,0.160988314506727,-0.198459662041367, + -3.07832404738972e-05,-0.00558438604570033,0.171229237985966,-0.222916790030424, + -3.14456538492713e-05,-0.00523459593429121,0.181470161465205,-0.247373918019481, + -3.21080672247009e-05,-0.00488480582288231,0.191711084944444,-0.271831046008538, + -3.27704806001305e-05,-0.00453501571147341,0.201952008423683,-0.296288173997594, + -3.34328939759487e-05,-0.00418522560006473,0.212192931902922,-0.320745301986651, + -3.40953073512673e-05,-0.00383543548865561,0.222433855382161,-0.345202429975708, + -3.47577207264749e-05,-0.00348564537724672,0.2326747788614,-0.369659557964765, + -3.54201341026261e-05,-0.00313585526583848,0.242915702340639,-0.394116685953821, + -3.60825474780002e-05,-0.00278606515442936,0.253156625819878,-0.418573813942878, + -3.67449608530412e-05,-0.0024362750430198,0.263397549299118,-0.443030941931935, + -3.74073742285264e-05,-0.00208648493161134,0.273638472778356,-0.467488069920992, + -3.80697876042335e-05,-0.00173669482020244,0.283879396257595,-0.491945197910048, + -3.87322009793856e-05,-0.00138690470879332,0.294120319736835,-0.516402325899105, + -3.93946143547597e-05,-0.0010371145973842,0.304361243216074,-0.540859453888161, + -4.00570277303558e-05,-0.000687324485975527,0.314602166695312,-0.565316581877218, + -4.0719441106063e-05,-0.000337534374566406,0.324843090174552,-0.589773709866275, + -4.13818544816591e-05,1.22557368418263e-05,0.33508401365379,-0.614230837855332, + -4.20442678568111e-05,0.000362045848250947,0.345324937133029,-0.638687965844388, + -4.27066812322963e-05,0.000711835959660068,0.355565860612269,-0.663145093833445, + -4.33690946081144e-05,0.00106162607106874,0.365806784091508,-0.687602221822502, + -4.40315079831555e-05,0.00141141618247786,0.376047707570747,-0.712059349811559, + -4.46939213585296e-05,0.00176120629388699,0.386288631049986,-0.736516477800615, + -4.53563347346808e-05,0.00211099640529477,0.396529554529224,-0.760973605789672, + -2.25250364927487e-05,-0.00571963385739138,0.148013139703018,-0.176290723976157, + -2.29308207982948e-05,-0.00542286590567631,0.157757349089021,-0.201061268936432, + -2.33366051037298e-05,-0.00512609795396146,0.167501558475022,-0.225831813896707, + -2.37423894093314e-05,-0.00482933000224683,0.177245767861024,-0.250602358856982, + -2.41481737149329e-05,-0.0045325620505321,0.186989977247026,-0.275372903817258, + -2.45539580204235e-05,-0.00423579409881714,0.196734186633028,-0.300143448777533, + -2.49597423256365e-05,-0.00393902614710195,0.206478396019031,-0.324913993737808, + -2.53655266314601e-05,-0.00364225819538766,0.216222605405032,-0.349684538698083, + -2.57713109371172e-05,-0.0033454902436727,0.225966814791035,-0.374455083658358, + -2.61770952424412e-05,-0.00304872229195752,0.235711024177037,-0.399225628618633, + -2.65828795481537e-05,-0.002751954340243,0.245455233563038,-0.423996173578908, + -2.69886638538663e-05,-0.00245518638852849,0.25519944294904,-0.448766718539183, + -2.73944481592459e-05,-0.0021584184368133,0.264943652335043,-0.473537263499459, + -2.78002324645144e-05,-0.00186165048509856,0.274687861721044,-0.498307808459734, + -2.8206016770449e-05,-0.00156488253338405,0.284432071107046,-0.523078353420009, + -2.86118010754954e-05,-0.0012681145816682,0.294176280493049,-0.547848898380284, + -2.9017585381208e-05,-0.000971346629953906,0.303920489879051,-0.572619443340559, + -2.94233696872537e-05,-0.000674578678239168,0.313664699265053,-0.597389988300834, + -2.98291539919671e-05,-0.000377810726523542,0.323408908651055,-0.622160533261109, + -3.02349382976796e-05,-8.1042774809692e-05,0.333153118037056,-0.646931078221385, + -3.06407226035033e-05,0.00021572517690549,0.342897327423059,-0.67170162318166, + -3.10465069094379e-05,0.00051249312861934,0.35264153680906,-0.696472168141935, + -3.14522912144843e-05,0.000809261080335411,0.362385746195063,-0.72124271310221, + -3.18580755203079e-05,0.0011060290320497,0.372129955581065,-0.746013258062485, + -3.22638598256875e-05,0.00140279698376444,0.381874164967066,-0.77078380302276, + -1.69427810465805e-05,-0.00529196453517244,0.145791002598509,-0.178117155137419, + -1.71846844633783e-05,-0.00504087958355992,0.155133302926869,-0.203137869245253, + -1.74265878804536e-05,-0.00478979463194773,0.164475603255229,-0.228158583353087, + -1.76684912975844e-05,-0.00453870968033554,0.173817903583589,-0.253179297460921, + -1.79103947145487e-05,-0.00428762472872313,0.183160203911949,-0.278200011568755, + -1.81522981316795e-05,-0.00403653977711138,0.192502504240309,-0.303220725676589, + -1.83942015486438e-05,-0.00378545482549875,0.20184480456867,-0.328241439784423, + -1.86361049658301e-05,-0.003534369873887,0.211187104897029,-0.353262153892257, + -1.8878008383072e-05,-0.00328328492227503,0.220529405225389,-0.378282868000091, + -1.91199117999252e-05,-0.00303219997066262,0.22987170555375,-0.403303582107925, + -1.93618152167785e-05,-0.00278111501905021,0.23921400588211,-0.428324296215759, + -1.96037186340758e-05,-0.00253003006743868,0.248556306210469,-0.453345010323593, + -1.98456220508181e-05,-0.00227894511582583,0.25789860653883,-0.478365724431427, + -2.00875254680044e-05,-0.00202786016421408,0.26724090686719,-0.503386438539261, + -2.03294288851907e-05,-0.00177677521260144,0.27658320719555,-0.528407152647095, + -2.05713323023771e-05,-0.00152569026098992,0.28592550752391,-0.553427866754929, + -2.08132357187862e-05,-0.00127460530937684,0.29526780785227,-0.578448580862764, + -2.10551391363056e-05,-0.00102352035776532,0.30461010818063,-0.603469294970598, + -2.1297042553492e-05,-0.000772435406153349,0.31395240850899,-0.628490009078432, + -2.15389459705673e-05,-0.000521350454540936,0.32329470883735,-0.653510723186266, + -2.17808493869764e-05,-0.00027026550292808,0.33263700916571,-0.6785314372941, + -2.20227528044958e-05,-1.91805513165555e-05,0.34197930949407,-0.703552151401934, + -2.2264656221016e-05,0.000231904400296301,0.351321609822431,-0.728572865509768, + -2.25065596389795e-05,0.000482989351906937,0.36066391015079,-0.753593579617602, + -2.27484630563879e-05,0.000734074303518462,0.37000621047915,-0.778614293725436, + -1.25796224305641e-05,-0.00497385379081838,0.144041111545111,-0.179535473036997, + -1.27213375839541e-05,-0.00476030761378166,0.153067982140322,-0.204750456377328, + -1.28630527372886e-05,-0.00454676143674471,0.162094852735533,-0.229965439717658, + -1.30047678906786e-05,-0.00433321525970787,0.171121723330744,-0.255180423057988, + -1.31464830440686e-05,-0.00411966908267081,0.180148593925955,-0.280395406398318, + -1.32881981972366e-05,-0.00390612290563386,0.189175464521166,-0.305610389738648, + -1.34299133506266e-05,-0.00369257672859713,0.198202335116377,-0.330825373078978, + -1.35716285043497e-05,-0.0034790305515604,0.207229205711588,-0.356040356419308, + -1.37133436574066e-05,-0.00326548437452323,0.216256076306799,-0.381255339759638, + -1.38550588110187e-05,-0.00305193819748673,0.225282946902009,-0.406470323099968, + -1.39967739640756e-05,-0.00283839202044955,0.23430981749722,-0.431685306440298, + -1.41384891176877e-05,-0.00262484584341283,0.243336688092431,-0.456900289780629, + -1.42802042709667e-05,-0.00241129966637588,0.252363558687642,-0.482115273120959, + -1.44219194244677e-05,-0.00219775348933915,0.261390429282853,-0.507330256461289, + -1.45636345776357e-05,-0.0019842073123022,0.270417299878064,-0.532545239801619, + -1.47053497310257e-05,-0.00177066113526525,0.279444170473275,-0.557760223141949, + -1.48470648845267e-05,-0.00155711495822808,0.288471041068487,-0.582975206482279, + -1.49887800380277e-05,-0.0013435687811918,0.297497911663697,-0.608190189822609, + -1.51304951909736e-05,-0.00113002260415396,0.306524782258909,-0.633405173162939, + -1.52722103444747e-05,-0.000916476427117452,0.315551652854119,-0.658620156503269, + -1.54139254983088e-05,-0.000702930250081835,0.32457852344933,-0.683835139843599, + -1.55556406512547e-05,-0.000489384073043553,0.333605394044542,-0.709050123183929, + -1.56973558047557e-05,-0.000275837896007047,0.342632264639752,-0.73426510652426, + -1.58390709580347e-05,-6.22917189705419e-05,0.351659135234963,-0.75948008986459, + -1.59807861114247e-05,0.000151254458066852,0.360686005830174,-0.78469507320492, + -9.24725226419953e-06,-0.00474026454069099,0.142696821365599,-0.180613532573666, + -9.32962552641081e-06,-0.00455646074887239,0.15148198930787,-0.205976179423591, + -9.41199878878862e-06,-0.00437265695705402,0.16026715725014,-0.231338826273517, + -9.49437205116643e-06,-0.00418885316523576,0.16905232519241,-0.256701473123442, + -9.57674531354424e-06,-0.00400504937341717,0.17783749313468,-0.282064119973368, + -9.65911857586654e-06,-0.00382124558159869,0.18662266107695,-0.307426766823293, + -9.74149183818884e-06,-0.0036374417897802,0.19540782901922,-0.332789413673219, + -9.82386510056665e-06,-0.00345363799796172,0.204192996961491,-0.358152060523144, + -9.90623836272242e-06,-0.00326983420614302,0.212978164903761,-0.383514707373069, + -9.98861162526676e-06,-0.00308603041432498,0.221763332846031,-0.408877354222995, + -1.0070984887478e-05,-0.0029022266225065,0.230548500788301,-0.43424000107292, + -1.01533581498003e-05,-0.00271842283068779,0.239333668730571,-0.459602647922846, + -1.02357314124557e-05,-0.00253461903886976,0.248118836672841,-0.484965294772771, + -1.0318104674556e-05,-0.00235081524705083,0.256904004615111,-0.510327941622697, + -1.04004779368783e-05,-0.00216701145523279,0.265689172557381,-0.535690588472622, + -1.04828511990895e-05,-0.00198320766341409,0.274474340499651,-0.561053235322547, + -1.05652244609677e-05,-0.00179940387159494,0.283259508441922,-0.586415882172473, + -1.06475977237341e-05,-0.00161560007977712,0.292044676384192,-0.611778529022398, + -1.07299709858344e-05,-0.00143179628795842,0.300829844326462,-0.637141175872324, + -1.08123442488228e-05,-0.0012479924961406,0.309615012268732,-0.662503822722249, + -1.08947175113672e-05,-0.00106418870432234,0.318400180211002,-0.687866469572174, + -1.09770907728013e-05,-0.000880384912502752,0.327185348153273,-0.7132291164221, + -1.10594640347905e-05,-0.000696581120684048,0.335970516095543,-0.738591763272025, + -1.11418372986671e-05,-0.000512777328867564,0.344755684037812,-0.763954410121951, + -1.12242105599902e-05,-0.000328973537047528,0.353540851980083,-0.789317056971876, + -6.74659235810893e-06,-0.00457022862622525,0.141683554392096,-0.181419697802315, + -6.79452573076889e-06,-0.00440934959867834,0.15028688080046,-0.206892766371011, + -6.84245910342884e-06,-0.00424847057113109,0.158890207208824,-0.232365834939707, + -6.89039247647738e-06,-0.0040875915435844,0.167493533617189,-0.257838903508403, + -6.93832584935938e-06,-0.00392671251603738,0.176096860025553,-0.283311972077099, + -6.98625922224139e-06,-0.00376583348849047,0.184700186433918,-0.308785040645795, + -7.03419259479032e-06,-0.00360495446094311,0.193303512842282,-0.334258109214491, + -7.08212596745028e-06,-0.00344407543339642,0.201906839250646,-0.359731177783187, + -7.1300593403878e-06,-0.00328319640584906,0.210510165659011,-0.385204246351883, + -7.17799271343633e-06,-0.00312231737830282,0.219113492067375,-0.410677314920579, + -7.22592608604078e-06,-0.00296143835075546,0.227716818475739,-0.436150383489275, + -7.27385945897829e-06,-0.00280055932320855,0.236320144884104,-0.461623452057971, + -7.32179283180479e-06,-0.0026396802956612,0.244923471292469,-0.487096520626666, + -7.36972620463128e-06,-0.00247880126811428,0.253526797700833,-0.512569589195363, + -7.41765957801288e-06,-0.00231792224056826,0.262130124109197,-0.538042657764059, + -7.46559295028426e-06,-0.00215704321302068,0.270733450517562,-0.563515726332755, + -7.51352632311075e-06,-0.00199616418547377,0.279336776925926,-0.588988794901451, + -7.56145969593724e-06,-0.00183528515792597,0.287940103334291,-0.614461863470147, + -7.6093930690968e-06,-0.00167440613037995,0.296543429742655,-0.639934932038842, + -7.65732644147921e-06,-0.00151352710283259,0.305146756151019,-0.665408000607538, + -7.70525981441672e-06,-0.00135264807528568,0.313750082559384,-0.690881069176234, + -7.75319318713219e-06,-0.00119176904773877,0.322353408967748,-0.716354137744931, + -7.80112656051379e-06,-0.0010308900201923,0.330956735376112,-0.741827206313627, + -7.84905993267415e-06,-0.000870010992644055,0.339560061784477,-0.767300274882323, + -7.89699330538962e-06,-0.000709131965097143,0.348163388192841,-0.792773343451019, + -4.89465790221022e-06,-0.00444717617764279,0.140930645269771,-0.182015214934389, + -4.92280312297533e-06,-0.0043036078697839,0.149399041301859,-0.2075698524209, + -4.9509483430743e-06,-0.00416003956192423,0.157867437333948,-0.233124489907411, + -4.97909356389492e-06,-0.00401647125406557,0.166335833366036,-0.258679127393922, + -5.00723878443798e-06,-0.00387290294620612,0.174804229398124,-0.284233764880433, + -5.03538400459247e-06,-0.00372933463834646,0.183272625430213,-0.309788402366944, + -5.06352922508002e-06,-0.00358576633048746,0.191741021462301,-0.335343039853455, + -5.0916744461782e-06,-0.00344219802262891,0.200209417494389,-0.360897677339966, + -5.11981966666575e-06,-0.00329862971476969,0.208677813526477,-0.386452314826477, + -5.14796488682023e-06,-0.0031550614069098,0.217146209558566,-0.412006952312988, + -5.17611010752983e-06,-0.00301149309905102,0.225614605590654,-0.437561589799499, + -5.20425532790636e-06,-0.0028679247911918,0.234083001622742,-0.46311622728601, + -5.23240054794982e-06,-0.00272435648333191,0.242551397654831,-0.488670864772521, + -5.26054576899249e-06,-0.00258078817547314,0.251019793686919,-0.514225502259032, + -5.28869098936902e-06,-0.00243721986761392,0.259488189719007,-0.539780139745543, + -5.31683620974555e-06,-0.00229365155975469,0.267956585751095,-0.565334777232054, + -5.34498143067719e-06,-0.00215008325189658,0.276424981783183,-0.590889414718565, + -5.37312665094269e-06,-0.00200651494403692,0.284893377815272,-0.616444052205076, + -5.40127187143025e-06,-0.00186294663617748,0.29336177384736,-0.641998689691587, + -5.42941709180678e-06,-0.00171937832831803,0.301830169879449,-0.667553327178098, + -5.4575623126274e-06,-0.00157581002045948,0.310298565911536,-0.693107964664609, + -5.48570753344801e-06,-0.00143224171260004,0.318766961943625,-0.71866260215112, + -5.51385275349148e-06,-0.00128867340474059,0.327235357975714,-0.744217239637631, + -5.54199797353494e-06,-0.00114510509688071,0.335703754007802,-0.769771877124142, + -5.57014319502169e-06,-0.00100153678902304,0.34417215003989,-0.795326514610653, + -3.53647106743349e-06,-0.00435847277562251,0.14037710526267,-0.182451163104266, + -3.55325512529925e-06,-0.00422777956714671,0.148746400502972,-0.208065513096975, + -3.57003918277643e-06,-0.00409708635867012,0.157115695743273,-0.233679863089684, + -3.58682324047566e-06,-0.00396639315019387,0.165484990983575,-0.259294213082394, + -3.60360729800835e-06,-0.00383569994171773,0.173854286223876,-0.284908563075103, + -3.62039135559655e-06,-0.00370500673324137,0.182223581464178,-0.310522913067813, + -3.63717541373987e-06,-0.00357431352476589,0.190592876704479,-0.336137263060522, + -3.65395947093949e-06,-0.00344362031628886,0.198962171944781,-0.361751613053232, + -3.67074352863872e-06,-0.00331292710781272,0.207331467185082,-0.387365963045941, + -3.68752758628244e-06,-0.00318223389933658,0.215700762425383,-0.412980313038651, + -3.70431164398166e-06,-0.00305154069086044,0.224070057665685,-0.43859466303136, + -3.72109570168089e-06,-0.00292084748238408,0.232439352905986,-0.46420901302407, + -3.73787975938011e-06,-0.00279015427390772,0.240808648146288,-0.489823363016779, + -3.75466381696832e-06,-0.00265946106543136,0.24917794338659,-0.515437713009489, + -3.7714478744455e-06,-0.00252876785695499,0.257547238626891,-0.541052063002198, + -3.78823193236677e-06,-0.00239807464847908,0.265916533867192,-0.566666412994908, + -3.80501598973293e-06,-0.00226738144000271,0.274285829107494,-0.592280762987617, + -3.82180004732113e-06,-0.00213668823152657,0.282655124347795,-0.617895112980327, + -3.83858410557547e-06,-0.00200599502305066,0.291024419588097,-0.643509462973036, + -3.85536816294163e-06,-0.00187530181457429,0.299393714828398,-0.669123812965746, + -3.87215222064086e-06,-0.00174460860609837,0.3077630100687,-0.694738162958455, + -3.88893627867315e-06,-0.00161391539762201,0.316132305309001,-0.720352512951165, + -3.9057203354842e-06,-0.00148322218914521,0.324501600549303,-0.745966862943874, + -3.92250439329445e-06,-0.00135252898066929,0.332870895789604,-0.771581212936584, + -3.93928845110469e-06,-0.00122183577219293,0.341240191029906,-0.797195562929293, + -2.54748546552053e-06,-0.0042946983083828,0.139973305081111,-0.182768189419938, + -2.55769820090013e-06,-0.0041734757392542,0.148270360578211,-0.208425963005514, + -2.56791093650177e-06,-0.0040522531701257,0.156567416075312,-0.234083736591091, + -2.57812367215893e-06,-0.00393103060099742,0.164864471572412,-0.259741510176667, + -2.58833640753853e-06,-0.0038098080318687,0.173161527069512,-0.285399283762243, + -2.59854914314017e-06,-0.00368858546274065,0.181458582566612,-0.311057057347819, + -2.60876187913039e-06,-0.00356736289361259,0.189755638063712,-0.336714830933395, + -2.61897461462102e-06,-0.00344614032448387,0.198052693560812,-0.362372604518971, + -2.62918735005613e-06,-0.00332491775535537,0.206349749057912,-0.388030378104547, + -2.63940008571328e-06,-0.00320369518622687,0.214646804555013,-0.413688151690124, + -2.64961282137044e-06,-0.0030824726170986,0.222943860052113,-0.4393459252757, + -2.65982555647248e-06,-0.00296125004796988,0.231240915549213,-0.465003698861276, + -2.67003829257373e-06,-0.0028400274788416,0.239537971046313,-0.490661472446852, + -2.68025102823088e-06,-0.00271880490971355,0.247835026543413,-0.516319246032428, + -2.69046376344395e-06,-0.00259758234058483,0.256132082040514,-0.541977019618004, + -2.70067649910111e-06,-0.00247635977145677,0.264429137537613,-0.56763479320358, + -2.71088923453622e-06,-0.00235513720232738,0.272726193034714,-0.593292566789157, + -2.72110197041542e-06,-0.00223391463319977,0.281023248531814,-0.618950340374733, + -2.73131470596155e-06,-0.00211269206407128,0.289320304028914,-0.644608113960309, + -2.74152744139666e-06,-0.00199146949494278,0.297617359526014,-0.670265887545885, + -2.75174017660973e-06,-0.00187024692581339,0.305914415023115,-0.695923661131461, + -2.76195291215586e-06,-0.00174902435668489,0.314211470520215,-0.721581434717037, + -2.77216564825711e-06,-0.00162780178755728,0.322508526017315,-0.747239208302614, + -2.78237838402529e-06,-0.00150657921842923,0.330805581514415,-0.77289698188819, + -2.79259111923835e-06,-0.00138535664929984,0.339102637011516,-0.798554755473766, + -1.83107347795364e-06,-0.00424892861948079,0.139680409510101,-0.182997624279129, + -1.83743084986032e-06,-0.00413461664548964,0.147925093811305,-0.208686823918072, + -1.8437882217115e-06,-0.00402030467149883,0.156169778112509,-0.234376023557014, + -1.85014559356267e-06,-0.00390599269750769,0.164414462413714,-0.260065223195957, + -1.85650296535833e-06,-0.00379168072351677,0.172659146714918,-0.2857544228349, + -1.86286033698746e-06,-0.00367736874952551,0.180903831016122,-0.311443622473842, + -1.86921770861659e-06,-0.00356305677553426,0.189148515317326,-0.337132822112785, + -1.8755750806343e-06,-0.00344874480154367,0.19739319961853,-0.362822021751728, + -1.88193245231894e-06,-0.00333443282755241,0.205637883919735,-0.38851122139067, + -1.88828982417011e-06,-0.00322012085356138,0.213882568220939,-0.414200421029613, + -1.89464719557719e-06,-0.0031058088795699,0.222127252522143,-0.439889620668555, + -1.90100456731734e-06,-0.00299149690557887,0.230371936823347,-0.465578820307498, + -1.90736193916852e-06,-0.00287718493158806,0.238616621124551,-0.491268019946441, + -1.91371931101969e-06,-0.00276287295759681,0.246861305425756,-0.516957219585383, + -1.92007668275984e-06,-0.00264856098360577,0.25510598972696,-0.542646419224326, + -1.92643405449999e-06,-0.00253424900961474,0.263350674028164,-0.568335618863268, + -1.93279142635117e-06,-0.00241993703562349,0.271595358329368,-0.594024818502211, + -1.93914879820234e-06,-0.00230562506163245,0.279840042630573,-0.619714018141154, + -1.94550617016453e-06,-0.00219131308764187,0.288084726931777,-0.645403217780096, + -1.95186354234878e-06,-0.00207700111365128,0.296329411232981,-0.671092417419039, + -1.95822091320075e-06,-0.00196268913965891,0.304574095534185,-0.696781617057982, + -1.96457828538499e-06,-0.00184837716566877,0.312818779835389,-0.722470816696924, + -1.97093565723616e-06,-0.00173406519167818,0.321063464136593,-0.748160016335867, + -1.9772930284212e-06,-0.00161975321768582,0.329308148437798,-0.773849215974809, + -1.98365040060544e-06,-0.00150544124369567,0.337552832739001,-0.799538415613752, + -1.31406032644055e-06,-0.00421612072135213,0.139468833153718,-0.183163088966447, + -1.31811125458903e-06,-0.00410682206736301,0.147675700967806,-0.208874952563745, + -1.32216218279302e-06,-0.003997523413374,0.155882568781895,-0.234586816161043, + -1.32621311105252e-06,-0.00388822475938511,0.164089436595984,-0.260298679758341, + -1.33026403914549e-06,-0.00377892610539576,0.172296304410073,-0.286010543355639, + -1.33431496718295e-06,-0.00366962745140631,0.180503172224162,-0.311722406952936, + -1.33836589555347e-06,-0.00356032879741774,0.18871004003825,-0.337434270550234, + -1.34241682353542e-06,-0.00345103014342829,0.196916907852339,-0.363146134147532, + -1.34646775207248e-06,-0.0033417314894395,0.205123775666428,-0.38885799774483, + -1.35051867988789e-06,-0.00323243283545027,0.213330643480517,-0.414569861342128, + -1.35456960825842e-06,-0.00312313418146104,0.221537511294606,-0.440281724939426, + -1.35862053629587e-06,-0.00301383552747203,0.229744379108695,-0.465993588536723, + -1.36267146444435e-06,-0.00290453687348302,0.237951246922783,-0.491705452134021, + -1.36672239237079e-06,-0.00279523821949357,0.246158114736872,-0.517417315731319, + -1.37077332085234e-06,-0.00268593956550434,0.254364982550962,-0.543129179328617, + -1.37482424944491e-06,-0.00257664091151621,0.26257185036505,-0.568841042925915, + -1.37887517748236e-06,-0.00246734225752698,0.270778718179139,-0.594552906523212, + -1.38292610518675e-06,-0.00235804360353686,0.278985585993228,-0.62026477012051, + -1.38697703377932e-06,-0.00224874494954852,0.287192453807317,-0.645976633717808, + -1.3910279619278e-06,-0.00213944629555929,0.295399321621405,-0.671688497315106, + -1.39507888974322e-06,-0.00203014764157006,0.303606189435494,-0.697400360912404, + -1.39912981811374e-06,-0.00192084898758083,0.311813057249583,-0.723112224509702, + -1.40318074648427e-06,-0.00181155033359248,0.320019925063671,-0.748824088107, + -1.40723167463275e-06,-0.00170225167960325,0.32822679287776,-0.774535951704297, + -1.41128260289225e-06,-0.00159295302561402,0.336433660691849,-0.800247815301595, + -0.000138568490530733,-0.0212571188369073,0.196837434248721,-0.141601576221728, + -0.000148453772764845,-0.0207171610154719,0.214081530925473,-0.160415225126397, + -0.000158339054999124,-0.0201772031940368,0.231325627602226,-0.179228874031065, + -0.000168224337233347,-0.0196372453726016,0.248569724278979,-0.198042522935734, + -0.00017810961946757,-0.0190972875511665,0.265813820955731,-0.216856171840402, + -0.000187994901702071,-0.0185573297297315,0.283057917632484,-0.23566982074507, + -0.000197880183935739,-0.0180173719082957,0.300302014309237,-0.254483469649739, + -0.000207765466170351,-0.0174774140868612,0.31754611098599,-0.273297118554407, + -0.000217650748404574,-0.0169374562654259,0.334790207662742,-0.292110767459076, + -0.000227536030638853,-0.0163974984439905,0.352034304339495,-0.310924416363744, + -0.000237421312873187,-0.0158575406225556,0.369278401016248,-0.329738065268413, + -0.000247306595107633,-0.0153175828011205,0.386522497693001,-0.348551714173081, + -0.000257191877341079,-0.0147776249796845,0.403766594369753,-0.36736536307775, + -0.000267077159575413,-0.0142376671582494,0.421010691046506,-0.386179011982418, + -0.000276962441809858,-0.0136977093368145,0.438254787723259,-0.404992660887087, + -0.000286847724044081,-0.01315775151538,0.455498884400011,-0.423806309791755, + -0.000296733006278638,-0.0126177936939447,0.472742981076764,-0.442619958696424, + -0.000306618288512639,-0.0120778358725095,0.489987077753516,-0.461433607601092, + -0.000316503570747084,-0.0115378780510744,0.507231174430269,-0.48024725650576, + -0.000326388852981307,-0.0109979202296393,0.524475271107022,-0.499060905410429, + -0.000336274135215531,-0.010457962408204,0.541719367783775,-0.517874554315097, + -0.00034615941744931,-0.00991800458676861,0.558963464460527,-0.536688203219766, + -0.000356044699683755,-0.00937804676533327,0.57620756113728,-0.555501852124434, + -0.000365929981918089,-0.00883808894389793,0.593451657814033,-0.574315501029102, + -0.000375815264152646,-0.00829813112246391,0.610695754490785,-0.593129149933771, + -0.000136874769601947,-0.0209124407958453,0.196273770192236,-0.142325544723687, + -0.000146550319085836,-0.0203648595511365,0.213409188946912,-0.161232408717505, + -0.000156225868569337,-0.0198172783064275,0.230544607701589,-0.180139272711322, + -0.000165901418053227,-0.0192696970617188,0.247680026456265,-0.19904613670514, + -0.000175576967537006,-0.0187221158170098,0.264815445210941,-0.217953000698957, + -0.000185252517020618,-0.0181745345723008,0.281950863965617,-0.236859864692775, + -0.000194928066504507,-0.0176269533275921,0.299086282720293,-0.255766728686592, + -0.000204603615988008,-0.017079372082883,0.31622170147497,-0.27467359268041, + -0.000214279165472453,-0.0165317908381748,0.333357120229646,-0.293580456674227, + -0.000223954714955732,-0.0159842095934655,0.350492538984322,-0.312487320668044, + -0.000233630264439677,-0.0154366283487568,0.367627957738998,-0.331394184661862, + -0.000243305813923289,-0.0148890471040477,0.384763376493674,-0.350301048655679, + -0.000252981363406901,-0.0143414658593388,0.40189879524835,-0.369207912649497, + -0.000262656912890735,-0.0137938846146299,0.419034214003027,-0.388114776643314, + -0.000272332462374458,-0.0132463033699208,0.436169632757703,-0.407021640637132, + -0.000282008011858181,-0.0126987221252115,0.45330505151238,-0.425928504630949, + -0.000291683561341793,-0.0121511408805028,0.470440470267056,-0.444835368624767, + -0.000301359110825516,-0.0116035596357937,0.487575889021732,-0.463742232618584, + -0.000311034660309351,-0.0110559783910851,0.504711307776408,-0.482649096612401, + -0.000320710209792852,-0.010508397146376,0.521846726531084,-0.501555960606219, + -0.000330385759276908,-0.00996081590166709,0.53898214528576,-0.520462824600036, + -0.000340061308760742,-0.00941323465695865,0.556117564040436,-0.539369688593853, + -0.000349736858243799,-0.00886565341224888,0.573252982795113,-0.558276552587671, + -0.000359412407728299,-0.00831807216754044,0.590388401549789,-0.577183416581488, + -0.000369087957212244,-0.007770490922832,0.607523820304465,-0.596090280575306, + -0.000134570459241534,-0.0204507692890145,0.195503189223776,-0.143304481362205, + -0.000143963687516679,-0.0198935046999725,0.212490573537839,-0.162337389052376, + -0.000153356915791991,-0.0193362401109307,0.229477957851903,-0.181370296742547, + -0.000162750144066914,-0.0187789755218889,0.246465342165966,-0.200403204432718, + -0.000172143372342115,-0.0182217109328471,0.263452726480029,-0.219436112122889, + -0.000181536600617038,-0.0176644463438049,0.280440110794092,-0.23846901981306, + -0.000190929828892183,-0.0171071817547632,0.297427495108155,-0.257501927503231, + -0.000200323057167218,-0.0165499171657213,0.314414879422218,-0.276534835193402, + -0.000209716285442751,-0.0159926525766798,0.331402263736281,-0.295567742883573, + -0.000219109513717619,-0.0154353879876377,0.348389648050344,-0.314600650573744, + -0.000228502741992598,-0.0148781233985955,0.365377032364407,-0.333633558263915, + -0.00023789597026791,-0.0143208588095538,0.382364416678471,-0.352666465954087, + -0.000247289198542888,-0.0137635942205119,0.399351800992534,-0.371699373644258, + -0.000256682426818311,-0.0132063296314704,0.416339185306597,-0.390732281334429, + -0.000266075655093179,-0.0126490650424285,0.43332656962066,-0.4097651890246, + -0.000275468883368268,-0.0120918004533861,0.450313953934723,-0.428798096714771, + -0.000284862111643691,-0.0115345358643453,0.467301338248785,-0.447831004404942, + -0.000294255339918448,-0.0109772712753027,0.484288722562849,-0.466863912095113, + -0.000303648568193426,-0.0104200066862608,0.501276106876912,-0.485896819785284, + -0.000313041796468183,-0.00986274209721816,0.518263491190975,-0.504929727475455, + -0.000322435024743606,-0.00930547750817645,0.535250875505038,-0.523962635165626, + -0.00033182825301914,-0.00874821291913541,0.552238259819101,-0.542995542855797, + -0.000341221481294229,-0.00819094833009348,0.569225644133164,-0.562028450545968, + -0.000350614709568986,-0.00763368374105111,0.586213028447228,-0.58106135823614, + -0.000360007937844409,-0.00707641915200963,0.603200412761291,-0.600094265926311, + -0.000131468518038691,-0.0198422353376262,0.194459226113996,-0.144611580285915, + -0.000140487205163964,-0.0192731635396821,0.211247011635563,-0.163812784445297, + -0.000149505892289348,-0.0187040917417384,0.228034797157131,-0.18301398860468, + -0.000158524579414621,-0.0181350199437945,0.244822582678699,-0.202215192764063, + -0.000167543266540116,-0.017565948145851,0.261610368200266,-0.221416396923446, + -0.000176561953665277,-0.0169968763479069,0.278398153721834,-0.240617601082828, + -0.000185580640790883,-0.0164278045499635,0.295185939243402,-0.259818805242211, + -0.000194599327915934,-0.0158587327520194,0.311973724764969,-0.279020009401594, + -0.000203618015041873,-0.0152896609540762,0.328761510286537,-0.298221213560976, + -0.000212636702166979,-0.0147205891561322,0.345549295808105,-0.317422417720359, + -0.000221655389292197,-0.0141515173581883,0.362337081329672,-0.336623621879742, + -0.000230674076417636,-0.0135824455602447,0.37912486685124,-0.355824826039124, + -0.000239692763542854,-0.0130133737623008,0.395912652372807,-0.375026030198507, + -0.000248711450668737,-0.0124443019643576,0.412700437894375,-0.39422723435789, + -0.000257730137793843,-0.0118752301664133,0.429488223415943,-0.413428438517273, + -0.000266748824919505,-0.0113061583684702,0.44627600893751,-0.432629642676655, + -0.000275767512044278,-0.0107370865705256,0.463063794459078,-0.451830846836038, + -0.000284786199169829,-0.010168014772582,0.479851579980646,-0.471032050995421, + -0.000293804886295268,-0.00959894297463837,0.496639365502213,-0.490233255154803, + -0.000302823573420485,-0.00902987117669429,0.513427151023781,-0.509434459314186, + -0.000311842260545481,-0.00846079937875066,0.530214936545348,-0.528635663473569, + -0.000320860947671697,-0.00789172758080792,0.547002722066916,-0.547836867632951, + -0.000329879634796804,-0.00732265578286384,0.563790507588483,-0.567038071792334, + -0.00033889832192191,-0.00675358398491932,0.580578293110052,-0.586239275951717, + -0.00034791700904746,-0.00618451218697613,0.597366078631619,-0.6054404801111, + -0.000127352300467731,-0.0190570233465511,0.19306238696977,-0.146327746292757, + -0.000135883755368549,-0.0184744025881373,0.209584739482984,-0.165749916650102, + -0.000144415210269588,-0.0178917818297237,0.226107091996198,-0.185172087007447, + -0.000152946665170073,-0.0173091610713094,0.242629444509412,-0.204594257364791, + -0.000161478120071001,-0.0167265403128957,0.259151797022626,-0.224016427722136, + -0.000170009574971486,-0.0161439195544817,0.275674149535839,-0.243438598079481, + -0.000178541029872525,-0.0155612987960678,0.292196502049054,-0.262860768436826, + -0.00018707248477362,-0.0149786780376544,0.308718854562267,-0.282282938794171, + -0.000195603939674216,-0.0143960572792401,0.325241207075481,-0.301705109151515, + -0.000204135394574756,-0.0138134365208258,0.341763559588696,-0.32112727950886, + -0.000212666849475518,-0.0132308157624117,0.35828591210191,-0.340549449866205, + -0.00022119830437628,-0.0126481950039981,0.374808264615123,-0.35997162022355, + -0.000229729759277597,-0.0120655742455851,0.391330617128337,-0.379393790580894, + -0.000238261214178359,-0.0114829534871708,0.407852969641551,-0.398815960938239, + -0.000246792669079121,-0.0109003327287573,0.424375322154765,-0.418238131295584, + -0.000255324123979883,-0.0103177119703433,0.440897674667978,-0.437660301652929, + -0.000263855578880978,-0.00973509121192961,0.457420027181193,-0.457082472010274, + -0.000272387033781407,-0.00915247045351486,0.473942379694407,-0.476504642367618, + -0.000280918488682058,-0.00856984969510122,0.49046473220762,-0.495926812724963, + -0.00028944994358282,-0.00798722893668735,0.506987084720834,-0.515348983082308, + -0.000297981398483804,-0.00740460817827371,0.523509437234048,-0.534771153439653, + -0.00030651285338501,-0.00682198741986006,0.540031789747262,-0.554193323796997, + -0.000315044308285661,-0.00623936666144598,0.556554142260476,-0.573615494154342, + -0.000323575763186756,-0.00565674590303278,0.573076494773689,-0.593037664511687, + -0.000332107218087407,-0.00507412514461869,0.589598847286904,-0.612459834869032, + -0.000121993621610639,-0.0180715621396583,0.191224773067189,-0.148531923754783, + -0.000129907561818077,-0.0174748032975077,0.207400604084888,-0.168237894578677, + -0.000137821502025792,-0.0168780444553571,0.223576435102588,-0.187943865402571, + -0.000145735442233175,-0.0162812856132063,0.239752266120288,-0.207649836226464, + -0.000153649382440724,-0.0156845267710557,0.255928097137988,-0.227355807050358, + -0.000161563322648328,-0.015087767928905,0.272103928155688,-0.247061777874252, + -0.000169477262855822,-0.0144910090867545,0.288279759173387,-0.266767748698146, + -0.000177391203063426,-0.0138942502446036,0.304455590191087,-0.28647371952204, + -0.000185305143270864,-0.0132974914024528,0.320631421208787,-0.306179690345934, + -0.000193219083478358,-0.0127007325603024,0.336807252226487,-0.325885661169828, + -0.00020113302368574,-0.0121039737181516,0.352983083244186,-0.345591631993721, + -0.000209046963893122,-0.0115072148760007,0.369158914261887,-0.365297602817615, + -0.000216960904100505,-0.0109104560338498,0.385334745279586,-0.385003573641509, + -0.000224874844308331,-0.0103136971916993,0.401510576297286,-0.404709544465403, + -0.000232788784515825,-0.00971693834954879,0.417686407314986,-0.424415515289297, + -0.000240702724723318,-0.00912017950739807,0.433862238332686,-0.444121486113191, + -0.000248616664930923,-0.00852342066524758,0.450038069350385,-0.463827456937085, + -0.000256530605138194,-0.00792666182309665,0.466213900368085,-0.483533427760978, + -0.000264444545345688,-0.00732990298094571,0.482389731385785,-0.503239398584872, + -0.00027235848555307,-0.00673314413879433,0.498565562403485,-0.522945369408766, + -0.000280272425761008,-0.00613638529664451,0.514741393421185,-0.54265134023266, + -0.000288186365968501,-0.0055396264544938,0.530917224438884,-0.562357311056553, + -0.000296100306175773,-0.00494286761234264,0.547093055456584,-0.582063281880447, + -0.000304014246383266,-0.00434610877019193,0.563268886474284,-0.601769252704341, + -0.000311928186590538,-0.00374934992804121,0.579444717491984,-0.621475223528236, + -0.000115189896055634,-0.0168776345346261,0.188861450544414,-0.151284179268307, + -0.000122347392235655,-0.016268394858554,0.204595740450284,-0.171344518745477, + -0.000129504888415732,-0.0156591551824822,0.220330030356154,-0.191404858222648, + -0.000136662384595754,-0.0150499155064102,0.236064320262024,-0.211465197699818, + -0.00014381988077572,-0.0144406758303383,0.251798610167894,-0.231525537176989, + -0.000150977376955963,-0.0138314361542664,0.267532900073764,-0.251585876654159, + -0.000158134873135984,-0.0132221964781944,0.283267189979634,-0.271646216131329, + -0.000165292369315617,-0.012612956802122,0.299001479885504,-0.2917065556085, + -0.000172449865495916,-0.0120037171260503,0.314735769791374,-0.31176689508567, + -0.000179607361676215,-0.0113944774499786,0.330470059697245,-0.33182723456284, + -0.000186764857855737,-0.0107852377739062,0.346204349603115,-0.351887574040011, + -0.000193922354035814,-0.0101759980978344,0.361938639508985,-0.371947913517181, + -0.000201079850216113,-0.00956675842176291,0.377672929414854,-0.392008252994351, + -0.000208237346395745,-0.00895751874569051,0.393407219320725,-0.412068592471522, + -0.000215394842575822,-0.00834827906961833,0.409141509226595,-0.432128931948692, + -0.000222552338755899,-0.00773903939354637,0.424875799132465,-0.452189271425862, + -0.000229709834936309,-0.00712979971747485,0.440610089038335,-0.472249610903033, + -0.00023686733111572,-0.00652056004140245,0.456344378944205,-0.492309950380203, + -0.000244024827295686,-0.00591132036533049,0.472078668850075,-0.512370289857373, + -0.000251182323475763,-0.0053020806892583,0.487812958755945,-0.532430629334544, + -0.000258339819655951,-0.00469284101318657,0.503547248661815,-0.552490968811714, + -0.000265497315836249,-0.00408360133711438,0.519281538567686,-0.572551308288884, + -0.000272654812015771,-0.00347436166104265,0.535015828473555,-0.592611647766055, + -0.00027981230819607,-0.00286512198497091,0.550750118379425,-0.612671987243225, + -0.000286969804376258,-0.00225588230889917,0.566484408285295,-0.632732326720396, + -0.000106823067110629,-0.015492604428486,0.18591066072162,-0.154602313414574, + -0.000113093272265052,-0.014875992531985,0.201099550434247,-0.175089881658487, + -0.000119363477419476,-0.0142593806354839,0.216288440146875,-0.1955774499024, + -0.000125633682573734,-0.0136427687389827,0.231477329859503,-0.216065018146313, + -0.000131903887728102,-0.0130261568424817,0.246666219572131,-0.236552586390226, + -0.000138174092882415,-0.0124095449459802,0.261855109284759,-0.257040154634139, + -0.000144444298036672,-0.011792933049479,0.277043998997386,-0.277527722878051, + -0.000150714503191096,-0.0111763211529778,0.292232888710014,-0.298015291121964, + -0.000156984708345465,-0.0105597092564769,0.307421778422642,-0.318502859365877, + -0.000163254913499777,-0.00994309735997545,0.32261066813527,-0.33899042760979, + -0.000169525118653979,-0.00932648546347403,0.337799557847898,-0.359477995853703, + -0.000175795323808292,-0.00870987356697328,0.352988447560525,-0.379965564097616, + -0.000182065528962716,-0.00809326167047186,0.368177337273153,-0.400453132341529, + -0.000188335734116918,-0.00747664977397067,0.383366226985781,-0.420940700585442, + -0.00019460593927112,-0.00686003787746947,0.398555116698409,-0.441428268829355, + -0.000200876144425655,-0.00624342598096828,0.413744006411036,-0.461915837073267, + -0.000207146349579856,-0.00562681408446708,0.428932896123664,-0.48240340531718, + -0.00021341655473428,-0.00501020218796588,0.444121785836292,-0.502890973561093, + -0.000219686759888704,-0.00439359029146491,0.45931067554892,-0.523378541805006, + -0.000225956965043017,-0.00377697839496349,0.474499565261548,-0.543866110048919, + -0.000232227170197219,-0.00316036649846207,0.489688454974176,-0.564353678292832, + -0.000238497375351199,-0.00254375460196021,0.504877344686804,-0.584841246536745, + -0.000244767580505734,-0.00192714270546013,0.520066234399431,-0.605328814780658, + -0.000251037785660047,-0.00131053080895782,0.53525512411206,-0.62581638302457, + -0.00025730799081447,-0.000693918912457736,0.550444013824687,-0.646303951268484, + -9.69322386731308e-05,-0.0139663759823091,0.182361673096866,-0.158437570616758, + -0.000102216042004166,-0.0133517550950321,0.196902353270231,-0.179418950181251, + -0.000107499845335479,-0.0127371342077555,0.211443033443595,-0.200400329745744, + -0.000112783648666626,-0.0121225133204786,0.22598371361696,-0.221381709310236, + -0.00011806745199755,-0.0115078924332014,0.240524393790325,-0.242363088874729, + -0.000123351255328974,-0.0108932715459247,0.25506507396369,-0.263344468439222, + -0.000128635058660009,-0.0102786506586479,0.269605754137054,-0.284325848003715, + -0.000133918861991322,-0.00966402977137104,0.284146434310419,-0.305307227568208, + -0.000139202665322413,-0.00904940888409422,0.298687114483783,-0.3262886071327, + -0.000144486468653726,-0.00843478799681763,0.313227794657148,-0.347269986697193, + -0.000149770271984373,-0.00782016710953992,0.327768474830513,-0.368251366261686, + -0.000155054075316241,-0.00720554622226421,0.342309155003877,-0.389232745826179, + -0.00016033787864711,-0.00659092533498673,0.356849835177242,-0.410214125390672, + -0.000165621681978201,-0.00597630444770969,0.371390515350607,-0.431195504955165, + -0.000170905485309403,-0.00536168356043287,0.385931195523971,-0.452176884519658, + -0.000176189288640938,-0.00474706267315672,0.400471875697336,-0.47315826408415, + -0.000181473091971918,-0.0041324417858799,0.4150125558707,-0.494139643648643, + -0.000186756895302453,-0.0035178208986022,0.429553236044065,-0.515121023213136, + -0.000192040698633988,-0.00290320001132582,0.444093916217429,-0.536102402777629, + -0.000197324501965301,-0.00228857912404923,0.458634596390794,-0.557083782342121, + -0.000202608305296281,-0.00167395823677241,0.473175276564158,-0.578065161906614, + -0.000207892108627816,-0.00105933734949515,0.487715956737524,-0.599046541471107, + -0.000213175911958685,-0.000444716462218775,0.502256636910888,-0.6200279210356, + -0.000218459715289998,0.000169904425058043,0.516797317084252,-0.641009300600093, + -0.000223743518620534,0.000784525312336193,0.531337997257618,-0.661990680164586, + -8.57746917162783e-05,-0.0123793191099448,0.178282454778791,-0.162660423089042, + -9.00298535422839e-05,-0.0117800103967033,0.192087326528341,-0.184185519084017, + -9.4285015368345e-05,-0.0111807016834615,0.205892198277892,-0.205710615078992, + -9.85401771945726e-05,-0.0105813929702202,0.219697070027442,-0.227235711073967, + -0.000102795339020634,-0.00998208425697877,0.233501941776992,-0.248760807068943, + -0.00010705050084675,-0.00938277554373723,0.247306813526542,-0.270285903063918, + -0.000111305662672812,-0.00878346683049558,0.261111685276093,-0.291810999058893, + -0.00011556082449915,-0.00818415811725459,0.274916557025643,-0.313336095053868, + -0.0001198159863251,-0.00758484940401272,0.288721428775193,-0.334861191048843, + -0.000124071148151161,-0.00698554069077106,0.302526300524744,-0.356386287043818, + -0.000128326309977056,-0.00638623197752941,0.316331172274294,-0.377911383038793, + -0.000132581471803062,-0.00578692326428798,0.330136044023844,-0.399436479033768, + -0.000136836633629622,-0.00518761455104655,0.343940915773395,-0.420961575028744, + -0.000141091795455295,-0.00458830583780445,0.357745787522945,-0.442486671023718, + -0.000145346957281633,-0.00398899712456369,0.371550659272495,-0.464011767018694, + -0.000149602119107417,-0.00338968841132159,0.385355531022045,-0.485536863013669, + -0.0001538572809342,-0.00279037969808082,0.399160402771596,-0.507061959008644, + -0.000158112442760205,-0.00219107098483917,0.412965274521146,-0.528587055003619, + -0.000162367604586322,-0.00159176227159774,0.426770146270696,-0.550112150998594, + -0.000166622766412217,-0.00099245355835631,0.440575018020246,-0.571637246993569, + -0.000170877928237667,-0.000393144845113991,0.454379889769796,-0.593162342988544, + -0.000175133090064561,0.000206163868126552,0.468184761519346,-0.614687438983519, + -0.000179388251890789,0.000805472581367539,0.481989633268896,-0.636212534978495, + -0.000183643413716683,0.00140478129460986,0.495794505018447,-0.65773763097347, + -0.000187898575543022,0.00200409000785129,0.509599376767998,-0.679262726968445, + -7.38370526889853e-05,-0.0108280480267909,0.173832451924669,-0.167068536715419, + -7.70950515421309e-05,-0.0102594896346754,0.186844535993324,-0.189161202575035, + -8.035305039511e-05,-0.00969093124255982,0.199856620061979,-0.211253868434651, + -8.36110492481446e-05,-0.00912237285044426,0.212868704130633,-0.233346534294267, + -8.68690481011791e-05,-0.00855381445832859,0.225880788199288,-0.255439200153884, + -9.01270469540472e-05,-0.00798525606621281,0.238892872267943,-0.2775318660135, + -9.33850458071928e-05,-0.00741669767409725,0.251904956336598,-0.299624531873116, + -9.66430446603384e-05,-0.00684813928198169,0.264917040405252,-0.321717197732732, + -9.9901043513595e-05,-0.00627958088986635,0.277929124473907,-0.343809863592349, + -0.000103159042366574,-0.0057110224977508,0.290941208542562,-0.365902529451965, + -0.00010641704121972,-0.00514246410563524,0.303953292611216,-0.387995195311581, + -0.000109675040072643,-0.00457390571351945,0.316965376679871,-0.410087861171198, + -0.0001129330389259,-0.00400534732140412,0.329977460748526,-0.432180527030814, + -0.000116191037778934,-0.00343678892928834,0.34298954481718,-0.45427319289043, + -0.000119449036632302,-0.00286823053717322,0.356001628885835,-0.476365858750047, + -0.000122707035485115,-0.00229967214505744,0.36901371295449,-0.498458524609663, + -0.00012596503433826,-0.00173111375294188,0.382025797023144,-0.520551190469279, + -0.000129223033191295,-0.00116255536082654,0.395037881091799,-0.542643856328895, + -0.000132481032043774,-0.000593996968710098,0.408049965160454,-0.564736522188511, + -0.000135739030897031,-2.54385765949827e-05,0.421062049229108,-0.586829188048128, + -0.000138997029750954,0.000543119815519688,0.434074133297763,-0.608921853907744, + -0.000142255028603877,0.00111167820763569,0.447086217366418,-0.63101451976736, + -0.000145513027456246,0.00168023659975214,0.460098301435073,-0.653107185626976, + -0.000148771026310057,0.00224879499186681,0.473110385503727,-0.675199851486593, + -0.000152029025162981,0.00281735338398237,0.486122469572382,-0.697292517346209, + -6.17683071474917e-05,-0.00940294183231072,0.169246257044863,-0.171421115161163, + -6.41334024594209e-05,-0.00887964466982916,0.181450787364694,-0.19407420041299, + -6.64984977712946e-05,-0.00835634750734748,0.193655317684524,-0.216727285664817, + -6.88635930831683e-05,-0.00783305034486592,0.205859848004355,-0.239380370916645, + -7.1228688395264e-05,-0.00730975318238425,0.218064378324185,-0.262033456168472, + -7.35937837069156e-05,-0.00678645601990224,0.230268908644016,-0.284686541420299, + -7.59588790186227e-05,-0.00626315885742068,0.242473438963847,-0.307339626672126, + -7.83239743304964e-05,-0.0057398616949389,0.254677969283677,-0.329992711923954, + -8.06890696423146e-05,-0.00521656453245711,0.266882499603508,-0.352645797175781, + -8.30541649542438e-05,-0.00469326736997533,0.279087029923339,-0.375298882427608, + -8.54192602656179e-05,-0.0041699702074931,0.291291560243169,-0.397951967679435, + -8.77843555781022e-05,-0.00364667304501221,0.303496090563,-0.420605052931263, + -9.01494508894762e-05,-0.00312337588252998,0.315700620882831,-0.44325813818309, + -9.25145462017385e-05,-0.00260007872004908,0.327905151202661,-0.465911223434917, + -9.48796415134456e-05,-0.00207678155756708,0.340109681522492,-0.488564308686744, + -9.72447368254858e-05,-0.00155348439508551,0.352314211842322,-0.511217393938571, + -9.96098321375261e-05,-0.00103018723260417,0.364518742162153,-0.533870479190399, + -0.000101974927449122,-0.000506890070122168,0.376723272481983,-0.556523564442226, + -0.000104340022760718,1.64070923598381e-05,0.388927802801814,-0.579176649694053, + -0.000106705118072981,0.000539704254840956,0.401132333121644,-0.601829734945881, + -0.000109070213384355,0.00106300141732341,0.413336863441475,-0.624482820197708, + -0.000111435308696173,0.00158629857980497,0.425541393761306,-0.647135905449535, + -0.000113800404008102,0.00210959574228653,0.437745924081136,-0.669788990701362, + -0.000116165499320364,0.00263289290476809,0.449950454400967,-0.69244207595319, + -0.000118530594632293,0.00315619006724965,0.462154984720798,-0.715095161205017, + -5.02457493531949e-05,-0.00816761850920722,0.164787179220487,-0.175489138843553, + -5.18740934261075e-05,-0.00770009295342611,0.176214713051117,-0.198666005432811, + -5.35024374995752e-05,-0.00723256739764577,0.187642246881747,-0.221842872022069, + -5.51307815720992e-05,-0.00676504184186411,0.199069780712377,-0.245019738611328, + -5.67591256454558e-05,-0.00629751628608344,0.210497314543007,-0.268196605200586, + -5.83874697183684e-05,-0.0058299907303021,0.221924848373637,-0.291373471789844, + -6.0015813791725e-05,-0.00536246517452166,0.233352382204267,-0.314550338379102, + -6.16441578645266e-05,-0.00489493961874055,0.244779916034897,-0.337727204968361, + -6.32725019376612e-05,-0.00442741406295966,0.256207449865527,-0.360904071557619, + -6.49008460109624e-05,-0.00395988850717854,0.267634983696157,-0.384080938146877, + -6.65291900837639e-05,-0.00349236295139765,0.279062517526787,-0.407257804736135, + -6.81575341571206e-05,-0.00302483739561721,0.290490051357417,-0.430434671325393, + -6.97858782299221e-05,-0.0025573118398361,0.301917585188047,-0.453611537914652, + -7.14142223033898e-05,-0.00208978628405476,0.313345119018677,-0.47678840450391, + -7.30425663758583e-05,-0.00162226072827343,0.324772652849307,-0.499965271093168, + -7.46709104492149e-05,-0.0011547351724932,0.336200186679937,-0.523142137682426, + -7.62992545226826e-05,-0.000687209616712536,0.347627720510567,-0.546319004271684, + -7.79275985953731e-05,-0.000219684060930758,0.359055254341197,-0.569495870860942, + -7.95559426683967e-05,0.000247841494849688,0.370482788171827,-0.592672737450201, + -8.11842867418644e-05,0.000715367050630356,0.381910322002457,-0.615849604039459, + -8.2812630814777e-05,0.00118289260641147,0.393337855833087,-0.639026470628717, + -8.44409748874675e-05,0.00165041816219302,0.404765389663717,-0.662203337217975, + -8.60693189610462e-05,0.00211794371797325,0.416192923494346,-0.685380203807234, + -8.76976630342918e-05,0.00258546927375392,0.427620457324976,-0.708557070396492, + -8.93260071060942e-05,0.0030529948295368,0.439047991155607,-0.73173393698575, + -3.98286669491266e-05,-0.00714976942538137,0.16068871371924,-0.179100605803067, + -4.08957117294384e-05,-0.00674272518123153,0.171408449587027,-0.202742469438024, + -4.19627565096947e-05,-0.00633568093708159,0.182128185454815,-0.22638433307298, + -4.30298012898955e-05,-0.00592863669293209,0.192847921322602,-0.250026196707937, + -4.40968460703739e-05,-0.00552159244878214,0.203567657190389,-0.273668060342893, + -4.51638908506857e-05,-0.00511454820463264,0.214287393058177,-0.29730992397785, + -4.6230935630831e-05,-0.00470750396048247,0.225007128925964,-0.320951787612806, + -4.72979804109208e-05,-0.00430045971633253,0.235726864793751,-0.344593651247763, + -4.83650251914547e-05,-0.00389341547218303,0.246446600661539,-0.36823551488272, + -4.94320699717665e-05,-0.00348637122803308,0.257166336529326,-0.391877378517676, + -5.04991147518563e-05,-0.00307932698388336,0.267886072397113,-0.415519242152632, + -5.15661595321681e-05,-0.00267228273973319,0.278605808264901,-0.439161105787589, + -5.26332043121469e-05,-0.00226523849558302,0.289325544132689,-0.462802969422546, + -5.37002490923477e-05,-0.00185819425143308,0.300045280000476,-0.486444833057502, + -5.47672938733257e-05,-0.00145115000728424,0.310765015868263,-0.510086696692459, + -5.58343386533044e-05,-0.00104410576313407,0.32148475173605,-0.533728560327415, + -5.69013834336163e-05,-0.000637061518984128,0.332204487603838,-0.557370423962372, + -5.79684282138171e-05,-0.00023001727483396,0.342924223471625,-0.581012287597328, + -5.90354729941289e-05,0.000177026969315541,0.353643959339413,-0.604654151232285, + -6.01025177747738e-05,0.000584071213464821,0.3643636952072,-0.628296014867241, + -6.11695625541975e-05,0.000991115457615432,0.375083431074987,-0.651937878502198, + -6.22366073348424e-05,0.00139815970176516,0.385803166942775,-0.675579742137154, + -6.33036521147101e-05,0.00180520394591532,0.396522902810562,-0.699221605772111, + -6.4370696895466e-05,0.00221224819006505,0.407242638678349,-0.722863469407067, + -6.54377416753338e-05,0.00261929243421477,0.417962374546136,-0.746505333042024, + -3.08630215203887e-05,-0.00634508766070307,0.157110012297973,-0.182163256815249, + -3.15327649793029e-05,-0.00599745926084072,0.167216241223128,-0.206199454300863, + -3.22025084378286e-05,-0.00564983086097781,0.177322470148283,-0.230235651786478, + -3.28722518966873e-05,-0.00530220246111524,0.187428699073438,-0.254271849272092, + -3.35419953556015e-05,-0.00495457406125288,0.197534927998593,-0.278308046757706, + -3.42117388142937e-05,-0.00460694566139019,0.207641156923748,-0.302344244243321, + -3.48814822726529e-05,-0.00425931726152706,0.217747385848903,-0.326380441728935, + -3.55512257316781e-05,-0.00391168886166482,0.227853614774057,-0.35041663921455, + -3.62209691905369e-05,-0.00356406046180191,0.237959843699213,-0.374452836700164, + -3.68907126495621e-05,-0.00321643206194011,0.248066072624367,-0.398489034185779, + -3.75604561083653e-05,-0.00286880366207765,0.258172301549522,-0.422525231671393, + -3.82301995670575e-05,-0.00252117526221451,0.268278530474677,-0.446561429157007, + -3.88999430260828e-05,-0.00217354686235205,0.278384759399832,-0.470597626642622, + -3.95696864842199e-05,-0.00182591846248914,0.288490988324987,-0.494633824128236, + -4.02394299429121e-05,-0.00147829006262623,0.298597217250142,-0.518670021613851, + -4.09091734019373e-05,-0.00113066166276399,0.308703446175297,-0.542706219099465, + -4.15789168606295e-05,-0.0007830332629013,0.318809675100452,-0.56674241658508, + -4.22486603195438e-05,-0.000435404863039057,0.328915904025607,-0.590778614070694, + -4.29184037781249e-05,-8.7776463176148e-05,0.339022132950762,-0.614814811556309, + -4.35881472364841e-05,0.000259851936687205,0.349128361875917,-0.638851009041923, + -4.42578906960645e-05,0.000607480336548782,0.359234590801072,-0.662887206527538, + -4.49276341543126e-05,0.000955108736412136,0.369340819726227,-0.686923404013152, + -4.55973776126717e-05,0.00130273713627505,0.379447048651382,-0.710959601498766, + -4.6267121071808e-05,0.00165036553613751,0.389553277576537,-0.734995798984381, + -4.69368645303891e-05,0.00199799393599998,0.399659506501691,-0.759031996469996, + -2.34654365861009e-05,-0.00572873408547392,0.154121093793554,-0.184661237270783, + -2.38714375595528e-05,-0.00543511228029048,0.163717912761929,-0.209019064040303, + -2.42774385328937e-05,-0.00514149047510659,0.173314731730304,-0.233376890809823, + -2.46834395060125e-05,-0.00484786866992226,0.182911550698678,-0.257734717579342, + -2.50894404796309e-05,-0.00455424686473882,0.192508369667053,-0.282092544348862, + -2.54954414533048e-05,-0.0042606250595556,0.202105188635427,-0.306450371118381, + -2.59014424264237e-05,-0.00396700325437127,0.211702007603802,-0.330808197887901, + -2.63074433996535e-05,-0.00367338144918739,0.221298826572177,-0.355166024657421, + -2.67134443730499e-05,-0.0033797596440035,0.230895645540552,-0.37952385142694, + -2.71194453466128e-05,-0.00308613783882028,0.240492464508926,-0.40388167819646, + -2.75254463197872e-05,-0.00279251603363617,0.250089283477301,-0.428239504965979, + -2.79314472934056e-05,-0.00249889422845251,0.259686102445676,-0.452597331735499, + -2.8337448266913e-05,-0.00220527242326884,0.26928292141405,-0.476955158505019, + -2.87434492396432e-05,-0.00191165061808407,0.278879740382425,-0.501312985274538, + -2.91494502137057e-05,-0.0016180288129013,0.288476559350799,-0.525670812044058, + -2.9555451186658e-05,-0.00132440700771697,0.298073378319174,-0.550028638813577, + -2.99614521601654e-05,-0.0010307852025333,0.307670197287549,-0.574386465583097, + -3.03674531336728e-05,-0.00073716339734986,0.317267016255923,-0.598744292352617, + -3.07734541065141e-05,-0.000443541592165086,0.326863835224298,-0.623102119122136, + -3.11794550801325e-05,-0.000149919786981645,0.336460654192673,-0.647459945891656, + -3.1585456054084e-05,0.000143702018201353,0.346057473161048,-0.671817772661175, + -3.19914570269253e-05,0.000437323823386127,0.355654292129422,-0.696175599430695, + -3.23974580007658e-05,0.000730945628569568,0.365251111097797,-0.720533426200214, + -3.2803458973385e-05,0.0010245674337539,0.374847930066172,-0.744891252969734, + -3.32094599468924e-05,0.00131818923893734,0.384444749034546,-0.769249079739254, + -1.75698002736757e-05,-0.00526730203784365,0.151715287091405,-0.186634700644663, + -1.78097376261621e-05,-0.0050198819015348,0.160903931766359,-0.211246622121108, + -1.8049674978371e-05,-0.00477246176522572,0.170092576441312,-0.235858543597553, + -1.82896123306908e-05,-0.00452504162891643,0.179281221116265,-0.260470465073998, + -1.85295496830107e-05,-0.00427762149260746,0.188469865791218,-0.285082386550442, + -1.87694870354971e-05,-0.00403020135629872,0.197658510466171,-0.309694308026887, + -1.90094243879835e-05,-0.00378278121998954,0.206847155141125,-0.334306229503332, + -1.92493617401923e-05,-0.0035353610836808,0.216035799816078,-0.358918150979777, + -1.94892990925677e-05,-0.00328794094737161,0.225224444491031,-0.383530072456222, + -1.97292364448876e-05,-0.00304052081106199,0.234413089165985,-0.408141993932666, + -1.99691737972074e-05,-0.00279310067475325,0.243601733840938,-0.432753915409111, + -2.02091111494163e-05,-0.00254568053844384,0.252790378515891,-0.457365836885556, + -2.04490485019582e-05,-0.0022982604021351,0.261979023190845,-0.481977758362001, + -2.0688985853945e-05,-0.00205084026582614,0.271167667865797,-0.506589679838446, + -2.09289232065979e-05,-0.00180342012951695,0.280356312540751,-0.531201601314891, + -2.11688605592508e-05,-0.00155599999320799,0.289544957215705,-0.555813522791335, + -2.14087979112376e-05,-0.00130857985689925,0.298733601890657,-0.58042544426778, + -2.16487352634465e-05,-0.00106115972059007,0.307922246565611,-0.605037365744225, + -2.18886726162104e-05,-0.000813739584281326,0.317110891240564,-0.62964928722067, + -2.21286099686413e-05,-0.000566319447972141,0.326299535915517,-0.654261208697115, + -2.23685473206281e-05,-0.000318899311662069,0.335488180590471,-0.678873130173559, + -2.26084846736141e-05,-7.14791753546606e-05,0.344676825265423,-0.703485051650004, + -2.28484220258229e-05,0.000175940960955412,0.353865469940378,-0.728096973126449, + -2.30883593773656e-05,0.00042336109726504,0.363054114615331,-0.752708894602894, + -2.33282967300186e-05,0.000670781233573337,0.372242759290283,-0.777320816079339, + -1.29988369886869e-05,-0.00492726123474363,0.14983531434508,-0.188154861990617, + -1.31384097043497e-05,-0.00471756382775512,0.15870609417851,-0.212962512942861, + -1.32779824197904e-05,-0.0045078664207665,0.16757687401194,-0.237770163895106, + -1.34175551355642e-05,-0.00429816901377789,0.176447653845371,-0.26257781484735, + -1.35571278511715e-05,-0.00408847160678949,0.185318433678801,-0.287385465799594, + -1.36967005668343e-05,-0.00387877419980098,0.194189213512232,-0.312193116751839, + -1.38362732826081e-05,-0.00366907679281248,0.203059993345662,-0.337000767704083, + -1.39758459979933e-05,-0.00345937938582375,0.211930773179092,-0.361808418656327, + -1.41154187138781e-05,-0.00324968197883568,0.220801553012523,-0.386616069608572, + -1.42549914290413e-05,-0.00303998457184651,0.229672332845953,-0.411423720560816, + -1.43945641449816e-05,-0.00283028716485845,0.238543112679384,-0.436231371513061, + -1.45341368604779e-05,-0.0026205897578695,0.247413892512814,-0.461039022465305, + -1.46737095763072e-05,-0.00241089235088165,0.256284672346244,-0.485846673417549, + -1.48132822920255e-05,-0.0022011949438927,0.265155452179675,-0.510654324369794, + -1.49528550076328e-05,-0.0019914975369042,0.274026232013105,-0.535461975322038, + -1.50924277234621e-05,-0.00178180012991591,0.282897011846536,-0.560269626274282, + -1.52320004380702e-05,-0.00157210272292652,0.291767791679966,-0.585077277226527, + -1.53715731545656e-05,-0.00136240531593845,0.300638571513397,-0.609884928178771, + -1.55111458700619e-05,-0.00115270790894995,0.309509351346827,-0.634692579131016, + -1.56507185856691e-05,-0.000943010501961439,0.318380131180257,-0.65950023008326, + -1.57902913018315e-05,-0.00073331309497382,0.327250911013687,-0.684307881035504, + -1.59298640171057e-05,-0.000523615687984869,0.336121690847118,-0.709115531987749, + -1.60694367321579e-05,-0.000313918280995473,0.344992470680549,-0.733923182939993, + -1.62090094482092e-05,-0.00010422087400741,0.353863250513979,-0.758730833892237, + -1.63485821641496e-05,0.000105476532980653,0.362734030347409,-0.783538484844482, + -9.52952976085442e-06,-0.00467930274466644,0.148399727317786,-0.18930319644232, + -9.61019634404536e-06,-0.00449933484683085,0.15702840182311,-0.214258702029122, + -9.69086292679222e-06,-0.0043193669489946,0.165657076328434,-0.239214207615924, + -9.77152950942806e-06,-0.00413939905115812,0.174285750833759,-0.264169713202726, + -9.85219609250798e-06,-0.0039594311533222,0.182914425339083,-0.289125218789528, + -9.93286267508831e-06,-0.00377946325548595,0.191543099844407,-0.31408072437633, + -1.00135292576686e-05,-0.00359949535764947,0.200171774349731,-0.339036229963132, + -1.00941958409151e-05,-0.00341952745981389,0.208800448855055,-0.363991735549934, + -1.0174862423773e-05,-0.00323955956197763,0.217429123360379,-0.388947241136736, + -1.02555290061312e-05,-0.00305959166414094,0.226057797865703,-0.413902746723538, + -1.03361955895442e-05,-0.00287962376630535,0.234686472371027,-0.43885825231034, + -1.04168621722911e-05,-0.00269965586846954,0.243315146876351,-0.463813757897141, + -1.04975287549269e-05,-0.00251968797063262,0.251943821381676,-0.488769263483943, + -1.05781953376738e-05,-0.00233972007279681,0.260572495886999,-0.513724769070745, + -1.06588619205317e-05,-0.00215975217496078,0.269201170392323,-0.538680274657547, + -1.07395285028344e-05,-0.00197978427712342,0.277829844897648,-0.563635780244349, + -1.08201950864695e-05,-0.00179981637928828,0.286458519402972,-0.588591285831151, + -1.09008616695494e-05,-0.00161984848145291,0.295087193908296,-0.613546791417953, + -1.09815282514081e-05,-0.00143988058361488,0.303715868413621,-0.638502297004755, + -1.10621948348211e-05,-0.00125991268577952,0.312344542918944,-0.663457802591557, + -1.11428614174569e-05,-0.00107994478794371,0.320973217424268,-0.688413308178359, + -1.12235280003148e-05,-0.000899976890107457,0.329601891929592,-0.713368813765161, + -1.13041945828396e-05,-0.000720008992271204,0.338230566434916,-0.738324319351963, + -1.13848611661416e-05,-0.000540041094434951,0.346859240940241,-0.763279824938765, + -1.14655277494435e-05,-0.000360073196599586,0.355487915445565,-0.788235330525567, + -6.93841706522758e-06,-0.00449973119030489,0.1473225677922,-0.190157917874099, + -6.98514141661555e-06,-0.00434258173950808,0.155769928491412,-0.215223473738289, + -7.0318657683921e-06,-0.00418543228871182,0.164217289190624,-0.240289029602479, + -7.07859011983558e-06,-0.00402828283791501,0.172664649889836,-0.265354585466668, + -7.12531447155662e-06,-0.00387113338711842,0.181112010589048,-0.290420141330858, + -7.17203882294459e-06,-0.00371398393632161,0.189559371288261,-0.315485697195048, + -7.2187631744991e-06,-0.00355683448552502,0.198006731987473,-0.340551253059238, + -7.26548752577605e-06,-0.00339968503472821,0.206454092686685,-0.365616808923428, + -7.31221187760811e-06,-0.00324253558393162,0.214901453385898,-0.390682364787618, + -7.35893622894057e-06,-0.00308538613313503,0.223348814085109,-0.415747920651808, + -7.40566058066161e-06,-0.00292823668233888,0.231796174784321,-0.440813476515998, + -7.45238493216061e-06,-0.00277108723154229,0.240243535483533,-0.465879032380188, + -7.49910928377062e-06,-0.00261393778074548,0.248690896182746,-0.490944588244377, + -7.54583363526962e-06,-0.00245678832994889,0.257138256881958,-0.516010144108567, + -7.59255798665759e-06,-0.00229963887915186,0.265585617581171,-0.541075699972757, + -7.63928233860067e-06,-0.00214248942835571,0.274032978280383,-0.566141255836947, + -7.68600668998864e-06,-0.0019853399775589,0.282480338979595,-0.591206811701137, + -7.73273104182071e-06,-0.00182819052676297,0.290927699678807,-0.616272367565327, + -7.77945539343072e-06,-0.00167104107596616,0.299375060378019,-0.641337923429517, + -7.82617974415256e-06,-0.00151389162516891,0.307822421077231,-0.666403479293707, + -7.87290409598462e-06,-0.00135674217437254,0.316269781776443,-0.691469035157897, + -7.91962844748362e-06,-0.00119959272357528,0.324717142475656,-0.716534591022087, + -7.96635279931568e-06,-0.0010424432727798,0.333164503174867,-0.741600146886277, + -8.01307715114774e-06,-0.000885293821983435,0.34161186387408,-0.766665702750467, + -8.05980150186958e-06,-0.000728144371186179,0.350059224573292,-0.791731258614656, + -5.02626280407537e-06,-0.0043702633250704,0.146524908328217,-0.190787121784692, + -5.05359496510982e-06,-0.00423028864211605,0.154838188589072,-0.215933691254391, + -5.08092712597774e-06,-0.00409031395916126,0.163151468849927,-0.24108026072409, + -5.10825928679015e-06,-0.0039503392762068,0.171464749110782,-0.266226830193789, + -5.13559144760256e-06,-0.00381036459325235,0.179778029371637,-0.291373399663488, + -5.16292360847048e-06,-0.00367038991029767,0.188091309632492,-0.316519969133187, + -5.19025576917187e-06,-0.00353041522734276,0.196404589893347,-0.341666538602886, + -5.21758792992877e-06,-0.00339044054438853,0.204717870154201,-0.366813108072586, + -5.24492009107425e-06,-0.00325046586143407,0.213031150415056,-0.391959677542285, + -5.27225225188666e-06,-0.00311049117847939,0.221344430675911,-0.417106247011984, + -5.29958441275458e-06,-0.00297051649552493,0.229657710936766,-0.442252816481683, + -5.3269165736225e-06,-0.0028305418125707,0.237970991197621,-0.467399385951382, + -5.3542487343794e-06,-0.00269056712961557,0.246284271458476,-0.492545955421081, + -5.3815808951363e-06,-0.00255059244666134,0.254597551719331,-0.51769252489078, + -5.40891305611524e-06,-0.00241061776370666,0.262910831980186,-0.542839094360479, + -5.43624521653907e-06,-0.00227064308075198,0.271224112241041,-0.567985663830178, + -5.46357737762904e-06,-0.00213066839779774,0.279537392501896,-0.593132233299878, + -5.49090953838594e-06,-0.00199069371484306,0.287850672762751,-0.618278802769577, + -5.5182416994759e-06,-0.00185071903188883,0.296163953023605,-0.643425372239276, + -5.54557386045484e-06,-0.00171074434893415,0.304477233284461,-0.668571941708974, + -5.57290602054561e-06,-0.00157076966597858,0.312790513545316,-0.693718511178674, + -5.60023818163558e-06,-0.0014307949830239,0.321103793806171,-0.718865080648373, + -5.62757034272554e-06,-0.00129082030007011,0.329417074067025,-0.744011650118072, + -5.65490250359346e-06,-0.00115084561711587,0.33773035432788,-0.769158219587771, + -5.68223466412832e-06,-0.0010108709341603,0.346043634588736,-0.79430478905747, + -3.62755830696226e-06,-0.0042771878494583,0.145939943446299,-0.191246560306296, + -3.64380671474818e-06,-0.00414995611860303,0.15415499479461,-0.216452285115811, + -3.66005512225653e-06,-0.00402272438774809,0.162370046142922,-0.241658009925327, + -3.67630353009796e-06,-0.00389549265689337,0.170585097491233,-0.266863734734842, + -3.69255193793938e-06,-0.00376826092603855,0.178800148839545,-0.292069459544358, + -3.70880034550325e-06,-0.00364102919518361,0.187015200187856,-0.317275184353873, + -3.72504875323365e-06,-0.00351379746432889,0.195230251536167,-0.342480909163389, + -3.74129716124161e-06,-0.00338656573347418,0.203445302884479,-0.367686633972904, + -3.75754556847241e-06,-0.0032593340026188,0.21166035423279,-0.39289235878242, + -3.77379397620281e-06,-0.00313210227176408,0.219875405581101,-0.418098083591935, + -3.79004238360015e-06,-0.00300487054090848,0.228090456929413,-0.443303808401451, + -3.80629079166361e-06,-0.00287763881005398,0.236305508277725,-0.468509533210966, + -3.82253919950504e-06,-0.00275040707919927,0.244520559626036,-0.493715258020482, + -3.83878760701339e-06,-0.00262317534834411,0.252735610974347,-0.518920982829997, + -3.85503601518788e-06,-0.00249594361748984,0.260950662322659,-0.544126707639513, + -3.87128442269624e-06,-0.00236871188663446,0.26916571367097,-0.569332432449028, + -3.88753283009358e-06,-0.00224148015577974,0.277380765019281,-0.594538157258544, + -3.90378123782398e-06,-0.0021142484249248,0.285595816367593,-0.619743882068059, + -3.92002964588745e-06,-0.00198701669406987,0.293810867715905,-0.644949606877575, + -3.93627805361785e-06,-0.00185978496321493,0.302025919064216,-0.67015533168709, + -3.95252646123723e-06,-0.00173255323236043,0.310240970412527,-0.695361056496606, + -3.96877486852354e-06,-0.00160532150150461,0.318456021760839,-0.720566781306121, + -3.98502327647599e-06,-0.00147808977065012,0.32667107310915,-0.745772506115637, + -4.00127168398434e-06,-0.00135085803979562,0.334886124457461,-0.770978230925152, + -4.01752009193679e-06,-0.00122362630894068,0.343101175805773,-0.796183955734667, + -2.61100534154624e-06,-0.00421040060462718,0.145514005514239,-0.191580049986481, + -2.62086634805758e-06,-0.00409252543945515,0.153657584412099,-0.216828713501458, + -2.63072735451342e-06,-0.00397465027428312,0.161801163309958,-0.242077377016434, + -2.64058836130232e-06,-0.00385677510911131,0.169944742207818,-0.267326040531411, + -2.65044936753611e-06,-0.00373889994393917,0.178088321105677,-0.292574704046388, + -2.66031037399195e-06,-0.00362102477876713,0.186231900003537,-0.317823367561364, + -2.67017138078085e-06,-0.00350314961359532,0.194375478901397,-0.343072031076341, + -2.6800323872922e-06,-0.00338527444842329,0.202519057799256,-0.368320694591317, + -2.68989339347048e-06,-0.00326739928325082,0.210662636697116,-0.393569358106294, + -2.69975440014836e-06,-0.00314952411807901,0.218806215594975,-0.418818021621271, + -2.70961540638215e-06,-0.00303164895290631,0.226949794492835,-0.444066685136247, + -2.71947641294901e-06,-0.00291377378773494,0.235093373390695,-0.469315348651224, + -2.72933741940484e-06,-0.00279589862256291,0.243236952288554,-0.4945640121662, + -2.73919842586068e-06,-0.00267802345739065,0.251380531186414,-0.519812675681177, + -2.74905943253856e-06,-0.00256014829221884,0.259524110084273,-0.545061339196154, + -2.75892043855031e-06,-0.00244227312704615,0.267667688982133,-0.57031000271113, + -2.76878144533921e-06,-0.00232439796187478,0.275811267879992,-0.595558666226107, + -2.77864245190607e-06,-0.00220652279670253,0.283954846777852,-0.620807329741083, + -2.78850345847292e-06,-0.00208864763153072,0.292098425675712,-0.64605599325606, + -2.79836446503978e-06,-0.00197077246635891,0.300242004573571,-0.671304656771037, + -2.80822547149562e-06,-0.00185289730118665,0.308385583471431,-0.696553320286013, + -2.81808647784043e-06,-0.00173502213601395,0.316529162369291,-0.72180198380099, + -2.82794748451831e-06,-0.00161714697084303,0.32467274126715,-0.747050647315967, + -2.8378084907521e-06,-0.00149927180567033,0.33281632016501,-0.772299310830943, + -2.84766949720794e-06,-0.00138139664049808,0.34095989906287,-0.79754797434592, + -1.87564079440206e-06,-0.00416253595712757,0.145205466442737,-0.191821075165852, + -1.88176578169719e-06,-0.00405147914047299,0.153297299696321,-0.217100772052476, + -1.88789076921436e-06,-0.00394042232381853,0.161389132949905,-0.2423804689391, + -1.894015756565e-06,-0.00382936550716395,0.169480966203489,-0.267660165825724, + -1.90014074441525e-06,-0.00371830869050993,0.177572799457073,-0.292939862712348, + -1.90626573176589e-06,-0.00360725187385547,0.185664632710657,-0.318219559598971, + -1.91239071928306e-06,-0.00349619505720078,0.193756465964242,-0.343499256485595, + -1.91851570668922e-06,-0.00338513824054631,0.201848299217826,-0.368778953372219, + -1.92464069398435e-06,-0.00327408142389163,0.20994013247141,-0.394058650258843, + -1.93076568111294e-06,-0.00316302460723672,0.218031965724994,-0.419338347145467, + -1.93689066885216e-06,-0.00305196779058226,0.226123798978578,-0.444618044032091, + -1.94301565670241e-06,-0.00294091097392868,0.234215632232162,-0.469897740918715, + -1.94914064421958e-06,-0.00282985415727421,0.242307465485746,-0.495177437805338, + -1.95526563140369e-06,-0.00271879734061931,0.25039929873933,-0.520457134691962, + -1.96139061903189e-06,-0.00260774052396484,0.258491131992915,-0.545736831578586, + -1.967515606216e-06,-0.00249668370730993,0.266582965246499,-0.57101652846521, + -1.97364059362215e-06,-0.00238562689065569,0.274674798500083,-0.596296225351834, + -1.97976558136137e-06,-0.00227457007400167,0.282766631753667,-0.621575922238458, + -1.98589056954468e-06,-0.00216351325734809,0.29085846500725,-0.646855619125081, + -1.99201555639572e-06,-0.0020524564406923,0.298950298260835,-0.672135316011705, + -1.99814054357983e-06,-0.00194139962403783,0.307042131514419,-0.697415012898329, + -2.00426553131905e-06,-0.00183034280738381,0.315133964768003,-0.722694709784953, + -2.01039051850316e-06,-0.0017192859907289,0.323225798021587,-0.747974406671577, + -2.01651550657544e-06,-0.00160822917407533,0.331317631275171,-0.773254103558201, + -2.02264049375955e-06,-0.00149717235742042,0.339409464528755,-0.798533800444825, + -1.3454801545687e-06,-0.00412826093108687,0.144982806035451,-0.191994729850861, + -1.34937590040574e-06,-0.00402214576337145,0.153037310654293,-0.217296785772305, + -1.35327164613175e-06,-0.00391603059565615,0.161091815273134,-0.24259884169375, + -1.35716739207981e-06,-0.00380991542794085,0.169146319891976,-0.267900897615194, + -1.3610631381944e-06,-0.00370380026022588,0.177200824510817,-0.293202953536638, + -1.36495888403143e-06,-0.00359768509251079,0.185255329129659,-0.318505009458083, + -1.36885462981295e-06,-0.00349156992479527,0.193309833748501,-0.343807065379527, + -1.37275037603857e-06,-0.00338545475708041,0.201364338367342,-0.369109121300971, + -1.37664612170907e-06,-0.00327933958936466,0.209418842986184,-0.394411177222416, + -1.38054186749059e-06,-0.00317322442164958,0.217473347605025,-0.41971323314386, + -1.38443761388274e-06,-0.00306710925393472,0.225527852223867,-0.445015289065304, + -1.38833335949773e-06,-0.00296099408621919,0.233582356842708,-0.470317344986749, + -1.39222910533476e-06,-0.00285487891850411,0.24163686146155,-0.495619400908193, + -1.3961248511718e-06,-0.00274876375078881,0.249691366080391,-0.520921456829637, + -1.40002059689781e-06,-0.00264264858307306,0.257745870699233,-0.546223512751082, + -1.40391634295689e-06,-0.00253653341535798,0.265800375318075,-0.571525568672526, + -1.40781208912699e-06,-0.00243041824764334,0.273854879936916,-0.59682762459397, + -1.411707834853e-06,-0.00232430307992759,0.281909384555758,-0.622129680515415, + -1.41560358113413e-06,-0.00221818791221295,0.289963889174599,-0.647431736436859, + -1.4194993266381e-06,-0.00211207274449698,0.298018393793441,-0.672733792358303, + -1.42339507303024e-06,-0.00200595757678235,0.306072898412283,-0.698035848279748, + -1.42729081886728e-06,-0.00189984240906771,0.314127403031124,-0.723337904201192, + -1.43118656459329e-06,-0.00179372724135174,0.322181907649966,-0.748639960122636, + -1.43508230998624e-06,-0.00168761207363577,0.330236412268808,-0.773942016044081, + -1.43897805582327e-06,-0.00158149690592069,0.338290916887649,-0.799244071965525, + -0.000157740819841989,-0.0254151520084142,0.209918431044634,-0.14078812449481, + -0.000169289483192614,-0.0249743980106578,0.227861594053555,-0.158434063167546, + -0.000180838146542961,-0.024533644012901,0.245804757062477,-0.176080001840282, + -0.000192386809893585,-0.0240928900151447,0.263747920071397,-0.193725940513019, + -0.00020393547324421,-0.0236521360173881,0.281691083080319,-0.211371879185755, + -0.000215484136594613,-0.0232113820196314,0.29963424608924,-0.229017817858491, + -0.000227032799945515,-0.0227706280218753,0.317577409098161,-0.246663756531227, + -0.000238581463295862,-0.0223298740241187,0.335520572107082,-0.264309695203964, + -0.000250130126646653,-0.0218891200263625,0.353463735116003,-0.2819556338767, + -0.000261678789996944,-0.0214483660286056,0.371406898124924,-0.299601572549436, + -0.00027322745334768,-0.0210076120308493,0.389350061133845,-0.317247511222172, + -0.000284776116698082,-0.0205668580330929,0.407293224142766,-0.334893449894909, + -0.000296324780048485,-0.0201261040353362,0.425236387151687,-0.352539388567645, + -0.000307873443399664,-0.0196853500375802,0.443179550160609,-0.370185327240381, + -0.000319422106749956,-0.0192445960398235,0.46112271316953,-0.387831265913117, + -0.000330970770100247,-0.0188038420420666,0.479065876178451,-0.405477204585854, + -0.00034251943345065,-0.0183630880443097,0.497009039187372,-0.42312314325859, + -0.000354068096801941,-0.0179223340465546,0.514952202196293,-0.440769081931326, + -0.000365616760151788,-0.0174815800487969,0.532895365205215,-0.458415020604062, + -0.000377165423502857,-0.0170408260510411,0.550838528214135,-0.476060959276798, + -0.000388714086853481,-0.0166000720532851,0.568781691223056,-0.493706897949535, + -0.00040026275020455,-0.0161593180555291,0.586724854231977,-0.511352836622271, + -0.000411811413554508,-0.0157185640577717,0.604668017240898,-0.528998775295007, + -0.000423360076905133,-0.0152778100600148,0.62261118024982,-0.546644713967744, + -0.000434908740255535,-0.0148370560622584,0.640554343258741,-0.56429065264048, + -0.000155619073621271,-0.0249192899988971,0.209225139844652,-0.141760038219477, + -0.000166898779435931,-0.0244643115463761,0.22703863488966,-0.159524034970541, + -0.000178178485250369,-0.0240093330938547,0.244852129934667,-0.177288031721605, + -0.000189458191065361,-0.0235543546413336,0.262665624979675,-0.195052028472669, + -0.000200737896880188,-0.0230993761888126,0.280479120024683,-0.212816025223733, + -0.000212017602694792,-0.0226443977362916,0.29829261506969,-0.230580021974797, + -0.000223297308509895,-0.0221894192837706,0.316106110114698,-0.248344018725861, + -0.000234577014323945,-0.0217344408312488,0.333919605159706,-0.266108015476925, + -0.000245856720138937,-0.021279462378728,0.351733100204713,-0.283872012227989, + -0.000257136425953486,-0.0208244839262066,0.369546595249721,-0.301636008979053, + -0.000268416131768423,-0.0203695054736857,0.387360090294729,-0.319400005730116, + -0.000279695837582916,-0.0199145270211645,0.405173585339736,-0.337164002481181, + -0.000290975543398075,-0.0194595485686433,0.422987080384744,-0.354927999232245, + -0.000302255249212569,-0.0190045701161221,0.440800575429752,-0.372691995983309, + -0.000313534955027284,-0.0185495916636009,0.458614070474759,-0.390455992734372, + -0.000324814660841888,-0.0180946132110797,0.476427565519767,-0.408219989485436, + -0.000336094366656936,-0.0176396347585588,0.494241060564775,-0.425983986236501, + -0.000347374072471429,-0.0171846563060376,0.512054555609782,-0.443747982987564, + -0.000358653778286033,-0.0167296778535164,0.52986805065479,-0.461511979738628, + -0.000369933484101304,-0.0162746994009959,0.547681545699797,-0.479275976489692, + -0.000381213189915464,-0.0158197209484738,0.565495040744805,-0.497039973240756, + -0.000392492895730401,-0.0153647424959531,0.583308535789813,-0.51480396999182, + -0.000403772601545227,-0.0149097640434319,0.601122030834821,-0.532567966742884, + -0.000415052307359276,-0.0144547855909103,0.618935525879829,-0.550331963493948, + -0.000426332013173991,-0.0139998071383887,0.636749020924837,-0.568095960245012, + -0.000152738951035625,-0.0242592096479013,0.208277499919437,-0.14306830791397, + -0.000163657938009709,-0.023786080281894,0.225914700769516,-0.160991219805489, + -0.000174576924983849,-0.0233129509158867,0.243551901619595,-0.178914131697008, + -0.000185495911958045,-0.0228398215498797,0.261189102469674,-0.196837043588528, + -0.00019641489893224,-0.0223666921838725,0.278826303319754,-0.214759955480047, + -0.000207333885906491,-0.0218935628178656,0.296463504169833,-0.232682867371567, + -0.000218252872880409,-0.0214204334518582,0.314100705019912,-0.250605779263086, + -0.000229171859855104,-0.0209473040858514,0.331737905869991,-0.268528691154606, + -0.000240090846829022,-0.0204741747198443,0.34937510672007,-0.286451603046125, + -0.00025100983380355,-0.0200010453538373,0.367012307570149,-0.304374514937644, + -0.000261928820777357,-0.0195279159878297,0.384649508420229,-0.322297426829163, + -0.000272847807751608,-0.0190547866218225,0.402286709270308,-0.340220338720683, + -0.000283766794725526,-0.0185816572558153,0.419923910120387,-0.358143250612203, + -0.000294685781699999,-0.0181085278898083,0.437561110970466,-0.376066162503722, + -0.000305604768674361,-0.0176353985238016,0.455198311820545,-0.393989074395241, + -0.00031652375564839,-0.0171622691577942,0.472835512670625,-0.411911986286761, + -0.000327442742622419,-0.0166891397917868,0.490472713520704,-0.429834898178281, + -0.000338361729596892,-0.0162160104257802,0.508109914370783,-0.4477578100698, + -0.000349280716570921,-0.0157428810597726,0.525747115220862,-0.465680721961319, + -0.000360199703545505,-0.0152697516937661,0.543384316070941,-0.483603633852838, + -0.000371118690519534,-0.0147966223277587,0.56102151692102,-0.501526545744358, + -0.000382037677493785,-0.0143234929617519,0.578658717771099,-0.519449457635877, + -0.000392956664468702,-0.0138503635957452,0.596295918621178,-0.537372369527396, + -0.000403875651442287,-0.0133772342297376,0.613933119471258,-0.555295281418916, + -0.000414794638415761,-0.0129041048637295,0.631570320321337,-0.573218193310436, + -0.000148874044137715,-0.0233963192889641,0.206994283818034,-0.144804588498605, + -0.00015931686130527,-0.0229008707888062,0.224394411085606,-0.162938405889304, + -0.00016975967847277,-0.0224054222886481,0.241794538353179,-0.181072223280002, + -0.000180202495640269,-0.0219099737884899,0.259194665620751,-0.1992060406707, + -0.000190645312807269,-0.0214145252883313,0.276594792888324,-0.217339858061399, + -0.000201088129974991,-0.0209190767881733,0.293994920155897,-0.235473675452097, + -0.000211530947142269,-0.0204236282880148,0.311395047423469,-0.253607492842795, + -0.00022197376430988,-0.019928179787857,0.328795174691042,-0.271741310233494, + -0.000232416581477046,-0.0194327312876985,0.346195301958614,-0.289875127624192, + -0.000242859398644546,-0.0189372827875405,0.363595429226186,-0.30800894501489, + -0.000253302215811657,-0.018441834287382,0.380995556493759,-0.326142762405588, + -0.000263745032979545,-0.0179463857872242,0.398395683761331,-0.344276579796287, + -0.000274187850147212,-0.0174509372870661,0.415795811028904,-0.362410397186985, + -0.000284630667314323,-0.0169554887869077,0.433195938296477,-0.380544214577683, + -0.000295073484481656,-0.0164600402867496,0.450596065564049,-0.398678031968382, + -0.0003055163016491,-0.0159645917865912,0.467996192831621,-0.41681184935908, + -0.000315959118816211,-0.0154691432864327,0.485396320099194,-0.434945666749778, + -0.000326401935983989,-0.0149736947862746,0.502796447366767,-0.453079484140476, + -0.0003368447531511,-0.0144782462861164,0.520196574634339,-0.471213301531175, + -0.000347287570318655,-0.0139827977859581,0.537596701901911,-0.489347118921873, + -0.000357730387485655,-0.0134873492857999,0.554996829169484,-0.507480936312572, + -0.000368173204653433,-0.0129919007856421,0.572396956437056,-0.525614753703269, + -0.000378616021820877,-0.0124964522854834,0.589797083704629,-0.543748571093968, + -0.000389058838988765,-0.012001003785326,0.607197210972201,-0.561882388484667, + -0.000399501656155654,-0.0115055552851673,0.624597338239774,-0.580016205875365, + -0.000143767577879483,-0.0222949748027097,0.205279176829357,-0.147066123530159, + -0.000153595085932656,-0.0217734926577877,0.222365203957992,-0.165474648925405, + -0.000163422593985829,-0.0212520105128657,0.239451231086628,-0.183883174320652, + -0.000173250102039002,-0.0207305283679439,0.256537258215264,-0.202291699715898, + -0.000183077610092119,-0.0202090462230217,0.2736232853439,-0.220700225111144, + -0.000192905118145292,-0.0196875640781,0.290709312472536,-0.23910875050639, + -0.000202732626198465,-0.019166081933178,0.307795339601172,-0.257517275901636, + -0.000212560134251527,-0.0186445997882558,0.324881366729808,-0.275925801296882, + -0.000222387642304978,-0.0181231176433343,0.341967393858443,-0.294334326692128, + -0.000232215150358095,-0.0176016354984121,0.359053420987079,-0.312742852087375, + -0.000242042658411212,-0.0170801533534903,0.376139448115715,-0.331151377482621, + -0.000251870166463886,-0.0165586712085677,0.393225475244351,-0.349559902877867, + -0.000261697674517114,-0.0160371890636457,0.410311502372987,-0.367968428273113, + -0.00027152518257012,-0.0155157069187235,0.427397529501623,-0.386376953668359, + -0.000281352690623349,-0.0149942247738015,0.444483556630259,-0.404785479063605, + -0.000291180198676577,-0.0144727426288798,0.461569583758895,-0.423194004458851, + -0.000301007706729917,-0.0139512604839578,0.478655610887531,-0.441602529854098, + -0.000310835214782812,-0.0134297783390358,0.495741638016166,-0.460011055249344, + -0.00032066272283604,-0.012908296194114,0.512827665144802,-0.47841958064459, + -0.000330490230889713,-0.0123868140491923,0.529913692273438,-0.496828106039836, + -0.000340317738942386,-0.0118653319042701,0.546999719402074,-0.515236631435082, + -0.000350145246994948,-0.011343849759347,0.56408574653071,-0.533645156830328, + -0.000359972755048621,-0.0108223676144257,0.581171773659346,-0.552053682225574, + -0.000369800263101849,-0.0103008854695039,0.598257800787982,-0.570462207620821, + -0.000379627771154745,-0.00977940332458127,0.615343827916618,-0.588870733016067, + -0.000137158942421445,-0.0209320675868468,0.203027578081791,-0.149940972376525, + -0.000146213478226576,-0.0203824734448916,0.219705654351263,-0.168698704827573, + -0.000155268014031817,-0.0198328793029362,0.236383730620736,-0.187456437278621, + -0.000164322549837226,-0.0192832851609813,0.253061806890209,-0.206214169729669, + -0.000173377085642634,-0.0187336910190264,0.269739883159681,-0.224971902180717, + -0.000182431621448154,-0.0181840968770717,0.286417959429154,-0.243729634631765, + -0.000191486157253395,-0.0176345027351161,0.303096035698627,-0.262487367082813, + -0.000200540693058582,-0.017084908593161,0.319774111968099,-0.281245099533861, + -0.000209595228863824,-0.0165353144512057,0.336452188237572,-0.300002831984909, + -0.000218649764669121,-0.0159857203092506,0.353130264507045,-0.318760564435957, + -0.000227704300474696,-0.0154361261672955,0.369808340776517,-0.337518296887005, + -0.000236758836279938,-0.0148865320253406,0.38648641704599,-0.356276029338054, + -0.000245813372085513,-0.014336937883386,0.403164493315462,-0.375033761789102, + -0.000254867907890532,-0.0137873437414302,0.419842569584935,-0.39379149424015, + -0.000263922443695663,-0.0132377495994751,0.436520645854408,-0.412549226691198, + -0.000272976979501349,-0.0126881554575204,0.45319872212388,-0.431306959142246, + -0.000282031515306702,-0.0121385613155651,0.469876798393353,-0.450064691593294, + -0.000291086051111722,-0.0115889671736098,0.486554874662826,-0.468822424044342, + -0.000300140586917186,-0.0110393730316551,0.503232950932298,-0.48758015649539, + -0.000309195122722428,-0.0104897788896996,0.519911027201771,-0.506337888946438, + -0.000318249658527781,-0.0099401847477445,0.536589103471244,-0.525095621397486, + -0.000327304194333355,-0.00939059060578984,0.553267179740716,-0.543853353848534, + -0.000336358730138264,-0.00884099646383385,0.569945256010189,-0.562611086299582, + -0.000345413265943395,-0.00829140232187919,0.586623332279661,-0.58136881875063, + -0.000354467801749303,-0.00774180817992454,0.603301408549134,-0.600126551201678, + -0.000128834306842018,-0.019309768269802,0.200142372870624,-0.15348446737709, + -0.000136952745200314,-0.0187332368399949,0.216304263304367,-0.172672627138416, + -0.000145071183558554,-0.0181567054101879,0.23246615373811,-0.191860786899741, + -0.000153189621917016,-0.0175801739803813,0.248628044171853,-0.211048946661067, + -0.000161308060275256,-0.0170036425505741,0.264789934605596,-0.230237106422392, + -0.000169426498633607,-0.0164271111207674,0.280951825039339,-0.249425266183718, + -0.000177544936992013,-0.0158505796909605,0.297113715473082,-0.268613425945044, + -0.000185663375350253,-0.0152740482611535,0.313275605906825,-0.287801585706369, + -0.000193781813708493,-0.0146975168313463,0.329437496340568,-0.306989745467695, + -0.000201900252066567,-0.0141209854015389,0.345599386774311,-0.32617790522902, + -0.000210018690425029,-0.0135444539717324,0.361761277208054,-0.345366064990346, + -0.000218137128783269,-0.0129679225419252,0.377923167641797,-0.364554224751672, + -0.000226255567141842,-0.0123913911121187,0.39408505807554,-0.383742384512997, + -0.000234374005499749,-0.0118148596823111,0.410246948509283,-0.402930544274323, + -0.000242492443858211,-0.0112383282525046,0.426408838943026,-0.422118704035649, + -0.000250610882216562,-0.0106617968226979,0.442570729376769,-0.441306863796974, + -0.000258729320574802,-0.0100852653928905,0.458732619810512,-0.4604950235583, + -0.000266847758933042,-0.00950873396308349,0.474894510244255,-0.479683183319626, + -0.000274966197290727,-0.00893220253327587,0.491056400677998,-0.498871343080951, + -0.0002830846356493,-0.00835567110346913,0.507218291111741,-0.518059502842277, + -0.00029120307400754,-0.00777913967366217,0.523380181545484,-0.537247662603602, + -0.000299321512365558,-0.00720260824385477,0.539542071979227,-0.556435822364928, + -0.000307439950724908,-0.00662607681404914,0.55570396241297,-0.575623982126254, + -0.000315558389082371,-0.00604954538424129,0.571865852846714,-0.59481214188758, + -0.000323676827441055,-0.00547301395443478,0.588027743280456,-0.614000301648905, + -0.000118701970086121,-0.0174677468674611,0.196560823501357,-0.157689764045413, + -0.000125738109483686,-0.0168703668319528,0.212090992493522,-0.177388739973708, + -0.00013277424888114,-0.0162729867964442,0.227621161485688,-0.197087715902004, + -0.000139810388278538,-0.0156756067609354,0.243151330477853,-0.216786691830299, + -0.000146846527676103,-0.0150782267254269,0.258681499470019,-0.236485667758595, + -0.000153882667073335,-0.014480846689918,0.274211668462184,-0.25618464368689, + -0.000160918806470622,-0.0138834666544092,0.28974183745435,-0.275883619615186, + -0.000167954945868132,-0.0132860866189006,0.305272006446516,-0.295582595543481, + -0.000174991085265641,-0.0126887065833921,0.320802175438681,-0.315281571471777, + -0.000182027224663539,-0.0120913265478839,0.336332344430846,-0.334980547400072, + -0.000189063364060771,-0.0114939465123749,0.351862513423012,-0.354679523328368, + -0.000196099503458336,-0.0108965664768665,0.367392682415178,-0.374378499256664, + -0.00020313564285579,-0.010299186441358,0.382922851407343,-0.394077475184959, + -0.000210171782252688,-0.0097018064058485,0.398453020399509,-0.413776451113255, + -0.000217207921650586,-0.00910442637034037,0.413983189391674,-0.43347542704155, + -0.00022424406104804,-0.00850704633483179,0.42951335838384,-0.453174402969846, + -0.000231280200445494,-0.00790966629932321,0.445043527376005,-0.472873378898142, + -0.000238316339842726,-0.00731228626381419,0.460573696368171,-0.492572354826437, + -0.000245352479240513,-0.00671490622830628,0.476103865360336,-0.512271330754732, + -0.000252388618637633,-0.00611752619279748,0.491634034352501,-0.531970306683028, + -0.000259424758034865,-0.00552014615728824,0.507164203344667,-0.551669282611323, + -0.000266460897432985,-0.00492276612177989,0.522694372336833,-0.571368258539619, + -0.000273497036830106,-0.00432538608627153,0.538224541328998,-0.591067234467914, + -0.000280533176227338,-0.00372800605076229,0.553754710321164,-0.61076621039621, + -0.00028756931562457,-0.00313062601525305,0.56928487931333,-0.630465186324506, + -0.000106877472319467,-0.0154880544387747,0.1922895394295,-0.162461810789138, + -0.000112731347651218,-0.01488173791601,0.207077699558768,-0.182740445851733, + -0.000118585222982803,-0.0142754213932447,0.221865859688037,-0.203019080914328, + -0.000124439098314388,-0.0136691048704799,0.236654019817305,-0.223297715976922, + -0.000130292973646029,-0.0130627883477149,0.251442179946573,-0.243576351039517, + -0.00013614684897767,-0.01245647182495,0.266230340075841,-0.263854986102112, + -0.000142000724309532,-0.0118501553021853,0.28101850020511,-0.284133621164707, + -0.000147854599641173,-0.0112438387794203,0.295806660334378,-0.304412256227301, + -0.000153708474972702,-0.010637522256655,0.310594820463647,-0.324690891289896, + -0.000159562350304565,-0.0100312057338903,0.325382980592915,-0.344969526352491, + -0.000165416225635817,-0.00942488921112505,0.340171140722183,-0.365248161415085, + -0.000171270100967957,-0.00881857268836073,0.354959300851451,-0.38552679647768, + -0.000177123976299431,-0.00821225616559507,0.36974746098072,-0.405805431540275, + -0.000182977851631128,-0.00760593964283074,0.384535621109988,-0.42608406660287, + -0.000188831726962602,-0.00699962312006552,0.399323781239256,-0.446362701665464, + -0.00019468560229452,-0.00639330659730097,0.414111941368524,-0.466641336728059, + -0.000200539477626216,-0.00578699007453576,0.428900101497793,-0.486919971790654, + -0.000206393352957801,-0.00518067355177099,0.443688261627061,-0.507198606853248, + -0.000212247228289497,-0.00457435702900599,0.458476421756329,-0.527477241915843, + -0.00021810110362086,-0.00396804050624056,0.473264581885598,-0.547755876978438, + -0.000223954978953,-0.00336172398347623,0.488052742014866,-0.568034512041033, + -0.000229808854284697,-0.00275540746071146,0.502840902144134,-0.588313147103627, + -0.000235662729615949,-0.00214909093794535,0.517629062273403,-0.608591782166222, + -0.000241516604947534,-0.00154277441518103,0.53241722240267,-0.628870417228817, + -0.000247370480279341,-0.000936457892416254,0.547205382531939,-0.649149052291412, + -9.37423703483709e-05,-0.0134858253268317,0.187435391011737,-0.167609344359392, + -9.83883413782083e-05,-0.0128875503826037,0.201393181293224,-0.188513248832232, + -0.000103034312408656,-0.0122892754383762,0.215350971574711,-0.209417153305071, + -0.000107680283438494,-0.0116910004941481,0.229308761856198,-0.23032105777791, + -0.000112326254468664,-0.0110927255499205,0.243266552137685,-0.25122496225075, + -0.000116972225498502,-0.0104944506056923,0.257224342419172,-0.272128866723589, + -0.000121618196528783,-0.00989617566146483,0.271182132700659,-0.293032771196428, + -0.000126264167558898,-0.00929790071723713,0.285139922982146,-0.313936675669268, + -0.000130910138588625,-0.00869962577300898,0.299097713263633,-0.334840580142107, + -0.000135556109619128,-0.0081013508287815,0.31305550354512,-0.355744484614946, + -0.000140202080649243,-0.00750307588455401,0.327013293826606,-0.376648389087786, + -0.000144848051679247,-0.00690480094032608,0.340971084108094,-0.397552293560625, + -0.000149494022709584,-0.0063065259960986,0.35492887438958,-0.418456198033465, + -0.000154139993739588,-0.00570825105187067,0.368886664671067,-0.439360102506304, + -0.000158785964769814,-0.00510997610764297,0.382844454952554,-0.460264006979143, + -0.000163431935799707,-0.00451170116341504,0.396802245234041,-0.481167911451983, + -0.0001680779068296,-0.00391342621918711,0.410760035515528,-0.502071815924822, + -0.000172723877859937,-0.0033151512749594,0.424717825797015,-0.522975720397661, + -0.000177369848889941,-0.00271687633073192,0.438675616078502,-0.543879624870501, + -0.000182015819919501,-0.00211860138650355,0.452633406359989,-0.56478352934334, + -0.000186661790949949,-0.00152032644227607,0.466591196641476,-0.58568743381618, + -0.000191307761980064,-0.000922051498048138,0.480548986922963,-0.606591338289019, + -0.000195953733010179,-0.000323776553820654,0.49450677720445,-0.627495242761858, + -0.000200599704040072,0.000274498390407718,0.508464567485937,-0.648399147234698, + -0.000205245675070409,0.000872773334635202,0.522422357767424,-0.669303051707537, + -7.99310319722357e-05,-0.0115850845897552,0.182212969751726,-0.172867027973653, + -8.3432421549845e-05,-0.0110141164450552,0.195290504735669,-0.194409581750645, + -8.69338111273432e-05,-0.0104431483003549,0.208368039719613,-0.215952135527636, + -9.04352007047859e-05,-0.0098721801556545,0.221445574703557,-0.237494689304628, + -9.39365902821176e-05,-0.00930121201095435,0.234523109687501,-0.259037243081619, + -9.74379798595604e-05,-0.00873024386625398,0.247600644671445,-0.280579796858611, + -0.00010093936943717,-0.00815927572155406,0.260678179655388,-0.302122350635602, + -0.000104440759014612,-0.00758830757685369,0.273755714639332,-0.323664904412594, + -0.000107942148591667,-0.00701733943215288,0.286833249623276,-0.345207458189585, + -0.000111443538169387,-0.00644637128745318,0.29991078460722,-0.366750011966577, + -0.000114944927746774,-0.00587540314275281,0.312988319591164,-0.388292565743568, + -0.000118446317324494,-0.00530443499805311,0.326065854575107,-0.40983511952056, + -0.000121947706901882,-0.00473346685335274,0.339143389559051,-0.431377673297551, + -0.00012544909647938,-0.00416249870865304,0.352220924542995,-0.452920227074543, + -0.000128950486056767,-0.00359153056395245,0.365298459526939,-0.474462780851534, + -0.000132451875634154,-0.00302056241925186,0.378375994510883,-0.496005334628525, + -0.000135953265211652,-0.00244959427455149,0.391453529494827,-0.517547888405517, + -0.000139454654788707,-0.00187862612985068,0.404531064478771,-0.539090442182508, + -0.000142956044366316,-0.00130765798515142,0.417608599462714,-0.5606329959595, + -0.000146457433944147,-0.000736689840451277,0.430686134446658,-0.582175549736491, + -0.000149958823521423,-0.000165721695751131,0.443763669430601,-0.603718103513483, + -0.000153460213099033,0.000405246448949015,0.456841204414545,-0.625260657290474, + -0.000156961602676309,0.000976214593649161,0.469918739398489,-0.646803211067466, + -0.000160462992253363,0.00154718273834975,0.482996274382433,-0.668345764844457, + -0.000163964381831305,0.0021181508830499,0.496073809366377,-0.689888318621449, + -6.62232921073147e-05,-0.00988886630486607,0.17691406364501,-0.177946250147048, + -6.87240975152381e-05,-0.00936274368892565,0.18911039895448,-0.200105775568715, + -7.1224902923217e-05,-0.00883662107298555,0.20130673426395,-0.222265300990382, + -7.37257083307519e-05,-0.00831049845704479,0.213503069573419,-0.244424826412048, + -7.62265137384532e-05,-0.00778437584110425,0.225699404882889,-0.266584351833715, + -7.87273191462101e-05,-0.00725825322516349,0.237895740192359,-0.288743877255381, + -8.12281245538005e-05,-0.00673213060922295,0.250092075501828,-0.310903402677048, + -8.37289299616684e-05,-0.00620600799328241,0.262288410811298,-0.333062928098715, + -8.62297353697028e-05,-0.00567988537734254,0.274484746120767,-0.355222453520381, + -8.87305407771821e-05,-0.00515376276140134,0.286681081430238,-0.377381978942048, + -9.12313461846059e-05,-0.00462764014546058,0.298877416739707,-0.399541504363715, + -9.37321515922518e-05,-0.00410151752951982,0.311073752049177,-0.421701029785381, + -9.62329570006748e-05,-0.00357539491358017,0.323270087358646,-0.443860555207048, + -9.87337624080986e-05,-0.00304927229763896,0.335466422668116,-0.466020080628714, + -0.000101234567815855,-0.00252314968169842,0.347662757977586,-0.488179606050381, + -0.000103735373223501,-0.00199702706575811,0.359859093287056,-0.510339131472048, + -0.000106236178631369,-0.00147090444981779,0.372055428596525,-0.532498656893715, + -0.000108736984039126,-0.000944781833877251,0.384251763905995,-0.554658182315381, + -0.000111237789446883,-0.00041865921793649,0.396448099215465,-0.576817707737048, + -0.000113738594854751,0.000107463398003826,0.408644434524934,-0.598977233158714, + -0.00011623940026273,0.000633586013944143,0.420840769834404,-0.621136758580381, + -0.000118740205670265,0.00115970862988446,0.433037105143873,-0.643296284002048, + -0.000121241011078244,0.00168583124582522,0.445233440453343,-0.665455809423714, + -0.000123741816485223,0.00221195386176642,0.457429775762813,-0.687615334845381, + -0.000126242621893868,0.0027380764777063,0.469626111072283,-0.709774860267048, + -5.33744927950219e-05,-0.00845796150272471,0.171844843222908,-0.1825957572992, + -5.506927210569e-05,-0.00798891394834234,0.183207975456313,-0.205320057006508, + -5.67640514163026e-05,-0.00751986639396007,0.194571107689718,-0.228044356713816, + -5.84588307267486e-05,-0.00705081883957748,0.205934239923124,-0.250768656421124, + -6.01536100370836e-05,-0.00658177128519477,0.217297372156529,-0.273492956128431, + -6.18483893479183e-05,-0.00611272373081273,0.228660504389935,-0.296217255835739, + -6.35431686584753e-05,-0.00564367617643025,0.24002363662334,-0.318941555543047, + -6.52379479690324e-05,-0.00517462862204798,0.251386768856745,-0.341665855250355, + -6.69327272793119e-05,-0.00470558106766505,0.262749901090151,-0.364390154957663, + -6.8627506590202e-05,-0.00423653351328324,0.274113033323556,-0.38711445466497, + -7.0322285900537e-05,-0.00376748595890031,0.285476165556962,-0.409838754372278, + -7.20170652116492e-05,-0.00329843840451871,0.296839297790366,-0.432563054079586, + -7.37118445216511e-05,-0.00282939085013512,0.308202430023772,-0.455287353786894, + -7.54066238325413e-05,-0.00236034329575352,0.319565562257177,-0.478011653494202, + -7.71014031432093e-05,-0.0018912957413717,0.330928694490582,-0.50073595320151, + -7.87961824537664e-05,-0.00142224818698877,0.342291826723988,-0.523460252908817, + -8.04909617643235e-05,-0.000953200632606288,0.353654958957394,-0.546184552616125, + -8.21857410746585e-05,-0.000484153078224026,0.365018091190799,-0.568908852323433, + -8.38805203851045e-05,-1.51055238410969e-05,0.376381223424204,-0.591633152030741, + -8.55752996959946e-05,0.000453942030540944,0.387744355657609,-0.614357451738049, + -8.72700790065517e-05,0.000922989584923428,0.399107487891015,-0.637081751445357, + -8.89648583171088e-05,0.00139203713930591,0.41047062012442,-0.659806051152664, + -9.06596376273328e-05,0.00186108469368884,0.421833752357826,-0.682530350859972, + -9.23544169381119e-05,0.00233013224807044,0.433196884591231,-0.70525465056728, + -9.40491962486689e-05,0.00279917980245337,0.444560016824637,-0.727978950274588, + -4.19572267271184e-05,-0.00730700058508948,0.167257896503593,-0.186646686184674, + -4.30517227855698e-05,-0.0069002456101086,0.177874401383225,-0.209863051049128, + -4.41462188444097e-05,-0.00649349063512827,0.188490906262858,-0.233079415913582, + -4.52407149028056e-05,-0.00608673566014739,0.19910741114249,-0.256295780778036, + -4.6335210961479e-05,-0.00567998068516706,0.209723916022123,-0.279512145642491, + -4.74297070200413e-05,-0.00527322571018618,0.220340420901755,-0.302728510506945, + -4.85242030786037e-05,-0.00486647073520552,0.230956925781388,-0.325944875371399, + -4.96186991369996e-05,-0.00445971576022464,0.241573430661021,-0.349161240235853, + -5.07131951956175e-05,-0.0040529607852442,0.252189935540653,-0.372377605100308, + -5.18076912542353e-05,-0.00364620581026354,0.262806440420286,-0.395593969964762, + -5.29021873127977e-05,-0.00323945083528288,0.273422945299918,-0.418810334829216, + -5.39966833713601e-05,-0.00283269586030177,0.284039450179551,-0.44202669969367, + -5.50911794302555e-05,-0.00242594088532155,0.294655955059184,-0.465243064558125, + -5.61856754883738e-05,-0.00201918591034045,0.305272459938816,-0.488459429422579, + -5.72801715476023e-05,-0.00161243093536068,0.315888964818448,-0.511675794287033, + -5.83746676054986e-05,-0.00120567596037868,0.326505469698082,-0.534892159151487, + -5.9469163664283e-05,-0.000798920985398688,0.337121974577714,-0.558108524015941, + -6.05636597230674e-05,-0.000392166010418471,0.347738479457346,-0.581324888880396, + -6.16581557811857e-05,1.45889645630781e-05,0.358354984336979,-0.60454125374485, + -6.2752651839304e-05,0.000421343939544627,0.368971489216612,-0.627757618609304, + -6.38471478986435e-05,0.0008280989145244,0.379587994096245,-0.650973983473758, + -6.4941643957428e-05,0.00123485388950417,0.390204498975877,-0.674190348338212, + -6.60361400157683e-05,0.00164160886448528,0.400821003855509,-0.697406713202667, + -6.71306360742197e-05,0.00204836383946638,0.411437508735142,-0.720623078067121, + -6.82251321330041e-05,0.0024551188144466,0.422054013614775,-0.743839442931575, + -3.228021332502e-05,-0.00641532403135203,0.163309010493678,-0.19002690310177, + -3.29584181856246e-05,-0.00606955243326501,0.173287760665244,-0.213653861935045, + -3.36366230463403e-05,-0.00572378083517799,0.183266510836809,-0.237280820768321, + -3.4314827906945e-05,-0.00537800923709075,0.193245261008375,-0.260907779601596, + -3.49930327672721e-05,-0.00503223763900329,0.203224011179941,-0.284534738434872, + -3.56712376280988e-05,-0.00468646604091649,0.213202761351506,-0.308161697268148, + -3.63494424887589e-05,-0.0043406944428297,0.223181511523072,-0.331788656101423, + -3.70276473493636e-05,-0.00399492284474245,0.233160261694638,-0.355415614934699, + -3.77058522095797e-05,-0.00364915124665455,0.243139011866204,-0.379042573767974, + -3.83840570703509e-05,-0.00330337964856797,0.253117762037769,-0.40266953260125, + -3.90622619308445e-05,-0.00295760805048095,0.263096512209334,-0.426296491434525, + -3.97404667922263e-05,-0.0026118364523946,0.2730752623809,-0.449923450267801, + -4.04186716520538e-05,-0.00226606485430669,0.283054012552466,-0.473550409101076, + -4.10968765128805e-05,-0.0019202932562199,0.293032762724031,-0.497177367934352, + -4.17750813735962e-05,-0.00157452165813265,0.303011512895597,-0.520804326767628, + -4.24532862336457e-05,-0.00122875006004497,0.312990263067163,-0.544431285600903, + -4.31314910949165e-05,-0.000882978461958617,0.322969013238728,-0.568058244434179, + -4.38096959555212e-05,-0.00053720686387182,0.332947763410294,-0.591685203267454, + -4.44879008154597e-05,-0.000191435265783468,0.34292651358186,-0.61531216210073, + -4.51661056768415e-05,0.000154336332302663,0.352905263753425,-0.638939120934005, + -4.5844310536558e-05,0.00050010793039057,0.362884013924991,-0.662566079767281, + -4.65225153973847e-05,0.000845879528477145,0.372862764096556,-0.686193038600556, + -4.72007202584335e-05,0.00119165112656416,0.382841514268123,-0.709819997433832, + -4.7878925118594e-05,0.00153742272465163,0.392820264439688,-0.733446956267108, + -4.85571299797538e-05,0.00188319432273865,0.402799014611254,-0.757073915100383, + -2.43985397578306e-05,-0.00574338065697311,0.160050779482165,-0.192747267398463, + -2.48052220699901e-05,-0.00545266413771017,0.169506528338644,-0.216704668094085, + -2.52119043824828e-05,-0.00516194761844779,0.178962277195123,-0.240662068789706, + -2.56185866945313e-05,-0.00487123109918475,0.188418026051603,-0.264619469485328, + -2.60252690066909e-05,-0.00458051457992181,0.197873774908082,-0.28857687018095, + -2.64319513194611e-05,-0.00428979806065977,0.207329523764561,-0.312534270876571, + -2.68386336318427e-05,-0.00399908154139728,0.21678527262104,-0.336491671572193, + -2.72453159438912e-05,-0.00370836502213412,0.22624102147752,-0.360449072267815, + -2.76519982566059e-05,-0.00341764850287185,0.235696770333999,-0.384406472963436, + -2.80586805690985e-05,-0.00312693198360936,0.245152519190478,-0.408363873659058, + -2.84653628811471e-05,-0.00283621546434643,0.254608268046957,-0.43232127435468, + -2.88720451937508e-05,-0.00254549894508371,0.264064016903437,-0.456278675050302, + -2.92787275054662e-05,-0.00225478242582078,0.273519765759916,-0.480236075745923, + -2.96854098182919e-05,-0.00196406590655895,0.282975514616395,-0.504193476441545, + -3.00920921303405e-05,-0.00167334938729535,0.292431263472875,-0.528150877137167, + -3.04987744429441e-05,-0.00138263286803353,0.301887012329353,-0.552108277832788, + -3.09054567555478e-05,-0.00109191634877059,0.311342761185833,-0.57606567852841, + -3.13121390678184e-05,-0.000801199829508104,0.320798510042312,-0.600023079224032, + -3.17188213802e-05,-0.000510483310245835,0.330254258898791,-0.623980479919653, + -3.21255036921375e-05,-0.000219766790982678,0.33971000775527,-0.647937880615275, + -3.25321860048522e-05,7.09497282795901e-05,0.34916575661175,-0.671895281310897, + -3.29388683173448e-05,0.000361666247541859,0.358621505468229,-0.695852682006519, + -3.33455506292824e-05,0.000652382766805459,0.368077254324708,-0.71981008270214, + -3.3752232941664e-05,0.000943099286068172,0.377533003181188,-0.743767483397762, + -3.41589152541566e-05,0.00123381580533044,0.386988752037667,-0.767724884093383, + -1.81829505269682e-05,-0.00524666434754717,0.157454266876236,-0.194873565063733, + -1.84211510676491e-05,-0.0050027046970138,0.166495176237537,-0.219089246520232, + -1.8659351608219e-05,-0.00475874504648033,0.175536085598838,-0.243304927976732, + -1.88975521489554e-05,-0.00451478539594707,0.184576994960139,-0.267520609433231, + -1.91357526897473e-05,-0.00427082574541382,0.19361790432144,-0.29173629088973, + -1.93739532300397e-05,-0.00402686609488012,0.202658813682741,-0.31595197234623, + -1.96121537707206e-05,-0.00378290644434687,0.211699723044042,-0.340167653802729, + -1.98503543111794e-05,-0.00353894679381339,0.220740632405343,-0.364383335259228, + -2.00885548519159e-05,-0.00329498714328014,0.229781541766644,-0.388599016715727, + -2.03267553925413e-05,-0.0030510274927471,0.238822451127945,-0.412814698172227, + -2.05649559330556e-05,-0.00280706784221318,0.247863360489246,-0.437030379628726, + -2.08031564737921e-05,-0.00256310819167949,0.256904269850547,-0.461246061085225, + -2.10413570141954e-05,-0.00231914854114601,0.265945179211848,-0.485461742541724, + -2.12795575551539e-05,-0.00207518889061298,0.274986088573149,-0.509677423998224, + -2.15177580954462e-05,-0.00183122924007906,0.28402699793445,-0.533893105454723, + -2.17559586360716e-05,-0.00158726958954603,0.293067907295751,-0.558108786911222, + -2.1994159176697e-05,-0.00134330993901277,0.302108816657052,-0.582324468367722, + -2.22323597178775e-05,-0.00109935028847996,0.311149726018353,-0.606540149824221, + -2.24705602578368e-05,-0.000855390637945597,0.320190635379654,-0.63075583128072, + -2.27087607982401e-05,-0.00061143098741212,0.329231544740955,-0.654971512737219, + -2.29469613391986e-05,-0.000367471336879532,0.338272454102255,-0.679187194193719, + -2.31851618793799e-05,-0.000123511686345612,0.347313363463556,-0.703402875650218, + -2.34233624196722e-05,0.000120447964188752,0.356354272824858,-0.727618557106717, + -2.36615629608528e-05,0.000364407614720896,0.365395182186158,-0.751834238563217, + -2.38997635013671e-05,0.000608367265254373,0.374436091547459,-0.776049920019716, + -1.34037275033028e-05,-0.00488411261732169,0.155441284111603,-0.196497895335566, + -1.35412940485691e-05,-0.00467807979522517,0.164161710994076,-0.220910883719208, + -1.36788605941685e-05,-0.00447204697312842,0.17288213787655,-0.245323872102851, + -1.38164271393793e-05,-0.00426601415103145,0.181602564759025,-0.269736860486493, + -1.39539936848121e-05,-0.00405998132893481,0.190322991641499,-0.294149848870135, + -1.40915602301894e-05,-0.00385394850683807,0.199043418523973,-0.318562837253777, + -1.42291267754557e-05,-0.0036479156847411,0.207763845406447,-0.342975825637419, + -1.43666933209441e-05,-0.00344188286264413,0.216484272288921,-0.367388814021061, + -1.45042598661549e-05,-0.00323585004054738,0.225204699171395,-0.391801802404704, + -1.46418264117543e-05,-0.00302981721845086,0.233925126053869,-0.416214790788346, + -1.47793929570206e-05,-0.00282378439635433,0.242645552936343,-0.440627779171988, + -1.491695950262e-05,-0.00261775157425759,0.251365979818817,-0.46504076755563, + -1.50545260474422e-05,-0.00241171875216062,0.260086406701291,-0.489453755939272, + -1.51920925927085e-05,-0.00220568593006321,0.268806833583765,-0.513866744322914, + -1.53296591381968e-05,-0.00199965310796668,0.277527260466239,-0.538279732706556, + -1.54672256836852e-05,-0.00179362028587016,0.286247687348713,-0.562692721090199, + -1.56047922290625e-05,-0.00158758746377297,0.294968114231188,-0.587105709473841, + -1.57423587745509e-05,-0.00138155464167644,0.303688541113662,-0.611518697857483, + -1.58799253199282e-05,-0.00117552181957992,0.312408967996135,-0.635931686241125, + -1.60174918654166e-05,-0.000969488997482948,0.32112939487861,-0.660344674624767, + -1.61550584103498e-05,-0.000763456175385979,0.329849821761084,-0.684757663008409, + -1.62926249561712e-05,-0.00055742335328901,0.338570248643558,-0.709170651392051, + -1.64301915013265e-05,-0.000351390531192042,0.347290675526032,-0.733583639775694, + -1.65677580462598e-05,-0.000145357709094629,0.356011102408507,-0.757996628159336, + -1.67053245919702e-05,6.06751130014516e-05,0.36473152929098,-0.782409616542978, + -9.79937217493454e-06,-0.00462161183197185,0.153913503309736,-0.197717181411202, + -9.87842135719008e-06,-0.00444530778400654,0.162391328004467,-0.222278276120918, + -9.95747053961216e-06,-0.00426900373604122,0.170869152699199,-0.246839370830634, + -1.00365197216457e-05,-0.00409269968807568,0.179346977393931,-0.27140046554035, + -1.01155689035681e-05,-0.00391639564010959,0.187824802088662,-0.295961560250066, + -1.01946180861012e-05,-0.00374009159214483,0.196302626783394,-0.320522654959782, + -1.02736672682457e-05,-0.00356378754417896,0.204780451478126,-0.345083749669498, + -1.03527164501127e-05,-0.0033874834962131,0.213258276172857,-0.369644844379214, + -1.04317656323683e-05,-0.00321117944824811,0.221736100867589,-0.39420593908893, + -1.05108148146238e-05,-0.00303487540028269,0.23021392556232,-0.418767033798646, + -1.05898639967128e-05,-0.00285857135231682,0.238691750257052,-0.443328128508362, + -1.06689131789128e-05,-0.00268226730435162,0.247169574951783,-0.467889223218078, + -1.07479623613349e-05,-0.00250596325638663,0.255647399646515,-0.492450317927794, + -1.08270115429798e-05,-0.0023296592084201,0.264125224341247,-0.51701141263751, + -1.0906060725735e-05,-0.00215335516045578,0.272603049035978,-0.541572507347226, + -1.09851099076019e-05,-0.00197705111248925,0.28108087373071,-0.566133602056942, + -1.1064159089913e-05,-0.00180074706452449,0.289558698425441,-0.590694696766658, + -1.11432082723351e-05,-0.00162444301655906,0.298036523120173,-0.615255791476374, + -1.1222257454313e-05,-0.00144813896859386,0.306514347814904,-0.63981688618609, + -1.13013066358469e-05,-0.00127183492062732,0.314992172509637,-0.664377980895806, + -1.138035581838e-05,-0.00109553087266256,0.323469997204368,-0.688939075605522, + -1.14594050009131e-05,-0.000919226824697805,0.331947821899099,-0.713500170315238, + -1.15384541830021e-05,-0.000742922776731714,0.340425646593831,-0.738061265024954, + -1.16175033654242e-05,-0.00056661872876651,0.348903471288563,-0.76262235973467, + -1.16965525469581e-05,-0.000390314680799975,0.357381295983295,-0.787183454444386, + -7.12027086441358e-06,-0.00443249546210334,0.152772460993502,-0.198620425851387, + -7.165846283963e-06,-0.00427891194980523,0.16106944102443,-0.223291237401355, + -7.21142170356792e-06,-0.00412532843750735,0.169366421055358,-0.247962048951324, + -7.25699712311734e-06,-0.00397174492520924,0.177663401086287,-0.272632860501292, + -7.30257254311084e-06,-0.0038181614129118,0.185960381117215,-0.297303672051261, + -7.34814796260475e-06,-0.00366457790061392,0.194257361148143,-0.321974483601229, + -7.39372338215416e-06,-0.00351099438831559,0.202554341179072,-0.346645295151198, + -7.43929880220318e-06,-0.00335741087601815,0.21085132121,-0.371316106701166, + -7.48487422175259e-06,-0.00320382736372027,0.219148301240928,-0.395986918251134, + -7.53044964107996e-06,-0.00305024385142194,0.227445281271857,-0.420657729801103, + -7.57602506151756e-06,-0.00289666033912539,0.235742261302784,-0.445328541351071, + -7.62160048062288e-06,-0.0027430768268264,0.244039241333713,-0.46999935290104, + -7.66717590061639e-06,-0.0025894933145294,0.252336221364641,-0.494670164451008, + -7.71275131994376e-06,-0.00243590980223107,0.260633201395569,-0.519340976000977, + -7.75832673982624e-06,-0.00228232628993341,0.268930181426497,-0.544011787550945, + -7.80390215937565e-06,-0.00212874277763508,0.277227161457426,-0.568682599100913, + -7.84947757925814e-06,-0.00197515926533764,0.285524141488354,-0.593353410650882, + -7.89505299825244e-06,-0.00182157575303865,0.293821121519283,-0.61802422220085, + -7.94062841869003e-06,-0.00166799224074188,0.302118101550211,-0.642695033750819, + -7.9862038380174e-06,-0.00151440872844377,0.310415081581139,-0.667365845300787, + -8.03177925767784e-06,-0.00136082521614522,0.318712061612068,-0.692036656850755, + -8.07735467789339e-06,-0.00120724170384845,0.327009041642996,-0.716707468400724, + -8.12293009699872e-06,-0.00105365819155034,0.335306021673924,-0.741378279950692, + -8.16850551654813e-06,-0.00090007467925135,0.343603001704853,-0.766049091500661, + -8.21408093643061e-06,-0.000746491166954577,0.351899981735781,-0.790719903050629, + -5.15020821351131e-06,-0.00429665988542394,0.151930402708798,-0.199283026385069, + -5.17676778843956e-06,-0.00416012161111801,0.160094109920119,-0.224034323829742, + -5.20332736314577e-06,-0.00402358333681185,0.168257817131441,-0.248785621274415, + -5.22988693807402e-06,-0.00388704506250603,0.176421524342762,-0.273536918719088, + -5.25644651289126e-06,-0.00375050678819999,0.184585231554083,-0.298288216163761, + -5.28300608743093e-06,-0.0036139685138934,0.192748938765405,-0.323039513608434, + -5.30956566263674e-06,-0.00347743023958791,0.200912645976726,-0.347790811053106, + -5.33612523723193e-06,-0.00334089196528153,0.209076353188047,-0.372542108497779, + -5.36268481182711e-06,-0.00320435369097516,0.217240060399368,-0.397293405942452, + -5.38924438675537e-06,-0.00306781541666923,0.22540376761069,-0.422044703387125, + -5.41580396173913e-06,-0.00293127714236352,0.233567474822011,-0.446796000831798, + -5.44236353650085e-06,-0.00279473886805759,0.241731182033332,-0.471547298276471, + -5.46892311181768e-06,-0.00265820059375188,0.249894889244653,-0.496298595721144, + -5.49548268591327e-06,-0.00252166231944484,0.258058596455975,-0.521049893165817, + -5.52204226111908e-06,-0.00238512404513957,0.266222303667295,-0.54580119061049, + -5.5486018358808e-06,-0.00224858577083342,0.274386010878617,-0.570552488055163, + -5.57516141042047e-06,-0.00211204749652683,0.282549718089939,-0.595303785499836, + -5.60172098584832e-06,-0.00197550922222156,0.29071342530126,-0.620055082944509, + -5.62828056016595e-06,-0.00183897094791474,0.298877132512581,-0.644806380389181, + -5.65484013481665e-06,-0.00170243267360837,0.307040839723903,-0.669557677833854, + -5.68139971002246e-06,-0.00156589439930288,0.315204546935224,-0.694308975278527, + -5.7079592848952e-06,-0.00142935612499695,0.323368254146545,-0.7190602727232, + -5.73451885932386e-06,-0.00129281785069102,0.331531961357866,-0.743811570167873, + -5.76107843430762e-06,-0.00115627957638464,0.339695668569187,-0.768562867612546, + -5.78763800929138e-06,-0.00101974130207871,0.347859375780509,-0.793314165057218, + -3.71290802991808e-06,-0.00419927236427542,0.151314443675528,-0.199765611750166, + -3.72864798375838e-06,-0.00407534997793668,0.159380761157111,-0.224575528699211, + -3.74438793754317e-06,-0.00395142759159828,0.167447078638693,-0.249385445648256, + -3.76012789138347e-06,-0.00382750520525965,0.175513396120276,-0.274195362597301, + -3.77586784511275e-06,-0.00370358281892091,0.183579713601859,-0.299005279546346, + -3.79160779939713e-06,-0.00357966043258329,0.191646031083441,-0.323815196495391, + -3.80734775279334e-06,-0.00345573804624411,0.199712348565024,-0.348625113444436, + -3.82308770652262e-06,-0.00333181565990515,0.207778666046607,-0.373435030393481, + -3.8388276607515e-06,-0.00320789327356752,0.215844983528189,-0.398244947342527, + -3.8545676140922e-06,-0.00308397088722812,0.223911301009772,-0.423054864291572, + -3.87030756821005e-06,-0.00296004850089004,0.231977618491355,-0.447864781240616, + -3.8860475217728e-06,-0.00283612611455131,0.240043935972938,-0.472674698189662, + -3.90178747600167e-06,-0.00271220372821346,0.24811025345452,-0.497484615138706, + -3.91752742956442e-06,-0.00258828134187428,0.256176570936103,-0.522294532087751, + -3.93326738357125e-06,-0.00246435895553621,0.264242888417686,-0.547104449036796, + -3.94900733724501e-06,-0.00234043656919769,0.272309205899268,-0.571914365985841, + -3.96474729069674e-06,-0.00221651418285829,0.280375523380851,-0.596724282934887, + -3.98048724448152e-06,-0.00209259179651955,0.288441840862434,-0.621534199883932, + -3.99622719804427e-06,-0.00196866941018081,0.296508158344017,-0.646344116832977, + -4.01196715260621e-06,-0.00184474702384341,0.304574475825599,-0.671154033782022, + -4.027707106391e-06,-0.00172082463750467,0.312640793307182,-0.695963950731067, + -4.04344706017579e-06,-0.00159690225116593,0.320707110788765,-0.720773867680112, + -4.05918701362751e-06,-0.0014729798648272,0.328773428270347,-0.745583784629157, + -4.07492696719025e-06,-0.0013490574784889,0.33683974575193,-0.770393701578202, + -4.09066692119708e-06,-0.00122513509214972,0.344906063233513,-0.795203618527247, + -2.67029393397067e-06,-0.00412952777607445,0.15086676848874,-0.200115249996913, + -2.67982151025414e-06,-0.00401485189495598,0.15886235524972,-0.224967637402412, + -2.68934908675966e-06,-0.00390017601383774,0.166857942010699,-0.249820024807911, + -2.69887666343172e-06,-0.00378550013271939,0.174853528771679,-0.27467241221341, + -2.70840423982621e-06,-0.00367082425160126,0.182849115532658,-0.29952479961891, + -2.71793181605418e-06,-0.00355614837048268,0.190844702293637,-0.324377187024409, + -2.72745939278174e-06,-0.00344147248936499,0.198840289054616,-0.349229574429908, + -2.73698696934277e-06,-0.00332679660824642,0.206835875815596,-0.374081961835407, + -2.7465145454042e-06,-0.00321212072712784,0.214831462576575,-0.398934349240907, + -2.75604212196523e-06,-0.00309744484600971,0.222827049337555,-0.423786736646406, + -2.7655696982487e-06,-0.00298276896489114,0.230822636098534,-0.448639124051905, + -2.77509727475422e-06,-0.00286809308377278,0.238818222859513,-0.473491511457404, + -2.78462485137076e-06,-0.00275341720265465,0.246813809620493,-0.498343898862904, + -2.79415242787628e-06,-0.00263874132153652,0.254809396381472,-0.523196286268403, + -2.80368000449283e-06,-0.00252406544041861,0.262804983142451,-0.548048673673902, + -2.81320758044323e-06,-0.00240938955929937,0.270800569903431,-0.572901061079401, + -2.82273515750386e-06,-0.00229471367818213,0.27879615666441,-0.597753448484901, + -2.83226273323223e-06,-0.00218003779706288,0.286791743425389,-0.6226058358904, + -2.84179031018184e-06,-0.0020653619159452,0.294787330186369,-0.647458223295899, + -2.8513178869094e-06,-0.00195068603482706,0.302782916947348,-0.672310610701398, + -2.86084546297083e-06,-0.00183601015370805,0.310778503708328,-0.697162998106898, + -2.8703730392543e-06,-0.00172133427258991,0.318774090469307,-0.722015385512397, + -2.87990061598187e-06,-0.00160665839147223,0.326769677230286,-0.746867772917896, + -2.88942819237636e-06,-0.00149198251035365,0.334765263991265,-0.771720160323396, + -2.89895576865984e-06,-0.00137730662923508,0.342760850752245,-0.796572547728895, + -1.91711875047185e-06,-0.00407961391361322,0.150542919746702,-0.200367605278461, + -1.92302373297482e-06,-0.00397166725137255,0.158487366641278,-0.225250646206839, + -1.92892871531125e-06,-0.0038637205891312,0.166431813535854,-0.250133687135217, + -1.93483369753666e-06,-0.00375577392688964,0.174376260430431,-0.275016728063596, + -1.94073867998412e-06,-0.00364782726464852,0.182320707325007,-0.299899768991974, + -1.94664366243158e-06,-0.00353988060240762,0.190265154219583,-0.324782809920352, + -1.95254864476802e-06,-0.0034319339401665,0.19820960111416,-0.34966585084873, + -1.95845362699343e-06,-0.00332398727792493,0.206154048008736,-0.374548891777109, + -1.96435860927435e-06,-0.00321604061568381,0.214098494903312,-0.399431932705487, + -1.97026359172181e-06,-0.00310809395344269,0.222042941797889,-0.424314973633865, + -1.97616857389171e-06,-0.00300014729120113,0.229987388692465,-0.449198014562243, + -1.98207355639468e-06,-0.00289220062896045,0.237931835587041,-0.474081055490621, + -1.98797853867561e-06,-0.00278425396671889,0.245876282481618,-0.498964096418999, + -1.99388352073449e-06,-0.00267630730447754,0.253820729376194,-0.523847137347378, + -1.99978850323745e-06,-0.0025683606422362,0.261765176270771,-0.548730178275756, + -2.00569348585145e-06,-0.00246041397999552,0.269709623165347,-0.573613219204134, + -2.01159846802135e-06,-0.00235246731775418,0.277654070059923,-0.598496260132512, + -2.01750345041329e-06,-0.00224452065551306,0.2855985169545,-0.62337930106089, + -2.02340843291626e-06,-0.00213657399327172,0.293542963849076,-0.648262341989269, + -2.02931341519719e-06,-0.00202862733103037,0.301487410743653,-0.673145382917647, + -2.03521839703402e-06,-0.00192068066878903,0.309431857638229,-0.698028423846025, + -2.0411233800921e-06,-0.00181273400654902,0.317376304532805,-0.722911464774403, + -2.04702836203996e-06,-0.00170478734430679,0.325320751427382,-0.747794505702781, + -2.05293334465395e-06,-0.00159684068206589,0.333265198321958,-0.772677546631159, + -2.05883832649079e-06,-0.00148889401982411,0.341209645216535,-0.797560587559538, + -1.37465923455427e-06,-0.00404390747655059,0.150309438262744,-0.200549246064803, + -1.37840823793978e-06,-0.003940833169086,0.158217029323549,-0.225454350846831, + -1.38215724149182e-06,-0.00383775886162163,0.166124620384354,-0.250359455628859, + -1.38590624476631e-06,-0.00373468455415704,0.174032211445159,-0.275264560410887, + -1.38965524848489e-06,-0.0036316102466929,0.181939802505964,-0.300169665192915, + -1.39340425220347e-06,-0.00352853593922875,0.189847393566769,-0.325074769974944, + -1.3971532557e-06,-0.00342546163176438,0.197754984627574,-0.349979874756972, + -1.40090225941858e-06,-0.00332238732430024,0.205662575688379,-0.374884979539, + -1.40465126247102e-06,-0.00321931301683542,0.213570166749184,-0.399790084321028, + -1.4084002661896e-06,-0.00311623870937128,0.221477757809989,-0.424695189103056, + -1.41214927007471e-06,-0.00301316440190735,0.229385348870794,-0.449600293885084, + -1.41589827351574e-06,-0.00291009009444299,0.237292939931598,-0.474505398667112, + -1.41964727695676e-06,-0.0028070157869784,0.245200530992403,-0.499410503449141, + -1.42339628061983e-06,-0.00270394147951425,0.253108122053208,-0.524315608231169, + -1.42714528428289e-06,-0.0026008671720501,0.261015713114013,-0.549220713013197, + -1.43089428783494e-06,-0.00249779286458574,0.268923304174818,-0.574125817795225, + -1.43464329105392e-06,-0.0023947185571207,0.276830895235624,-0.599030922577253, + -1.43839229493903e-06,-0.00229164424965722,0.284738486296428,-0.623936027359281, + -1.44214129815801e-06,-0.00218856994219285,0.292646077357233,-0.648841132141309, + -1.44589030171005e-06,-0.00208549563472804,0.300553668418038,-0.673746236923337, + -1.44963930581721e-06,-0.00198242132726456,0.308461259478843,-0.698651341705366, + -1.45338830892516e-06,-0.00187934701979975,0.316368850539648,-0.723556446487394, + -1.4571373129213e-06,-0.00177627271233627,0.324276441600452,-0.748461551269422, + -1.46088631669539e-06,-0.00167319840487146,0.332184032661258,-0.77336665605145, + -1.46463531969232e-06,-0.00157012409740709,0.340091623722063,-0.798271760833478, + -0.000181201626823391,-0.0313793041347652,0.224181556802017,-0.136858951696573, + -0.000194964032887435,-0.031112869119811,0.243017255725212,-0.153104187665781, + -0.00020872643895159,-0.030846434104857,0.261852954648408,-0.169349423634989, + -0.000222488845015745,-0.0305799990899031,0.280688653571603,-0.185594659604197, + -0.0002362512510799,-0.030313564074949,0.299524352494798,-0.201839895573404, + -0.000250013657144055,-0.0300471290599948,0.318360051417994,-0.218085131542612, + -0.000263776063208598,-0.0297806940450411,0.337195750341189,-0.23433036751182, + -0.000277538469272531,-0.029514259030087,0.356031449264384,-0.250575603481028, + -0.000291300875336686,-0.029247824015133,0.374867148187579,-0.266820839450235, + -0.000305063281400786,-0.0289813890001784,0.393702847110775,-0.283066075419443, + -0.000318825687464996,-0.0287149539852243,0.41253854603397,-0.29931131138865, + -0.000332588093529096,-0.0284485189702708,0.431374244957165,-0.315556547357858, + -0.00034635049959364,-0.0281820839553166,0.450209943880361,-0.331801783327066, + -0.00036011290565785,-0.0279156489403627,0.469045642803556,-0.348047019296274, + -0.000373875311721616,-0.0276492139254083,0.487881341726751,-0.364292255265481, + -0.000387637717786271,-0.027382778910455,0.506717040649946,-0.380537491234689, + -0.000401400123849927,-0.0271163438955002,0.525552739573142,-0.396782727203897, + -0.000415162529914359,-0.0268499088805465,0.544388438496337,-0.413027963173104, + -0.000428924935978126,-0.0265834738655919,0.563224137419533,-0.429273199142312, + -0.000442687342042336,-0.026317038850638,0.582059836342728,-0.44551843511152, + -0.000456449748106991,-0.0260506038356842,0.600895535265924,-0.461763671080728, + -0.000470212154170868,-0.0257841688207301,0.619731234189118,-0.478008907049935, + -0.000483974560234968,-0.0255177338057759,0.638566933112314,-0.494254143019143, + -0.0004977369662994,-0.0252512987908222,0.657402632035509,-0.510499378988351, + -0.000511499372363722,-0.0249848637758681,0.676238330958705,-0.526744614957558, + -0.000178508613633555,-0.0306316557916103,0.223336230760757,-0.138208101102135, + -0.000191916250282753,-0.0303387950758676,0.242015347908285,-0.154608440860078, + -0.000205323886931452,-0.0300459343601241,0.260694465055813,-0.171008780618022, + -0.000218731523580595,-0.0297530736443813,0.279373582203341,-0.187409120375965, + -0.000232139160229516,-0.0294602129286381,0.298052699350868,-0.203809460133909, + -0.000245546796878326,-0.029167352212895,0.316731816498396,-0.220209799891852, + -0.000258954433527248,-0.0288744914971517,0.335410933645924,-0.236610139649796, + -0.000272362070176391,-0.0285816307814089,0.354090050793452,-0.253010479407739, + -0.00028576970682509,-0.0282887700656653,0.37276916794098,-0.269410819165682, + -0.000299177343474288,-0.0279959093499227,0.391448285088507,-0.285811158923626, + -0.000312584980123209,-0.0277030486341792,0.410127402236035,-0.302211498681569, + -0.000325992616772464,-0.0274101879184367,0.428806519383563,-0.318611838439513, + -0.000339400253421052,-0.0271173272026932,0.447485636531091,-0.335012178197456, + -0.000352807890069973,-0.0268244664869499,0.466164753678619,-0.3514125179554, + -0.000366215526718894,-0.0265316057712066,0.484843870826147,-0.367812857713343, + -0.000379623163367926,-0.0262387450554642,0.503522987973674,-0.384213197471287, + -0.000393030800017069,-0.0259458843397209,0.522202105121202,-0.40061353722923, + -0.00040643843666599,-0.025653023623978,0.540881222268729,-0.417013876987174, + -0.000419846073314911,-0.025360162908235,0.559560339416257,-0.433414216745117, + -0.000433253709963721,-0.0250673021924912,0.578239456563785,-0.449814556503061, + -0.000446661346612531,-0.0247744414767479,0.596918573711313,-0.466214896261004, + -0.000460068983261896,-0.0244815807610053,0.615597690858841,-0.482615236018947, + -0.000473476619910262,-0.0241887200452622,0.634276808006368,-0.499015575776891, + -0.000486884256560072,-0.0238958593295195,0.652955925153896,-0.515415915534835, + -0.000500291893208882,-0.0236029986137765,0.671635042301424,-0.531816255292778, + -0.000174860756161854,-0.0296443738569953,0.222178602899426,-0.140013454245716, + -0.000187794628576432,-0.0293178478489339,0.240645149278726,-0.156621344858606, + -0.000200728500990788,-0.0289913218408724,0.259111695658025,-0.173229235471497, + -0.000213662373405477,-0.0286647958328111,0.277578242037325,-0.189837126084387, + -0.000226596245819721,-0.0283382698247495,0.296044788416624,-0.206445016697278, + -0.000239530118234355,-0.0280117438166885,0.314511334795923,-0.223052907310168, + -0.000252463990649043,-0.0276852178086273,0.332977881175223,-0.239660797923059, + -0.000265397863063677,-0.0273586918005659,0.351444427554522,-0.256268688535949, + -0.000278331735477699,-0.0270321657925039,0.369910973933822,-0.272876579148839, + -0.00029126560789261,-0.026705639784443,0.388377520313121,-0.28948446976173, + -0.000304199480307021,-0.0263791137763816,0.406844066692421,-0.306092360374621, + -0.000317133352721433,-0.02605258776832,0.425310613071721,-0.322700250987511, + -0.000330067225136066,-0.0257260617602588,0.44377715945102,-0.339308141600401, + -0.000343001097550477,-0.0253995357521974,0.462243705830319,-0.355916032213292, + -0.000355934969965555,-0.0250730097441367,0.480710252209618,-0.372523922826182, + -0.000368868842379744,-0.0247464837360749,0.499176798588918,-0.389131813439073, + -0.000381802714794155,-0.0244199577280133,0.517643344968218,-0.405739704051963, + -0.00039473658720901,-0.0240934317199522,0.536109891347517,-0.422347594664854, + -0.000407670459623422,-0.023766905711891,0.554576437726816,-0.438955485277744, + -0.000420604332037944,-0.0234403797038298,0.573042984106116,-0.455563375890635, + -0.000433538204452133,-0.0231138536957678,0.591509530485416,-0.472171266503525, + -0.000446472076866433,-0.022787327687706,0.609976076864715,-0.488779157116416, + -0.0004594059492814,-0.022460801679645,0.628442623244015,-0.505387047729306, + -0.000472339821695922,-0.0221342756715841,0.646909169623314,-0.521994938342197, + -0.000485273694110555,-0.0218077496635227,0.665375716002613,-0.538602828955087, + -0.00016998050449446,-0.0283674951077179,0.220608085680564,-0.142390670383804, + -0.000182292630499015,-0.0279996121384419,0.238789416158635,-0.159271855583745, + -0.000194604756503736,-0.0276317291691663,0.256970746636706,-0.176153040783685, + -0.000206916882508346,-0.0272638461998902,0.275152077114777,-0.193034225983625, + -0.000219229008512956,-0.0268959632306144,0.293333407592848,-0.209915411183566, + -0.000231541134517677,-0.0265280802613386,0.311514738070919,-0.226796596383506, + -0.000243853260522064,-0.0261601972920624,0.32969606854899,-0.243677781583446, + -0.000256165386526952,-0.0257923143227867,0.347877399027061,-0.260558966783387, + -0.000268477512531506,-0.0254244313535108,0.366058729505132,-0.277440151983327, + -0.000280789638536394,-0.0250565483842353,0.384240059983203,-0.294321337183267, + -0.000293101764541004,-0.0246886654149594,0.402421390461274,-0.311202522383208, + -0.000305413890545725,-0.0243207824456837,0.420602720939345,-0.328083707583148, + -0.000317726016550224,-0.0239528994764078,0.438784051417416,-0.344964892783088, + -0.000330038142554612,-0.0235850165071316,0.456965381895487,-0.361846077983029, + -0.000342350268559333,-0.0232171335378559,0.475146712373557,-0.378727263182969, + -0.000354662394563943,-0.02284925056858,0.493328042851629,-0.395608448382909, + -0.000366974520568997,-0.022481367599305,0.511509373329699,-0.41248963358285, + -0.000379286646573385,-0.0221134846300288,0.52969070380777,-0.42937081878279, + -0.000391598772577995,-0.0217456016607529,0.547872034285841,-0.44625200398273, + -0.000403910898582716,-0.021377718691477,0.566053364763912,-0.463133189182671, + -0.000416223024587326,-0.0210098357222011,0.584234695241983,-0.480014374382611, + -0.000428535150591602,-0.0206419527529245,0.602416025720055,-0.496895559582551, + -0.000440847276595879,-0.0202740697836483,0.620597356198125,-0.513776744782491, + -0.000453159402601044,-0.0199061868143735,0.638778686676196,-0.530657929982432, + -0.000465471528605543,-0.0195383038450974,0.656960017154267,-0.547539115182373, + -0.000163560643764105,-0.026760430442765,0.218505891058895,-0.145455363009714, + -0.000175075641198785,-0.026344239466899,0.236310613971572,-0.162688877933575, + -0.00018659063863341,-0.0259280484910333,0.254115336884249,-0.179922392857436, + -0.00019810563606798,-0.0255118575151669,0.271920059796926,-0.197155907781297, + -0.00020962063350255,-0.025095666539301,0.289724782709604,-0.214389422705158, + -0.000221135630937397,-0.0246794755634354,0.30752950562228,-0.231622937629019, + -0.000232650628371578,-0.024263284587569,0.325334228534958,-0.248856452552881, + -0.000244165625806148,-0.0238470936117028,0.343138951447635,-0.266089967476742, + -0.000255680623240828,-0.023430902635837,0.360943674360312,-0.283323482400603, + -0.000267195620675342,-0.0230147116599706,0.37874839727299,-0.300556997324464, + -0.000278710618110023,-0.0225985206841048,0.396553120185666,-0.317790512248325, + -0.000290225615544482,-0.0221823297082386,0.414357843098344,-0.335024027172186, + -0.000301740612979273,-0.0217661387323729,0.432162566011021,-0.352257542096047, + -0.000313255610413621,-0.0213499477565064,0.449967288923698,-0.369491057019908, + -0.00032477060784819,-0.0209337567806405,0.467772011836375,-0.386724571943769, + -0.000336285605282982,-0.0205175658047749,0.485576734749052,-0.40395808686763, + -0.000347800602717663,-0.0201013748289094,0.503381457661729,-0.421191601791491, + -0.000359315600152232,-0.019685183853043,0.521186180574406,-0.438425116715352, + -0.00037083059758658,-0.0192689928771768,0.538990903487083,-0.455658631639213, + -0.000382345595021372,-0.0188528019013103,0.556795626399761,-0.472892146563074, + -0.000393860592456052,-0.0184366109254448,0.574600349312438,-0.490125661486936, + -0.000405375589889956,-0.0180204199495781,0.592405072225115,-0.507359176410797, + -0.000416890587324747,-0.0176042289737124,0.610209795137792,-0.524592691334657, + -0.000428405584759317,-0.0171880379978462,0.62801451805047,-0.541826206258519, + -0.000439920582194331,-0.0167718470219809,0.645819240963146,-0.55905972118238, + -0.000155303464255907,-0.0248069936288694,0.215745010319136,-0.149300356239133, + -0.000165827440043398,-0.0243382219842224,0.233063045746992,-0.166975907467563, + -0.000176351415830944,-0.0238694503395758,0.250381081174847,-0.184651458695993, + -0.000186875391618713,-0.0234006786949291,0.267699116602703,-0.202327009924424, + -0.000197399367406148,-0.0229319070502826,0.285017152030558,-0.220002561152854, + -0.000207923343193583,-0.0224631354056357,0.302335187458413,-0.237678112381285, + -0.000218447318981296,-0.021994363760989,0.319653222886269,-0.255353663609715, + -0.000228971294768954,-0.0215255921163426,0.336971258314124,-0.273029214838146, + -0.000239495270556667,-0.0210568204716959,0.35428929374198,-0.290704766066576, + -0.000250019246343824,-0.0205880488270487,0.371607329169835,-0.308380317295006, + -0.000260543222131537,-0.0201192771824024,0.38892536459769,-0.326055868523437, + -0.000271067197919028,-0.0196505055377556,0.406243400025546,-0.343731419751867, + -0.00028159117370663,-0.0191817338931091,0.423561435453401,-0.361406970980298, + -0.000292115149494343,-0.0187129622484625,0.440879470881257,-0.379082522208728, + -0.000302639125281945,-0.018244190603816,0.458197506309112,-0.396758073437158, + -0.000313163101069325,-0.017775418959169,0.475515541736967,-0.414433624665589, + -0.00032368707685726,-0.0173066473145227,0.492833577164823,-0.432109175894019, + -0.000334211052644418,-0.0168378756698753,0.510151612592678,-0.44978472712245, + -0.000344735028431797,-0.0163691040252287,0.527469648020533,-0.46746027835088, + -0.000355259004219399,-0.0159003323805817,0.544787683448389,-0.485135829579311, + -0.000365782980007445,-0.0154315607359363,0.562105718876244,-0.502811380807741, + -0.000376306955794714,-0.0149627890912889,0.5794237543041,-0.520486932036171, + -0.000386830931582427,-0.0144940174466424,0.596741789731955,-0.538162483264601, + -0.000397354907369474,-0.0140252458019949,0.614059825159811,-0.555838034493032, + -0.000407878883157298,-0.0135564741573484,0.631377860587666,-0.573513585721463, + -0.000144990681892998,-0.022532879574928,0.212212649733898,-0.153963066158947, + -0.000154330511624501,-0.0220124161465299,0.228919303189943,-0.172174661780502, + -0.000163670341356059,-0.0214919527181319,0.245625956645989,-0.190386257402058, + -0.000173010171087895,-0.0209714892897342,0.262332610102034,-0.208597853023613, + -0.000182350000819287,-0.0204510258613363,0.279039263558079,-0.226809448645169, + -0.000191689830550901,-0.0199305624329382,0.295745917014124,-0.245021044266724, + -0.00020102966028257,-0.0194100990045405,0.31245257047017,-0.26323263988828, + -0.000210369490014406,-0.0188896355761425,0.329159223926215,-0.281444235509835, + -0.000219709319745798,-0.0183691721477446,0.34586587738226,-0.299655831131391, + -0.000229049149477745,-0.0178487087193469,0.362572530838305,-0.317867426752946, + -0.00023838897920947,-0.0173282452909491,0.379279184294351,-0.336079022374502, + -0.000247728808940972,-0.0168077818625512,0.395985837750396,-0.354290617996057, + -0.000257068638672475,-0.0162873184341532,0.412692491206441,-0.372502213617613, + -0.000266408468403867,-0.0157668550057548,0.429399144662487,-0.390713809239169, + -0.000275748298135703,-0.0152463915773573,0.446105798118532,-0.408925404860724, + -0.000285088127867317,-0.0147259281489593,0.462812451574577,-0.427137000482279, + -0.000294427957598931,-0.0142054647205616,0.479519105030622,-0.445348596103835, + -0.000303767787330766,-0.0136850012921639,0.496225758486667,-0.463560191725391, + -0.00031310761706238,-0.0131645378637661,0.512932411942712,-0.481771787346946, + -0.000322447446793994,-0.012644074435368,0.529639065398758,-0.499983382968502, + -0.000331787276525164,-0.0121236110069698,0.546345718854803,-0.518194978590057, + -0.000341127106256889,-0.0116031475785721,0.563052372310848,-0.536406574211612, + -0.000350466935988725,-0.0110826841501743,0.579759025766893,-0.554618169833168, + -0.000359806765720672,-0.0105622207217766,0.596465679222939,-0.572829765454724, + -0.000369146595452174,-0.0100417572933784,0.613172332678984,-0.591041361076279, + -0.00013258055994525,-0.020018509793014,0.20784707051382,-0.159389803808523, + -0.000140574176482944,-0.0194546836470862,0.223812913552605,-0.178225279607066, + -0.00014856779302036,-0.0188908575011577,0.239778756591391,-0.197060755405609, + -0.000156561409557943,-0.0183270313552296,0.255744599630176,-0.215896231204152, + -0.000164555026095636,-0.0177632052093015,0.271710442668962,-0.234731707002696, + -0.000172548642633163,-0.0171993790633733,0.287676285707748,-0.253567182801239, + -0.000180542259170413,-0.0166355529174447,0.303642128746534,-0.272402658599782, + -0.00018853587570844,-0.0160717267715171,0.319607971785319,-0.291238134398325, + -0.000196529492245856,-0.0155079006255887,0.335573814824105,-0.310073610196868, + -0.000204523108783827,-0.0149440744796612,0.35153965786289,-0.328909085995412, + -0.000212516725320744,-0.0143802483337321,0.367505500901676,-0.347744561793955, + -0.00022051034185866,-0.0138164221878043,0.383471343940462,-0.366580037592498, + -0.000228503958396353,-0.0132525960418759,0.399437186979248,-0.385415513391041, + -0.000236497574933825,-0.0126887698959479,0.415403030018034,-0.404250989189584, + -0.000244491191471297,-0.0121249437500197,0.431368873056819,-0.423086464988127, + -0.000252484808008546,-0.0115611176040911,0.447334716095605,-0.44192194078667, + -0.000260478424546906,-0.0109972914581642,0.46330055913439,-0.460757416585214, + -0.000268472041083934,-0.0104334653122353,0.479266402173176,-0.479592892383757, + -0.000276465657621405,-0.00986963916630645,0.495232245211962,-0.4984283681823, + -0.000284459274158988,-0.00930581302037803,0.511198088250748,-0.517263843980843, + -0.000292452890696904,-0.00874198687445071,0.527163931289533,-0.536099319779386, + -0.000300446507234264,-0.00817816072852251,0.543129774328319,-0.554934795577929, + -0.000308440123772069,-0.00761433458259431,0.559095617367105,-0.573770271376472, + -0.000316433740308875,-0.00705050843666521,0.575061460405891,-0.592605747175016, + -0.000324427356847345,-0.00648668229073834,0.591027303444676,-0.611441222973559, + -0.000118305920004058,-0.0173972325122059,0.202682264387483,-0.165411819387931, + -0.000124858604172773,-0.0168066339551569,0.217789206015731,-0.184939610973252, + -0.00013141128834121,-0.0162160353981077,0.232896147643979,-0.204467402558573, + -0.000137963972509647,-0.0156254368410583,0.248003089272226,-0.223995194143894, + -0.000144516656678251,-0.0150348382840091,0.263110030900474,-0.243522985729215, + -0.000151069340846799,-0.0144442397269602,0.278216972528722,-0.263050777314536, + -0.000157622025015458,-0.0138536411699113,0.293323914156969,-0.282578568899857, + -0.000164174709183951,-0.0132630426128617,0.308430855785217,-0.302106360485178, + -0.00017072739335261,-0.0126724440558126,0.323537797413465,-0.321634152070499, + -0.000177280077521158,-0.0120818454987637,0.338644739041713,-0.34116194365582, + -0.000183832761689873,-0.0114912469417148,0.35375168066996,-0.360689735241141, + -0.000190385445858254,-0.0109006483846652,0.368858622298208,-0.380217526826462, + -0.000196938130026636,-0.0103100498276161,0.383965563926456,-0.399745318411784, + -0.00020349081419524,-0.00971945127056695,0.399072505554704,-0.419273109997105, + -0.000210043498363843,-0.00912885271351782,0.414179447182951,-0.438800901582426, + -0.000216596182532669,-0.00853825415646892,0.429286388811199,-0.458328693167747, + -0.000223148866701162,-0.00794765559941979,0.444393330439447,-0.477856484753068, + -0.000229701550869876,-0.00735705704237066,0.459500272067695,-0.497384276338389, + -0.000236254235038147,-0.00676645848532109,0.474607213695942,-0.51691206792371, + -0.000242806919206418,-0.00617585992827152,0.48971415532419,-0.536439859509031, + -0.000249359603375243,-0.00558526137122239,0.504821096952438,-0.555967651094352, + -0.000255912287543847,-0.00499466281417371,0.519928038580686,-0.575495442679673, + -0.000262464971712006,-0.00440406425712414,0.535034980208933,-0.595023234264994, + -0.000269017655880943,-0.0038134657000759,0.550141921837181,-0.614551025850316, + -0.000275570340049325,-0.00322286714302589,0.565248863465429,-0.634078817435636, + -0.000102721984339249,-0.0148324973710203,0.196881300534295,-0.171751042899428, + -0.00010783666674502,-0.0142382113384385,0.211042239576902,-0.192007617805724, + -0.000112951349151125,-0.0136439253058569,0.225203178619509,-0.21226419271202, + -0.000118066031557229,-0.0130496392732753,0.239364117662116,-0.232520767618316, + -0.000123180713963111,-0.0124553532406937,0.253525056704723,-0.252777342524612, + -0.000128295396369438,-0.0118610672081121,0.26768599574733,-0.273033917430908, + -0.000133410078774987,-0.0112667811755298,0.281846934789937,-0.293290492337204, + -0.000138524761181258,-0.0106724951429484,0.296007873832544,-0.3135470672435, + -0.000143639443587362,-0.0100782091103671,0.310168812875151,-0.333803642149796, + -0.000148754125993356,-0.00948392307778523,0.324329751917758,-0.354060217056092, + -0.00015386880839896,-0.00888963704520296,0.338490690960366,-0.374316791962388, + -0.000158983490805009,-0.00829535101262158,0.352651630002973,-0.394573366868684, + -0.000164098173211502,-0.00770106498004042,0.366812569045579,-0.41482994177498, + -0.000169212855617218,-0.00710677894745815,0.380973508088187,-0.435086516681276, + -0.000174327538023045,-0.00651249291487654,0.395134447130794,-0.455343091587571, + -0.000179442220429316,-0.00591820688229516,0.409295386173401,-0.475599666493867, + -0.00018455690283492,-0.00532392084971289,0.423456325216008,-0.495856241400163, + -0.000189671585241191,-0.00472963481713107,0.437617264258615,-0.516112816306459, + -0.000194786267647018,-0.00413534878454991,0.451778203301222,-0.536369391212755, + -0.000199900950052845,-0.00354106275196786,0.465939142343829,-0.556625966119051, + -0.000205015632458894,-0.0029467767193867,0.480100081386436,-0.576882541025347, + -0.00021013031486472,-0.00235249068680465,0.494261020429043,-0.597139115931643, + -0.000215244997271546,-0.00175820465422349,0.50842195947165,-0.617395690837939, + -0.000220359679677706,-0.00116391862164189,0.522582898514258,-0.637652265744235, + -0.000225474362083755,-0.000569632589060731,0.536743837556864,-0.657908840650531, + -8.6652485557559e-05,-0.0124793789045492,0.190733029769109,-0.178064213728622, + -9.04392157989875e-05,-0.0119066285146803,0.203909185421869,-0.199046576831916, + -9.42259460405825e-05,-0.0113338781248116,0.217085341074628,-0.220028939935211, + -9.80126762819555e-05,-0.0107611277349426,0.230261496727388,-0.241011303038506, + -0.000101799406523106,-0.0101883773450735,0.243437652380147,-0.2619936661418, + -0.000105586136764757,-0.00961562695520479,0.256613808032907,-0.282976029245095, + -0.000109372867006075,-0.00904287656533564,0.269789963685667,-0.30395839234839, + -0.000113159597247336,-0.00847012617546672,0.282966119338427,-0.324940755451684, + -0.000116946327488932,-0.00789737578559802,0.296142274991186,-0.345923118554979, + -0.000120733057730193,-0.00732462539572887,0.309318430643946,-0.366905481658273, + -0.000124519787971455,-0.00675187500585972,0.322494586296706,-0.387887844761568, + -0.000128306518213162,-0.00617912461599124,0.335670741949465,-0.408870207864863, + -0.000132093248454535,-0.00560637422612231,0.348846897602225,-0.429852570968157, + -0.000135879978695352,-0.0050336238362525,0.362023053254985,-0.450834934071452, + -0.000139666708937169,-0.00446087344638424,0.375199208907744,-0.471817297174747, + -0.000143453439178653,-0.00388812305651554,0.388375364560504,-0.492799660278041, + -0.000147240169419693,-0.00331537266664594,0.401551520213264,-0.513782023381336, + -0.000151026899661177,-0.00274262227677746,0.414727675866023,-0.53476438648463, + -0.000154813629902661,-0.00216987188690831,0.427903831518783,-0.555746749587925, + -0.000158600360144145,-0.00159712149703939,0.441079987171543,-0.57672911269122, + -0.000162387090385629,-0.00102437110717046,0.454256142824303,-0.597711475794514, + -0.000166173820627558,-0.00045162071730287,0.467432298477061,-0.618693838897809, + -0.000169960550867931,0.000121129672567832,0.480608454129822,-0.639676202001103, + -0.000173747281108749,0.000693880062437202,0.493784609782582,-0.660658565104398, + -0.000177534011350899,0.00126663045230568,0.506960765435341,-0.681640928207693, + -7.1027321613959e-05,-0.0104478336416512,0.184600051096082,-0.184013605863442, + -7.36838230560588e-05,-0.009918610326345,0.196809197647762,-0.205679935662332, + -7.63403244982697e-05,-0.0093893870110392,0.209018344199441,-0.227346265461221, + -7.8996825940203e-05,-0.00886016369573273,0.221227490751121,-0.249012595260111, + -8.16533273819142e-05,-0.00833094038042614,0.233436637302801,-0.270678925059, + -8.43098288239585e-05,-0.0078017170651199,0.245645783854481,-0.29234525485789, + -8.6966330266558e-05,-0.00727249374981431,0.257854930406161,-0.31401158465678, + -8.96228317078807e-05,-0.00674327043450718,0.270064076957841,-0.335677914455669, + -9.2279333150036e-05,-0.00621404711920093,0.282273223509521,-0.357344244254559, + -9.49358345924134e-05,-0.00568482380389512,0.294482370061201,-0.379010574053448, + -9.75923360340136e-05,-0.00515560048858865,0.306691516612881,-0.400676903852338, + -0.000100248837476169,-0.00462637717328218,0.318900663164561,-0.422343233651227, + -0.000102905338917991,-0.00409715385797549,0.331109809716241,-0.444009563450116, + -0.000105561840360369,-0.00356793054267013,0.343318956267921,-0.465675893249006, + -0.000108218341802191,-0.00303870722736388,0.355528102819601,-0.487342223047896, + -0.000110874843244013,-0.00250948391205696,0.367737249371281,-0.509008552846785, + -0.000113531344686169,-0.00198026059675094,0.379946395922961,-0.530674882645675, + -0.00011618784612788,-0.00145103728144425,0.392155542474641,-0.552341212444564, + -0.000118844347570035,-0.000921813966138441,0.404364689026321,-0.574007542243454, + -0.00012150084901219,-0.00039259065083197,0.416573835578001,-0.595673872042343, + -0.000124157350454346,0.000136632664474057,0.428782982129681,-0.617340201841233, + -0.000126813851896501,0.000665855979780083,0.440992128681361,-0.639006531640122, + -0.000129470353338546,0.00119507929508611,0.45320127523304,-0.660672861439012, + -0.000132126854780035,0.00172430261039347,0.465410421784721,-0.682339191237901, + -0.000134783356221746,0.00225352592569994,0.477619568336401,-0.704005521036791, + -5.66735923779316e-05,-0.00878523326279179,0.178835327103749,-0.189335398970885, + -5.84432627911413e-05,-0.00831420363354363,0.190147432215679,-0.211613544088693, + -6.02129332041845e-05,-0.00784317400429546,0.20145953732761,-0.233891689206501, + -6.19826036174498e-05,-0.0073721443750473,0.21277164243954,-0.256169834324309, + -6.37522740309926e-05,-0.0069011147457998,0.224083747551471,-0.278447979442117, + -6.55219444437027e-05,-0.00643008511655085,0.235395852663401,-0.300726124559925, + -6.72916148570235e-05,-0.00595905548730302,0.246707957775332,-0.323004269677733, + -6.90612852701222e-05,-0.00548802585805497,0.258020062887262,-0.345282414795541, + -7.08309556830544e-05,-0.00501699622880669,0.269332167999193,-0.36756055991335, + -7.26006260964862e-05,-0.00454596659955864,0.280644273111123,-0.389838705031157, + -7.43702965095849e-05,-0.00407493697031036,0.291956378223054,-0.412116850148966, + -7.61399669229057e-05,-0.00360390734106253,0.303268483334984,-0.434394995266774, + -7.79096373356714e-05,-0.00313287771181425,0.314580588446915,-0.456673140384582, + -7.96793077489921e-05,-0.00266184808256598,0.325892693558846,-0.47895128550239, + -8.14489781622019e-05,-0.00219081845331792,0.337204798670776,-0.501229430620198, + -8.32186485754116e-05,-0.00171978882406987,0.348516903782706,-0.523507575738006, + -8.49883189885103e-05,-0.00124875919482181,0.359829008894637,-0.545785720855814, + -8.67579894016091e-05,-0.000777729565573537,0.371141114006567,-0.568063865973622, + -8.85276598142637e-05,-0.000306699936324595,0.382453219118498,-0.590342011091431, + -9.02973302275845e-05,0.000164329692923015,0.393765324230428,-0.612620156209239, + -9.20670006414603e-05,0.000635359322170626,0.405077429342359,-0.634898301327047, + -9.3836671054115e-05,0.00110638895141912,0.416389534454289,-0.657176446444855, + -9.56063414672137e-05,0.00157741858066762,0.42770163956622,-0.679454591562663, + -9.73760118809786e-05,0.00204844820991434,0.43901374467815,-0.701732736680471, + -9.91456822939663e-05,0.00251947783916284,0.450325849790081,-0.724010881798279, + -4.41544366463487e-05,-0.00748260075409668,0.173706046862735,-0.193878339384689, + -4.52796283268442e-05,-0.00707573890148239,0.184228454668077,-0.216678759698467, + -4.64048200072842e-05,-0.00666887704886809,0.194750862473419,-0.239479180012245, + -4.75300116875021e-05,-0.00626201519625336,0.205273270278762,-0.262279600326023, + -4.86552033679977e-05,-0.00585515334363906,0.215795678084104,-0.2850800206398, + -4.97803950484377e-05,-0.00544829149102477,0.226318085889447,-0.307880440953578, + -5.09055867286556e-05,-0.00504142963841026,0.236840493694789,-0.330680861267356, + -5.20307784092622e-05,-0.00463456778579618,0.247362901500131,-0.353481281581134, + -5.31559700895357e-05,-0.00422770593318145,0.257885309305474,-0.376281701894912, + -5.42811617703087e-05,-0.0038208440805676,0.268407717110816,-0.39908212220869, + -5.54063534504712e-05,-0.00341398222795308,0.278930124916158,-0.421882542522468, + -5.65315451309667e-05,-0.00300712037533857,0.289452532721501,-0.444682962836246, + -5.76567368110181e-05,-0.00260025852272383,0.299974940526843,-0.467483383150023, + -5.87819284917357e-05,-0.00219339667010998,0.310497348332185,-0.490283803463801, + -5.99071201718981e-05,-0.00178653481749524,0.321019756137528,-0.513084223777579, + -6.10323118526157e-05,-0.00137967296488095,0.33154216394287,-0.535884644091357, + -6.21575035328892e-05,-0.00097281111226688,0.342064571748212,-0.558685064405135, + -6.32826952133847e-05,-0.000565949259652143,0.352586979553555,-0.581485484718913, + -6.44078868934361e-05,-0.000159087407037628,0.363109387358897,-0.604285905032691, + -6.55330785739316e-05,0.000247774445576887,0.37363179516424,-0.627086325346468, + -6.66582702544272e-05,0.000654636298190958,0.384154202969582,-0.649886745660246, + -6.77834619342566e-05,0.00106149815080636,0.394676610774924,-0.672687165974024, + -6.89086536156402e-05,0.0014683600034191,0.405199018580266,-0.695487586287802, + -7.00338452958027e-05,0.00187522185603362,0.415721426385608,-0.71828800660158, + -7.11590369755211e-05,0.00228208370864946,0.426243834190951,-0.741088426915357, + -3.37148869941073e-05,-0.00649508245527053,0.16935618944763,-0.197604168756539, + -3.44027460754681e-05,-0.00615086794371156,0.17921448092606,-0.220832925805578, + -3.50906051568844e-05,-0.00580665343215259,0.18907277240449,-0.244061682854617, + -3.57784642380787e-05,-0.0054624389205935,0.19893106388292,-0.267290439903655, + -3.64663233196061e-05,-0.00511822440903487,0.208789355361349,-0.290519196952694, + -3.71541824009669e-05,-0.00477400989747623,0.218647646839779,-0.313747954001732, + -3.78420414818836e-05,-0.0044297953859167,0.228505938318209,-0.336976711050771, + -3.8529900563522e-05,-0.00408558087435806,0.238364229796639,-0.360205468099809, + -3.92177596448828e-05,-0.0037413663627992,0.248222521275069,-0.383434225148848, + -3.99056187261326e-05,-0.00339715185124034,0.258080812753498,-0.406662982197887, + -4.05934778077155e-05,-0.0030529373396817,0.267939104231928,-0.429891739246925, + -4.12813368889653e-05,-0.00270872282812262,0.277797395710358,-0.453120496295964, + -4.19691959701041e-05,-0.00236450831656332,0.287655687188788,-0.476349253345002, + -4.26570550516869e-05,-0.0020202938050049,0.297513978667218,-0.499578010394041, + -4.33449141328257e-05,-0.00167607929344604,0.307372270145647,-0.522806767443079, + -4.40327732141865e-05,-0.00133186478188674,0.317230561624077,-0.546035524492118, + -4.47206322956584e-05,-0.0009876502703281,0.327088853102507,-0.569264281541157, + -4.54084913775743e-05,-0.000643435758770572,0.336947144580936,-0.592493038590195, + -4.609635045838e-05,-0.000299221247210379,0.346805436059367,-0.615721795639234, + -4.67842095400739e-05,4.49932643480366e-05,0.356663727537796,-0.638950552688272, + -4.74720686211016e-05,0.000389207775907341,0.366522019016226,-0.662179309737311, + -4.81599277020184e-05,0.000733422287467089,0.376380310494657,-0.685408066786349, + -4.88477867841564e-05,0.00107763679902462,0.386238601973086,-0.708636823835388, + -4.95356458651841e-05,0.00142185131058392,0.396096893451516,-0.731865580884426, + -5.02235049457678e-05,0.00176606582214411,0.405955184929946,-0.755094337933465, + -2.53269074744766e-05,-0.00576359696272943,0.165812589859222,-0.200560773090004, + -2.57347397882857e-05,-0.00547555331318617,0.175133322754538,-0.224129433586372, + -2.61425721022057e-05,-0.00518750966364323,0.184454055649854,-0.24769809408274, + -2.65504044159037e-05,-0.00489946601409996,0.193774788545169,-0.271266754579109, + -2.69582367299903e-05,-0.00461142236455747,0.203095521440484,-0.294835415075477, + -2.73660690439659e-05,-0.00432337871501431,0.2124162543358,-0.318404075571845, + -2.77739013578859e-05,-0.00403533506547138,0.221736987231115,-0.341972736068213, + -2.81817336717505e-05,-0.00374729141592822,0.231057720126431,-0.365541396564581, + -2.8589565985282e-05,-0.00345924776638462,0.240378453021747,-0.38911005706095, + -2.8997398299202e-05,-0.00317120411684213,0.249699185917062,-0.412678717557318, + -2.94052306132331e-05,-0.00288316046729875,0.259019918812378,-0.436247378053686, + -2.98130629272642e-05,-0.00259511681775582,0.268340651707693,-0.459816038550054, + -3.02208952411842e-05,-0.0023070731682131,0.277661384603008,-0.483384699046422, + -3.06287275551043e-05,-0.00201902951867039,0.286982117498324,-0.506953359542791, + -3.10365598688023e-05,-0.00173098586912679,0.29630285039364,-0.530522020039159, + -3.14443921828333e-05,-0.00144294221958408,0.305623583288955,-0.554090680535527, + -3.18522244966424e-05,-0.0011548985700407,0.314944316184271,-0.577659341031895, + -3.22600568100073e-05,-0.000866854920496873,0.324265049079587,-0.601228001528264, + -3.26678891243715e-05,-0.000578811270954827,0.333585781974902,-0.624796662024632, + -3.30757214377364e-05,-0.000290767621410559,0.342906514870218,-0.648365322521, + -3.34835537521005e-05,-2.72397186851236e-06,0.352227247765533,-0.671933983017368, + -3.38913860662426e-05,0.000285319677674423,0.361547980660848,-0.695502643513736, + -3.42992183800517e-05,0.000573363327217802,0.370868713556164,-0.719071304010104, + -3.47070506944158e-05,0.000861406976759849,0.380189446451479,-0.742639964506473, + -3.51148830076697e-05,0.00114945062630367,0.389510179346795,-0.766208625002841, + -1.8783850970705e-05,-0.0052299450629808,0.163017770292857,-0.202846187453344, + -1.90205372084806e-05,-0.004989251250889,0.171916578229367,-0.226677588625522, + -1.92572234464228e-05,-0.00474855743879754,0.180815386165876,-0.2505089897977, + -1.94939096846425e-05,-0.00450786362670641,0.189714194102386,-0.274340390969877, + -1.97305959224181e-05,-0.00426716981461484,0.198613002038896,-0.298171792142055, + -1.99672821603603e-05,-0.00402647600252304,0.207511809975406,-0.322003193314233, + -2.02039683986355e-05,-0.00378578219043213,0.216410617911916,-0.345834594486411, + -2.04406546364666e-05,-0.00354508837834056,0.225309425848426,-0.369665995658589, + -2.06773408743532e-05,-0.0033043945662492,0.234208233784935,-0.393497396830766, + -2.0914027112573e-05,-0.00306370075415785,0.243107041721445,-0.417328798002944, + -2.1150713350182e-05,-0.00282300694206561,0.252005849657956,-0.441160199175122, + -2.13873995880132e-05,-0.00258231312997403,0.260904657594466,-0.464991600347299, + -2.16240858261774e-05,-0.0023416193178829,0.269803465530975,-0.488823001519477, + -2.18607720640085e-05,-0.00210092550579133,0.278702273467485,-0.512654402691655, + -2.20974583020617e-05,-0.0018602316937002,0.287601081403995,-0.536485803863833, + -2.23341445404479e-05,-0.00161953788160907,0.296499889340505,-0.560317205036011, + -2.2570830778279e-05,-0.00137884406951772,0.305398697277014,-0.584148606208188, + -2.28075170155551e-05,-0.00113815025742525,0.314297505213525,-0.607980007380366, + -2.30442032542744e-05,-0.000897456445334566,0.323196313150035,-0.631811408552544, + -2.32808894922165e-05,-0.000656762633243435,0.332095121086544,-0.655642809724722, + -2.35175757300476e-05,-0.000416068821151416,0.340993929023054,-0.6794742108969, + -2.37542619677678e-05,-0.000175375009059398,0.349892736959565,-0.703305612069077, + -2.39909482064871e-05,6.5318803031289e-05,0.358791544896074,-0.727137013241255, + -2.42276344442072e-05,0.000306012615122864,0.367690352832584,-0.750968414413433, + -2.44643206812611e-05,0.000546706427215771,0.376589160769095,-0.774799815585611, + -1.37954632438153e-05,-0.00484425669981303,0.160868623283244,-0.204577197891451, + -1.39311530069075e-05,-0.00464171414675896,0.16944414443389,-0.228607603174059, + -1.40668427697221e-05,-0.00443917159370444,0.178019665584536,-0.252638008456667, + -1.42025325325368e-05,-0.00423662904064992,0.186595186735182,-0.276668413739276, + -1.4338222295518e-05,-0.00403408648759562,0.195170707885828,-0.300698819021884, + -1.44739120585546e-05,-0.00383154393454155,0.203746229036474,-0.324729224304492, + -1.46096018212027e-05,-0.00362900138148681,0.21232175018712,-0.3487596295871, + -1.47452915842394e-05,-0.00342645882843251,0.220897271337766,-0.372790034869709, + -1.48809813473871e-05,-0.00322391627537866,0.229472792488412,-0.396820440152317, + -1.50166711101463e-05,-0.00302137372232392,0.238048313639058,-0.420850845434925, + -1.51523608730164e-05,-0.00281883116926962,0.246623834789704,-0.444881250717534, + -1.52880506358866e-05,-0.00261628861621532,0.25519935594035,-0.468911656000142, + -1.54237403990898e-05,-0.00241374606316125,0.263774877090996,-0.49294206128275, + -1.55594301614048e-05,-0.00221120351010584,0.272350398241642,-0.516972466565358, + -1.56951199247191e-05,-0.00200866095705243,0.280925919392287,-0.541002871847967, + -1.58308096877002e-05,-0.00180611840399814,0.289501440542933,-0.565033277130575, + -1.59664994504594e-05,-0.0016035758509434,0.298076961693579,-0.589063682413183, + -1.61021892132185e-05,-0.00140103329788888,0.306652482844225,-0.613094087695792, + -1.62378789767548e-05,-0.00119849074483547,0.315228003994871,-0.6371244929784, + -1.63735687394029e-05,-0.000995948191780283,0.323803525145518,-0.661154898261008, + -1.650925850194e-05,-0.000793405638725986,0.332379046296163,-0.685185303543616, + -1.66449482655873e-05,-0.000590863085672577,0.340954567446809,-0.709215708826225, + -1.67806380280133e-05,-0.00038832053261828,0.349530088597454,-0.733246114108833, + -1.69163277909945e-05,-0.000185777979562651,0.358105609748101,-0.757276519391441, + -1.70520175530875e-05,1.67645734920896e-05,0.366681130898747,-0.78130692467405, + -1.00576699147426e-05,-0.00456702303964351,0.159247652011238,-0.205868193197421, + -1.0135185701865e-05,-0.00439422047996585,0.167579980382908,-0.230047016633253, + -1.0212701489265e-05,-0.00422141792028874,0.175912308754578,-0.254225840069085, + -1.02902172761654e-05,-0.00404861536061096,0.184244637126249,-0.278404663504917, + -1.03677330632324e-05,-0.00387581280093308,0.192576965497919,-0.302583486940748, + -1.04452488506879e-05,-0.00370301024125586,0.20090929386959,-0.32676231037658, + -1.05227646374773e-05,-0.00353020768157797,0.20924162224126,-0.350941133812412, + -1.06002804247662e-05,-0.00335740512190075,0.21757395061293,-0.375119957248244, + -1.06777962113336e-05,-0.00318460256222242,0.225906278984601,-0.399298780684076, + -1.07553119989001e-05,-0.0030118000025452,0.234238607356271,-0.423477604119908, + -1.08328277860226e-05,-0.00283899744286753,0.242570935727942,-0.447656427555739, + -1.09103435724789e-05,-0.0026661948831892,0.250903264099612,-0.471835250991571, + -1.09878593598234e-05,-0.0024933923235122,0.259235592471282,-0.496014074427403, + -1.10653751469458e-05,-0.00232058976383476,0.267567920842952,-0.520192897863235, + -1.11428909340683e-05,-0.00214778720415709,0.275900249214623,-0.544371721299067, + -1.12204067215238e-05,-0.00197498464447943,0.284232577586293,-0.568550544734899, + -1.12979225077581e-05,-0.00180218208480132,0.292564905957964,-0.592729368170731, + -1.13754382948805e-05,-0.00162937952512321,0.300897234329634,-0.616908191606562, + -1.14529540830022e-05,-0.0014565769654471,0.309229562701304,-0.641087015042394, + -1.15304698701246e-05,-0.00128377440576966,0.317561891072974,-0.665265838478226, + -1.1607985656692e-05,-0.00111097184609177,0.325894219444644,-0.689444661914058, + -1.16855014437034e-05,-0.000938169286413437,0.334226547816315,-0.71362348534989, + -1.17630172306038e-05,-0.000765366726735994,0.342558876187985,-0.737802308785722, + -1.18405330183924e-05,-0.000592564167059439,0.350891204559655,-0.761981132221554, + -1.19180488048487e-05,-0.000419761607380664,0.359223532931326,-0.786159955657385, + -7.29283658090774e-06,-0.00436834400669828,0.158042682794528,-0.206819971217035, + -7.33731940139037e-06,-0.00421817220059251,0.166194578572552,-0.23110821498561, + -7.38180222170648e-06,-0.00406800039448674,0.174346474350575,-0.255396458754186, + -7.42628504235565e-06,-0.00391782858838119,0.182498370128599,-0.279684702522762, + -7.47076786294931e-06,-0.00376765678227553,0.190650265906622,-0.303972946291337, + -7.51525068343195e-06,-0.00361748497616965,0.198802161684646,-0.328261190059913, + -7.55973350391459e-06,-0.00346731317006421,0.206954057462669,-0.352549433828488, + -7.60421632450825e-06,-0.00331714136395855,0.215105953240692,-0.376837677597064, + -7.64869914465782e-06,-0.00316696955785201,0.223257849018716,-0.401125921365639, + -7.69318196547353e-06,-0.00301679775174679,0.23140974479674,-0.425414165134215, + -7.7376647861227e-06,-0.00286662594564135,0.239561640574763,-0.449702408902791, + -7.78214760666085e-06,-0.0027164541395357,0.247713536352787,-0.473990652671366, + -7.82663042686593e-06,-0.00256628233342915,0.255865432130811,-0.498278896439942, + -7.8711132475151e-06,-0.00241611052732416,0.264017327908834,-0.522567140208517, + -7.91559606772019e-06,-0.00226593872121783,0.272169223686857,-0.546855383977093, + -7.96007888870243e-06,-0.00211576691511306,0.28032111946488,-0.571143627745669, + -8.00456170868546e-06,-0.00196559510900607,0.288473015242905,-0.595431871514244, + -8.04904452911259e-06,-0.00181542330290041,0.296624911020928,-0.61972011528282, + -8.09352734987279e-06,-0.00166525149679497,0.304776806798951,-0.644008359051395, + -8.13801017041094e-06,-0.00151507969068909,0.312928702576975,-0.668296602819971, + -8.18249299028295e-06,-0.00136490788458277,0.321080598354999,-0.692584846588546, + -8.22697581137621e-06,-0.00121473607847777,0.329232494133022,-0.716873090357122, + -8.27145863191436e-06,-0.00106456427237234,0.337384389911045,-0.741161334125698, + -8.3159414518974e-06,-0.000914392466265568,0.345536285689069,-0.765449577894273, + -8.36042427254657e-06,-0.000764220660160575,0.353688181467092,-0.789737821662849, + -5.26701267977714e-06,-0.00422618296398847,0.157156541514628,-0.207515707361147, + -5.29283753597509e-06,-0.0040929330193602,0.165175931345386,-0.2318839358308, + -5.31866239233958e-06,-0.00395968307473227,0.173195321176145,-0.256252164300453, + -5.34448724853753e-06,-0.00382643313010433,0.181214711006903,-0.280620392770105, + -5.370312104791e-06,-0.00369318318547585,0.189234100837662,-0.304988621239758, + -5.39613696126651e-06,-0.00355993324084802,0.19725349066842,-0.329356849709411, + -5.42196181751997e-06,-0.0034266832962202,0.205272880499178,-0.353725078179063, + -5.44778667382895e-06,-0.00329343335159193,0.213292270329937,-0.378093306648716, + -5.4736115300269e-06,-0.00316018340696389,0.221311660160695,-0.402461535118369, + -5.49943638605832e-06,-0.0030269334623354,0.229331049991454,-0.426829763588022, + -5.52526124297792e-06,-0.00289368351770847,0.237350439822212,-0.451197992057674, + -5.55108609923138e-06,-0.00276043357307998,0.24536982965297,-0.475566220527327, + -5.57691095515178e-06,-0.00262718362845171,0.253389219483729,-0.49993444899698, + -5.60273581151627e-06,-0.00249393368382322,0.261408609314488,-0.524302677466633, + -5.62856066776973e-06,-0.00236068373919562,0.269427999145246,-0.548670905936285, + -5.65438552424524e-06,-0.0022274337945678,0.277447388976004,-0.573039134405938, + -5.68021038060973e-06,-0.00209418384993931,0.285466778806763,-0.597407362875591, + -5.70603523697422e-06,-0.00196093390531171,0.293486168637521,-0.621775591345244, + -5.73186009300564e-06,-0.00182768396068278,0.30150555846828,-0.646143819814896, + -5.75768494948115e-06,-0.00169443401605562,0.309524948299038,-0.670512048284549, + -5.78350980573461e-06,-0.00156118407142758,0.317544338129796,-0.694880276754202, + -5.80933466187705e-06,-0.00142793412679909,0.325563727960555,-0.719248505223854, + -5.83515951835256e-06,-0.00129468418217193,0.333583117791313,-0.743616733693507, + -5.86098437460603e-06,-0.00116143423754256,0.341602507622072,-0.76798496216316, + -5.88680923063745e-06,-0.00102818429291451,0.349621897452831,-0.792353190632813, + -3.7929089066191e-06,-0.00412453948172586,0.156509992496728,-0.208021117756644, + -3.80816581302401e-06,-0.00400378321276129,0.164432800452917,-0.232447450293115, + -3.82342271937341e-06,-0.0038830269437965,0.172355608409106,-0.256873782829585, + -3.83867962588935e-06,-0.00376227067483215,0.180278416365295,-0.281300115366056, + -3.85393653240529e-06,-0.00364151440586769,0.188201224321484,-0.305726447902526, + -3.86919343864367e-06,-0.00352075813690256,0.196124032277674,-0.330152780438997, + -3.88445034538165e-06,-0.0034000018679381,0.204046840233863,-0.354579112975468, + -3.89970725139799e-06,-0.00327924559897319,0.211969648190052,-0.379005445511938, + -3.91496415808046e-06,-0.00315848933000873,0.219892456146241,-0.403431778048409, + -3.93022106437435e-06,-0.00303773306104405,0.22781526410243,-0.427858110584879, + -3.94547797077927e-06,-0.00291697679207958,0.23573807205862,-0.45228444312135, + -3.96073487718418e-06,-0.0027962205231149,0.243660880014809,-0.476710775657821, + -3.97599178414421e-06,-0.00267546425415066,0.251583687970998,-0.501137108194291, + -3.9912486904381e-06,-0.00255470798518598,0.259506495927187,-0.525563440730762, + -4.00650559684301e-06,-0.00243395171622152,0.267429303883376,-0.549989773267232, + -4.02176250324793e-06,-0.00231319544725683,0.275352111839565,-0.574416105803703, + -4.03701940987489e-06,-0.00219243917829237,0.283274919795754,-0.598842438340174, + -4.05227631583571e-06,-0.0020716829093268,0.291197727751944,-0.623268770876644, + -4.06753322268472e-06,-0.001950926640363,0.299120535708133,-0.647695103413115, + -4.08279012875656e-06,-0.00183017037139832,0.307043343664322,-0.672121435949585, + -4.09804703493943e-06,-0.00170941410243231,0.314966151620512,-0.696547768486056, + -4.11330394201048e-06,-0.0015886578334694,0.3228889595767,-0.720974101022527, + -4.12856084797131e-06,-0.00146790156450338,0.33081176753289,-0.745400433558997, + -4.14381775470929e-06,-0.00134714529553959,0.338734575489079,-0.769826766095468, + -4.15907466067011e-06,-0.00122638902657402,0.346657383445268,-0.794253098631938, + -2.72563913966684e-06,-0.0040518900022144,0.156040960067775,-0.208386606462226, + -2.73485035878762e-06,-0.00394027400304098,0.163893754584341,-0.232854957090053, + -2.74406157790841e-06,-0.00382865800386778,0.171746549100906,-0.257323307717879, + -2.7532727970847e-06,-0.0037170420046948,0.179599343617471,-0.281791658345706, + -2.76248401603896e-06,-0.00360542600552116,0.187452138134037,-0.306260008973533, + -2.77169523510423e-06,-0.00349381000634774,0.195304932650603,-0.33072835960136, + -2.78090645444706e-06,-0.00338219400717477,0.203157727167168,-0.355196710229186, + -2.79011767329029e-06,-0.00327057800800135,0.211010521683733,-0.379665060857013, + -2.79932889218903e-06,-0.00315896200882793,0.218863316200299,-0.40413341148484, + -2.80854011158738e-06,-0.00304734600965517,0.226716110716864,-0.428601762112666, + -2.81775133059714e-06,-0.00293573001048153,0.23456890523343,-0.453070112740493, + -2.8269625496069e-06,-0.00282411401130833,0.242421699749995,-0.47753846336832, + -2.83617376861667e-06,-0.00271249801213469,0.250274494266561,-0.502006813996147, + -2.84538498740439e-06,-0.00260088201296127,0.258127288783126,-0.526475164623973, + -2.85459620708028e-06,-0.00248926601378852,0.265980083299692,-0.5509435152518, + -2.863807425868e-06,-0.00237765001461465,0.273832877816258,-0.575411865879626, + -2.87301864465572e-06,-0.00226603401544168,0.281685672332822,-0.599880216507453, + -2.88222986355446e-06,-0.00215441801626781,0.289538466849388,-0.62434856713528, + -2.89144108323036e-06,-0.00204280201709528,0.297391261365954,-0.648816917763107, + -2.90065230224013e-06,-0.00193118601792186,0.305244055882519,-0.673285268390933, + -2.90986352113887e-06,-0.00181957001874844,0.313096850399085,-0.69775361901876, + -2.91907473981556e-06,-0.00170795401957413,0.320949644915651,-0.722221969646587, + -2.92828595904737e-06,-0.0015963380204016,0.328802439432216,-0.746690320274414, + -2.93749717916736e-06,-0.00148472202122951,0.336655233948781,-0.771158670902241, + -2.94670839717792e-06,-0.00137310602205476,0.344508028465347,-0.795627021530067, + -1.95571859751276e-06,-0.00399997040463507,0.155702119707913,-0.208650044438715, + -1.96141511105141e-06,-0.00389499746393041,0.163504361235841,-0.23314868098453, + -1.96711162464558e-06,-0.00379002452322552,0.17130660276377,-0.257647317530345, + -1.97280813812872e-06,-0.00368505158252086,0.179108844291697,-0.282145954076159, + -1.97850465172289e-06,-0.00358007864181609,0.186911085819626,-0.306644590621974, + -1.98420116492848e-06,-0.00347510570111109,0.194713327347554,-0.331143227167789, + -1.98989767885571e-06,-0.00337013276040632,0.202515568875482,-0.355641863713603, + -1.99559419183926e-06,-0.0032651598197011,0.21031781040341,-0.380140500259418, + -2.00129070571098e-06,-0.003160186878997,0.218120051931338,-0.404639136805233, + -2.00698721930515e-06,-0.00305521393829222,0.225922293459266,-0.429137773351047, + -2.01268373267727e-06,-0.00295024099758701,0.233724534987195,-0.453636409896862, + -2.01838024593837e-06,-0.00284526805688223,0.241526776515123,-0.478135046442677, + -2.02407675964356e-06,-0.00274029511617746,0.249329018043051,-0.502633682988492, + -2.02977327301568e-06,-0.00263532217547247,0.257131259570979,-0.527132319534306, + -2.03546978660984e-06,-0.00253034923476836,0.264933501098906,-0.551630956080121, + -2.04116629987094e-06,-0.00242537629406314,0.272735742626835,-0.576129592625935, + -2.04686281346511e-06,-0.00232040335335815,0.280537984154763,-0.60062822917175, + -2.05255932705928e-06,-0.0022154304126536,0.288340225682691,-0.625126865717565, + -2.0582558404314e-06,-0.00211045747194838,0.29614246721062,-0.64962550226338, + -2.06395235391454e-06,-0.00200548453124361,0.303944708738548,-0.674124138809194, + -2.0696488679528e-06,-0.00190051159053972,0.311746950266475,-0.698622775355009, + -2.0753453812139e-06,-0.0017955386498345,0.319549191794404,-0.723121411900824, + -2.08104189391989e-06,-0.0016905657091284,0.327351433322332,-0.747620048446638, + -2.08673840751405e-06,-0.00158559276842407,0.33515367485026,-0.772118684992453, + -2.09243492121924e-06,-0.0014806198277193,0.342955916378188,-0.796617321538268, + -1.40175146834398e-06,-0.00396286657091116,0.155458068124965,-0.208839477139238, + -1.40536158738103e-06,-0.00386269895458025,0.163223912236866,-0.233359891650814, + -1.408971706085e-06,-0.00376253133824855,0.170989756348769,-0.257880306162391, + -1.41258182501103e-06,-0.00366236372191753,0.17875560046067,-0.282400720673967, + -1.41619194360398e-06,-0.00356219610558584,0.186521444572572,-0.306921135185543, + -1.41980206286307e-06,-0.00346202848925503,0.194287288684474,-0.331441549697119, + -1.42341218123399e-06,-0.00336186087292312,0.202053132796376,-0.355961964208696, + -1.42702230027103e-06,-0.00326169325659209,0.209818976908278,-0.380482378720272, + -1.43063241914154e-06,-0.00316152564026062,0.21758482102018,-0.405002793231848, + -1.43424253751245e-06,-0.00306135802392871,0.225350665132082,-0.429523207743425, + -1.43785265682705e-06,-0.00296119040759812,0.233116509243984,-0.454043622255001, + -1.4414627753645e-06,-0.00286102279126621,0.240882353355886,-0.478564036766577, + -1.44507289445706e-06,-0.00276085517493518,0.248648197467788,-0.503084451278153, + -1.4486830129945e-06,-0.00266068755860349,0.25641404157969,-0.527604865789729, + -1.4522931323091e-06,-0.00256051994227313,0.264179885691591,-0.552125280301306, + -1.45590325040246e-06,-0.00246035232594033,0.271945729803494,-0.576645694812882, + -1.45951336982808e-06,-0.00236018470960975,0.279711573915395,-0.601166109324458, + -1.46312348858757e-06,-0.0022600170932785,0.287477418027297,-0.625686523836035, + -1.46673360712501e-06,-0.00215984947694636,0.295243262139199,-0.650206938347611, + -1.47034372599553e-06,-0.00205968186061511,0.303009106251101,-0.674727352859187, + -1.47395384475502e-06,-0.00195951424428431,0.310774950363003,-0.699247767370763, + -1.47756396406962e-06,-0.00185934662795351,0.318540794474904,-0.72376818188234, + -1.48117408294013e-06,-0.00175917901162226,0.326306638586806,-0.748288596393916, + -1.48478420181064e-06,-0.00165901139529057,0.334072482698708,-0.772809010905492, + -1.48839432012604e-06,-0.00155884377895932,0.34183832681061,-0.797329425417068, + -0.000210381738549925,-0.040452318490265,0.23976229956605,-0.128233328183071, + -0.000227178737724265,-0.0405059289058023,0.259733811745583,-0.142707906705057, + -0.000243975736898605,-0.0405595393213395,0.279705323925116,-0.157182485227043, + -0.00026077273607289,-0.0406131497368766,0.29967683610465,-0.171657063749029, + -0.000277569735247396,-0.0406667601524141,0.319648348284183,-0.186131642271016, + -0.000294366734421903,-0.0407203705679515,0.339619860463717,-0.200606220793002, + -0.000311163733596076,-0.0407739809834884,0.35959137264325,-0.215080799314988, + -0.000327960732770305,-0.0408275913990257,0.379562884822784,-0.229555377836974, + -0.000344757731944867,-0.0408812018145632,0.399534397002317,-0.24402995635896, + -0.000361554731119318,-0.0409348122301005,0.41950590918185,-0.258504534880946, + -0.000378351730293658,-0.0409884226456381,0.439477421361383,-0.272979113402932, + -0.000395148729467887,-0.0410420330611749,0.459448933540917,-0.287453691924918, + -0.000411945728642449,-0.0410956434767127,0.47942044572045,-0.301928270446904, + -0.0004287427278169,-0.04114925389225,0.499391957899984,-0.316402848968891, + -0.000445539726991018,-0.0412028643077869,0.519363470079517,-0.330877427490877, + -0.00046233672616558,-0.0412564747233242,0.539334982259051,-0.345352006012863, + -0.000479133725340142,-0.0413100851388617,0.559306494438584,-0.359826584534849, + -0.000495930724514593,-0.0413636955543994,0.579278006618117,-0.374301163056835, + -0.000512727723688267,-0.0414173059699363,0.59924951879765,-0.388775741578821, + -0.000529524722863051,-0.0414709163854734,0.619221030977185,-0.403250320100808, + -0.000546321722037391,-0.0415245268010109,0.639192543156717,-0.417724898622794, + -0.000563118721211731,-0.0415781372165478,0.659164055336251,-0.432199477144779, + -0.000579915720385737,-0.0416317476320849,0.679135567515784,-0.446674055666765, + -0.000596712719560522,-0.0416853580476224,0.699107079695318,-0.461148634188752, + -0.000613509718734195,-0.0417389684631591,0.719078591874852,-0.475623212710738, + -0.000206932482338329,-0.0392510675745538,0.238768744075897,-0.130194478901327, + -0.000223245994934507,-0.0392539673040582,0.258550278031811,-0.144883058126622, + -0.000239559507530407,-0.0392568670335623,0.278331811987725,-0.159571637351917, + -0.000255873020126418,-0.0392597667630666,0.298113345943639,-0.174260216577211, + -0.000272186532722207,-0.0392626664925708,0.317894879899553,-0.188948795802506, + -0.000288500045318385,-0.0392655662220753,0.337676413855467,-0.203637375027801, + -0.000304813557914396,-0.0392684659515796,0.357457947811381,-0.218325954253096, + -0.000321127070510296,-0.0392713656810839,0.377239481767295,-0.233014533478391, + -0.000337440583105919,-0.0392742654105875,0.397021015723209,-0.247703112703685, + -0.000353754095702263,-0.0392771651400925,0.416802549679122,-0.26239169192898, + -0.000370067608298164,-0.0392800648695968,0.436584083635036,-0.277080271154274, + -0.000386381120893953,-0.0392829645991009,0.456365617590951,-0.291768850379569, + -0.000402694633489742,-0.0392858643286047,0.476147151546865,-0.306457429604863, + -0.000419008146086086,-0.0392887640581094,0.495928685502779,-0.321146008830159, + -0.000435321658681542,-0.0392916637876131,0.515710219458693,-0.335834588055453, + -0.000451635171277887,-0.039294563517118,0.535491753414607,-0.350523167280749, + -0.00046794868387412,-0.0392974632466225,0.555273287370521,-0.365211746506043, + -0.00048426219647002,-0.0393003629761266,0.575054821326434,-0.379900325731337, + -0.000500575709065809,-0.0393032627056311,0.594836355282348,-0.394588904956632, + -0.000516889221661265,-0.0393061624351347,0.614617889238263,-0.409277484181927, + -0.000533202734257388,-0.039309062164639,0.634399423194176,-0.423966063407222, + -0.000549516246854065,-0.039311961894144,0.65418095715009,-0.438654642632516, + -0.000565829759449743,-0.0393148616236485,0.673962491106004,-0.453343221857811, + -0.000582143272045088,-0.0393177613531517,0.693744025061918,-0.468031801083105, + -0.000598456784641432,-0.0393206610826562,0.713525559017833,-0.482720380308401, + -0.000202264694731835,-0.0376818875860169,0.237396666084338,-0.132797734025557, + -0.000217935721911033,-0.0376206160044349,0.256920213240721,-0.147770380366291, + -0.000233606749090343,-0.037559344422853,0.276443760397104,-0.162743026707025, + -0.000249277776269763,-0.0374980728412712,0.295967307553488,-0.177715673047759, + -0.000264948803449017,-0.0374368012596893,0.315490854709871,-0.192688319388494, + -0.000280619830628659,-0.0373755296781078,0.335014401866254,-0.207660965729227, + -0.000296290857808024,-0.037314258096526,0.354537949022637,-0.222633612069962, + -0.000311961884987388,-0.0372529865149442,0.37406149617902,-0.237606258410696, + -0.000327632912166864,-0.0371917149333627,0.393585043335403,-0.25257890475143, + -0.000343303939346118,-0.0371304433517805,0.413108590491786,-0.267551551092164, + -0.000358974966525483,-0.0370691717701987,0.432632137648169,-0.282524197432897, + -0.00037464599370518,-0.0370079001886172,0.452155684804553,-0.297496843773632, + -0.000390317020884101,-0.0369466286070348,0.471679231960936,-0.312469490114365, + -0.000405988048063799,-0.0368853570254533,0.491202779117319,-0.3274421364551, + -0.000421659075243164,-0.0368240854438717,0.510726326273702,-0.342414782795834, + -0.000437330102422528,-0.0367628138622897,0.530249873430086,-0.357387429136568, + -0.000453001129601893,-0.036701542280708,0.549773420586469,-0.372360075477302, + -0.000468672156781369,-0.0366402706991265,0.569296967742852,-0.387332721818036, + -0.000484343183960845,-0.0365789991175447,0.588820514899235,-0.40230536815877, + -0.000500014211140209,-0.0365177275359629,0.608344062055618,-0.417278014499504, + -0.000515685238319241,-0.0364564559543805,0.627867609212001,-0.432250660840238, + -0.000531356265498939,-0.0363951843727994,0.647391156368384,-0.447223307180972, + -0.000547027292678415,-0.0363339127912172,0.666914703524767,-0.462195953521706, + -0.000562698319857668,-0.0362726412096355,0.686438250681151,-0.47716859986244, + -0.000578369347037033,-0.0362113696280537,0.705961797837534,-0.492141246203175, + -0.000196031289594722,-0.0356812992016964,0.235517993312198,-0.136189370655231, + -0.000210864818652567,-0.0355418316680342,0.254695486392783,-0.151532112275925, + -0.000225698347710135,-0.0354023641343714,0.273872979473367,-0.16687485389662, + -0.000240531876767758,-0.0352628966007087,0.293050472553952,-0.182217595517314, + -0.000255365405825658,-0.0351234290670464,0.312227965634536,-0.197560337138008, + -0.000270198934883337,-0.034983961533384,0.33140545871512,-0.212903078758702, + -0.000285032463940793,-0.034844493999721,0.350582951795705,-0.228245820379397, + -0.000299865992998694,-0.0347050264660587,0.369760444876289,-0.243588562000091, + -0.000314699522056427,-0.0345655589323963,0.388937937956873,-0.258931303620785, + -0.00032953305111405,-0.0344260913987338,0.408115431037457,-0.274274045241479, + -0.000344366580171562,-0.0342866238650708,0.427292924118042,-0.289616786862174, + -0.000359200109229518,-0.0341471563314086,0.446470417198626,-0.304959528482868, + -0.000374033638287363,-0.0340076887977463,0.46564791027921,-0.320302270103562, + -0.000388867167345208,-0.0338682212640837,0.484825403359795,-0.335645011724257, + -0.000403700696402387,-0.0337287537304207,0.50400289644038,-0.350987753344951, + -0.000418534225460454,-0.0335892861967584,0.523180389520964,-0.366330494965646, + -0.000433367754518077,-0.0334498186630963,0.542357882601548,-0.38167323658634, + -0.000448201283576033,-0.0333103511294337,0.561535375682132,-0.397015978207034, + -0.000463034812633545,-0.0331708835957709,0.580712868762717,-0.412358719827728, + -0.000477868341690946,-0.0330314160621081,0.599890361843301,-0.427701461448423, + -0.000492701870748902,-0.0328919485284458,0.619067854923885,-0.443044203069116, + -0.000507535399806969,-0.0327524809947839,0.63824534800447,-0.458386944689811, + -0.00052236892886437,-0.0326130134611207,0.657422841085054,-0.473729686310505, + -0.000537202457921881,-0.0324735459274583,0.676600334165638,-0.489072427931199, + -0.000552035986979171,-0.0323340783937951,0.695777827246223,-0.504415169551894, + -0.000187857899902444,-0.0332097375012657,0.232980238268616,-0.140502190333995, + -0.000201627460896747,-0.032979741061566,0.251701447538942,-0.156315546699342, + -0.000215397021891328,-0.0327497446218665,0.270422656809268,-0.172128903064689, + -0.000229166582885576,-0.0325197481821667,0.289143866079594,-0.187942259430037, + -0.000242936143879768,-0.0322897517424668,0.30786507534992,-0.203755615795384, + -0.000256705704874183,-0.0320597553027675,0.326586284620245,-0.219568972160732, + -0.000270475265868653,-0.0318297588630676,0.345307493890572,-0.235382328526079, + -0.000284244826862734,-0.0315997624233679,0.364028703160898,-0.251195684891427, + -0.000298014387857037,-0.0313697659836683,0.382749912431223,-0.267009041256774, + -0.000311783948851785,-0.0311397695439688,0.40147112170155,-0.282822397622121, + -0.000325553509846088,-0.0309097731042691,0.420192330971875,-0.298635753987468, + -0.000339323070840281,-0.0306797766645692,0.438913540242202,-0.314449110352816, + -0.000353092631834917,-0.03044978022487,0.457634749512527,-0.330262466718163, + -0.000366862192828665,-0.0302197837851697,0.476355958782854,-0.346075823083511, + -0.000380631753823524,-0.0299897873454706,0.495077168053179,-0.361889179448858, + -0.000394401314817605,-0.0297597909057707,0.513798377323505,-0.377702535814206, + -0.000408170875811908,-0.0295297944660713,0.532519586593831,-0.393515892179553, + -0.000421940436806323,-0.0292997980263714,0.551240795864157,-0.4093292485449, + -0.000435709997800737,-0.0290698015866722,0.569962005134483,-0.425142604910247, + -0.000449479558795041,-0.028839805146972,0.588683214404809,-0.440955961275595, + -0.00046324911979001,-0.028609808707273,0.607404423675135,-0.456769317640942, + -0.000477018680783758,-0.0283798122675725,0.626125632945461,-0.472582674006289, + -0.000490788241777729,-0.0281498158278723,0.644846842215787,-0.488396030371637, + -0.000504557802772254,-0.0279198193881731,0.663568051486113,-0.504209386736984, + -0.00051832736376678,-0.0276898229484734,0.682289260756439,-0.520022743102332, + -0.000177401834488999,-0.0302751956006273,0.229621574958222,-0.145820252902342, + -0.000189864624830671,-0.0299474196245475,0.247755116306721,-0.162213916084127, + -0.000202327415172232,-0.0296196436484673,0.265888657655219,-0.178607579265912, + -0.000214790205513626,-0.0292918676723869,0.284022199003718,-0.195001242447697, + -0.000227252995855409,-0.0289640916963072,0.302155740352216,-0.211394905629481, + -0.00023971578619697,-0.0286363157202272,0.320289281700715,-0.227788568811266, + -0.000252178576538531,-0.0283085397441472,0.338422823049214,-0.244182231993051, + -0.000264641366879925,-0.0279807637680665,0.356556364397713,-0.260575895174836, + -0.00027710415722193,-0.0276529877919869,0.374689905746211,-0.276969558356621, + -0.000289566947563102,-0.0273252118159064,0.39282344709471,-0.293363221538405, + -0.000302029737905052,-0.0269974358398268,0.410956988443208,-0.30975688472019, + -0.000314492528246446,-0.0266696598637466,0.429090529791707,-0.326150547901975, + -0.000326955318588285,-0.0263418838876666,0.447224071140205,-0.34254421108376, + -0.00033941810892979,-0.0260141079115865,0.465357612488704,-0.358937874265545, + -0.000351880899271295,-0.0256863319355065,0.483491153837203,-0.37533153744733, + -0.000364343689613134,-0.0253585559594265,0.501624695185701,-0.391725200629115, + -0.000376806479954417,-0.025030779983346,0.5197582365342,-0.4081188638109, + -0.000389269270295589,-0.0247030040072653,0.537891777882699,-0.424512526992684, + -0.000401732060637205,-0.0243752280311853,0.556025319231197,-0.440906190174469, + -0.000414194850979155,-0.0240474520551059,0.574158860579696,-0.457299853356254, + -0.000426657641320993,-0.0237196760790259,0.592292401928194,-0.473693516538039, + -0.000439120431662499,-0.0233919001029461,0.610425943276693,-0.490087179719823, + -0.000451583222004004,-0.0230641241268663,0.628559484625191,-0.506480842901608, + -0.000464046012346286,-0.0227363481507865,0.64669302597369,-0.522874506083393, + -0.000476508802687015,-0.0224085721747054,0.664826567322189,-0.539268169265178, + -0.000164451401711507,-0.0269556184686348,0.225304699967009,-0.15213462225805, + -0.000175377221189987,-0.0265318150541448,0.242704578377824,-0.169217309220869, + -0.000186303040668245,-0.0261080116396545,0.260104456788639,-0.186299996183689, + -0.000197228860146503,-0.0256842082251643,0.277504335199454,-0.203382683146508, + -0.000208154679624872,-0.0252604048106744,0.294904213610269,-0.220465370109327, + -0.000219080499103297,-0.0248366013961843,0.312304092021084,-0.237548057072147, + -0.000230006318581777,-0.0244127979816942,0.329703970431899,-0.254630744034966, + -0.000240932138060035,-0.023988994567204,0.347103848842714,-0.271713430997785, + -0.000251857957538459,-0.0235651911527142,0.364503727253529,-0.288796117960605, + -0.000262783777016939,-0.0231413877382243,0.381903605664344,-0.305878804923424, + -0.000273709596495531,-0.0227175843237342,0.399303484075159,-0.322961491886243, + -0.000284635415973455,-0.0222937809092434,0.416703362485974,-0.340044178849063, + -0.000295561235451824,-0.0218699774947533,0.434103240896789,-0.357126865811882, + -0.000306487054929971,-0.0214461740802632,0.451503119307604,-0.374209552774702, + -0.00031741287440834,-0.0210223706657731,0.468902997718419,-0.391292239737521, + -0.000328338693886709,-0.0205985672512832,0.486302876129234,-0.408374926700341, + -0.000339264513365301,-0.0201747638367928,0.50370275454005,-0.42545761366316, + -0.000350190332843892,-0.0197509604223036,0.521102632950864,-0.442540300625979, + -0.00036111615232215,-0.0193271570078133,0.538502511361679,-0.459622987588798, + -0.000372041971800408,-0.0189033535933232,0.555902389772494,-0.476705674551618, + -0.000382967791278888,-0.0184795501788328,0.573302268183309,-0.493788361514437, + -0.000393893610757146,-0.0180557467643427,0.590702146594124,-0.510871048477256, + -0.000404819430235515,-0.0176319433498526,0.608102025004939,-0.527953735440075, + -0.000415745249714439,-0.017208139935363,0.625501903415754,-0.545036422402895, + -0.000426671069192364,-0.0167843365208729,0.642901781826569,-0.562119109365714, + -0.00014905331718873,-0.0234070918642836,0.219970284423855,-0.159304031799408, + -0.000158266061085932,-0.0229009811454691,0.236489905994488,-0.177169044500823, + -0.000167478804982746,-0.0223948704266541,0.253009527565121,-0.195034057202238, + -0.000176691548879948,-0.0218887597078395,0.269529149135755,-0.212899069903653, + -0.000185904292776928,-0.0213826489890248,0.286048770706388,-0.230764082605069, + -0.00019511703667402,-0.0208765382702105,0.302568392277021,-0.248629095306484, + -0.000204329780571222,-0.0203704275513956,0.319088013847654,-0.266494108007899, + -0.00021354252446848,-0.0198643168325814,0.335607635418287,-0.284359120709315, + -0.000222755268365682,-0.0193582061137667,0.352127256988921,-0.30222413341073, + -0.000231968012262662,-0.0188520953949518,0.368646878559554,-0.320089146112145, + -0.000241180756159531,-0.0183459846761369,0.385166500130187,-0.33795415881356, + -0.000250393500056401,-0.0178398739573222,0.40168612170082,-0.355819171514975, + -0.000259606243953714,-0.017333763238508,0.418205743271453,-0.373684184216391, + -0.000268818987851027,-0.0168276525196933,0.434725364842087,-0.391549196917806, + -0.000278031731748229,-0.0163215418008789,0.45124498641272,-0.409414209619221, + -0.00028724447564521,-0.0158154310820642,0.467764607983353,-0.427279222320637, + -0.000296457219542079,-0.0153093203632491,0.484284229553987,-0.445144235022052, + -0.000305669963439392,-0.0148032096444348,0.50080385112462,-0.463009247723467, + -0.000314882707336483,-0.0142970989256206,0.517323472695252,-0.480874260424882, + -0.000324095451233353,-0.013790988206805,0.533843094265886,-0.498739273126297, + -0.000333308195130444,-0.0132848774879908,0.550362715836519,-0.516604285827713, + -0.000342520939027535,-0.0127787667691766,0.566882337407152,-0.534469298529128, + -0.00035173368292496,-0.0122726560503619,0.583401958977785,-0.552334311230543, + -0.000360946426821718,-0.0117665453315472,0.599921580548418,-0.570199323931958, + -0.000370159170719142,-0.0112604346127325,0.616441202119052,-0.588064336633374, + -0.000131622152289179,-0.0198449451573922,0.213695836973503,-0.167042394425382, + -0.00013904439169421,-0.0192822799836783,0.229208963499579,-0.18575181700769, + -0.000146466631099018,-0.0187196148099639,0.244722090025656,-0.204461239589998, + -0.000153888870504104,-0.0181569496362499,0.260235216551733,-0.223170662172306, + -0.000161311109909024,-0.0175942844625356,0.27574834307781,-0.241880084754614, + -0.00016873334931411,-0.0170316192888216,0.291261469603886,-0.260589507336921, + -0.000176155588718807,-0.0164689541151073,0.306774596129963,-0.279298929919229, + -0.000183577828123671,-0.015906288941393,0.32228772265604,-0.298008352501537, + -0.000191000067528591,-0.0153436237676787,0.337800849182116,-0.316717775083845, + -0.000198422306933344,-0.0147809585939647,0.353313975708193,-0.335427197666153, + -0.000205844546338652,-0.0142182934202506,0.36882710223427,-0.35413662024846, + -0.000213266785743516,-0.0136556282465363,0.384340228760346,-0.372846042830769, + -0.000220689025148268,-0.013092963072822,0.399853355286423,-0.391555465413076, + -0.000228111264553132,-0.012530297899108,0.4153664818125,-0.410264887995385, + -0.000235533503958218,-0.0119676327253939,0.430879608338576,-0.428974310577692, + -0.000242955743363304,-0.0114049675516799,0.446392734864653,-0.44768373316, + -0.000250377982767724,-0.0108423023779651,0.46190586139073,-0.466393155742308, + -0.000257800222172921,-0.0102796372042511,0.477418987916806,-0.485102578324616, + -0.000265222461577896,-0.00971697203053679,0.492932114442883,-0.503812000906923, + -0.00027264470098276,-0.00915430685682272,0.50844524096896,-0.522521423489232, + -0.000280066940387069,-0.008591641683108,0.523958367495037,-0.541230846071539, + -0.000287489179792821,-0.0080289765093946,0.539471494021113,-0.559940268653847, + -0.000294911419197574,-0.00746631133568032,0.55498462054719,-0.578649691236155, + -0.000302333658602216,-0.00690364616196604,0.570497747073266,-0.597359113818463, + -0.000309755898007302,-0.00634098098825131,0.586010873599344,-0.616068536400771, + -0.000112959969216286,-0.0164968703529933,0.206728616478026,-0.174951527702971, + -0.000118643263656182,-0.0159114678864911,0.221152550477629,-0.194523994654184, + -0.000124326558096244,-0.0153260654199894,0.235576484477233,-0.214096461605397, + -0.000130009852536084,-0.0147406629534872,0.250000418476836,-0.23366892855661, + -0.000135693146975813,-0.014155260486985,0.26442435247644,-0.253241395507823, + -0.000141376441415653,-0.0135698580204828,0.278848286476043,-0.272813862459036, + -0.000147059735855548,-0.0129844555539809,0.293272220475647,-0.292386329410249, + -0.000152743030295277,-0.0123990530874787,0.30769615447525,-0.311958796361462, + -0.000158426324735506,-0.0118136506209769,0.322120088474854,-0.331531263312675, + -0.000164109619175012,-0.0112282481544745,0.336544022474457,-0.351103730263887, + -0.000169792913614963,-0.0106428456879726,0.350967956474061,-0.3706761972151, + -0.000175476208054914,-0.0100574432214704,0.365391890473664,-0.390248664166313, + -0.000181159502494532,-0.00947204075496844,0.379815824473267,-0.409821131117526, + -0.000186842796934705,-0.00888663828846603,0.394239758472872,-0.429393598068739, + -0.000192526091374656,-0.00830123582196451,0.408663692472474,-0.448966065019952, + -0.000198209385814607,-0.00771583335546255,0.423087626472078,-0.468538531971165, + -0.000203892680254225,-0.00713043088896015,0.437511560471681,-0.488110998922378, + -0.000209575974694065,-0.00654502842245797,0.451935494471285,-0.507683465873591, + -0.000215259269134016,-0.00595962595595623,0.466359428470888,-0.527255932824804, + -0.000220942563572968,-0.00537422348945249,0.480783362470493,-0.546828399776017, + -0.000226625858013696,-0.00478882102295186,0.495207296470096,-0.56640086672723, + -0.000232309152453536,-0.00420341855644946,0.509631230469699,-0.585973333678442, + -0.000237992446893487,-0.0036180160899475,0.524055164469303,-0.605545800629655, + -0.000243675741333216,-0.00303261362344553,0.538479098468906,-0.625118267580868, + -0.000249359035772723,-0.00244721115694269,0.55290303246851,-0.644690734532081, + -9.41349121394985e-05,-0.0135463743684346,0.199460833058139,-0.182597178072164, + -9.82588537443707e-05,-0.0129730888036693,0.212773734995571,-0.203003938145791, + -0.000102382795349465,-0.0123998032389044,0.226086636933003,-0.223410698219418, + -0.000106506736954393,-0.0118265176741392,0.239399538870435,-0.243817458293045, + -0.000110630678559098,-0.0112532321093741,0.252712440807867,-0.264224218366672, + -0.000114754620164248,-0.0106799465446095,0.266025342745299,-0.284630978440299, + -0.000118878561769287,-0.0101066609798444,0.279338244682731,-0.305037738513926, + -0.000123002503374214,-0.00953337541507904,0.292651146620164,-0.325444498587553, + -0.000127126444979253,-0.00896008985031438,0.305964048557596,-0.34585125866118, + -0.000131250386584347,-0.00838680428554972,0.319276950495027,-0.366258018734807, + -0.00013537432818933,-0.00781351872078417,0.33258985243246,-0.386664778808434, + -0.000139498269794425,-0.00724023315601952,0.345902754369892,-0.407071538882061, + -0.000143622211399186,-0.00666694759125419,0.359215656307324,-0.427478298955688, + -0.000147746153003947,-0.00609366202648887,0.372528558244756,-0.447885059029316, + -0.000151870094609707,-0.00552037646172465,0.385841460182188,-0.468291819102943, + -0.000155994036214246,-0.00494709089695933,0.39915436211962,-0.48869857917657, + -0.00016011797781923,-0.00437380533219445,0.412467264057052,-0.509105339250197, + -0.000164241919423991,-0.00380051976742868,0.425780165994485,-0.529512099323824, + -0.000168365861029085,-0.00322723420266424,0.439093067931916,-0.549918859397451, + -0.000172489802633957,-0.00265394863789892,0.452405969869349,-0.570325619471078, + -0.000176613744239718,-0.00208066307313493,0.46571887180678,-0.590732379544705, + -0.000180737685843924,-0.00150737750836871,0.479031773744213,-0.611139139618331, + -0.000184861627448907,-0.000934091943603832,0.492344675681645,-0.631545899691958, + -0.000188985569054445,-0.00036080637883984,0.505657577619076,-0.651952659765586, + -0.000193109510658651,0.000212479185926373,0.518970479556509,-0.672359419839213, + -7.62449419381972e-05,-0.0110943472152419,0.192344360958631,-0.189600278729145, + -7.90809410445292e-05,-0.010561890685425,0.204589464652692,-0.210771216921253, + -8.19169401510833e-05,-0.0100294341556083,0.216834568346753,-0.23194215511336, + -8.47529392573598e-05,-0.00949697762579138,0.229079672040814,-0.253113093305468, + -8.75889383641915e-05,-0.00896452109597501,0.241324775734874,-0.274284031497576, + -9.0424937470579e-05,-0.00843206456615819,0.253569879428935,-0.295454969689684, + -9.32609365772441e-05,-0.0078996080363416,0.265814983122996,-0.316625907881792, + -9.60969356834651e-05,-0.00736715150652456,0.278060086817057,-0.3377968460739, + -9.89329347900192e-05,-0.00683469497670774,0.290305190511118,-0.358967784266008, + -0.000101768933896573,-0.00630223844689115,0.302550294205179,-0.380138722458116, + -0.000104604933003238,-0.00576978191707456,0.314795397899239,-0.401309660650224, + -0.000107440932109126,-0.00523732538725707,0.327040501593301,-0.422480598842332, + -0.000110276931216235,-0.00470486885744137,0.339285605287361,-0.443651537034439, + -0.000113112930322123,-0.00417241232762411,0.351530708981422,-0.464822475226547, + -0.000115948929429122,-0.00363995579780796,0.363775812675483,-0.485993413418655, + -0.000118784928535343,-0.0031074992679907,0.376020916369544,-0.507164351610763, + -0.000121620927642341,-0.00257504273817455,0.388266020063605,-0.528335289802871, + -0.000124456926748784,-0.00204258620835751,0.400511123757666,-0.549506227994979, + -0.000127292925855116,-0.00151012967854047,0.412756227451727,-0.570677166187087, + -0.00013012892496167,-0.000977673148724545,0.425001331145787,-0.591848104379195, + -0.000132964924068002,-0.000445216618907285,0.437246434839848,-0.613019042571303, + -0.000135800923174889,8.72399109090871e-05,0.449491538533909,-0.634189980763411, + -0.000138636922280666,0.000619696440726347,0.46173664222797,-0.655360918955518, + -0.000141472921387775,0.00115215297054228,0.47398174592203,-0.676531857147626, + -0.000144308920494218,0.00168460950035909,0.486226849616091,-0.697702795339735, + -6.01714108874329e-05,-0.00915478219390498,0.185782246156446,-0.195705145934604, + -6.20256715301859e-05,-0.00868132806013711,0.197057399314531,-0.217542247039848, + -6.38799321728833e-05,-0.00820787392636912,0.208332552472616,-0.239379348145093, + -6.57341928155808e-05,-0.00773441979260081,0.219607705630701,-0.261216449250337, + -6.75884534582782e-05,-0.00726096565883272,0.230882858788787,-0.283053550355582, + -6.94427141011977e-05,-0.00678751152506507,0.242158011946872,-0.304890651460826, + -7.12969747433956e-05,-0.00631405739129609,0.253433165104957,-0.326727752566071, + -7.31512353862596e-05,-0.00584060325752822,0.264708318263042,-0.348564853671316, + -7.50054960293456e-05,-0.00536714912376057,0.275983471421127,-0.37040195477656, + -7.6859756672043e-05,-0.0048936949899927,0.287258624579213,-0.392239055881805, + -7.87140173146295e-05,-0.00442024085622417,0.298533777737298,-0.414076156987049, + -8.0568277957549e-05,-0.0039467867224563,0.309808930895383,-0.435913258092294, + -8.24225386000244e-05,-0.00347333258868798,0.321084084053469,-0.457750359197538, + -8.42767992427218e-05,-0.00299987845491967,0.332359237211554,-0.479587460302783, + -8.61310598850862e-05,-0.00252642432115135,0.343634390369639,-0.501424561408027, + -8.79853205285608e-05,-0.00205297018738437,0.354909543527724,-0.523261662513272, + -8.98395811710362e-05,-0.00157951605361539,0.36618469668581,-0.545098763618517, + -9.16938418138447e-05,-0.00110606191984797,0.377459849843895,-0.566935864723761, + -9.3548102455987e-05,-0.000632607786078765,0.38873500300198,-0.588772965829005, + -9.54023630995726e-05,-0.000159153652312227,0.400010156160065,-0.61061006693425, + -9.7256623742048e-05,0.000314300481456531,0.411285309318151,-0.632447168039495, + -9.91108843844124e-05,0.000787754615224845,0.422560462476236,-0.654284269144739, + -0.000100965145027443,0.00126120874899271,0.433835615634321,-0.676121370249984, + -0.000102819405669807,0.00173466288276147,0.445110768792407,-0.697958471355228, + -0.000104673666312505,0.00220811701652979,0.456385921950492,-0.719795572460473, + -4.64321159043823e-05,-0.00767833539457463,0.180048362324907,-0.200801617843962, + -4.75915859728393e-05,-0.00727097094068141,0.190485879215915,-0.223194845800061, + -4.87510560410187e-05,-0.00686360648678785,0.200923396106922,-0.24558807375616, + -4.99105261096422e-05,-0.00645624203289485,0.21136091299793,-0.267981301712259, + -5.10699961777661e-05,-0.0060488775790013,0.221798429888937,-0.290374529668358, + -5.22294662459455e-05,-0.00564151312510752,0.232235946779945,-0.312767757624457, + -5.3388936314458e-05,-0.00523414867121463,0.242673463670952,-0.335160985580557, + -5.45484063825818e-05,-0.00482678421732086,0.25311098056196,-0.357554213536656, + -5.57078764508168e-05,-0.0044194197634273,0.263548497452967,-0.379947441492755, + -5.68673465193292e-05,-0.00401205530953441,0.273986014343975,-0.402340669448854, + -5.80268165875086e-05,-0.00360469085564086,0.284423531234982,-0.424733897404953, + -5.9186286655688e-05,-0.00319732640174708,0.29486104812599,-0.447127125361052, + -6.03457567243115e-05,-0.00278996194785397,0.305298565016997,-0.469520353317151, + -6.1505226792602e-05,-0.00238259749396041,0.315736081908005,-0.49191358127325, + -6.26646968608924e-05,-0.00197523304006708,0.326173598799012,-0.514306809229349, + -6.38241669289608e-05,-0.00156786858617375,0.33661111569002,-0.536700037185448, + -6.49836369975842e-05,-0.00116050413228064,0.347048632581027,-0.559093265141548, + -6.61431070660967e-05,-0.000753139678387527,0.357486149472035,-0.581486493097647, + -6.7302577133499e-05,-0.000345775224492861,0.367923666363043,-0.603879721053746, + -6.84620472021225e-05,6.15892294004716e-05,0.37836118325405,-0.626272949009845, + -6.9621517271079e-05,0.000468953683292916,0.388798700145058,-0.648666176965944, + -7.07809873391474e-05,0.000876318137186249,0.399236217036065,-0.671059404922043, + -7.19404574074378e-05,0.00128368259108047,0.409673733927073,-0.693452632878142, + -7.30999274756172e-05,0.0016910470449738,0.42011125081808,-0.715845860834241, + -7.42593975436856e-05,0.00209841149886758,0.430548767709088,-0.73823908879034, + -3.51721172094921e-05,-0.00658484444939922,0.175262944888296,-0.20490478488057, + -3.58708950935482e-05,-0.00624189134589404,0.185007632277422,-0.227745750291752, + -3.65696729778819e-05,-0.00589893824238907,0.194752319666549,-0.250586715702934, + -3.72684508622156e-05,-0.00555598513888422,0.204497007055675,-0.273427681114117, + -3.79672287464383e-05,-0.00521303203537893,0.214241694444802,-0.296268646525299, + -3.8666006630772e-05,-0.0048700789318743,0.223986381833928,-0.319109611936481, + -3.93647845153833e-05,-0.00452712582836945,0.233731069223054,-0.341950577347663, + -4.00635623994394e-05,-0.00418417272486415,0.243475756612181,-0.364791542758846, + -4.07623402838286e-05,-0.0038412196213593,0.253220444001307,-0.387632508170028, + -4.14611181682734e-05,-0.00349826651785468,0.262965131390433,-0.41047347358121, + -4.21598960526071e-05,-0.0031553134143496,0.27270981877956,-0.433314438992392, + -4.28586739370518e-05,-0.00281236031084475,0.282454506168686,-0.456155404403574, + -4.35574518209414e-05,-0.00246940720733946,0.292199193557812,-0.478996369814757, + -4.42562297052751e-05,-0.00212645410383483,0.301943880946938,-0.501837335225939, + -4.49550075896088e-05,-0.00178350100032931,0.311688568336065,-0.524678300637121, + -4.56537854736094e-05,-0.00144054789682402,0.321433255725192,-0.547519266048303, + -4.63525633582762e-05,-0.00109759479331961,0.331177943114318,-0.570360231459486, + -4.70513412427209e-05,-0.000754641689814761,0.340922630503444,-0.593201196870668, + -4.77501191268326e-05,-0.000411688586309022,0.350667317892571,-0.61604216228185, + -4.84488970108332e-05,-6.8735482804172e-05,0.360412005281697,-0.638883127693032, + -4.9147674895722e-05,0.00027421762069979,0.370156692670823,-0.661724093104215, + -4.98464527801668e-05,0.000617170724205085,0.37990138005995,-0.684565058515397, + -5.05452306637233e-05,0.00096012382771038,0.389646067449076,-0.707406023926579, + -5.12440085487231e-05,0.00130307693121523,0.399390754838202,-0.730246989337762, + -5.19427864327238e-05,0.00164603003472052,0.409135442227329,-0.753087954748944, + -2.62530577582187e-05,-0.00578943242276553,0.171416356244769,-0.208112892612427, + -2.66625151588706e-05,-0.00550383676652244,0.180607883348395,-0.231303926636141, + -2.70719725590784e-05,-0.00521824111027891,0.189799410452021,-0.254494960659856, + -2.74814299592863e-05,-0.00493264545403549,0.198990937555647,-0.277685994683571, + -2.78908873596051e-05,-0.00464704979779218,0.208182464659273,-0.300877028707286, + -2.83003447598129e-05,-0.00436145414154843,0.2173739917629,-0.324068062731, + -2.87098021602983e-05,-0.00407585848530556,0.226565518866525,-0.347259096754715, + -2.91192595606171e-05,-0.00379026282906203,0.235757045970152,-0.37045013077843, + -2.9528716961269e-05,-0.00350466717281939,0.244948573073777,-0.393641164802144, + -2.99381743611438e-05,-0.00321907151657519,0.254140100177404,-0.416832198825859, + -3.03476317614626e-05,-0.00293347586033188,0.26333162728103,-0.440023232849574, + -3.07570891617814e-05,-0.00264788020408857,0.272523154384656,-0.463214266873289, + -3.11665465619893e-05,-0.00236228454784526,0.281714681488282,-0.486405300897003, + -3.15760039624191e-05,-0.00207668889160173,0.290906208591908,-0.509596334920718, + -3.1985461363071e-05,-0.00179109323535886,0.300097735695534,-0.532787368944433, + -3.23949187628347e-05,-0.00150549757911445,0.309289262799161,-0.555978402968147, + -3.28043761632646e-05,-0.00121990192287158,0.318480789902786,-0.579169436991862, + -3.32138335638055e-05,-0.000934306266628493,0.327672317006412,-0.602360471015577, + -3.36232909639023e-05,-0.00064871061038474,0.336863844110039,-0.625551505039292, + -3.40327483643321e-05,-0.00036311495414143,0.346055371213665,-0.648742539063006, + -3.44422057645399e-05,-7.7519297898121e-05,0.355246898317291,-0.671933573086721, + -3.48516631650808e-05,0.000208076358345188,0.364438425420917,-0.695124607110436, + -3.52611205652886e-05,0.000493672014588498,0.373629952524543,-0.718315641134151, + -3.56705779652744e-05,0.000779267670832695,0.382821479628169,-0.741506675157865, + -3.60800353654822e-05,0.001064863327076,0.392013006731796,-0.76469770918158, + -1.93740367441242e-05,-0.00521705261768279,0.168415021404619,-0.210564223650296, + -1.96094253980261e-05,-0.00497943890039421,0.177177095561348,-0.234022746838032, + -1.98448140515395e-05,-0.00474182518310529,0.185939169718077,-0.257481270025767, + -2.00802027054969e-05,-0.0045042114658167,0.194701243874807,-0.280939793213503, + -2.03155913591768e-05,-0.00426659774852811,0.203463318031536,-0.304398316401239, + -2.05509800124681e-05,-0.00402898403123908,0.212225392188265,-0.327856839588975, + -2.07863686663701e-05,-0.00379137031395049,0.220987466344994,-0.351315362776711, + -2.102175732005e-05,-0.00355375659666191,0.229749540501723,-0.374773885964447, + -2.12571459734523e-05,-0.00331614287937221,0.238511614658453,-0.398232409152183, + -2.14925346273542e-05,-0.00307852916208384,0.247273688815182,-0.421690932339919, + -2.17279232810341e-05,-0.0028409154447957,0.25603576297191,-0.445149455527655, + -2.1963311934603e-05,-0.00260330172750667,0.26479783712864,-0.468607978715391, + -2.21987005886159e-05,-0.00236568801021808,0.273559911285369,-0.492066501903127, + -2.24340892420738e-05,-0.00212807429292927,0.282321985442098,-0.515525025090863, + -2.26694778957537e-05,-0.00189046057564024,0.291084059598827,-0.538983548278599, + -2.29048665499887e-05,-0.00165284685835276,0.299846133755556,-0.562442071466335, + -2.31402552033355e-05,-0.00141523314106351,0.308608207912285,-0.585900594654071, + -2.33756438571264e-05,-0.00117761942377514,0.317370282069014,-0.609359117841807, + -2.36110325114725e-05,-0.00094000570648678,0.326132356225743,-0.632817641029543, + -2.38464211640421e-05,-0.000702391989197082,0.334894430382473,-0.656276164217279, + -2.40818098171669e-05,-0.000464778271907829,0.343656504539202,-0.679734687405015, + -2.43171984722901e-05,-0.000227164554620352,0.352418578695931,-0.703193210592751, + -2.45525871248597e-05,1.04491626693459e-05,0.36118065285266,-0.726651733780487, + -2.47879757790948e-05,0.000248062879957711,0.369942727009389,-0.750110256968223, + -2.50233644329967e-05,0.000485676597245632,0.378704801166118,-0.773568780155959, + -1.41751340891894e-05,-0.00480755486317341,0.166126320483516,-0.212404619080298, + -1.43090701665849e-05,-0.00460833740499644,0.174562112230244,-0.236063966158172, + -1.44430062434808e-05,-0.00440911994681903,0.182997903976971,-0.259723313236046, + -1.45769423204878e-05,-0.0042099024886415,0.1914336957237,-0.283382660313919, + -1.47108783976058e-05,-0.00401068503046442,0.199869487470427,-0.307042007391793, + -1.48448144748903e-05,-0.00381146757228734,0.208305279217155,-0.330701354469667, + -1.49787505518972e-05,-0.00361225011410982,0.216741070963883,-0.35436070154754, + -1.51126866289042e-05,-0.00341303265593251,0.225176862710611,-0.378020048625414, + -1.52466227059112e-05,-0.00321381519775521,0.233612654457339,-0.401679395703288, + -1.53805587832512e-05,-0.00301459773957791,0.242048446204067,-0.425338742781161, + -1.55144948602581e-05,-0.0028153802814006,0.250484237950795,-0.448998089859035, + -1.56484309374871e-05,-0.0026161628232233,0.258920029697523,-0.472657436936909, + -1.5782367013828e-05,-0.00241694536504511,0.267355821444251,-0.496316784014782, + -1.5916303091501e-05,-0.00221772790686825,0.275791613190979,-0.519976131092656, + -1.60502391687301e-05,-0.00201851044869161,0.284227404937707,-0.543635478170529, + -1.6184175245626e-05,-0.00181929299051387,0.292663196684435,-0.567294825248403, + -1.6318111322744e-05,-0.00162007553233656,0.301098988431163,-0.590954172326277, + -1.6452047400084e-05,-0.0014208580741597,0.30953478017789,-0.61461351940415, + -1.65859834770909e-05,-0.00122164061598218,0.317970571924619,-0.638272866482024, + -1.67199195540979e-05,-0.0010224231578051,0.326406363671346,-0.661932213559898, + -1.68538556312159e-05,-0.000823205699627572,0.334842155418074,-0.685591560637771, + -1.69877917081118e-05,-0.000623988241450046,0.343277947164802,-0.709250907715645, + -1.71217277856739e-05,-0.000424770783273409,0.35171373891153,-0.732910254793519, + -1.72556638624588e-05,-0.00022555332509544,0.360149530658258,-0.756569601871392, + -1.73895999395768e-05,-2.63358669183589e-05,0.368585322404986,-0.780228948949266, + -1.03052477093413e-05,-0.00451538002871554,0.164411061537537,-0.213768162538806, + -1.03813092477423e-05,-0.00434592557833724,0.172602976442202,-0.237576299435023, + -1.04573707868649e-05,-0.00417647112796005,0.180794891346867,-0.26138443633124, + -1.0533432325488e-05,-0.00400701667758208,0.188986806251533,-0.285192573227456, + -1.06094938642776e-05,-0.00383756222720422,0.197178721156198,-0.309000710123673, + -1.06855554029006e-05,-0.00366810777682636,0.205370636060863,-0.332808847019889, + -1.07616169421898e-05,-0.00349865332644916,0.213562550965528,-0.356616983916106, + -1.08376784808684e-05,-0.0033291988760713,0.221754465870193,-0.380425120812323, + -1.09137400193804e-05,-0.00315974442569322,0.229946380774859,-0.404233257708539, + -1.09898015585586e-05,-0.00299028997531603,0.238138295679523,-0.428041394604756, + -1.10658630970706e-05,-0.0028208355249375,0.246330210584189,-0.451849531500973, + -1.11419246358047e-05,-0.00265138107455964,0.254522125488854,-0.475657668397189, + -1.12179861749828e-05,-0.00248192662418267,0.262714040393519,-0.499465805293406, + -1.12940477134948e-05,-0.00231247217380437,0.270905955298185,-0.523273942189622, + -1.13701092521179e-05,-0.00214301772342629,0.27909787020285,-0.547082079085839, + -1.1446170791074e-05,-0.00197356327304865,0.287289785107515,-0.570890215982055, + -1.15222323296971e-05,-0.00180410882267124,0.29548170001218,-0.594698352878272, + -1.15982938686532e-05,-0.00163465437229338,0.303673614916845,-0.618506489774489, + -1.16743554077203e-05,-0.00146519992191596,0.31186552982151,-0.642314626670705, + -1.17504169463434e-05,-0.00129574547153855,0.320057444726175,-0.666122763566922, + -1.18264784854105e-05,-0.00112629102116069,0.328249359630841,-0.689930900463139, + -1.19025400242556e-05,-0.000956836570782826,0.336441274535506,-0.713739037359355, + -1.19786015624346e-05,-0.000787382120404079,0.344633189440172,-0.737547174255572, + -1.20546631015017e-05,-0.000617927670026663,0.352825104344836,-0.761355311151788, + -1.21307246397917e-05,-0.000448473219648804,0.361017019249501,-0.785163448048005, + -7.4567452583163e-06,-0.00430711202153433,0.163142068736445,-0.214768527274187, + -7.50018834982935e-06,-0.00416020641618919,0.171153907435093,-0.238685823938158, + -7.54363144117587e-06,-0.00401330081084339,0.179165746133742,-0.262603120602129, + -7.58707453291096e-06,-0.00386639520549847,0.187177584832391,-0.2865204172661, + -7.63051762431299e-06,-0.00371948960015311,0.19518942353104,-0.310437713930072, + -7.67396071543747e-06,-0.00357258399480731,0.203201262229689,-0.334355010594043, + -7.71740380722807e-06,-0.00342567838946217,0.211213100928337,-0.358272307258014, + -7.76084689896317e-06,-0.00327877278411726,0.219224939626986,-0.382189603921985, + -7.8042899903652e-06,-0.00313186717877212,0.227236778325635,-0.406106900585956, + -7.84773308171172e-06,-0.00298496157342609,0.235248617024284,-0.430024197249927, + -7.89117617328028e-06,-0.00283805596808118,0.243260455722932,-0.453941493913898, + -7.9346192646268e-06,-0.00269115036273559,0.251272294421581,-0.47785879057787, + -7.97806235652843e-06,-0.00254424475739068,0.25928413312023,-0.501776087241841, + -8.0215054476529e-06,-0.0023973391520451,0.267295971818879,-0.525693383905812, + -8.06494853933248e-06,-0.00225043354670018,0.275307810517527,-0.549610680569783, + -8.10839163123411e-06,-0.00210352794135504,0.283319649216176,-0.573527977233754, + -8.1518347219145e-06,-0.0019566223360088,0.291331487914825,-0.597445273897725, + -8.19527781314999e-06,-0.00180971673066344,0.299343326613474,-0.621362570561697, + -8.23872090505162e-06,-0.00166281112531852,0.307355165312122,-0.645279867225668, + -8.28216399684223e-06,-0.0015159055199736,0.315367004010771,-0.669197163889639, + -8.32560708829977e-06,-0.00136899991462824,0.32337884270942,-0.69311446055361, + -8.36905018009038e-06,-0.00122209430928333,0.331390681408068,-0.717031757217581, + -8.41249327121485e-06,-0.00107518870393752,0.339402520106717,-0.740949053881552, + -8.45593636233932e-06,-0.000928283098591276,0.347414358805366,-0.764866350545523, + -8.49937945457402e-06,-0.000781377493247248,0.355426197504014,-0.788783647209495, + -5.37715498966085e-06,-0.00415866255094555,0.162212126159133,-0.215497165782528, + -5.40228059531245e-06,-0.00402856133269092,0.170092186510175,-0.239493971457097, + -5.42740620079751e-06,-0.00389846011443618,0.177972246861216,-0.263490777131667, + -5.45253180617156e-06,-0.00376835889618121,0.185852307212258,-0.287487582806236, + -5.47765741182316e-06,-0.00363825767792658,0.1937323675633,-0.311484388480806, + -5.50278301758578e-06,-0.0035081564596724,0.201612427914342,-0.335481194155375, + -5.52790862290431e-06,-0.00337805524141732,0.209492488265383,-0.359477999829944, + -5.55303422855591e-06,-0.00324795402316291,0.217372548616425,-0.383474805504514, + -5.57815983381893e-06,-0.00311785280490762,0.225252608967467,-0.407471611179083, + -5.60328543952604e-06,-0.00298775158665343,0.233132669318509,-0.431468416853653, + -5.62841104501111e-06,-0.0028576503683988,0.24101272966955,-0.455465222528222, + -5.65353665071822e-06,-0.00272754915014395,0.248892790020592,-0.479462028202791, + -5.67866225587021e-06,-0.00259744793188887,0.256772850371634,-0.503458833877361, + -5.70378786135528e-06,-0.00246734671363447,0.264652910722676,-0.52745563955193, + -5.72891346695137e-06,-0.00233724549537939,0.272532971073718,-0.5514524452265, + -5.7540390727695e-06,-0.00220714427712521,0.280413031424759,-0.575449250901069, + -5.77916467781048e-06,-0.00207704305886991,0.288293091775801,-0.599446056575639, + -5.80429028385065e-06,-0.00194694184061595,0.296173152126842,-0.623442862250208, + -5.82941588966879e-06,-0.00181684062236132,0.304053212477884,-0.647439667924778, + -5.85454149493181e-06,-0.00168673940410669,0.311933272828926,-0.671436473599347, + -5.87966709975074e-06,-0.00155663818585117,0.319813333179968,-0.695433279273916, + -5.90479270590194e-06,-0.00142653696759698,0.327693393531009,-0.719430084948486, + -5.92991831072087e-06,-0.00129643574934146,0.335573453882051,-0.743426890623055, + -5.95504391631696e-06,-0.00116633453108639,0.343453514233094,-0.767423696297624, + -5.98016952224611e-06,-0.00103623331283265,0.351333574584135,-0.791420501972194, + -3.86791962808664e-06,-0.00405281546913538,0.161535366169486,-0.216025099878753, + -3.88271724793832e-06,-0.00393509034925488,0.169319622460955,-0.240079513704925, + -3.89751486779e-06,-0.00381736522937437,0.177103878752425,-0.264133927531097, + -3.91231248714208e-06,-0.00369964010949331,0.184888135043894,-0.288188341357269, + -3.92711010638314e-06,-0.00358191498961169,0.192672391335364,-0.312242755183441, + -3.94190772623482e-06,-0.00346418986973118,0.200456647626833,-0.336297169009613, + -3.95670534591996e-06,-0.00334646474985045,0.208240903918302,-0.360351582835785, + -3.9715029655496e-06,-0.00322873962996995,0.216025160209771,-0.384405996661957, + -3.98630058506821e-06,-0.00311101451008899,0.223809416501241,-0.408460410488129, + -4.00109820497541e-06,-0.00299328939020804,0.23159367279271,-0.432514824314301, + -4.01589582432749e-06,-0.00287556427032709,0.23937792908418,-0.456569238140473, + -4.03069344367957e-06,-0.0027578391504457,0.247162185375649,-0.480623651966645, + -4.04549106325369e-06,-0.00264011403056497,0.254946441667118,-0.504678065792817, + -4.06028868282782e-06,-0.00252238891068424,0.262730697958588,-0.528732479618989, + -4.07508630273501e-06,-0.00240466379080373,0.270514954250057,-0.552786893445161, + -4.08988392242016e-06,-0.00228693867092256,0.278299210541527,-0.576841307271333, + -4.10468154232735e-06,-0.00216921355104249,0.286083466832995,-0.600895721097505, + -4.11947916167943e-06,-0.0020514884311611,0.293867723124465,-0.624950134923677, + -4.1342767814756e-06,-0.00193376331128103,0.301651979415934,-0.649004548749849, + -4.14907440116075e-06,-0.00181603819139964,0.309436235707404,-0.67305896257602, + -4.16387202029078e-06,-0.00169831307151824,0.317220491998873,-0.697113376402193, + -4.17866964008695e-06,-0.00158058795163774,0.325004748290342,-0.721167790228365, + -4.19346725955005e-06,-0.00146286283175678,0.332789004581812,-0.745222204054537, + -4.20826487912418e-06,-0.00134513771187583,0.340573260873281,-0.769276617880708, + -4.2230624986983e-06,-0.00122741259199488,0.348357517164751,-0.79333103170688, + -2.77730656589315e-06,-0.00397731074550967,0.161045337177822,-0.216406156640815, + -2.78621737304086e-06,-0.00386862330856763,0.168760273910496,-0.24050215136861, + -2.79512818091021e-06,-0.00375993587162637,0.17647521064317,-0.264598146096404, + -2.80403898855752e-06,-0.0036512484346849,0.184190147375844,-0.288694140824198, + -2.81294979592728e-06,-0.00354256099774286,0.191905084108518,-0.312790135551992, + -2.82186060351908e-06,-0.00343387356080171,0.199620020841192,-0.336886130279786, + -2.83077141105537e-06,-0.0033251861238599,0.207334957573866,-0.36098212500758, + -2.83968221859165e-06,-0.00321649868691831,0.21504989430654,-0.385078119735374, + -2.84859302612794e-06,-0.00310781124997672,0.222764831039215,-0.409174114463168, + -2.85750383410832e-06,-0.00299912381303558,0.230479767771889,-0.433270109190962, + -2.86641464142257e-06,-0.00289043637609354,0.238194704504563,-0.457366103918756, + -2.87532544906988e-06,-0.00278174893915217,0.245909641237237,-0.48146209864655, + -2.88423625649514e-06,-0.00267306150221058,0.253624577969911,-0.505558093374344, + -2.89314706380939e-06,-0.00256437406526855,0.261339514702585,-0.529654088102138, + -2.9020578714567e-06,-0.00245568662832674,0.26905445143526,-0.553750082829932, + -2.91096867910401e-06,-0.00234699919138537,0.276769388167934,-0.577846077557726, + -2.91987948686234e-06,-0.00223831175444422,0.284484324900608,-0.60194207228552, + -2.92879029439863e-06,-0.00212962431750263,0.292199261633282,-0.626038067013314, + -2.93770110149083e-06,-0.00202093688056015,0.299914198365956,-0.650134061741108, + -2.94661190913814e-06,-0.00191224944361901,0.30762913509863,-0.674230056468902, + -2.95552271656341e-06,-0.00180356200667697,0.315344071831305,-0.698326051196696, + -2.96443352454379e-06,-0.00169487456973583,0.323059008563979,-0.72242204592449, + -2.97334433163599e-06,-0.00158618713279379,0.330773945296653,-0.746518040652285, + -2.98225513906125e-06,-0.00147749969585176,0.338488882029327,-0.770614035380078, + -2.99116594693061e-06,-0.00136881225891061,0.346203818762001,-0.794710030107872, + -1.99163518083134e-06,-0.00392342676600754,0.16069180837979,-0.216680441945902, + -1.99713398812973e-06,-0.00382129905779505,0.168356760924067,-0.240806366677367, + -2.00263279531709e-06,-0.00371917134958222,0.176021713468344,-0.264932291408831, + -2.00813160283753e-06,-0.00361704364136983,0.183686666012621,-0.289058216140296, + -2.01363040985836e-06,-0.00351491593315689,0.191351618556898,-0.31318414087176, + -2.01912921754532e-06,-0.00341278822494484,0.199016571101175,-0.337310065603225, + -2.02462802495473e-06,-0.00331066051673212,0.206681523645452,-0.36143599033469, + -2.03012683197556e-06,-0.00320853280851918,0.214346476189728,-0.385561915066154, + -2.03562563916293e-06,-0.00310640510030646,0.222011428734005,-0.409687839797619, + -2.04112444668336e-06,-0.00300427739209419,0.229676381278282,-0.433813764529083, + -2.04662325387073e-06,-0.00290214968388125,0.237341333822559,-0.457939689260548, + -2.05212206094707e-06,-0.00280002197566809,0.245006286366836,-0.482065613992012, + -2.0576208684675e-06,-0.00269789426745581,0.252671238911113,-0.506191538723477, + -2.06311967587691e-06,-0.00259576655924354,0.26033619145539,-0.530317463454941, + -2.06861848306428e-06,-0.00249363885103016,0.268001143999667,-0.554443388186406, + -2.07411729069573e-06,-0.00239151114281833,0.275666096543944,-0.57856931291787, + -2.07961609743901e-06,-0.00228938343460516,0.283331049088221,-0.602695237649335, + -2.0851149047374e-06,-0.00218725572639222,0.290996001632498,-0.626821162380799, + -2.09061371170272e-06,-0.00208512801817973,0.298660954176774,-0.650947087112264, + -2.09611251988928e-06,-0.00198300030996812,0.306325906721051,-0.675073011843728, + -2.10161132663256e-06,-0.00188087260175429,0.313990859265328,-0.699198936575193, + -2.10711013404197e-06,-0.00177874489354179,0.321655811809605,-0.723324861306658, + -2.11260894189547e-06,-0.00167661718533019,0.329320764353882,-0.747450786038122, + -2.11810774897181e-06,-0.00157448947711725,0.336985716898158,-0.771576710769587, + -2.12360655582611e-06,-0.00147236176890431,0.344650669442435,-0.795702635501051, + -1.42689878224189e-06,-0.00388495795118449,0.160437426371332,-0.216877481495571, + -1.43037733996154e-06,-0.00378757069459368,0.168066426163253,-0.241024907176358, + -1.43385589768119e-06,-0.00369018343800287,0.175695425955175,-0.265172332857146, + -1.4373344551788e-06,-0.00359279618141173,0.183324425747097,-0.289319758537934, + -1.44081301306498e-06,-0.00349540892482114,0.190953425539019,-0.313467184218722, + -1.44429157089565e-06,-0.00339802166823056,0.198582425330941,-0.33761460989951, + -1.44777012844877e-06,-0.00330063441163952,0.206211425122863,-0.361762035580298, + -1.4512486861129e-06,-0.00320324715504849,0.213840424914785,-0.385909461261086, + -1.45472724366602e-06,-0.00310585989845746,0.221469424706707,-0.410056886941873, + -1.45820580144118e-06,-0.0030084726418671,0.229098424498628,-0.434204312622661, + -1.4616843589943e-06,-0.00291108538527607,0.23672742429055,-0.458351738303449, + -1.4651629169915e-06,-0.00281369812868548,0.244356424082472,-0.482499163984237, + -1.46864147421155e-06,-0.00271631087209401,0.251985423874394,-0.506646589665025, + -1.47212003254182e-06,-0.00261892361550409,0.259614423666316,-0.530794015345813, + -1.47559858998392e-06,-0.00252153635891328,0.267243423458237,-0.554941441026601, + -1.47907714753703e-06,-0.0024241491023218,0.27487242325016,-0.579088866707388, + -1.48255570542322e-06,-0.00232676184573144,0.282501423042081,-0.603236292388176, + -1.4860342633094e-06,-0.0022293745891413,0.290130422834003,-0.627383718068964, + -1.48951282097354e-06,-0.00213198733254982,0.297759422625925,-0.651531143749752, + -1.49299137885972e-06,-0.00203460007595968,0.305388422417847,-0.67567856943054, + -1.49646993619079e-06,-0.00193721281936776,0.313017422209769,-0.699825995111328, + -1.49994849341084e-06,-0.00183982556277673,0.320646422001691,-0.723973420792116, + -1.50342705140805e-06,-0.00174243830618659,0.328275421793613,-0.748120846472904, + -1.50690560929423e-06,-0.001645051049596,0.335904421585534,-0.772268272153691, + -1.51038416784655e-06,-0.00154766379300586,0.343533421377456,-0.796415697834479, + -0.000246864452599971,-0.0554140565176802,0.256198145899963,-0.111877456940221, + -0.000267960892454677,-0.0560975627866294,0.277583211357556,-0.123950075503243, + -0.000289057332309883,-0.0567810690555792,0.298968276815148,-0.136022694066265, + -0.000310153772164756,-0.0574645753245284,0.320353342272741,-0.148095312629287, + -0.000331250212019796,-0.058148081593478,0.341738407730333,-0.160167931192309, + -0.000352346651874613,-0.0588315878624271,0.363123473187926,-0.172240549755331, + -0.000373443091729431,-0.0595150941313765,0.384508538645519,-0.184313168318354, + -0.000394539531584803,-0.0601986004003265,0.405893604103111,-0.196385786881376, + -0.000415635971439232,-0.0608821066692755,0.427278669560703,-0.208458405444397, + -0.000436732411294383,-0.0615656129382252,0.448663735018296,-0.22053102400742, + -0.000457828851149422,-0.0622491192071746,0.470048800475889,-0.232603642570442, + -0.000478925291004351,-0.0629326254761238,0.491433865933482,-0.244676261133464, + -0.000500021730859057,-0.063616131745073,0.512818931391074,-0.256748879696486, + -0.000521118170714208,-0.0642996380140228,0.534203996848667,-0.268821498259509, + -0.000542214610569136,-0.0649831442829722,0.55558906230626,-0.280894116822531, + -0.000563311050424398,-0.0656666505519221,0.576974127763852,-0.292966735385553, + -0.000584407490278771,-0.0663501568208709,0.598359193221445,-0.305039353948575, + -0.000605503930134144,-0.0670336630898207,0.619744258679036,-0.317111972511596, + -0.000626600369988961,-0.0677171693587701,0.641129324136629,-0.329184591074618, + -0.000647696809844112,-0.0684006756277196,0.662514389594222,-0.341257209637641, + -0.000668793249699262,-0.0690841818966692,0.683899455051814,-0.353329828200662, + -0.00068988968955408,-0.0697676881656186,0.705284520509407,-0.365402446763685, + -0.000710986129408564,-0.0704511944345674,0.726669585966999,-0.377475065326706, + -0.000732082569263937,-0.0711347007035172,0.748054651424592,-0.389547683889728, + -0.000753179009118865,-0.0718182069724667,0.769439716882185,-0.401620302452752, + -0.00024249693930406,-0.0533044069831468,0.255189035588836,-0.114923501968334, + -0.000262910922894488,-0.0538835958385343,0.276349286939148,-0.127312425600976, + -0.000283324906484694,-0.0544627846939217,0.297509538289459,-0.139701349233619, + -0.000303738890075289,-0.0550419735493095,0.31866978963977,-0.152090272866262, + -0.000324152873665662,-0.0556211624046972,0.339830040990082,-0.164479196498905, + -0.00034456685725609,-0.0562003512600846,0.360990292340393,-0.176868120131548, + -0.000364980840846518,-0.0567795401154723,0.382150543690705,-0.18925704376419, + -0.00038539482443678,-0.0573587289708597,0.403310795041016,-0.201645967396833, + -0.000405808808027208,-0.0579379178262474,0.424471046391327,-0.214034891029476, + -0.000426222791617969,-0.0585171066816352,0.445631297741639,-0.226423814662119, + -0.000446636775208398,-0.0590962955370229,0.46679154909195,-0.238812738294761, + -0.000467050758798604,-0.0596754843924101,0.487951800442262,-0.251201661927405, + -0.000487464742389032,-0.0602546732477978,0.509112051792572,-0.263590585560047, + -0.000507878725979682,-0.0608338621031854,0.530272303142884,-0.27597950919269, + -0.000528292709569889,-0.0614130509585733,0.551432554493196,-0.288368432825333, + -0.000548706693160206,-0.0619922398139603,0.572592805843507,-0.300757356457976, + -0.000569120676750523,-0.062571428669348,0.593753057193819,-0.313146280090619, + -0.000589534660340951,-0.0631506175247356,0.614913308544129,-0.325535203723261, + -0.000609948643931602,-0.0637298063801237,0.63607355989444,-0.337924127355903, + -0.000630362627521697,-0.0643089952355109,0.657233811244752,-0.350313050988547, + -0.000650776611112347,-0.0648881840908986,0.678394062595063,-0.362701974621189, + -0.000671190594702997,-0.0654673729462862,0.699554313945375,-0.375090898253833, + -0.000691604578293314,-0.0660465618016737,0.720714565295686,-0.387479821886475, + -0.000712018561884076,-0.0666257506570616,0.741874816645998,-0.399868745519118, + -0.000732432545473727,-0.0672049395124485,0.763035067996309,-0.412257669151761, + -0.000236561234025101,-0.050590201727908,0.253743175509646,-0.118920198092828, + -0.000256072781308236,-0.0510390282996631,0.274595800509578,-0.131724143576508, + -0.000275584328591427,-0.0514878548714186,0.295448425509511,-0.144528089060189, + -0.00029509587587484,-0.0519366814431742,0.316301050509443,-0.157332034543869, + -0.00031460742315792,-0.0523855080149295,0.337153675509376,-0.170135980027549, + -0.000334118970441166,-0.0528343345866849,0.358006300509309,-0.18293992551123, + -0.000353630517724635,-0.0532831611584403,0.378858925509241,-0.19574387099491, + -0.000373142065007881,-0.0537319877301961,0.399711550509174,-0.20854781647859, + -0.000392653612290905,-0.0541808143019511,0.420564175509106,-0.22135176196227, + -0.000412165159574318,-0.0546296408737068,0.441416800509039,-0.234155707445952, + -0.000431676706857398,-0.0550784674454621,0.462269425508971,-0.246959652929631, + -0.0004511882541407,-0.0555272940172176,0.483122050508904,-0.259763598413312, + -0.000470699801423891,-0.0559761205889728,0.503974675508837,-0.272567543896992, + -0.00049021134870697,-0.0564249471607281,0.52482730050877,-0.285371489380673, + -0.000509722895990383,-0.0568737737324838,0.545679925508702,-0.298175434864354, + -0.000529234443273463,-0.0573226003042391,0.566532550508635,-0.310979380348034, + -0.000548745990556765,-0.0577714268759943,0.587385175508568,-0.323783325831715, + -0.000568257537840289,-0.0582202534477503,0.608237800508499,-0.336587271315394, + -0.000587769085122924,-0.0586690800195051,0.629090425508432,-0.349391216799074, + -0.000607280632406559,-0.0591179065912608,0.649943050508365,-0.362195162282755, + -0.000626792179689306,-0.0595667331630156,0.670795675508297,-0.374999107766435, + -0.000646303726972608,-0.0600155597347714,0.69164830050823,-0.387803053250116, + -0.000665815274256021,-0.0604643863065271,0.712500925508162,-0.400606998733796, + -0.000685326821539101,-0.0609132128782819,0.733353550508095,-0.413410944217476, + -0.000704838368822625,-0.0613620394500378,0.754206175508028,-0.426214889701157, + -0.000228604507525432,-0.0471982040778014,0.251685206284882,-0.124049020172528, + -0.000246947949845921,-0.0474906853328141,0.272122032292897,-0.13738554886165, + -0.000265291392166356,-0.0477831665878266,0.292558858300913,-0.150722077550772, + -0.000283634834487123,-0.0480756478428391,0.312995684308928,-0.164058606239893, + -0.000301978276807724,-0.0483681290978517,0.333432510316943,-0.177395134929015, + -0.000320321719128325,-0.0486606103528644,0.353869336324959,-0.190731663618137, + -0.000338665161448648,-0.0489530916078766,0.374306162332974,-0.204068192307259, + -0.000357008603769304,-0.0492455728628893,0.394742988340989,-0.217404720996381, + -0.000375352046089628,-0.0495380541179016,0.415179814349005,-0.230741249685503, + -0.000393695488410173,-0.049830535372914,0.43561664035702,-0.244077778374625, + -0.000412038930731051,-0.050123016627927,0.456053466365035,-0.257414307063747, + -0.000430382373051152,-0.050415497882939,0.476490292373051,-0.27075083575287, + -0.000448725815371809,-0.0507079791379517,0.496927118381066,-0.284087364441991, + -0.000467069257692354,-0.0510004603929641,0.517363944389082,-0.297423893131113, + -0.000485412700013232,-0.0512929416479773,0.537800770397097,-0.310760421820236, + -0.000503756142333445,-0.0515854229029888,0.558237596405113,-0.324096950509357, + -0.000522099584654101,-0.0518779041580018,0.578674422413128,-0.33743347919848, + -0.000540443026974424,-0.052170385413014,0.599111248421143,-0.350770007887601, + -0.000558786469295192,-0.0524628666680271,0.619548074429157,-0.364106536576722, + -0.000577129911615293,-0.0527553479230389,0.639984900437173,-0.377443065265845, + -0.000595473353935949,-0.0530478291780514,0.660421726445189,-0.390779593954967, + -0.00061381679625705,-0.0533403104330645,0.680858552453204,-0.404116122644089, + -0.000632160238576929,-0.0536327916880763,0.701295378461219,-0.41745265133321, + -0.000650503680897918,-0.0539252729430895,0.721732204469235,-0.430789180022333, + -0.000668847123218019,-0.0542177541981013,0.742169030477251,-0.444125708711455, + -0.000218148077783364,-0.0431136784634787,0.248799188503801,-0.130446240532712, + -0.000235022199236046,-0.0432286149130472,0.268684249767171,-0.144447064467877, + -0.000251896320688283,-0.0433435513626149,0.288569311030542,-0.158447888403041, + -0.000268770442140964,-0.0434584878121833,0.308454372293912,-0.172448712338206, + -0.000285644563593479,-0.0435734242617516,0.328339433557283,-0.18644953627337, + -0.000302518685046049,-0.0436883607113197,0.348224494820653,-0.200450360208535, + -0.000319392806498564,-0.0438032971608879,0.368109556084024,-0.2144511841437, + -0.000336266927951079,-0.0439182336104562,0.387994617347394,-0.228452008078864, + -0.000353141049403427,-0.0440331700600241,0.407879678610765,-0.242452832014029, + -0.000370015170855997,-0.0441481065095923,0.427764739874136,-0.256453655949194, + -0.000386889292308568,-0.0442630429591604,0.447649801137506,-0.270454479884358, + -0.000403763413761471,-0.0443779794087291,0.467534862400877,-0.284455303819523, + -0.000420637535213486,-0.0444929158582967,0.487419923664247,-0.298456127754687, + -0.000437511656666278,-0.0446078523078652,0.507304984927618,-0.312456951689852, + -0.000454385778118627,-0.0447227887574333,0.527190046190988,-0.326457775625017, + -0.000471259899571308,-0.0448377252070016,0.547075107454359,-0.340458599560182, + -0.000488134021023878,-0.0449526616565696,0.56696016871773,-0.354459423495347, + -0.000505008142476338,-0.0450675981061379,0.586845229981099,-0.368460247430511, + -0.000521882263928908,-0.0451825345557062,0.60673029124447,-0.382461071365675, + -0.000538756385381256,-0.045297471005274,0.626615352507841,-0.39646189530084, + -0.00055563050683427,-0.0454124074548425,0.646500413771211,-0.410462719236004, + -0.000572504628286397,-0.0455273439044106,0.666385475034582,-0.42446354317117, + -0.000589378749739189,-0.0456422803539791,0.686270536297951,-0.438464367106333, + -0.000606252871191315,-0.0457572168035463,0.706155597561323,-0.452465191041498, + -0.000623126992644107,-0.0458721532531152,0.726040658824693,-0.466466014976664, + -0.000204781344414262,-0.0384164175417704,0.244854401331128,-0.138148586646411, + -0.000219875354801669,-0.0383437017482647,0.264026326545991,-0.152949231694281, + -0.000234969365188853,-0.0382709859547589,0.283198251760854,-0.167749876742151, + -0.000250063375576426,-0.0381982701612533,0.302370176975716,-0.182550521790021, + -0.000265157385963721,-0.0381255543677477,0.321542102190579,-0.197351166837891, + -0.000280251396351294,-0.038052838574242,0.340714027405442,-0.212151811885762, + -0.000295345406738423,-0.0379801227807364,0.359885952620305,-0.226952456933632, + -0.000310439417125774,-0.0379074069872305,0.379057877835168,-0.241753101981502, + -0.000325533427512958,-0.0378346911937246,0.39822980305003,-0.256553747029372, + -0.000340627437900753,-0.0377619754002194,0.417401728264893,-0.271354392077243, + -0.000355721448288104,-0.037689259606714,0.436573653479755,-0.286155037125113, + -0.000370815458675122,-0.0376165438132077,0.455745578694619,-0.300955682172983, + -0.000385909469062362,-0.037543828019702,0.474917503909481,-0.315756327220853, + -0.000401003479449824,-0.0374711122261961,0.494089429124344,-0.330556972268724, + -0.000416097489837397,-0.0373983964326907,0.513261354339207,-0.345357617316594, + -0.000431191500224415,-0.0373256806391844,0.53243327955407,-0.360158262364464, + -0.000446285510611766,-0.0372529648456787,0.551605204768933,-0.374958907412334, + -0.000461379520999783,-0.0371802490521742,0.570777129983795,-0.389759552460204, + -0.000476473531386579,-0.0371075332586681,0.589949055198657,-0.404560197508074, + -0.000491567541774152,-0.0370348174651627,0.60912098041352,-0.419360842555945, + -0.000506661552161169,-0.0369621016716561,0.628292905628383,-0.434161487603815, + -0.000521755562549076,-0.0368893858781512,0.647464830843246,-0.448962132651685, + -0.000536849572935871,-0.0368166700846446,0.666636756058109,-0.463762777699555, + -0.000551943583323333,-0.0367439542911394,0.685808681272971,-0.478563422747425, + -0.000567037593710684,-0.0366712384976333,0.704980606487835,-0.493364067795296, + -0.000188312302296323,-0.0333027545366644,0.239663682021648,-0.147037492107954, + -0.000201350409809231,-0.0330495379784752,0.257946336683769,-0.162761172053508, + -0.000214388517322417,-0.0327963214202862,0.27622899134589,-0.178484851999062, + -0.00022742662483527,-0.0325431048620969,0.29451164600801,-0.194208531944617, + -0.000240464732348455,-0.032289888303908,0.31279430067013,-0.209932211890171, + -0.000253502839861142,-0.0320366717457181,0.331076955332251,-0.225655891835725, + -0.000266540947374383,-0.0317834551875296,0.349359609994372,-0.24137957178128, + -0.000279579054887291,-0.0315302386293399,0.367642264656493,-0.257103251726834, + -0.000292617162400588,-0.0312770220711511,0.385924919318613,-0.272826931672388, + -0.000305655269913441,-0.0310238055129615,0.404207573980734,-0.288550611617943, + -0.000318693377426404,-0.0307705889547725,0.422490228642854,-0.304274291563497, + -0.000331731484939479,-0.0305173723965833,0.440772883304975,-0.319997971509052, + -0.000344769592452665,-0.0302641558383943,0.459055537967095,-0.335721651454606, + -0.00035780769996574,-0.0300109392802053,0.477338192629216,-0.351445331400161, + -0.000370845807478482,-0.0297577227220156,0.495620847291336,-0.367169011345715, + -0.000383883914991556,-0.0295045061638264,0.513903501953457,-0.38289269129127, + -0.000396922022504409,-0.0292512896056372,0.532186156615578,-0.398616371236824, + -0.000409960130017373,-0.0289980730474479,0.550468811277698,-0.414340051182378, + -0.00042299823753067,-0.0287448564892592,0.568751465939818,-0.430063731127932, + -0.000436036345043411,-0.0284916399310693,0.587034120601939,-0.445787411073487, + -0.000449074452556486,-0.0282384233728803,0.605316775264059,-0.461511091019041, + -0.000462112560069672,-0.0279852068146913,0.62359942992618,-0.477234770964596, + -0.000475150667582969,-0.0277319902565027,0.6418820845883,-0.49295845091015, + -0.000488188775095377,-0.027478773698312,0.660164739250422,-0.508682130855704, + -0.000501226882608563,-0.0272255571401239,0.678447393912542,-0.524405810801259, + -0.000168941576360493,-0.0280720748629026,0.233169446040873,-0.156807605866084, + -0.000179740730544442,-0.027665828520984,0.250392748099001,-0.173545826464828, + -0.000190539884728114,-0.0272595821790648,0.267616050157129,-0.190284047063573, + -0.000201339038912007,-0.0268533358371459,0.284839352215256,-0.207022267662317, + -0.000212138193095956,-0.0264470894952271,0.302062654273384,-0.223760488261062, + -0.000222937347279906,-0.0260408431533083,0.319285956331511,-0.240498708859806, + -0.000233736501463522,-0.0256345968113891,0.336509258389639,-0.257236929458551, + -0.00024453565564786,-0.0252283504694708,0.353732560447767,-0.273975150057295, + -0.00025533480983142,-0.0248221041275516,0.370955862505894,-0.290713370656039, + -0.000266133964015536,-0.0244158577856328,0.388179164564022,-0.307451591254784, + -0.000276933118198985,-0.0240096114437136,0.40540246662215,-0.324189811853528, + -0.00028773227238299,-0.0236033651017944,0.422625768680278,-0.340928032452273, + -0.000298531426566773,-0.0231971187598758,0.439849070738405,-0.357666253051017, + -0.000309330580750444,-0.0227908724179564,0.457072372796533,-0.374404473649762, + -0.000320129734934116,-0.0223846260760372,0.474295674854661,-0.391142694248507, + -0.000330928889118454,-0.0219783797341189,0.491518976912789,-0.407880914847251, + -0.000341728043302014,-0.0215721333921997,0.508742278970916,-0.424619135445995, + -0.00035252719748613,-0.0211658870502809,0.525965581029044,-0.441357356044739, + -0.000363326351669913,-0.0207596407083621,0.543188883087171,-0.458095576643484, + -0.000374125505854139,-0.0203533943664436,0.560412185145299,-0.474833797242228, + -0.000384924660037145,-0.0199471480245239,0.577635487203426,-0.491572017840973, + -0.000395723814221371,-0.0195409016826051,0.594858789261554,-0.508310238439718, + -0.000406522968405043,-0.0191346553406864,0.612082091319682,-0.525048459038462, + -0.00041732212258927,-0.0187284089987676,0.629305393377809,-0.541786679637206, + -0.000428121276773386,-0.0183221626568488,0.646528695435937,-0.558524900235951, + -0.000147375830275187,-0.0230680050143636,0.225524121968931,-0.166987261886944, + -0.000155899325228193,-0.0225537475345226,0.241552403347803,-0.184782550512154, + -0.000164422820181032,-0.0220394900546814,0.257580684726674,-0.202577839137364, + -0.000172946315134093,-0.0215252325748405,0.273608966105546,-0.220373127762575, + -0.000181469810086932,-0.0210109750949994,0.289637247484418,-0.238168416387785, + -0.000189993305040048,-0.0204967176151585,0.30566552886329,-0.255963705012995, + -0.000198516799992776,-0.0199824601353171,0.321693810242162,-0.273758993638206, + -0.000207040294945671,-0.019468202655476,0.337722091621034,-0.291554282263416, + -0.000215563789898954,-0.0189539451756355,0.353750372999905,-0.309349570888626, + -0.000224087284851904,-0.0184396876957944,0.369778654378777,-0.327144859513836, + -0.000232610779804965,-0.0179254302159535,0.385806935757649,-0.344940148139046, + -0.000241134274757582,-0.0174111727361124,0.401835217136521,-0.362735436764257, + -0.000249657769710421,-0.016896915256271,0.417863498515393,-0.380530725389467, + -0.000258181264663593,-0.0163826577764301,0.433891779894265,-0.398326014014678, + -0.000266704759616432,-0.0158684002965892,0.449920061273137,-0.416121302639888, + -0.000275228254569604,-0.0153541428167483,0.465948342652009,-0.433916591265098, + -0.000283751749522332,-0.0148398853369067,0.481976624030881,-0.451711879890309, + -0.000292275244475615,-0.014325627857066,0.498004905409752,-0.469507168515518, + -0.000300798739428454,-0.0138113703772256,0.514033186788623,-0.487302457140728, + -0.000309322234380627,-0.0132971128973836,0.530061468167496,-0.505097745765939, + -0.000317845729334132,-0.0127828554175426,0.546089749546368,-0.522893034391149, + -0.000326369224287193,-0.0122685979377022,0.562118030925239,-0.54068832301636, + -0.000334892719239921,-0.0117543404578608,0.578146312304111,-0.55848361164157, + -0.000343416214192427,-0.011240082978019,0.594174593682983,-0.57627890026678, + -0.000351939709146154,-0.010725825498179,0.610202875061855,-0.594074188891991, + -0.000124781340769542,-0.0185925649659061,0.217111911363614,-0.177019598206651, + -0.000131163698672054,-0.0180240798120679,0.23187134262974,-0.195856656999005, + -0.000137546056574456,-0.0174555946582301,0.246630773895866,-0.214693715791358, + -0.000143928414476857,-0.016887109504392,0.261390205161992,-0.233530774583712, + -0.000150310772379314,-0.016318624350554,0.276149636428119,-0.252367833376066, + -0.000156693130281715,-0.0157501391967159,0.290909067694245,-0.27120489216842, + -0.00016307548818445,-0.0151816540428782,0.305668498960371,-0.290041950960773, + -0.000169457846086518,-0.0146131688890396,0.320427930226497,-0.308879009753127, + -0.000175840203988864,-0.0140446837352017,0.335187361492623,-0.327716068545481, + -0.000182222561891598,-0.0134761985813641,0.349946792758749,-0.346553127337835, + -0.000188604919794333,-0.0129077134275264,0.364706224024875,-0.365390186130188, + -0.000194987277696734,-0.0123392282736887,0.379465655291,-0.384227244922542, + -0.000201369635598803,-0.0117707431198495,0.394225086557127,-0.403064303714896, + -0.000207751993501204,-0.011202257966012,0.408984517823253,-0.42190136250725, + -0.000214134351403827,-0.0106337728121741,0.423743949089379,-0.440738421299604, + -0.000220516709306451,-0.0100652876583365,0.438503380355505,-0.459575480091957, + -0.000226899067208963,-0.00949680250449858,0.453262811621631,-0.478412538884311, + -0.000233281425111587,-0.00892831735066091,0.468022242887757,-0.497249597676664, + -0.000239663783013544,-0.00835983219682257,0.482781674153882,-0.516086656469018, + -0.000246046140916056,-0.00779134704298423,0.497541105420009,-0.534923715261372, + -0.000252428498819235,-0.00722286188914678,0.512300536686135,-0.553760774053725, + -0.000258810856720637,-0.006654376735308,0.527059967952261,-0.57259783284608, + -0.000265193214623483,-0.0060858915814701,0.541819399218387,-0.591434891638433, + -0.000271575572525773,-0.00551740642763221,0.556578830484513,-0.610271950430787, + -0.000277957930428285,-0.00494892127379343,0.57133826175064,-0.629109009223141, + -0.000102547718876467,-0.0148346633131522,0.208478544432048,-0.186378973240234, + -0.000107073886912112,-0.0142630400592851,0.221972677914883,-0.206187921070433, + -0.000111600054947925,-0.013691416805418,0.235466811397719,-0.225996868900631, + -0.000116126222983792,-0.013119793551551,0.248960944880554,-0.245805816730829, + -0.00012065239101966,-0.012548170297684,0.262455078363389,-0.265614764561028, + -0.000125178559055361,-0.0119765470438169,0.275949211846224,-0.285423712391226, + -0.000129704727091229,-0.0114049237899503,0.289443345329059,-0.305232660221425, + -0.000134230895126985,-0.0108333005360828,0.302937478811895,-0.325041608051623, + -0.000138757063162798,-0.0102616772822159,0.31643161229473,-0.344850555881822, + -0.000143283231198388,-0.00969005402834866,0.329925745777565,-0.36465950371202, + -0.000147809399234422,-0.00911843077448182,0.3434198792604,-0.384468451542219, + -0.000152335567270012,-0.00854680752061454,0.356914012743236,-0.404277399372417, + -0.000156861735306046,-0.00797518426674793,0.37040814622607,-0.424086347202615, + -0.000161387903341415,-0.0074035610128802,0.383902279708906,-0.443895295032814, + -0.000165914071377116,-0.00683193775901314,0.397396413191741,-0.463704242863013, + -0.000170440239413594,-0.00626031450514697,0.410890546674576,-0.483513190693211, + -0.000174966407449073,-0.00568869125127947,0.424384680157412,-0.503322138523409, + -0.000179492575484885,-0.00511706799741241,0.437878813640247,-0.523131086353608, + -0.000184018743521031,-0.00454544474354579,0.451372947123082,-0.542940034183806, + -0.000188544911556843,-0.00397382148967873,0.464867080605917,-0.562748982014005, + -0.000193071079592544,-0.00340219823581167,0.478361214088752,-0.582557929844203, + -0.000197597247628134,-0.00283057498194417,0.491855347571588,-0.602366877674401, + -0.000202123415663724,-0.00225895172807666,0.505349481054423,-0.622175825504599, + -0.000206649583700425,-0.00168732847421094,0.518843614537258,-0.641984773334798, + -0.000211175751735793,-0.00111570522034343,0.532337748020093,-0.661793721164997, + -8.19545731325921e-05,-0.011847105218636,0.200193061642561,-0.194674142680212, + -8.49986958874061e-05,-0.0113114945378022,0.212499956188785,-0.215344471127903, + -8.8042818642442e-05,-0.0107758838569688,0.224806850735009,-0.236014799575595, + -9.10869413977555e-05,-0.0102402731761357,0.237113745281232,-0.256685128023287, + -9.41310641523474e-05,-0.00970466249530189,0.249420639827456,-0.277355456470978, + -9.71751869071613e-05,-0.00916905181446825,0.26172753437368,-0.29802578491867, + -0.000100219309662086,-0.00863344113363507,0.274034428919903,-0.318696113366361, + -0.000103263432417566,-0.00809783045280188,0.286341323466127,-0.339366441814053, + -0.000106307555172047,-0.00756221977196825,0.29864821801235,-0.360036770261745, + -0.000109351677927028,-0.00702660909113439,0.310955112558574,-0.380707098709436, + -0.000112395800682008,-0.00649099841030099,0.323262007104798,-0.401377427157128, + -0.000115439923436877,-0.00595538772946735,0.335568901651021,-0.422047755604819, + -0.000118484046191747,-0.00541977704863417,0.347875796197245,-0.442718084052511, + -0.000121528168946616,-0.00488416636780054,0.360182690743468,-0.463388412500203, + -0.000124572291701708,-0.00434855568696735,0.372489585289692,-0.484058740947894, + -0.000127616414456466,-0.00381294500613305,0.384796479835916,-0.504729069395586, + -0.000130660537211669,-0.00327733432530053,0.397103374382139,-0.525399397843278, + -0.000133704659966316,-0.00274172364446645,0.409410268928363,-0.546069726290969, + -0.000136748782721297,-0.00220611296363327,0.421717163474586,-0.56674005473866, + -0.000139792905476055,-0.00167050228279875,0.434024058020811,-0.587410383186352, + -0.000142837028231368,-0.001134891601966,0.446330952567034,-0.608080711634044, + -0.000145881150986682,-0.000599280921133261,0.458637847113258,-0.628751040081736, + -0.000148925273741218,-6.36702402991851e-05,0.470944741659481,-0.649421368529427, + -0.000151969396495755,0.00047194044053489,0.483251636205705,-0.670091696977119, + -0.000155013519250624,0.00100755112136763,0.495558530751928,-0.690762025424811, + -6.39008497230753e-05,-0.00957315228300548,0.192711109273746,-0.201698592911911, + -6.58509058489853e-05,-0.00909685774987279,0.203964276096877,-0.223098348928492, + -6.7800961975284e-05,-0.00862056321674054,0.215217442920008,-0.244498104945073, + -6.9751018101083e-05,-0.00814426868360751,0.226470609743139,-0.265897860961655, + -7.17010742274926e-05,-0.00766797415047549,0.23772377656627,-0.287297616978236, + -7.36511303534026e-05,-0.00719167961734257,0.248976943389401,-0.308697372994817, + -7.56011864792572e-05,-0.00671538508420966,0.260230110212532,-0.330097129011399, + -7.75512426053337e-05,-0.00623909055107719,0.271483277035663,-0.35149688502798, + -7.95012987311328e-05,-0.00576279601794405,0.282736443858794,-0.372896641044561, + -8.14513548572648e-05,-0.00528650148481158,0.293989610681925,-0.394296397061142, + -8.34014109832859e-05,-0.00481020695167911,0.305242777505056,-0.415696153077724, + -8.5351467109307e-05,-0.00433391241854642,0.316495944328187,-0.437095909094305, + -8.7301523235439e-05,-0.00385761788541372,0.327749111151318,-0.458495665110886, + -8.92515793613491e-05,-0.00338132335228125,0.339002277974449,-0.479895421127468, + -9.12016354879253e-05,-0.00290502881914878,0.35025544479758,-0.501295177144049, + -9.31516916135022e-05,-0.00242873428601587,0.361508611620711,-0.52269493316063, + -9.51017477400784e-05,-0.00195243975288406,0.372761778443842,-0.544094689177212, + -9.70518038657664e-05,-0.0014761452197507,0.384014945266973,-0.565494445193793, + -9.90018599917875e-05,-0.000999850686618231,0.395268112090103,-0.586894201210374, + -0.000100951916118031,-0.000523556153486204,0.406521278913234,-0.608293957226955, + -0.000102901972243497,-4.72616203519571e-05,0.417774445736366,-0.629693713243537, + -0.00010485202836974,0.000429032912779626,0.429027612559496,-0.651093469260118, + -0.000106802084496538,0.000905327445911652,0.440280779382627,-0.672493225276699, + -0.000108752140621338,0.0013816219790459,0.451533946205759,-0.693892981293281, + -0.000110702196747803,0.00185791651217793,0.46278711302889,-0.715292737309862, + -4.88033117650999e-05,-0.00789628497602224,0.186300283828706,-0.207421042720615, + -5.00010394403061e-05,-0.00748802205088783,0.196662254302952,-0.229415024977596, + -5.11987671155123e-05,-0.00707975912575354,0.207024224777197,-0.251409007234577, + -5.2396494790663e-05,-0.00667149620061913,0.217386195251442,-0.273402989491558, + -5.35942224660912e-05,-0.00626323327548528,0.227748165725687,-0.295396971748539, + -5.47919501410754e-05,-0.00585497035035032,0.238110136199933,-0.31739095400552, + -5.59896778162261e-05,-0.00544670742521602,0.248472106674178,-0.339384936262501, + -5.71874054916544e-05,-0.00503844450008195,0.258834077148423,-0.361378918519482, + -5.8385133166694e-05,-0.00463018157494743,0.269196047622668,-0.383372900776463, + -5.95828608419557e-05,-0.00422191864981358,0.279558018096913,-0.405366883033444, + -6.07805885175505e-05,-0.00381365572467929,0.289919988571159,-0.427360865290425, + -6.19783161924792e-05,-0.00340539279954455,0.300281959045404,-0.449354847547406, + -6.31760438671858e-05,-0.00299712987440959,0.310643929519649,-0.471348829804387, + -6.43737715432247e-05,-0.0025888669492764,0.321005899993894,-0.493342812061368, + -6.55714992182643e-05,-0.00218060402414189,0.33136787046814,-0.515336794318349, + -6.6769226893304e-05,-0.00177234109900715,0.341729840942385,-0.53733077657533, + -6.79669545685657e-05,-0.00136407817387307,0.35209181141663,-0.559324758832311, + -6.91646822438274e-05,-0.000955815248738556,0.362453781890876,-0.581318741089292, + -7.0362409918201e-05,-0.000547552323603373,0.372815752365121,-0.603312723346273, + -7.15601375936847e-05,-0.000139289398469966,0.383177722839365,-0.625306705603254, + -7.27578652691685e-05,0.000268973526664773,0.393539693313611,-0.647300687860235, + -7.39555929444302e-05,0.000677236451798624,0.403901663787856,-0.669294670117216, + -7.51533206195809e-05,0.00108549937693292,0.414263634262101,-0.691288652374197, + -7.63510482952867e-05,0.00149376230206677,0.424625604736346,-0.713282634631178, + -7.75487759702154e-05,0.00190202522720151,0.434987575210592,-0.735276616888159, + -3.6657207693358e-05,-0.00668517436174343,0.181040341264463,-0.211937548857577, + -3.73682522203378e-05,-0.0063431899145856,0.190678143685197,-0.234400530677896, + -3.80792967470955e-05,-0.00600120546742733,0.200315946105931,-0.256863512498215, + -3.87903412739643e-05,-0.00565922102026928,0.209953748526665,-0.279326494318535, + -3.9501385800722e-05,-0.00531723657311112,0.219591550947399,-0.301789476138854, + -4.02124303273688e-05,-0.00497525212595296,0.229229353368133,-0.324252457959174, + -4.09234748546261e-05,-0.00463326767879524,0.238867155788867,-0.346715439779493, + -4.16345193815504e-05,-0.0042912832316373,0.248504958209601,-0.369178421599812, + -4.23455639082526e-05,-0.00394929878447869,0.258142760630335,-0.391641403420132, + -4.30566084352879e-05,-0.00360731433732098,0.267780563051069,-0.414104385240451, + -4.37676529622122e-05,-0.00326532989016304,0.277418365471803,-0.43656736706077, + -4.44786974886924e-05,-0.00292334544300443,0.287056167892537,-0.45903034888109, + -4.51897420157277e-05,-0.00258136099584649,0.296693970313271,-0.481493330701409, + -4.59007865424299e-05,-0.00223937654868833,0.306331772734005,-0.503956312521729, + -4.66118310696872e-05,-0.00189739210153061,0.315969575154739,-0.526419294342048, + -4.73228755961674e-05,-0.00155540765437268,0.325607377575472,-0.548882276162367, + -4.80339201235358e-05,-0.00121342320721474,0.335245179996206,-0.571345257982687, + -4.8744964650127e-05,-0.000871438760056353,0.34488298241694,-0.593808239803006, + -4.94560091767182e-05,-0.000529454312897748,0.354520784837675,-0.616271221623325, + -5.01670537036425e-05,-0.000187469865740031,0.364158587258408,-0.638734203443645, + -5.08780982301227e-05,0.000154514581419019,0.373796389679143,-0.661197185263964, + -5.15891427580462e-05,0.000496499028575403,0.383434192099876,-0.683660167084283, + -5.23001872844153e-05,0.000838483475734009,0.39307199452061,-0.706123148904603, + -5.30112318110065e-05,0.00118046792289261,0.402709796941344,-0.728586130724922, + -5.37222763382639e-05,0.00152245237004989,0.412347599362078,-0.751049112545242, + -2.71794826884886e-05,-0.00582096312288161,0.176871403320773,-0.215413996228058, + -2.75910491914777e-05,-0.00553759727282632,0.185939311595505,-0.238237976627652, + -2.80026156946889e-05,-0.00525423142277137,0.195007219870237,-0.261061957027245, + -2.84141821976225e-05,-0.00497086557271609,0.204075128144968,-0.283885937426838, + -2.88257487006116e-05,-0.00468749972266069,0.2131430364197,-0.306709917826431, + -2.92373152036562e-05,-0.0044041338726053,0.222210944694432,-0.329533898226025, + -2.96488817068674e-05,-0.00412076802255057,0.231278852969163,-0.352357878625618, + -3.00604482095235e-05,-0.00383740217249473,0.240346761243895,-0.375181859025211, + -3.04720147126236e-05,-0.00355403632243934,0.249414669518627,-0.398005839424804, + -3.08835812159458e-05,-0.00327067047238461,0.258482577793358,-0.420829819824398, + -3.1295147719157e-05,-0.00298730462232943,0.26755048606809,-0.443653800223991, + -3.1706714221702e-05,-0.00270393877227337,0.276618394342822,-0.466477780623584, + -3.21182807252463e-05,-0.00242057292221909,0.285686302617553,-0.489301761023178, + -3.25298472279023e-05,-0.00213720707216369,0.294754210892285,-0.512125741422771, + -3.29414137306694e-05,-0.00185384122210808,0.303822119167017,-0.534949721822364, + -3.33529802343246e-05,-0.00157047537205357,0.312890027441748,-0.557773702221957, + -3.37645467367587e-05,-0.00128710952199773,0.32195793571648,-0.58059768262155, + -3.41761132395257e-05,-0.00100374367194211,0.331025843991212,-0.603421663021144, + -3.4587679743292e-05,-0.00072037782188783,0.340093752265943,-0.626245643420737, + -3.4999246245726e-05,-0.000437011971831769,0.349161660540675,-0.64906962382033, + -3.54108127487152e-05,-0.000153646121776596,0.358229568815407,-0.671893604219924, + -3.58223792520374e-05,0.000129719728277689,0.367297477090138,-0.694717584619517, + -3.62339457548044e-05,0.000413085578333749,0.37636538536487,-0.71754156501911, + -3.66455122579046e-05,0.000696451428389366,0.385433293639602,-0.740365545418703, + -3.70570787603386e-05,0.000979817278445427,0.394501201914334,-0.763189525818296, + -1.99549688742473e-05,-0.00520790955741457,0.173654690367246,-0.218038603065309, + -2.01892717745511e-05,-0.004973198377072,0.182285150774053,-0.24113512587341, + -2.04235746748549e-05,-0.00473848719672942,0.190915611180859,-0.264231648681511, + -2.06578775754362e-05,-0.00450377601638707,0.199546071587666,-0.287328171489611, + -2.0892180475296e-05,-0.00426906483604395,0.208176531994472,-0.310424694297712, + -2.11264833759883e-05,-0.00403435365570193,0.216806992401279,-0.333521217105813, + -2.13607862764031e-05,-0.00379964247535947,0.225437452808085,-0.356617739913913, + -2.15950891762628e-05,-0.00356493129501589,0.234067913214892,-0.379714262722014, + -2.18293920768442e-05,-0.00333022011467365,0.242698373621699,-0.402810785530115, + -2.2063694977259e-05,-0.00309550893433119,0.251328834028505,-0.425907308338215, + -2.22979978773408e-05,-0.00286079775398851,0.259959294435312,-0.449003831146316, + -2.25323007779776e-05,-0.00262608657364605,0.268589754842118,-0.472100353954416, + -2.27666036783924e-05,-0.00239137539330403,0.277220215248924,-0.495196876762517, + -2.30009065782522e-05,-0.00215666421296024,0.285850675655732,-0.518293399570617, + -2.3235209478667e-05,-0.00192195303261822,0.294481136062538,-0.541389922378718, + -2.34695123793038e-05,-0.00168724185227576,0.303111596469344,-0.564486445186819, + -2.37038152792746e-05,-0.00145253067193285,0.311742056876151,-0.587582967994919, + -2.39381181798004e-05,-0.00121781949159061,0.320372517282957,-0.61067949080302, + -2.41724210798822e-05,-0.000983108311247705,0.329002977689764,-0.633776013611121, + -2.440672398063e-05,-0.000748397130905687,0.33763343809657,-0.656872536419221, + -2.46410268810449e-05,-0.000513685950563225,0.346263898503377,-0.679969059227322, + -2.48753297809046e-05,-0.000278974770220319,0.354894358910183,-0.703065582035423, + -2.51096326808753e-05,-4.42635898769694e-05,0.36352481931699,-0.726162104843523, + -2.53439355815122e-05,0.000190447590465492,0.372155279723797,-0.749258627651624, + -2.5578238482149e-05,0.00042515877080751,0.380785740130603,-0.772355150459724, + -1.45437579358587e-05,-0.00477388014024482,0.171222799841025,-0.219991290632827, + -1.46760576720806e-05,-0.00457783107770926,0.179523785723102,-0.243290582924403, + -1.48083574079694e-05,-0.00438178201517347,0.18782477160518,-0.266589875215978, + -1.49406571438027e-05,-0.00418573295263736,0.196125757487258,-0.289889167507553, + -1.5072956879858e-05,-0.0039896838901019,0.204426743369335,-0.313188459799129, + -1.52052566158578e-05,-0.00379363482756623,0.212727729251412,-0.336487752090704, + -1.53375563515801e-05,-0.00359758576503033,0.22102871513349,-0.35978704438228, + -1.54698560872468e-05,-0.00340153670249421,0.229329701015567,-0.383086336673855, + -1.56021558235242e-05,-0.00320548763995898,0.237630686897645,-0.40638562896543, + -1.57344555596906e-05,-0.00300943857742375,0.245931672779722,-0.429684921257006, + -1.58667552953018e-05,-0.00281338951488719,0.2542326586618,-0.452984213548581, + -1.59990550313571e-05,-0.00261734045235174,0.262533644543877,-0.476283505840157, + -1.61313547669684e-05,-0.00242129138981562,0.270834630425954,-0.499582798131732, + -1.62636545031347e-05,-0.00222524232728016,0.279135616308032,-0.522882090423307, + -1.63959542386349e-05,-0.0020291932647436,0.28743660219011,-0.546181382714883, + -1.65282539746903e-05,-0.00183314420220793,0.295737588072187,-0.569480675006458, + -1.66605537109676e-05,-0.00163709513967292,0.304038573954264,-0.592779967298034, + -1.67928534466899e-05,-0.00144104607713658,0.312339559836342,-0.616079259589609, + -1.69251531828563e-05,-0.00124499701460135,0.320640545718419,-0.639378551881185, + -1.70574529181344e-05,-0.00104894795206434,0.328941531600497,-0.66267784417276, + -1.71897526540787e-05,-0.000852898889529108,0.337242517482574,-0.685977136464335, + -1.73220523910222e-05,-0.000656849826993877,0.345543503364652,-0.70927642875591, + -1.74543521264114e-05,-0.000460800764458202,0.353844489246729,-0.732575721047486, + -1.75866518623558e-05,-0.000264751701922528,0.362145475128806,-0.755875013339061, + -1.77189515983001e-05,-6.87026393868528e-05,0.370446461010884,-0.779174305630637, + -1.05428704574306e-05,-0.00446653785499607,0.16941205445849,-0.221428303171678, + -1.06175524133278e-05,-0.00430028647719183,0.177468386034947,-0.244876816616242, + -1.06922343692251e-05,-0.00413403509938748,0.185524717611403,-0.268325330060805, + -1.07669163251223e-05,-0.00396778372158346,0.193581049187859,-0.291773843505368, + -1.0841598280853e-05,-0.003801532343779,0.201637380764316,-0.315222356949931, + -1.09162802365281e-05,-0.00363528096597454,0.209693712340772,-0.338670870394494, + -1.09909621924253e-05,-0.0034690295881703,0.217750043917228,-0.362119383839057, + -1.10656441482115e-05,-0.00330277821036562,0.225806375493685,-0.38556789728362, + -1.11403261041643e-05,-0.00313652683256183,0.233862707070141,-0.409016410728183, + -1.12150080595619e-05,-0.0029702754547567,0.241919038646597,-0.432464924172746, + -1.12896900158477e-05,-0.00280402407695313,0.249975370223053,-0.455913437617309, + -1.13643719718004e-05,-0.00263777269914911,0.25803170179951,-0.479361951061872, + -1.1439053927087e-05,-0.00247152132134443,0.266088033375966,-0.502810464506435, + -1.15137358831507e-05,-0.00230526994353975,0.274144364952423,-0.526258977950998, + -1.15884178389924e-05,-0.00213901856573573,0.282200696528879,-0.549707491395561, + -1.16630997948342e-05,-0.00197276718793171,0.290257028105335,-0.573156004840124, + -1.17377817503428e-05,-0.00180651581012681,0.298313359681791,-0.596604518284687, + -1.18124637062955e-05,-0.00164026443232279,0.306369691258247,-0.62005303172925, + -1.18871456620262e-05,-0.00147401305451789,0.314426022834704,-0.643501545173812, + -1.1961827618534e-05,-0.00130776167671476,0.32248235441116,-0.666950058618376, + -1.20365095735986e-05,-0.00114151029890985,0.330538685987616,-0.690398572062939, + -1.21111915298844e-05,-0.000975258921106281,0.338595017564072,-0.713847085507502, + -1.21858734856151e-05,-0.000809007543301377,0.346651349140529,-0.737295598952065, + -1.22605554413457e-05,-0.000642756165496916,0.354707680716985,-0.760744112396628, + -1.23352373974095e-05,-0.0004765047876929,0.362764012293442,-0.784192625841191, + -7.61258073717075e-06,-0.00424864627727706,0.16807888994616,-0.222477349273512, + -7.65503377453403e-06,-0.00410486947323174,0.1759554472951,-0.246034796958118, + -7.69748681206384e-06,-0.00396109266918687,0.183832004644041,-0.269592244642725, + -7.7399398493716e-06,-0.00381731586514178,0.191708561992982,-0.293149692327332, + -7.78239288673488e-06,-0.00367353906109646,0.199585119341923,-0.316707140011938, + -7.82484592409816e-06,-0.00352976225705137,0.207461676690864,-0.340264587696544, + -7.86729896146143e-06,-0.0033859854530065,0.215338234039804,-0.363822035381151, + -7.90975199910227e-06,-0.00324220864896163,0.223214791388745,-0.387379483065758, + -7.9522050362435e-06,-0.00309843184491632,0.231091348737686,-0.410936930750364, + -7.99465807377331e-06,-0.00295465504087122,0.238967906086627,-0.434494378434971, + -8.03711111108107e-06,-0.00281087823682591,0.246844463435568,-0.458051826119577, + -8.07956414838884e-06,-0.00266710143278082,0.254721020784508,-0.481609273804184, + -8.12201718569661e-06,-0.0025233246287355,0.262597578133449,-0.50516672148879, + -8.16447022300437e-06,-0.00237954782469085,0.270474135482389,-0.528724169173396, + -8.20692326042316e-06,-0.00223577102064509,0.278350692831331,-0.552281616858003, + -8.24937629806399e-06,-0.00209199421660067,0.286227250180271,-0.57583906454261, + -8.29182933537176e-06,-0.00194821741255513,0.294103807529212,-0.599396512227216, + -8.33428237323464e-06,-0.00180444060851048,0.301980364878153,-0.622953959911823, + -8.37673540976525e-06,-0.0016606638044645,0.309856922227094,-0.646511407596429, + -8.41918844685097e-06,-0.00151688700041941,0.317733479576034,-0.670068855281036, + -8.46164148438078e-06,-0.00137311019637432,0.325610036924975,-0.693626302965642, + -8.50409452179957e-06,-0.00122933339232967,0.333486594273916,-0.717183750650249, + -8.54654755888529e-06,-0.00108555658828413,0.341363151622857,-0.740741198334855, + -8.58900059730328e-06,-0.000941779784239927,0.349239708971798,-0.764298646019462, + -8.63145363372286e-06,-0.000798002980193502,0.357116266320739,-0.787856093704068, + -5.48107768499895e-06,-0.00409394044038736,0.167105395083023,-0.223238683404435, + -5.50553729483649e-06,-0.00396685621611603,0.174850863792921,-0.246875188963453, + -5.52999690445199e-06,-0.00383977199184504,0.182596332502818,-0.270511694522472, + -5.55445651478914e-06,-0.00371268776757483,0.190341801212715,-0.294148200081491, + -5.5789161246822e-06,-0.00358560354330417,0.198087269922612,-0.317784705640509, + -5.60337573435321e-06,-0.00345851931903307,0.205832738632509,-0.341421211199528, + -5.62783534435729e-06,-0.00333143509476219,0.213578207342407,-0.365057716758546, + -5.65229495425035e-06,-0.00320435087049131,0.221323676052304,-0.388694222317565, + -5.67675456442096e-06,-0.00307726664622088,0.229069144762201,-0.412330727876584, + -5.70121417409197e-06,-0.00295018242195,0.236814613472098,-0.435967233435602, + -5.72567378398503e-06,-0.0028230981976789,0.244560082181996,-0.459603738994621, + -5.75013339398911e-06,-0.00269601397340846,0.252305550891893,-0.48324024455364, + -5.77459300377114e-06,-0.0025689297491378,0.26005101960179,-0.506876750112658, + -5.79905261399727e-06,-0.0024418455248667,0.267796488311687,-0.530513255671677, + -5.82351222366828e-06,-0.00231476130059582,0.275541957021584,-0.554149761230695, + -5.84797183345032e-06,-0.00218767707632472,0.283287425731482,-0.577786266789714, + -5.87243144301031e-06,-0.0020605928520534,0.291032894441379,-0.601422772348733, + -5.89689105345848e-06,-0.00193350862778363,0.298778363151276,-0.625059277907751, + -5.92135066279642e-06,-0.00180642440351209,0.306523831861173,-0.64869578346677, + -5.94581027291152e-06,-0.00167934017924187,0.31426930057107,-0.672332289025788, + -5.97026988313765e-06,-0.00155225595497122,0.322014769280967,-0.695968794584807, + -5.99472949314173e-06,-0.00142517173070011,0.329760237990865,-0.719605300143826, + -6.01918910325683e-06,-0.0012980875064299,0.337505706700762,-0.743241805702844, + -6.0436487127058e-06,-0.0011710032821588,0.345251175410659,-0.766878311261863, + -6.06810832293192e-06,-0.00104391905788859,0.352996644120556,-0.790514816820882, + -3.93827156464077e-06,-0.00398393860121116,0.166398779280903,-0.223788859236162, + -3.95263214225672e-06,-0.00386911732963868,0.174049192917986,-0.247482495731576, + -3.9669927195396e-06,-0.00375429605806565,0.18169960655507,-0.27117613222699, + -3.98135329715554e-06,-0.00363947478649318,0.189350020192153,-0.294869768722404, + -3.99571387471598e-06,-0.00352465351492026,0.197000433829236,-0.318563405217818, + -4.01007445205437e-06,-0.00340983224334757,0.20465084746632,-0.342257041713232, + -4.02443502950378e-06,-0.00329501097177465,0.212301261103403,-0.365950678208646, + -4.03879560728626e-06,-0.0031801897002024,0.219951674740486,-0.389644314704059, + -4.05315618479118e-06,-0.00306536842862926,0.22760208837757,-0.413337951199473, + -4.06751676207406e-06,-0.00295054715705634,0.235252502014653,-0.437031587694887, + -4.08187733980103e-06,-0.00283572588548409,0.242902915651736,-0.460725224190301, + -4.09623791708391e-06,-0.00272090461391117,0.25055332928882,-0.484418860685715, + -4.11059849447781e-06,-0.00260608334233825,0.258203742925903,-0.508112497181129, + -4.12495907253785e-06,-0.00249126207076644,0.265854156562986,-0.531806133676543, + -4.13931964948766e-06,-0.00237644079919286,0.27350457020007,-0.555499770171957, + -4.15368022710361e-06,-0.00226161952762038,0.281154983837153,-0.579193406667371, + -4.1680408049416e-06,-0.00214679825604813,0.288805397474236,-0.602887043162785, + -4.18240138266857e-06,-0.00203197698447521,0.29645581111132,-0.626580679658198, + -4.19676195950736e-06,-0.00191715571290141,0.304106224748404,-0.650274316153612, + -4.21112253734535e-06,-0.00180233444132982,0.311756638385486,-0.673967952649026, + -4.2254831145172e-06,-0.00168751316975646,0.31940705202257,-0.69766158914444, + -4.23984369168906e-06,-0.0015726918981831,0.327057465659653,-0.721355225639854, + -4.25420426986012e-06,-0.00145787062661151,0.334707879296736,-0.745048862135268, + -4.26856484692095e-06,-0.00134304935503771,0.34235829293382,-0.768742498630682, + -4.2829254245369e-06,-0.00122822808346523,0.350008706570903,-0.792436135126095, + -2.8255415050471e-06,-0.00390562563951535,0.165888096140561,-0.224185216446855, + -2.8341668102394e-06,-0.00379974294697316,0.173469861687616,-0.247920011163492, + -2.84279211559824e-06,-0.00369386025443141,0.18105162723467,-0.271654805880129, + -2.85141742067951e-06,-0.003587977561889,0.188633392781724,-0.295389600596766, + -2.86004272620488e-06,-0.00348209486934703,0.196215158328779,-0.319124395313403, + -2.86866803156371e-06,-0.00337621217680484,0.203796923875833,-0.34285919003004, + -2.87729333714459e-06,-0.00327032948426331,0.211378689422887,-0.366593984746677, + -2.88591864228138e-06,-0.0031644467917209,0.218960454969942,-0.390328779463314, + -2.89454394719613e-06,-0.00305856409917871,0.226542220516996,-0.414063574179951, + -2.903169252777e-06,-0.00295268140663674,0.23412398606405,-0.437798368896589, + -2.91179455791379e-06,-0.00284679871409454,0.241705751611105,-0.461533163613225, + -2.92041986360569e-06,-0.00274091602155258,0.249287517158159,-0.485267958329863, + -2.92904516874248e-06,-0.00263503332901038,0.256869282705213,-0.5090027530465, + -2.93767047421234e-06,-0.00252915063646864,0.264451048252267,-0.532737547763137, + -2.94629577912708e-06,-0.00242326794392644,0.272032813799322,-0.556472342479774, + -2.9549210843749e-06,-0.00231738525138403,0.279614579346376,-0.580207137196411, + -2.96354638995577e-06,-0.0022115025588425,0.28719634489343,-0.603941931913048, + -2.97217169487052e-06,-0.00210561986629942,0.294778110440485,-0.627676726629685, + -2.9807970004514e-06,-0.00199973717375768,0.302359875987539,-0.651411521346322, + -2.98942230636534e-06,-0.00189385448121637,0.309941641534593,-0.675146316062959, + -2.99804761072497e-06,-0.00178797178867374,0.317523407081648,-0.698881110779596, + -3.0066729165279e-06,-0.00168208909613199,0.325105172628702,-0.722615905496233, + -3.01529822188673e-06,-0.0015762064035898,0.332686938175756,-0.746350700212871, + -3.02392352746761e-06,-0.00147032371104805,0.340268703722811,-0.770085494929508, + -3.03254883204929e-06,-0.00136444101850497,0.347850469269865,-0.793820289646145, + -2.02504840152162e-06,-0.00384981663134298,0.165520168050654,-0.224470125042806, + -2.03035955431696e-06,-0.00375041303838319,0.173052500907214,-0.248234505019163, + -2.0356707066127e-06,-0.00365100944542318,0.180584833763774,-0.271998884995521, + -2.04098185996315e-06,-0.00355160585246428,0.188117166620333,-0.295763264971879, + -2.04629301253645e-06,-0.00345220225950427,0.195649499476893,-0.319527644948237, + -2.05160416527628e-06,-0.0033527986665447,0.203181832333453,-0.343292024924595, + -2.05691531823815e-06,-0.00325339507358557,0.210714165190012,-0.367056404900952, + -2.06222647081145e-06,-0.00315399148062534,0.218246498046572,-0.39082078487731, + -2.06753762377332e-06,-0.00305458788766622,0.225778830903131,-0.414585164853668, + -2.0728487762911e-06,-0.00295518429470643,0.233311163759691,-0.438349544830026, + -2.07815992914195e-06,-0.00285578070174686,0.240843496616251,-0.462113924806384, + -2.08347108188178e-06,-0.00275637710878729,0.248375829472811,-0.485878304782741, + -2.08878223462161e-06,-0.00265697351582772,0.25590816232937,-0.509642684759099, + -2.09409338736144e-06,-0.00255756992286815,0.26344049518593,-0.533407064735457, + -2.09940454010127e-06,-0.00245816632990836,0.27097282804249,-0.557171444711815, + -2.10471569306314e-06,-0.00235876273694902,0.278505160899049,-0.580935824688173, + -2.11002684569195e-06,-0.00225935914398923,0.286037493755609,-0.60470020466453, + -2.11533799843178e-06,-0.00215995555102921,0.293569826612169,-0.628464584640888, + -2.12064915150467e-06,-0.00206055195807009,0.301102159468729,-0.652228964617246, + -2.12596030435552e-06,-0.00196114836511052,0.308634492325288,-0.675993344593604, + -2.13127145720637e-06,-0.0018617447721514,0.316166825181848,-0.699757724569962, + -2.13658260961314e-06,-0.00176234117919138,0.323699158038407,-0.723522104546319, + -2.14189376246399e-06,-0.00166293758623137,0.331231490894968,-0.747286484522677, + -2.1472049146487e-06,-0.00156353399327092,0.338763823751528,-0.771050864499035, + -2.15251606783262e-06,-0.00146413040031224,0.346296156608087,-0.794815244475393, + -1.45023219166873e-06,-0.00381001374802681,0.165255684628993,-0.224674594955478, + -1.45358602143819e-06,-0.00371528779198183,0.172752496235725,-0.248460207339553, + -1.45693985115214e-06,-0.00362056183593662,0.180249307842458,-0.272245819723629, + -1.46029368097711e-06,-0.00352583587989197,0.187746119449191,-0.296031432107704, + -1.46364751058004e-06,-0.00343110992384665,0.195242931055924,-0.31981704449178, + -1.46700134051603e-06,-0.003336383967802,0.202739742662657,-0.343602656875855, + -1.47035516978589e-06,-0.00324165801175647,0.21023655426939,-0.36738826925993, + -1.47370899999943e-06,-0.00314693205571204,0.217733365876122,-0.391173881644006, + -1.47706282938032e-06,-0.00305220609966694,0.225230177482855,-0.414959494028081, + -1.48041665892773e-06,-0.0029574801436214,0.232726989089588,-0.438745106412157, + -1.48377048891923e-06,-0.00286275418757653,0.240223800696321,-0.462530718796232, + -1.48712431857767e-06,-0.00276802823153144,0.247720612303054,-0.486316331180307, + -1.49047814823611e-06,-0.00267330227548612,0.255217423909787,-0.510101943564383, + -1.49383197789454e-06,-0.00257857631944147,0.262714235516519,-0.533887555948458, + -1.49718580799707e-06,-0.0024838503633966,0.270211047123252,-0.557673168332534, + -1.50053963721142e-06,-0.00238912440735128,0.277707858729985,-0.581458780716609, + -1.5038934670919e-06,-0.00229439845130619,0.285204670336718,-0.605244393100684, + -1.50724729730545e-06,-0.00219967249526176,0.292701481943451,-0.62903000548476, + -1.51060112685286e-06,-0.00210494653921689,0.300198293550183,-0.652815617868835, + -1.51395495706641e-06,-0.00201022058317246,0.307695105156916,-0.676601230252911, + -1.51730878605871e-06,-0.00191549462712626,0.315191916763649,-0.700386842636986, + -1.52066261605022e-06,-0.00182076867108183,0.322688728370382,-0.724172455021062, + -1.52401644559763e-06,-0.00172604271503651,0.330185539977115,-0.747958067405137, + -1.52737027558913e-06,-0.00163131675899209,0.337682351583847,-0.771743679789213, + -1.53072410569166e-06,-0.00153659080294766,0.34517916319058,-0.795529292173288, + -0.000290365556621486,-0.0831048794773134,0.270183118729893,-0.0811597439040615, + -0.000317727021539316,-0.0851696668271098,0.293139119567801,-0.089629629797002, + -0.000345088486457201,-0.0872344541769061,0.316095120405709,-0.0980995156899426, + -0.000372449951375031,-0.0892992415267024,0.339051121243617,-0.106569401582883, + -0.000399811416292473,-0.0913640288764984,0.362007122081525,-0.115039287475824, + -0.000427172881210525,-0.093428816226295,0.384963122919433,-0.123509173368764, + -0.000454534346128355,-0.0954936035760914,0.407919123757341,-0.131979059261705, + -0.000481895811046018,-0.0975583909258875,0.430875124595249,-0.140448945154645, + -0.000509257275963848,-0.0996231782756838,0.453831125433157,-0.148918831047585, + -0.000536618740881512,-0.10168796562548,0.476787126271066,-0.157388716940526, + -0.000563980205799286,-0.103752752975276,0.499743127108973,-0.165858602833466, + -0.000591341670717282,-0.105817540325073,0.522699127946882,-0.174328488726407, + -0.000618703135634613,-0.107882327674869,0.54565512878479,-0.182798374619348, + -0.00064606460055272,-0.109947115024665,0.568611129622698,-0.191268260512289, + -0.000673426065470495,-0.112011902374461,0.591567130460606,-0.199738146405229, + -0.000700787530388602,-0.114076689724258,0.614523131298514,-0.208208032298169, + -0.000728148995305933,-0.116141477074054,0.637479132136422,-0.21667791819111, + -0.00075551046022404,-0.118206264423851,0.66043513297433,-0.22514780408405, + -0.000782871925141593,-0.120271051773646,0.683391133812238,-0.233617689976991, + -0.000810233390059145,-0.122335839123443,0.706347134650147,-0.242087575869932, + -0.000837594854977031,-0.124400626473239,0.729303135488054,-0.250557461762871, + -0.000864956319894805,-0.126465413823035,0.752259136325962,-0.259027347655812, + -0.000892317784812802,-0.128530201172832,0.77521513716387,-0.267497233548752, + -0.000919679249730465,-0.130594988522628,0.798171138001779,-0.275967119441694, + -0.000947040714648462,-0.132659775872424,0.821127138839687,-0.284437005334635, + -0.000285439044318658,-0.0788884600813667,0.269908099348282,-0.0863975780654059, + -0.000311814613315697,-0.0807116562214574,0.292640773346268,-0.0953862696122311, + -0.000338190182312514,-0.0825348523615481,0.315373447344253,-0.104374961159056, + -0.00036456575130972,-0.0843580485016392,0.338106121342238,-0.113363652705881, + -0.000390941320307037,-0.0861812446417302,0.360838795340224,-0.122352344252706, + -0.000417316889304076,-0.088004440781821,0.38357146933821,-0.131341035799531, + -0.000443692458300948,-0.0898276369219116,0.406304143336196,-0.140329727346357, + -0.000470068027297932,-0.0916508330620025,0.429036817334181,-0.149318418893182, + -0.000496443596295304,-0.0934740292020937,0.451769491332166,-0.158307110440007, + -0.000522819165292066,-0.0952972253421842,0.474502165330152,-0.167295801986832, + -0.000549194734289049,-0.097120421482275,0.497234839328137,-0.176284493533656, + -0.000575570303286366,-0.0989436176223661,0.519967513326123,-0.185273185080482, + -0.000601945872283127,-0.100766813762457,0.542700187324108,-0.194261876627307, + -0.000628321441280444,-0.102590009902548,0.565432861322094,-0.203250568174133, + -0.000654697010277649,-0.104413206042639,0.588165535320079,-0.212239259720957, + -0.000681072579274633,-0.106236402182729,0.610898209318065,-0.221227951267783, + -0.000707448148271617,-0.10805959832282,0.63363088331605,-0.230216642814608, + -0.000733823717268933,-0.109882794462911,0.656363557314036,-0.239205334361433, + -0.000760199286265473,-0.111705990603002,0.679096231312021,-0.248194025908258, + -0.000786574855262789,-0.113529186743093,0.701828905310007,-0.257182717455083, + -0.000812950424259884,-0.115352382883184,0.724561579307992,-0.266171409001908, + -0.000839325993256868,-0.117175579023274,0.747294253305977,-0.275160100548733, + -0.000865701562253851,-0.118998775163365,0.770026927303963,-0.284148792095558, + -0.000892077131250613,-0.120821971303456,0.792759601301949,-0.293137483642384, + -0.000918452700247707,-0.122645167443546,0.815492275299935,-0.30212617518921, + -0.000278517917485899,-0.0735827109712001,0.269214791543963,-0.0931462226777854, + -0.000303590963914135,-0.0751102086031479,0.291626147898498,-0.102803365128765, + -0.000328664010342372,-0.0766377062350957,0.314037504253033,-0.112460507579744, + -0.000353737056770553,-0.0781652038670434,0.336448860607568,-0.122117650030723, + -0.000378810103198957,-0.0796927014989917,0.358860216962103,-0.131774792481703, + -0.000403883149626971,-0.0812201991309393,0.381271573316638,-0.141431934932682, + -0.000428956196055541,-0.0827476967628875,0.403682929671172,-0.151089077383661, + -0.000454029242483833,-0.0842751943948354,0.426094286025707,-0.160746219834641, + -0.000479102288912125,-0.0858026920267834,0.448505642380242,-0.17040336228562, + -0.000504175335339863,-0.0873301896587306,0.470916998734777,-0.180060504736599, + -0.000529248381768377,-0.088857687290679,0.493328355089311,-0.189717647187578, + -0.000554321428196447,-0.0903851849226263,0.515739711443847,-0.199374789638558, + -0.000579394474624739,-0.0919126825545744,0.538151067798381,-0.209031932089537, + -0.000604467521053254,-0.0934401801865226,0.560562424152916,-0.218689074540517, + -0.000629540567481546,-0.0949676778184705,0.58297378050745,-0.228346216991495, + -0.000654613613909394,-0.096495175450418,0.605385136861986,-0.238003359442475, + -0.000679686660337797,-0.0980226730823657,0.627796493216521,-0.247660501893454, + -0.000704759706765978,-0.0995501707143136,0.650207849571056,-0.257317644344434, + -0.00072983275319416,-0.101077668346262,0.67261920592559,-0.266974786795413, + -0.000754905799622563,-0.102605165978209,0.695030562280125,-0.276631929246392, + -0.000779978846050855,-0.104132663610157,0.717441918634659,-0.286289071697371, + -0.000805051892478925,-0.105660161242105,0.739853274989195,-0.295946214148351, + -0.000830124938907328,-0.107187658874053,0.762264631343729,-0.30560335659933, + -0.000855197985335399,-0.108715156506001,0.784675987698264,-0.31526049905031, + -0.000880271031763469,-0.110242654137948,0.8070873440528,-0.324917641501289, + -0.000268932171180125,-0.0671413516680254,0.267806399191215,-0.101606868718142, + -0.000292324722309001,-0.0683235465568256,0.28976151765628,-0.11210203521991, + -0.000315717273438099,-0.0695057414456262,0.311716636121344,-0.122597201721679, + -0.000339109824566919,-0.0706879363344263,0.333671754586409,-0.133092368223448, + -0.00036250237569585,-0.0718701312232265,0.355626873051473,-0.143587534725217, + -0.000385894926824615,-0.0730523261120266,0.377581991516538,-0.154082701226985, + -0.000409287477953768,-0.0742345210008273,0.399537109981602,-0.164577867728754, + -0.000432680029082755,-0.0754167158896277,0.421492228446667,-0.175073034230523, + -0.000456072580211631,-0.076598910778428,0.443447346911731,-0.185568200732291, + -0.000479465131340673,-0.0777811056672282,0.465402465376796,-0.196063367234061, + -0.000502857682469271,-0.0789633005560282,0.48735758384186,-0.206558533735829, + -0.000526250233598202,-0.0801454954448284,0.509312702306925,-0.217053700237598, + -0.000549642784727467,-0.0813276903336293,0.53126782077199,-0.227548866739367, + -0.000573035335856065,-0.0825098852224291,0.553222939237055,-0.238044033241136, + -0.000596427886985218,-0.0836920801112297,0.575178057702118,-0.248539199742904, + -0.000619820438113927,-0.0848742750000295,0.597133176167183,-0.259034366244673, + -0.000643212989243191,-0.08605646988883,0.619088294632248,-0.269529532746442, + -0.000666605540371901,-0.0872386647776302,0.641043413097313,-0.280024699248211, + -0.000689998091501165,-0.0884208596664307,0.662998531562377,-0.290519865749979, + -0.000713390642629874,-0.0896030545552307,0.684953650027442,-0.301015032251749, + -0.000736783193758694,-0.0907852494440313,0.706908768492506,-0.311510198753517, + -0.000760175744887959,-0.0919674443328318,0.728863886957571,-0.322005365255286, + -0.000783568296016446,-0.0931496392216316,0.750819005422635,-0.332500531757054, + -0.000806960847145488,-0.0943318341104322,0.7727741238877,-0.342995698258824, + -0.000830353398274863,-0.0955140289992329,0.794729242352764,-0.353490864760592, + -0.000255971318819492,-0.0596655614004283,0.265296336351817,-0.111857495529336, + -0.000277264898083718,-0.0604683600995755,0.286619086203558,-0.123367983055347, + -0.000298558477347832,-0.0612711587987222,0.307941836055298,-0.134878470581358, + -0.000319852056612002,-0.0620739574978694,0.329264585907038,-0.14638895810737, + -0.000341145635876283,-0.0628767561970165,0.350587335758779,-0.157899445633381, + -0.000362439215140398,-0.0636795548961633,0.371910085610519,-0.169409933159392, + -0.000383732794404346,-0.0644823535953101,0.393232835462259,-0.180920420685404, + -0.000405026373668849,-0.0652851522944573,0.414555585314,-0.192430908211415, + -0.000426319952932963,-0.0660879509936041,0.43587833516574,-0.203941395737426, + -0.000447613532197133,-0.0668907496927511,0.45720108501748,-0.215451883263438, + -0.000468907111461636,-0.0676935483918983,0.47852383486922,-0.226962370789448, + -0.000490200690725473,-0.0684963470910449,0.499846584720961,-0.23847285831546, + -0.000511494269989754,-0.0692991457901919,0.521169334572701,-0.249983345841471, + -0.000532787849253813,-0.0701019444893389,0.542492084424442,-0.261493833367483, + -0.000554081428518316,-0.0709047431884862,0.563814834276182,-0.273004320893494, + -0.000575375007782264,-0.071707541887633,0.585137584127922,-0.284514808419505, + -0.000596668587046212,-0.0725103405867795,0.606460333979663,-0.296025295945517, + -0.000617962166310493,-0.0733131392859265,0.627783083831403,-0.307535783471528, + -0.000639255745574885,-0.074115937985074,0.649105833683143,-0.319046270997539, + -0.000660549324839055,-0.0749187366842208,0.670428583534884,-0.330556758523551, + -0.000681842904103336,-0.075721535383368,0.691751333386624,-0.342067246049562, + -0.000703136483367506,-0.0765243340825146,0.713074083238364,-0.353577733575573, + -0.000724430062631565,-0.0773271327816618,0.734396833090104,-0.365088221101584, + -0.000745723641896179,-0.0781299314808093,0.755719582941845,-0.376598708627596, + -0.000767017221160127,-0.0789327301799561,0.777042332793585,-0.388109196153607, + -0.000239062339685736,-0.0514489907115763,0.261271124276077,-0.123774896546407, + -0.00025784440303811,-0.0518660262219388,0.281749032288758,-0.13646579850266, + -0.000276626466390317,-0.0522830617323016,0.302226940301438,-0.149156700458914, + -0.00029540852974258,-0.0527000972426643,0.322704848314118,-0.161847602415167, + -0.000314190593094898,-0.053117132753027,0.343182756326799,-0.174538504371421, + -0.000332972656447106,-0.0535341682633895,0.363660664339479,-0.187229406327674, + -0.000351754719799424,-0.0539512037737524,0.384138572352159,-0.199920308283928, + -0.000370536783151854,-0.0543682392841154,0.40461648036484,-0.212611210240181, + -0.000389318846504172,-0.0547852747944781,0.42509438837752,-0.225302112196435, + -0.000408100909856213,-0.0552023103048405,0.445572296390201,-0.237993014152688, + -0.000426882973208476,-0.0556193458152032,0.466050204402881,-0.250683916108941, + -0.000445665036561071,-0.0560363813255664,0.486528112415561,-0.263374818065195, + -0.00046444709991289,-0.0564534168359285,0.507006020428241,-0.276065720021448, + -0.000483229163265153,-0.0568704523462913,0.527483928440922,-0.288756621977703, + -0.000502011226617749,-0.0572874878566543,0.547961836453602,-0.301447523933956, + -0.000520793289970345,-0.0577045233670175,0.568439744466282,-0.314138425890209, + -0.000539575353321942,-0.0581215588773794,0.588917652478963,-0.326829327846463, + -0.000558357416674315,-0.0585385943877421,0.609395560491643,-0.339520229802717, + -0.000577139480026911,-0.0589556298981053,0.629873468504323,-0.352211131758969, + -0.000595921543379063,-0.0593726654084679,0.650351376517004,-0.364902033715223, + -0.000614703606731437,-0.0597897009188304,0.670829284529684,-0.377592935671477, + -0.000633485670083589,-0.0602067364291932,0.691307192542365,-0.39028383762773, + -0.000652267733435852,-0.0606237719395564,0.711785100555044,-0.402974739583983, + -0.000671049796787893,-0.0610408074499182,0.732263008567725,-0.415665641540237, + -0.000689831860140711,-0.0614578429602819,0.752740916580406,-0.428356543496491, + -0.000218035455180232,-0.0429684642126457,0.255419200877421,-0.13698336251664, + -0.000233971756844753,-0.0430296346636544,0.274822998954568,-0.150982558438187, + -0.000249908058509163,-0.0430908051146629,0.294226797031714,-0.164981754359735, + -0.000265844360173906,-0.043151975565672,0.31363059510886,-0.178980950281283, + -0.000281780661838038,-0.0432131460166802,0.333034393186007,-0.192980146202831, + -0.000297716963502836,-0.0432743164676892,0.352438191263153,-0.206979342124378, + -0.000313653265167191,-0.0433354869186977,0.3718419893403,-0.220978538045926, + -0.000329589566831545,-0.0433966573697064,0.391245787417446,-0.234977733967474, + -0.000345525868496344,-0.0434578278207156,0.410649585494592,-0.248976929889022, + -0.000361462170160975,-0.0435189982717241,0.430053383571739,-0.26297612581057, + -0.000377398471825496,-0.0435801687227328,0.449457181648885,-0.276975321732117, + -0.000393334773490017,-0.0436413391737418,0.468860979726031,-0.290974517653665, + -0.000409271075154649,-0.0437025096247508,0.488264777803178,-0.304973713575213, + -0.000425207376819059,-0.0437636800757588,0.507668575880325,-0.318972909496761, + -0.000441143678483802,-0.043824850526768,0.52707237395747,-0.332972105418308, + -0.000457079980148323,-0.0438860209777769,0.546476172034617,-0.346971301339857, + -0.000473016281812622,-0.0439471914287854,0.565879970111763,-0.360970497261404, + -0.000488952583477475,-0.0440083618797946,0.585283768188909,-0.374969693182952, + -0.000504888885141996,-0.0440695323308034,0.604687566266056,-0.3889688891045, + -0.000520825186806628,-0.0441307027818123,0.624091364343202,-0.402968085026048, + -0.000536761488470594,-0.0441918732328201,0.643495162420348,-0.416967280947595, + -0.000552697790135337,-0.0442530436838289,0.662898960497495,-0.430966476869143, + -0.000568634091800302,-0.0443142141348383,0.682302758574641,-0.444965672790691, + -0.000584570393464712,-0.0443753845858472,0.701706556651787,-0.458964868712239, + -0.000600506695128789,-0.0444365550368553,0.721110354728934,-0.472964064633787, + -0.000193380070825533,-0.0347963517830426,0.247690675273858,-0.150869206911089, + -0.000206297447399584,-0.0345671484551668,0.26580912793042,-0.166243790895506, + -0.000219214823973413,-0.0343379451272909,0.283927580586982,-0.181618374879923, + -0.000232132200547241,-0.034108741799415,0.302046033243544,-0.19699295886434, + -0.000245049577121015,-0.0338795384715389,0.320164485900106,-0.212367542848757, + -0.000257966953695288,-0.0336503351436634,0.338282938556668,-0.227742126833174, + -0.00027088433026895,-0.0334211318157873,0.35640139121323,-0.243116710817591, + -0.000283801706843057,-0.0331919284879116,0.374519843869792,-0.258491294802008, + -0.000296719083416663,-0.0329627251600353,0.392638296526354,-0.273865878786425, + -0.000309636459990825,-0.0327335218321598,0.410756749182916,-0.289240462770842, + -0.000322553836564765,-0.0325043185042841,0.428875201839477,-0.304615046755259, + -0.000335471213138705,-0.0322751151764085,0.446993654496039,-0.319989630739676, + -0.000348388589712423,-0.0320459118485321,0.465112107152602,-0.335364214724093, + -0.000361305966286585,-0.0318167085206564,0.483230559809164,-0.350738798708511, + -0.000374223342860192,-0.0315875051927805,0.501349012465725,-0.366113382692927, + -0.000387140719434131,-0.0313583018649044,0.519467465122288,-0.381487966677344, + -0.000400058096007627,-0.0311290985370283,0.537585917778849,-0.396862550661761, + -0.000412975472581567,-0.0308998952091526,0.555704370435411,-0.412237134646179, + -0.000425892849156062,-0.0306706918812774,0.573822823091973,-0.427611718630595, + -0.000438810225729891,-0.0304414885534012,0.591941275748535,-0.442986302615013, + -0.000451727602303831,-0.0302122852255255,0.610059728405097,-0.458360886599429, + -0.000464644978877105,-0.0299830818976488,0.628178181061659,-0.473735470583847, + -0.000477562355451155,-0.0297538785697733,0.646296633718221,-0.489110054568264, + -0.000490479732025428,-0.0295246752418978,0.664415086374783,-0.504484638552681, + -0.000503397108599146,-0.0292954719140215,0.682533539031345,-0.519859222537098, + -0.000166324389982486,-0.0274564673426033,0.238401607945775,-0.164679292003469, + -0.000176271908794268,-0.0270259757527455,0.255082980230495,-0.181421760118207, + -0.000186219427605883,-0.0265954841628874,0.271764352515215,-0.198164228232945, + -0.000196166946417442,-0.0261649925730291,0.288445724799935,-0.214906696347682, + -0.000206114465229335,-0.0257345009831713,0.305127097084655,-0.23164916446242, + -0.000216061984040949,-0.0253040093933132,0.321808469369375,-0.248391632577158, + -0.000226009502852509,-0.0248735178034551,0.338489841654094,-0.265134100691896, + -0.000235957021664346,-0.0244430262135971,0.355171213938815,-0.281876568806633, + -0.000245904540476238,-0.0240125346237394,0.371852586223534,-0.298619036921371, + -0.000255852059287576,-0.0235820430338809,0.388533958508254,-0.315361505036109, + -0.000265799578099468,-0.023151551444023,0.405215330792974,-0.332103973150846, + -0.000275747096911139,-0.0227210598541647,0.421896703077694,-0.348846441265584, + -0.000285694615722809,-0.0222905682643069,0.438578075362414,-0.365588909380322, + -0.000295642134534257,-0.0218600766744488,0.455259447647134,-0.38233137749506, + -0.00030558965334615,-0.0214295850845909,0.471940819931854,-0.399073845609797, + -0.00031553717215782,-0.0209990934947326,0.488622192216574,-0.415816313724535, + -0.000325484690969269,-0.0205686019048741,0.505303564501294,-0.432558781839273, + -0.000335432209781161,-0.0201381103150167,0.521984936786014,-0.449301249954011, + -0.000345379728593054,-0.0197076187251586,0.538666309070734,-0.466043718068748, + -0.000355327247404613,-0.0192771271353007,0.555347681355453,-0.482786186183487, + -0.000365274766216506,-0.0188466355454429,0.572029053640173,-0.499528654298224, + -0.000375222285028065,-0.0184161439555846,0.588710425924893,-0.516271122412962, + -0.00038516980383918,-0.0179856523657258,0.605391798209613,-0.533013590527699, + -0.000395117322651295,-0.0175551607758679,0.622073170494333,-0.549756058642438, + -0.000405064841462965,-0.0171246691860101,0.638754542779053,-0.566498526757175, + -0.000138622115878562,-0.0212920465336244,0.228199271739853,-0.177676571694251, + -0.000145877422407792,-0.0207537564373693,0.24338353329062,-0.195706415846676, + -0.000153132728936911,-0.0202154663411143,0.258567794841388,-0.213736259999102, + -0.00016038803546653,-0.0196771762448595,0.273752056392155,-0.231766104151527, + -0.00016764334199576,-0.0191388861486044,0.288936317942923,-0.249795948303953, + -0.000174898648524879,-0.0186005960523494,0.304120579493691,-0.267825792456378, + -0.000182153955054554,-0.0180623059560949,0.319304841044458,-0.285855636608804, + -0.00018940926158395,-0.01752401585984,0.334489102595226,-0.303885480761229, + -0.000196664568113292,-0.016985725763585,0.349673364145993,-0.321915324913655, + -0.000203919874642411,-0.0164474356673299,0.364857625696761,-0.33994516906608, + -0.000211175181172085,-0.0159091455710758,0.380041887247528,-0.357975013218505, + -0.000218430487701093,-0.0153708554748202,0.395226148798296,-0.376004857370931, + -0.000225685794230324,-0.014832565378565,0.410410410349064,-0.394034701523357, + -0.000232941100759554,-0.0142942752823099,0.425594671899831,-0.412064545675782, + -0.000240196407289339,-0.0137559851860558,0.440778933450598,-0.430094389828207, + -0.00024745171381868,-0.0132176950898006,0.455963195001366,-0.448124233980633, + -0.000254707020347911,-0.0126794049935457,0.471147456552134,-0.466154078133058, + -0.000261962326877141,-0.012141114897291,0.486331718102901,-0.484183922285484, + -0.000269217633406926,-0.0116028248010362,0.501515979653669,-0.502213766437909, + -0.000276472939935712,-0.0110645347047806,0.516700241204437,-0.520243610590335, + -0.000283728246464388,-0.0105262446085255,0.531884502755204,-0.53827345474276, + -0.000290983552994617,-0.00998795451227119,0.547068764305972,-0.556303298895186, + -0.000298238859523958,-0.00944966441601647,0.562253025856739,-0.574333143047611, + -0.000305494166053522,-0.0089113743197613,0.577437287407507,-0.592362987200037, + -0.00031274947258253,-0.00837308422350613,0.592621548958274,-0.610392831352463, + -0.00011210914715587,-0.0164124571966151,0.217886694365635,-0.189288791136236, + -0.00011712027451094,-0.015846179191027,0.23161477766408,-0.208468821589921, + -0.000122131401865733,-0.0152799011854385,0.245342860962524,-0.227648852043607, + -0.00012714252922047,-0.0147136231798504,0.259070944260969,-0.246828882497292, + -0.000132153656575318,-0.014147345174262,0.272799027559414,-0.266008912950978, + -0.000137164783930332,-0.0135810671686738,0.286527110857858,-0.285188943404664, + -0.000142175911284903,-0.013014789163085,0.300255194156304,-0.304368973858349, + -0.000147187038639973,-0.0124485111574972,0.313983277454748,-0.323549004312035, + -0.000152198165994766,-0.0118822331519086,0.327711360753193,-0.34272903476572, + -0.000157209293349836,-0.0113159551463204,0.341439444051638,-0.361909065219406, + -0.000162220420704684,-0.0107496771407323,0.355167527350082,-0.381089095673092, + -0.00016723154805931,-0.0101833991351439,0.368895610648527,-0.400269126126777, + -0.00017224267541438,-0.00961712112955571,0.382623693946972,-0.419449156580463, + -0.000177253802769117,-0.00905084312396709,0.396351777245417,-0.438629187034149, + -0.000182264930123632,-0.00848456511837847,0.410079860543861,-0.457809217487834, + -0.000187276057478813,-0.00791828711279052,0.423807943842306,-0.47698924794152, + -0.000192287184833773,-0.00735200910720213,0.437536027140751,-0.496169278395205, + -0.000197298312188177,-0.00678573110161351,0.451264110439196,-0.515349308848891, + -0.00020230943954247,-0.00621945309602445,0.464992193737641,-0.534529339302576, + -0.000207320566897984,-0.00565317509043695,0.478720277036085,-0.553709369756262, + -0.000212331694252832,-0.00508689708484855,0.49244836033453,-0.572889400209948, + -0.000217342821607569,-0.0045206190792606,0.506176443632974,-0.592069430663633, + -0.000222353948962306,-0.00395434107367221,0.519904526931419,-0.611249461117319, + -0.000227365076318042,-0.0033880630680847,0.533632610229864,-0.630429491571005, + -0.000232376203672779,-0.00282178506249631,0.547360693528309,-0.64960952202469, + -8.8252642437836e-05,-0.0127305715463246,0.208199928740099,-0.199191115234022, + -9.15396858167106e-05,-0.0121922018181925,0.220597832748001,-0.219351967449199, + -9.48267291958627e-05,-0.011653832090061,0.232995736755904,-0.239512819664375, + -9.81137725746262e-05,-0.0111154623619287,0.245393640763806,-0.259673671879552, + -0.000101400815953945,-0.0105770926337971,0.257791544771709,-0.279834524094729, + -0.000104687859332653,-0.0100387229056651,0.270189448779611,-0.299995376309906, + -0.000107974902712138,-0.0095003531775335,0.282587352787513,-0.320156228525083, + -0.000111261946091012,-0.00896198344940147,0.294985256795416,-0.34031708074026, + -0.000114548989470165,-0.00842361372126987,0.307383160803318,-0.360477932955437, + -0.000117836032848762,-0.00788524399313695,0.319781064811221,-0.380638785170614, + -0.000121123076227914,-0.00734687426500558,0.332178968819123,-0.40079963738579, + -0.000124410119606955,-0.00680850453687354,0.344576872827026,-0.420960489600967, + -0.000127697162985885,-0.00627013480874172,0.356974776834928,-0.441121341816144, + -0.000130984206365037,-0.00573176508061013,0.369372680842831,-0.461282194031321, + -0.000134271249743745,-0.00519339535247787,0.381770584850733,-0.481443046246498, + -0.000137558293123008,-0.00465502562434605,0.394168488858636,-0.501603898461675, + -0.000140845336501494,-0.00411665589621357,0.406566392866538,-0.521764750676852, + -0.00014413237988109,-0.0035782861680822,0.418964296874441,-0.541925602892029, + -0.00014741942326002,-0.00303991643995083,0.431362200882343,-0.562086455107206, + -0.000150706466638728,-0.00250154671181813,0.443760104890246,-0.582247307322383, + -0.00015399351001788,-0.00196317698368631,0.456158008898148,-0.602408159537559, + -0.000157280553397143,-0.00142480725555494,0.46855591290605,-0.622569011752737, + -0.00016056759677574,-0.000886437527422235,0.480953816913953,-0.642729863967913, + -0.000163854640155225,-0.000348067799290863,0.493351720921855,-0.66289071618309, + -0.000167141683534044,0.000190301928840952,0.505749624929758,-0.683051568398267, + -6.7900446304836e-05,-0.0100484153455295,0.199649903255621,-0.207305209546609, + -6.99593405395493e-05,-0.00956890453904014,0.210897166783117,-0.228269759984343, + -7.2018234773874e-05,-0.00908939373255058,0.222144430310613,-0.249234310422078, + -7.40771290089204e-05,-0.00860988292606191,0.233391693838108,-0.270198860859812, + -7.61360232434671e-05,-0.00813037211957224,0.244638957365605,-0.291163411297547, + -7.81949174783469e-05,-0.00765086131308301,0.255886220893101,-0.312127961735281, + -8.02538117129492e-05,-0.00717135050659357,0.267133484420597,-0.333092512173015, + -8.23127059474404e-05,-0.00669183970010412,0.278380747948092,-0.35405706261075, + -8.43716001817096e-05,-0.00621232889361445,0.289628011475588,-0.375021613048484, + -8.64304944167005e-05,-0.00573281808712567,0.300875275003084,-0.395986163486218, + -8.84893886513582e-05,-0.00525330728063622,0.31212253853058,-0.416950713923953, + -9.05482828864601e-05,-0.00477379647414766,0.323369802058076,-0.437915264361687, + -9.26071771205628e-05,-0.00429428566765755,0.334617065585572,-0.458879814799422, + -9.46660713553316e-05,-0.00381477486116788,0.345864329113068,-0.479844365237156, + -9.67249655898783e-05,-0.0033352640546791,0.357111592640563,-0.50080891567489, + -9.87838598248691e-05,-0.00285575324818965,0.36835885616806,-0.521773466112624, + -0.000100842754058972,-0.00237624244169976,0.379606119695556,-0.542738016550359, + -0.000102901648293519,-0.00189673163521054,0.390853383223051,-0.563702566988093, + -0.000104960542528953,-0.00141722082872198,0.402100646750547,-0.584667117425828, + -0.000107019436762945,-0.000937710022232086,0.413347910278043,-0.605631667863562, + -0.000109078330997492,-0.000458199215742638,0.424595173805539,-0.626596218301297, + -0.000111137225232816,2.13115907459205e-05,0.435842437333035,-0.647560768739031, + -0.000113196119467585,0.000500822397234923,0.447089700860531,-0.668525319176765, + -0.000115255013701243,0.000980333203725703,0.458336964388027,-0.6894898696145, + -0.000117313907936345,0.00145984401021426,0.469584227915522,-0.710454420052234, + -5.12825533630079e-05,-0.00813890729406974,0.192477680464014,-0.213739503442444, + -5.25229836055852e-05,-0.00772934970987138,0.202773660265388,-0.235341368455074, + -5.376341384844e-05,-0.00731979212567313,0.213069640066761,-0.256943233467705, + -5.50038440911838e-05,-0.00691023454147488,0.223365619868134,-0.278545098480336, + -5.6244274333872e-05,-0.00650067695727663,0.233661599669507,-0.300146963492966, + -5.74847045764493e-05,-0.00609111937307794,0.243957579470881,-0.321748828505597, + -5.87251348191931e-05,-0.00568156178887969,0.254253559272254,-0.343350693518228, + -5.99655650618258e-05,-0.00527200420468121,0.264549539073627,-0.364952558530858, + -6.12059953043476e-05,-0.00486244662048252,0.274845518875001,-0.386554423543489, + -6.24464255468693e-05,-0.00445288903628427,0.285141498676374,-0.408156288556119, + -6.36868557896131e-05,-0.0040433314520858,0.295437478477747,-0.42975815356875, + -6.49272860324679e-05,-0.00363377386788799,0.30573345827912,-0.451360018581381, + -6.61677162752117e-05,-0.00322421628368952,0.316029438080493,-0.472961883594011, + -6.74081465179555e-05,-0.00281465869949105,0.326325417881867,-0.494563748606642, + -6.86485767604772e-05,-0.00240510111529213,0.33662139768324,-0.516165613619272, + -6.98890070028879e-05,-0.00199554353109388,0.346917377484613,-0.537767478631903, + -7.11294372457427e-05,-0.00158598594689519,0.357213357285987,-0.559369343644534, + -7.23698674884865e-05,-0.00117642836269694,0.36750933708736,-0.580971208657164, + -7.36102977311193e-05,-0.000766870778498685,0.377805316888733,-0.602573073669795, + -7.48507279738631e-05,-0.000357313194300879,0.388101296690106,-0.624174938682426, + -7.60911582162738e-05,5.22443898982594e-05,0.39839727649148,-0.645776803695056, + -7.73315884589065e-05,0.000461801974096954,0.408693256292853,-0.667378668707687, + -7.85720187022054e-05,0.00087135955829476,0.418989236094226,-0.688980533720317, + -7.98124489443941e-05,0.00128091714249345,0.4292852158956,-0.710582398732948, + -8.10528791872489e-05,0.00169047472669126,0.439581195696972,-0.732184263745579, + -3.81757486992429e-05,-0.00679672951586896,0.186699188153392,-0.218710345952779, + -3.89005039367896e-05,-0.00645542283383593,0.196236719270698,-0.240804571189024, + -3.96252591742252e-05,-0.0061141161518028,0.205774250388003,-0.262898796425268, + -4.03500144119939e-05,-0.00577280946977021,0.215311781505308,-0.284993021661513, + -4.10747696494851e-05,-0.00543150278773674,0.224849312622614,-0.307087246897757, + -4.17995248871428e-05,-0.00509019610570416,0.234386843739919,-0.329181472134002, + -4.25242801246339e-05,-0.00474888942367069,0.243924374857225,-0.351275697370246, + -4.32490353621806e-05,-0.00440758274163744,0.25346190597453,-0.373369922606491, + -4.39737906002824e-05,-0.0040662760596053,0.262999437091835,-0.395464147842735, + -4.46985458375515e-05,-0.00372496937757183,0.272536968209141,-0.41755837307898, + -4.54233010751537e-05,-0.00338366269553902,0.282074499326446,-0.439652598315224, + -4.61480563125338e-05,-0.00304235601350578,0.291612030443752,-0.461746823551469, + -4.68728115498029e-05,-0.00270104933147275,0.301149561561057,-0.483841048787713, + -4.75975667874051e-05,-0.0023597426494395,0.310687092678362,-0.505935274023958, + -4.83223220252293e-05,-0.0020184359674067,0.320224623795668,-0.528029499260202, + -4.90470772626095e-05,-0.00167712928537367,0.329762154912973,-0.550123724496447, + -4.97718325007668e-05,-0.00133582260334131,0.339299686030278,-0.572217949732691, + -5.04965877374808e-05,-0.000994515921306949,0.348837217147584,-0.594312174968936, + -5.1221342975305e-05,-0.000653209239274588,0.358374748264889,-0.61640640020518, + -5.19460982125741e-05,-0.000311902557240895,0.367912279382195,-0.638500625441425, + -5.26708534508424e-05,2.94041247910215e-05,0.3774498104995,-0.660594850677669, + -5.33956086882226e-05,0.00037071080682427,0.386987341616805,-0.682689075913913, + -5.41203639256027e-05,0.000712017488857075,0.39652487273411,-0.704783301150158, + -5.4845119163538e-05,0.00105332417089032,0.406062403851416,-0.726877526386403, + -5.5569874400363e-05,0.00139463085292402,0.415599934968721,-0.748971751622647, + -2.81086657295537e-05,-0.0058582927484967,0.182186600295054,-0.222473732939845, + -2.8522836899858e-05,-0.00557694440341794,0.191136273053259,-0.244940720349634, + -2.89370080704399e-05,-0.0052955960583394,0.200085945811464,-0.267407707759422, + -2.93511792405776e-05,-0.00501424771326042,0.209035618569669,-0.289874695169211, + -2.9765350411104e-05,-0.00473289936818189,0.217985291327874,-0.312341682578999, + -3.01795215812417e-05,-0.00445155102310313,0.226934964086079,-0.334808669988788, + -3.05936927514905e-05,-0.00417020267802437,0.235884636844284,-0.357275657398576, + -3.10078639221834e-05,-0.00388885433294606,0.244834309602489,-0.379742644808365, + -3.14220350923211e-05,-0.0036075059878673,0.253783982360694,-0.402209632218153, + -3.18362062626809e-05,-0.00332615764278854,0.262733655118899,-0.424676619627942, + -3.22503774327076e-05,-0.00304480929770956,0.271683327877104,-0.44714360703773, + -3.26645486031785e-05,-0.00276346095263058,0.280633000635309,-0.469610594447519, + -3.30787197734272e-05,-0.00248211260755182,0.289582673393514,-0.492077581857307, + -3.3492890943676e-05,-0.00220076426247307,0.298532346151719,-0.514544569267096, + -3.39070621141468e-05,-0.00191941591739475,0.307482018909924,-0.537011556676884, + -3.43212332846177e-05,-0.00163806757231622,0.316431691668129,-0.559478544086673, + -3.47354044548664e-05,-0.00135671922723724,0.325381364426334,-0.581945531496461, + -3.51495756250042e-05,-0.00107537088215803,0.334331037184539,-0.60441251890625, + -3.55637467959191e-05,-0.000794022537080608,0.343280709942744,-0.626879506316038, + -3.59779179657238e-05,-0.000512674192000961,0.352230382700949,-0.649346493725826, + -3.63920891357505e-05,-0.000231325846921759,0.361180055459154,-0.671813481135615, + -3.68062603063324e-05,5.00224981561104e-05,0.370129728217358,-0.694280468545403, + -3.72204314766922e-05,0.000331370843234868,0.379079400975564,-0.716747455955192, + -3.76346026468299e-05,0.00061271918831407,0.388029073733769,-0.73921444336498, + -3.80487738168567e-05,0.000894067533393272,0.396978746491974,-0.761681430774769, + -2.05280434074639e-05,-0.00520245193650515,0.178744939275501,-0.225279580287028, + -2.07614683601087e-05,-0.00497047325737787,0.187248675554571,-0.248024485901711, + -2.09948933129755e-05,-0.00473849457825071,0.195752411833641,-0.270769391516394, + -2.12283182656203e-05,-0.00450651589912354,0.204256148112712,-0.293514297131077, + -2.14617432184316e-05,-0.0042745372199966,0.212759884391782,-0.31625920274576, + -2.16951681712985e-05,-0.00404255854086966,0.221263620670852,-0.339004108360442, + -2.19285931237767e-05,-0.00381057986174205,0.229767356949922,-0.361749013975125, + -2.2162018076588e-05,-0.00357860118261533,0.238271093228992,-0.384493919589808, + -2.23954430293993e-05,-0.00334662250348772,0.246774829508063,-0.407238825204491, + -2.26288679820996e-05,-0.00311464382436077,0.255278565787133,-0.429983730819174, + -2.28622929349109e-05,-0.00288266514523383,0.263782302066203,-0.452728636433857, + -2.30957178875002e-05,-0.00265068646610644,0.272286038345273,-0.47547354204854, + -2.33291428398674e-05,-0.00241870778697839,0.280789774624344,-0.498218447663223, + -2.35625677929008e-05,-0.00218672910785234,0.289293510903413,-0.520963353277906, + -2.3795992745379e-05,-0.00195475042872451,0.297797247182484,-0.543708258892589, + -2.40294176978573e-05,-0.00172277174959712,0.306300983461554,-0.566453164507271, + -2.42628426507796e-05,-0.00149079307047062,0.314804719740624,-0.589198070121954, + -2.44962676037019e-05,-0.00125881439134323,0.323308456019695,-0.611942975736637, + -2.47296925564022e-05,-0.00102683571221629,0.331812192298765,-0.63468788135132, + -2.49631175094356e-05,-0.000794857033089347,0.340315928577835,-0.657432786966003, + -2.51965424620249e-05,-0.00056287835396196,0.348819664856905,-0.680177692580686, + -2.54299674149472e-05,-0.000330899674835461,0.357323401135975,-0.702922598195369, + -2.56633923676475e-05,-9.89209957080739e-05,0.365827137415045,-0.725667503810052, + -2.58968173197927e-05,0.000133057683419757,0.374330873694116,-0.748412409424735, + -2.61302422731591e-05,0.000365036362546256,0.382834609973186,-0.771157315039417, + -1.49022873956461e-05,-0.0047431163486723,0.176165965720026,-0.227347679160473, + -1.50330628788109e-05,-0.00455008684554492,0.184336833146563,-0.250297429250045, + -1.51638383614205e-05,-0.00435705734241676,0.192507700573101,-0.273247179339616, + -1.52946138442522e-05,-0.00416402783928871,0.200678567999639,-0.296196929429188, + -1.5425389327306e-05,-0.00397099833616132,0.208849435426176,-0.31914667951876, + -1.55561648103597e-05,-0.00377796883303372,0.217020302852714,-0.342096429608332, + -1.56869402929138e-05,-0.00358493932990545,0.225191170279251,-0.365046179697903, + -1.58177157763562e-05,-0.00339190982677851,0.233362037705789,-0.387995929787475, + -1.59484912586327e-05,-0.00319888032364979,0.241532905132327,-0.410945679877047, + -1.60792667412979e-05,-0.00300585082052174,0.249703772558864,-0.433895429966618, + -1.62100422251843e-05,-0.00281282131739524,0.257874639985401,-0.45684518005619, + -1.63408177078495e-05,-0.00261979181426719,0.266045507411939,-0.479794930145762, + -1.64715931906256e-05,-0.00242676231113936,0.274216374838476,-0.502744680235334, + -1.66023686732908e-05,-0.00223373280801109,0.282387242265014,-0.525694430324905, + -1.6733144156178e-05,-0.00204070330488326,0.290558109691552,-0.548644180414477, + -1.68639196392872e-05,-0.0018476738017561,0.298728977118089,-0.571593930504049, + -1.69946951216193e-05,-0.00165464429862716,0.306899844544627,-0.594543680593621, + -1.71254706046176e-05,-0.00146161479549933,0.315070711971165,-0.617493430683192, + -1.72562460880599e-05,-0.00126858529237239,0.323241579397702,-0.640443180772764, + -1.73870215702809e-05,-0.00107555578924323,0.331412446824241,-0.663392930862336, + -1.75177970536122e-05,-0.000882526286116736,0.339583314250777,-0.686342680951908, + -1.76485725363884e-05,-0.000689496782988908,0.347754181677315,-0.709292431041479, + -1.77793480189425e-05,-0.000496467279860635,0.355925049103853,-0.732242181131051, + -1.79101235027179e-05,-0.000303437776733695,0.36409591653039,-0.755191931220623, + -1.804089898505e-05,-0.000110408273605422,0.372266783956928,-0.778141681310195, + -1.07712484989642e-05,-0.00442036204083607,0.174258432220366,-0.228859164670614, + -1.08446213992752e-05,-0.00425717645452517,0.182183774364055,-0.251958626874825, + -1.09179942997528e-05,-0.00409399086821471,0.190109116507744,-0.275058089079037, + -1.09913672003414e-05,-0.00393080528190426,0.198034458651433,-0.298157551283248, + -1.10647401009856e-05,-0.0037676196955938,0.205959800795122,-0.321257013487459, + -1.11381130011301e-05,-0.00360443410928268,0.213885142938811,-0.344356475691671, + -1.12114859012746e-05,-0.00344124852297201,0.2218104850825,-0.367455937895882, + -1.12848588020853e-05,-0.003278062936662,0.229735827226188,-0.390555400100093, + -1.13582317026184e-05,-0.00311487735035132,0.237661169369877,-0.413654862304304, + -1.14316046024854e-05,-0.00295169176403998,0.245586511513566,-0.436754324508516, + -1.15049775036846e-05,-0.00278850617773019,0.253511853657255,-0.459853786712727, + -1.15783504037736e-05,-0.00262532059141907,0.261437195800944,-0.482953248916938, + -1.16517233040847e-05,-0.00246213500510817,0.269362537944633,-0.506052711121149, + -1.17250962045068e-05,-0.00229894941879794,0.277287880088322,-0.529152173325361, + -1.1798469105373e-05,-0.0021357638324877,0.285213222232011,-0.552251635529572, + -1.1871842005462e-05,-0.00197257824617658,0.2931385643757,-0.575351097733783, + -1.19452149058841e-05,-0.00180939265986613,0.301063906519389,-0.598450559937995, + -1.20185878065282e-05,-0.00164620707355567,0.308989248663077,-0.621550022142206, + -1.20919607065062e-05,-0.00148302148724477,0.316914590806766,-0.644649484346417, + -1.21653336073724e-05,-0.00131983590093432,0.324839932950455,-0.667748946550628, + -1.22387065073504e-05,-0.00115665031462298,0.332765275094144,-0.690848408754839, + -1.23120794081055e-05,-0.000993464728312521,0.340690617237833,-0.713947870959051, + -1.23854523091937e-05,-0.000830279142002954,0.348615959381522,-0.737047333163262, + -1.24588252090607e-05,-0.000667093555691611,0.356541301525211,-0.760146795367474, + -1.25321981098159e-05,-0.000503907969381601,0.3644666436689,-0.783246257571685, + -7.76088377574258e-06,-0.00419280416168544,0.172860897402497,-0.2299570273921, + -7.80239348163736e-06,-0.00405202629696622,0.180606714051988,-0.253165232517441, + -7.84390318747663e-06,-0.00391124843224722,0.188352530701478,-0.276373437642782, + -7.88541289303835e-06,-0.00377047056752744,0.196098347350968,-0.299581642768123, + -7.92692259915517e-06,-0.00362969270280877,0.203844164000458,-0.322789847893463, + -7.96843230521649e-06,-0.00348891483808988,0.211589980649948,-0.345998053018804, + -8.00994201066718e-06,-0.00334813697337055,0.219335797299439,-0.369206258144145, + -8.05145171633992e-06,-0.003207359108651,0.227081613948929,-0.392414463269486, + -8.09296142190163e-06,-0.00306658124393122,0.23482743059842,-0.415622668394826, + -8.13447112790744e-06,-0.00292580337921278,0.242573247247909,-0.438830873520167, + -8.17598083402427e-06,-0.00278502551449344,0.2503190638974,-0.462039078645508, + -8.21749053914189e-06,-0.00264424764977411,0.25806488054689,-0.485247283770848, + -8.25900024570281e-06,-0.00250346978505567,0.26581069719638,-0.508455488896189, + -8.3005099511535e-06,-0.00236269192033589,0.273556513845871,-0.53166369402153, + -8.34201965627113e-06,-0.00222191405561545,0.281302330495361,-0.554871899146871, + -8.38352936261e-06,-0.00208113619089723,0.289048147144851,-0.578080104272211, + -8.42503906806069e-06,-0.00194035832617745,0.296793963794342,-0.601288309397552, + -8.46654877417752e-06,-0.001799580461459,0.304539780443832,-0.624496514522893, + -8.50805848051639e-06,-0.00165880259674056,0.312285597093322,-0.647704719648234, + -8.54956818596708e-06,-0.00151802473202078,0.320031413742812,-0.670912924773574, + -8.59107789119573e-06,-0.00137724686730101,0.327777230392303,-0.694121129898915, + -8.63258759720154e-06,-0.00123646900258167,0.335523047041793,-0.717329335024256, + -8.67409730309632e-06,-0.00109569113786279,0.343268863691283,-0.740537540149596, + -8.71560700843599e-06,-0.000954913273143454,0.351014680340773,-0.763745745274937, + -8.7571167149969e-06,-0.000814135408425454,0.358760496990263,-0.786953950400278, + -5.57919022814435e-06,-0.00403186925423415,0.171844067904429,-0.230750875751321, + -5.60301505503347e-06,-0.00390767760895838,0.179459449028108,-0.254037711280834, + -5.62683988203361e-06,-0.0037834859636825,0.187074830151787,-0.277324546810346, + -5.65066470875619e-06,-0.00365929431840595,0.194690211275466,-0.300611382339859, + -5.67448953586736e-06,-0.00353510267313029,0.202305592399145,-0.323898217869371, + -5.69831436292301e-06,-0.0034109110278544,0.209920973522825,-0.347185053398883, + -5.72213918964559e-06,-0.0032867193825783,0.217536354646504,-0.370471888928396, + -5.74596401631267e-06,-0.00316252773730175,0.225151735770183,-0.393758724457908, + -5.76978884359036e-06,-0.00303833609202631,0.232767116893862,-0.417045559987421, + -5.79361367047948e-06,-0.0029141444467502,0.240382498017542,-0.440332395516933, + -5.81743849725758e-06,-0.00278995280147409,0.247997879141221,-0.463619231046445, + -5.84126332459078e-06,-0.00266576115619843,0.2556132602649,-0.486906066575958, + -5.86508815114684e-06,-0.0025415695109221,0.263228641388579,-0.51019290210547, + -5.88891297859107e-06,-0.00241737786564689,0.270844022512258,-0.533479737634983, + -5.91273780492507e-06,-0.00229318622037011,0.278459403635938,-0.556766573164495, + -5.93656263170317e-06,-0.00216899457509379,0.286074784759617,-0.580053408694007, + -5.96038745881433e-06,-0.0020448029298179,0.293690165883296,-0.60334024422352, + -5.98421228614754e-06,-0.00192061128454268,0.301305547006975,-0.626627079753032, + -6.00803711248155e-06,-0.00179641963926569,0.308920928130655,-0.649913915282545, + -6.03186193992578e-06,-0.00167222799399047,0.316536309254334,-0.673200750812057, + -6.05568676670387e-06,-0.00154803634871437,0.324151690378013,-0.69648758634157, + -6.07951159348197e-06,-0.00142384470343737,0.331767071501693,-0.719774421871082, + -6.10333642070415e-06,-0.0012996530581626,0.339382452625371,-0.743061257400594, + -6.12716124748225e-06,-0.00117546141288649,0.34699783374905,-0.766348092930107, + -6.15098607414932e-06,-0.00105126976760994,0.35461321487273,-0.789634928459619, + -4.00427115482271e-06,-0.00391775816821938,0.171107928801608,-0.231323029683396, + -4.01821553702719e-06,-0.00380572057059281,0.178628976152715,-0.254666536861095, + -4.03215991912065e-06,-0.00369368297296635,0.186150023503821,-0.278010044038794, + -4.04610430149166e-06,-0.00358164537534011,0.193671070854928,-0.301353551216494, + -4.06004868425125e-06,-0.00346960777771432,0.201192118206035,-0.324697058394193, + -4.07399306651124e-06,-0.00335757018008764,0.208713165557141,-0.348040565571892, + -4.08793744866021e-06,-0.00324553258246119,0.216234212908248,-0.371384072749591, + -4.10188183114224e-06,-0.00313349498483539,0.223755260259354,-0.394727579927291, + -4.11582621306916e-06,-0.00302145738720827,0.231276307610461,-0.41807108710499, + -4.12977059560671e-06,-0.00290941978958226,0.238797354961568,-0.441414594282689, + -4.14371497814425e-06,-0.00279738219195647,0.246318402312674,-0.464758101460388, + -4.15765936045975e-06,-0.00268534459432979,0.253839449663781,-0.488101608638087, + -4.17160374266423e-06,-0.00257330699670355,0.261360497014888,-0.511445115815787, + -4.18554812486871e-06,-0.00246126939907687,0.268881544365994,-0.534788622993486, + -4.19949250674012e-06,-0.00234923180144975,0.276402591717102,-0.558132130171185, + -4.21343688927767e-06,-0.00223719420382396,0.283923639068208,-0.581475637348884, + -4.22738127181521e-06,-0.00212515660619772,0.291444686419315,-0.604819144526584, + -4.24132565413071e-06,-0.00201311900857171,0.298965733770421,-0.628162651704283, + -4.2552700358911e-06,-0.0019010814109448,0.306486781121528,-0.651506158881982, + -4.26921441831762e-06,-0.0017890438133179,0.314007828472635,-0.674849666059681, + -4.28315880063312e-06,-0.00167700621569233,0.321528875823741,-0.698193173237381, + -4.2971031828376e-06,-0.00156496861806543,0.329049923174848,-0.72153668041508, + -4.31104756548617e-06,-0.00145293102043942,0.336570970525955,-0.744880187592779, + -4.32499194802372e-06,-0.00134089342281341,0.344092017877061,-0.768223694770478, + -4.3389363297841e-06,-0.0012288558251865,0.351613065228168,-0.791567201948177, + -2.87057071801655e-06,-0.00383668148470795,0.170576916653393,-0.231734433685972, + -2.87892447570215e-06,-0.00373348668952855,0.178029965902923,-0.255118690287191, + -2.88727823333224e-06,-0.00363029189434916,0.185483015152453,-0.27850294688841, + -2.89563199079579e-06,-0.00352709709916943,0.192936064401983,-0.301887203489629, + -2.90398574842587e-06,-0.00342390230399015,0.200389113651512,-0.325271460090848, + -2.91233950572289e-06,-0.00332070750881019,0.207842162901043,-0.348655716692067, + -2.92069326313094e-06,-0.00321751271363047,0.215295212150573,-0.372039973293286, + -2.92904702076102e-06,-0.00311431791845096,0.222748261400103,-0.395424229894505, + -2.93740077805804e-06,-0.00301112312327101,0.230201310649633,-0.418808486495724, + -2.94575453607671e-06,-0.00290792832809217,0.237654359899163,-0.442192743096943, + -2.95410829320719e-06,-0.002804733532912,0.245107409148693,-0.465576999698162, + -2.96246205100381e-06,-0.00270153873773316,0.252560458398222,-0.488961256299381, + -2.97081580824532e-06,-0.00259834394255254,0.260013507647753,-0.5123455129006, + -2.97916956570887e-06,-0.00249514914737348,0.267466556897282,-0.535729769501819, + -2.98752332350549e-06,-0.00239195435219397,0.274919606146812,-0.559114026103038, + -2.99587708119109e-06,-0.00228875955701469,0.282372655396342,-0.582498282704257, + -3.00423083832158e-06,-0.00218556476183496,0.289825704645872,-0.605882539305476, + -3.01258459567411e-06,-0.00208236996665478,0.297278753895402,-0.629266795906695, + -3.02093835380379e-06,-0.00197917517147594,0.304731803144932,-0.652651052507914, + -3.02929211082326e-06,-0.00187598037629577,0.312184852394462,-0.676035309109133, + -3.03764586828681e-06,-0.00177278558111604,0.319637901643993,-0.699419565710352, + -3.04599962586138e-06,-0.00166959078593676,0.327090950893522,-0.722803822311571, + -3.05435338299187e-06,-0.00156639599075659,0.334544000143052,-0.74618807891279, + -3.06270714112156e-06,-0.00146320119557819,0.341997049392582,-0.769572335514009, + -3.07106089836306e-06,-0.00136000640039757,0.349450098642112,-0.792956592115228, + -2.05612452663928e-06,-0.0037789849183788,0.170194865165181,-0.232029752203881, + -2.0612574225809e-06,-0.00368219117200408,0.177599016650932,-0.255443260001695, + -2.06639031807843e-06,-0.00358539742562858,0.185003168136682,-0.27885676779951, + -2.07152321335391e-06,-0.00348860367925297,0.192407319622433,-0.302270275597324, + -2.07665610912899e-06,-0.00339180993287802,0.199811471108184,-0.325683783395139, + -2.08178900473754e-06,-0.00329501618650263,0.207215622593935,-0.349097291192953, + -2.08692190029058e-06,-0.00319822244012724,0.214619774079686,-0.372510798990768, + -2.09205479589913e-06,-0.00310142869375207,0.222023925565437,-0.395924306788582, + -2.09718769117462e-06,-0.00300463494737624,0.229428077051188,-0.419337814586397, + -2.1023205869497e-06,-0.00290784120100152,0.236832228536938,-0.442751322384211, + -2.1074534822807e-06,-0.00281104745462613,0.244236380022689,-0.466164830182026, + -2.1125863781668e-06,-0.00271425370825118,0.25164053150844,-0.48957833797984, + -2.11771927338678e-06,-0.00261745996187512,0.259044682994191,-0.512991845777655, + -2.12285216905084e-06,-0.00252066621549996,0.266448834479942,-0.536405353575469, + -2.1279850647149e-06,-0.00242387246912501,0.273852985965693,-0.559818861373284, + -2.13311796060101e-06,-0.00232707872275006,0.281257137451443,-0.583232369171098, + -2.13825085615404e-06,-0.0022302849763749,0.288661288937194,-0.606645876968913, + -2.14338375104095e-06,-0.00213349122999862,0.296065440422945,-0.630059384766727, + -2.14851664726012e-06,-0.00203669748362412,0.303469591908696,-0.653472892564542, + -2.1536495424801e-06,-0.00193990373724828,0.310873743394447,-0.676886400362356, + -2.15878243803314e-06,-0.00184310999087334,0.318277894880198,-0.700299908160171, + -2.16391533314209e-06,-0.00174631624449795,0.325682046365948,-0.723713415957986, + -2.16904822947228e-06,-0.001649522498123,0.333086197851699,-0.7471269237558, + -2.17418112413714e-06,-0.00155272875174672,0.34049034933745,-0.770540431553615, + -2.17931402035632e-06,-0.00145593500537178,0.347894500823201,-0.793953939351429, + -1.47187275956195e-06,-0.00373787746490029,0.1699204992793,-0.232241484069083, + -1.4751082436093e-06,-0.00364570050518198,0.177289548415884,-0.255675963834583, + -1.47834372749012e-06,-0.00355352354546423,0.184658597552467,-0.279110443600084, + -1.48157921137093e-06,-0.00346134658574559,0.192027646689052,-0.302544923365584, + -1.48481469558481e-06,-0.00336916962602807,0.199396695825635,-0.325979403131084, + -1.48805017990972e-06,-0.00327699266631076,0.206765744962219,-0.349413882896584, + -1.49128566345746e-06,-0.0031848157065919,0.214134794098803,-0.372848362662084, + -1.49452114761583e-06,-0.00309263874687393,0.221503843235387,-0.396282842427584, + -1.49775663160767e-06,-0.00300046178715641,0.228872892371971,-0.419717322193085, + -1.50099211559951e-06,-0.00290828482743799,0.236241941508555,-0.443151801958585, + -1.50422760014646e-06,-0.00281610786772113,0.243610990645138,-0.466586281724085, + -1.5074630836942e-06,-0.00272393090800227,0.250980039781722,-0.490020761489585, + -1.51069856757502e-06,-0.00263175394828452,0.258349088918306,-0.513455241255086, + -1.51393405167788e-06,-0.00253957698856633,0.26571813805489,-0.536889721020586, + -1.51716953578074e-06,-0.00244740002884858,0.273087187191474,-0.560324200786086, + -1.52040501966155e-06,-0.00235522306913016,0.280456236328058,-0.583758680551586, + -1.52364050398646e-06,-0.0022630461094133,0.287825285464641,-0.607193160317086, + -1.52687598808932e-06,-0.00217086914969489,0.295194334601225,-0.630627640082587, + -1.53011147241422e-06,-0.00207869218997736,0.302563383737809,-0.654062119848087, + -1.53334695596197e-06,-0.0019865152302585,0.309932432874393,-0.677496599613587, + -1.53658243962074e-06,-0.00189433827054053,0.317301482010977,-0.700931079379087, + -1.53981792416769e-06,-0.001802161310823,0.32467053114756,-0.724365559144588, + -1.54305340782646e-06,-0.00170998435110459,0.332039580284144,-0.747800038910088, + -1.5462888923734e-06,-0.00161780739138706,0.339408629420728,-0.771234518675588, + -1.54952437636524e-06,-0.00152563043166998,0.346777678557311,-0.794668998441088, + -0.000323545292728211,-0.143721951397625,0.262809707514684,-0.0183122212470148, + -0.000359716535790588,-0.149368024920156,0.286311810441876,-0.0204552043030264, + -0.000395887778852799,-0.155014098442687,0.309813913369068,-0.0225981873590377, + -0.000432059021915121,-0.160660171965218,0.33331601629626,-0.0247411704150492, + -0.000468230264977498,-0.166306245487748,0.356818119223452,-0.026884153471061, + -0.000504401508039765,-0.171952319010279,0.380320222150643,-0.029027136527072, + -0.000540572751101975,-0.17759839253281,0.403822325077835,-0.0311701195830837, + -0.000576743994164408,-0.183244466055341,0.427324428005027,-0.0333131026390954, + -0.000612915237226841,-0.188890539577872,0.450826530932219,-0.0354560856951064, + -0.00064908648028883,-0.194536613100402,0.474328633859411,-0.0375990687511183, + -0.000685257723351262,-0.200182686622933,0.497830736786603,-0.0397420518071297, + -0.000721428966413806,-0.205828760145464,0.521332839713795,-0.0418850348631413, + -0.000757600209475906,-0.211474833667994,0.544834942640986,-0.0440280179191523, + -0.000793771452538339,-0.217120907190525,0.568337045568179,-0.0461710009751648, + -0.000829942695600772,-0.222766980713056,0.591839148495371,-0.0483139840311763, + -0.000866113938662871,-0.228413054235587,0.615341251422563,-0.0504569670871878, + -0.000902285181725748,-0.234059127758118,0.638843354349756,-0.0525999501432002, + -0.000938456424787515,-0.239705201280648,0.662345457276945,-0.0547429331992102, + -0.000974627667850281,-0.24535127480318,0.685847560204138,-0.0568859162552222, + -0.00101079891091238,-0.25099734832571,0.70934966313133,-0.0590288993112338, + -0.0010469701539747,-0.256643421848241,0.73285176605852,-0.0611718823672436, + -0.00108314139703725,-0.262289495370772,0.756353868985712,-0.0633148654232551, + -0.00111931264009957,-0.267935568893303,0.779855971912905,-0.0654578484792677, + -0.00115548388316145,-0.273581642415833,0.803358074840098,-0.0676008315352801, + -0.00119165512622399,-0.279227715938364,0.82686017776729,-0.0697438145912916, + -0.000322833005258871,-0.133606204982444,0.267703994909201,-0.0290324854660902, + -0.00035771689080849,-0.138578795784722,0.291287261216504,-0.032190471351649, + -0.00039260077635811,-0.143551386587001,0.314870527523807,-0.0353484572372077, + -0.000427484661907618,-0.148523977389279,0.338453793831109,-0.0385064431227663, + -0.00046236854745707,-0.153496568191558,0.362037060138413,-0.0416644290083254, + -0.000497252433006634,-0.158469158993836,0.385620326445715,-0.0448224148938838, + -0.000532136318556031,-0.163441749796115,0.409203592753018,-0.0479804007794428, + -0.000567020204105595,-0.168414340598393,0.432786859060321,-0.0511383866650018, + -0.000601904089655325,-0.173386931400672,0.456370125367623,-0.05429637255056, + -0.000636787975204944,-0.17835952220295,0.479953391674926,-0.0574543584361193, + -0.000671671860754453,-0.183332113005229,0.503536657982228,-0.0606123443216776, + -0.00070655574630385,-0.188304703807507,0.527119924289532,-0.0637703302072369, + -0.00074143963185358,-0.193277294609786,0.550703190596833,-0.0669283160927949, + -0.000776323517403088,-0.198249885412064,0.574286456904138,-0.0700863019783549, + -0.000811207402952485,-0.203222476214342,0.59786972321144,-0.0732442878639134, + -0.000846091288501993,-0.208195067016621,0.621452989518743,-0.0764022737494724, + -0.000880975174051501,-0.213167657818899,0.645036255826046,-0.079560259635032, + -0.00091585905960101,-0.218140248621178,0.668619522133348,-0.0827182455205895, + -0.000950742945150629,-0.223112839423457,0.69220278844065,-0.0858762314061485, + -0.00098562683070047,-0.228085430225735,0.715786054747954,-0.0890342172917074, + -0.00102051071624976,-0.233058021028014,0.739369321055255,-0.092192203177265, + -0.00105539460179949,-0.238030611830292,0.762952587362556,-0.095350189062823, + -0.00109027848734866,-0.24300320263257,0.786535853669861,-0.0985081749483831, + -0.00112516237289828,-0.247975793434849,0.810119119977164,-0.101666160833942, + -0.0011600462584479,-0.252948384237127,0.833702386284467,-0.104824146719501, + -0.000319722084197338,-0.121234499692456,0.272498538517763,-0.0424019007092795, + -0.000352837493021008,-0.125407366617773,0.29605906878887,-0.0468257130729845, + -0.000385952901844566,-0.129580233543089,0.319619599059976,-0.0512495254366894, + -0.000419068310668347,-0.133753100468406,0.343180129331083,-0.0556733378003942, + -0.000452183719492016,-0.137925967393722,0.36674065960219,-0.0600971501640996, + -0.000485299128316019,-0.142098834319039,0.390301189873296,-0.0645209625278041, + -0.000518414537139578,-0.146271701244355,0.413861720144403,-0.0689447748915092, + -0.000551529945963414,-0.150444568169672,0.437422250415509,-0.0733685872552143, + -0.000584645354786972,-0.154617435094989,0.460982780686615,-0.0777923996189187, + -0.000617760763610642,-0.158790302020305,0.484543310957723,-0.0822162119826243, + -0.0006508761724342,-0.162963168945621,0.508103841228829,-0.086640024346329, + -0.000683991581257981,-0.167136035870938,0.531664371499935,-0.0910638367100341, + -0.000717106990081429,-0.171308902796254,0.555224901771041,-0.0954876490737386, + -0.00075022239890532,-0.175481769721571,0.578785432042149,-0.0999114614374448, + -0.000783337807729101,-0.179654636646887,0.602345962313255,-0.104335273801149, + -0.000816453216552993,-0.183827503572204,0.625906492584362,-0.108759086164855, + -0.000849568625376218,-0.18800037049752,0.64946702285547,-0.11318289852856, + -0.000882684034199888,-0.192173237422837,0.673027553126574,-0.117606710892264, + -0.000915799443024112,-0.196346104348154,0.696588083397681,-0.122030523255969, + -0.00094891485184756,-0.20051897127347,0.720148613668788,-0.126454335619675, + -0.000982030260671118,-0.204691838198787,0.743709143939893,-0.130878147983378, + -0.00101514566949512,-0.208864705124103,0.767269674210999,-0.135301960347083, + -0.00104826107831879,-0.21303757204942,0.790830204482107,-0.139725772710789, + -0.00108137648714246,-0.217210438974736,0.814390734753214,-0.144149585074494, + -0.00111449189596602,-0.221383305900053,0.83795126502432,-0.148573397438199, + -0.000312715712178169,-0.106800559708677,0.276342593792607,-0.0584958444777561, + -0.00034347305752791,-0.110076911119946,0.299693251877458,-0.0644434437677676, + -0.000374230402877984,-0.113353262531215,0.32304390996231,-0.0703910430577789, + -0.000404987748227947,-0.116629613942485,0.346394568047161,-0.0763386423477902, + -0.000435745093577744,-0.119905965353754,0.369745226132014,-0.0822862416378018, + -0.000466502438927874,-0.123182316765024,0.393095884216865,-0.0882338409278129, + -0.000497259784277837,-0.126458668176293,0.416446542301716,-0.0941814402178245, + -0.000528017129627689,-0.129735019587562,0.439797200386569,-0.100129039507836, + -0.000558774474977763,-0.133011370998832,0.46314785847142,-0.106076638797847, + -0.000589531820327727,-0.136287722410101,0.486498516556272,-0.112024238087859, + -0.000620289165677468,-0.139564073821371,0.509849174641123,-0.11797183737787, + -0.000651046511027209,-0.14284042523264,0.533199832725975,-0.123919436667881, + -0.000681803856377283,-0.146116776643909,0.556550490810826,-0.129867035957892, + -0.000712561201727246,-0.149393128055179,0.579901148895679,-0.135814635247905, + -0.000743318547077321,-0.152669479466448,0.60325180698053,-0.141762234537916, + -0.000774075892427284,-0.155945830877718,0.626602465065382,-0.147709833827928, + -0.000804833237777136,-0.159222182288987,0.649953123150235,-0.15365743311794, + -0.000835590583126988,-0.162498533700256,0.673303781235085,-0.15960503240795, + -0.000866347928477063,-0.165774885111526,0.696654439319937,-0.165552631697962, + -0.000897105273827248,-0.169051236522795,0.720005097404789,-0.171500230987974, + -0.000927862619176989,-0.172327587934065,0.743355755489639,-0.177447830277984, + -0.000958619964526952,-0.175603939345334,0.766706413574491,-0.183395429567995, + -0.000989377309876693,-0.178880290756603,0.790057071659344,-0.189343028858007, + -0.00102013465522666,-0.182156642167873,0.813407729744196,-0.195290628148019, + -0.00105089200057684,-0.185432993579142,0.836758387829047,-0.20123822743803, + -0.000300226167247397,-0.0909098300988948,0.278161344227518,-0.0770649790909155, + -0.000327972985308955,-0.0932514493842631,0.301022119671934,-0.0847707182727651, + -0.000355719803370458,-0.0955930686696315,0.32388289511635,-0.0924764574546145, + -0.000383466621432071,-0.0979346879549998,0.346743670560766,-0.100182196636464, + -0.000411213439493463,-0.100276307240368,0.369604446005182,-0.107887935818314, + -0.000438960257554688,-0.102617926525736,0.392465221449598,-0.115593675000163, + -0.000466707075616246,-0.104959545811104,0.415325996894014,-0.123299414182013, + -0.00049445389367786,-0.107301165096473,0.43818677233843,-0.131005153363862, + -0.000522200711739362,-0.109642784381841,0.461047547782846,-0.138710892545711, + -0.000549947529800865,-0.111984403667209,0.483908323227262,-0.146416631727561, + -0.000577694347862145,-0.114326022952577,0.506769098671678,-0.15412237090941, + -0.000605441165923981,-0.116667642237946,0.529629874116094,-0.16182811009126, + -0.00063318798398504,-0.119009261523314,0.552490649560509,-0.169533849273109, + -0.000660934802046986,-0.121350880808683,0.575351425004927,-0.17723958845496, + -0.000688681620108267,-0.123692500094051,0.598212200449342,-0.184945327636809, + -0.000716428438169769,-0.126034119379419,0.621072975893758,-0.192651066818658, + -0.00074417525623105,-0.128375738664787,0.643933751338175,-0.200356806000508, + -0.000771922074292553,-0.130717357950155,0.66679452678259,-0.208062545182357, + -0.000799668892354055,-0.133058977235524,0.689655302227006,-0.215768284364207, + -0.000827415710415669,-0.135400596520892,0.712516077671422,-0.223474023546056, + -0.000855162528476949,-0.13774221580626,0.735376853115837,-0.231179762727905, + -0.000882909346538674,-0.140083835091628,0.758237628560253,-0.238885501909754, + -0.000910656164600065,-0.142425454376997,0.781098404004669,-0.246591241091604, + -0.000938402982662234,-0.144767073662366,0.803959179449086,-0.254296980273454, + -0.000966149800723071,-0.147108692947734,0.826819954893502,-0.262002719455303, + -0.000281097607381264,-0.0745591789974794,0.27692713919708,-0.097469902305907, + -0.00030521667784883,-0.0760086017583467,0.298943520713897,-0.107107595250898, + -0.000329335748316006,-0.0774580245192134,0.320959902230715,-0.116745288195888, + -0.00035345481878335,-0.0789074472800804,0.342976283747533,-0.126382981140879, + -0.000377573889250749,-0.0803568700409474,0.36499266526435,-0.13602067408587, + -0.000401692959718258,-0.0818062928018146,0.387009046781168,-0.14565836703086, + -0.000425812030185435,-0.0832557155626814,0.409025428297985,-0.155296059975851, + -0.000449931100652945,-0.0847051383235486,0.431041809814803,-0.164933752920842, + -0.000474050171120233,-0.0861545610844154,0.45305819133162,-0.174571445865832, + -0.000498169241587521,-0.0876039838452825,0.475074572848438,-0.184209138810823, + -0.000522288312055252,-0.0890534066061497,0.497090954365255,-0.193846831755813, + -0.00054640738252254,-0.0905028293670165,0.519107335882073,-0.203484524700804, + -0.000570526452989717,-0.0919522521278837,0.54112371739889,-0.213122217645795, + -0.000594645523457338,-0.093401674888751,0.563140098915708,-0.222759910590786, + -0.000618764593924515,-0.0948510976496175,0.585156480432526,-0.232397603535776, + -0.000642883664392024,-0.0963005204104848,0.607172861949344,-0.242035296480767, + -0.000667002734859312,-0.0977499431713515,0.629189243466162,-0.251672989425758, + -0.000691121805326711,-0.0991993659322183,0.651205624982979,-0.261310682370748, + -0.00071524087579411,-0.100648788693086,0.673222006499796,-0.270948375315739, + -0.00073935994626162,-0.102098211453953,0.695238388016614,-0.28058606826073, + -0.000763479016728796,-0.10354763421482,0.717254769533431,-0.29022376120572, + -0.000787598087196195,-0.104997056975687,0.739271151050249,-0.29986145415071, + -0.000811717157663372,-0.106446479736553,0.761287532567066,-0.309499147095702, + -0.000835836228130993,-0.107895902497421,0.783303914083884,-0.319136840040692, + -0.000859955298598503,-0.109345325258288,0.805320295600701,-0.328774532985683, + -0.000255218721438244,-0.058936460766477,0.272042139066151,-0.118724503273827, + -0.000275265659824275,-0.0596188450044045,0.292838171279937,-0.130374598122583, + -0.000295312598210362,-0.0603012292423324,0.313634203493722,-0.14202469297134, + -0.000315359536596282,-0.06098361348026,0.334430235707507,-0.153674787820096, + -0.000335406474982314,-0.0616659977181875,0.355226267921293,-0.165324882668852, + -0.000355453413368567,-0.0623483819561157,0.376022300135077,-0.176974977517608, + -0.00037550035175421,-0.0630307661940428,0.396818332348863,-0.188625072366364, + -0.000395547290140352,-0.0637131504319706,0.417614364562648,-0.20027516721512, + -0.000415594228526661,-0.0643955346698986,0.438410396776433,-0.211925262063876, + -0.000435641166912637,-0.0650779189078261,0.459206428990219,-0.223575356912633, + -0.000455688105298613,-0.0657603031457537,0.480002461204004,-0.235225451761389, + -0.000475735043684589,-0.0664426873836814,0.500798493417789,-0.246875546610145, + -0.000495781982070564,-0.067125071621609,0.521594525631574,-0.258525641458901, + -0.000515828920456651,-0.0678074558595372,0.54239055784536,-0.270175736307657, + -0.000535875858842738,-0.0684898400974645,0.563186590059145,-0.281825831156413, + -0.000555922797228603,-0.0691722243353923,0.583982622272931,-0.29347592600517, + -0.000575969735614579,-0.0698546085733198,0.604778654486716,-0.305126020853926, + -0.000596016674000999,-0.070536992811248,0.625574686700501,-0.316776115702682, + -0.000616063612387197,-0.071219377049176,0.646370718914286,-0.328426210551438, + -0.000636110550773061,-0.0719017612871033,0.667166751128071,-0.340076305400194, + -0.000656157489158704,-0.0725841455250305,0.687962783341857,-0.35172640024895, + -0.000676204427545235,-0.0732665297629589,0.708758815555641,-0.363376495097706, + -0.000696251365931433,-0.0739489140008867,0.729554847769427,-0.375026589946463, + -0.000716298304316965,-0.0746312982388133,0.750350879983213,-0.386676684795219, + -0.00073634524270294,-0.0753136824767413,0.771146912196998,-0.398326779643975, + -0.000223871184812041,-0.045098615770738,0.263637109831037,-0.139665866113582, + -0.000239703543307102,-0.0451977038120701,0.282890682208818,-0.153298705240143, + -0.000255535901802328,-0.0452967918534022,0.302144254586599,-0.166931544366704, + -0.000271368260297389,-0.0453958798947341,0.32139782696438,-0.180564383493265, + -0.000287200618792449,-0.0454949679360661,0.340651399342161,-0.194197222619826, + -0.000303032977287565,-0.0455940559773984,0.359904971719942,-0.207830061746387, + -0.000318865335782681,-0.0456931440187305,0.379158544097723,-0.221462900872947, + -0.00033469769427763,-0.0457922320600626,0.398412116475504,-0.235095739999509, + -0.000350530052772524,-0.0458913201013942,0.417665688853285,-0.248728579126069, + -0.000366362411267862,-0.0459904081427265,0.436919261231066,-0.26236141825263, + -0.0003821947697632,-0.0460894961840586,0.456172833608847,-0.275994257379191, + -0.000398027128257872,-0.0461885842253902,0.475426405986628,-0.289627096505752, + -0.00041385948675321,-0.0462876722667225,0.494679978364409,-0.303259935632313, + -0.000429691845248215,-0.0463867603080546,0.51393355074219,-0.316892774758874, + -0.000445524203743441,-0.0464858483493866,0.533187123119971,-0.330525613885435, + -0.000461356562238779,-0.0465849363907187,0.552440695497753,-0.344158453011996, + -0.000477188920733451,-0.0466840244320506,0.571694267875534,-0.357791292138557, + -0.0004930212792289,-0.0467831124733831,0.590947840253314,-0.371424131265118, + -0.000508853637723683,-0.0468822005147147,0.610201412631095,-0.385056970391679, + -0.000524685996219132,-0.046981288556047,0.629454985008876,-0.39868980951824, + -0.000540518354714248,-0.0470803765973791,0.648708557386657,-0.4123226486448, + -0.000556350713209253,-0.0471794646387109,0.667962129764438,-0.425955487771361, + -0.000572183071704035,-0.047278552680043,0.687215702142219,-0.439588326897922, + -0.000588015430199706,-0.0473776407213751,0.706469274520001,-0.453221166024483, + -0.000603847788694822,-0.0474767287627076,0.725722846897781,-0.466854005151044, + -0.000189516698970216,-0.0336932637551542,0.252584505134946,-0.159197450637036, + -0.000201351568739128,-0.0334103525741689,0.270095208912561,-0.174679555150319, + -0.000213186438508317,-0.0331274413931841,0.287605912690177,-0.190161659663601, + -0.000225021308277285,-0.0328445302121992,0.305116616467792,-0.205643764176884, + -0.000236856178046307,-0.0325616190312144,0.322627320245407,-0.221125868690167, + -0.000248691047815663,-0.0322787078502296,0.340138024023023,-0.236607973203449, + -0.000260525917584797,-0.0319957966692448,0.357648727800638,-0.252090077716732, + -0.000272360787353931,-0.03171288548826,0.375159431578253,-0.267572182230014, + -0.000284195657123121,-0.031429974307275,0.392670135355869,-0.283054286743297, + -0.000296030526891866,-0.0311470631262898,0.410180839133484,-0.298536391256579, + -0.000307865396661389,-0.0308641519453052,0.4276915429111,-0.314018495769862, + -0.000319700266430356,-0.0305812407643204,0.445202246688715,-0.329500600283145, + -0.000331535136199657,-0.0302983295833357,0.46271295046633,-0.344982704796427, + -0.000343370005968735,-0.0300154184023507,0.480223654243946,-0.36046480930971, + -0.000355204875737702,-0.0297325072213659,0.497734358021561,-0.375946913822992, + -0.000367039745507225,-0.0294495960403816,0.515245061799176,-0.391429018336275, + -0.000378874615276081,-0.0291666848593959,0.532755765576792,-0.406911122849558, + -0.000390709485045049,-0.0288837736784111,0.550266469354407,-0.42239322736284, + -0.000402544354814127,-0.0286008624974263,0.567777173132023,-0.437875331876123, + -0.000414379224583983,-0.028317951316442,0.585287876909638,-0.453357436389405, + -0.000426214094353061,-0.0280350401354572,0.602798580687253,-0.468839540902688, + -0.000438048964121918,-0.0277521289544715,0.620309284464869,-0.48432164541597, + -0.000449883833890996,-0.0274692177734868,0.637819988242484,-0.499803749929253, + -0.000461718703660075,-0.027186306592502,0.6553306920201,-0.515285854442536, + -0.000473553573429264,-0.0269033954115176,0.672841395797715,-0.530767958955818, + -0.000155076897248696,-0.0248683996732791,0.240199290946024,-0.176504129057341, + -0.000163442452789819,-0.024382692674357,0.255920282762325,-0.193624843142897, + -0.000171808008330776,-0.0238969856754347,0.271641274578625,-0.210745557228453, + -0.000180173563872121,-0.0234112786765133,0.287362266394926,-0.227866271314008, + -0.000188539119413522,-0.0229255716775913,0.303083258211227,-0.244986985399564, + -0.00019690467495459,-0.0224398646786694,0.318804250027527,-0.262107699485119, + -0.000205270230495547,-0.0219541576797473,0.334525241843828,-0.279228413570675, + -0.000213635786036948,-0.0214684506808258,0.350246233660129,-0.296349127656231, + -0.000222001341578015,-0.0209827436819037,0.36596722547643,-0.313469841741786, + -0.000230366897118861,-0.0204970366829813,0.381688217292731,-0.330590555827342, + -0.000238732452659929,-0.0200113296840594,0.397409209109031,-0.347711269912898, + -0.000247098008201441,-0.0195256226851377,0.413130200925332,-0.364831983998454, + -0.00025546356374273,-0.0190399156862162,0.428851192741632,-0.381952698084009, + -0.00026382911928402,-0.0185542086872943,0.444572184557933,-0.399073412169565, + -0.000272194674825199,-0.0180685016883724,0.460293176374234,-0.416194126255121, + -0.000280560230366156,-0.0175827946894502,0.476014168190535,-0.433314840340677, + -0.000288925785907446,-0.0170970876905281,0.491735160006836,-0.450435554426232, + -0.000297291341448513,-0.0166113806916062,0.507456151823136,-0.467556268511788, + -0.00030565689698947,-0.0161256736926838,0.523177143639437,-0.484676982597343, + -0.000314022452530649,-0.0156399666937621,0.538898135455738,-0.501797696682899, + -0.000322388008072494,-0.0151542596948411,0.554619127272038,-0.518918410768454, + -0.000330753563613118,-0.0146685526959187,0.570340119088339,-0.53603912485401, + -0.000339119119154407,-0.0141828456969963,0.58606111090464,-0.553159838939566, + -0.000347484674695697,-0.0136971386980749,0.60178210272094,-0.570280553025122, + -0.000355850230236654,-0.013211431699153,0.617503094537241,-0.587401267110677, + -0.000123104875927371,-0.0183781797131825,0.227809902064159,-0.191156643533338, + -0.000128708047047621,-0.0178233055562346,0.241835420990147,-0.209664668915444, + -0.000134311218167482,-0.0172684313992865,0.255860939916135,-0.228172694297549, + -0.000139914389287454,-0.0167135572423387,0.269886458842123,-0.246680719679654, + -0.000145517560407482,-0.0161586830853908,0.283911977768111,-0.265188745061759, + -0.000151120731527343,-0.0156038089284429,0.297937496694099,-0.283696770443864, + -0.000156723902647593,-0.015048934771495,0.311963015620087,-0.30220479582597, + -0.000162327073767177,-0.0144940606145465,0.325988534546075,-0.320712821208075, + -0.000167930244887371,-0.0139391864575988,0.340014053472063,-0.33922084659018, + -0.000173533416007232,-0.0133843123006507,0.354039572398051,-0.357728871972285, + -0.000179136587127204,-0.0128294381437026,0.368065091324039,-0.37623689735439, + -0.000184739758247177,-0.012274563986755,0.382090610250026,-0.394744922736496, + -0.00019034292936726,-0.0117196898298071,0.396116129176014,-0.413252948118601, + -0.000195946100487454,-0.0111648156728592,0.410141648102002,-0.431760973500706, + -0.000201549271607426,-0.0106099415159115,0.42416716702799,-0.450268998882811, + -0.000207152442727065,-0.010055067358963,0.438192685953978,-0.468777024264916, + -0.000212755613846816,-0.00950019320201467,0.452218204879966,-0.487285049647022, + -0.000218358784967121,-0.00894531904506768,0.466243723805953,-0.505793075029127, + -0.000223961956085983,-0.0083904448881178,0.480269242731942,-0.524301100411232, + -0.000229565127207065,-0.00783557073117125,0.49429476165793,-0.542809125793337, + -0.00023516829832726,-0.00728069657422381,0.508320280583917,-0.561317151175442, + -0.000240771469446788,-0.00672582241727548,0.522345799509905,-0.579825176557547, + -0.000246374640567315,-0.00617094826032805,0.536371318435893,-0.598333201939653, + -0.000251977811686843,-0.00561607410337928,0.550396837361881,-0.616841227321758, + -0.000257580982807593,-0.00506119994643273,0.564422356287869,-0.635349252703863, + -9.5259225765143e-05,-0.0137772956582463,0.216428773426664,-0.20309124885627, + -9.8831983422254e-05,-0.0132370386761339,0.228951189487147,-0.222729251813998, + -0.000102404741079476,-0.0126967816940213,0.24147360554763,-0.242367254771726, + -0.000105977498736809,-0.0121565247119089,0.253996021608114,-0.262005257729454, + -0.000109550256394364,-0.0116162677297968,0.266518437668597,-0.281643260687182, + -0.000113123014051308,-0.0110760107476839,0.27904085372908,-0.301281263644909, + -0.000116695771708697,-0.0105357537655719,0.291563269789563,-0.320919266602637, + -0.000120268529365974,-0.00999549678345923,0.304085685850047,-0.340557269560365, + -0.000123841287023474,-0.00945523980134721,0.31660810191053,-0.360195272518093, + -0.000127414044680418,-0.00891498281923409,0.329130517971013,-0.379833275475821, + -0.000130986802338029,-0.00837472583712229,0.341652934031496,-0.399471278433549, + -0.000134559559995084,-0.0078344688550096,0.35417535009198,-0.419109281391277, + -0.000138132317652695,-0.0072942118728978,0.366697766152463,-0.438747284349005, + -0.000141705075309528,-0.00675395489078445,0.379220182212946,-0.458385287306732, + -0.000145277832966917,-0.00621369790867199,0.39174259827343,-0.47802329026446, + -0.000148850590624083,-0.00567344092655975,0.404265014333913,-0.497661293222188, + -0.00015242334828125,-0.00513318394444684,0.416787430394396,-0.517299296179916, + -0.000155996105938638,-0.00459292696233504,0.429309846454879,-0.536937299137644, + -0.000159568863596582,-0.00405266998022347,0.441832262515362,-0.556575302095372, + -0.000163141621253193,-0.00351241299811011,0.454354678575846,-0.5762133050531, + -0.000166714378910249,-0.00297215601599721,0.466877094636329,-0.595851308010827, + -0.000170287136567748,-0.00243189903388519,0.479399510696812,-0.615489310968555, + -0.000173859894224582,-0.00189164205177228,0.491921926757296,-0.635127313926283, + -0.000177432651882303,-0.0013513850696607,0.504444342817779,-0.654765316884011, + -0.000181005409539692,-0.000811128087548685,0.516966758878262,-0.674403319841739, + -7.22157827551806e-05,-0.0105906202215608,0.206629817519026,-0.212509482039568, + -7.43988167827836e-05,-0.0101075774870291,0.217888653401413,-0.23303921053083, + -7.6581850809887e-05,-0.00962453475249658,0.2291474892838,-0.253568939022092, + -7.8764884837601e-05,-0.00914149201796488,0.240406325166187,-0.274098667513354, + -8.0947918865093e-05,-0.00865844928343318,0.251665161048574,-0.294628396004616, + -8.31309528921964e-05,-0.00817540654890059,0.262923996930961,-0.315158124495878, + -8.53139869194663e-05,-0.00769236381436844,0.274182832813348,-0.33568785298714, + -8.74970209470138e-05,-0.00720932107983674,0.285441668695735,-0.356217581478402, + -8.96800549744503e-05,-0.00672627834530459,0.296700504578122,-0.376747309969664, + -9.18630890021088e-05,-0.00624323561077311,0.307959340460509,-0.397277038460926, + -9.40461230293232e-05,-0.00576019287624097,0.319218176342896,-0.417806766952188, + -9.62291570567597e-05,-0.00527715014170882,0.330477012225283,-0.43833649544345, + -9.84121910838631e-05,-0.00479410740717623,0.341735848107671,-0.458866223934713, + -0.000100595225111522,-0.00431106467264475,0.352994683990058,-0.479395952425975, + -0.000102778259138847,-0.00382802193811282,0.364253519872444,-0.499925680917237, + -0.000104961293166062,-0.00334497920358023,0.375512355754832,-0.520455409408499, + -0.000107144327193942,-0.0028619364690492,0.386771191637218,-0.540985137899761, + -0.000109327361220934,-0.00237889373451683,0.398030027519605,-0.561514866391023, + -0.000111510395248593,-0.00189585099998446,0.409288863401993,-0.582044594882285, + -0.000113693429276251,-0.00141280826545298,0.42054769928438,-0.602574323373547, + -0.000115876463303355,-0.000929765530920612,0.431806535166767,-0.623104051864809, + -0.000118059497331013,-0.000446722796389132,0.443065371049153,-0.643633780356071, + -0.000120242531358339,3.63199381432366e-05,0.454324206931541,-0.664163508847334, + -0.00012242556538522,0.000519362672675605,0.465583042813928,-0.684693237338596, + -0.000124608599413656,0.0010024054072062,0.476841878696314,-0.705222965829858, + -5.38861574215788e-05,-0.00840911598937211,0.198597059407067,-0.219758117421436, + -5.51742842593295e-05,-0.00799786761214571,0.208836897178451,-0.240974152264164, + -5.64624110964695e-05,-0.00758661923491832,0.219076734949836,-0.262190187106893, + -5.77505379337762e-05,-0.00717537085769093,0.229316572721221,-0.283406221949622, + -5.90386647713603e-05,-0.00676412248046443,0.239556410492605,-0.304622256792351, + -6.0326791608889e-05,-0.00635287410323748,0.24979624826399,-0.325838291635079, + -6.16149184463621e-05,-0.00594162572601076,0.260036086035374,-0.347054326477808, + -6.29030452834467e-05,-0.00553037734878292,0.270275923806759,-0.368270361320537, + -6.41911721213084e-05,-0.00511912897155664,0.280515761578144,-0.389486396163266, + -6.5479298958282e-05,-0.00470788059432903,0.290755599349528,-0.410702431005994, + -6.67674257960327e-05,-0.00429663221710275,0.300995437120912,-0.431918465848723, + -6.80555526336724e-05,-0.00388538383987558,0.311235274892298,-0.453134500691452, + -6.93436794707569e-05,-0.00347413546264841,0.321475112663682,-0.474350535534181, + -7.06318063086186e-05,-0.00306288708542168,0.331714950435066,-0.495566570376909, + -7.19199331457032e-05,-0.00265163870819451,0.341954788206451,-0.516782605219638, + -7.32080599835649e-05,-0.00224039033096757,0.352194625977836,-0.537998640062367, + -7.44961868213156e-05,-0.00182914195374129,0.36243446374922,-0.559214674905096, + -7.57843136581782e-05,-0.00141789357651323,0.372674301520605,-0.580430709747824, + -7.70724404960399e-05,-0.00100664519928673,0.38291413929199,-0.601646744590553, + -7.83605673330134e-05,-0.000595396822059335,0.393153977063374,-0.622862779433282, + -7.96486941704311e-05,-0.000184148444832388,0.403393814834759,-0.64407881427601, + -8.09368210075156e-05,0.000227099932395003,0.413633652606143,-0.665294849118739, + -8.22249478458215e-05,0.000638348309620618,0.423873490377528,-0.686510883961468, + -8.3513074682573e-05,0.0010495966868489,0.434113328148913,-0.707726918804197, + -8.48012015206567e-05,0.0014608450640754,0.444353165920297,-0.728942953646926, + -3.97336811269189e-05,-0.00692027245687898,0.192250117530069,-0.225230161146074, + -4.04737021136303e-05,-0.00657935348492511,0.201693916018145,-0.246964293281035, + -4.12137231006193e-05,-0.00623843451297157,0.211137714506222,-0.268698425415996, + -4.19537440876638e-05,-0.00589751554101814,0.220581512994299,-0.290432557550956, + -4.26937650747083e-05,-0.00555659656906449,0.230025311482376,-0.312166689685917, + -4.34337860619749e-05,-0.0052156775971115,0.239469109970452,-0.333900821820878, + -4.41738070489639e-05,-0.00487475862515763,0.248912908458529,-0.355634953955839, + -4.49138280361749e-05,-0.00453383965320442,0.258356706946606,-0.377369086090799, + -4.56538490228864e-05,-0.00419292068125054,0.267800505434683,-0.39910321822576, + -4.6393870010264e-05,-0.00385200170929734,0.277244303922759,-0.420837350360721, + -4.71338909971974e-05,-0.00351108273734368,0.286688102410836,-0.442571482495681, + -4.78739119839089e-05,-0.00317016376538959,0.296131900898913,-0.464305614630642, + -4.86139329715085e-05,-0.00282924479343682,0.30557569938699,-0.486039746765603, + -4.9353953958442e-05,-0.00248832582148339,0.315019497875066,-0.507773878900564, + -5.00939749458196e-05,-0.00214740684953063,0.324463296363143,-0.529508011035525, + -5.083399593242e-05,-0.00180648787757587,0.33390709485122,-0.551242143170485, + -5.15740169193535e-05,-0.00146556890562266,0.343350893339297,-0.572976275305446, + -5.2314037906509e-05,-0.00112464993366901,0.352794691827374,-0.594710407440407, + -5.30540588929984e-05,-0.000783730961714912,0.362238490315451,-0.616444539575367, + -5.37940798813752e-05,-0.000442811989763037,0.371682288803527,-0.638178671710328, + -5.45341008675315e-05,-0.000101893017808496,0.381126087291604,-0.659912803845289, + -5.5274121854465e-05,0.0002390259541456,0.390569885779681,-0.681646935980249, + -5.60141428422867e-05,0.000579944926097031,0.400013684267757,-0.70338106811521, + -5.67541638294422e-05,0.000920863898050683,0.409457482755833,-0.725115200250171, + -5.74941848158206e-05,0.00126178287000567,0.418901281243911,-0.746849332385132, + -2.90430991169432e-05,-0.0059015538369479,0.187370408683567,-0.229301071953837, + -2.94603848240982e-05,-0.00562201581875277,0.196207044092587,-0.251420641042988, + -2.98776705318082e-05,-0.00534247780055863,0.205043679501608,-0.273540210132138, + -3.02949562390187e-05,-0.00506293978236383,0.213880314910628,-0.295659779221289, + -3.07122419463401e-05,-0.00478340176416903,0.222716950319648,-0.31777934831044, + -3.11295276536061e-05,-0.004503863745974,0.231553585728669,-0.339898917399591, + -3.15468133611496e-05,-0.00422432572777987,0.240390221137689,-0.362018486488742, + -3.1964099068138e-05,-0.0039447877095844,0.24922685654671,-0.384138055577892, + -3.23813847760146e-05,-0.00366524969139026,0.25806349195573,-0.406257624667043, + -3.2798670482892e-05,-0.00338571167319524,0.26690012736475,-0.428377193756194, + -3.32159561907686e-05,-0.00310617365500132,0.275736762773771,-0.450496762845345, + -3.3633241897868e-05,-0.00282663563680607,0.284573398182791,-0.472616331934496, + -3.40505276055225e-05,-0.00254709761861216,0.293410033591811,-0.494735901023647, + -3.4467813312955e-05,-0.00226755960041758,0.302246669000831,-0.516855470112797, + -3.48850990199434e-05,-0.00198802158222211,0.311083304409852,-0.538975039201948, + -3.53023847272649e-05,-0.00170848356402775,0.319919939818872,-0.561094608291099, + -3.57196704350304e-05,-0.00142894554583339,0.328756575227893,-0.58321417738025, + -3.61369561417968e-05,-0.0011494075276377,0.337593210636913,-0.605333746469401, + -3.65542418493403e-05,-0.000869869509443788,0.346429846045933,-0.627453315558551, + -3.69715275567728e-05,-0.000590331491248985,0.355266481454954,-0.649572884647702, + -3.73888132637612e-05,-0.000310793473053295,0.364103116863975,-0.671692453736853, + -3.78060989716378e-05,-3.12554548602684e-05,0.372939752272994,-0.693812022826004, + -3.82233846790703e-05,0.000248282563334534,0.381776387682015,-0.715931591915155, + -3.86406703868358e-05,0.000527820581528449,0.390613023091035,-0.738051161004305, + -3.90579560939353e-05,0.000807358599723251,0.399449658500055,-0.760170730093456, + -2.1094599880922e-05,-0.00520062882525585,0.183693463991894,-0.232296782006268, + -2.13273514954038e-05,-0.00497121951867519,0.192075151284544,-0.254699987218334, + -2.15601031103851e-05,-0.0047418102120953,0.200456838577194,-0.2771031924304, + -2.17928547247559e-05,-0.00451240090551441,0.208838525869844,-0.299506397642466, + -2.20256063397928e-05,-0.00428299159893464,0.217220213162494,-0.321909602854531, + -2.2258357953886e-05,-0.00405358229235331,0.225601900455144,-0.344312808066597, + -2.24911095688118e-05,-0.00382417298577331,0.233983587747794,-0.366716013278662, + -2.27238611839597e-05,-0.00359476367919331,0.242365275040444,-0.389119218490728, + -2.29566127979419e-05,-0.00336535437261265,0.250746962333093,-0.411522423702794, + -2.31893644129233e-05,-0.00313594506603199,0.259128649625744,-0.43392562891486, + -2.34221160275716e-05,-0.00290653575945155,0.267510336918394,-0.456328834126925, + -2.36548676416648e-05,-0.00267712645287066,0.275892024211044,-0.478732039338991, + -2.38876192572013e-05,-0.00244771714629133,0.284273711503693,-0.501135244551057, + -2.41203708717386e-05,-0.00221830783971066,0.292655398796343,-0.523538449763122, + -2.43531224862759e-05,-0.00198889853313,0.301037086088993,-0.545941654975188, + -2.45858741012572e-05,-0.00175948922654978,0.309418773381643,-0.568344860187253, + -2.48186257155725e-05,-0.00153007991996956,0.317800460674293,-0.590748065399319, + -2.50513773297767e-05,-0.00130067061338845,0.326182147966943,-0.613151270611385, + -2.52841289450911e-05,-0.00107126130680868,0.334563835259593,-0.635554475823451, + -2.55168805597394e-05,-0.000841852000228016,0.342945522552243,-0.657957681035516, + -2.57496321747208e-05,-0.000612442693648241,0.351327209844893,-0.680360886247582, + -2.5982383788703e-05,-0.000383033387066689,0.359708897137543,-0.702764091459648, + -2.62151354034623e-05,-0.00015362408048647,0.368090584430193,-0.725167296671713, + -2.64478870183327e-05,7.57852260933056e-05,0.376472271722843,-0.747570501883779, + -2.66806386326479e-05,0.000305194532674857,0.384853959015493,-0.769973707095844, + -1.52516158616334e-05,-0.00471515731396943,0.180963243355894,-0.234483634114199, + -1.53809743794753e-05,-0.00452500583453941,0.189008458957277,-0.257093892159291, + -1.55103328973172e-05,-0.00433485435510939,0.197053674558659,-0.279704150204383, + -1.56396914151591e-05,-0.00414470287567981,0.205098890160041,-0.302314408249476, + -1.5769049933001e-05,-0.00395455139624956,0.213144105761424,-0.324924666294568, + -1.5898408451176e-05,-0.00376439991681998,0.221189321362806,-0.34753492433966, + -1.60277669687958e-05,-0.00357424843738974,0.229234536964189,-0.370145182384752, + -1.61571254866377e-05,-0.00338409695795994,0.237279752565571,-0.392755440429844, + -1.62864840047572e-05,-0.00319394547853036,0.245324968166954,-0.415365698474936, + -1.64158425223215e-05,-0.00300379399909989,0.253370183768336,-0.437975956520028, + -1.654520104033e-05,-0.00281364251967009,0.261415399369719,-0.46058621456512, + -1.66745595583384e-05,-0.00262349104024029,0.269460614971101,-0.483196472610212, + -1.68039180765689e-05,-0.00243333956081093,0.277505830572484,-0.505806730655304, + -1.69332765936892e-05,-0.00224318808138002,0.285551046173866,-0.528416988700396, + -1.70626351118086e-05,-0.00205303660195066,0.293596261775249,-0.551027246745488, + -1.7191993629817e-05,-0.00186288512252064,0.301641477376631,-0.573637504790581, + -1.73213521474924e-05,-0.0016727336430904,0.309686692978014,-0.596247762835673, + -1.74507106655009e-05,-0.0014825821636606,0.317731908579396,-0.618858020880765, + -1.75800691829542e-05,-0.00129243068423035,0.325777124180779,-0.641468278925857, + -1.77094277005185e-05,-0.00110227920479966,0.333822339782162,-0.664078536970949, + -1.7838786218749e-05,-0.000912127725370304,0.341867555383544,-0.686688795016041, + -1.79681447374236e-05,-0.000721976245941391,0.349912770984926,-0.709299053061133, + -1.80975032540998e-05,-0.000531824766509814,0.357957986586309,-0.731909311106225, + -1.82268617722192e-05,-0.000341673287080013,0.366003202187692,-0.754519569151317, + -1.83562202904497e-05,-0.000151521807650656,0.374048417789074,-0.777129827196409, + -1.09910423647386e-05,-0.0043767277368314,0.178957515472806,-0.236070680673172, + -1.10631729136057e-05,-0.00421647787845592,0.186756241005505,-0.258831201502377, + -1.11353034624173e-05,-0.00405622802008065,0.194554966538204,-0.281591722331581, + -1.12074340113399e-05,-0.00389597816170517,0.202353692070903,-0.304352243160786, + -1.12795645599295e-05,-0.00373572830332969,0.210152417603602,-0.32711276398999, + -1.13516951090187e-05,-0.00357547844495465,0.217951143136301,-0.349873284819195, + -1.14238256578303e-05,-0.00341522858657917,0.225749868669001,-0.3726338056484, + -1.14959562066419e-05,-0.00325497872820368,0.2335485942017,-0.395394326477604, + -1.1568086755398e-05,-0.00309472886982842,0.241347319734399,-0.418154847306809, + -1.16402173040431e-05,-0.0029344790114525,0.249146045267098,-0.440915368136014, + -1.17123478530212e-05,-0.00277422915307768,0.256944770799797,-0.463675888965218, + -1.17844784019994e-05,-0.00261397929470242,0.264743496332496,-0.486436409794423, + -1.18566089507555e-05,-0.00245372943632693,0.272542221865195,-0.509196930623628, + -1.19287394994005e-05,-0.00229347957795123,0.280340947397894,-0.531957451452832, + -1.20008700482677e-05,-0.00213322971957597,0.288139672930593,-0.554717972282037, + -1.20730005969127e-05,-0.00197297986120004,0.295938398463293,-0.577478493111241, + -1.21451311455578e-05,-0.00181273000282456,0.303737123995992,-0.600239013940446, + -1.22172616944249e-05,-0.00165248014444908,0.311535849528691,-0.62299953476965, + -1.22893922435141e-05,-0.00149223028607448,0.31933457506139,-0.645760055598855, + -1.23615227921592e-05,-0.00133198042769855,0.327133300594089,-0.66852057642806, + -1.24336533406932e-05,-0.00117173056932307,0.334932026126788,-0.691281097257264, + -1.25057838896714e-05,-0.00101148071094759,0.342730751659487,-0.714041618086469, + -1.25779144382054e-05,-0.000851230852572105,0.350529477192186,-0.736802138915674, + -1.26500449874056e-05,-0.000690980994197066,0.358328202724886,-0.759562659744878, + -1.27221755361617e-05,-0.000530731135821583,0.366126928257585,-0.782323180574083, + -7.90215576385034e-06,-0.00413945281520123,0.177495362116764,-0.237217535088211, + -7.94276612925415e-06,-0.00400155104414346,0.185114758704036,-0.260086640972089, + -7.98337649526859e-06,-0.0038636492730868,0.192734155291306,-0.282955746855967, + -8.02398686083894e-06,-0.00372574750202936,0.200353551878578,-0.305824852739845, + -8.06459722652031e-06,-0.00358784573097193,0.207972948465849,-0.328693958623724, + -8.10520759236821e-06,-0.00344994395991471,0.21559234505312,-0.351563064507602, + -8.14581795838265e-06,-0.00331204218885817,0.22321174164039,-0.37443217039148, + -8.18642832367544e-06,-0.00317414041780029,0.230831138227662,-0.397301276275358, + -8.22703868941232e-06,-0.00303623864674285,0.238450534814933,-0.420170382159236, + -8.26764905503818e-06,-0.00289833687568564,0.246069931402204,-0.443039488043115, + -8.30825942088609e-06,-0.00276043510462864,0.253689327989475,-0.465908593926993, + -8.34886978640093e-06,-0.00262253333357076,0.261308724576746,-0.488777699810871, + -8.38948015213781e-06,-0.00248463156251333,0.268928121164018,-0.511646805694749, + -8.43009051776367e-06,-0.00234672979145634,0.276547517751288,-0.534515911578627, + -8.47070088338953e-06,-0.00220882802039912,0.284166914338559,-0.557385017462506, + -8.51131124912641e-06,-0.00207092624934213,0.29178631092583,-0.580254123346384, + -8.55192161508533e-06,-0.00193302447828492,0.299405707513102,-0.603123229230262, + -8.59253198048915e-06,-0.00179512270722748,0.307025104100373,-0.62599233511414, + -8.63314234644807e-06,-0.00165722093617049,0.314644500687643,-0.648861440998018, + -8.67375271185189e-06,-0.00151931916511261,0.322263897274915,-0.671730546881896, + -8.71436307736673e-06,-0.00138141739405517,0.329883293862186,-0.694599652765775, + -8.75497344310361e-06,-0.00124351562299818,0.337502690449457,-0.717468758649653, + -8.79558380861845e-06,-0.00110561385194075,0.345122087036728,-0.740337864533531, + -8.83619417468839e-06,-0.000967712080883754,0.352741483623999,-0.763206970417409, + -8.87680454009221e-06,-0.000829810309825874,0.360360880211271,-0.786076076301288, + -5.67187185163132e-06,-0.00397231155957245,0.176435385492517,-0.238043740567624, + -5.69509122033685e-06,-0.00385089488842016,0.183924964287591,-0.260991072219287, + -5.71831058870931e-06,-0.00372947821726743,0.191414543082666,-0.283938403870949, + -5.74152995813648e-06,-0.00360806154611626,0.19890412187774,-0.306885735522612, + -5.76474932639792e-06,-0.00348664487496331,0.206393700672815,-0.329833067174275, + -5.7879686953255e-06,-0.00336522820381124,0.213883279467889,-0.352780398825938, + -5.81118806392e-06,-0.00324381153265918,0.221372858262963,-0.375727730477601, + -5.83440743240349e-06,-0.00312239486150623,0.228862437058038,-0.398675062129264, + -5.8576268014976e-06,-0.00300097819035461,0.236352015853112,-0.421622393780926, + -5.88084617014761e-06,-0.00287956151920232,0.243841594648187,-0.444569725432589, + -5.90406553901968e-06,-0.00275814484805004,0.251331173443262,-0.467517057084252, + -5.92728490811378e-06,-0.00263672817689842,0.258820752238336,-0.490464388735915, + -5.95050427609767e-06,-0.00251531150574524,0.266310331033411,-0.513411720387578, + -5.97372364519178e-06,-0.00239389483459318,0.273799909828485,-0.53635905203924, + -5.99694301395282e-06,-0.00227247816344134,0.281289488623559,-0.559306383690903, + -6.02016238260283e-06,-0.00215106149228905,0.288779067418634,-0.582253715342566, + -6.04338175136387e-06,-0.00202964482113677,0.296268646213708,-0.605201046994229, + -6.06660112023594e-06,-0.00190822814998493,0.303758225008782,-0.628148378645892, + -6.08982048899698e-06,-0.00178681147883264,0.311247803803857,-0.651095710297555, + -6.11303985742495e-06,-0.00166539480768035,0.318737382598931,-0.674043041949217, + -6.1362592267411e-06,-0.00154397813652851,0.326226961394006,-0.69699037360088, + -6.15947859505805e-06,-0.00142256146537623,0.33371654018908,-0.719937705252543, + -6.18269796359705e-06,-0.00130114479422305,0.341206118984155,-0.742885036904206, + -6.20591733369036e-06,-0.00117972812307299,0.348695697779229,-0.765832368555869, + -6.22913670111913e-06,-0.00105831145191893,0.356185276574304,-0.788779700207532, + -4.06620205822827e-06,-0.00385413357897368,0.175670034072985,-0.238637626337883, + -4.07974980204395e-06,-0.00374476611156715,0.183065973785591,-0.261641187549277, + -4.09329754547105e-06,-0.00363539864416018,0.190461913498196,-0.284644748760671, + -4.10684528900918e-06,-0.00352603117675376,0.197857853210801,-0.307648309972065, + -4.12039303265832e-06,-0.00341666370934712,0.205253792923407,-0.330651871183459, + -4.13394077586338e-06,-0.00330729624194004,0.212649732636012,-0.353655432394853, + -4.14748851934599e-06,-0.00319792877453295,0.220045672348618,-0.376658993606247, + -4.16103626310615e-06,-0.00308856130712676,0.227441612061223,-0.399662554817641, + -4.17458400614468e-06,-0.00297919383971945,0.234837551773829,-0.422666116029035, + -4.1881317501824e-06,-0.00286982637231348,0.242233491486434,-0.445669677240429, + -4.20167949344297e-06,-0.00276045890490639,0.249629431199039,-0.468673238451823, + -4.21522723770273e-06,-0.00265109143750042,0.257025370911645,-0.491676799663217, + -4.22877498051921e-06,-0.00254172397009311,0.26442131062425,-0.514680360874611, + -4.24232272400182e-06,-0.00243235650268647,0.271817250336855,-0.537683922086005, + -4.25587046826159e-06,-0.00232298903528028,0.279213190049461,-0.560687483297399, + -4.26941821163318e-06,-0.00221362156787341,0.286609129762066,-0.583691044508793, + -4.28296595456068e-06,-0.00210425410046611,0.294005069474671,-0.606694605720187, + -4.29651369782125e-06,-0.0019948866330588,0.301401009187277,-0.629698166931581, + -4.31006144185897e-06,-0.00188551916565283,0.308796948899882,-0.652701728142975, + -4.32360918556363e-06,-0.00177615169824685,0.316192888612487,-0.675705289354369, + -4.3371569293793e-06,-0.00166678423083955,0.323588828325093,-0.698708850565763, + -4.35070467263987e-06,-0.00155741676343357,0.330984768037698,-0.721712411777157, + -4.36425241612248e-06,-0.00144804929602627,0.338380707750304,-0.744715972988551, + -4.37780015949407e-06,-0.00133868182861896,0.34577664746291,-0.767719534199945, + -4.39134790308771e-06,-0.00122931436121254,0.353172587175515,-0.790723095411339, + -2.91260403556537e-06,-0.00377033534021953,0.17511900170741,-0.239063836644894, + -2.92069931934202e-06,-0.00366971807965799,0.182447572705915,-0.262107751774695, + -2.92879460289663e-06,-0.00356910081909634,0.18977614370442,-0.285151666904496, + -2.93688988639573e-06,-0.00346848355853435,0.197104714702926,-0.308195582034297, + -2.94498516989483e-06,-0.00336786629797214,0.204433285701431,-0.331239497164098, + -2.95308045367149e-06,-0.00326724903741105,0.211761856699936,-0.3542834122939, + -2.96117573728161e-06,-0.00316663177684906,0.219090427698441,-0.377327327423701, + -2.96927102072519e-06,-0.00306601451628685,0.226418998696946,-0.400371242553502, + -2.97736630461287e-06,-0.00296539725572575,0.233747569695451,-0.423415157683303, + -2.98546158772339e-06,-0.0028647799951631,0.241076140693957,-0.446459072813104, + -2.99355687161107e-06,-0.002764162734602,0.248404711692461,-0.469502987942905, + -3.0016521552767e-06,-0.00266354547404024,0.255733282690966,-0.492546903072706, + -3.00974743894233e-06,-0.00256292821347825,0.263061853689472,-0.515590818202507, + -3.01784272271899e-06,-0.00246231095291671,0.270390424687977,-0.538634733332308, + -3.02593800616258e-06,-0.00236169369235539,0.277718995686481,-0.561678648462109, + -3.03403328971719e-06,-0.00226107643179319,0.285047566684987,-0.58472256359191, + -3.04212857338282e-06,-0.00216045917123164,0.292376137683492,-0.607766478721712, + -3.05022385715947e-06,-0.0020598419106701,0.299704708681997,-0.630810393851513, + -3.05831914093613e-06,-0.00195922465010812,0.307033279680502,-0.653854308981314, + -3.06641442393563e-06,-0.00185860738954569,0.314361850679007,-0.676898224111115, + -3.07450970771228e-06,-0.00175799012898503,0.321690421677512,-0.699942139240916, + -3.08260499148894e-06,-0.00165737286842305,0.329018992676017,-0.722986054370717, + -3.09070027570968e-06,-0.00155675560786195,0.336347563674522,-0.746029969500518, + -3.09879555826509e-06,-0.00145613834729907,0.343676134673027,-0.769073884630319, + -3.10689084259685e-06,-0.00135552108673798,0.351004705671532,-0.79211779976012, + -2.08501737136713e-06,-0.00371078691206617,0.174723090188211,-0.239369361772837, + -2.08998080425404e-06,-0.00361649511294615,0.182003282468652,-0.262442204255829, + -2.09494423708545e-06,-0.00352220331382602,0.189283474749094,-0.28551504673882, + -2.09990766980583e-06,-0.00342791151470556,0.196563667029536,-0.308587889221812, + -2.10487110263724e-06,-0.00333361971558599,0.203843859309977,-0.331660731704803, + -2.10983453541314e-06,-0.00323932791646553,0.211124051590418,-0.354733574187795, + -2.11479796846659e-06,-0.00314503611734618,0.218404243870859,-0.377806416670786, + -2.11976140118697e-06,-0.00305074431822572,0.225684436151301,-0.400879259153778, + -2.12472483385184e-06,-0.00295645251910526,0.232964628431743,-0.423952101636769, + -2.12968826696081e-06,-0.00286216071998546,0.240244820712184,-0.447024944119761, + -2.13465169940363e-06,-0.00276786892086522,0.247525012992626,-0.470097786602753, + -2.1396151325126e-06,-0.00267357712174543,0.254805205273067,-0.493170629085744, + -2.14457856528849e-06,-0.00257928532262519,0.262085397553509,-0.516243471568736, + -2.14954199795336e-06,-0.00248499352350517,0.26936558983395,-0.539316314051727, + -2.1545054309513e-06,-0.00239070172438494,0.276645782114392,-0.562389156534719, + -2.1594688637272e-06,-0.00229640992526559,0.283925974394833,-0.58546199901771, + -2.16443229639207e-06,-0.0022021181261449,0.291206166675275,-0.608534841500702, + -2.16939572916797e-06,-0.00210782632702466,0.298486358955716,-0.631607683983693, + -2.17435916261e-06,-0.00201353452790531,0.305766551236157,-0.654680526466685, + -2.1793225949418e-06,-0.00191924272878463,0.313046743516599,-0.677753368949676, + -2.18428602816179e-06,-0.00182495092966484,0.320326935797041,-0.700826211432668, + -2.18924946071564e-06,-0.0017306591305446,0.327607128077482,-0.723899053915659, + -2.19421289371358e-06,-0.00163636733142436,0.334887320357924,-0.746971896398651, + -2.19917632637845e-06,-0.00154207553230412,0.342167512638365,-0.770044738881642, + -2.20413975959843e-06,-0.00144778373318477,0.349447704918807,-0.793117581364634, + -1.49193246151702e-06,-0.00366840305462612,0.174439051280189,-0.239588194789053, + -1.49505556684693e-06,-0.00357866906832982,0.181684548038225,-0.262681756549678, + -1.49817867245439e-06,-0.00348893508203418,0.18893004479626,-0.285775318310302, + -1.50130177756225e-06,-0.00339920109573755,0.196175541554295,-0.308868880070927, + -1.50442488316971e-06,-0.00330946710944158,0.203421038312331,-0.331962441831552, + -1.50754798861064e-06,-0.00321973312314561,0.210666535070366,-0.355056003592177, + -1.51067109394054e-06,-0.00312999913684919,0.217912031828402,-0.378149565352802, + -1.513794199548e-06,-0.00304026515055322,0.225157528586437,-0.401243127113426, + -1.51691730487791e-06,-0.00295053116425725,0.232403025344472,-0.424336688874051, + -1.52004040987475e-06,-0.00286079717796039,0.239648522102508,-0.447430250634676, + -1.52316351553772e-06,-0.00277106319166465,0.246894018860543,-0.470523812395301, + -1.52628662097865e-06,-0.00268132920536845,0.254139515618579,-0.493617374155926, + -1.5294097265306e-06,-0.00259159521907226,0.261385012376614,-0.51671093591655, + -1.53253283152743e-06,-0.00250186123277563,0.26863050913465,-0.539804497677175, + -1.53565593741245e-06,-0.00241212724648032,0.275876005892685,-0.5628980594378, + -1.53877904252031e-06,-0.00232239326018324,0.283121502650721,-0.585991621198425, + -1.54190214762817e-06,-0.00223265927388683,0.290366999408756,-0.60908518295905, + -1.54502525373523e-06,-0.00214292528759197,0.297612496166791,-0.632178744719675, + -1.5481483593982e-06,-0.00205319130129578,0.304857992924827,-0.655272306480299, + -1.55127146395095e-06,-0.0019634573149987,0.312103489682862,-0.678365868240924, + -1.55439456961393e-06,-0.00187372332870339,0.319348986440897,-0.701459430001549, + -1.55751767483281e-06,-0.00178398934240587,0.326594483198934,-0.724552991762174, + -1.5606407806068e-06,-0.00169425535611012,0.333839979956969,-0.747646553522799, + -1.56376388549262e-06,-0.00160452136981393,0.341085476715004,-0.770740115283423, + -1.5668869907115e-06,-0.00151478738351685,0.34833097347304,-0.793833677044048, + -0.000146583299647174,-0.271218885405731,0.0808864238687777,0.145747218847474, + -0.000185387331537445,-0.286478911886419,0.0924894516929451,0.158574501684756, + -0.000224191363427551,-0.301738938367107,0.104092479517112,0.171401784522039, + -0.000262995395317656,-0.316998964847794,0.115695507341279,0.184229067359322, + -0.000301799427208038,-0.332258991328482,0.127298535165447,0.197056350196604, + -0.000340603459098199,-0.34751901780917,0.138901562989613,0.209883633033887, + -0.000379407490988304,-0.362779044289858,0.150504590813782,0.222710915871169, + -0.000418211522878353,-0.378039070770546,0.16210761863795,0.235538198708452, + -0.000457015554768625,-0.393299097251232,0.173710646462114,0.248365481545736, + -0.000495819586658786,-0.408559123731921,0.185313674286284,0.261192764383017, + -0.000534623618549057,-0.423819150212607,0.196916702110448,0.274020047220302, + -0.000573427650439107,-0.439079176693298,0.20851972993462,0.286847330057582, + -0.000612231682329156,-0.454339203173983,0.220122757758783,0.299674612894867, + -0.000651035714219317,-0.469599229654672,0.231725785582953,0.312501895732148, + -0.000689839746109477,-0.48485925613536,0.243328813407121,0.32532917856943, + -0.00072864377799986,-0.500119282616049,0.25493184123129,0.338156461406712, + -0.00076744780988991,-0.515379309096736,0.266534869055455,0.350983744243995, + -0.000806251841779959,-0.530639335577424,0.278137896879625,0.363811027081277, + -0.000845055873670231,-0.54589936205811,0.289740924703787,0.376638309918562, + -0.000883859905560502,-0.561159388538799,0.301343952527958,0.389465592755843, + -0.000922663937450663,-0.576419415019487,0.312946980352125,0.402292875593126, + -0.000961467969340934,-0.591679441500176,0.324550008176294,0.415120158430407, + -0.0010002720012311,-0.606939467980861,0.336153036000456,0.427947441267693, + -0.00103907603312114,-0.62219949446155,0.347756063824626,0.440774724104974, + -0.00107788006501119,-0.637459520942238,0.359359091648795,0.453602006942256, + -0.000209464172506113,-0.261658472207287,0.133817819798418,0.114148304246229, + -0.000249874389631366,-0.275727544859501,0.149145262602714,0.12411016579477, + -0.000290284606756397,-0.289796617511715,0.164472705407009,0.134072027343312, + -0.000330694823881594,-0.303865690163928,0.179800148211304,0.144033888891853, + -0.000371105041006847,-0.317934762816142,0.1951275910156,0.153995750440394, + -0.000411515258131878,-0.332003835468356,0.210455033819895,0.163957611988936, + -0.000451925475256965,-0.34607290812057,0.225782476624191,0.173919473537476, + -0.000492335692382273,-0.360141980772784,0.241109919428488,0.183881335086017, + -0.00053274590950747,-0.374211053424997,0.25643736223278,0.19384319663456, + -0.000573156126632557,-0.388280126077211,0.271764805037078,0.2038050581831, + -0.000613566343757754,-0.402349198729424,0.28709224784137,0.213766919731643, + -0.000653976560882841,-0.416418271381639,0.302419690645669,0.223728781280182, + -0.000694386778008038,-0.430487344033852,0.317747133449961,0.233690642828725, + -0.000734796995133347,-0.444556416686066,0.333074576254259,0.243652504377265, + -0.000775207212258322,-0.45862548933828,0.348402019058555,0.253614365925806, + -0.000815617429383741,-0.472694561990494,0.363729461862852,0.263576227474346, + -0.000856027646508606,-0.486763634642708,0.379056904667147,0.273538089022888, + -0.000896437863633803,-0.500832707294922,0.394384347471443,0.283499950571429, + -0.000936848080759112,-0.514901779947134,0.409711790275735,0.293461812119972, + -0.000977258297884309,-0.528970852599349,0.425039233080033,0.303423673668512, + -0.00101766851500917,-0.543039925251562,0.440366675884328,0.313385535217053, + -0.00105807873213459,-0.557108997903777,0.455694118688625,0.323347396765593, + -0.00109848894925979,-0.57117807055599,0.471021561492917,0.333309258314136, + -0.00113889916638488,-0.585247143208204,0.486349004297215,0.343271119862676, + -0.00117930938351007,-0.599316215860418,0.50167644710151,0.353232981411218, + -0.000265515191711585,-0.236985506141874,0.185195266788547,0.0776044839146968, + -0.000306381893174612,-0.248929044705287,0.20393791292456,0.0842525151601619, + -0.000347248594637306,-0.2608725832687,0.222680559060573,0.0909005464056268, + -0.000388115296100167,-0.272816121832113,0.241423205196585,0.0975485776510922, + -0.000428981997563194,-0.284759660395527,0.260165851332598,0.104196608896557, + -0.000469848699026054,-0.296703198958939,0.27890849746861,0.110844640142022, + -0.000510715400488915,-0.308646737522353,0.297651143604623,0.117492671387487, + -0.000551582101951942,-0.320590276085766,0.316393789740637,0.124140702632952, + -0.000592448803414802,-0.332533814649179,0.335136435876647,0.130788733878418, + -0.000633315504877774,-0.344477353212592,0.353879082012662,0.137436765123882, + -0.000674182206340634,-0.356420891776004,0.372621728148672,0.144084796369349, + -0.000715048907803606,-0.368364430339418,0.391364374284688,0.150732827614812, + -0.000755915609266355,-0.380307968902831,0.410107020420697,0.157380858860279, + -0.000796782310729105,-0.392251507466244,0.428849666556712,0.164028890105743, + -0.000837649012192299,-0.404195046029658,0.447592312692726,0.170676921351207, + -0.000878515713655159,-0.41613858459307,0.466334958828739,0.177324952596672, + -0.000919382415117798,-0.428082123156483,0.485077604964751,0.183972983842137, + -0.000960249116580769,-0.440025661719897,0.503820251100765,0.190621015087602, + -0.00100111581804385,-0.451969200283309,0.522562897236774,0.197269046333069, + -0.00104198251950682,-0.463912738846723,0.541305543372789,0.203917077578533, + -0.00108284922096968,-0.475856277410136,0.560048189508802,0.210565108823998, + -0.00112371592243232,-0.487799815973549,0.578790835644814,0.217213140069463, + -0.00116458262389507,-0.499743354536961,0.597533481780825,0.223861171314929, + -0.00120544932535838,-0.511686893100375,0.61627612791684,0.230509202560393, + -0.00124631602682101,-0.523630431663788,0.635018774052852,0.237157233805858, + -0.000306608637818284,-0.201449472070623,0.229584395024278,0.0373423139113528, + -0.000346281658001768,-0.210696435852848,0.250981984107072,0.0403393311737625, + -0.000385954678185307,-0.219943399635072,0.272379573189866,0.0433363484361724, + -0.000425627698368847,-0.229190363417296,0.29377716227266,0.0463333656985824, + -0.000465300718552331,-0.238437327199521,0.315174751355454,0.0493303829609921, + -0.000504973738735703,-0.247684290981745,0.336572340438247,0.0523274002234024, + -0.000544646758919298,-0.25693125476397,0.357969929521041,0.055324417485812, + -0.000584319779102782,-0.266178218546194,0.379367518603836,0.0583214347482216, + -0.000623992799286266,-0.275425182328419,0.400765107686628,0.0613184520106327, + -0.000663665819469861,-0.284672146110643,0.422162696769424,0.0643154692730413, + -0.000703338839653345,-0.293919109892868,0.443560285852215,0.0673124865354527, + -0.000743011859836828,-0.303166073675092,0.464957874935012,0.0703095037978607, + -0.000782684880020201,-0.312413037457316,0.486355464017804,0.0733065210602717, + -0.000822357900204018,-0.321660001239541,0.507753053100599,0.076303538322681, + -0.000862030920387169,-0.330906965021766,0.529150642183394,0.0793005555850902, + -0.000901703940570764,-0.34015392880399,0.550548231266187,0.0822975728475001, + -0.000941376960754359,-0.349400892586215,0.571945820348981,0.0852945901099099, + -0.000981049980938176,-0.35864785636844,0.593343409431776,0.0882916073723191, + -0.00102072300112155,-0.367894820150664,0.614740998514567,0.091288624634731, + -0.00106039602130481,-0.377141783932888,0.636138587597363,0.0942856418971395, + -0.00110006904148863,-0.386388747715113,0.657536176680156,0.0972826591595499, + -0.00113974206167167,-0.395635711497337,0.67893376576295,0.10027967642196, + -0.00117941508185537,-0.404882675279561,0.700331354845744,0.10327669368437, + -0.00121908810203908,-0.414129639061786,0.721728943928538,0.10627371094678, + -0.00125876112222223,-0.42337660284401,0.743126533011331,0.109270728209189, + -0.000326480061561718,-0.161175547115598,0.262275619882452,-0.00471439479227425, + -0.000363081683064648,-0.167624575368612,0.285206297846787,-0.00553112208326205, + -0.000399683304567522,-0.174073603621626,0.308136975811121,-0.00634784937424984, + -0.000436284926070452,-0.180522631874639,0.331067653775456,-0.0071645766652375, + -0.000472886547573326,-0.186971660127653,0.353998331739791,-0.00798130395622549, + -0.0005094881690762,-0.193420688380667,0.376929009704125,-0.00879803124721289, + -0.000546089790579241,-0.199869716633681,0.39985968766846,-0.00961475853820119, + -0.000582691412082004,-0.206318744886695,0.422790365632795,-0.0104314858291892, + -0.000619293033584767,-0.212767773139709,0.445721043597129,-0.011248213120176, + -0.000655894655087863,-0.219216801392723,0.468651721561465,-0.0120649404111648, + -0.000692496276590959,-0.225665829645737,0.491582399525798,-0.0128816677021519, + -0.0007290978980935,-0.232114857898751,0.514513077490135,-0.0136983949931409, + -0.000765699519596597,-0.238563886151765,0.537443755454468,-0.0145151222841275, + -0.00080230114109936,-0.245012914404779,0.560374433418803,-0.015331849575116, + -0.000838902762602234,-0.251461942657792,0.583305111383138,-0.016148576866104, + -0.00087550438410533,-0.257910970910807,0.606235789347473,-0.0169653041570921, + -0.000912106005607982,-0.26435999916382,0.629166467311808,-0.0177820314480802, + -0.0009487076271113,-0.270809027416835,0.652097145276143,-0.0185987587390683, + -0.00098530924861373,-0.277258055669848,0.675027823240476,-0.0194154860300546, + -0.00102191087011705,-0.283707083922862,0.697958501204813,-0.0202322133210438, + -0.0010585124916197,-0.290156112175876,0.720889179169146,-0.0210489406120308, + -0.00109511411312258,-0.29660514042889,0.743819857133482,-0.0218656679030194, + -0.00113171573462567,-0.303054168681904,0.766750535097815,-0.0226823951940058, + -0.00116831735612843,-0.309503196934918,0.789681213062151,-0.0234991224849944, + -0.00120491897763164,-0.315952225187932,0.812611891026486,-0.0243158497759829, + -0.000323103273302039,-0.12215307045556,0.280851438272442,-0.046269541276926, + -0.000354957525579735,-0.126120709649369,0.30405227637425,-0.0508545309559264, + -0.000386811777857266,-0.130088348843178,0.327253114476057,-0.0554395206349269, + -0.000418666030134962,-0.134055988036987,0.350453952577865,-0.0600245103139272, + -0.000450520282412714,-0.138023627230797,0.373654790679672,-0.0646094999929277, + -0.000482374534690244,-0.141991266424606,0.39685562878148,-0.0691944896719279, + -0.000514228786968052,-0.145958905618415,0.420056466883287,-0.0737794793509285, + -0.000546083039245415,-0.149926544812224,0.443257304985095,-0.0783644690299291, + -0.000577937291523334,-0.153894184006033,0.466458143086902,-0.0829494587089288, + -0.000609791543800808,-0.157861823199842,0.48965898118871,-0.0875344483879299, + -0.000641645796078283,-0.161829462393652,0.512859819290517,-0.0921194380669296, + -0.000673500048355979,-0.165797101587461,0.536060657392326,-0.0967044277459313, + -0.000705354300633787,-0.16976474078127,0.559261495494132,-0.10128941742493, + -0.000737208552911484,-0.173732379975079,0.58246233359594,-0.105874407103932, + -0.000769062805188958,-0.177700019168888,0.605663171697749,-0.110459396782933, + -0.000800917057466433,-0.181667658362697,0.628864009799556,-0.115044386461933, + -0.000832771309744351,-0.185635297556507,0.652064847901364,-0.119629376140933, + -0.000864625562021604,-0.189602936750315,0.675265686003171,-0.124214365819934, + -0.000896479814299411,-0.193570575944125,0.698466524104978,-0.128799355498933, + -0.000928334066577219,-0.197538215137934,0.721667362206786,-0.133384345177935, + -0.000960188318854804,-0.201505854331743,0.744868200308594,-0.137969334856935, + -0.000992042571132279,-0.205473493525552,0.768069038410402,-0.142554324535936, + -0.0010238968234102,-0.209441132719362,0.791269876512208,-0.147139314214935, + -0.00105575107568756,-0.213408771913171,0.814470714614016,-0.151724303893936, + -0.00108760532796537,-0.21737641110698,0.837671552715824,-0.156309293572937, + -0.000299425426667388,-0.0885790639556613,0.285877782085161,-0.0851334078088358, + -0.00032546758613089,-0.0906303354860626,0.308211697068309,-0.0932426119087632, + -0.000351509745594281,-0.092681607016464,0.330545612051456,-0.101351816008691, + -0.000377551905057893,-0.0947328785468653,0.352879527034604,-0.109461020108618, + -0.000403594064521506,-0.0967841500772668,0.375213442017752,-0.117570224208545, + -0.00042963622398523,-0.0988354216076682,0.397547357000899,-0.125679428308472, + -0.000455678383448621,-0.10088669313807,0.419881271984047,-0.1337886324084, + -0.000481720542912178,-0.102937964668471,0.442215186967195,-0.141897836508328, + -0.000507762702375958,-0.104989236198873,0.464549101950342,-0.150007040608254, + -0.000533804861839293,-0.107040507729274,0.48688301693349,-0.158116244708182, + -0.000559847021303073,-0.109091779259676,0.509216931916637,-0.166225448808109, + -0.000585889180766741,-0.111143050790077,0.531550846899785,-0.174334652908037, + -0.000611931340230298,-0.113194322320478,0.553884761882932,-0.182443857007964, + -0.000637973499693967,-0.11524559385088,0.57621867686608,-0.190553061107892, + -0.000664015659157635,-0.117296865381281,0.598552591849228,-0.198662265207819, + -0.000690057818620859,-0.119348136911682,0.620886506832376,-0.206771469307747, + -0.000716099978084306,-0.121399408442084,0.643220421815524,-0.214880673407674, + -0.000742142137547974,-0.123450679972485,0.665554336798672,-0.222989877507602, + -0.000768184297012087,-0.125501951502887,0.687888251781818,-0.231099081607528, + -0.0007942264564752,-0.127553223033288,0.710222166764966,-0.239208285707456, + -0.000820268615938868,-0.129604494563689,0.732556081748114,-0.247317489807383, + -0.000846310775402426,-0.131655766094091,0.754889996731262,-0.255426693907311, + -0.000872352934865983,-0.133707037624492,0.777223911714408,-0.263535898007237, + -0.000898395094329651,-0.135758309154894,0.799557826697556,-0.271645102107165, + -0.000924437253792987,-0.137809580685295,0.821891741680704,-0.279754306207093, + -0.000261985993152636,-0.0622658778388391,0.280334409439723,-0.119656171768983, + -0.000281965775723203,-0.0630193698510431,0.300990676594572,-0.130895934751895, + -0.000301945558293659,-0.0637728618632469,0.32164694374942,-0.142135697734808, + -0.000321925340864559,-0.0645263538754512,0.342303210904269,-0.15337546071772, + -0.000341905123435182,-0.0652798458876551,0.362959478059118,-0.164615223700632, + -0.000361884906005583,-0.0660333378998589,0.383615745213966,-0.175854986683544, + -0.000381864688576372,-0.0667868299120633,0.404272012368815,-0.187094749666457, + -0.000401844471146551,-0.0675403219242665,0.424928279523664,-0.198334512649369, + -0.000421824253717507,-0.068293813936471,0.445584546678512,-0.20957427563228, + -0.000441804036288018,-0.0690473059486747,0.466240813833361,-0.220814038615193, + -0.000461783818858752,-0.0698007979608792,0.486897080988209,-0.232053801598105, + -0.000481763601429486,-0.0705542899730831,0.507553348143058,-0.243293564581018, + -0.000501743384000219,-0.0713077819852874,0.528209615297906,-0.254533327563929, + -0.000521723166570731,-0.0720612739974911,0.548865882452755,-0.265773090546842, + -0.000541702949141243,-0.0728147660096949,0.569522149607604,-0.277012853529754, + -0.000561682731711866,-0.0735682580218988,0.590178416762453,-0.288252616512666, + -0.000581662514282377,-0.0743217500341029,0.610834683917301,-0.299492379495578, + -0.000601642296853,-0.075075242046307,0.63149095107215,-0.310732142478491, + -0.000621622079423401,-0.0758287340585109,0.652147218226998,-0.321971905461402, + -0.000641601861994023,-0.0765822260707145,0.672803485381847,-0.333211668444315, + -0.000661581644564868,-0.0773357180829186,0.693459752536695,-0.344451431427227, + -0.000681561427135602,-0.0780892100951227,0.714116019691544,-0.35569119441014, + -0.000701541209706114,-0.0788427021073268,0.734772286846392,-0.366930957393051, + -0.000721520992276736,-0.0795961941195311,0.755428554001241,-0.378170720375964, + -0.000741500774847581,-0.080349686131735,0.77608482115609,-0.389410483358876, + -0.000218368860962048,-0.0430705668063568,0.268246837935423,-0.148947894182783, + -0.000232778845944137,-0.0430577750698555,0.286810059265156,-0.162843859951379, + -0.000247188830926337,-0.0430449833333544,0.305373280594888,-0.176739825719975, + -0.000261598815908648,-0.0430321915968532,0.323936501924621,-0.190635791488571, + -0.00027600880089057,-0.0430193998603519,0.342499723254354,-0.204531757257167, + -0.000290418785872826,-0.0430066081238507,0.361062944584086,-0.218427723025763, + -0.000304828770855081,-0.0429938163873498,0.379626165913819,-0.232323688794359, + -0.000319238755837281,-0.0429810246508484,0.398189387243552,-0.246219654562955, + -0.000333648740819092,-0.0429682329143473,0.416752608573284,-0.26011562033155, + -0.000348058725801348,-0.0429554411778461,0.435315829903016,-0.274011586100147, + -0.000362468710783159,-0.0429426494413443,0.453879051232749,-0.287907551868742, + -0.000376878695765859,-0.0429298577048436,0.472442272562482,-0.301803517637339, + -0.000391288680747781,-0.0429170659683422,0.491005493892214,-0.315699483405934, + -0.000405698665729703,-0.0429042742318411,0.509568715221947,-0.32959544917453, + -0.000420108650711959,-0.0428914824953397,0.528131936551679,-0.343491414943126, + -0.000434518635694103,-0.0428786907588383,0.546695157881412,-0.357387380711723, + -0.000448928620676026,-0.0428658990223372,0.565258379211145,-0.371283346480319, + -0.000463338605658614,-0.0428531072858362,0.583821600540877,-0.385179312248915, + -0.000477748590640426,-0.0428403155493344,0.60238482187061,-0.39907527801751, + -0.000492158575623014,-0.0428275238128342,0.620948043200342,-0.412971243786106, + -0.000506568560605047,-0.0428147320763328,0.639511264530075,-0.426867209554702, + -0.000520978545587081,-0.0428019403398312,0.658074485859808,-0.440763175323298, + -0.000535388530568892,-0.0427891486033296,0.67663770718954,-0.454659141091894, + -0.000549798515550926,-0.042776356866828,0.695200928519273,-0.46855510686049, + -0.000564208500533514,-0.0427635651303278,0.713764149849005,-0.482451072629086, + -0.000174967021522532,-0.0297769214803709,0.253361158310299,-0.1728493494608, + -0.000184775542161619,-0.0293828081671382,0.269761054268607,-0.188912723181529, + -0.000194584062800762,-0.0289886948539053,0.286160950226915,-0.204976096902259, + -0.000204392583440072,-0.028594581540673,0.302560846185223,-0.221039470622989, + -0.000214201104079159,-0.0282004682274399,0.318960742143531,-0.237102844343719, + -0.000224009624718302,-0.0278063549142074,0.335360638101839,-0.253166218064448, + -0.000233818145357445,-0.0274122416009743,0.351760534060147,-0.269229591785178, + -0.000243626665996755,-0.027018128287742,0.368160430018455,-0.285292965505908, + -0.000253435186635564,-0.0266240149745089,0.384560325976763,-0.301356339226637, + -0.000263243707274929,-0.0262299016612761,0.400960221935071,-0.317419712947367, + -0.00027305222791385,-0.0258357883480433,0.417360117893379,-0.333483086668097, + -0.000282860748552993,-0.0254416750348103,0.433760013851687,-0.349546460388827, + -0.000292669269192136,-0.025047561721578,0.450159909809995,-0.365609834109556, + -0.000302477789831279,-0.0246534484083452,0.466559805768303,-0.381673207830286, + -0.000312286310470089,-0.0242593350951117,0.482959701726611,-0.397736581551016, + -0.000322094831109454,-0.0238652217818789,0.49935959768492,-0.413799955271746, + -0.000331903351748486,-0.0234711084686459,0.515759493643228,-0.429863328992475, + -0.000341711872387962,-0.0230769951554142,0.532159389601535,-0.445926702713205, + -0.000351520393026883,-0.0226828818421809,0.548559285559843,-0.461990076433934, + -0.000361328913666248,-0.0222887685289481,0.564959181518152,-0.478053450154664, + -0.000371137434305391,-0.021894655215716,0.581359077476459,-0.494116823875394, + -0.000380945954944645,-0.0215005419024834,0.597758973434767,-0.510180197596124, + -0.000390754475583233,-0.0211064285892495,0.614158869393076,-0.526243571316853, + -0.000400562996222487,-0.0207123152760169,0.630558765351384,-0.542306945037583, + -0.000410371516861963,-0.0203182019627843,0.646958661309692,-0.558370318758313, + -0.000135915154038768,-0.0208785239313828,0.238404005590504,-0.191738634151289, + -0.000142251668475646,-0.0203450207610709,0.252804682258477,-0.209514907165056, + -0.000148588182912579,-0.0198115175907591,0.26720535892645,-0.227291180178823, + -0.000154924697349568,-0.0192780144204472,0.281606035594422,-0.245067453192591, + -0.000161261211786667,-0.0187445112501357,0.296006712262395,-0.262843726206358, + -0.000167597726223712,-0.0182110080798239,0.310407388930368,-0.280619999220125, + -0.000173934240660256,-0.0176775049095115,0.324808065598341,-0.298396272233893, + -0.000180270755096967,-0.0171440017391995,0.339208742266314,-0.31617254524766, + -0.000186607269534345,-0.016610498568888,0.353609418934286,-0.333948818261427, + -0.000192943783971056,-0.016076995398576,0.368010095602259,-0.351725091275194, + -0.000199280298407989,-0.0155434922282642,0.382410772270231,-0.369501364288962, + -0.000205616812845144,-0.0150099890579527,0.396811448938204,-0.387277637302729, + -0.000211953327282077,-0.0144764858876409,0.411212125606177,-0.405053910316496, + -0.000218289841719344,-0.0139429827173294,0.425612802274149,-0.422830183330264, + -0.000224626356156166,-0.0134094795470174,0.440013478942122,-0.440606456344031, + -0.000230962870592766,-0.0128759763767052,0.454414155610095,-0.458382729357798, + -0.000237299385030032,-0.0123424732063937,0.468814832278068,-0.476159002371565, + -0.000243635899466965,-0.0118089700360819,0.483215508946041,-0.493935275385333, + -0.000249972413904231,-0.0112754668657704,0.497616185614013,-0.5117115483991, + -0.000256308928340943,-0.010741963695458,0.512016862281986,-0.529487821412867, + -0.000262645442777321,-0.0102084605251456,0.526417538949959,-0.547264094426635, + -0.00026898195721492,-0.00967495735483492,0.540818215617931,-0.565040367440402, + -0.000275318471651187,-0.00914145418452206,0.555218892285904,-0.582816640454169, + -0.000281654986088897,-0.00860795101421097,0.569619568953877,-0.600592913467937, + -0.000287991500525497,-0.00807444784389899,0.58402024562185,-0.618369186481704, + -0.000103125863562259,-0.0150314249109791,0.224956510323409,-0.206293031537416, + -0.000107037643296282,-0.0144908805500709,0.237642401206236,-0.225389111912964, + -0.000110949423030471,-0.0139503361891626,0.250328292089064,-0.244485192288512, + -0.00011486120276416,-0.0134097918282541,0.263014182971891,-0.263581272664061, + -0.000118772982498516,-0.012869247467346,0.275700073854718,-0.282677353039609, + -0.00012268476223265,-0.0123287031064379,0.288385964737546,-0.301773433415157, + -0.000126596541966839,-0.01178815874553,0.301071855620373,-0.320869513790705, + -0.000130508321700695,-0.0112476143846212,0.3137577465032,-0.339965594166254, + -0.000134420101434607,-0.0107070700237131,0.326443637386027,-0.359061674541802, + -0.000138331881168741,-0.0101665256628045,0.339129528268855,-0.37815775491735, + -0.000142243660903207,-0.00962598130189707,0.351815419151681,-0.397253835292898, + -0.000146155440637008,-0.00908543694098807,0.364501310034509,-0.416349915668447, + -0.000150067220371031,-0.00854489258007973,0.377187200917336,-0.435445996043995, + -0.000153979000105275,-0.00800434821917206,0.389873091800164,-0.454542076419543, + -0.000157890779839853,-0.0074638038582644,0.402558982682991,-0.473638156795092, + -0.000161802559573543,-0.00692325949735562,0.415244873565818,-0.49273423717064, + -0.000165714339307343,-0.00638271513644684,0.427930764448646,-0.511830317546188, + -0.000169626119041255,-0.00584217077553828,0.440616655331473,-0.530926397921737, + -0.0001735378987755,-0.00530162641463017,0.4533025462143,-0.550022478297285, + -0.000177449678509745,-0.00476108205372228,0.465988437097127,-0.569118558672833, + -0.000181361458243434,-0.0042205376928135,0.478674327979955,-0.588214639048381, + -0.000185273237977457,-0.00367999333190516,0.491360218862782,-0.60731071942393, + -0.000189185017711702,-0.00313944897099772,0.504046109745609,-0.626406799799478, + -0.000193096797445502,-0.00259890461008849,0.516732000628437,-0.645502880175026, + -0.000197008577180635,-0.00205836024918193,0.529417891511264,-0.664598960550575, + -7.69013150269116e-05,-0.0112124089945802,0.213686155491768,-0.217289751280164, + -7.92265923220126e-05,-0.0107256090212421,0.224975770084113,-0.237383025238303, + -8.1551869616947e-05,-0.0102388090479035,0.236265384676458,-0.257476299196442, + -8.38771469119926e-05,-0.0097520090745653,0.247554999268803,-0.277569573154581, + -8.62024242070936e-05,-0.0092652091012273,0.258844613861147,-0.297662847112721, + -8.85277015023056e-05,-0.0087784091278893,0.270134228453492,-0.31775612107086, + -9.08529787969625e-05,-0.00829160915455063,0.281423843045837,-0.337849395028999, + -9.3178256091786e-05,-0.00780480918121174,0.292713457638182,-0.357942668987138, + -9.55035333870535e-05,-0.00731800920787395,0.304003072230526,-0.378035942945277, + -9.78288106822101e-05,-0.00683120923453595,0.315292686822871,-0.398129216903416, + -0.000100154087977367,-0.00634440926119773,0.326582301415216,-0.418222490861555, + -0.00010247936527219,-0.00585760928785928,0.337871916007561,-0.438315764819694, + -0.00010480464256768,-0.00537080931452172,0.349161530599905,-0.458409038777833, + -0.000107129919862503,-0.00488400934118283,0.36045114519225,-0.478502312735972, + -0.000109455197157105,-0.00439720936784394,0.371740759784595,-0.498595586694111, + -0.000111780474452372,-0.00391040939450638,0.38303037437694,-0.518688860652251, + -0.000114105751747307,-0.00342360942116771,0.394319988969285,-0.53878213461039, + -0.000116431029042463,-0.0029368094478297,0.405609603561629,-0.558875408568529, + -0.000118756306336842,-0.00245000947449059,0.416899218153974,-0.578968682526668, + -0.000121081583632443,-0.00196320950115325,0.428188832746319,-0.599061956484807, + -0.000123406860927822,-0.00147640952781503,0.439478447338664,-0.619155230442946, + -0.000125732138222534,-0.0009896095544768,0.450768061931008,-0.639248504401085, + -0.000128057415517246,-0.000502809581138131,0.462057676523353,-0.659341778359224, + -0.000130382692812514,-1.6009607799905e-05,0.473347291115698,-0.679435052317363, + -0.000132707970107671,0.000470790365538321,0.484636905708043,-0.699528326275502, + -5.66326000286943e-05,-0.00871038022143844,0.204675808860634,-0.225476040497143, + -5.79740674953588e-05,-0.00829704609557247,0.214869738915819,-0.246311655377245, + -5.93155349618013e-05,-0.00788371196970594,0.225063668971004,-0.267147270257348, + -6.06570024283548e-05,-0.00747037784383964,0.235257599026188,-0.28798288513745, + -6.19984698949638e-05,-0.00705704371797378,0.245451529081373,-0.308818500017552, + -6.33399373611843e-05,-0.00664370959210681,0.255645459136558,-0.329654114897655, + -6.46814048279043e-05,-0.00623037546624117,0.265839389191742,-0.350489729777757, + -6.60228722945133e-05,-0.00581704134037442,0.276033319246927,-0.371325344657859, + -6.73643397609558e-05,-0.00540370721450811,0.286227249302112,-0.392160959537962, + -6.87058072276203e-05,-0.00499037308864203,0.296421179357297,-0.412996574418064, + -7.00472746938408e-05,-0.00457703896277573,0.306615109412481,-0.433832189298166, + -7.13887421601722e-05,-0.00416370483690898,0.316809039467666,-0.454667804178269, + -7.27302096271698e-05,-0.00375037071104356,0.32700296952285,-0.475503419058371, + -7.40716770935013e-05,-0.00333703658517681,0.337196899578035,-0.496339033938474, + -7.54131445597217e-05,-0.00292370245931028,0.34739082963322,-0.517174648818576, + -7.67546120263862e-05,-0.00251036833344376,0.357584759688405,-0.538010263698678, + -7.80960794933838e-05,-0.00209703420757834,0.367778689743589,-0.558845878578781, + -7.94375469600483e-05,-0.00168370008171248,0.377972619798774,-0.579681493458883, + -8.07790144256026e-05,-0.00127036595584507,0.388166549853959,-0.600517108338986, + -8.21204818929333e-05,-0.000857031829979427,0.398360479909143,-0.621352723219088, + -8.34619493590427e-05,-0.0004436977041129,0.408554409964328,-0.64218833809919, + -8.48034168255962e-05,-3.03635782463729e-05,0.418748340019513,-0.663023952979293, + -8.61448842924828e-05,0.000382970547619266,0.428942270074697,-0.683859567859395, + -8.74863517583702e-05,0.000796304673487125,0.439136200129883,-0.704695182739497, + -8.88278192258118e-05,0.00120963879935099,0.449330130185066,-0.7255307976196, + -4.13373688740171e-05,-0.00705668573501761,0.19770366328409,-0.231503080603621, + -4.20943384865091e-05,-0.00671586427299242,0.207060224147296,-0.252885233529322, + -4.28513080990567e-05,-0.00637504281096724,0.216416785010503,-0.274267386455022, + -4.36082777115487e-05,-0.00603422134894172,0.22577334587371,-0.295649539380723, + -4.43652473240408e-05,-0.00569339988691642,0.235129906736916,-0.317031692306424, + -4.51222169367549e-05,-0.00535257842489134,0.244486467600123,-0.338413845232125, + -4.587918654958e-05,-0.00501175696286627,0.25384302846333,-0.359795998157826, + -4.6636156161739e-05,-0.00467093550084052,0.263199589326536,-0.381178151083527, + -4.73931257741755e-05,-0.004330114038815,0.272556150189743,-0.402560304009228, + -4.81500953869451e-05,-0.00398929257678993,0.28191271105295,-0.423942456934929, + -4.89070649996037e-05,-0.00364847111476485,0.291269271916156,-0.44532460986063, + -4.96640346119293e-05,-0.00330764965273933,0.300625832779363,-0.466706762786331, + -5.04210042249209e-05,-0.0029668281907147,0.309982393642569,-0.488088915712032, + -5.11779738375795e-05,-0.0026260067286894,0.319338954505776,-0.509471068637732, + -5.1934943449794e-05,-0.0022851852666641,0.328695515368983,-0.530853221563433, + -5.26919130625636e-05,-0.0019443638046388,0.338052076232189,-0.552235374489135, + -5.34488826750001e-05,-0.00160354234261328,0.347408637095396,-0.573617527414835, + -5.42058522873257e-05,-0.00126272088058776,0.356765197958603,-0.594999680340536, + -5.49628219004283e-05,-0.000921899418563132,0.36612175882181,-0.616381833266237, + -5.57197915128649e-05,-0.000581077956537612,0.375478319685016,-0.637763986191938, + -5.64767611251904e-05,-0.000240256494512092,0.384834880548223,-0.659146139117639, + -5.72337307371829e-05,0.000100564967513872,0.39419144141143,-0.68052829204334, + -5.79907003502855e-05,0.000441386429538504,0.403548002274636,-0.701910444969041, + -5.87476699631662e-05,0.00078220789156358,0.412904563137843,-0.723292597894742, + -5.95046395752696e-05,0.00112302935358954,0.42226112400105,-0.744674750820443, + -2.99853015393037e-05,-0.00595090937629139,0.192430927252515,-0.235904339215501, + -3.04062288902784e-05,-0.00567297890198493,0.201159555945985,-0.257685602689234, + -3.08271562415308e-05,-0.00539504842767902,0.209888184639455,-0.279466866162968, + -3.12480835929496e-05,-0.00511711795337288,0.218616813332924,-0.301248129636701, + -3.16690109442574e-05,-0.00483918747906675,0.227345442026394,-0.323029393110435, + -3.20899382953987e-05,-0.00456125700476062,0.236074070719864,-0.344810656584168, + -3.2510865646429e-05,-0.00428332653045405,0.244802699413334,-0.366591920057902, + -3.29317929976813e-05,-0.00400539605614791,0.253531328106803,-0.388373183531635, + -3.33527203489892e-05,-0.003727465581842,0.262259956800273,-0.410154447005369, + -3.3773647700297e-05,-0.00344953510753565,0.270988585493743,-0.431935710479102, + -3.41945750516048e-05,-0.00317160463322996,0.279717214187212,-0.453716973952836, + -3.46155024023576e-05,-0.00289367415892272,0.288445842880682,-0.475498237426569, + -3.50364297537764e-05,-0.00261574368461726,0.297174471574152,-0.497279500900303, + -3.54573571051953e-05,-0.00233781321031112,0.305903100267621,-0.519060764374036, + -3.5878284456059e-05,-0.00205988273600455,0.314631728961091,-0.54084202784777, + -3.62992118074779e-05,-0.00178195226169886,0.323360357654561,-0.562623291321504, + -3.67201391587857e-05,-0.00150402178739295,0.33208898634803,-0.584404554795237, + -3.71410665098715e-05,-0.00122609131308637,0.3408176150415,-0.606185818268971, + -3.75619938611793e-05,-0.000948160838780243,0.34954624373497,-0.627967081742704, + -3.79829212123761e-05,-0.000670230364473667,0.35827487242844,-0.649748345216437, + -3.8403848563795e-05,-0.00039229989016798,0.367003501121909,-0.671529608690171, + -3.88247759145477e-05,-0.000114369415861848,0.375732129815379,-0.693310872163905, + -3.92457032656335e-05,0.000163561058444728,0.384460758508849,-0.715092135637638, + -3.96666306177185e-05,0.000441491532749971,0.393189387202318,-0.736873399111371, + -4.00875579681381e-05,0.000719422007057435,0.401918015895788,-0.758654662585105, + -2.16559292193774e-05,-0.00520240192210908,0.18850753240315,-0.239099249711944, + -2.1888209712384e-05,-0.00497540519491824,0.196771646142004,-0.26117023087591, + -2.21204902053351e-05,-0.00474840846772784,0.205035759880858,-0.283241212039876, + -2.23527706981197e-05,-0.004521411740537,0.213299873619712,-0.305312193203842, + -2.25850511909598e-05,-0.00429441501334638,0.221563987358565,-0.327383174367808, + -2.28173316838554e-05,-0.00406741828615553,0.229828101097419,-0.349454155531774, + -2.30496121766954e-05,-0.00384042155896491,0.238092214836273,-0.371525136695741, + -2.32818926698686e-05,-0.00361342483177474,0.246356328575126,-0.393596117859707, + -2.35141731628197e-05,-0.00338642810458367,0.25462044231398,-0.415667099023673, + -2.37464536556597e-05,-0.00315943137739305,0.262884556052834,-0.437738080187639, + -2.39787341484998e-05,-0.00293243465020288,0.271148669791687,-0.459809061351605, + -2.42110146414509e-05,-0.00270543792301181,0.279412783530541,-0.481880042515572, + -2.4443295134069e-05,-0.00247844119582075,0.287676897269395,-0.503951023679538, + -2.46755756274641e-05,-0.00225144446863079,0.295941011008249,-0.526022004843504, + -2.49078561201932e-05,-0.00202444774143995,0.304205124747102,-0.54809298600747, + -2.51401366134774e-05,-0.00179745101425,0.312469238485956,-0.570163967171436, + -2.53724171062064e-05,-0.00157045428705871,0.32073335222481,-0.592234948335402, + -2.56046975987134e-05,-0.00134345755986764,0.328997465963663,-0.614305929499369, + -2.58369780917755e-05,-0.00111646083267702,0.337261579702517,-0.636376910663335, + -2.60692585846156e-05,-0.000889464105486404,0.345525693441371,-0.658447891827301, + -2.63015390778998e-05,-0.000662467378296228,0.353789807180224,-0.680518872991267, + -2.65338195698517e-05,-0.000435470651104275,0.362053920919079,-0.702589854155233, + -2.67661000635799e-05,-0.000208473923915431,0.370318034657931,-0.724660835319199, + -2.69983805567531e-05,1.85228032747453e-05,0.378582148396785,-0.746731816483166, + -2.72306610492601e-05,0.000245519530466698,0.386846262135639,-0.768802797647132, + -1.55925830145898e-05,-0.00468990617347764,0.185621615830676,-0.241408431591227, + -1.57206274770672e-05,-0.00450249796473789,0.193545439625256,-0.263688811685504, + -1.5848671939489e-05,-0.00431508975599804,0.201469263419836,-0.28596919177978, + -1.59767164019109e-05,-0.00412768154725818,0.209393087214416,-0.308249571874057, + -1.61047608645548e-05,-0.00394027333851876,0.217316911008995,-0.330529951968334, + -1.62328053266436e-05,-0.00375286512977868,0.225240734803575,-0.35281033206261, + -1.63608497889545e-05,-0.00356545692103838,0.233164558598155,-0.375090712156887, + -1.64888942512098e-05,-0.00337804871229852,0.241088382392735,-0.397371092251164, + -1.66169387137982e-05,-0.00319064050355933,0.249012206187315,-0.419651472345441, + -1.67449831757205e-05,-0.00300323229481858,0.256936029981895,-0.441931852439717, + -1.68730276385309e-05,-0.00281582408607961,0.264859853776475,-0.464212232533994, + -1.70010721008973e-05,-0.00262841587733953,0.272783677571055,-0.486492612628271, + -1.71291165630416e-05,-0.002441007668599,0.280707501365635,-0.508772992722547, + -1.7257161025408e-05,-0.00225359945985892,0.288631325160215,-0.531053372816824, + -1.73852054876633e-05,-0.00206619125111929,0.296555148954795,-0.553333752911101, + -1.75132499499187e-05,-0.00187878304237921,0.304478972749375,-0.575614133005378, + -1.7641294412396e-05,-0.00169137483363935,0.312402796543955,-0.597894513099654, + -1.77693388750955e-05,-0.00150396662490015,0.320326620338534,-0.620174893193931, + -1.78973833372398e-05,-0.00131655841616007,0.328250444133114,-0.642455273288208, + -1.80254277994951e-05,-0.00112915020742044,0.336174267927694,-0.664735653382484, + -1.81534722619725e-05,-0.000941741998680357,0.344098091722274,-0.687016033476761, + -1.82815167245609e-05,-0.00075433378994072,0.352021915516854,-0.709296413571037, + -1.84095611867052e-05,-0.000566925581200639,0.359945739311434,-0.731576793665314, + -1.85376056488495e-05,-0.000379517372460558,0.367869563106014,-0.753857173759591, + -1.86656501113269e-05,-0.000192109163720922,0.375793386900594,-0.776137553853868, + -1.12028670707365e-05,-0.00433551896378215,0.183516180734126,-0.24307221295256, + -1.12738184348538e-05,-0.00417808149301435,0.191192455390847,-0.265503466410455, + -1.1344769798749e-05,-0.00402064402224633,0.198868730047568,-0.28793471986835, + -1.14157211631993e-05,-0.00386320655147876,0.206545004704288,-0.310365973326245, + -1.14866725270391e-05,-0.00370576908071052,0.214221279361009,-0.33279722678414, + -1.15576238910453e-05,-0.0035483316099425,0.22189755401773,-0.355228480242035, + -1.16285752549405e-05,-0.00339089413917448,0.229573828674451,-0.37765973369993, + -1.16995266195019e-05,-0.00323345666840713,0.237250103331172,-0.400090987157825, + -1.17704779830641e-05,-0.00307601919763889,0.244926377987892,-0.42252224061572, + -1.18414293469593e-05,-0.00291858172687065,0.252602652644613,-0.444953494073615, + -1.19123807117427e-05,-0.00276114425610374,0.260278927301334,-0.46738474753151, + -1.1983332075638e-05,-0.0026037067853355,0.267955201958055,-0.489816000989405, + -1.20542834393111e-05,-0.00244626931456682,0.275631476614776,-0.5122472544473, + -1.21252348037615e-05,-0.00228883184379969,0.283307751271496,-0.534678507905195, + -1.21961861673237e-05,-0.002131394373031,0.290984025928217,-0.55710976136309, + -1.2267137531774e-05,-0.00197395690226343,0.298660300584938,-0.579541014820985, + -1.23380888957803e-05,-0.00181651943149586,0.306336575241658,-0.60197226827888, + -1.24090402602306e-05,-0.00165908196072806,0.314012849898379,-0.624403521736775, + -1.24799916237928e-05,-0.00150164448995938,0.321689124555101,-0.64683477519467, + -1.255094298791e-05,-0.00134420701919202,0.329365399211821,-0.669266028652565, + -1.26218943524714e-05,-0.00118676954842423,0.337041673868542,-0.69169728211046, + -1.26928457166997e-05,-0.00102933207765687,0.344717948525262,-0.714128535568355, + -1.27637970801509e-05,-0.000871894606888191,0.352394223181983,-0.73655978902625, + -1.28347484440461e-05,-0.000714457136119506,0.360070497838705,-0.758991042484145, + -1.29056998080523e-05,-0.00055701966535171,0.367746772495425,-0.78142229594204, + -8.03686207367926e-06,-0.00408846834833199,0.181989111659815,-0.244268273295922, + -8.07661456186937e-06,-0.00395332636317081,0.189486202698229,-0.266807986706121, + -8.1163670497264e-06,-0.00381818437800963,0.196983293736642,-0.289347700116319, + -8.15611953774997e-06,-0.003683042392848,0.204480384775056,-0.311887413526517, + -8.19587202582905e-06,-0.00354790040768704,0.211977475813469,-0.334427126936716, + -8.2356245137416e-06,-0.00341275842252609,0.219474566851882,-0.356966840346914, + -8.27537700182068e-06,-0.00327761643736446,0.226971657890296,-0.379506553757112, + -8.31512948973323e-06,-0.00314247445220306,0.23446874892871,-0.402046267167311, + -8.35488197747924e-06,-0.00300733246704166,0.241965839967123,-0.424585980577509, + -8.39463446578037e-06,-0.00287219048188092,0.249462931005537,-0.447125693987707, + -8.43438695330434e-06,-0.00273704849671907,0.25696002204395,-0.469665407397906, + -8.47413944171649e-06,-0.00260190651155789,0.264457113082364,-0.492205120808104, + -8.51389192968455e-06,-0.00246676452639649,0.271954204120777,-0.514744834218302, + -8.55364441731954e-06,-0.00233162254123487,0.279451295159191,-0.5372845476285, + -8.59339690562066e-06,-0.00219648055607413,0.286948386197604,-0.559824261038699, + -8.6331493934777e-06,-0.00206133857091295,0.294445477236017,-0.582363974448897, + -8.67290188222292e-06,-0.00192619658575222,0.301942568274431,-0.604903687859096, + -8.71265436952484e-06,-0.00179105460059015,0.309439659312845,-0.627443401269294, + -8.75240685727086e-06,-0.00165591261542852,0.316936750351258,-0.649983114679492, + -8.79215934546096e-06,-0.00152077063026779,0.324433841389672,-0.672522828089691, + -8.83191183320697e-06,-0.00138562864510572,0.331930932428086,-0.695062541499889, + -8.87166432161912e-06,-0.00125048665994498,0.339428023466499,-0.717602254910087, + -8.91141680980923e-06,-0.0011153446747838,0.346925114504913,-0.740141968320285, + -8.95116929822137e-06,-0.000980202689623511,0.354422205543325,-0.762681681730484, + -8.99092178541228e-06,-0.000845060704461442,0.361919296581739,-0.785221395140682, + -5.75947413478106e-06,-0.00391513906929497,0.180886146395829,-0.245126702100606, + -5.7821156230764e-06,-0.00379638611201094,0.188254003136995,-0.267744258696333, + -5.80475711159378e-06,-0.0036776331547268,0.195621859878162,-0.29036181529206, + -5.82739860011117e-06,-0.0035588801974431,0.202989716619328,-0.312979371887788, + -5.85004008840651e-06,-0.00344012724015896,0.210357573360494,-0.335596928483515, + -5.87268157681287e-06,-0.00332137428287504,0.21772543010166,-0.358214485079242, + -5.8953230651082e-06,-0.00320262132559046,0.225093286842826,-0.380832041674969, + -5.91796455362559e-06,-0.00308386836830676,0.232461143583992,-0.403449598270696, + -5.94060604219848e-06,-0.00296511541102262,0.239829000325158,-0.426067154866423, + -5.96324753054933e-06,-0.00284636245373893,0.247196857066324,-0.44868471146215, + -5.98588901912223e-06,-0.00272760949645523,0.25456471380749,-0.471302268057877, + -6.00853050769512e-06,-0.00260885653917153,0.261932570548656,-0.493919824653604, + -6.03117199549086e-06,-0.0024901035818865,0.269300427289823,-0.516537381249331, + -6.0538134842858e-06,-0.00237135062460281,0.276668284030988,-0.539154937845058, + -6.07645497308074e-06,-0.00225259766731933,0.284036140772154,-0.561772494440785, + -6.09909646132056e-06,-0.00213384471003542,0.29140399751332,-0.584390051036512, + -6.12173794978244e-06,-0.00201509175275127,0.298771854254487,-0.607007607632239, + -6.14437943846635e-06,-0.00189633879546802,0.306139710995652,-0.629625164227966, + -6.16702092659516e-06,-0.00177758583818299,0.313507567736819,-0.652242720823693, + -6.18966241516805e-06,-0.0016588328808993,0.320875424477985,-0.67486027741942, + -6.21230390318583e-06,-0.00154007992361471,0.328243281219151,-0.697477834015147, + -6.23494539142566e-06,-0.00142132696633057,0.335611137960317,-0.720095390610874, + -6.25758688044264e-06,-0.00130257400904732,0.342978994701483,-0.742712947206601, + -6.28022836857145e-06,-0.00118382105176273,0.350346851442649,-0.765330503802328, + -6.30286985670026e-06,-0.00106506809447815,0.357714708183816,-0.787948060398055, + -4.12432709961941e-06,-0.00379293354838373,0.180091873156102,-0.245742089933523, + -4.13749656824614e-06,-0.00368612884327413,0.187366759910271,-0.268415450515543, + -4.15066603637326e-06,-0.00357932413816386,0.19464164666444,-0.291088811097563, + -4.16383550483346e-06,-0.00347251943305427,0.201916533418609,-0.313762171679582, + -4.17700497290507e-06,-0.00336571472794378,0.209191420172778,-0.336435532261602, + -4.1901744415318e-06,-0.00325891002283396,0.216466306926947,-0.359108892843622, + -4.20334390976995e-06,-0.00315210531772414,0.223741193681116,-0.381782253425642, + -4.21651337823015e-06,-0.00304530061261454,0.231016080435285,-0.404455614007662, + -4.22968284641279e-06,-0.0029384959075045,0.238290967189454,-0.427128974589681, + -4.24285231470645e-06,-0.00283169120239446,0.245565853943623,-0.449802335171701, + -4.25602178277806e-06,-0.00272488649728375,0.252840740697792,-0.472475695753721, + -4.2691912509607e-06,-0.00261808179217371,0.260115627451961,-0.495149056335741, + -4.28236071947641e-06,-0.00251127708706345,0.267390514206131,-0.51782241691776, + -4.29553018788109e-06,-0.00240447238195385,0.274665400960299,-0.54049577749978, + -4.30869965584169e-06,-0.00229766767684381,0.281940287714468,-0.5631691380818, + -4.32186912435739e-06,-0.00219086297173354,0.289215174468638,-0.585842498663819, + -4.33503859309514e-06,-0.00208405826662439,0.296490061222806,-0.608515859245839, + -4.34820806094471e-06,-0.00197725356151368,0.303764947976976,-0.631189219827859, + -4.36137752968246e-06,-0.00187044885640431,0.311039834731144,-0.653862580409879, + -4.37454699775408e-06,-0.00176364415129404,0.318314721485313,-0.676535940991898, + -4.38771646571467e-06,-0.00165683944618333,0.325589608239483,-0.699209301573918, + -4.40088593467447e-06,-0.0015500347410744,0.332864494993651,-0.721882662155938, + -4.414055402302e-06,-0.00144323003596281,0.340139381747821,-0.744556022737958, + -4.42722487126179e-06,-0.00133642533085432,0.347414268501989,-0.767229383319977, + -4.4403943397775e-06,-0.0012296206257445,0.354689155256158,-0.789902743901997, + -2.95183580645286e-06,-0.00370645370112288,0.179521113872734,-0.246182878501342, + -2.95968487706855e-06,-0.00360830965049797,0.186729241529835,-0.268896210233067, + -2.96753394729565e-06,-0.00351016559987261,0.193937369186937,-0.291609541964792, + -2.97538301768929e-06,-0.00341202154924747,0.201145496844038,-0.314322873696518, + -2.98323208819395e-06,-0.00331387749862233,0.20835362450114,-0.337036205428243, + -2.99108115892066e-06,-0.00321573344799742,0.215561752158241,-0.359749537159968, + -2.99893022920328e-06,-0.00311758939737206,0.222769879815343,-0.382462868891694, + -3.00677929976345e-06,-0.00301944534674714,0.229978007472444,-0.405176200623419, + -3.01462837004607e-06,-0.00292130129612178,0.237186135129546,-0.427889532355144, + -3.0224774408838e-06,-0.00282315724549731,0.244394262786647,-0.45060286408687, + -3.03032651116641e-06,-0.00272501319487173,0.251602390443749,-0.473316195818595, + -3.03817558156005e-06,-0.00262686914424637,0.258810518100851,-0.496029527550321, + -3.04602465206472e-06,-0.00252872509362123,0.266018645757953,-0.518742859282046, + -3.05387372245836e-06,-0.00243058104299587,0.273226773415054,-0.541456191013771, + -3.061722792852e-06,-0.00233243699237118,0.280434901072155,-0.564169522745497, + -3.06957186324563e-06,-0.00223429294174537,0.287643028729258,-0.586882854477222, + -3.07742093397234e-06,-0.0021361488911209,0.294851156386359,-0.609596186208947, + -3.08527000469905e-06,-0.00203800484049621,0.30205928404346,-0.632309517940673, + -3.09311907475962e-06,-0.00193986078987018,0.309267411700562,-0.655022849672398, + -3.10096814515326e-06,-0.00184171673924549,0.316475539357663,-0.677736181404123, + -3.10881721599099e-06,-0.00174357268861991,0.323683667014766,-0.700449513135849, + -3.11666628627361e-06,-0.00164542863799522,0.330891794671867,-0.723162844867574, + -3.12451535711133e-06,-0.00154728458737052,0.338099922328968,-0.745876176599299, + -3.13236442717191e-06,-0.0014491405367445,0.34530804998607,-0.768589508331025, + -3.14021349756555e-06,-0.00135099648611936,0.352516177643172,-0.79130284006275, + -2.11186936349694e-06,-0.00364508743395964,0.179111593840341,-0.246498416416352, + -2.11667157173911e-06,-0.00355319561261913,0.186271846596139,-0.269240361442884, + -2.12147378031435e-06,-0.00346130379127874,0.193432099351938,-0.291982306469417, + -2.12627598883408e-06,-0.00336941196993856,0.200592352107736,-0.31472425149595, + -2.13107819735381e-06,-0.00327752014859817,0.207752604863535,-0.337466196522482, + -2.13588040542945e-06,-0.00318562832725733,0.214912857619333,-0.360208141549015, + -2.1406826140602e-06,-0.00309373650591716,0.222073110375132,-0.382950086575547, + -2.14548482235788e-06,-0.00300184468457654,0.229233363130931,-0.40569203160208, + -2.15028703065556e-06,-0.00290995286323592,0.236393615886729,-0.428433976628613, + -2.15508923928631e-06,-0.00281806104189575,0.243553868642528,-0.451175921655145, + -2.15989144791706e-06,-0.00272616922055557,0.250714121398326,-0.473917866681678, + -2.16469365588168e-06,-0.00263427739921429,0.257874374154125,-0.49665981170821, + -2.16949586451243e-06,-0.00254238557787434,0.265034626909923,-0.519401756734743, + -2.17429807269909e-06,-0.0024504937565335,0.272194879665722,-0.542143701761276, + -2.17910028144086e-06,-0.00235860193519355,0.27935513242152,-0.564885646787808, + -2.18390249007161e-06,-0.00226671011385338,0.286515385177319,-0.587627591814341, + -2.18870469870236e-06,-0.00217481829251343,0.293675637933117,-0.610369536840874, + -2.19350690688902e-06,-0.00208292647117192,0.300835890688917,-0.633111481867406, + -2.19830911574181e-06,-0.00199103464983219,0.307996143444715,-0.655853426893939, + -2.20311132392847e-06,-0.00189914282849157,0.315156396200513,-0.678595371920471, + -2.20791353200411e-06,-0.00180725100715051,0.322316648956312,-0.701337316947004, + -2.21271574074589e-06,-0.00171535918581034,0.329476901712111,-0.724079261973537, + -2.21751794904357e-06,-0.00162346736447017,0.336637154467909,-0.746821207000069, + -2.22232015700818e-06,-0.00153157554312955,0.343797407223707,-0.769563152026602, + -2.227122365972e-06,-0.00143968372178938,0.350957659979506,-0.792305097053135, + -1.51051496311005e-06,-0.00360145408282586,0.178818082363727,-0.246724196957689, + -1.51353127442189e-06,-0.00351406289403688,0.185944034848802,-0.269486615990304, + -1.51654758584474e-06,-0.0034266717052478,0.193069987333877,-0.292249035022918, + -1.51956389665697e-06,-0.00333928051645849,0.200195939818952,-0.315011454055533, + -1.52258020852392e-06,-0.00325188932766984,0.207321892304027,-0.337773873088148, + -1.52559651944717e-06,-0.00316449813888009,0.214447844789102,-0.360536292120762, + -1.52861283087002e-06,-0.00307710695009167,0.221573797274176,-0.383298711153377, + -1.53162914162674e-06,-0.00298971576130191,0.228699749759252,-0.406061130185991, + -1.53464545293858e-06,-0.0029023245725126,0.235825702244327,-0.428823549218606, + -1.53766176391734e-06,-0.00281493338372285,0.242951654729402,-0.451585968251221, + -1.54067807556224e-06,-0.00272754219493465,0.250077607214476,-0.474348387283835, + -1.54369438676305e-06,-0.00264015100614512,0.257203559699552,-0.49711080631645, + -1.54671069829693e-06,-0.0025527598173567,0.264329512184626,-0.519873225349065, + -1.54972700905365e-06,-0.00246536862856672,0.271455464669702,-0.542635644381679, + -1.55274332069855e-06,-0.00237797743977808,0.278581417154776,-0.565398063414294, + -1.55575963167731e-06,-0.00229058625098877,0.285707369639851,-0.588160482446909, + -1.55877594287812e-06,-0.00220319506219946,0.292833322124926,-0.610922901479523, + -1.56179225396791e-06,-0.00211580387340993,0.299959274610001,-0.633685320512138, + -1.56480856550179e-06,-0.00202841268462173,0.307085227095076,-0.656447739544753, + -1.56782487592544e-06,-0.00194102149583086,0.314211179580152,-0.679210158577367, + -1.57084118757034e-06,-0.00185363030704266,0.321337132065226,-0.701972577609982, + -1.57385749932626e-06,-0.00176623911825446,0.328463084550301,-0.724734996642597, + -1.57687381008298e-06,-0.00167884792946404,0.335589037035376,-0.747497415675211, + -1.57989012128379e-06,-0.0015914567406754,0.342714989520451,-0.770259834707826, + -1.58290643315073e-06,-0.0015040655518872,0.349840942005526,-0.793022253740441 +}; + +} /* namespace DSP */ + +#endif /* _VS_TAB_H_ */ diff --git a/plugins/ladspa_effect/caps/dsp/util.h b/plugins/ladspa_effect/caps/dsp/util.h index 5b3ccd7ac..09416b5a5 100644 --- a/plugins/ladspa_effect/caps/dsp/util.h +++ b/plugins/ladspa_effect/caps/dsp/util.h @@ -5,7 +5,7 @@ http://quitte.de/dsp/ - common math utility functions. + Common math utility functions. */ /* diff --git a/plugins/ladspa_effect/caps/interface.cc b/plugins/ladspa_effect/caps/interface.cc index 53f902949..c0ef574fd 100644 --- a/plugins/ladspa_effect/caps/interface.cc +++ b/plugins/ladspa_effect/caps/interface.cc @@ -1,6 +1,10 @@ /* interface.cc + Copyright 2004-7 Tim Goetze + + http://quitte.de/dsp/ + LADSPA descriptor factory, host interface. */ @@ -43,10 +47,11 @@ #include "HRTF.h" #include "Pan.h" #include "Scape.h" +#include "ToneStack.h" #include "Descriptor.h" -#define N 33 +#define N 38 static DescriptorStub * descriptors [N]; static inline void @@ -55,24 +60,29 @@ seed() static struct timeval tv; gettimeofday (&tv, 0); - srand (tv.tv_sec ^ tv.tv_usec); + srandom (tv.tv_sec ^ tv.tv_usec); } extern "C" { +__attribute__ ((constructor)) void _init() { DescriptorStub ** d = descriptors; *d++ = new Descriptor(); + *d++ = new Descriptor(); *d++ = new Descriptor(); *d++ = new Descriptor(); *d++ = new Descriptor(); *d++ = new Descriptor(); + *d++ = new Descriptor(); + *d++ = new Descriptor(); *d++ = new Descriptor(); *d++ = new Descriptor(); *d++ = new Descriptor(); + *d++ = new Descriptor(); *d++ = new Descriptor(); *d++ = new Descriptor(); *d++ = new Descriptor(); @@ -85,6 +95,7 @@ void _init() *d++ = new Descriptor(); *d++ = new Descriptor(); *d++ = new Descriptor(); + *d++ = new Descriptor(); *d++ = new Descriptor(); *d++ = new Descriptor(); @@ -103,9 +114,13 @@ void _init() *d++ = new Descriptor(); *d++ = new Descriptor(); - seed(); + /* make sure N is correct */ + assert (d - descriptors == N); + + //seed(); } +__attribute__ ((destructor)) void _fini() { for (ulong i = 0; i < N; ++i) @@ -119,7 +134,6 @@ ladspa_descriptor (unsigned long i) { if (i < N) return descriptors[i]; - return 0; } diff --git a/plugins/ladspa_effect/caps/waves/click.h b/plugins/ladspa_effect/caps/waves/click.h new file mode 100644 index 000000000..35950d618 --- /dev/null +++ b/plugins/ladspa_effect/caps/waves/click.h @@ -0,0 +1,520 @@ +float click [] = { + -0.013062, -0.013062, -0.012817, -0.011078, -0.031097, -0.266479, + -0.610718, -0.255005, 0.698975, 0.999969, 0.505188, -0.724579, + -1.000000, -0.493225, 0.532135, 0.789459, 0.131744, -0.270599, + -0.080780, -0.065796, 0.584381, 0.718567, -0.355316, -0.760559, + -0.649994, -0.039032, 0.442017, 0.700043, 0.434845, -0.556427, + -1.000000, -0.400391, 0.590729, 0.999969, 0.999969, 0.592896, + -0.248932, -0.662750, -0.074615, 0.424774, 0.274933, -0.416504, + -0.772736, -0.359833, -0.218140, -0.254456, -0.379547, -0.768280, + -0.707428, 0.108124, 0.755127, 0.680847, 0.429352, 0.126129, + -0.424316, -0.451813, 0.197510, 0.862762, 0.964508, 0.263824, + -0.383057, -0.753571, -0.848297, -0.491425, -0.042114, -0.222504, + -0.664490, -0.690155, -0.227905, 0.286682, 0.742981, 0.812225, + 0.326691, 0.182770, 0.381195, 0.536194, 0.446930, 0.085754, + -0.650604, -1.000000, -1.000000, -0.774658, -0.152191, -0.112122, + -0.416290, -0.491547, -0.253235, 0.241760, 0.749847, 0.618042, + 0.338440, 0.431335, 0.773712, 0.936890, 0.752563, 0.291595, + -0.206970, -0.552460, -0.447449, -0.152069, -0.315735, -0.891846, + -1.000000, -1.000000, -0.682281, 0.066925, 0.477264, 0.447144, + 0.209167, 0.149994, 0.374176, 0.621185, 0.597046, 0.315826, + 0.034210, -0.004089, 0.084534, 0.127075, 0.060608, -0.134949, + -0.275421, -0.347870, -0.505371, -0.618835, -0.443878, -0.217682, + -0.157898, -0.241058, -0.424103, -0.494690, -0.286438, 0.111542, + 0.487793, 0.654907, 0.571869, 0.484650, 0.413208, 0.254089, + 0.136414, 0.021118, -0.223724, -0.366364, -0.290771, -0.126251, + -0.080048, -0.175262, -0.290100, -0.281403, -0.071808, 0.078613, + 0.216339, 0.275787, 0.223938, 0.178131, 0.162659, 0.110779, + 0.104553, 0.158661, 0.208252, 0.271484, 0.256531, 0.153046, + 0.068054, -0.009003, -0.116119, -0.155304, -0.099213, 0.066589, + 0.293732, 0.392303, 0.313416, 0.196320, 0.123932, 0.145874, + 0.279053, 0.291016, 0.081818, -0.092133, -0.090363, 0.030029, + 0.099762, -0.021912, -0.133942, -0.025299, 0.257782, 0.466980, + 0.406006, 0.150085, -0.007385, -0.027588, 0.048920, 0.128998, + 0.058868, -0.066589, -0.146759, -0.168427, -0.119751, -0.087677, + -0.082581, -0.029694, -0.041138, -0.139984, -0.156036, -0.033325, + 0.164612, 0.331726, 0.320435, 0.205811, 0.209717, 0.275909, + 0.240479, 0.081238, -0.104828, -0.239624, -0.286652, -0.254120, + -0.304688, -0.428223, -0.479248, -0.534729, -0.453003, -0.144928, + -0.001709, 0.059448, 0.016937, -0.127991, -0.186432, -0.122986, + 0.086090, 0.278351, 0.258026, 0.172882, -0.032043, -0.267242, + -0.289276, -0.293365, -0.288971, -0.256073, -0.212250, -0.214783, + -0.182709, -0.149170, -0.132599, -0.221649, -0.233063, 0.002472, + 0.208008, 0.119659, -0.018250, -0.182861, -0.267731, -0.164001, + -0.052063, 0.009979, 0.058472, 0.147156, 0.111298, 0.017426, + -0.067780, -0.049835, 0.002167, -0.028259, 0.003418, 0.023743, + -0.056702, -0.074066, -0.070984, -0.075439, -0.056915, -0.189575, + -0.324524, -0.241882, -0.051514, 0.075623, 0.160095, 0.094238, + 0.004425, 0.010193, 0.032898, 0.040222, 0.163605, 0.273682, + 0.192261, -0.019989, -0.217682, -0.327728, -0.337372, -0.227386, + -0.043945, 0.107788, 0.244690, 0.226227, -0.034332, -0.252106, + -0.364136, -0.377136, -0.246277, -0.021973, 0.194763, 0.300110, + 0.295532, 0.246246, 0.198425, 0.209991, 0.272064, 0.249451, + 0.078094, -0.143616, -0.276459, -0.257782, -0.228638, -0.161224, + -0.006012, 0.169342, 0.267456, 0.246094, 0.232147, 0.290436, + 0.280670, 0.220886, 0.162811, 0.187286, 0.178223, 0.036804, + -0.043304, -0.098694, -0.101990, 0.008698, 0.102844, 0.132050, + 0.142578, 0.152924, 0.058960, -0.074615, -0.079041, 0.026123, + 0.136322, 0.253510, 0.382782, 0.447357, 0.419800, 0.294952, + 0.129059, 0.004028, -0.119781, -0.257538, -0.320526, -0.211609, + -0.054565, 0.012085, -0.016663, 0.006592, 0.144958, 0.193237, + 0.072174, -0.018951, 0.038483, 0.085175, -0.023407, -0.089661, + -0.029999, -0.023956, -0.079498, -0.135223, -0.154205, -0.095276, + -0.031830, -0.105988, -0.252563, -0.284424, -0.153198, 0.017273, + 0.073456, 0.072571, 0.175751, 0.222260, 0.105316, -0.053345, + -0.180115, -0.192932, -0.185211, -0.167511, -0.079529, -0.070007, + -0.151276, -0.215210, -0.206390, -0.133820, -0.099060, -0.082855, + 0.047852, 0.108429, 0.014099, -0.049377, -0.050751, -0.081207, + -0.060944, -0.028564, -0.124420, -0.139526, -0.033508, 0.054108, + 0.042664, -0.004669, -0.069611, -0.105774, -0.090881, -0.128601, + -0.090027, -0.012634, 0.004578, 0.046387, 0.085144, 0.055511, + 0.036469, 0.001770, -0.019867, 0.016998, 0.031891, 0.089935, + 0.066254, -0.069183, -0.020081, 0.046356, 0.005554, -0.023224, + -0.042847, -0.133057, -0.104004, 0.065674, 0.146484, 0.145782, + 0.006897, -0.059509, 0.070923, 0.058319, -0.002655, 0.000641, + -0.036011, 0.049988, 0.076752, 0.016998, 0.063049, 0.105835, + 0.041870, -0.092072, -0.154358, -0.081879, 0.089905, 0.090820, + 0.054047, -0.110565, -0.285980, -0.219116, -0.103058, 0.083405, + 0.192200, 0.124146, 0.080994, 0.118896, 0.231659, 0.259644, + 0.175018, 0.110840, 0.005096, -0.156128, -0.202209, -0.167572, + -0.145050, -0.126068, -0.139221, -0.039856, 0.078674, 0.062866, + -0.069672, -0.143311, -0.049530, 0.082611, 0.142487, 0.039612, + -0.035736, -0.006287, 0.017181, 0.013580, -0.019043, -0.017303, + 0.007904, -0.073944, -0.121704, -0.065369, -0.098083, -0.063568, + 0.056885, 0.083984, 0.148987, 0.298431, 0.253815, 0.052643, + -0.139740, -0.217743, -0.073181, 0.097351, 0.124786, 0.091156, + 0.056152, -0.007446, 0.048553, 0.129333, 0.021118, -0.003235, + 0.093872, 0.080658, 0.025482, -0.037598, -0.055481, -0.078796, + -0.130676, -0.140930, -0.126770, -0.048004, 0.026093, 0.035767, + 0.049957, 0.009247, -0.076599, -0.066101, 0.002747, 0.076813, + 0.173492, 0.091949, -0.071960, -0.080902, -0.061157, -0.061066, + -0.073029, -0.070251, -0.008545, 0.035187, -0.036194, -0.086456, + -0.158691, -0.199036, -0.150177, -0.099030, -0.027802, -0.001465, + 0.003662, 0.089020, 0.056122, -0.108551, -0.125610, -0.056610, + -0.053284, -0.128998, -0.166504, -0.124725, -0.095459, -0.088531, + -0.087433, -0.065399, -0.084045, -0.053284, -0.006317, -0.008698, + 0.025879, -0.019714, -0.055511, -0.076874, -0.084442, -0.111450, + -0.097198, -0.040924, -0.047729, 0.025604, 0.077301, 0.027100, + -0.052612, -0.046265, 0.021271, 0.022186, -0.060669, -0.109283, + -0.022858, 0.126740, 0.199036, 0.255798, 0.210114, 0.167450, + 0.034515, -0.140167, -0.106354, -0.056549, -0.016449, 0.092529, + 0.082977, 0.035645, 0.066132, 0.113098, 0.123657, 0.150513, + 0.123840, 0.125702, 0.146637, 0.131683, 0.114014, 0.019806, + 0.017670, 0.017914, -0.029480, 0.074280, 0.118622, 0.049805, + 0.057922, 0.033569, 0.028870, 0.095551, 0.030121, -0.080963, + -0.042938, 0.091400, 0.075287, 0.011597, -0.023834, -0.035278, + -0.009552, -0.030884, -0.058044, -0.038818, 0.016785, 0.037354, + -0.004852, -0.048157, -0.051849, 0.014618, 0.067535, 0.060547, + 0.029022, -0.019257, -0.078705, -0.057495, 0.056549, -0.016022, + -0.145416, -0.142548, -0.124207, -0.015961, 0.118011, 0.059906, + -0.050842, -0.037537, -0.042084, -0.060059, -0.034454, -0.011414, + 0.040009, 0.084778, 0.039246, -0.029663, -0.059631, -0.023285, + 0.033173, 0.044617, -0.023254, -0.044983, -0.039337, -0.037506, + 0.024750, 0.034637, -0.024902, -0.007019, -0.006195, 0.021271, + 0.067657, 0.043182, 0.004089, -0.043091, -0.077576, -0.118225, + -0.100006, -0.084015, -0.117065, -0.140533, -0.091675, 0.001709, + 0.019196, -0.053619, -0.090454, -0.007599, 0.064209, 0.048920, + -0.077576, -0.158813, 0.000214, 0.086823, 0.027100, 0.065979, + 0.028351, -0.032745, -0.089844, -0.026672, 0.033234, -0.002045, + -0.068665, -0.114441, -0.152344, -0.166840, -0.129181, -0.077667, + -0.001678, 0.082428, 0.123138, 0.048737, -0.080750, -0.094452, + -0.066895, -0.061401, -0.009613, -0.021729, 0.015442, 0.051270, + -0.017273, -0.013519, 0.007172, -0.065338, -0.133209, -0.104095, + -0.069153, -0.047638, -0.011871, -0.043182, -0.056427, 0.028900, + 0.031128, -0.004974, -0.057983, -0.129303, -0.086914, -0.039917, + -0.016266, 0.033936, 0.017426, 0.021576, 0.037964, -0.003693, + -0.009979, 0.064392, 0.022491, -0.075836, -0.030457, 0.040741, + 0.075745, 0.076447, 0.034851, -0.042816, -0.058960, -0.049591, + -0.033905, -0.005127, -0.015778, -0.011963, 0.043091, 0.093231, + 0.070007, 0.060211, 0.045074, 0.039642, 0.041260, 0.015594, + 0.016663, 0.032867, 0.031250, 0.009583, -0.011230, 0.009247, + 0.050415, 0.087524, 0.040375, -0.017792, -0.023621, -0.033478, + 0.012543, 0.010864, 0.016724, 0.047638, 0.089905, 0.132141, + 0.089111, 0.045471, -0.019409, -0.041229, 0.011597, -0.053101, + -0.105194, -0.104187, -0.087799, -0.061951, -0.055634, 0.003082, + 0.064270, 0.062744, 0.022552, 0.045837, 0.096985, 0.080139, + 0.028015, -0.003204, -0.035553, -0.006714, 0.071960, 0.052155, + -0.085815, -0.133209, -0.086212, -0.063507, -0.040466, -0.048065, + -0.071106, -0.006256, 0.013641, 0.026611, 0.101166, 0.072357, + 0.070557, 0.060333, -0.004028, -0.012787, -0.003387, 0.000793, + -0.042328, -0.083740, -0.114532, -0.106598, 0.000183, 0.052155, + -0.011536, -0.042480, 0.040649, 0.096161, 0.074463, 0.033417, + -0.013824, 0.006500, 0.001068, 0.052094, 0.065125, 0.027496, + -0.009613, -0.042542, -0.053436, -0.047607, -0.063080, -0.003693, + 0.001129, -0.113068, -0.136444, -0.046387, 0.056641, 0.095581, + 0.071533, 0.006836, 0.015869, 0.094147, 0.035950, -0.057190, + 0.013245, 0.040802, 0.020050, -0.008636, -0.041199, -0.051025, + -0.049683, -0.065826, -0.073303, -0.081909, -0.105347, -0.019348, + 0.024902, 0.007904, 0.010712, -0.030792, -0.059875, -0.052521, + -0.065125, -0.029419, 0.076965, 0.043243, 0.022247, 0.019684, + -0.016968, 0.026611, 0.010071, -0.047852, -0.037903, -0.015839, + -0.032013, -0.055054, -0.145294, -0.203003, -0.141785, -0.069946, + -0.011261, 0.027435, -0.020538, -0.047455, -0.046051, -0.035400, + -0.006287, 0.014496, 0.004425, 0.001251, 0.003479, 0.023132, + 0.102905, 0.105377, 0.013947, -0.088074, -0.138519, -0.089172, + 0.021210, 0.031830, -0.057739, -0.066895, -0.024292, 0.001801, + -0.027924, -0.053284, -0.022003, 0.012726, 0.011047, -0.005920, + -0.033295, -0.049042, -0.025055, 0.031738, 0.031097, 0.004059, + 0.008698, 0.054688, 0.046570, -0.022980, -0.080597, -0.092163, + -0.052277, -0.003967, -0.026337, -0.039886, 0.025238, 0.037323, + 0.005829, -0.014282, 0.028442, 0.057098, 0.003662, -0.038483, + -0.050537, -0.017151, 0.031555, -0.025391, -0.038452, -0.011871, + -0.042664, 0.015411, 0.065277, 0.015594, -0.015778, -0.036652, + -0.097076, -0.057983, 0.001434, 0.002991, -0.016724, -0.071564, + -0.036926, 0.038452, 0.049683, 0.071075, 0.066925, 0.007935, + -0.028351, -0.003754, 0.020569, -0.008881, -0.016998, -0.024841, + -0.031677, 0.005615, 0.019470, -0.028290, -0.035645, -0.012756, + -0.014191, -0.027496, -0.002411, -0.018066, 0.012177, 0.103668, + 0.134277, 0.056885, 0.027893, -0.002533, -0.008148, 0.018707, + -0.005615, 0.004822, 0.055634, 0.054718, 0.003296, -0.046875, + -0.058838, -0.034149, 0.031616, 0.020233, -0.014771, -0.005981, + 0.025391, 0.043091, 0.010376, 0.006866, 0.037842, 0.053589, + 0.037567, 0.042938, 0.063629, -0.000092, -0.056000, -0.045074, + -0.034454, -0.006531, 0.004303, -0.034882, -0.026886, 0.056580, + 0.066437, 0.025757, 0.036255, 0.066376, 0.017395, -0.030701, + -0.042419, -0.049744, -0.013733, 0.006653, -0.036713, -0.045166, + -0.008270, 0.011841, 0.049622, 0.086792, 0.052460, 0.037872, + -0.009338, -0.074890, -0.007385, 0.029053, 0.002991, -0.001862, + -0.055817, -0.109833, -0.082581, -0.018097, -0.005829, -0.006561, + -0.038422, -0.026855, 0.067139, 0.051575, -0.023956, 0.005768, + 0.032318, -0.009094, -0.031799, -0.019714, -0.075714, -0.137512, + -0.110962, -0.081360, -0.014679, -0.015259, -0.067322, -0.077271, + -0.073303, -0.035583, 0.033325, 0.059540, 0.034912, 0.015411, + -0.013214, -0.019135, -0.013306, -0.024170, -0.043640, -0.067596, + -0.077026, -0.050446, -0.039398, -0.074158, -0.079590, -0.077148, + -0.119843, -0.070496, 0.023834, 0.030396, -0.002869, -0.011810, + -0.001465, 0.025299, 0.031250, 0.045990, 0.034027, -0.058624, + -0.070892, -0.031067, -0.025360, -0.042572, -0.063507, -0.054352, + -0.028412, -0.001923, -0.037018, -0.048157, -0.007141, -0.003357, + 0.013916, 0.035767, 0.035034, 0.038391, 0.011749, -0.011780, + -0.033905, -0.065521, -0.075470, -0.065491, -0.065125, -0.079376, + -0.044281, -0.014130, -0.000458, 0.024017, 0.021973, -0.004120, + 0.026245, 0.043976, -0.009155, -0.035187, -0.030853, -0.042633, + 0.002563, 0.055603, 0.021820, -0.057800, -0.074646, -0.015411, + 0.045898, 0.007233, -0.055756, -0.016113, 0.035370, 0.023315, + -0.017120, -0.024292, 0.004974, 0.041718, 0.045227, -0.000793, + 0.025970, 0.086670, 0.042450, -0.023834, -0.054077, -0.036926, + 0.028320, 0.006622, 0.005341, 0.059265, 0.049164, 0.011841, + 0.019470, 0.004242, -0.035248, -0.009949, 0.027069, 0.029419, + 0.042816, 0.043671, 0.012878, 0.023865, 0.027802, -0.000854, + 0.006348, 0.039337, 0.040802, -0.013275, -0.055634, -0.029480, + -0.013092, -0.033936, -0.040649, -0.001404, 0.038910, 0.046722, + 0.033447, -0.020294, -0.040283, -0.014923, -0.003143, -0.001312, + 0.005493, 0.002899, 0.037140, 0.062469, 0.038696, 0.002747, + -0.012482, -0.009827, -0.004486, -0.011780, -0.018097, -0.014862, + -0.008057, -0.056702, -0.049561, 0.025269, 0.046844, 0.003296, + 0.014130, 0.043182, 0.018280, 0.007294, 0.008270, -0.004517, + -0.014679, -0.026764, -0.019745, -0.041779, -0.027863, 0.028412, + 0.033722, 0.020264, 0.004913, -0.004578, -0.007935, -0.006226, + -0.005737, -0.032074, -0.040955, -0.010468, -0.040863, -0.031433, + -0.004547, -0.032654, -0.038239, 0.027496, 0.010681, -0.000702, + 0.020782, -0.010376, -0.005768, 0.013733, -0.007324, -0.027466, + -0.018005, -0.033600, -0.028778, -0.036316, -0.073090, -0.050781, + -0.029938, -0.037567, -0.035828, -0.036163, -0.035828, -0.005249, + -0.005646, -0.002289, 0.011078, -0.014038, -0.035309, 0.000061, + 0.010101, -0.028961, -0.035950, -0.053802, -0.066620, -0.048981, + -0.030823, -0.034515, 0.008972, 0.030731, -0.021942, -0.069214, + -0.046722, -0.000854, 0.028656, -0.000580, -0.027313, -0.026886, + -0.060364, -0.051880, -0.022766, -0.019531, -0.016418, -0.047089, + -0.072510, -0.054871, -0.046570, -0.053772, -0.021820, 0.003204, + 0.010406, 0.000793, -0.037170, -0.023926, 0.025269, 0.054657, + 0.057159, 0.007996, -0.063232, -0.097137, -0.066803, -0.021606, + -0.015015, -0.037842, -0.045776, -0.054840, -0.068481, -0.033081, + 0.026459, 0.048157, 0.017700, -0.011230, -0.020599, -0.040405, + 0.001526, 0.048492, 0.023407, -0.011658, 0.004059, 0.006165, + -0.013245, 0.008118, 0.049591, 0.050262, 0.008606, -0.029175, + -0.039368, 0.003937, 0.027863, -0.005646, -0.046082, -0.043152, + -0.002838, 0.018341, 0.006012, -0.001282, 0.015137, 0.004425, + -0.018524, -0.001343, 0.009308, 0.002350, -0.013306, -0.014832, + -0.008759, 0.000671, 0.023254, 0.035645, 0.005646, -0.028717, + -0.028931, -0.008484, -0.019043, -0.019928, 0.006042, 0.016083, + 0.023682, 0.034363, 0.020844, 0.016235, 0.008636, 0.003601, + 0.018646, 0.029480, 0.034088, 0.016327, 0.004761, -0.029022, + -0.027893, -0.006836, -0.015350, -0.021820, -0.018250, -0.008026, + -0.001343, 0.004669, -0.015900, -0.004303, 0.032898, 0.041046, + 0.023132, 0.020844, 0.032196, 0.020355, -0.002716, 0.003662, + 0.031433, 0.043213, 0.043304, -0.007507, -0.015747, 0.000916, + -0.009094, 0.004852, 0.004272, 0.007507, 0.021088, 0.024017, + 0.010254, 0.023987, 0.035431, 0.006561, -0.015869, -0.004791, + 0.013885, 0.019440, -0.015106, -0.038666, -0.028625, -0.036438, + -0.051361, -0.020905, -0.019531, -0.038666, -0.015747, -0.001587, + 0.006317, 0.024994, 0.022797, 0.012726, -0.004822, 0.001404, + -0.006042, 0.000732, 0.008118, -0.024506, -0.045654, -0.037537, + -0.024933, -0.026733, -0.038605, -0.051971, -0.050171, -0.031372, + -0.041199, -0.012268, -0.006500, -0.038208, -0.053650, -0.021118, + 0.007324, 0.006561, -0.026459, -0.052338, -0.015717, -0.015106, + -0.037018, -0.037720, -0.047852, -0.032562, -0.014557, -0.059265, + -0.101318, -0.091644, -0.050659, -0.037628, -0.000763, 0.016144, + -0.018799, -0.022827, -0.005707, -0.010712, -0.012054, -0.007019, + -0.008881, -0.000702, -0.000427, -0.015594, -0.030426, -0.015778, + -0.019501, -0.064423, -0.072540, -0.041229, -0.012177, -0.007294, + -0.034027, -0.059723, -0.034729, -0.007629, 0.003418, -0.007751, + -0.032043, -0.034149, -0.024170, 0.007233, 0.023834, 0.008575, + 0.004669, -0.008148, -0.037811, -0.033783, 0.007996, 0.016602, + 0.014038, 0.012238, -0.009979, -0.028748, -0.014862, 0.013000, + 0.000977, -0.049530, -0.061859, -0.022247, 0.006226, 0.009369, + -0.029236, -0.031128, 0.006226, 0.009399, -0.006653, 0.001190, + -0.011993, -0.000916, 0.011322, -0.002350, 0.004333, 0.004517, + -0.014191, -0.012177, 0.010986, 0.011566, -0.000092, -0.010651, + -0.014038, -0.005280, -0.000732, -0.007935, -0.017303, -0.019073, + -0.009399, 0.007935, 0.015778, 0.019073, 0.004272, -0.012726, + 0.001434, 0.011963, 0.010162, 0.018555, 0.018036, 0.008789, + 0.000946, 0.009552, 0.014923, 0.033722, 0.048553, 0.019989, + -0.010803, -0.026733, -0.012207, 0.012512, -0.003967, -0.018097, + 0.002289, 0.032410, 0.036804, 0.025970, 0.013550, 0.008301, + 0.011108, 0.012421, 0.010101, 0.001404, -0.010956, 0.010498, + 0.029999, 0.014221, 0.003937, 0.002563, -0.001709, -0.013428, + -0.023102, -0.005188, 0.011780, 0.002655, -0.002045, 0.006348, + 0.005981, -0.011841, -0.016327, -0.004486, -0.004944, -0.030151, + -0.029114, -0.023376, -0.024261, -0.009857, 0.008423, 0.016235, + 0.021606, 0.012054, -0.005432, -0.006744, -0.003937, -0.004974, + -0.024506, -0.029541, -0.015839, -0.028381, -0.030823, -0.018036, + -0.006104, -0.003998, -0.022858, -0.030975, -0.005798, -0.001709, + -0.008850, -0.011780, -0.013031, -0.018921, -0.029480, -0.024689, + -0.012909, -0.006104, -0.006042, -0.013763, -0.018188, -0.034576, + -0.036713, -0.004517, 0.009583, -0.002106, -0.026093, -0.033875, + -0.008575, 0.006226, -0.008148, -0.032654, -0.037842, -0.024811, + -0.019714, -0.013062, -0.014771, -0.028992, -0.023376, -0.012695, + -0.007690, -0.014343, -0.031708, -0.044586, -0.036865, -0.027985, + -0.022552, -0.025208, -0.028168, -0.024933, -0.028717, -0.030212, + -0.018066, -0.004547, 0.001282, -0.008148, -0.024200, -0.023834, + -0.019623, -0.037048, -0.042877, -0.031952, -0.016998, -0.009338, + -0.014893, -0.018280, -0.013550, -0.003418, 0.013306, 0.008606, + -0.002991, -0.015350, -0.023102, -0.021118, -0.025269, -0.032654, + -0.040375, -0.028992, -0.016357, -0.034027, -0.036011, -0.016022, + -0.010284, -0.000793, 0.006805, 0.005096, 0.021973, 0.009796, + -0.012207, -0.013489, -0.014648, -0.017120, -0.017578, -0.012329, + -0.002472, 0.000397, -0.013031, -0.018890, -0.009338, -0.018280, + -0.017670, -0.005920, -0.004944, -0.006073, -0.003479, 0.000610, + 0.009003, 0.010559, 0.011475, -0.003693, -0.016357, -0.006378, + -0.007507, 0.000366, 0.011322, 0.012390, 0.004639, -0.002655, + 0.003754, 0.027283, 0.016052, -0.008575, -0.005615, 0.004303, + 0.013550, 0.018677, 0.003662, -0.022858, -0.028168, -0.017975, + -0.002197, -0.012360, -0.022736, -0.016144, 0.003784, 0.018951, + 0.008270, -0.005707, -0.008514, 0.007446, 0.015717, 0.012177, + 0.011414, 0.010590, 0.013367, 0.008331, 0.002686, -0.003876, + -0.009857, -0.024902, -0.021973, -0.014557, -0.012756, -0.001251, + 0.004303, 0.005402, 0.009460, 0.002960, -0.009003, -0.003784, + 0.009430, 0.008484, 0.006012, 0.014130, 0.008148, -0.002441, + 0.000397, 0.002686, -0.000214, -0.014557, -0.026489, -0.014587, + -0.009918, -0.006805, -0.001221, -0.004089, -0.003601, -0.006226, + -0.020142, -0.023315, -0.005341, 0.012421, 0.008545, -0.002472, + -0.000366, 0.000580, -0.020508, -0.033752, -0.029205, 0.000031, + 0.017365, 0.012390, -0.008514, -0.017181, -0.018311, -0.016663, + -0.008301, -0.013519, -0.010376, 0.011841, 0.002930, -0.016510, + -0.025116, -0.029968, -0.015289, -0.003082, -0.007355, -0.010590, + -0.012451, -0.021759, -0.028351, -0.040375, -0.041840, -0.027374, + -0.014343, -0.018005, -0.024628, -0.018188, -0.009644, -0.003723, + -0.009644, -0.005341, 0.003204, 0.002045, 0.007629, -0.003815, + -0.013062, -0.010193, -0.003540, -0.012268, -0.019501, -0.025330, + -0.040314, -0.039520, -0.035187, -0.034180, -0.032257, -0.036285, + -0.029572, -0.008575, -0.002045, -0.012787, -0.010559, -0.006317, + -0.005371, -0.003693, 0.000519, 0.000854, -0.010101, -0.017090, + -0.023499, -0.034790, -0.033569, -0.025818, -0.007507, 0.004913, + -0.004089, -0.011780, -0.008759, -0.004150, -0.002411, -0.004059, + -0.002960, -0.007416, -0.012177, -0.015289, -0.024750, -0.033478, + -0.035461, -0.029419, -0.022003, -0.013306, -0.006958, -0.007996, + -0.011658, -0.013916, -0.017303, -0.011261, -0.000061, 0.009674, + -0.001404, -0.013245, -0.006226, 0.010773, 0.012482, 0.002075, + -0.006165, -0.007172, -0.014618, -0.021759, -0.029266, -0.024841, + -0.018005, -0.015350, -0.010590, -0.002075, -0.000427, -0.009308, + -0.007721, 0.007782, 0.010223, -0.001434, -0.007141, -0.005127, + 0.000458, 0.005920, -0.006500, -0.018921, -0.012726, -0.007416, + -0.009033, -0.015900, -0.021088, -0.017761, -0.007172, 0.002289, + 0.004333, 0.003174, -0.000427, -0.001678, 0.002289, 0.004974, + 0.009552, 0.002380, -0.014374, -0.013824, -0.005890, 0.003998, + -0.002014, -0.013367, -0.010315, -0.002380, 0.001129, -0.001160, + -0.001404, -0.001190, -0.001526, 0.001007, 0.003082, 0.006836, + 0.008820, 0.000153, -0.008972, -0.013184, -0.014343, -0.009430, + 0.003571, 0.000214, -0.013214, -0.011261, -0.001312, 0.003754, + 0.002899, -0.000946, 0.000641, 0.006195, 0.011322, 0.013245, + 0.004120, -0.001862, 0.003448, -0.003998, -0.018250, -0.020447, + -0.012054, -0.001129, 0.005615, 0.000366, -0.010773, -0.015564, + -0.014343, -0.011566, -0.001862, 0.015198, 0.010162, -0.002991, + -0.011261, -0.014008, -0.009399, -0.007416, -0.005219, -0.015411, + -0.026123, -0.031647, -0.035095, -0.028290, -0.016052, -0.008423, + 0.005615, 0.007233, 0.001984, 0.000610, -0.002319, -0.006866, + -0.002045, 0.008636, 0.003754, -0.008575, -0.016907, -0.011536, + -0.000336, -0.003998, -0.022400, -0.038818, -0.039948, -0.029755, + -0.016785, -0.009705, -0.006805, -0.004303, -0.004578, 0.000610, + 0.003265, 0.004669, 0.009857, 0.002899, -0.009552, -0.020294, + -0.019928, -0.016083, -0.013214, -0.015503, -0.017700, -0.026581, + -0.025879, -0.020721, -0.018066, -0.015503, -0.007690, -0.002258, + -0.009827, -0.018951, -0.014099, 0.002808, -0.002075, -0.026947, + -0.024506, -0.009277, -0.004822, -0.011108, -0.018372, -0.022125, + -0.023804, -0.016144, -0.012726, -0.012939, -0.015900, -0.017456, + -0.020294, -0.023834, -0.023499, -0.018311, -0.011108, -0.010162, + -0.014404, -0.022705, -0.025330, -0.021057, -0.012543, -0.008575, + -0.014557, -0.022614, -0.021637, -0.015259, -0.015778, -0.022156, + -0.021210, -0.009552, -0.002014, -0.002991, -0.004242, -0.007141, + -0.006256, 0.002106, 0.003235, -0.003021, -0.017426, -0.015259, + -0.001312, -0.001801, -0.014191, -0.020935, -0.021057, -0.015533, + -0.015717, -0.018311, -0.010223, -0.008209, -0.012451, -0.011780, + -0.009735, -0.007355, -0.002075, -0.002441, -0.004578, -0.003204, + -0.001556, 0.004944, 0.002563, -0.006073, -0.011993, -0.016632, + -0.019226, -0.006805, -0.000183, -0.006500, -0.015717, -0.014038, + -0.000397, 0.008484, 0.005920, -0.000946, -0.011963, -0.019440, + -0.017731, -0.018921, -0.017548, -0.013885, -0.005188, -0.006653, + -0.008759, -0.006958, -0.001801, 0.008545, 0.005371, -0.000854, + 0.009125, 0.016113, 0.010284, 0.000671, 0.000427, 0.001129, + -0.002319, -0.002441, -0.004639, -0.016052, -0.027039, -0.020142, + -0.014404, -0.010834, -0.014771, -0.016449, -0.005493, 0.006958, + 0.014160, 0.011536, 0.011383, 0.012939, 0.011261, 0.014923, + 0.015015, 0.006653, -0.001007, -0.004852, -0.007660, -0.005371, + -0.011505, -0.018555, -0.018219, -0.016571, -0.016296, -0.012878, + -0.010834, -0.004333, 0.006073, 0.015350, 0.016510, 0.006653, + 0.004761, 0.005463, 0.004578, 0.005615, -0.005066, -0.016602, + -0.022308, -0.018890, -0.014191, -0.016937, -0.015198, -0.017548, + -0.023987, -0.020905, -0.009735, 0.002838, 0.008484, 0.005280, + 0.002258, -0.002075, -0.007416, -0.008423, 0.001434, 0.002167, + -0.007843, -0.008911, -0.010223, -0.019226, -0.026428, -0.023224, + -0.016083, -0.008850, -0.007965, -0.013062, -0.014496, -0.011932, + -0.012146, -0.006561, -0.003876, -0.009155, -0.013916, -0.009735, + -0.004211, -0.001007, -0.003510, -0.014709, -0.022949, -0.021484, + -0.018311, -0.014404, -0.010406, -0.010162, -0.011993, -0.018890, + -0.022430, -0.016144, -0.008514, -0.009796, -0.012207, -0.007843, + -0.007629, -0.009552, -0.012970, -0.012115, -0.012360, -0.016022, + -0.018768, -0.015167, -0.009979, -0.018616, -0.029205, -0.025421, + -0.019531, -0.024902, -0.026733, -0.019989, -0.008331, -0.004913, + -0.007202, -0.002045, -0.007599, -0.011841, -0.006897, -0.009277, + -0.016449, -0.015991, -0.009674, -0.008331, -0.008636, -0.023621, + -0.036377, -0.031158, -0.025909, -0.023895, -0.022827, -0.025177, + -0.027008, -0.023590, -0.016907, -0.007324, -0.000671, -0.000610, + -0.002167, -0.003876, -0.002350, 0.000061, -0.001801, -0.008392, + -0.008636, -0.007385, -0.014893, -0.015808, -0.013458, -0.015198, + -0.015320, -0.011108, -0.010956, -0.016937, -0.018463, -0.015839, + -0.013367, -0.010223, -0.006500, -0.000977, -0.001221, -0.005981, + -0.010162, -0.005768, 0.003784, 0.003204, -0.008118, -0.015747, + -0.014709, -0.012238, -0.012604, -0.008453, 0.000916, 0.003510, + 0.000305, -0.000305, 0.003998, 0.001526, 0.003571, 0.006500, + 0.003937, -0.001678, -0.004547, -0.003815, -0.001740, -0.007568, + -0.011597, -0.011841, -0.015015, -0.013550, -0.012543, -0.006470, + -0.002197, -0.006775, -0.002075, 0.008118, 0.005157, -0.002197, + -0.004211, -0.000397, 0.005280, 0.001587, -0.003357, 0.001526, + 0.003876, 0.008209, 0.004669, -0.004700, -0.007050, -0.007294, + -0.005280, -0.003357, -0.007416, -0.008423, -0.002808, -0.000336, + -0.005280, -0.012787, -0.008026, 0.002869, 0.000336, -0.000580, + -0.000488, -0.002960, 0.002380, 0.002991, -0.001526, -0.002197, + -0.006226, -0.009552, -0.007568, -0.001160, 0.000153, 0.001923, + -0.005798, -0.014557, -0.013367, -0.006805, -0.000610, 0.006104, + 0.003143, -0.001343, -0.000610, 0.001526, 0.005249, 0.000244, + -0.009064, -0.010223, -0.010651, -0.012787, -0.010101, -0.012970, + -0.016266, -0.014404, -0.009064, -0.006287, -0.005219, -0.004089, + -0.007629, -0.009796, -0.011566, -0.007294, -0.001251, -0.005035, + -0.015533, -0.016998, -0.011566, -0.005981, -0.007782, -0.008026, + -0.007599, -0.011230, -0.014740, -0.016907, -0.019073, -0.020477, + -0.016113, -0.012146, -0.009918, -0.009186, -0.020874, -0.031067, + -0.026611, -0.017303, -0.009125, -0.004517, -0.008972, -0.015198, + -0.019714, -0.022827, -0.020172, -0.020660, -0.021454, -0.022186, + -0.023254, -0.018036, -0.010864, -0.016266, -0.027252, -0.028656, + -0.022003, -0.016174, -0.017212, -0.020203, -0.025421, -0.025757, + -0.021362, -0.015717, -0.008392, -0.006927, -0.019958, -0.031830, + -0.027588, -0.021820, -0.019470, -0.021454, -0.024261, -0.020508, + -0.019043, -0.015411, -0.010132, -0.007294, -0.004272, -0.002014, + -0.003448, -0.009735, -0.011780, -0.013611, -0.019714, -0.020172, + -0.016846, -0.018127, -0.017578, -0.018402, -0.018860, -0.013245, + -0.007629, -0.010132, -0.009064, -0.005676, -0.004395, -0.006256, + -0.011292, -0.013367, -0.003784, 0.003387, 0.001434, 0.000336, + -0.004059, -0.006592, -0.003845, -0.003815, -0.002472, -0.004150, + -0.012390, -0.016998, -0.015350, -0.013214, -0.012360, -0.016418, + -0.014496, 0.000580, 0.008881, 0.005951, -0.000122, -0.006378, + -0.008850, -0.005432, 0.001007, 0.002441, -0.002869, -0.007690, + -0.006866, -0.001434, 0.000641, -0.004303, -0.006592, -0.005096, + -0.005280, -0.002838, 0.000946, 0.001160, -0.001465, -0.004822, + -0.006439, 0.003113, 0.008392, 0.001556, -0.005768, -0.010437, + -0.009705, -0.006042, -0.000183, 0.002869, -0.003876, -0.012512, + -0.007843, 0.003845, 0.009796, 0.009583, 0.005035, 0.005737, + 0.006104, 0.001007, 0.003143, 0.004791, 0.003143, 0.001068, + -0.005798, -0.008423, -0.002563, 0.001678, -0.002747, -0.008911, + -0.010468, -0.002808, 0.005646, 0.002075, -0.003235, -0.006866, + -0.007019, -0.001160, 0.002167, 0.001343, -0.000519, -0.005615, + -0.009399, -0.009613, -0.013336, -0.015533, -0.016418, -0.012970, + -0.011078, -0.015320, -0.020721, -0.014709, -0.002625, -0.004547, + -0.011932, -0.007599, -0.000671, 0.000336, -0.002747, -0.008148, + -0.012939, -0.017944, -0.020538, -0.018494, -0.014221, -0.013824, + -0.019470, -0.023163, -0.020203, -0.016968, -0.017578, -0.018372, + -0.015533, -0.012726, -0.010101, -0.011017, -0.015533, -0.014130, + -0.005890, -0.002625, -0.003693, -0.005676, -0.009369, -0.013184, + -0.013855, -0.010925, -0.013184, -0.020294, -0.029968, -0.031219, + -0.023285, -0.019897, -0.019623, -0.016327, -0.013855, -0.016724, + -0.020813, -0.016602, -0.010651, -0.011505, -0.016449, -0.019623, + -0.019440, -0.016449, -0.014465, -0.010742, -0.011658, -0.013184, + -0.011017, -0.009277, -0.010284, -0.015991, -0.017731, -0.017487, + -0.021362, -0.018799, -0.017151, -0.020599, -0.023529, -0.024567, + -0.026733, -0.024414, -0.019440, -0.019257, -0.022400, -0.019501, + -0.015320, -0.016235, -0.016815, -0.011505, -0.003601, -0.002014, + -0.007141, -0.013214, -0.009186, -0.001862, -0.000214, -0.003784, + -0.008972, -0.011871, -0.012512, -0.010986, -0.008789, -0.010010, + -0.014496, -0.018829, -0.018005, -0.018677, -0.015625, -0.011108, + -0.011902, -0.012970, -0.009338, -0.003265, -0.002136, -0.004608, + -0.001556, 0.001312, -0.000580, -0.000793, -0.001526, -0.003998, + -0.006653, -0.008698, -0.007599, -0.002319, -0.002045, -0.005280, + -0.009521, -0.008911, -0.003693, -0.002594, -0.002319, 0.003296, + 0.004761, -0.001495, -0.008972, -0.011627, -0.002655, 0.006042, + 0.002441, -0.002960, -0.006226, -0.012512, -0.013763, -0.004333, + 0.002838, 0.004913, 0.000854, -0.008057, -0.007050, 0.005707, + 0.013733, 0.010284, 0.002319, 0.001495, 0.007111, 0.002594, + -0.005615, -0.010315, -0.011383, -0.011566, -0.004608, 0.003754, + 0.001587, -0.008179, -0.013885, -0.005798, 0.004761, 0.004547, + -0.000122, -0.002960, -0.001862, 0.002350, 0.002075, -0.000458, + -0.002045, 0.000488, 0.003113, -0.000061, -0.005127, -0.008575, + -0.013306, -0.017914, -0.019897, -0.016449, -0.010254, -0.004974, + -0.003845, -0.003754, -0.007477, -0.011780, -0.007965, 0.001221, + 0.006195, 0.001282, -0.008453, -0.015778, -0.012177, -0.005676, + -0.002319, -0.003021, -0.009064, -0.014832, -0.016693, -0.014740, + -0.011658, -0.009583, -0.010559, -0.012421, -0.005920, -0.002563, + -0.007324, -0.013000, -0.013031, -0.008057, -0.007965, -0.011230, + -0.015594, -0.017822, -0.019257, -0.018280, -0.014008, -0.012604, + -0.016388, -0.018280, -0.014099, -0.008820, -0.009674, -0.010742, + -0.008087, -0.006287, -0.008667, -0.010742, -0.011505, -0.013489, + -0.010864, -0.007874, -0.013336, -0.020386, -0.019928, -0.016479, + -0.014038, -0.014313, -0.017303, -0.017822, -0.017761, -0.018524, + -0.015137, -0.011749, -0.012238, -0.014832, -0.018097, -0.018616, + -0.015564, -0.014252, -0.014923, -0.013306, -0.012817, -0.014618, + -0.017059, -0.019623, -0.019012, -0.016052, -0.011261, -0.007538, + -0.005249, -0.005554, -0.007416, -0.005096, -0.004547, -0.011108, + -0.017639, -0.018829, -0.017639, -0.018921, -0.019073, -0.016968, + -0.013031, -0.008179, -0.004395, -0.005066, -0.005341, -0.004059, + -0.004120, -0.005463, -0.008698, -0.007538, -0.003723, -0.001068, + -0.003448, -0.007507, -0.007477, -0.005096, -0.005493, -0.009277, + -0.014526, -0.014587, -0.009613, -0.004333, -0.003082, -0.003845, + -0.004089, -0.004730, -0.003082, 0.002167, 0.002960, -0.001587, + -0.004944, -0.004333, 0.000336, 0.002686, -0.000610, -0.007721, + -0.010895, -0.006561, -0.003143, 0.000214, 0.004242, 0.003082, + -0.001221, -0.002747, -0.000305, 0.004822, 0.005341, 0.000702, + -0.001343, -0.000519, -0.001678, -0.004944, -0.006104, -0.004913, + -0.003998, -0.005066, -0.005188, -0.002289, -0.000214, -0.000061, + -0.000031, 0.000732, 0.002563, 0.005432, 0.004272, 0.001160, + 0.000244, -0.000580, -0.001251, -0.002228, -0.003143, -0.001953, + -0.001740, -0.004669, -0.006592, -0.006805, -0.005981, -0.004425, + -0.005737, -0.005920, -0.004120, -0.001984, -0.000092, 0.000702, + 0.001282, 0.001068, 0.001862, 0.001923, 0.000763, -0.001038, + -0.004578, -0.007111, -0.007355, -0.005035, -0.003113, -0.004395, + -0.006500, -0.006958, -0.005951, -0.004181, -0.005341, -0.006348, + -0.004761, -0.003723, -0.003235, -0.003510, -0.002869, -0.002136, + -0.003784, -0.005585, -0.005463, -0.004761, -0.003998, -0.003876, + -0.004700, -0.004578, -0.005066, -0.006714, -0.007812, -0.007568, + -0.005737, -0.004028, -0.004517, -0.005341, -0.005981, -0.006317, + -0.005310, -0.005066, -0.006348, -0.006989, -0.005737, -0.005005, + -0.006042, -0.005920, -0.004150, -0.003784, -0.005127, -0.006653, + -0.006500, -0.003906, -0.002594, -0.003967, -0.005798, -0.006927, + -0.006927, -0.006836, -0.006378, -0.005188, -0.004059, -0.003906, + -0.004944, -0.005371, -0.005066, -0.004639, -0.004578, -0.004608, + -0.004150, -0.003815, -0.003326, -0.002777, -0.002686, -0.002991, + -0.003082, -0.003540, -0.003998, -0.003906, -0.004517, -0.005280, + -0.005371, -0.004730, -0.003723, -0.003693, -0.004028, -0.003845, + -0.003082, -0.002655, -0.002991, -0.003754, -0.003479, -0.002808, + -0.003174, -0.002991, -0.002563, -0.002136, -0.001678, -0.001526, + -0.002350, -0.003021, -0.003540, -0.003845, -0.003052, -0.002106, + -0.002258, -0.002869, -0.002838, -0.002777, -0.002319, -0.001434, + -0.000977, -0.000793, -0.001007, -0.001129, -0.001343, -0.001526, + -0.001892, -0.002441, -0.002960, -0.003021, -0.002197, -0.001587, + -0.001526, -0.001373, -0.001282, -0.001007, -0.000549, 0.000366, + 0.000763, 0.000336, -0.000244, -0.000854, -0.001190, -0.000946, + -0.000610, -0.000854, -0.001465, -0.001923, -0.001892, -0.001648, + -0.001068, -0.000366, -0.000061, -0.000244, -0.000580, -0.000671, + -0.000549, -0.000183, 0.000000, -0.000031, 0.000000, -0.000031, + -0.000336, -0.000519, -0.000610, -0.000671, -0.000519, -0.000671, + -0.000824, -0.000519, -0.000244, -0.000183, -0.000092, -0.000092, + -0.000244, -0.000366, -0.000366, -0.000305, -0.000153, -0.000092 +}; diff --git a/plugins/ladspa_effect/caps/waves/money.h b/plugins/ladspa_effect/caps/waves/money.h new file mode 100644 index 000000000..c20a11b66 --- /dev/null +++ b/plugins/ladspa_effect/caps/waves/money.h @@ -0,0 +1,2715 @@ +#ifndef _MONEY_H_ +#define _MONEY_H_ + +float money [] = { + 0.000000, 0.000000, 0.000000, 0.000226, 0.000454, + 0.000684, 0.000686, 0.000688, 0.000690, 0.000693, 0.000926, + 0.000929, 0.001165, 0.001169, 0.001173, 0.001412, 0.001416, + 0.001421, 0.001425, 0.001668, 0.001673, 0.001918, 0.001924, + 0.002171, 0.002178, 0.002670, 0.002678, 0.002687, 0.002940, + 0.003194, 0.003697, 0.003708, 0.003967, 0.004228, 0.004490, + 0.004754, 0.004266, 0.005034, 0.004796, 0.005064, 0.005078, + 0.005093, 0.005108, 0.005379, 0.005652, 0.005668, 0.005943, + 0.005960, 0.005977, 0.005994, 0.006011, 0.006553, 0.006309, + 0.006590, 0.006873, 0.007157, 0.007178, 0.007464, 0.007485, + 0.008042, 0.008064, 0.008087, 0.008109, 0.008402, 0.008426, + 0.008994, 0.009018, 0.008769, 0.009067, 0.009092, 0.009117, + 0.009141, 0.009166, 0.009469, 0.009494, 0.009799, 0.009545, + 0.009852, 0.009878, 0.010187, 0.010213, 0.010525, 0.010552, + 0.011152, 0.010894, 0.010922, 0.011239, 0.011268, 0.011297, + 0.011616, 0.011646, 0.011676, 0.011413, 0.011735, 0.012059, + 0.012385, 0.012416, 0.013040, 0.012776, 0.013106, 0.013106, + 0.012808, 0.013106, 0.013106, 0.013106, 0.013106, 0.013106, + 0.012808, 0.013106, 0.013106, 0.013106, 0.012808, 0.013403, + 0.012808, 0.013106, 0.013106, 0.013403, 0.013701, 0.013701, + 0.013701, 0.013403, 0.013403, 0.013403, 0.013403, 0.013701, + 0.013701, 0.013701, 0.013403, 0.013701, 0.013403, 0.013403, + 0.013106, 0.012808, 0.013106, 0.012808, 0.013106, 0.012808, + 0.012510, 0.012510, 0.012510, 0.012510, 0.012510, 0.012510, + 0.012212, 0.012510, 0.011914, 0.011914, 0.011616, 0.011616, + 0.011616, 0.011318, 0.011318, 0.011021, 0.011021, 0.010723, + 0.010723, 0.010127, 0.010127, 0.010127, 0.010127, 0.009829, + 0.010127, 0.009531, 0.009829, 0.009233, 0.009233, 0.008936, + 0.008638, 0.008340, 0.008340, 0.008042, 0.008042, 0.008042, + 0.007744, 0.007446, 0.007149, 0.007149, 0.006553, 0.006851, + 0.006553, 0.006255, 0.005957, 0.006255, 0.005659, 0.005659, + 0.005361, 0.005064, 0.004766, 0.004766, 0.004468, 0.004468, + 0.003872, 0.003872, 0.003276, 0.003276, 0.002681, 0.002383, + 0.002383, 0.001787, 0.001787, 0.001787, 0.001489, 0.001489, + 0.000596, 0.000894, 0.000596, 0.000298, 0.000298, 0.000000, + 0.000000, -0.000298, -0.000596, -0.000894, -0.000894, -0.001489, + -0.001787, -0.002085, -0.001787, -0.002681, -0.002681, -0.003276, + -0.003574, -0.003872, -0.004170, -0.004170, -0.004766, -0.004468, + -0.004468, -0.004766, -0.005361, -0.005361, -0.005659, -0.005957, + -0.006255, -0.006851, -0.006851, -0.007744, -0.007744, -0.008042, + -0.008340, -0.008638, -0.008638, -0.008936, -0.009233, -0.009531, + -0.009829, -0.009531, -0.009829, -0.009829, -0.009829, -0.010127, + -0.010723, -0.010723, -0.010723, -0.011318, -0.011318, -0.011616, + -0.011914, -0.012212, -0.012510, -0.012212, -0.012510, -0.012510, + -0.013106, -0.012808, -0.013403, -0.013403, -0.013403, -0.013701, + -0.013701, -0.013701, -0.013999, -0.014297, -0.014595, -0.014595, + -0.014297, -0.014893, -0.014893, -0.015191, -0.015191, -0.015488, + -0.015191, -0.015786, -0.015786, -0.016084, -0.016382, -0.016680, + -0.016680, -0.016978, -0.017276, -0.017276, -0.017573, -0.017573, + -0.018169, -0.017871, -0.018169, -0.018467, -0.018169, -0.018765, + -0.018765, -0.018467, -0.019063, -0.019361, -0.019361, -0.019361, + -0.019361, -0.019361, -0.019658, -0.019956, -0.019658, -0.019956, + -0.019956, -0.020254, -0.020552, -0.020552, -0.020552, -0.020552, + -0.020850, -0.021148, -0.021148, -0.020850, -0.020850, -0.021148, + -0.021446, -0.021743, -0.021446, -0.021446, -0.021743, -0.021743, + -0.021743, -0.022041, -0.022041, -0.022041, -0.022637, -0.022339, + -0.022935, -0.022339, -0.022339, -0.022041, -0.021743, -0.022339, + -0.022339, -0.022339, -0.022339, -0.022339, -0.022637, -0.022637, + -0.022637, -0.022637, -0.022637, -0.022935, -0.022637, -0.022637, + -0.022637, -0.022339, -0.022339, -0.022339, -0.022637, -0.022041, + -0.022339, -0.022041, -0.022041, -0.022637, -0.022339, -0.022339, + -0.022339, -0.022339, -0.022637, -0.022339, -0.022041, -0.022041, + -0.021743, -0.021743, -0.021743, -0.021446, -0.021446, -0.021446, + -0.021446, -0.021446, -0.021148, -0.020850, -0.020850, -0.020552, + -0.020850, -0.020254, -0.019956, -0.019361, -0.019361, -0.018765, + -0.018467, -0.018467, -0.017871, -0.017871, -0.017871, -0.017871, + -0.018169, -0.017871, -0.017573, -0.016978, -0.016382, -0.016084, + -0.016084, -0.016084, -0.015488, -0.015191, -0.015191, -0.014893, + -0.014297, -0.013701, -0.013403, -0.013106, -0.012808, -0.012510, + -0.011914, -0.011318, -0.010723, -0.010425, -0.010127, -0.008936, + -0.008936, -0.008340, -0.007744, -0.007744, -0.006851, -0.006553, + -0.006255, -0.005957, -0.005361, -0.004468, -0.003872, -0.003574, + -0.002979, -0.002383, -0.001489, -0.000894, -0.000298, 0.000000, + 0.000596, 0.000894, 0.001489, 0.002085, 0.002383, 0.002979, + 0.003872, 0.004170, 0.005064, 0.005659, 0.006553, 0.007149, + 0.007446, 0.008638, 0.009233, 0.009829, 0.010723, 0.011021, + 0.011616, 0.012212, 0.013106, 0.013701, 0.014297, 0.014893, + 0.015488, 0.016382, 0.017276, 0.017871, 0.018765, 0.019658, + 0.020552, 0.021148, 0.021743, 0.022637, 0.023233, 0.023828, + 0.024424, 0.025615, 0.026211, 0.027105, 0.027998, 0.027998, + 0.028892, 0.029488, 0.030381, 0.030977, 0.031573, 0.032168, + 0.032764, 0.033658, 0.034253, 0.034849, 0.035445, 0.035743, + 0.036636, 0.037232, 0.037530, 0.038125, 0.038721, 0.039317, + 0.040210, 0.040806, 0.041104, 0.041700, 0.041997, 0.042593, + 0.043189, 0.043487, 0.043785, 0.044380, 0.044678, 0.044976, + 0.045870, 0.046167, 0.046167, 0.046763, 0.047061, 0.047359, + 0.047061, 0.047657, 0.047955, 0.047955, 0.048550, 0.048550, + 0.048848, 0.048550, 0.048848, 0.048848, 0.048848, 0.049146, + 0.049146, 0.049742, 0.049742, 0.049742, 0.049742, 0.049444, + 0.049742, 0.049742, 0.049742, 0.049742, 0.049444, 0.049146, + 0.049146, 0.048848, 0.048848, 0.048550, 0.048550, 0.048550, + 0.048550, 0.048252, 0.048252, 0.048252, 0.047657, 0.047359, + 0.046763, 0.046763, 0.046167, 0.045870, 0.045274, 0.045274, + 0.044976, 0.044678, 0.044380, 0.043785, 0.043487, 0.042891, + 0.042593, 0.042295, 0.041997, 0.041402, 0.041104, 0.039913, + 0.039615, 0.038721, 0.038423, 0.037828, 0.037530, 0.036636, + 0.036338, 0.035445, 0.035147, 0.034551, 0.034253, 0.033658, + 0.033062, 0.032168, 0.031573, 0.030679, 0.030083, 0.029488, + 0.028892, 0.027998, 0.027403, 0.026807, 0.025913, 0.025318, + 0.024424, 0.023828, 0.023233, 0.022339, 0.021743, 0.020850, + 0.019956, 0.019361, 0.018467, 0.017573, 0.016978, 0.015786, + 0.015191, 0.014297, 0.013701, 0.012808, 0.012510, 0.011318, + 0.010425, 0.009531, 0.008936, 0.008042, 0.007149, 0.006553, + 0.005659, 0.005064, 0.003872, 0.002979, 0.002383, 0.001489, + 0.000298, -0.000298, -0.000894, -0.001489, -0.002681, -0.003276, + -0.004170, -0.005064, -0.005659, -0.006553, -0.007446, -0.008340, + -0.008936, -0.010425, -0.011021, -0.011914, -0.012808, -0.013403, + -0.014297, -0.015191, -0.016382, -0.016978, -0.017573, -0.018467, + -0.019361, -0.019956, -0.021148, -0.021743, -0.022637, -0.023531, + -0.023828, -0.025020, -0.025615, -0.026211, -0.026807, -0.027700, + -0.028296, -0.029190, -0.030083, -0.030977, -0.031573, -0.032466, + -0.033062, -0.033955, -0.034849, -0.035445, -0.036338, -0.036636, + -0.037530, -0.038423, -0.039019, -0.039615, -0.040210, -0.040806, + -0.041700, -0.042295, -0.043189, -0.043487, -0.044380, -0.044976, + -0.045870, -0.046465, -0.047061, -0.047657, -0.048252, -0.048848, + -0.049146, -0.050040, -0.050337, -0.050933, -0.051529, -0.051827, + -0.052125, -0.053316, -0.053614, -0.054210, -0.054805, -0.055699, + -0.055997, -0.056592, -0.056890, -0.057486, -0.058082, -0.058380, + -0.058975, -0.059273, -0.059571, -0.060464, -0.061060, -0.061656, + -0.062549, -0.062847, -0.063741, -0.064634, -0.065528, -0.065826, + -0.066422, -0.067613, -0.068209, -0.069102, -0.069400, -0.069996, + -0.070889, -0.072081, -0.072379, -0.073272, -0.073868, -0.074166, + -0.075059, -0.075655, -0.076251, -0.077144, -0.077740, -0.078336, + -0.079527, -0.079825, -0.080421, -0.081314, -0.082208, -0.082506, + -0.083399, -0.083995, -0.085186, -0.086378, -0.087867, -0.088463, + -0.089356, -0.090846, -0.091739, -0.092633, -0.093228, -0.093824, + -0.094718, -0.095611, -0.096207, -0.097101, -0.097696, -0.098590, + -0.099483, -0.100377, -0.101568, -0.102164, -0.103356, -0.104249, + -0.105143, -0.106036, -0.106334, -0.106930, -0.107823, -0.108717, + -0.109313, -0.109908, -0.109908, -0.110802, -0.110802, -0.111100, + -0.111100, -0.110504, -0.109908, -0.109313, -0.109313, -0.109610, + -0.109610, -0.108717, -0.108717, -0.107823, -0.108121, -0.107228, + -0.106334, -0.104547, -0.103058, -0.101866, -0.100377, -0.097994, + -0.095611, -0.092633, -0.089654, -0.087271, -0.083995, -0.080719, + -0.077442, -0.075357, -0.073272, -0.072379, -0.071187, -0.069996, + -0.068507, -0.066422, -0.063443, -0.059869, -0.055401, -0.050635, + -0.046763, -0.042295, -0.039019, -0.036040, -0.033360, -0.030381, + -0.027105, -0.024126, -0.019956, -0.016084, -0.011914, -0.007744, + -0.004468, -0.000894, 0.002085, 0.005957, 0.010127, 0.014893, + 0.019658, 0.024126, 0.029190, 0.033360, 0.037530, 0.040508, + 0.043487, 0.046167, 0.049146, 0.053018, 0.056592, 0.060762, + 0.064932, 0.069102, 0.073272, 0.076846, 0.080421, 0.083101, + 0.086378, 0.089059, 0.092335, 0.095313, 0.097696, 0.100377, + 0.103356, 0.106632, 0.109313, 0.112291, 0.114972, 0.117653, + 0.121823, 0.125099, 0.127780, 0.130460, 0.132843, 0.134630, + 0.136715, 0.138502, 0.139992, 0.142077, 0.143864, 0.145949, + 0.148332, 0.150417, 0.151906, 0.153097, 0.154289, 0.155480, + 0.156374, 0.157565, 0.158459, 0.159650, 0.160544, 0.161139, + 0.161437, 0.161437, 0.161139, 0.160544, 0.160246, 0.160246, + 0.160841, 0.161139, 0.161437, 0.161437, 0.162033, 0.161437, + 0.160841, 0.159650, 0.158756, 0.157863, 0.157565, 0.156374, + 0.156374, 0.155778, 0.155480, 0.155480, 0.155182, 0.154289, + 0.153693, 0.152502, 0.151310, 0.150417, 0.148927, 0.147438, + 0.145651, 0.144162, 0.142375, 0.140885, 0.138800, 0.137311, + 0.135822, 0.134035, 0.132843, 0.131056, 0.129269, 0.127482, + 0.125695, 0.123610, 0.121227, 0.119142, 0.117355, 0.114972, + 0.113185, 0.111100, 0.109015, 0.106930, 0.104845, 0.102760, + 0.101271, 0.099186, 0.097696, 0.096207, 0.094420, 0.092335, + 0.090846, 0.088761, 0.086378, 0.083697, 0.080719, 0.078634, + 0.076251, 0.073868, 0.072379, 0.070294, 0.067911, 0.065826, + 0.063741, 0.061060, 0.058380, 0.055997, 0.053018, 0.050635, + 0.048252, 0.045870, 0.043785, 0.041402, 0.039615, 0.037232, + 0.035147, 0.032764, 0.030381, 0.028296, 0.026509, 0.024126, + 0.022339, 0.020254, 0.018169, 0.016382, 0.014297, 0.012212, + 0.010127, 0.008340, 0.006553, 0.004468, 0.002681, 0.000596, + -0.000894, -0.002383, -0.003872, -0.005659, -0.007149, -0.008638, + -0.010425, -0.012212, -0.013701, -0.015488, -0.016978, -0.018765, + -0.020552, -0.021446, -0.022339, -0.023828, -0.024722, -0.025913, + -0.027105, -0.028296, -0.029488, -0.030679, -0.031870, -0.033062, + -0.033658, -0.034551, -0.035445, -0.035743, -0.036338, -0.036636, + -0.036934, -0.037232, -0.037828, -0.037828, -0.038125, -0.038423, + -0.039019, -0.039019, -0.039317, -0.039317, -0.039615, -0.039615, + -0.039913, -0.040210, -0.040508, -0.040806, -0.040806, -0.041104, + -0.040806, -0.040806, -0.040806, -0.040806, -0.041104, -0.041104, + -0.041104, -0.041402, -0.041402, -0.041402, -0.041402, -0.041402, + -0.041104, -0.040806, -0.039913, -0.039615, -0.039019, -0.039019, + -0.038125, -0.037828, -0.037232, -0.036934, -0.036934, -0.036338, + -0.036338, -0.035743, -0.035743, -0.035445, -0.035147, -0.034849, + -0.034253, -0.033955, -0.033658, -0.033658, -0.033062, -0.033062, + -0.032764, -0.032764, -0.032764, -0.032466, -0.032466, -0.032466, + -0.031870, -0.032168, -0.032168, -0.032466, -0.032168, -0.032168, + -0.032168, -0.032466, -0.032168, -0.032168, -0.032466, -0.032466, + -0.032764, -0.033062, -0.033360, -0.033658, -0.033955, -0.034253, + -0.034849, -0.035445, -0.035743, -0.036338, -0.036934, -0.037232, + -0.038125, -0.038721, -0.039913, -0.040806, -0.041402, -0.042593, + -0.043487, -0.044678, -0.045572, -0.047061, -0.048252, -0.049742, + -0.050933, -0.052125, -0.053614, -0.054805, -0.056295, -0.057188, + -0.058677, -0.059869, -0.061358, -0.062847, -0.064337, -0.065826, + -0.067911, -0.068804, -0.070889, -0.072379, -0.074464, -0.076251, + -0.077740, -0.079825, -0.081016, -0.083399, -0.085186, -0.087271, + -0.089059, -0.090846, -0.092931, -0.095313, -0.097994, -0.100377, + -0.102462, -0.104547, -0.107526, -0.111100, -0.114078, -0.116461, + -0.118546, -0.121525, -0.124503, -0.127184, -0.129567, -0.132545, + -0.135226, -0.138205, -0.141183, -0.144459, -0.148034, -0.151310, + -0.154289, -0.157863, -0.161139, -0.164416, -0.167990, -0.171266, + -0.174543, -0.177521, -0.179904, -0.181989, -0.184372, -0.186457, + -0.187946, -0.188840, -0.190329, -0.191818, -0.193605, -0.194797, + -0.195988, -0.196882, -0.196882, -0.193605, -0.187648, -0.181096, + -0.175734, -0.171564, -0.167990, -0.165607, -0.165607, -0.168586, + -0.173947, -0.179904, -0.182883, -0.181989, -0.177819, -0.172458, + -0.166799, -0.159948, -0.153097, -0.147438, -0.144757, -0.144459, + -0.145055, -0.143864, -0.141779, -0.137311, -0.132545, -0.126290, + -0.120035, -0.114972, -0.111695, -0.109610, -0.107823, -0.103951, + -0.097994, -0.090250, -0.080719, -0.070592, -0.060464, -0.052422, + -0.045870, -0.041997, -0.039615, -0.038423, -0.037530, -0.034253, + -0.028892, -0.021148, -0.012510, -0.004766, 0.002085, 0.007744, + 0.013106, 0.017573, 0.021743, 0.024722, 0.028296, 0.031870, + 0.036636, 0.041700, 0.045870, 0.049742, 0.053912, 0.057784, + 0.062847, 0.068507, 0.074166, 0.081016, 0.087569, 0.093824, + 0.098888, 0.103058, 0.106036, 0.108717, 0.112291, 0.115270, + 0.118844, 0.122418, 0.126886, 0.131950, 0.136715, 0.139992, + 0.142375, 0.144757, 0.147438, 0.151012, 0.153991, 0.157863, + 0.160841, 0.163820, 0.165011, 0.165905, 0.165607, 0.164416, + 0.163522, 0.163522, 0.165011, 0.167692, 0.170969, 0.174245, + 0.177521, 0.179308, 0.179904, 0.179308, 0.177521, 0.175436, + 0.174245, 0.173649, 0.174841, 0.176032, 0.178415, 0.179904, + 0.181393, 0.182585, 0.183478, 0.183181, 0.182585, 0.181393, + 0.180500, 0.180202, 0.179606, 0.179308, 0.177819, 0.176926, + 0.175734, 0.175139, 0.173649, 0.172160, 0.170969, 0.169777, + 0.168884, 0.167692, 0.166203, 0.164714, 0.163224, 0.162033, + 0.159650, 0.157267, 0.154587, 0.151906, 0.149523, 0.146842, + 0.144162, 0.141779, 0.139992, 0.139098, 0.138502, 0.137907, + 0.137311, 0.135822, 0.134332, 0.131950, 0.128971, 0.125397, + 0.121823, 0.117950, 0.114674, 0.112291, 0.110206, 0.108717, + 0.107823, 0.106632, 0.104845, 0.102760, 0.100079, 0.096505, + 0.092931, 0.089356, 0.086080, 0.083101, 0.080719, 0.077740, + 0.075655, 0.072974, 0.070889, 0.067911, 0.065230, 0.061954, + 0.058975, 0.056295, 0.054507, 0.052422, 0.050635, 0.048252, + 0.046465, 0.044082, 0.041402, 0.039317, 0.037232, 0.035147, + 0.032764, 0.030381, 0.027998, 0.026807, 0.025020, 0.022339, + 0.019956, 0.017276, 0.015191, 0.013106, 0.011021, 0.008042, + 0.005957, 0.003276, 0.001489, 0.000000, -0.001191, -0.002979, + -0.004170, -0.005064, -0.005064, -0.005659, -0.006255, -0.007744, + -0.009829, -0.011616, -0.013701, -0.015488, -0.016680, -0.017276, + -0.017276, -0.016680, -0.015191, -0.015191, -0.015191, -0.016382, + -0.017573, -0.018467, -0.019063, -0.020254, -0.020254, -0.019956, + -0.019063, -0.017871, -0.017276, -0.016978, -0.016978, -0.017573, + -0.017276, -0.016978, -0.015786, -0.014893, -0.013701, -0.012510, + -0.011616, -0.010425, -0.010127, -0.009829, -0.008936, -0.008340, + -0.007446, -0.006553, -0.005361, -0.004468, -0.003276, -0.002085, + -0.000596, 0.000298, 0.001489, 0.002681, 0.004468, 0.005361, + 0.005957, 0.006255, 0.006553, 0.008042, 0.008638, 0.009531, + 0.010127, 0.011914, 0.013403, 0.015191, 0.016978, 0.017871, + 0.019361, 0.019658, 0.020254, 0.020552, 0.021743, 0.022041, + 0.022935, 0.024424, 0.026211, 0.027403, 0.028892, 0.029488, + 0.029785, 0.030083, 0.030381, 0.030679, 0.030679, 0.031275, + 0.031573, 0.032764, 0.033360, 0.034253, 0.033955, 0.033360, + 0.033062, 0.032764, 0.032764, 0.032764, 0.032764, 0.032764, + 0.032764, 0.032466, 0.032764, 0.031870, 0.030977, 0.030381, + 0.029488, 0.029190, 0.028594, 0.027998, 0.027105, 0.026807, + 0.026211, 0.025913, 0.025318, 0.024722, 0.023828, 0.023233, + 0.022339, 0.021148, 0.019658, 0.018467, 0.017276, 0.015786, + 0.014893, 0.013701, 0.012510, 0.011616, 0.010723, 0.009531, + 0.007446, 0.005659, 0.003872, 0.002085, 0.000000, -0.001787, + -0.003574, -0.005361, -0.007446, -0.008936, -0.011021, -0.012808, + -0.014595, -0.016382, -0.018467, -0.020254, -0.022339, -0.024126, + -0.026211, -0.027700, -0.029190, -0.031275, -0.033360, -0.035743, + -0.037828, -0.040210, -0.042593, -0.044678, -0.047061, -0.049146, + -0.051231, -0.053018, -0.055103, -0.057188, -0.059869, -0.062252, + -0.064634, -0.066719, -0.069102, -0.071187, -0.073570, -0.075655, + -0.078038, -0.080123, -0.082506, -0.084293, -0.086974, -0.089356, + -0.091739, -0.094420, -0.096505, -0.099186, -0.101568, -0.104249, + -0.106632, -0.108717, -0.111100, -0.113185, -0.114972, -0.117057, + -0.118844, -0.121227, -0.123014, -0.125397, -0.127780, -0.130758, + -0.133141, -0.135524, -0.138502, -0.140290, -0.143268, -0.145949, + -0.148927, -0.151608, -0.154289, -0.156969, -0.159948, -0.162926, + -0.165011, -0.167692, -0.170373, -0.173351, -0.176330, -0.179308, + -0.182585, -0.185563, -0.189138, -0.193010, -0.195988, -0.198967, + -0.201350, -0.204328, -0.207605, -0.211179, -0.214157, -0.217136, + -0.220412, -0.223391, -0.226072, -0.227859, -0.229348, -0.231135, + -0.233220, -0.234709, -0.236199, -0.237688, -0.240071, -0.241858, + -0.242454, -0.241560, -0.239475, -0.237390, -0.233518, -0.226965, + -0.218923, -0.211775, -0.207605, -0.205818, -0.204924, -0.203733, + -0.204328, -0.207307, -0.212072, -0.214753, -0.213264, -0.208200, + -0.201350, -0.194797, -0.188244, -0.181096, -0.173351, -0.167692, + -0.164416, -0.163522, -0.163224, -0.160841, -0.156672, -0.151310, + -0.144757, -0.138502, -0.132545, -0.127482, -0.122716, -0.117950, + -0.112589, -0.106036, -0.097994, -0.087569, -0.076549, -0.065528, + -0.055699, -0.048848, -0.043785, -0.040210, -0.037828, -0.035743, + -0.033062, -0.027700, -0.018765, -0.008042, 0.002681, 0.011914, + 0.019361, 0.025615, 0.030977, 0.035445, 0.038721, 0.041402, + 0.044380, 0.049146, 0.054507, 0.059869, 0.065230, 0.070294, + 0.075655, 0.081314, 0.087569, 0.093228, 0.099186, 0.105441, + 0.112291, 0.118546, 0.123312, 0.126588, 0.129567, 0.131950, + 0.134928, 0.138205, 0.141481, 0.145055, 0.150119, 0.155480, + 0.161139, 0.165309, 0.168288, 0.170969, 0.173351, 0.176628, + 0.179011, 0.181096, 0.182287, 0.183478, 0.184074, 0.184968, + 0.184968, 0.184074, 0.183776, 0.184670, 0.186755, 0.190031, + 0.193010, 0.195690, 0.196882, 0.196882, 0.196286, 0.194499, + 0.191818, 0.188840, 0.187351, 0.187053, 0.188840, 0.190925, + 0.192712, 0.194499, 0.195393, 0.196286, 0.195690, 0.194797, + 0.192712, 0.190627, 0.188840, 0.187648, 0.186755, 0.185563, + 0.184670, 0.183478, 0.181989, 0.180798, 0.179606, 0.177819, + 0.176628, 0.175139, 0.173947, 0.172756, 0.171266, 0.168884, + 0.166501, 0.164118, 0.161139, 0.157863, 0.154884, 0.151608, + 0.148629, 0.146544, 0.144757, 0.143268, 0.142375, 0.141779, + 0.141183, 0.139992, 0.138205, 0.135524, 0.132843, 0.129567, + 0.125992, 0.121823, 0.118248, 0.115568, 0.113483, 0.111993, + 0.110504, 0.109908, 0.108717, 0.107228, 0.105143, 0.102164, + 0.098292, 0.094420, 0.090250, 0.086974, 0.084293, 0.081910, + 0.080123, 0.078634, 0.077442, 0.076846, 0.075357, 0.073570, + 0.070592, 0.067613, 0.065230, 0.063145, 0.060464, 0.057784, + 0.055401, 0.053316, 0.051529, 0.049146, 0.046167, 0.043487, + 0.040508, 0.038125, 0.036636, 0.035147, 0.033658, 0.032764, + 0.031870, 0.030977, 0.030083, 0.027998, 0.025615, 0.022935, + 0.020254, 0.017573, 0.015786, 0.014893, 0.014893, 0.014595, + 0.014893, 0.015191, 0.014595, 0.013701, 0.011914, 0.009829, + 0.007446, 0.005659, 0.004170, 0.002681, 0.002085, 0.001489, + 0.001787, 0.002085, 0.002383, 0.002979, 0.003276, 0.003276, + 0.002979, 0.002979, 0.002383, 0.000894, 0.000298, -0.000596, + -0.001489, -0.001489, -0.000894, 0.000000, 0.001191, 0.002681, + 0.003574, 0.004766, 0.005659, 0.006553, 0.007149, 0.008042, + 0.008638, 0.010425, 0.011616, 0.012808, 0.013403, 0.013106, + 0.012808, 0.012510, 0.012510, 0.013106, 0.014297, 0.015786, + 0.017573, 0.019658, 0.021148, 0.021743, 0.021743, 0.021446, + 0.021148, 0.020552, 0.019956, 0.020254, 0.020552, 0.021446, + 0.022637, 0.023828, 0.025020, 0.026211, 0.027105, 0.027403, + 0.027998, 0.028296, 0.028296, 0.028296, 0.028296, 0.028296, + 0.029190, 0.029785, 0.030977, 0.031275, 0.032168, 0.032466, + 0.032466, 0.032764, 0.032764, 0.033062, 0.032764, 0.032764, + 0.032168, 0.031573, 0.030977, 0.030381, 0.029488, 0.028594, + 0.027700, 0.027105, 0.026211, 0.025615, 0.024722, 0.023828, + 0.022935, 0.022041, 0.021148, 0.020552, 0.019658, 0.018169, + 0.016680, 0.014893, 0.013106, 0.011616, 0.010127, 0.008936, + 0.008638, 0.008042, 0.007744, 0.006851, 0.006255, 0.004766, + 0.002681, 0.000596, -0.001191, -0.003276, -0.005064, -0.006851, + -0.008340, -0.009829, -0.011616, -0.013403, -0.015488, -0.017573, + -0.019658, -0.021743, -0.024126, -0.026509, -0.029190, -0.031870, + -0.033955, -0.036636, -0.039019, -0.041402, -0.044082, -0.046465, + -0.048848, -0.050635, -0.053018, -0.055103, -0.056890, -0.059273, + -0.061060, -0.062847, -0.065230, -0.067613, -0.070592, -0.073570, + -0.075953, -0.078931, -0.081612, -0.083995, -0.086378, -0.088463, + -0.090250, -0.092335, -0.094122, -0.096505, -0.098590, -0.101271, + -0.103653, -0.106334, -0.109908, -0.112887, -0.116163, -0.119142, + -0.121525, -0.124205, -0.126886, -0.129269, -0.131652, -0.133737, + -0.135822, -0.138205, -0.141183, -0.143566, -0.145949, -0.148629, + -0.151608, -0.154587, -0.157267, -0.159948, -0.162926, -0.165607, + -0.168288, -0.170671, -0.172756, -0.175139, -0.177521, -0.180202, + -0.183478, -0.185563, -0.188244, -0.191223, -0.194499, -0.198371, + -0.201350, -0.204924, -0.207903, -0.212072, -0.215945, -0.220115, + -0.223689, -0.226667, -0.230539, -0.235305, -0.239773, -0.244539, + -0.248411, -0.253474, -0.258538, -0.263006, -0.266282, -0.268665, + -0.271346, -0.273728, -0.276111, -0.277898, -0.279685, -0.280281, + -0.278792, -0.275515, -0.268665, -0.258836, -0.248113, -0.238582, + -0.232029, -0.228454, -0.227859, -0.231135, -0.238284, -0.247517, + -0.255261, -0.257942, -0.254666, -0.246624, -0.235901, -0.224582, + -0.213860, -0.205222, -0.200158, -0.198967, -0.201350, -0.204328, + -0.204924, -0.202243, -0.195690, -0.187648, -0.179904, -0.173054, + -0.168586, -0.165011, -0.162629, -0.159650, -0.154587, -0.145651, + -0.132843, -0.117950, -0.102462, -0.089356, -0.080123, -0.074464, + -0.072081, -0.070889, -0.069698, -0.067315, -0.061060, -0.050635, + -0.036934, -0.022637, -0.009829, 0.000000, 0.007446, 0.012808, + 0.016978, 0.020254, 0.023531, 0.027403, 0.032466, 0.039317, + 0.045572, 0.051529, 0.056592, 0.061954, 0.067315, 0.073868, + 0.081612, 0.089952, 0.098888, 0.108419, 0.115865, 0.121823, + 0.125397, 0.127482, 0.128971, 0.131354, 0.134630, 0.139694, + 0.146544, 0.153693, 0.161735, 0.168586, 0.174543, 0.178117, + 0.180798, 0.183181, 0.186457, 0.190329, 0.194499, 0.198073, + 0.200456, 0.202243, 0.202839, 0.202243, 0.201052, 0.200158, + 0.200456, 0.203435, 0.207605, 0.212966, 0.217434, 0.220115, + 0.221306, 0.220115, 0.217434, 0.213562, 0.209392, 0.206413, + 0.205520, 0.206711, 0.210285, 0.213860, 0.217136, 0.219817, + 0.221604, 0.221604, 0.220710, 0.218030, 0.215349, 0.212668, + 0.210583, 0.209392, 0.208498, 0.207903, 0.207307, 0.206711, + 0.205818, 0.204626, 0.203137, 0.201945, 0.200754, 0.199265, + 0.197775, 0.196286, 0.193903, 0.191520, 0.188542, 0.185266, + 0.181393, 0.178117, 0.174543, 0.171564, 0.168586, 0.166203, + 0.164416, 0.163224, 0.162629, 0.162331, 0.161139, 0.160246, + 0.157863, 0.154884, 0.151310, 0.146842, 0.142077, 0.137311, + 0.133439, 0.130162, 0.128375, 0.127184, 0.126588, 0.125992, + 0.125397, 0.123908, 0.121227, 0.116759, 0.111695, 0.106334, + 0.100675, 0.095909, 0.092037, 0.089059, 0.086974, 0.086080, + 0.083995, 0.082506, 0.080123, 0.076846, 0.073272, 0.069102, + 0.065230, 0.061358, 0.058677, 0.055699, 0.053614, 0.051529, + 0.050337, 0.048252, 0.045274, 0.041402, 0.038423, 0.036636, + 0.034253, 0.032764, 0.030679, 0.029785, 0.028594, 0.027700, + 0.025913, 0.024126, 0.021148, 0.017573, 0.014297, 0.011318, + 0.008638, 0.006851, 0.005361, 0.004766, 0.004766, 0.004766, + 0.004170, 0.003276, 0.002085, 0.000298, -0.001191, -0.002979, + -0.004766, -0.005957, -0.006851, -0.007446, -0.006851, -0.006553, + -0.006255, -0.006255, -0.005957, -0.005659, -0.005659, -0.006255, + -0.006851, -0.007744, -0.008042, -0.007744, -0.007446, -0.006851, + -0.005957, -0.005064, -0.003276, -0.001489, -0.000298, 0.000298, + 0.000596, 0.001489, 0.002383, 0.003574, 0.005064, 0.007149, + 0.008638, 0.010723, 0.012212, 0.012808, 0.013106, 0.013403, + 0.013999, 0.014893, 0.016084, 0.017276, 0.019063, 0.021148, + 0.022935, 0.024424, 0.025913, 0.026807, 0.027403, 0.027998, + 0.028296, 0.028594, 0.029190, 0.030381, 0.031573, 0.033360, + 0.035445, 0.037530, 0.039019, 0.040508, 0.041402, 0.041997, + 0.042295, 0.043189, 0.043189, 0.043785, 0.044678, 0.045870, + 0.047359, 0.048252, 0.049444, 0.049742, 0.050040, 0.050040, + 0.050635, 0.049742, 0.049742, 0.049444, 0.049444, 0.049444, + 0.048848, 0.048252, 0.048252, 0.047955, 0.047657, 0.047061, + 0.046167, 0.045274, 0.044082, 0.043189, 0.041997, 0.041700, + 0.040806, 0.039913, 0.039317, 0.038423, 0.037232, 0.035743, + 0.033658, 0.031870, 0.030083, 0.028594, 0.026807, 0.025913, + 0.024722, 0.023531, 0.022041, 0.020850, 0.018765, 0.016382, + 0.014297, 0.011616, 0.009531, 0.007446, 0.005361, 0.003276, + 0.001787, 0.000000, -0.001787, -0.003574, -0.005957, -0.008638, + -0.011021, -0.013701, -0.016680, -0.019361, -0.022339, -0.024722, + -0.026807, -0.029190, -0.031573, -0.033955, -0.036338, -0.039019, + -0.041700, -0.044380, -0.047061, -0.049742, -0.052422, -0.054805, + -0.057784, -0.060167, -0.062847, -0.065528, -0.068209, -0.071187, + -0.073868, -0.077144, -0.080123, -0.082506, -0.085186, -0.087867, + -0.090250, -0.092931, -0.095313, -0.097994, -0.101271, -0.104249, + -0.107228, -0.110504, -0.113185, -0.115865, -0.118546, -0.120929, + -0.123610, -0.125992, -0.128673, -0.131354, -0.134035, -0.136715, + -0.139694, -0.142672, -0.145949, -0.148332, -0.151012, -0.153395, + -0.156374, -0.159352, -0.162629, -0.165607, -0.167990, -0.170373, + -0.173649, -0.176330, -0.179904, -0.182585, -0.185266, -0.188244, + -0.190925, -0.194499, -0.197775, -0.200754, -0.203137, -0.205818, + -0.209094, -0.212668, -0.216540, -0.219221, -0.222497, -0.225774, + -0.230242, -0.234412, -0.237986, -0.241858, -0.246028, -0.250496, + -0.254964, -0.259729, -0.264197, -0.269261, -0.274324, -0.279983, + -0.284451, -0.288323, -0.292195, -0.296067, -0.300237, -0.303216, + -0.305897, -0.307684, -0.309769, -0.310067, -0.309173, -0.303812, + -0.293982, -0.282366, -0.271643, -0.262112, -0.255261, -0.250198, + -0.249602, -0.254070, -0.263601, -0.274324, -0.282664, -0.284153, + -0.278792, -0.268963, -0.256751, -0.243943, -0.231135, -0.220710, + -0.214753, -0.214753, -0.218327, -0.222795, -0.223987, -0.220115, + -0.212668, -0.204030, -0.195393, -0.187351, -0.181096, -0.176926, + -0.174245, -0.172160, -0.167394, -0.157267, -0.142077, -0.124503, + -0.108121, -0.094718, -0.084293, -0.077442, -0.074166, -0.074166, + -0.074464, -0.072379, -0.064337, -0.050635, -0.033658, -0.016978, + -0.002383, 0.009233, 0.018467, 0.025020, 0.028594, 0.030083, + 0.031870, 0.036040, 0.042891, 0.051529, 0.058975, 0.065826, + 0.072379, 0.078931, 0.085782, 0.092633, 0.100377, 0.108717, + 0.117950, 0.127780, 0.136120, 0.141779, 0.144757, 0.145353, + 0.146544, 0.149225, 0.153693, 0.159352, 0.166799, 0.175734, + 0.185266, 0.193605, 0.199563, 0.202541, 0.203733, 0.205222, + 0.207903, 0.211775, 0.216242, 0.220710, 0.224880, 0.228454, + 0.230242, 0.229646, 0.227263, 0.224582, 0.224582, 0.227263, + 0.232327, 0.237986, 0.242751, 0.246624, 0.247815, 0.247219, + 0.243347, 0.237688, 0.231135, 0.226667, 0.225178, 0.227263, + 0.231731, 0.236497, 0.241560, 0.245134, 0.246921, 0.246326, + 0.243347, 0.238582, 0.233816, 0.229348, 0.227263, 0.225476, + 0.224880, 0.224582, 0.224284, 0.224582, 0.223987, 0.223391, + 0.221902, 0.219817, 0.218625, 0.216540, 0.214455, 0.211477, + 0.208498, 0.205222, 0.201945, 0.198073, 0.194499, 0.190627, + 0.187946, 0.184968, 0.183181, 0.180798, 0.178415, 0.176628, + 0.174841, 0.173947, 0.172756, 0.171266, 0.168884, 0.165905, + 0.162629, 0.158161, 0.153395, 0.148034, 0.143268, 0.139396, + 0.137311, 0.136715, 0.136715, 0.136715, 0.136120, 0.134928, + 0.131950, 0.127184, 0.120929, 0.114078, 0.106632, 0.101568, + 0.097398, 0.095016, 0.094122, 0.093824, 0.094420, 0.094122, + 0.093228, 0.089356, 0.085484, 0.080719, 0.075655, 0.070889, + 0.067315, 0.064634, 0.062549, 0.061656, 0.060464, 0.059869, + 0.058380, 0.056295, 0.053614, 0.051231, 0.048848, 0.046763, + 0.044380, 0.042295, 0.040806, 0.038721, 0.036338, 0.033360, + 0.030083, 0.027403, 0.025318, 0.023531, 0.022339, 0.021446, + 0.021148, 0.021446, 0.022041, 0.021446, 0.019956, 0.018169, + 0.016382, 0.014297, 0.011914, 0.009233, 0.007149, 0.005361, + 0.004766, 0.004468, 0.005361, 0.006255, 0.008340, 0.009233, + 0.010723, 0.011021, 0.010723, 0.008936, 0.006553, 0.003574, + 0.001489, 0.000000, -0.000298, 0.000596, 0.002681, 0.006553, + 0.010127, 0.012510, 0.013701, 0.014595, 0.013999, 0.013701, + 0.012510, 0.011616, 0.011021, 0.011318, 0.012808, 0.014595, + 0.016382, 0.017871, 0.018765, 0.019658, 0.020552, 0.021446, + 0.022339, 0.023233, 0.024424, 0.025913, 0.027403, 0.028296, + 0.028892, 0.028892, 0.028296, 0.027998, 0.028296, 0.027998, + 0.028296, 0.029488, 0.031275, 0.033360, 0.035743, 0.036934, + 0.037828, 0.037828, 0.037530, 0.036934, 0.035445, 0.034551, + 0.033360, 0.033360, 0.033955, 0.034551, 0.035445, 0.036636, + 0.037828, 0.039019, 0.039913, 0.039913, 0.039317, 0.037828, + 0.036338, 0.034253, 0.032764, 0.031870, 0.031275, 0.030977, + 0.031275, 0.032168, 0.032466, 0.032466, 0.031573, 0.030679, + 0.029190, 0.027403, 0.025318, 0.023233, 0.021446, 0.020254, + 0.018765, 0.017573, 0.015786, 0.013999, 0.011914, 0.009829, + 0.007744, 0.005659, 0.003872, 0.002085, 0.000894, -0.000596, + -0.002383, -0.004468, -0.007149, -0.009829, -0.012808, -0.015786, + -0.018765, -0.020850, -0.022637, -0.023828, -0.025020, -0.026211, + -0.027105, -0.028892, -0.031275, -0.034253, -0.037232, -0.040508, + -0.044082, -0.047359, -0.050635, -0.053018, -0.055997, -0.058082, + -0.060464, -0.062252, -0.064039, -0.066124, -0.068804, -0.071485, + -0.074464, -0.078038, -0.081612, -0.084591, -0.088463, -0.091441, + -0.094122, -0.096803, -0.099483, -0.102164, -0.104547, -0.106930, + -0.109313, -0.112291, -0.115270, -0.117950, -0.121227, -0.123908, + -0.127184, -0.130162, -0.133737, -0.137013, -0.139992, -0.142672, + -0.145651, -0.148629, -0.151310, -0.153991, -0.156374, -0.158756, + -0.161735, -0.164714, -0.167990, -0.171564, -0.174841, -0.178415, + -0.182287, -0.186159, -0.189733, -0.192414, -0.195095, -0.198073, + -0.200754, -0.203733, -0.206711, -0.209690, -0.213264, -0.216838, + -0.221306, -0.226072, -0.229944, -0.233220, -0.236497, -0.240964, + -0.245134, -0.248113, -0.250794, -0.254368, -0.258240, -0.262708, + -0.267176, -0.272239, -0.277005, -0.282366, -0.287430, -0.293089, + -0.299642, -0.307088, -0.313939, -0.319002, -0.323470, -0.328831, + -0.333895, -0.336278, -0.337171, -0.337171, -0.334491, -0.327938, + -0.320492, -0.313939, -0.307088, -0.296067, -0.284749, -0.277600, + -0.277600, -0.281175, -0.285047, -0.289515, -0.295174, -0.300535, + -0.302918, -0.299642, -0.290110, -0.276409, -0.261814, -0.250794, + -0.243347, -0.237688, -0.234114, -0.234412, -0.237688, -0.240964, + -0.239773, -0.233816, -0.224284, -0.214753, -0.206711, -0.199265, + -0.193308, -0.188244, -0.184074, -0.177521, -0.169181, -0.158161, + -0.144459, -0.127482, -0.110504, -0.097696, -0.091144, -0.087867, + -0.085484, -0.082208, -0.077144, -0.069698, -0.058677, -0.043189, + -0.024722, -0.006553, 0.008340, 0.018467, 0.023828, 0.027403, + 0.030381, 0.033062, 0.035743, 0.040508, 0.047955, 0.058082, + 0.069102, 0.078931, 0.086974, 0.094420, 0.101568, 0.109313, + 0.116461, 0.124205, 0.131950, 0.139396, 0.145949, 0.151906, + 0.155778, 0.157565, 0.159650, 0.163522, 0.170373, 0.178713, + 0.187351, 0.195393, 0.204328, 0.210881, 0.215945, 0.217732, + 0.219221, 0.220412, 0.222795, 0.227263, 0.232327, 0.237688, + 0.241262, 0.244539, 0.246028, 0.246028, 0.244836, 0.243943, + 0.244539, 0.247815, 0.252283, 0.257346, 0.261516, 0.264197, + 0.263601, 0.260623, 0.255857, 0.250794, 0.246624, 0.243645, + 0.244539, 0.248113, 0.254070, 0.259729, 0.263899, 0.265984, + 0.265686, 0.263006, 0.257644, 0.251389, 0.245730, 0.241560, + 0.239177, 0.238879, 0.239475, 0.240667, 0.240964, 0.240964, + 0.240071, 0.238582, 0.235901, 0.232624, 0.229348, 0.226667, + 0.223689, 0.220412, 0.217136, 0.213860, 0.210881, 0.207903, + 0.205222, 0.202839, 0.199860, 0.197478, 0.195393, 0.193308, + 0.190925, 0.188840, 0.186457, 0.184670, 0.182287, 0.180202, + 0.177223, 0.173947, 0.170671, 0.166799, 0.162629, 0.158459, + 0.154289, 0.151310, 0.148927, 0.147736, 0.146842, 0.145949, + 0.144459, 0.141183, 0.137311, 0.131652, 0.125397, 0.118248, + 0.111695, 0.106334, 0.103356, 0.101271, 0.100973, 0.100377, + 0.100079, 0.098888, 0.095909, 0.091739, 0.086378, 0.080123, + 0.074762, 0.070294, 0.067613, 0.065826, 0.064634, 0.063443, + 0.063443, 0.062847, 0.060464, 0.056890, 0.053316, 0.050040, + 0.047359, 0.045870, 0.044678, 0.043487, 0.042295, 0.041402, + 0.039913, 0.038423, 0.035445, 0.031870, 0.028594, 0.026509, + 0.025615, 0.024424, 0.023233, 0.021743, 0.020850, 0.020254, + 0.018765, 0.016978, 0.014893, 0.013106, 0.012510, 0.012510, + 0.012212, 0.011021, 0.010127, 0.009829, 0.010425, 0.010723, + 0.011318, 0.011318, 0.012212, 0.012510, 0.013403, 0.012510, + 0.011914, 0.010425, 0.009233, 0.008340, 0.009531, 0.011318, + 0.013403, 0.015786, 0.017871, 0.020254, 0.021446, 0.021148, + 0.019956, 0.018765, 0.017871, 0.018169, 0.018467, 0.019658, + 0.020552, 0.022935, 0.025020, 0.026509, 0.027998, 0.028296, + 0.028594, 0.029190, 0.029785, 0.030977, 0.031573, 0.032764, + 0.034551, 0.036040, 0.037232, 0.038125, 0.038423, 0.038423, + 0.039019, 0.039615, 0.040508, 0.041700, 0.042593, 0.043487, + 0.044380, 0.045274, 0.044976, 0.045274, 0.044678, 0.044380, + 0.044082, 0.044082, 0.044082, 0.044082, 0.044082, 0.043785, + 0.043487, 0.043487, 0.043487, 0.043189, 0.043785, 0.043487, + 0.043189, 0.042593, 0.041700, 0.040508, 0.039019, 0.038423, + 0.037530, 0.037232, 0.037232, 0.037530, 0.037232, 0.036934, + 0.036040, 0.034849, 0.032764, 0.030977, 0.028892, 0.026807, + 0.024722, 0.022935, 0.021743, 0.020552, 0.019063, 0.017573, + 0.015488, 0.012808, 0.010127, 0.007446, 0.004468, 0.002085, + -0.000596, -0.002979, -0.005361, -0.007446, -0.010127, -0.012510, + -0.015191, -0.017871, -0.020254, -0.022339, -0.024722, -0.026509, + -0.028594, -0.030679, -0.033360, -0.035743, -0.038125, -0.041104, + -0.043487, -0.046465, -0.048848, -0.051231, -0.053614, -0.055997, + -0.058677, -0.061060, -0.064039, -0.066719, -0.069698, -0.072677, + -0.075655, -0.078336, -0.081016, -0.084293, -0.087271, -0.090548, + -0.094122, -0.097696, -0.100973, -0.104249, -0.106930, -0.110206, + -0.112589, -0.115270, -0.118248, -0.121227, -0.124205, -0.127482, + -0.131056, -0.134630, -0.138205, -0.141183, -0.144459, -0.147438, + -0.149821, -0.152799, -0.155778, -0.158459, -0.161735, -0.165011, + -0.168288, -0.171862, -0.174841, -0.178415, -0.181393, -0.184670, + -0.187053, -0.190031, -0.193605, -0.196882, -0.200158, -0.203137, + -0.206711, -0.211179, -0.214753, -0.218327, -0.221008, -0.224880, + -0.228454, -0.232327, -0.235901, -0.239475, -0.243049, -0.247517, + -0.251985, -0.256751, -0.260325, -0.264197, -0.268665, -0.273431, + -0.277005, -0.279983, -0.283558, -0.288621, -0.293982, -0.299642, + -0.305003, -0.311258, -0.318407, -0.325853, -0.333299, -0.340746, + -0.347894, -0.353851, -0.358021, -0.361595, -0.365170, -0.366361, + -0.363978, -0.356532, -0.347001, -0.338065, -0.329725, -0.319598, + -0.307982, -0.298450, -0.295770, -0.299642, -0.305003, -0.309173, + -0.313343, -0.317811, -0.321087, -0.320194, -0.311854, -0.297855, + -0.282366, -0.269856, -0.260921, -0.254368, -0.249602, -0.247517, + -0.248411, -0.251091, -0.251985, -0.249602, -0.242454, -0.232922, + -0.223391, -0.215051, -0.208796, -0.202839, -0.196584, -0.188840, + -0.180202, -0.170075, -0.158459, -0.143566, -0.126290, -0.111100, + -0.101271, -0.096207, -0.092335, -0.087867, -0.081612, -0.074762, + -0.065230, -0.052422, -0.034551, -0.014595, 0.003276, 0.017573, + 0.027105, 0.033658, 0.037530, 0.040210, 0.041700, 0.044380, + 0.050040, 0.057486, 0.067911, 0.079825, 0.091441, 0.102462, + 0.111993, 0.121227, 0.130162, 0.138205, 0.144459, 0.149225, + 0.152799, 0.156672, 0.161139, 0.165011, 0.168884, 0.172756, + 0.179904, 0.189138, 0.198967, 0.207009, 0.213860, 0.220412, + 0.225774, 0.229050, 0.230242, 0.230837, 0.232922, 0.237092, + 0.242454, 0.247517, 0.251985, 0.255261, 0.258240, 0.259729, + 0.259729, 0.259431, 0.259729, 0.261516, 0.264793, 0.268665, + 0.272537, 0.275515, 0.276707, 0.275218, 0.271941, 0.267473, + 0.263303, 0.259729, 0.258538, 0.259729, 0.263899, 0.269856, + 0.275515, 0.279388, 0.280281, 0.279090, 0.275218, 0.269558, + 0.262112, 0.254964, 0.249602, 0.246326, 0.246028, 0.246326, + 0.248113, 0.249900, 0.251389, 0.251985, 0.250496, 0.247219, + 0.242454, 0.237092, 0.231433, 0.226072, 0.221008, 0.216540, + 0.213860, 0.212072, 0.210285, 0.209094, 0.207903, 0.206413, + 0.204626, 0.201648, 0.197775, 0.194499, 0.190925, 0.187946, + 0.185861, 0.183776, 0.181393, 0.179606, 0.177223, 0.174245, + 0.170373, 0.166501, 0.162331, 0.158459, 0.155480, 0.152799, + 0.151012, 0.149821, 0.148629, 0.146544, 0.143268, 0.139098, + 0.133141, 0.126886, 0.119440, 0.112887, 0.107823, 0.104547, + 0.102760, 0.102164, 0.102462, 0.102462, 0.102164, 0.100973, + 0.097994, 0.093228, 0.087867, 0.082208, 0.077442, 0.072974, + 0.069698, 0.067315, 0.066124, 0.065826, 0.065230, 0.065230, + 0.064039, 0.061954, 0.059273, 0.055997, 0.052422, 0.048848, + 0.045274, 0.041700, 0.039317, 0.038125, 0.037530, 0.036934, + 0.036040, 0.034551, 0.033360, 0.031275, 0.028594, 0.025615, + 0.023531, 0.021743, 0.021148, 0.020850, 0.021148, 0.020850, + 0.020254, 0.019361, 0.017871, 0.015786, 0.013701, 0.011914, + 0.010425, 0.010127, 0.011318, 0.013106, 0.014893, 0.016084, + 0.017276, 0.017276, 0.016680, 0.014595, 0.011914, 0.009531, + 0.008042, 0.007744, 0.008042, 0.010127, 0.012510, 0.015786, + 0.018169, 0.020254, 0.020850, 0.020552, 0.019361, 0.017871, + 0.016382, 0.015488, 0.016084, 0.017276, 0.019063, 0.022041, + 0.025020, 0.027998, 0.030083, 0.031573, 0.032466, 0.033062, + 0.033062, 0.033360, 0.033062, 0.033955, 0.035147, 0.036934, + 0.039019, 0.041104, 0.041997, 0.042891, 0.043487, 0.043487, + 0.043189, 0.042593, 0.042295, 0.042593, 0.042891, 0.043189, + 0.043785, 0.044082, 0.044380, 0.043785, 0.042593, 0.041700, + 0.040210, 0.039019, 0.038721, 0.038721, 0.039019, 0.039913, + 0.040508, 0.041700, 0.041997, 0.041997, 0.040806, 0.039913, + 0.037828, 0.036636, 0.035147, 0.034551, 0.034253, 0.034253, + 0.034551, 0.034849, 0.035445, 0.035147, 0.034253, 0.032168, + 0.030381, 0.027105, 0.024424, 0.021446, 0.018765, 0.016978, + 0.015191, 0.013999, 0.012808, 0.011021, 0.009233, 0.007149, + 0.003872, 0.000596, -0.002681, -0.005659, -0.009233, -0.011914, + -0.014297, -0.016680, -0.018169, -0.020552, -0.022339, -0.024126, + -0.025913, -0.027998, -0.030679, -0.033360, -0.036338, -0.038721, + -0.040210, -0.041997, -0.044082, -0.046763, -0.049444, -0.052422, + -0.055699, -0.058677, -0.061656, -0.064634, -0.067613, -0.069996, + -0.072974, -0.074762, -0.077144, -0.079527, -0.082208, -0.084591, + -0.088165, -0.091441, -0.095313, -0.098888, -0.103356, -0.106930, + -0.110802, -0.114376, -0.117057, -0.120035, -0.123312, -0.126588, + -0.130460, -0.134630, -0.138800, -0.143566, -0.148332, -0.153693, + -0.158756, -0.163522, -0.167990, -0.172756, -0.177521, -0.182287, + -0.186755, -0.191520, -0.197180, -0.202839, -0.209392, -0.215051, + -0.220710, -0.226369, -0.232029, -0.237986, -0.243645, -0.249304, + -0.255559, -0.262410, -0.268665, -0.273728, -0.278792, -0.284451, + -0.291004, -0.296961, -0.301429, -0.305599, -0.310662, -0.317215, + -0.323768, -0.330023, -0.334789, -0.340448, -0.346703, -0.354745, + -0.362489, -0.369638, -0.375892, -0.383339, -0.392572, -0.403295, + -0.413422, -0.422358, -0.430996, -0.440527, -0.450654, -0.461079, + -0.468227, -0.470610, -0.470015, -0.469121, -0.467334, -0.461079, + -0.450654, -0.437548, -0.426528, -0.417294, -0.405976, -0.390487, + -0.373510, -0.361893, -0.355638, -0.355638, -0.354447, -0.344916, + -0.330321, -0.317513, -0.307386, -0.296365, -0.280281, -0.259431, + -0.236497, -0.213860, -0.190329, -0.168586, -0.150119, -0.135226, + -0.124205, -0.115270, -0.108419, -0.103058, -0.094420, -0.080719, + -0.065230, -0.055103, -0.053018, -0.052422, -0.045870, -0.034253, + -0.023233, -0.016382, -0.011616, -0.002979, 0.008042, 0.016084, + 0.017276, 0.014595, 0.015786, 0.017573, 0.018765, 0.019658, + 0.026807, 0.041700, 0.060762, 0.077144, 0.089952, 0.102760, + 0.116759, 0.126290, 0.129567, 0.129269, 0.133737, 0.146544, + 0.162926, 0.177819, 0.191520, 0.206413, 0.222795, 0.235603, + 0.243049, 0.247219, 0.253176, 0.260623, 0.265984, 0.268069, + 0.271346, 0.279685, 0.288621, 0.290706, 0.285345, 0.279388, + 0.278792, 0.280579, 0.277005, 0.267473, 0.258836, 0.257049, + 0.259431, 0.259133, 0.254368, 0.249304, 0.247815, 0.247219, + 0.243347, 0.236497, 0.231433, 0.231135, 0.231731, 0.228454, + 0.223987, 0.224582, 0.231135, 0.237986, 0.240369, 0.241560, + 0.246624, 0.256155, 0.263006, 0.262708, 0.258836, 0.257942, + 0.262410, 0.268665, 0.272835, 0.277303, 0.284749, 0.294280, + 0.301429, 0.302918, 0.300833, 0.299046, 0.296663, 0.291302, + 0.281473, 0.274026, 0.271643, 0.272835, 0.272239, 0.267771, + 0.263006, 0.262112, 0.262112, 0.257644, 0.247219, 0.235901, + 0.229348, 0.226667, 0.223391, 0.218030, 0.213860, 0.212668, + 0.213562, 0.212072, 0.206711, 0.201945, 0.200158, 0.199860, + 0.197478, 0.194201, 0.193605, 0.197775, 0.202541, 0.203733, + 0.201648, 0.200158, 0.201350, 0.202243, 0.197478, 0.190031, + 0.184074, 0.182287, 0.181393, 0.178415, 0.173947, 0.170075, + 0.169479, 0.167096, 0.160544, 0.151608, 0.144162, 0.138502, + 0.131354, 0.121823, 0.113483, 0.111100, 0.111398, 0.109908, + 0.105143, 0.101866, 0.104547, 0.109015, 0.109313, 0.104845, + 0.100377, 0.101568, 0.105441, 0.106930, 0.106334, 0.106036, + 0.110206, 0.115270, 0.119142, 0.120333, 0.121227, 0.122716, + 0.122716, 0.120929, 0.118844, 0.118248, 0.118248, 0.117355, + 0.114972, 0.111993, 0.111695, 0.111993, 0.109313, 0.103653, + 0.096207, 0.090846, 0.087569, 0.083101, 0.077740, 0.073570, + 0.072379, 0.072677, 0.071783, 0.069400, 0.066124, 0.064337, + 0.062847, 0.061656, 0.060167, 0.059869, 0.062549, 0.066124, + 0.070294, 0.073868, 0.077144, 0.081016, 0.084889, 0.087569, + 0.089654, 0.090846, 0.092037, 0.094718, 0.097101, 0.099483, + 0.102164, 0.105143, 0.107823, 0.109610, 0.110802, 0.111993, + 0.112291, 0.111398, 0.110206, 0.109015, 0.109313, 0.109313, + 0.108419, 0.107526, 0.107526, 0.108121, 0.109908, 0.110802, + 0.111993, 0.112589, 0.113483, 0.114972, 0.116461, 0.117355, + 0.119142, 0.121227, 0.123908, 0.126886, 0.129865, 0.133141, + 0.134928, 0.135822, 0.136715, 0.138205, 0.139396, 0.139694, + 0.139396, 0.139396, 0.139098, 0.138800, 0.137609, 0.135226, + 0.132545, 0.129567, 0.125397, 0.120333, 0.115568, 0.111100, + 0.107228, 0.102462, 0.098292, 0.094122, 0.090548, 0.086080, + 0.081016, 0.075357, 0.069698, 0.065528, 0.061656, 0.057784, + 0.053614, 0.050040, 0.047657, 0.045870, 0.043189, 0.040508, + 0.038125, 0.036040, 0.034253, 0.030977, 0.027105, 0.024126, + 0.022041, 0.018765, 0.014893, 0.010723, 0.006851, 0.003276, + -0.000894, -0.005957, -0.011914, -0.017871, -0.024126, -0.030679, + -0.037828, -0.045572, -0.052720, -0.060464, -0.067911, -0.075655, + -0.083101, -0.089952, -0.097101, -0.104845, -0.112887, -0.120333, + -0.127482, -0.133737, -0.140885, -0.147438, -0.153693, -0.158459, + -0.163224, -0.168586, -0.174543, -0.180500, -0.184372, -0.188542, + -0.193308, -0.198967, -0.204030, -0.207307, -0.211179, -0.216540, + -0.223391, -0.229944, -0.235603, -0.241858, -0.248709, -0.256751, + -0.265091, -0.273728, -0.282068, -0.289813, -0.298450, -0.308279, + -0.319300, -0.330916, -0.341044, -0.351171, -0.361893, -0.374403, + -0.387211, -0.398827, -0.409550, -0.420273, -0.431889, -0.443803, + -0.454228, -0.464355, -0.473887, -0.484609, -0.494439, -0.503672, + -0.513799, -0.524820, -0.536436, -0.545670, -0.553116, -0.561754, + -0.572179, -0.583497, -0.594220, -0.603453, -0.612091, -0.622218, + -0.635324, -0.649025, -0.660046, -0.669577, -0.679108, -0.690725, + -0.703830, -0.717532, -0.730935, -0.743743, -0.758040, -0.775018, + -0.793187, -0.813143, -0.832801, -0.851864, -0.870331, -0.891181, + -0.916499, -0.942710, -0.966538, -0.984409, -0.994536, -0.998706, + -0.999600, -0.995430, -0.980239, -0.950156, -0.908754, -0.865268, + -0.829823, -0.803016, -0.772039, -0.727361, -0.674343, -0.624899, + -0.581710, -0.533160, -0.468227, -0.387807, -0.308279, -0.244836, + -0.200158, -0.161437, -0.120333, -0.080421, -0.047359, -0.021148, + 0.004766, 0.037232, 0.076251, 0.115568, 0.148332, 0.169479, + 0.177223, 0.170373, 0.152799, 0.131950, 0.110206, 0.086676, + 0.058677, 0.031573, 0.013106, 0.003574, -0.005361, -0.024722, + -0.051827, -0.077442, -0.093824, -0.104547, -0.119440, -0.138800, + -0.153097, -0.155480, -0.148332, -0.140885, -0.137311, -0.131354, + -0.117057, -0.095909, -0.074762, -0.055997, -0.035743, -0.011021, + 0.014595, 0.039317, 0.062252, 0.086676, 0.112887, 0.139694, + 0.164714, 0.187351, 0.208498, 0.226965, 0.240964, 0.248113, + 0.251687, 0.256453, 0.262708, 0.269856, 0.276111, 0.284749, + 0.294876, 0.302322, 0.302322, 0.294876, 0.284153, 0.273133, + 0.262708, 0.252581, 0.244241, 0.244241, 0.252581, 0.267176, + 0.281473, 0.293089, 0.303812, 0.313343, 0.320789, 0.324661, + 0.327938, 0.333299, 0.343426, 0.357723, 0.374999, 0.393764, + 0.413124, 0.430698, 0.442910, 0.449165, 0.451548, 0.452739, + 0.450952, 0.445888, 0.438442, 0.432187, 0.428017, 0.424145, + 0.417294, 0.406274, 0.392572, 0.378573, 0.363680, 0.346405, + 0.325555, 0.303812, 0.284749, 0.268665, 0.254070, 0.240369, + 0.226965, 0.216540, 0.208200, 0.201350, 0.194797, 0.188840, + 0.185563, 0.184670, 0.188244, 0.194499, 0.204328, 0.216242, + 0.230837, 0.247815, 0.264495, 0.280281, 0.294578, 0.307684, + 0.319300, 0.329725, 0.340150, 0.351468, 0.364872, 0.377680, + 0.391083, 0.403295, 0.414614, 0.422954, 0.426528, 0.425038, + 0.419379, 0.411933, 0.402997, 0.392572, 0.381552, 0.371723, + 0.363978, 0.357128, 0.349383, 0.338959, 0.327044, 0.314237, + 0.300833, 0.285643, 0.268963, 0.253474, 0.241858, 0.234114, + 0.227859, 0.222200, 0.218327, 0.216242, 0.215051, 0.212370, + 0.208498, 0.204626, 0.202541, 0.201945, 0.203733, 0.208498, + 0.215945, 0.221902, 0.225476, 0.227859, 0.230242, 0.232922, + 0.233518, 0.230539, 0.226965, 0.226667, 0.229348, 0.232327, + 0.232327, 0.229646, 0.227263, 0.225476, 0.223391, 0.217732, + 0.209690, 0.201052, 0.194499, 0.190031, 0.187053, 0.185266, + 0.184074, 0.184074, 0.183478, 0.183181, 0.182585, 0.181096, + 0.179011, 0.175139, 0.171862, 0.170671, 0.171266, 0.173947, + 0.176032, 0.178713, 0.182287, 0.187351, 0.192414, 0.194499, + 0.194797, 0.193605, 0.193308, 0.193605, 0.193308, 0.192414, + 0.191223, 0.193010, 0.196882, 0.201350, 0.203733, 0.204626, + 0.204924, 0.206115, 0.206413, 0.206115, 0.204924, 0.205222, + 0.207903, 0.211179, 0.215349, 0.218625, 0.221306, 0.222795, + 0.223093, 0.222200, 0.220710, 0.220115, 0.219817, 0.219817, + 0.219817, 0.222200, 0.223987, 0.226072, 0.225178, 0.222200, + 0.217434, 0.212370, 0.206413, 0.200158, 0.192712, 0.186755, + 0.181989, 0.178117, 0.173351, 0.167394, 0.160841, 0.154587, + 0.146544, 0.137907, 0.128077, 0.119440, 0.111695, 0.105441, + 0.100377, 0.095909, 0.092633, 0.090548, 0.088165, 0.085186, + 0.081314, 0.077144, 0.073868, 0.070592, 0.068209, 0.066124, + 0.064932, 0.064932, 0.064634, 0.064039, 0.063741, 0.062847, + 0.062252, 0.059869, 0.056592, 0.052422, 0.048252, 0.044678, + 0.040210, 0.035147, 0.030381, 0.026211, 0.022041, 0.016382, + 0.009531, 0.001489, -0.005659, -0.013106, -0.020254, -0.028594, + -0.035743, -0.041997, -0.047359, -0.053018, -0.058975, -0.065230, + -0.070889, -0.076549, -0.082208, -0.088463, -0.094718, -0.099483, + -0.103951, -0.107526, -0.110802, -0.113780, -0.117057, -0.120631, + -0.125695, -0.131652, -0.138205, -0.144757, -0.151608, -0.158756, + -0.165905, -0.172160, -0.177521, -0.183181, -0.190329, -0.197478, + -0.205222, -0.212966, -0.221604, -0.231731, -0.242156, -0.252283, + -0.260027, -0.267176, -0.274324, -0.282068, -0.289217, -0.295770, + -0.302025, -0.309173, -0.318407, -0.327044, -0.333895, -0.340150, + -0.346703, -0.353553, -0.359510, -0.364276, -0.368148, -0.374105, + -0.381552, -0.389594, -0.396147, -0.401806, -0.409550, -0.418486, + -0.427719, -0.435463, -0.441420, -0.448271, -0.456611, -0.467334, + -0.478057, -0.486694, -0.495630, -0.506055, -0.516480, -0.526607, + -0.534947, -0.542691, -0.549542, -0.558179, -0.568902, -0.579327, + -0.589156, -0.600773, -0.612687, -0.623112, -0.632643, -0.642174, + -0.649919, -0.656471, -0.664216, -0.673151, -0.681491, -0.689236, + -0.698469, -0.710085, -0.722595, -0.734509, -0.747913, -0.759231, + -0.769954, -0.781273, -0.797357, -0.816122, -0.834886, -0.852162, + -0.870927, -0.896244, -0.927221, -0.955815, -0.974282, -0.980239, + -0.978154, -0.972793, -0.964453, -0.947475, -0.915903, -0.869735, + -0.819100, -0.774124, -0.740764, -0.710383, -0.668684, -0.611495, + -0.548946, -0.493545, -0.441718, -0.381254, -0.302918, -0.216540, + -0.141183, -0.089059, -0.054210, -0.021148, 0.015786, 0.050337, + 0.073868, 0.088165, 0.106334, 0.135226, 0.167990, 0.192414, + 0.204030, 0.204030, 0.193308, 0.170969, 0.139396, 0.103058, + 0.065826, 0.030083, -0.002085, -0.029488, -0.050933, -0.066422, + -0.083697, -0.106334, -0.131950, -0.151906, -0.165011, -0.176032, + -0.189138, -0.200158, -0.199265, -0.184074, -0.161437, -0.142077, + -0.127780, -0.109908, -0.081910, -0.050040, -0.023233, -0.002383, + 0.020552, 0.053018, 0.089356, 0.124205, 0.153097, 0.179011, + 0.205222, 0.230539, 0.251687, 0.265091, 0.273133, 0.278792, + 0.283558, 0.286238, 0.286834, 0.288919, 0.293089, 0.297855, + 0.302322, 0.303812, 0.303216, 0.299046, 0.289813, 0.277303, + 0.264495, 0.254964, 0.249304, 0.247517, 0.250794, 0.260921, + 0.277005, 0.295770, 0.312449, 0.325853, 0.337767, 0.348788, + 0.357723, 0.364276, 0.371127, 0.380956, 0.394955, 0.411933, + 0.428613, 0.442612, 0.453930, 0.461377, 0.463462, 0.458696, + 0.448867, 0.436655, 0.423549, 0.409848, 0.395551, 0.382445, + 0.370233, 0.358021, 0.342533, 0.324066, 0.304110, 0.285345, + 0.265984, 0.245134, 0.225178, 0.208796, 0.198669, 0.193308, + 0.190329, 0.186457, 0.184670, 0.186159, 0.190329, 0.195095, + 0.198669, 0.204924, 0.215945, 0.232624, 0.251687, 0.271048, + 0.291898, 0.314534, 0.338363, 0.358915, 0.374701, 0.387509, + 0.398529, 0.408061, 0.415209, 0.421166, 0.427123, 0.433974, + 0.440527, 0.445293, 0.447675, 0.447675, 0.444399, 0.436357, + 0.424145, 0.408359, 0.391977, 0.376190, 0.360404, 0.344618, + 0.329725, 0.318109, 0.309173, 0.300237, 0.289217, 0.276707, + 0.264793, 0.253474, 0.242751, 0.230837, 0.220710, 0.214455, + 0.211775, 0.211775, 0.212966, 0.218030, 0.225476, 0.232922, + 0.238582, 0.241560, 0.244836, 0.249602, 0.254368, 0.258240, + 0.261218, 0.265686, 0.272835, 0.278792, 0.281770, 0.282366, + 0.282366, 0.281175, 0.278196, 0.272835, 0.266580, 0.261218, + 0.257942, 0.255261, 0.250794, 0.245432, 0.241858, 0.239177, + 0.234412, 0.227561, 0.220115, 0.213860, 0.209987, 0.206413, + 0.203435, 0.201052, 0.200754, 0.201648, 0.202243, 0.200754, + 0.198967, 0.196584, 0.194201, 0.191520, 0.189138, 0.187946, + 0.188244, 0.189733, 0.191520, 0.192414, 0.192712, 0.193308, + 0.193308, 0.191520, 0.187648, 0.184074, 0.181691, 0.179011, + 0.176926, 0.176032, 0.176330, 0.177819, 0.180500, 0.183181, + 0.184968, 0.187053, 0.188542, 0.189733, 0.190925, 0.192116, + 0.194797, 0.198371, 0.201945, 0.206711, 0.211179, 0.215349, + 0.220115, 0.222795, 0.223987, 0.224582, 0.223689, 0.222200, + 0.219519, 0.216838, 0.214455, 0.211477, 0.207605, 0.202243, + 0.195690, 0.188244, 0.179904, 0.170373, 0.159650, 0.148034, + 0.137907, 0.128077, 0.118248, 0.108419, 0.098888, 0.090250, + 0.082208, 0.073570, 0.064932, 0.056592, 0.049444, 0.043487, + 0.038721, 0.034849, 0.032466, 0.031573, 0.031870, 0.032168, + 0.032168, 0.032168, 0.032466, 0.032764, 0.032466, 0.032168, + 0.031870, 0.031573, 0.031870, 0.031870, 0.031275, 0.030381, + 0.028296, 0.025913, 0.022041, 0.016382, 0.009829, 0.002383, + -0.005064, -0.012808, -0.020850, -0.028594, -0.036040, -0.042891, + -0.050040, -0.057486, -0.064932, -0.072677, -0.080123, -0.087271, + -0.094122, -0.100377, -0.106334, -0.111695, -0.116461, -0.120333, + -0.123610, -0.127482, -0.131056, -0.134630, -0.138205, -0.141183, + -0.145353, -0.150417, -0.154884, -0.159054, -0.162926, -0.167394, + -0.173054, -0.179606, -0.186159, -0.193308, -0.201350, -0.209690, + -0.218327, -0.226072, -0.234114, -0.242156, -0.251091, -0.260027, + -0.268665, -0.277005, -0.285047, -0.293982, -0.302918, -0.312152, + -0.319896, -0.326449, -0.333597, -0.341044, -0.347298, -0.352660, + -0.355936, -0.361298, -0.368148, -0.375892, -0.382147, -0.386913, + -0.391977, -0.398827, -0.406572, -0.413720, -0.418784, -0.422954, + -0.428613, -0.435463, -0.443803, -0.450654, -0.456909, -0.464653, + -0.473589, -0.483120, -0.491460, -0.498906, -0.506055, -0.512906, + -0.520352, -0.527798, -0.536436, -0.545670, -0.554903, -0.563839, + -0.573668, -0.584689, -0.594816, -0.602858, -0.609708, -0.614474, + -0.619835, -0.627580, -0.637707, -0.646940, -0.654387, -0.661833, + -0.672258, -0.685661, -0.697575, -0.704426, -0.708298, -0.715745, + -0.730042, -0.745828, -0.758933, -0.772039, -0.788719, -0.810760, + -0.836376, -0.860800, -0.881650, -0.901010, -0.921264, -0.938838, + -0.944497, -0.937646, -0.924541, -0.910839, -0.892372, -0.861693, + -0.814632, -0.760125, -0.712170, -0.675236, -0.638898, -0.591241, + -0.532266, -0.472993, -0.419975, -0.367553, -0.303514, -0.224582, + -0.143268, -0.077442, -0.032168, 0.002979, 0.038721, 0.071187, + 0.092335, 0.101866, 0.111695, 0.130162, 0.153395, 0.173351, + 0.185266, 0.190627, 0.189436, 0.176032, 0.147736, 0.109313, + 0.068507, 0.030381, -0.003872, -0.036040, -0.064634, -0.085782, + -0.100973, -0.115568, -0.134630, -0.155480, -0.168586, -0.173649, + -0.178415, -0.186457, -0.189138, -0.178117, -0.154884, -0.130460, + -0.112589, -0.095313, -0.070592, -0.037828, -0.005659, 0.020254, + 0.043189, 0.072081, 0.108419, 0.145055, 0.175139, 0.197775, + 0.218625, 0.242156, 0.263006, 0.276111, 0.281770, 0.285940, + 0.291600, 0.295770, 0.294578, 0.290706, 0.288919, 0.292195, + 0.295472, 0.296961, 0.295770, 0.293387, 0.289813, 0.284153, + 0.275813, 0.266878, 0.259729, 0.257644, 0.261218, 0.269558, + 0.281473, 0.298152, 0.318704, 0.338959, 0.356532, 0.369638, + 0.380658, 0.390487, 0.399125, 0.406274, 0.412826, 0.421464, + 0.433676, 0.447080, 0.457803, 0.462866, 0.462568, 0.457207, + 0.448867, 0.436655, 0.419975, 0.399423, 0.380360, 0.363978, + 0.349681, 0.333597, 0.315428, 0.297259, 0.280579, 0.264197, + 0.246921, 0.228157, 0.210881, 0.198371, 0.190329, 0.186159, + 0.183776, 0.184372, 0.187053, 0.193010, 0.200456, 0.207605, + 0.215647, 0.226072, 0.240667, 0.258240, 0.277303, 0.297855, + 0.320492, 0.342831, 0.364276, 0.383041, 0.398827, 0.411635, + 0.421464, 0.428017, 0.431889, 0.434570, 0.436357, 0.438144, + 0.439038, 0.438442, 0.436655, 0.432783, 0.426528, 0.416996, + 0.404487, 0.390487, 0.373808, 0.356830, 0.339852, 0.323172, + 0.308279, 0.295472, 0.284749, 0.275813, 0.267771, 0.260325, + 0.252879, 0.244836, 0.236497, 0.229050, 0.222200, 0.216540, + 0.212668, 0.212072, 0.214455, 0.219221, 0.224582, 0.228454, + 0.232029, 0.236199, 0.240964, 0.245134, 0.246624, 0.246624, + 0.248411, 0.252879, 0.257346, 0.259729, 0.259729, 0.260027, + 0.262708, 0.265686, 0.265091, 0.259431, 0.252283, 0.248113, + 0.247219, 0.245730, 0.243645, 0.240369, 0.237986, 0.237390, + 0.235901, 0.231433, 0.224582, 0.218030, 0.213860, 0.210285, + 0.207605, 0.204924, 0.202541, 0.200158, 0.198669, 0.196882, + 0.193903, 0.191223, 0.186755, 0.180202, 0.172756, 0.166501, + 0.162331, 0.159054, 0.156672, 0.156076, 0.156672, 0.157565, + 0.157565, 0.156076, 0.152799, 0.150119, 0.149225, 0.148629, + 0.147736, 0.147736, 0.149225, 0.153097, 0.159054, 0.165607, + 0.171266, 0.176330, 0.182287, 0.188542, 0.193308, 0.196882, + 0.199860, 0.203733, 0.209392, 0.215349, 0.220412, 0.223689, + 0.225476, 0.226667, 0.228157, 0.227263, 0.223987, 0.219519, + 0.214455, 0.209094, 0.203137, 0.195690, 0.186755, 0.179011, + 0.171862, 0.163522, 0.153991, 0.142077, 0.131056, 0.120035, + 0.109610, 0.100079, 0.090846, 0.083399, 0.077144, 0.071187, + 0.065230, 0.059273, 0.054210, 0.050337, 0.046465, 0.042891, + 0.040210, 0.038423, 0.038721, 0.039317, 0.039615, 0.041700, + 0.044082, 0.046763, 0.047359, 0.046465, 0.044380, 0.041997, + 0.039615, 0.037530, 0.034551, 0.031870, 0.029785, 0.027403, + 0.025020, 0.020850, 0.015488, 0.009531, 0.003872, -0.002383, + -0.009829, -0.017871, -0.025318, -0.031870, -0.037828, -0.043487, + -0.048252, -0.052720, -0.056890, -0.061358, -0.066422, -0.071783, + -0.076549, -0.081016, -0.084889, -0.088761, -0.092335, -0.096207, + -0.099781, -0.103653, -0.108121, -0.112291, -0.117057, -0.122418, + -0.127780, -0.134035, -0.139992, -0.146842, -0.153991, -0.161735, + -0.168884, -0.176032, -0.184372, -0.193308, -0.202541, -0.211179, + -0.220115, -0.228454, -0.237390, -0.244836, -0.251687, -0.258538, + -0.264793, -0.271346, -0.277005, -0.282068, -0.286834, -0.291600, + -0.295472, -0.299642, -0.302918, -0.306492, -0.309173, -0.312152, + -0.315130, -0.317513, -0.320789, -0.324959, -0.328831, -0.332704, + -0.336278, -0.341044, -0.347596, -0.354745, -0.362191, -0.369935, + -0.378573, -0.387807, -0.397934, -0.408657, -0.418486, -0.427719, + -0.437251, -0.447080, -0.457803, -0.468227, -0.478354, -0.486099, + -0.494141, -0.504566, -0.515884, -0.525118, -0.530777, -0.537032, + -0.544776, -0.552520, -0.559073, -0.562647, -0.566222, -0.572477, + -0.582008, -0.590944, -0.596007, -0.601071, -0.609410, -0.618942, + -0.628473, -0.634728, -0.640090, -0.647834, -0.658259, -0.668684, + -0.677023, -0.686555, -0.699958, -0.715447, -0.732127, -0.748509, + -0.764891, -0.780677, -0.800335, -0.820589, -0.839354, -0.856630, + -0.878969, -0.905180, -0.929008, -0.941816, -0.941221, -0.932881, + -0.924243, -0.913818, -0.889989, -0.847992, -0.792889, -0.736594, + -0.688640, -0.647834, -0.605241, -0.551627, -0.490567, -0.432187, + -0.380360, -0.326746, -0.260623, -0.180202, -0.099186, -0.034551, + 0.008936, 0.042295, 0.073868, 0.104249, 0.126290, 0.136120, + 0.137609, 0.140290, 0.152799, 0.170373, 0.180798, 0.179011, + 0.166501, 0.148034, 0.123908, 0.092633, 0.052422, 0.008638, + -0.032168, -0.064634, -0.089654, -0.108419, -0.125992, -0.145353, + -0.161735, -0.170373, -0.172756, -0.174543, -0.177819, -0.180202, + -0.174841, -0.160544, -0.138800, -0.114376, -0.091739, -0.068507, + -0.039913, -0.006851, 0.027105, 0.055401, 0.079825, 0.105738, + 0.137311, 0.169479, 0.196584, 0.217434, 0.235901, 0.254368, + 0.271048, 0.282962, 0.289813, 0.293089, 0.293089, 0.291004, + 0.287430, 0.283558, 0.280281, 0.279983, 0.282068, 0.285940, + 0.288323, 0.289515, 0.289515, 0.287728, 0.283855, 0.278494, + 0.275515, 0.276707, 0.281175, 0.290408, 0.304705, 0.324959, + 0.347298, 0.368148, 0.386615, 0.403593, 0.417294, 0.427421, + 0.433081, 0.434868, 0.437846, 0.443208, 0.450356, 0.456015, + 0.458994, 0.459292, 0.456015, 0.449760, 0.438144, 0.419975, + 0.397636, 0.375892, 0.354745, 0.334193, 0.314534, 0.294876, + 0.277303, 0.260921, 0.246326, 0.233220, 0.220412, 0.207605, + 0.195393, 0.186159, 0.181393, 0.181691, 0.184670, 0.189733, + 0.197775, 0.208796, 0.222200, 0.235901, 0.249602, 0.263303, + 0.279090, 0.297557, 0.317513, 0.337767, 0.357426, 0.375892, + 0.394657, 0.411933, 0.426528, 0.437251, 0.443208, 0.445888, + 0.446186, 0.443208, 0.439336, 0.434570, 0.429804, 0.424443, + 0.418784, 0.412231, 0.405082, 0.395551, 0.383339, 0.369340, + 0.353553, 0.338363, 0.323470, 0.308577, 0.294876, 0.282664, + 0.274026, 0.268963, 0.264793, 0.260623, 0.255857, 0.251389, + 0.247517, 0.243049, 0.237390, 0.231433, 0.226965, 0.224880, + 0.224582, 0.225178, 0.226667, 0.229050, 0.232624, 0.235603, + 0.236794, 0.236199, 0.236794, 0.237986, 0.240071, 0.240667, + 0.239773, 0.239475, 0.239773, 0.240071, 0.239177, 0.237390, + 0.236199, 0.235007, 0.234412, 0.233518, 0.232327, 0.231135, + 0.229944, 0.228752, 0.227859, 0.226369, 0.223987, 0.220710, + 0.218030, 0.216540, 0.216242, 0.217136, 0.216838, 0.214753, + 0.212072, 0.209690, 0.206413, 0.202541, 0.196584, 0.190329, + 0.183776, 0.178713, 0.172756, 0.165607, 0.159650, 0.154289, + 0.150119, 0.147438, 0.146247, 0.143864, 0.139992, 0.136715, + 0.135524, 0.135822, 0.136715, 0.137311, 0.138205, 0.139694, + 0.142970, 0.147736, 0.152204, 0.157565, 0.164714, 0.173054, + 0.181691, 0.189138, 0.195095, 0.199563, 0.204030, 0.209392, + 0.213264, 0.215945, 0.218327, 0.220412, 0.221306, 0.221008, + 0.219519, 0.217434, 0.213860, 0.209392, 0.203137, 0.195988, + 0.187648, 0.179011, 0.169479, 0.159948, 0.150417, 0.141183, + 0.131950, 0.123014, 0.113780, 0.105143, 0.097696, 0.091441, + 0.085484, 0.079825, 0.074166, 0.069996, 0.066422, 0.062549, + 0.059571, 0.057188, 0.056295, 0.055997, 0.055997, 0.055997, + 0.055997, 0.056592, 0.057188, 0.057188, 0.056890, 0.055997, + 0.054210, 0.052125, 0.049146, 0.045870, 0.041700, 0.038125, + 0.034551, 0.030381, 0.025913, 0.021148, 0.016084, 0.010723, + 0.005659, 0.000000, -0.004468, -0.009829, -0.015191, -0.020850, + -0.026509, -0.031870, -0.036934, -0.041402, -0.045572, -0.048550, + -0.051529, -0.054210, -0.056890, -0.059571, -0.062549, -0.065230, + -0.067911, -0.071485, -0.076251, -0.080421, -0.085484, -0.090548, + -0.095313, -0.100973, -0.106334, -0.112291, -0.118248, -0.124503, + -0.132247, -0.139992, -0.148332, -0.156969, -0.164714, -0.172756, + -0.180798, -0.189733, -0.198073, -0.206413, -0.214157, -0.220710, + -0.226965, -0.233220, -0.238879, -0.243645, -0.248709, -0.252879, + -0.257346, -0.261814, -0.266282, -0.270154, -0.272537, -0.275218, + -0.279090, -0.282068, -0.285345, -0.286238, -0.287430, -0.290110, + -0.294876, -0.300237, -0.305003, -0.309173, -0.314832, -0.322874, + -0.330619, -0.336874, -0.342831, -0.350575, -0.360404, -0.370233, + -0.380062, -0.388700, -0.397934, -0.408954, -0.419677, -0.428315, + -0.436357, -0.444697, -0.454824, -0.463164, -0.471504, -0.478354, + -0.485503, -0.493843, -0.502481, -0.509331, -0.514693, -0.519458, + -0.525713, -0.532862, -0.540010, -0.545967, -0.550435, -0.555797, + -0.566222, -0.577242, -0.586178, -0.592731, -0.600177, -0.610006, + -0.619835, -0.628175, -0.633835, -0.639792, -0.648429, -0.658854, + -0.667492, -0.674641, -0.685363, -0.699660, -0.713362, -0.724382, + -0.733616, -0.745828, -0.761614, -0.777103, -0.790506, -0.802420, + -0.821185, -0.845907, -0.870927, -0.890287, -0.901010, -0.903691, + -0.900414, -0.892670, -0.877777, -0.849779, -0.810462, -0.762806, + -0.711277, -0.660344, -0.613878, -0.570689, -0.523926, -0.471504, + -0.416699, -0.363978, -0.311258, -0.254070, -0.185563, -0.110206, + -0.043487, 0.002979, 0.037530, 0.067911, 0.094718, 0.113185, + 0.117653, 0.114376, 0.112887, 0.119738, 0.132545, 0.140587, + 0.139694, 0.132545, 0.120333, 0.100973, 0.072974, 0.036338, + -0.004170, -0.040210, -0.070294, -0.095313, -0.115568, -0.128673, + -0.137609, -0.145353, -0.150714, -0.151012, -0.148332, -0.146247, + -0.143268, -0.136417, -0.121525, -0.098888, -0.072379, -0.045870, + -0.021148, 0.005957, 0.034849, 0.064337, 0.089952, 0.112291, + 0.134332, 0.159054, 0.185861, 0.210285, 0.229348, 0.246028, + 0.261516, 0.274920, 0.283260, 0.287132, 0.287132, 0.285047, + 0.280579, 0.274026, 0.269261, 0.267771, 0.269261, 0.272239, + 0.277898, 0.285047, 0.292195, 0.296365, 0.298450, 0.298450, + 0.298450, 0.299344, 0.302620, 0.308279, 0.317513, 0.332704, + 0.354149, 0.377382, 0.398827, 0.418486, 0.435166, 0.449760, + 0.458100, 0.461079, 0.460185, 0.458398, 0.458100, 0.457505, + 0.455718, 0.453335, 0.450356, 0.443505, 0.432783, 0.417294, + 0.398529, 0.376488, 0.353553, 0.330023, 0.307386, 0.287430, + 0.271346, 0.257346, 0.244241, 0.233220, 0.223391, 0.215349, + 0.208796, 0.202243, 0.198073, 0.198073, 0.202839, 0.211775, + 0.222497, 0.235603, 0.250496, 0.267176, 0.282664, 0.297259, + 0.310662, 0.323470, 0.336874, 0.350873, 0.365765, 0.381254, + 0.396742, 0.410444, 0.422656, 0.432187, 0.438442, 0.440527, + 0.437548, 0.430698, 0.421762, 0.411933, 0.403295, 0.394955, + 0.387509, 0.380360, 0.375595, 0.370829, 0.365468, 0.357128, + 0.347001, 0.335384, 0.324066, 0.313045, 0.302620, 0.293685, + 0.286238, 0.281473, 0.280281, 0.280281, 0.280281, 0.278494, + 0.275813, 0.273133, 0.269856, 0.264793, 0.259729, 0.255857, + 0.255261, 0.254964, 0.253772, 0.251687, 0.251091, 0.251091, + 0.249006, 0.244539, 0.238582, 0.234114, 0.231731, 0.229944, + 0.228454, 0.226369, 0.225476, 0.226369, 0.226965, 0.226965, + 0.224284, 0.220710, 0.217732, 0.217136, 0.217732, 0.220115, + 0.223689, 0.228752, 0.233220, 0.237092, 0.240667, 0.242454, + 0.241858, 0.238582, 0.233816, 0.229050, 0.224880, 0.221008, + 0.216540, 0.212072, 0.208498, 0.204924, 0.199860, 0.193605, + 0.184968, 0.175139, 0.164416, 0.154289, 0.144459, 0.135226, + 0.127482, 0.122120, 0.119738, 0.118844, 0.119440, 0.120631, + 0.123610, 0.126290, 0.128077, 0.129567, 0.132545, 0.137013, + 0.142672, 0.149225, 0.157267, 0.165905, 0.175436, 0.184372, + 0.192414, 0.198967, 0.204626, 0.209392, 0.212370, 0.214157, + 0.215945, 0.216838, 0.217434, 0.217434, 0.215945, 0.212966, + 0.209094, 0.203137, 0.195690, 0.185861, 0.176628, 0.167692, + 0.159352, 0.150714, 0.143268, 0.136715, 0.131056, 0.125099, + 0.117355, 0.109313, 0.102164, 0.095909, 0.088761, 0.082208, + 0.078038, 0.075357, 0.073868, 0.073868, 0.073868, 0.073570, + 0.072677, 0.071485, 0.069400, 0.065826, 0.062252, 0.058975, + 0.055997, 0.053316, 0.050635, 0.049444, 0.048252, 0.047061, + 0.044678, 0.040806, 0.036636, 0.031573, 0.026509, 0.020254, + 0.014595, 0.008936, 0.004766, 0.001191, -0.001787, -0.005064, + -0.007446, -0.009829, -0.011914, -0.015488, -0.018765, -0.022041, + -0.024424, -0.026807, -0.029190, -0.031573, -0.033360, -0.034551, + -0.036338, -0.039019, -0.042891, -0.047061, -0.051529, -0.056890, + -0.062549, -0.069400, -0.075357, -0.081314, -0.087271, -0.094420, + -0.102164, -0.110504, -0.119142, -0.128673, -0.137907, -0.147736, + -0.156672, -0.165011, -0.172458, -0.179011, -0.186159, -0.192116, + -0.197478, -0.202541, -0.207903, -0.213562, -0.219221, -0.224284, + -0.228454, -0.232029, -0.235007, -0.237390, -0.238879, -0.239773, + -0.241560, -0.243645, -0.245730, -0.248709, -0.251687, -0.256155, + -0.260623, -0.265686, -0.269558, -0.273728, -0.278792, -0.284153, + -0.289515, -0.295174, -0.301727, -0.309769, -0.317513, -0.324364, + -0.331214, -0.339852, -0.349681, -0.357723, -0.364276, -0.370531, + -0.378573, -0.387211, -0.395849, -0.402402, -0.408061, -0.413720, + -0.420273, -0.428017, -0.433676, -0.438442, -0.442612, -0.446782, + -0.451250, -0.456015, -0.463164, -0.469419, -0.474482, -0.478950, + -0.486694, -0.497119, -0.506353, -0.510225, -0.512608, -0.519161, + -0.530479, -0.542095, -0.548052, -0.551925, -0.557584, -0.567711, + -0.579625, -0.590348, -0.595709, -0.598688, -0.603156, -0.611793, + -0.623410, -0.631452, -0.633239, -0.634132, -0.640090, -0.653791, + -0.667194, -0.673747, -0.677321, -0.682981, -0.696384, -0.713957, + -0.729148, -0.740169, -0.750891, -0.768465, -0.792293, -0.817015, + -0.837865, -0.855141, -0.870033, -0.879267, -0.880458, -0.872714, + -0.857225, -0.833993, -0.799740, -0.756253, -0.708894, -0.659152, + -0.608219, -0.558477, -0.512906, -0.466738, -0.415209, -0.359213, + -0.303216, -0.246326, -0.186755, -0.120333, -0.054507, 0.000298, + 0.039019, 0.064932, 0.083697, 0.097398, 0.105738, 0.107526, + 0.105143, 0.103058, 0.106632, 0.114376, 0.115568, 0.104845, + 0.086974, 0.066422, 0.041997, 0.010723, -0.024722, -0.055699, + -0.078038, -0.093526, -0.107228, -0.118546, -0.124503, -0.127780, + -0.130758, -0.131950, -0.128077, -0.118248, -0.105143, -0.087271, + -0.066719, -0.042295, -0.014595, 0.014297, 0.039615, 0.059571, + 0.077740, 0.098590, 0.122120, 0.142077, 0.157565, 0.173054, + 0.193308, 0.215349, 0.232624, 0.242156, 0.249304, 0.255857, + 0.261218, 0.262112, 0.258240, 0.251985, 0.246624, 0.243347, + 0.241262, 0.240964, 0.243645, 0.251389, 0.264197, 0.278494, + 0.290408, 0.300833, 0.310364, 0.320789, 0.329427, 0.335682, + 0.343128, 0.355638, 0.372020, 0.390487, 0.409252, 0.428315, + 0.447675, 0.464355, 0.476269, 0.482822, 0.484907, 0.484014, + 0.481929, 0.477759, 0.471206, 0.462270, 0.451548, 0.440825, + 0.427719, 0.411039, 0.390785, 0.369042, 0.348192, 0.328831, + 0.309769, 0.291898, 0.275813, 0.263303, 0.253176, 0.244539, + 0.236199, 0.228752, 0.223093, 0.220710, 0.221306, 0.223689, + 0.228752, 0.237688, 0.250794, 0.266282, 0.282962, 0.298748, + 0.313343, 0.327342, 0.339852, 0.350575, 0.359213, 0.366659, + 0.373212, 0.379169, 0.386317, 0.393168, 0.399423, 0.404189, + 0.407465, 0.408954, 0.407763, 0.402997, 0.395253, 0.386317, + 0.377084, 0.368148, 0.359510, 0.353553, 0.349383, 0.347001, + 0.344916, 0.344022, 0.343128, 0.343128, 0.341639, 0.340448, + 0.338065, 0.335980, 0.334491, 0.333299, 0.331810, 0.329427, + 0.327044, 0.324661, 0.321683, 0.316322, 0.309173, 0.301429, + 0.295770, 0.291302, 0.285345, 0.275515, 0.265686, 0.257644, + 0.251389, 0.243943, 0.235603, 0.226667, 0.218625, 0.213264, + 0.209392, 0.205222, 0.201052, 0.200158, 0.202839, 0.207605, + 0.212966, 0.217434, 0.221604, 0.224582, 0.227859, 0.230837, + 0.233816, 0.236794, 0.240071, 0.243645, 0.246921, 0.250198, + 0.254070, 0.257049, 0.258240, 0.256751, 0.251985, 0.246028, + 0.239177, 0.230539, 0.220710, 0.209690, 0.199265, 0.190329, + 0.183478, 0.175436, 0.166203, 0.156374, 0.148927, 0.142970, + 0.137311, 0.130758, 0.124503, 0.120631, 0.119738, 0.120929, + 0.122120, 0.123312, 0.126588, 0.131056, 0.136120, 0.140885, + 0.146544, 0.152799, 0.160544, 0.167990, 0.174543, 0.180500, + 0.185861, 0.190031, 0.192712, 0.193903, 0.194499, 0.194201, + 0.193308, 0.191520, 0.189436, 0.186755, 0.184968, 0.183776, + 0.181393, 0.177819, 0.173351, 0.169181, 0.164416, 0.159054, + 0.152799, 0.146247, 0.141183, 0.137907, 0.135226, 0.132843, + 0.131354, 0.130162, 0.129567, 0.128971, 0.127482, 0.125099, + 0.121823, 0.118546, 0.115270, 0.111398, 0.107228, 0.102462, + 0.097994, 0.093526, 0.088761, 0.083697, 0.077740, 0.071783, + 0.065528, 0.058975, 0.052125, 0.045274, 0.038125, 0.031870, + 0.026509, 0.021148, 0.016382, 0.011616, 0.007744, 0.004468, + 0.002681, 0.000596, 0.000000, -0.000298, 0.000298, 0.000894, + 0.002085, 0.002979, 0.003574, 0.003574, 0.002979, 0.001787, + 0.000596, -0.000894, -0.002383, -0.004468, -0.007149, -0.010127, + -0.013403, -0.017573, -0.022935, -0.029190, -0.036040, -0.044082, + -0.052125, -0.060762, -0.070592, -0.079527, -0.088165, -0.095909, + -0.103058, -0.110206, -0.116461, -0.122418, -0.128077, -0.134035, + -0.139992, -0.145949, -0.151310, -0.155480, -0.159650, -0.164416, + -0.168586, -0.172458, -0.175734, -0.178713, -0.182287, -0.186159, + -0.190329, -0.194499, -0.198371, -0.203137, -0.208796, -0.214157, + -0.219519, -0.224880, -0.230539, -0.237092, -0.243943, -0.250198, + -0.256751, -0.263303, -0.269261, -0.274920, -0.279388, -0.283855, + -0.288025, -0.293387, -0.298450, -0.301429, -0.304407, -0.308875, + -0.314237, -0.319598, -0.322874, -0.324959, -0.327342, -0.330916, + -0.334491, -0.338065, -0.341341, -0.344022, -0.347894, -0.354745, + -0.363383, -0.369935, -0.374701, -0.380956, -0.389892, -0.398232, + -0.405380, -0.412529, -0.419677, -0.427123, -0.436953, -0.447378, + -0.455718, -0.463760, -0.473589, -0.483120, -0.490567, -0.497715, + -0.506949, -0.514395, -0.519161, -0.523628, -0.529585, -0.534947, + -0.540606, -0.546861, -0.550137, -0.551031, -0.553116, -0.557286, + -0.560562, -0.560562, -0.559669, -0.562349, -0.568604, -0.577242, + -0.584689, -0.588263, -0.592135, -0.603453, -0.618644, -0.630558, + -0.637707, -0.645749, -0.661237, -0.680300, -0.697575, -0.708298, + -0.717532, -0.734212, -0.757146, -0.777996, -0.792591, -0.809867, + -0.833397, -0.857523, -0.874799, -0.879565, -0.872416, -0.858119, + -0.841737, -0.817015, -0.775613, -0.722000, -0.661833, -0.597794, + -0.537925, -0.491162, -0.451548, -0.405082, -0.349383, -0.296067, + -0.250496, -0.208796, -0.159352, -0.095016, -0.024722, 0.025615, + 0.046167, 0.053018, 0.064932, 0.076846, 0.075655, 0.055997, + 0.031573, 0.019658, 0.026509, 0.036636, 0.031275, 0.015786, + 0.003574, -0.004468, -0.018169, -0.042593, -0.069102, -0.087271, + -0.092335, -0.089356, -0.089654, -0.090548, -0.084889, -0.074166, + -0.066124, -0.059869, -0.048550, -0.033360, -0.015786, 0.001489, + 0.020850, 0.044678, 0.072677, 0.097994, 0.112291, 0.116759, + 0.123312, 0.134332, 0.142077, 0.141779, 0.137907, 0.138502, + 0.148629, 0.163522, 0.173054, 0.175436, 0.179308, 0.188542, + 0.199563, 0.205222, 0.204030, 0.200456, 0.200456, 0.204626, + 0.212072, 0.221604, 0.234114, 0.254070, 0.280877, 0.309173, + 0.335086, 0.356234, 0.372616, 0.386615, 0.400019, 0.410741, + 0.419081, 0.426230, 0.434868, 0.446484, 0.458696, 0.469419, + 0.473589, 0.472695, 0.470015, 0.466142, 0.459887, 0.448569, + 0.436059, 0.424741, 0.416103, 0.406274, 0.393764, 0.378871, + 0.361595, 0.344916, 0.328236, 0.312152, 0.298450, 0.287728, + 0.281473, 0.277898, 0.278494, 0.280877, 0.283260, 0.285345, + 0.285940, 0.285643, 0.286536, 0.287430, 0.288323, 0.289515, + 0.292791, 0.299046, 0.307982, 0.317811, 0.327044, 0.335384, + 0.341937, 0.345511, 0.346405, 0.344320, 0.340150, 0.335384, + 0.331810, 0.328831, 0.328236, 0.329129, 0.332406, 0.335682, + 0.339554, 0.344022, 0.347894, 0.349086, 0.348788, 0.348788, + 0.349383, 0.351468, 0.353553, 0.357128, 0.361595, 0.368148, + 0.373808, 0.377084, 0.377977, 0.377680, 0.377680, 0.377680, + 0.374701, 0.371127, 0.366957, 0.362787, 0.356234, 0.346703, + 0.334789, 0.321087, 0.306492, 0.291302, 0.277303, 0.263601, + 0.250496, 0.239773, 0.231731, 0.225178, 0.220115, 0.215051, + 0.210881, 0.207605, 0.206413, 0.205818, 0.204030, 0.201945, + 0.203435, 0.207903, 0.214157, 0.221008, 0.228454, 0.237092, + 0.246028, 0.253474, 0.258240, 0.259133, 0.258538, 0.257049, + 0.254666, 0.250496, 0.246028, 0.240667, 0.235901, 0.230539, + 0.224880, 0.218327, 0.211179, 0.204030, 0.197180, 0.189436, + 0.181691, 0.173649, 0.166203, 0.159650, 0.155182, 0.150714, + 0.146247, 0.142970, 0.140587, 0.138205, 0.137013, 0.135822, + 0.136715, 0.139098, 0.143268, 0.149523, 0.154289, 0.156672, + 0.157863, 0.159352, 0.161139, 0.161735, 0.161437, 0.161139, + 0.160544, 0.159650, 0.159948, 0.161139, 0.161139, 0.160841, + 0.160841, 0.160544, 0.158459, 0.155182, 0.152204, 0.148332, + 0.145651, 0.144757, 0.145353, 0.146544, 0.149225, 0.151608, + 0.153693, 0.155778, 0.159352, 0.162331, 0.163522, 0.163522, + 0.162926, 0.162033, 0.161139, 0.159650, 0.156969, 0.154587, + 0.151906, 0.148332, 0.143566, 0.137311, 0.130758, 0.123908, + 0.117057, 0.110504, 0.103058, 0.095313, 0.086974, 0.079229, + 0.070294, 0.061954, 0.053912, 0.047657, 0.041700, 0.036338, + 0.032764, 0.030381, 0.029190, 0.029190, 0.029488, 0.029785, + 0.030083, 0.030083, 0.030083, 0.028892, 0.027998, 0.026509, + 0.026211, 0.026807, 0.026807, 0.026509, 0.025615, 0.025020, + 0.023531, 0.020850, 0.017276, 0.012212, 0.007149, 0.001489, + -0.004170, -0.010723, -0.016978, -0.023233, -0.028594, -0.033955, + -0.038721, -0.043487, -0.048252, -0.053614, -0.058380, -0.062847, + -0.067017, -0.070889, -0.074166, -0.077442, -0.081016, -0.084293, + -0.087569, -0.091739, -0.095611, -0.099781, -0.103058, -0.106930, + -0.110504, -0.114674, -0.119440, -0.124801, -0.130758, -0.137013, + -0.143566, -0.150714, -0.157863, -0.165607, -0.173054, -0.180202, + -0.186755, -0.193308, -0.198669, -0.203733, -0.209094, -0.215349, + -0.221604, -0.226965, -0.231135, -0.234709, -0.238582, -0.242156, + -0.245730, -0.247815, -0.249900, -0.251985, -0.254964, -0.256751, + -0.257942, -0.259729, -0.262708, -0.266580, -0.269856, -0.273728, + -0.279685, -0.286238, -0.290706, -0.295174, -0.299940, -0.306195, + -0.313641, -0.320194, -0.325853, -0.330321, -0.335980, -0.342533, + -0.347894, -0.352660, -0.358021, -0.363978, -0.368446, -0.373510, + -0.380360, -0.386020, -0.388998, -0.392870, -0.397040, -0.400912, + -0.403891, -0.407763, -0.413422, -0.420273, -0.428613, -0.436357, + -0.442314, -0.448867, -0.460483, -0.471802, -0.478057, -0.481333, + -0.487588, -0.498609, -0.510523, -0.518565, -0.522139, -0.524522, + -0.530479, -0.540010, -0.547457, -0.546563, -0.542989, -0.546563, + -0.558179, -0.568604, -0.570987, -0.570392, -0.573966, -0.582604, + -0.590944, -0.593624, -0.593028, -0.594518, -0.602560, -0.614474, + -0.624899, -0.630856, -0.638600, -0.652004, -0.670471, -0.687448, + -0.699660, -0.710681, -0.723191, -0.739871, -0.756849, -0.774720, + -0.794080, -0.813143, -0.824462, -0.819994, -0.806590, -0.791102, + -0.770848, -0.736594, -0.684172, -0.621325, -0.559073, -0.504268, + -0.459590, -0.418188, -0.372914, -0.324364, -0.279685, -0.242751, + -0.208498, -0.162033, -0.102462, -0.044082, -0.006553, 0.010127, + 0.017573, 0.025615, 0.029488, 0.023233, 0.007149, -0.009829, + -0.016382, -0.011914, -0.006255, -0.007149, -0.011318, -0.015488, + -0.021148, -0.031573, -0.047657, -0.063741, -0.070294, -0.067315, + -0.058082, -0.048550, -0.037232, -0.022637, -0.009233, -0.001191, + 0.006255, 0.016978, 0.029488, 0.038721, 0.047955, 0.061656, + 0.080123, 0.099781, 0.113780, 0.120333, 0.123312, 0.126588, + 0.127780, 0.123610, 0.114078, 0.105441, 0.104249, 0.110206, + 0.117057, 0.123312, 0.131950, 0.146247, 0.162926, 0.175436, + 0.182883, 0.190031, 0.199265, 0.210583, 0.221008, 0.231731, + 0.247219, 0.269261, 0.295174, 0.322874, 0.348192, 0.371127, + 0.389892, 0.403891, 0.414316, 0.420869, 0.425038, 0.428315, + 0.431591, 0.435761, 0.439633, 0.442314, 0.442314, 0.437846, + 0.430400, 0.422060, 0.413422, 0.403593, 0.393168, 0.383935, + 0.377382, 0.372914, 0.368148, 0.362489, 0.356830, 0.349979, + 0.341639, 0.332108, 0.323470, 0.315726, 0.310662, 0.308577, + 0.310067, 0.314237, 0.319300, 0.323172, 0.325257, 0.326449, + 0.326449, 0.322577, 0.316917, 0.310067, 0.304705, 0.300535, + 0.296961, 0.294578, 0.295174, 0.298152, 0.301131, 0.302025, + 0.299940, 0.296365, 0.293089, 0.290706, 0.288025, 0.285940, + 0.287132, 0.292195, 0.300535, 0.308577, 0.316917, 0.324959, + 0.333001, 0.340448, 0.346107, 0.349979, 0.353553, 0.358617, + 0.364574, 0.369935, 0.375297, 0.380658, 0.383637, 0.383935, + 0.380956, 0.375892, 0.370233, 0.363680, 0.355936, 0.348192, + 0.341937, 0.336278, 0.330023, 0.321087, 0.310960, 0.299344, + 0.287728, 0.274622, 0.260325, 0.247517, 0.239773, 0.235603, + 0.232624, 0.227859, 0.225774, 0.227859, 0.232327, 0.234412, + 0.234709, 0.236497, 0.241858, 0.246624, 0.246921, 0.244241, + 0.241560, 0.240667, 0.241560, 0.242454, 0.243645, 0.244241, + 0.243645, 0.240369, 0.235305, 0.229646, 0.224582, 0.218327, + 0.212370, 0.208200, 0.206413, 0.201350, 0.194499, 0.190031, + 0.187648, 0.185861, 0.182883, 0.180202, 0.177223, 0.176926, + 0.178117, 0.179904, 0.180202, 0.180798, 0.181691, 0.181691, + 0.179011, 0.174543, 0.170969, 0.167692, 0.165011, 0.162629, + 0.160841, 0.159948, 0.159054, 0.156969, 0.154587, 0.153693, + 0.151906, 0.148034, 0.142375, 0.137907, 0.134035, 0.130460, + 0.127482, 0.126886, 0.128077, 0.130758, 0.134630, 0.137609, + 0.139396, 0.142077, 0.144757, 0.147140, 0.148332, 0.151012, + 0.153991, 0.156969, 0.158161, 0.160841, 0.163820, 0.165905, + 0.167394, 0.168586, 0.168288, 0.167096, 0.165607, 0.162926, + 0.159352, 0.154884, 0.151310, 0.147140, 0.141481, 0.134928, + 0.128077, 0.121525, 0.114078, 0.106930, 0.100079, 0.095016, + 0.091144, 0.087867, 0.084591, 0.081910, 0.078336, 0.074762, + 0.070592, 0.066422, 0.062252, 0.058380, 0.055103, 0.051827, + 0.049146, 0.047359, 0.046465, 0.045572, 0.044082, 0.042295, + 0.039615, 0.036934, 0.033658, 0.029488, 0.024722, 0.020254, + 0.015488, 0.011616, 0.008042, 0.003872, 0.000596, -0.002085, + -0.004766, -0.007446, -0.010127, -0.013403, -0.016382, -0.019361, + -0.021446, -0.023531, -0.025913, -0.027998, -0.030083, -0.031573, + -0.033658, -0.036636, -0.039019, -0.041700, -0.044082, -0.047061, + -0.050040, -0.053018, -0.056295, -0.061060, -0.065528, -0.071783, + -0.078336, -0.085782, -0.092931, -0.100973, -0.108121, -0.113780, + -0.117950, -0.123014, -0.128971, -0.134928, -0.139694, -0.143864, + -0.148629, -0.154587, -0.160544, -0.165905, -0.170969, -0.175436, + -0.181096, -0.185563, -0.188840, -0.191223, -0.193903, -0.197775, + -0.202541, -0.207903, -0.212668, -0.216838, -0.220710, -0.224582, + -0.228454, -0.233518, -0.237390, -0.240964, -0.244241, -0.250198, + -0.255857, -0.260623, -0.264495, -0.268069, -0.272239, -0.276707, + -0.279983, -0.282366, -0.285345, -0.289515, -0.293387, -0.296365, + -0.301131, -0.305599, -0.308875, -0.310662, -0.313641, -0.318704, + -0.323768, -0.327342, -0.328534, -0.330916, -0.336278, -0.343724, + -0.350277, -0.354447, -0.358319, -0.366063, -0.375892, -0.385722, + -0.395849, -0.401210, -0.396742, -0.392572, -0.404784, -0.430400, + -0.446782, -0.446186, -0.439038, -0.441123, -0.454228, -0.469121, + -0.475376, -0.472993, -0.473887, -0.483716, -0.494141, -0.495332, + -0.489971, -0.489971, -0.501289, -0.515586, -0.520352, -0.513799, + -0.507544, -0.512012, -0.521543, -0.525118, -0.524522, -0.530181, + -0.541500, -0.548648, -0.549244, -0.551627, -0.560860, -0.570987, + -0.576944, -0.582008, -0.590646, -0.592731, -0.595411, -0.617453, + -0.641579, -0.641877, -0.646940, -0.680002, -0.709787, -0.711872, + -0.708000, -0.722595, -0.750594, -0.763401, -0.753274, -0.736297, + -0.722595, -0.709490, -0.689831, -0.655876, -0.609113, -0.551329, + -0.489077, -0.436059, -0.402104, -0.371127, -0.320492, -0.268069, + -0.244836, -0.237986, -0.209094, -0.161139, -0.119738, -0.086080, + -0.055699, -0.038423, -0.033658, -0.030679, -0.027700, -0.034849, + -0.050635, -0.061954, -0.061656, -0.053316, -0.043189, -0.036338, + -0.030679, -0.022041, -0.016382, -0.019658, -0.025020, -0.019956, + -0.008340, -0.000596, 0.007446, 0.022041, 0.036338, 0.045870, + 0.053912, 0.061358, 0.068804, 0.077144, 0.083995, 0.086378, + 0.088463, 0.093824, 0.101271, 0.105441, 0.103356, 0.097994, + 0.095909, 0.097994, 0.098292, 0.092037, 0.083697, 0.080421, + 0.085484, 0.093228, 0.100079, 0.106930, 0.119738, 0.140885, + 0.165309, 0.185861, 0.202243, 0.217434, 0.232922, 0.247815, + 0.260623, 0.272239, 0.285345, 0.301131, 0.321087, 0.343128, + 0.361893, 0.376190, 0.386020, 0.392274, 0.396444, 0.397338, + 0.394657, 0.391083, 0.388998, 0.388105, 0.388105, 0.387807, + 0.387211, 0.384828, 0.380956, 0.377977, 0.376786, 0.374999, + 0.373808, 0.374701, 0.376190, 0.378573, 0.380956, 0.382147, + 0.381850, 0.380360, 0.376786, 0.373212, 0.369340, 0.364276, + 0.359213, 0.354447, 0.351766, 0.349086, 0.345511, 0.341044, + 0.335086, 0.329427, 0.323768, 0.315428, 0.305003, 0.293982, + 0.285047, 0.277600, 0.271048, 0.265388, 0.262708, 0.263006, + 0.265686, 0.269558, 0.273431, 0.276707, 0.280877, 0.284153, + 0.286834, 0.289515, 0.293387, 0.298450, 0.305003, 0.312449, + 0.319598, 0.326746, 0.333001, 0.338065, 0.340746, 0.342235, + 0.342235, 0.342533, 0.341937, 0.342235, 0.341937, 0.341341, + 0.339256, 0.337171, 0.333597, 0.328831, 0.324066, 0.319598, + 0.316024, 0.311854, 0.307982, 0.305301, 0.302620, 0.299046, + 0.295472, 0.292195, 0.289217, 0.285345, 0.280579, 0.274920, + 0.270452, 0.267771, 0.266282, 0.264495, 0.261814, 0.259431, + 0.258538, 0.258240, 0.254666, 0.247815, 0.239773, 0.232922, + 0.227263, 0.222200, 0.217136, 0.211477, 0.206413, 0.203137, + 0.200754, 0.198371, 0.195393, 0.191818, 0.188542, 0.186755, + 0.186159, 0.185861, 0.185266, 0.184968, 0.186159, 0.187053, + 0.186755, 0.184968, 0.182585, 0.180202, 0.178117, 0.175436, + 0.173351, 0.170671, 0.169181, 0.168586, 0.168586, 0.165607, + 0.161437, 0.156076, 0.151012, 0.146544, 0.142672, 0.138205, + 0.133141, 0.128971, 0.125992, 0.123610, 0.121525, 0.119142, + 0.117950, 0.117653, 0.119738, 0.123312, 0.126588, 0.126886, + 0.125695, 0.126588, 0.128673, 0.129567, 0.128971, 0.130162, + 0.133141, 0.136715, 0.138800, 0.139992, 0.139992, 0.139396, + 0.138800, 0.137609, 0.136120, 0.135822, 0.136120, 0.134928, + 0.132545, 0.131354, 0.131056, 0.129269, 0.125695, 0.123312, + 0.122418, 0.122120, 0.121227, 0.119738, 0.117653, 0.114972, + 0.112887, 0.109908, 0.105738, 0.101568, 0.098590, 0.096207, + 0.092931, 0.088463, 0.083995, 0.081016, 0.078038, 0.073570, + 0.069102, 0.064634, 0.061954, 0.059273, 0.054210, 0.047657, + 0.042593, 0.038721, 0.035743, 0.031870, 0.027403, 0.023233, + 0.021446, 0.019956, 0.018765, 0.016680, 0.014595, 0.013106, + 0.011318, 0.008340, 0.005064, 0.002085, 0.000000, -0.002085, + -0.005064, -0.008042, -0.010127, -0.012212, -0.013999, -0.016680, + -0.019063, -0.022041, -0.024126, -0.027105, -0.030083, -0.033062, + -0.036338, -0.039019, -0.042891, -0.047657, -0.052720, -0.056592, + -0.060762, -0.063443, -0.067017, -0.071187, -0.075655, -0.079825, + -0.083399, -0.086676, -0.090250, -0.094122, -0.098590, -0.103058, + -0.107526, -0.112291, -0.116163, -0.119440, -0.123014, -0.127482, + -0.131652, -0.135524, -0.138502, -0.141779, -0.145651, -0.150119, + -0.155182, -0.160544, -0.166203, -0.171564, -0.176926, -0.181989, + -0.186159, -0.190627, -0.195690, -0.201052, -0.206115, -0.211477, + -0.216838, -0.222497, -0.226667, -0.229348, -0.231433, -0.234114, + -0.238879, -0.242454, -0.244836, -0.246028, -0.247517, -0.250496, + -0.253772, -0.256453, -0.258538, -0.260921, -0.263303, -0.265984, + -0.267473, -0.269856, -0.272239, -0.275515, -0.278196, -0.280877, + -0.284153, -0.287132, -0.290706, -0.294578, -0.298748, -0.302918, + -0.307386, -0.311258, -0.314832, -0.318109, -0.323172, -0.330023, + -0.336576, -0.340746, -0.344618, -0.350277, -0.357426, -0.362787, + -0.365468, -0.367255, -0.372020, -0.377382, -0.382445, -0.386020, + -0.389296, -0.393466, -0.398232, -0.402402, -0.405082, -0.407465, + -0.411635, -0.415805, -0.419677, -0.423549, -0.428613, -0.434272, + -0.439038, -0.441718, -0.445888, -0.451548, -0.456015, -0.456909, + -0.454526, -0.455420, -0.461377, -0.468525, -0.470015, -0.468227, + -0.468227, -0.473589, -0.479546, -0.481631, -0.480439, -0.481333, + -0.485503, -0.490864, -0.493843, -0.496226, -0.502481, -0.511118, + -0.517076, -0.519756, -0.526309, -0.538521, -0.551925, -0.561158, + -0.567115, -0.574561, -0.586476, -0.600773, -0.613580, -0.624005, + -0.630260, -0.633537, -0.633239, -0.626686, -0.615368, -0.598092, + -0.572477, -0.536138, -0.493545, -0.451250, -0.416103, -0.386913, + -0.356532, -0.322874, -0.291004, -0.269261, -0.257644, -0.244539, + -0.219817, -0.187351, -0.155480, -0.130758, -0.115270, -0.103951, + -0.092931, -0.084591, -0.083101, -0.088463, -0.095611, -0.097994, + -0.090250, -0.073868, -0.054210, -0.039317, -0.030679, -0.022637, + -0.011616, -0.000596, 0.005659, 0.009829, 0.016382, 0.029785, + 0.047657, 0.063443, 0.074166, 0.081910, 0.090548, 0.099781, + 0.105441, 0.105441, 0.103951, 0.107228, 0.115270, 0.124503, + 0.129567, 0.129269, 0.126886, 0.125099, 0.123312, 0.119738, + 0.114078, 0.108717, 0.106632, 0.109908, 0.116461, 0.125992, + 0.135226, 0.144162, 0.153693, 0.164714, 0.176330, 0.187946, + 0.199563, 0.210583, 0.222200, 0.234412, 0.245134, 0.253176, + 0.259729, 0.266580, 0.275515, 0.285643, 0.294578, 0.303216, + 0.310960, 0.319300, 0.325555, 0.328236, 0.326449, 0.322874, + 0.320789, 0.321087, 0.321981, 0.322874, 0.323768, 0.326746, + 0.331512, 0.337171, 0.340746, 0.341937, 0.343724, 0.346405, + 0.350277, 0.353851, 0.355341, 0.356532, 0.357426, 0.358319, + 0.357128, 0.352958, 0.348490, 0.343724, 0.339256, 0.335384, + 0.332108, 0.329129, 0.325853, 0.323172, 0.319598, 0.314832, + 0.308875, 0.302025, 0.295174, 0.288323, 0.282366, 0.277898, + 0.273431, 0.270154, 0.268367, 0.267176, 0.265984, 0.265091, + 0.264793, 0.265388, 0.266878, 0.268069, 0.268665, 0.269261, + 0.270154, 0.271048, 0.271346, 0.269856, 0.268665, 0.268665, + 0.268665, 0.268963, 0.269558, 0.269261, 0.269261, 0.269261, + 0.268069, 0.266580, 0.263899, 0.260623, 0.257346, 0.254666, + 0.252283, 0.251389, 0.250198, 0.249006, 0.247815, 0.246326, + 0.245730, 0.244539, 0.242751, 0.240964, 0.238582, 0.236497, + 0.234709, 0.232029, 0.229646, 0.226369, 0.223689, 0.219817, + 0.216242, 0.212668, 0.209690, 0.206711, 0.204328, 0.202243, + 0.200754, 0.198967, 0.197180, 0.194499, 0.191520, 0.187648, + 0.183776, 0.178713, 0.173054, 0.167096, 0.161437, 0.156969, + 0.153097, 0.150119, 0.147438, 0.144757, 0.141481, 0.138800, + 0.136120, 0.132545, 0.128077, 0.123312, 0.118248, 0.113185, + 0.108419, 0.103356, 0.098590, 0.095313, 0.092335, 0.090846, + 0.089356, 0.087867, 0.086378, 0.083995, 0.081612, 0.078038, + 0.074166, 0.070294, 0.066124, 0.062549, 0.059273, 0.055401, + 0.051827, 0.049742, 0.048848, 0.048252, 0.047955, 0.047657, + 0.048550, 0.048550, 0.047955, 0.047359, 0.046167, 0.045274, + 0.043785, 0.043487, 0.042891, 0.043189, 0.042891, 0.041402, + 0.039913, 0.039019, 0.038423, 0.037828, 0.036636, 0.035743, + 0.034253, 0.032764, 0.030977, 0.028892, 0.025913, 0.022935, + 0.019063, 0.015786, 0.012808, 0.010723, 0.009829, 0.009531, + 0.009531, 0.009829, 0.010425, 0.010723, 0.011021, 0.011318, + 0.011616, 0.011616, 0.011318, 0.010425, 0.010127, 0.010127, + 0.010723, 0.010425, 0.010425, 0.010425, 0.010127, 0.008936, + 0.007149, 0.005957, 0.005957, 0.005361, 0.003872, 0.001489, + -0.000298, -0.001787, -0.002085, -0.002979, -0.004170, -0.005064, + -0.009829, -0.016978, -0.011021, 0.006851, 0.006851, -0.014893, + -0.026509, -0.019063, -0.011021, -0.007744, -0.011616, -0.024126, + -0.032168, -0.024126, -0.012808, -0.018169, -0.028594, -0.026509, + -0.020850, -0.022637, -0.028594, -0.034849, -0.036934, -0.031573, + -0.025913, -0.031870, -0.043487, -0.044678, -0.036636, -0.032168, + -0.036040, -0.041104, -0.042295, -0.041700, -0.040210, -0.041104, + -0.045274, -0.047955, -0.048252, -0.050337, -0.054805, -0.056890, + -0.054805, -0.052720, -0.054805, -0.058677, -0.060464, -0.058082, + -0.054805, -0.054805, -0.059869, -0.064634, -0.065230, -0.064634, + -0.067017, -0.070889, -0.073868, -0.074166, -0.073570, -0.075059, + -0.077144, -0.077740, -0.075953, -0.075655, -0.076549, -0.080123, + -0.082208, -0.082804, -0.083697, -0.085782, -0.088761, -0.090250, + -0.091441, -0.092037, -0.092633, -0.092931, -0.092931, -0.092633, + -0.092931, -0.094122, -0.095313, -0.095313, -0.094420, -0.095313, + -0.097101, -0.098888, -0.098888, -0.097696, -0.097101, -0.097101, + -0.097398, -0.097994, -0.097994, -0.097994, -0.098292, -0.098590, + -0.099186, -0.100079, -0.101271, -0.102462, -0.103058, -0.103356, + -0.103951, -0.105143, -0.106334, -0.107526, -0.108419, -0.109313, + -0.109610, -0.110504, -0.111398, -0.112291, -0.113780, -0.115865, + -0.117653, -0.119142, -0.120333, -0.121823, -0.123908, -0.125099, + -0.126588, -0.127482, -0.128077, -0.128971, -0.130460, -0.131056, + -0.132247, -0.133439, -0.134332, -0.135226, -0.137013, -0.138502, + -0.141779, -0.144162, -0.145353, -0.146247, -0.147736, -0.150417, + -0.152204, -0.152204, -0.151906, -0.152502, -0.154587, -0.156374, + -0.157565, -0.158756, -0.160841, -0.165011, -0.168884, -0.171564, + -0.173649, -0.176926, -0.181096, -0.184372, -0.184074, -0.183181, + -0.184074, -0.187351, -0.189733, -0.189733, -0.189436, -0.191520, + -0.195690, -0.200158, -0.202541, -0.204924, -0.208200, -0.212966, + -0.217434, -0.220115, -0.221902, -0.223689, -0.227263, -0.230837, + -0.233518, -0.234709, -0.237986, -0.242751, -0.247517, -0.250496, + -0.252581, -0.253474, -0.251687, -0.246921, -0.237986, -0.227561, + -0.216838, -0.205222, -0.190329, -0.176330, -0.167096, -0.165607, + -0.169479, -0.173649, -0.176032, -0.178117, -0.183181, -0.187648, + -0.187053, -0.176330, -0.161139, -0.148034, -0.140587, -0.135822, + -0.128971, -0.121525, -0.117355, -0.118546, -0.122716, -0.122418, + -0.115865, -0.106930, -0.100377, -0.094718, -0.087271, -0.075357, + -0.062847, -0.053614, -0.047657, -0.041402, -0.032466, -0.023233, + -0.016978, -0.014893, -0.013701, -0.009531, -0.003276, 0.001787, + 0.005659, 0.009233, 0.015786, 0.023828, 0.030977, 0.035147, + 0.037828, 0.040210, 0.044082, 0.048252, 0.051827, 0.055401, + 0.059273, 0.063741, 0.068209, 0.072677, 0.076846, 0.082208, + 0.088165, 0.095611, 0.104547, 0.115270, 0.125695, 0.134035, + 0.139694, 0.143268, 0.145651, 0.146544, 0.145949, 0.143864, + 0.143864, 0.147140, 0.153097, 0.159650, 0.165905, 0.171862, + 0.177223, 0.182287, 0.184670, 0.183776, 0.181989, 0.181096, + 0.181989, 0.183181, 0.183478, 0.183776, 0.185861, 0.189733, + 0.194499, 0.197478, 0.199860, 0.203137, 0.207307, 0.211477, + 0.214753, 0.215647, 0.215647, 0.214157, 0.212966, 0.211179, + 0.209392, 0.207605, 0.206413, 0.207307, 0.209094, 0.211477, + 0.213562, 0.215349, 0.217136, 0.218327, 0.219221, 0.218327, + 0.216540, 0.214157, 0.212072, 0.209987, 0.207307, 0.204328, + 0.202541, 0.202839, 0.203733, 0.204626, 0.205818, 0.207605, + 0.210285, 0.213264, 0.213264, 0.211179, 0.207605, 0.204328, + 0.200754, 0.196286, 0.190925, 0.187053, 0.184968, 0.183776, + 0.182883, 0.182287, 0.181989, 0.182585, 0.182585, 0.181096, + 0.178117, 0.175734, 0.173351, 0.170671, 0.166501, 0.162033, + 0.159054, 0.157863, 0.157565, 0.157267, 0.156374, 0.156969, + 0.157267, 0.157863, 0.156374, 0.154587, 0.152502, 0.151310, + 0.150417, 0.148927, 0.147736, 0.145651, 0.143566, 0.140885, + 0.137907, 0.134928, 0.132843, 0.131354, 0.129865, 0.128077, + 0.126588, 0.124503, 0.122120, 0.119142, 0.115270, 0.111993, + 0.107823, 0.104547, 0.101271, 0.098590, 0.096505, 0.095016, + 0.094122, 0.092335, 0.091144, 0.089059, 0.086676, 0.084293, + 0.080421, 0.076549, 0.072974, 0.069996, 0.067017, 0.064634, + 0.061656, 0.059273, 0.056890, 0.055103, 0.053912, 0.052422, + 0.050933, 0.049444, 0.047955, 0.045572, 0.043487, 0.040508, + 0.037232, 0.034253, 0.031573, 0.029785, 0.028594, 0.027700, + 0.026509, 0.025318, 0.024722, 0.023531, 0.022339, 0.021148, + 0.020254, 0.019361, 0.018169, 0.016680, 0.014893, 0.013106, + 0.011616, 0.010723, 0.009531, 0.009233, 0.008936, 0.008936, + 0.008042, 0.007446, 0.006553, 0.006255, 0.006255, 0.005957, + 0.005361, 0.004170, 0.002383, 0.000894, -0.000596, -0.002383, + -0.004468, -0.005064, -0.005064, -0.004468, -0.004170, -0.004170, + -0.004170, -0.004766, -0.005361, -0.006553, -0.007149, -0.008042, + -0.008340, -0.008936, -0.008638, -0.008638, -0.008936, -0.008638, + -0.008638, -0.008638, -0.008638, -0.008638, -0.008936, -0.008936, + -0.009531, -0.009829, -0.010723, -0.011318, -0.011914, -0.012510, + -0.013403, -0.014595, -0.015191, -0.016084, -0.017276, -0.017871, + -0.017871, -0.017871, -0.018765, -0.019361, -0.020552, -0.021743, + -0.022935, -0.023828, -0.024722, -0.025615, -0.026211, -0.026807, + -0.027105, -0.027998, -0.028296, -0.029190, -0.030083, -0.030679, + -0.031870, -0.032466, -0.033658, -0.034849, -0.036040, -0.037530, + -0.038721, -0.040210, -0.041104, -0.041997, -0.043189, -0.044380, + -0.045274, -0.046465, -0.047061, -0.048252, -0.048848, -0.049742, + -0.051231, -0.052422, -0.053912, -0.055401, -0.056295, -0.057784, + -0.058677, -0.059571, -0.060464, -0.061358, -0.062252, -0.063443, + -0.064932, -0.065826, -0.067315, -0.068209, -0.069400, -0.070592, + -0.071485, -0.072677, -0.073868, -0.074762, -0.075655, -0.076846, + -0.078038, -0.079527, -0.080421, -0.081612, -0.082506, -0.083399, + -0.084591, -0.086080, -0.087271, -0.088463, -0.089356, -0.090548, + -0.091441, -0.092633, -0.094122, -0.095016, -0.095909, -0.096505, + -0.097696, -0.098888, -0.100377, -0.101568, -0.102760, -0.103951, + -0.105441, -0.106334, -0.107823, -0.107823, -0.109015, -0.109908, + -0.111100, -0.111695, -0.112291, -0.112887, -0.114376, -0.115568, + -0.116759, -0.117355, -0.118546, -0.119738, -0.120929, -0.121823, + -0.122716, -0.123610, -0.124801, -0.126886, -0.128971, -0.130758, + -0.132247, -0.133439, -0.135524, -0.136715, -0.138205, -0.138800, + -0.139396, -0.140885, -0.142077, -0.143268, -0.143864, -0.145651, + -0.147140, -0.148332, -0.150417, -0.152502, -0.154289, -0.156374, + -0.157565, -0.159054, -0.160246, -0.161735, -0.162926, -0.164416, + -0.165607, -0.167096, -0.168884, -0.171266, -0.173351, -0.174543, + -0.175734, -0.177223, -0.179011, -0.180500, -0.181691, -0.182883, + -0.184670, -0.187053, -0.189138, -0.191223, -0.193605, -0.196286, + -0.198967, -0.201350, -0.202541, -0.204328, -0.206711, -0.208796, + -0.211477, -0.214455, -0.217732, -0.221306, -0.224880, -0.229050, + -0.232624, -0.235901, -0.239475, -0.243943, -0.248709, -0.253176, + -0.257644, -0.261814, -0.265686, -0.267473, -0.266878, -0.262410, + -0.256155, -0.249602, -0.241560, -0.231135, -0.217732, -0.207009, + -0.202541, -0.204328, -0.206711, -0.207605, -0.209094, -0.214455, + -0.221604, -0.224284, -0.217434, -0.205222, -0.193903, -0.187053, + -0.181393, -0.172160, -0.159650, -0.151012, -0.149523, -0.150119, + -0.145651, -0.135822, -0.125099, -0.120631, -0.118844, -0.114376, + -0.104845, -0.095611, -0.090846, -0.089059, -0.083697, -0.073272, + -0.060762, -0.051529, -0.045572, -0.040508, -0.033360, -0.025615, + -0.020552, -0.017573, -0.015488, -0.011616, -0.005957, -0.000298, + 0.004766, 0.009531, 0.015191, 0.021148, 0.028892, 0.037232, + 0.045572, 0.053614, 0.060167, 0.066719, 0.073570, 0.080719, + 0.085484, 0.089059, 0.092931, 0.099483, 0.107526, 0.115865, + 0.122716, 0.128673, 0.135524, 0.142077, 0.146247, 0.147438, + 0.147140, 0.148332, 0.151310, 0.155778, 0.159948, 0.163820, + 0.167990, 0.173649, 0.178713, 0.181691, 0.182287, 0.182883, + 0.184968, 0.188542, 0.193010, 0.196584, 0.200158, 0.204328, + 0.208796, 0.212966, 0.215051, 0.215647, 0.216242, 0.217434, + 0.219817, 0.221902, 0.222795, 0.222200, 0.221902, 0.221902, + 0.221604, 0.220115, 0.218030, 0.217136, 0.217136, 0.217732, + 0.217732, 0.217136, 0.216242, 0.216838, 0.217732, 0.217434, + 0.216838, 0.215945, 0.216242, 0.216540, 0.216540, 0.215349, + 0.213264, 0.212072, 0.212072, 0.212668, 0.212668, 0.211775, + 0.211775, 0.212072, 0.212668, 0.212072, 0.210285, 0.207605, + 0.204924, 0.202243, 0.198967, 0.195690, 0.192414, 0.190031, + 0.188244, 0.186457, 0.184372, 0.182585, 0.180500, 0.178713, + 0.176926, 0.174841, 0.173054, 0.170969, 0.169479, 0.167692, + 0.165905, 0.164118, 0.162331, 0.161437, 0.160246, 0.158459, + 0.156969, 0.155778, 0.153991, 0.152204, 0.149821, 0.147140, + 0.144757, 0.142077, 0.139694, 0.137013, 0.134928, 0.133141, + 0.130758, 0.128673, 0.126588, 0.125099, 0.123610, 0.121823, + 0.120035, 0.119142, 0.118248, 0.116163, 0.113780, 0.110802, + 0.107228, 0.104249, 0.101866, 0.098888, 0.096505, 0.094420, + 0.092633, 0.090548, 0.088463, 0.085782, 0.083697, 0.081612, + 0.079527, 0.076251, 0.072974, 0.069698, 0.067017, 0.064337, + 0.061954, 0.059571, 0.058380, 0.057188, 0.056592, 0.055401, + 0.053614, 0.051827, 0.050337, 0.048252, 0.046167, 0.044380, + 0.042295, 0.040210, 0.038423, 0.036934, 0.035445, 0.033955, + 0.033360, 0.033360, 0.033062, 0.031870, 0.031870, 0.030977, + 0.030381, 0.029488, 0.028594, 0.027998, 0.026807, 0.025913, + 0.025020, 0.024424, 0.023828, 0.023531, 0.023828, 0.023531, + 0.024126, 0.024126, 0.024126, 0.023531, 0.022637, 0.022339, + 0.021446, 0.020850, 0.019956, 0.019361, 0.018765, 0.018169, + 0.017276, 0.016978, 0.016382, 0.016382, 0.016680, 0.017276, + 0.017871, 0.018169, 0.018467, 0.018467, 0.018169, 0.017573, + 0.017573, 0.017573, 0.017573, 0.018169, 0.018169, 0.018765, + 0.019063, 0.019361, 0.019361, 0.019956, 0.019658, 0.019361, + 0.018765, 0.018169, 0.017573, 0.017276, 0.016680, 0.016382, + 0.016084, 0.016084, 0.015786, 0.015786, 0.015488, 0.015191, + 0.014595, 0.014893, 0.014595, 0.013999, 0.013701, 0.013106, + 0.012510, 0.011318, 0.010425, 0.009531, 0.008936, 0.008340, + 0.007446, 0.006851, 0.006255, 0.005361, 0.004468, 0.003574, + 0.002085, 0.001191, 0.000000, -0.000596, -0.002383, -0.003276, + -0.004766, -0.005659, -0.006553, -0.007149, -0.007446, -0.008638, + -0.009531, -0.010127, -0.011318, -0.012212, -0.013999, -0.015191, + -0.016382, -0.017573, -0.019063, -0.020552, -0.022041, -0.023233, + -0.024722, -0.025615, -0.026807, -0.027700, -0.028892, -0.030381, + -0.032168, -0.033360, -0.035147, -0.036934, -0.038721, -0.039913, + -0.041700, -0.042891, -0.044082, -0.045274, -0.046465, -0.047657, + -0.048848, -0.049742, -0.051231, -0.052422, -0.053912, -0.055401, + -0.056890, -0.058082, -0.059869, -0.061060, -0.062549, -0.063741, + -0.064932, -0.066422, -0.067911, -0.069102, -0.070294, -0.071783, + -0.072677, -0.073570, -0.075059, -0.076549, -0.077442, -0.078931, + -0.080123, -0.081016, -0.082208, -0.082804, -0.083697, -0.083995, + -0.084889, -0.085484, -0.086378, -0.086676, -0.087569, -0.088761, + -0.090548, -0.092037, -0.093526, -0.094718, -0.096505, -0.098292, + -0.099781, -0.100377, -0.101271, -0.102164, -0.103653, -0.104249, + -0.105738, -0.106930, -0.108121, -0.109610, -0.111695, -0.113185, + -0.114674, -0.115270, -0.116461, -0.118248, -0.119440, -0.120035, + -0.120929, -0.121823, -0.123014, -0.123908, -0.124801, -0.125992, + -0.127184, -0.128375, -0.129865, -0.131950, -0.133141, -0.134630, + -0.135822, -0.137311, -0.138205, -0.138800, -0.139396, -0.139992, + -0.140885, -0.142672, -0.144459, -0.145949, -0.148034, -0.149523, + -0.151310, -0.152799, -0.154587, -0.155778, -0.157267, -0.158459, + -0.159948, -0.161139, -0.162331, -0.163522, -0.165011, -0.166799, + -0.169181, -0.171266, -0.172756, -0.175139, -0.176926, -0.179011, + -0.180798, -0.181691, -0.183478, -0.184968, -0.187351, -0.189436, + -0.191520, -0.193903, -0.196584, -0.199563, -0.202839, -0.205520, + -0.207903, -0.210881, -0.214753, -0.218625, -0.222497, -0.225178, + -0.228454, -0.231731, -0.236497, -0.240667, -0.243347, -0.244539, + -0.243645, -0.240667, -0.234709, -0.226965, -0.217434, -0.207009, + -0.196584, -0.188542, -0.184968, -0.186159, -0.188840, -0.190925, + -0.192414, -0.195690, -0.198967, -0.199265, -0.193010, -0.182287, + -0.171862, -0.163820, -0.157267, -0.149225, -0.139694, -0.132843, + -0.129567, -0.128673, -0.125397, -0.117057, -0.108419, -0.101866, + -0.099781, -0.096505, -0.089952, -0.081910, -0.076549, -0.072974, + -0.067613, -0.058380, -0.047359, -0.038423, -0.033062, -0.027998, + -0.021743, -0.014893, -0.009233, -0.005659, -0.002979, 0.000298, + 0.006255, 0.011914, 0.016084, 0.019956, 0.025318, 0.032168, + 0.041104, 0.050040, 0.057784, 0.065826, 0.072974, 0.079825, + 0.085782, 0.089952, 0.093228, 0.095909, 0.100675, 0.106036, + 0.112589, 0.118546, 0.124205, 0.130162, 0.136715, 0.141779, + 0.145353, 0.146544, 0.147736, 0.149821, 0.153693, 0.157565, + 0.161139, 0.164714, 0.169777, 0.175436, 0.179606, 0.181691, + 0.182287, 0.184074, 0.187053, 0.191223, 0.195393, 0.198967, + 0.202839, 0.207307, 0.211179, 0.213860, 0.213860, 0.213562, + 0.213264, 0.213860, 0.213562, 0.213860, 0.214157, 0.214455, + 0.215051, 0.215945, 0.215647, 0.215051, 0.214455, 0.213860, + 0.213860, 0.213562, 0.213562, 0.212966, 0.212966, 0.213562, + 0.214753, 0.215945, 0.216540, 0.216838, 0.217434, 0.218030, + 0.218923, 0.218030, 0.216838, 0.215647, 0.215051, 0.214753, + 0.214157, 0.212370, 0.211179, 0.209987, 0.209392, 0.207903, + 0.205222, 0.202243, 0.199860, 0.198371, 0.195988, 0.193605, + 0.190925, 0.189436, 0.188542, 0.186755, 0.183776, 0.181393, + 0.179904, 0.178117, 0.176628, 0.174841, 0.173649, 0.172756, + 0.171862, 0.170969, 0.168884, 0.166501, 0.164416, 0.162629, + 0.160246, 0.157863, 0.155182, 0.153097, 0.151608, 0.148927, + 0.145949, 0.142970, 0.140290, 0.138502, 0.136120, 0.133737, + 0.131652, 0.130758, 0.129567, 0.127780, 0.125695, 0.123312, + 0.120929, 0.119142, 0.117355, 0.114674, 0.112291, 0.109610, + 0.107823, 0.106036, 0.104249, 0.102164, 0.099186, 0.097101, + 0.094718, 0.092037, 0.089059, 0.086378, 0.083697, 0.082208, + 0.080421, 0.078634, 0.075059, 0.072379, 0.069102, 0.066422, + 0.063443, 0.061358, 0.059869, 0.058677, 0.058380, 0.057188, + 0.055103, 0.052720, 0.050040, 0.047359, 0.045274, 0.043487, + 0.041402, 0.040806, 0.039615, 0.038125, 0.036934, 0.035147, + 0.033062, 0.031573, 0.030381, 0.028594, 0.027403, 0.026211, + 0.025615, 0.025020, 0.024722, 0.023828, 0.023531, 0.022637, + 0.021743, 0.020552, 0.019063, 0.018467, 0.018169, 0.018169, + 0.018169, 0.018169, 0.017573, 0.016680, 0.015191, 0.014297, + 0.013403, 0.012510, 0.011616, 0.011021, 0.010425, 0.009531, + 0.009233, 0.008638, 0.008042, 0.007446, 0.007446, 0.007446, + 0.007744, 0.007744, 0.007744, 0.008042, 0.008340, 0.008638, + 0.008638, 0.008638, 0.009531, 0.009233, 0.009531, 0.009233, + 0.009233, 0.008936, 0.009233, 0.008936, 0.009233, 0.008936, + 0.008936, 0.007744, 0.007744, 0.006851, 0.005957, 0.005361, + 0.005064, 0.005064, 0.005064, 0.005361, 0.005064, 0.004468, + 0.004170, 0.003872, 0.003276, 0.002681, 0.002383, 0.001787, + 0.001191, 0.000894, 0.000298, 0.000000, -0.000596, -0.001489, + -0.002383, -0.003276, -0.004468, -0.005659, -0.006255, -0.007149, + -0.007744, -0.008340, -0.009233, -0.010425, -0.011616, -0.012510, + -0.014297, -0.015488, -0.016680, -0.017276, -0.018169, -0.018467, + -0.019063, -0.019956, -0.020850, -0.022041, -0.023531, -0.025020, + -0.026211, -0.027998, -0.029190, -0.030679, -0.031573, -0.032764, + -0.033955, -0.035147, -0.036338, -0.037530, -0.039317, -0.040508, + -0.041997, -0.043189, -0.044380, -0.045274, -0.046465, -0.047359, + -0.048252, -0.049146, -0.050040, -0.051827, -0.052720, -0.053912, + -0.055103, -0.055997, -0.056890, -0.057188, -0.058082, -0.059273, + -0.060464, -0.061656, -0.063741, -0.065230, -0.066719, -0.068209, + -0.069400, -0.070294, -0.071485, -0.072677, -0.073570, -0.074464, + -0.075655, -0.076549, -0.077740, -0.078634, -0.079825, -0.080421, + -0.081314, -0.081612, -0.082208, -0.082804, -0.083399, -0.084293, + -0.085186, -0.085782, -0.086378, -0.086676, -0.087569, -0.088165, + -0.088761, -0.089654, -0.090846, -0.092633, -0.094122, -0.095313, + -0.096207, -0.096803, -0.097994, -0.098888, -0.100079, -0.100377, + -0.100973, -0.101866, -0.103058, -0.103951, -0.105143, -0.105441, + -0.106632, -0.107526, -0.108717, -0.109908, -0.109908, -0.110504, + -0.111100, -0.111993, -0.113185, -0.114078, -0.114972, -0.116163, + -0.117950, -0.119142, -0.120631, -0.120929, -0.122120, -0.123312, + -0.124801, -0.126290, -0.126886, -0.127780, -0.128673, -0.130162, + -0.130758, -0.131354, -0.131652, -0.132247, -0.133439, -0.134332, + -0.135822, -0.136417, -0.137013, -0.138502, -0.140290, -0.141779, + -0.143268, -0.143864, -0.145055, -0.146544, -0.147438, -0.148629, + -0.149523, -0.150714, -0.151906, -0.153097, -0.154587, -0.155778, + -0.156969, -0.157863, -0.159054, -0.159948, -0.161735, -0.163522, + -0.165309, -0.166501, -0.168884, -0.170969, -0.173054, -0.174841, + -0.176628, -0.179011, -0.181989, -0.184372, -0.187351, -0.189733, + -0.192712, -0.195393, -0.198967, -0.202243, -0.204030, -0.205818, + -0.208796, -0.212668, -0.217136, -0.220710, -0.224284, -0.227859, + -0.230242, -0.231731, -0.232029, -0.231433, -0.228752, -0.223093, + -0.214753, -0.204328, -0.195393, -0.200158, -0.219519, -0.233518, + -0.233220, -0.229050, -0.231433, -0.237688, -0.237390, -0.222200, + -0.196882, -0.172756, -0.157863, -0.154289, -0.156374, -0.159948, + -0.162926, -0.165607, -0.169777, -0.179904, -0.187648, -0.182883, + -0.165309, -0.141481, -0.119738, -0.100079, -0.078931, -0.057188, + -0.039615, -0.029488, -0.025020, -0.022637, -0.021446, -0.023531, + -0.027998, -0.029190, -0.021743, -0.007149, 0.008638, 0.020850, + 0.031573, 0.045274, 0.059273, 0.066124, 0.062252, 0.053018, + 0.046465, 0.046763, 0.050933, 0.055401, 0.059273, 0.066124, + 0.077144, 0.090548, 0.103951, 0.115865, 0.125099, 0.130162, + 0.133141, 0.133439, 0.133737, 0.136715, 0.142375, 0.147438, + 0.152204, 0.155778, 0.161139, 0.166799, 0.170969, 0.172458, + 0.171266, 0.168884, 0.166203, 0.165011, 0.166203, 0.169777, + 0.174841, 0.181393, 0.187946, 0.195095, 0.202243, 0.208498, + 0.212966, 0.214753, 0.215051, 0.216540, 0.218923, 0.222200, + 0.224880, 0.226369, 0.228752, 0.232624, 0.237092, 0.239475, + 0.240071, 0.238582, 0.236497, 0.233220, 0.229050, 0.223987, + 0.219817, 0.217434, 0.216540, 0.215647, 0.215647, 0.218030, + 0.223093, 0.228752, 0.233220, 0.235305, 0.236199, 0.236794, + 0.235901, 0.232922, 0.229050, 0.226072, 0.224284, 0.223093, + 0.222200, 0.220412, 0.218030, 0.216540, 0.213562, 0.209987, + 0.205520, 0.201945, 0.198371, 0.195095, 0.191818, 0.188840, + 0.187351, 0.186457, 0.186159, 0.184968, 0.183776, 0.183776, + 0.184372, 0.184670, 0.184968, 0.185563, 0.186159, 0.185266, + 0.183181, 0.179904, 0.177223, 0.173947, 0.171266, 0.168586, + 0.166203, 0.163820, 0.162033, 0.161139, 0.159054, 0.155778, + 0.153097, 0.151012, 0.149225, 0.145949, 0.144162, 0.144162, + 0.145353, 0.145353, 0.145055, 0.145055, 0.146247, 0.147140, + 0.146544, 0.145055, 0.144459, 0.144459, 0.144162, 0.141779, + 0.137609, 0.133439, 0.130162, 0.125397, 0.120333, 0.114972, + 0.110206, 0.106632, 0.103356, 0.100675, 0.098292, 0.097696, + 0.097994, 0.098590, 0.096803, 0.095313, 0.094420, 0.092931, + 0.091144, 0.089059, 0.087271, 0.085484, 0.083101, 0.079825, + 0.076251, 0.072379, 0.068507, 0.064337, 0.060464, 0.057486, + 0.054805, 0.052422, 0.048848, 0.045870, 0.044082, 0.042593, + 0.040806, 0.039317, 0.039019, 0.040210, 0.040806, 0.041997, + 0.042593, 0.042593, 0.041997, 0.041402, 0.040508, 0.039615, + 0.038721, 0.038125, 0.036934, 0.034551, 0.032466, 0.030679, + 0.028296, 0.026509, 0.025318, 0.024126, 0.022637, 0.021743, + 0.021148, 0.020850, 0.021148, 0.022339, 0.024126, 0.025615, + 0.027105, 0.028594, 0.030083, 0.030679, 0.030977, 0.031573, + 0.032764, 0.033360, 0.033658, 0.032764, 0.031573, 0.030381, + 0.029190, 0.027700, 0.026509, 0.025913, 0.025615, 0.025020, + 0.024126, 0.023828, 0.023828, 0.024722, 0.025615, 0.026509, + 0.027998, 0.029785, 0.031870, 0.033062, 0.034551, 0.034849, + 0.035147, 0.035147, 0.034253, 0.033955, 0.033062, 0.031870, + 0.030381, 0.028594, 0.026211, 0.025020, 0.023233, 0.021148, + 0.019361, 0.017276, 0.015488, 0.014595, 0.013999, 0.012510, + 0.012212, 0.012212, 0.011914, 0.011914, 0.010425, 0.010127, + 0.009233, 0.008042, 0.006255, 0.004468, 0.002681, 0.000894, + -0.000894, -0.004468, -0.008042, -0.011616, -0.014893, -0.018467, + -0.022339, -0.025615, -0.028892, -0.031573, -0.033955, -0.036338, + -0.038125, -0.039317, -0.040806, -0.041700, -0.043189, -0.044082, + -0.045274, -0.046763, -0.047657, -0.049742, -0.051827, -0.054210, + -0.055997, -0.058677, -0.061358, -0.064039, -0.066719, -0.069400, + -0.072081, -0.075059, -0.077740, -0.080421, -0.083101, -0.085186, + -0.086974, -0.088463, -0.089654, -0.090548, -0.091144, -0.091739, + -0.091739, -0.092335, -0.092931, -0.093228, -0.094122, -0.095313, + -0.095909, -0.097398, -0.098888, -0.100675, -0.102760, -0.105143, + -0.107823, -0.110206, -0.113185, -0.115865, -0.118546, -0.120631, + -0.123014, -0.124801, -0.126290, -0.127184, -0.128673, -0.129567, + -0.130758, -0.131652, -0.132545, -0.133439, -0.134630, -0.135226, + -0.136120, -0.137013, -0.138205, -0.140290, -0.142672, -0.144459, + -0.146247, -0.148927, -0.152204, -0.155778, -0.157863, -0.159650, + -0.162629, -0.166501, -0.169181, -0.169479, -0.169479, -0.170969, + -0.172458, -0.172458, -0.172160, -0.172160, -0.173351, -0.175139, + -0.176330, -0.176032, -0.175734, -0.176628, -0.178713, -0.179011, + -0.178713, -0.179606, -0.182883, -0.186755, -0.189436, -0.190627, + -0.192712, -0.196584, -0.200754, -0.202243, -0.202243, -0.204030, + -0.206711, -0.209392, -0.209690, -0.210285, -0.212072, -0.215051, + -0.216242, -0.216242, -0.215945, -0.217434, -0.220412, -0.221306, + -0.221306, -0.222200, -0.226369, -0.230539, -0.232922, -0.233518, + -0.235305, -0.239177, -0.242751, -0.244836, -0.245432, -0.246624, + -0.249006, -0.251985, -0.253176, -0.252581, -0.252283, -0.254070, + -0.256453, -0.257644, -0.256751, -0.256751, -0.260027, -0.263601, + -0.265388, -0.265984, -0.267473, -0.269856, -0.272835, -0.275813, + -0.277898, -0.279983, -0.283260, -0.288025, -0.291302, -0.291898, + -0.292493, -0.297259, -0.302918, -0.304407, -0.304110, -0.306790, + -0.314237, -0.319598, -0.320789, -0.321087, -0.324661, -0.329725, + -0.331512, -0.332704, -0.335980, -0.341044, -0.347894, -0.355043, + -0.360702, -0.363383, -0.364276, -0.362787, -0.356830, -0.344618, + -0.330619, -0.316917, -0.302620, -0.285940, -0.268069, -0.248411, + -0.228454, -0.211775, -0.197180, -0.181691, -0.167394, -0.157863, + -0.154289, -0.153097, -0.151906, -0.148332, -0.141183, -0.131056, + -0.119738, -0.107228, -0.090548, -0.073272, -0.061656, -0.053912, + -0.045870, -0.036636, -0.026509, -0.013999, 0.001489, 0.019361, + 0.036636, 0.051529, 0.064634, 0.075357, 0.082208, 0.085782, + 0.087569, 0.088761, 0.089952, 0.092037, 0.093526, 0.094122, + 0.092633, 0.091144, 0.090250, 0.089356, 0.088165, 0.089654, + 0.093824, 0.101866, 0.112291, 0.122716, 0.131652, 0.139992, + 0.147736, 0.154587, 0.158756, 0.160841, 0.165011, 0.170671, + 0.177819, 0.182585, 0.186159, 0.187351, 0.189138, 0.191223, + 0.193010, 0.192116, 0.192116, 0.195095, 0.199860, 0.202839, + 0.204328, 0.205222, 0.207605, 0.210881, 0.215349, 0.221306, + 0.230539, 0.241858, 0.255559, 0.268367, 0.278196, 0.285643, + 0.291898, 0.296067, 0.298450, 0.298450, 0.297855, 0.298152, + 0.298450, 0.297855, 0.295770, 0.293089, 0.291302, 0.289813, + 0.288323, 0.286238, 0.285345, 0.285643, 0.286238, 0.287430, + 0.287430, 0.287132, 0.286834, 0.287430, 0.286834, 0.285643, + 0.285047, 0.285345, 0.285047, 0.284451, 0.282366, 0.279388, + 0.275515, 0.271048, 0.265984, 0.259729, 0.254070, 0.248113, + 0.242454, 0.235603, 0.228454, 0.222200, 0.217732, 0.213860, + 0.211775, 0.210881, 0.212966, 0.216242, 0.219221, 0.221306, + 0.221902, 0.222497, 0.222795, 0.221604, 0.219519, 0.217136, + 0.215945, 0.215349, 0.213562, 0.210583, 0.208200, 0.205222, + 0.201945, 0.198371, 0.195095, 0.193010, 0.191223, 0.190925, + 0.190925, 0.190925, 0.191223, 0.191223, 0.191520, 0.191223, + 0.191818, 0.192116, 0.192712, 0.193903, 0.197180, 0.200456, + 0.200754, 0.198073, 0.194797, 0.191223, 0.186159, 0.178117, + 0.169777, 0.163522, 0.159650, 0.156076, 0.151906, 0.148629, + 0.145651, 0.144162, 0.142672, 0.140587, 0.139396, 0.139694, + 0.140290, 0.140885, 0.141183, 0.140290, 0.138205, 0.135524, + 0.132247, 0.128673, 0.124801, 0.121227, 0.117355, 0.113483, + 0.108419, 0.102462, 0.097101, 0.091739, 0.086080, 0.081016, + 0.077144, 0.074762, 0.072677, 0.070889, 0.069400, 0.068209, + 0.068209, 0.068507, 0.068804, 0.069698, 0.070294, 0.072081, + 0.072974, 0.072677, 0.070889, 0.067613, 0.064634, 0.061358, + 0.057486, 0.053614, 0.049742, 0.047359, 0.046465, 0.045274, + 0.043785, 0.042891, 0.043189, 0.044976, 0.046167, 0.047657, + 0.049742, 0.053614, 0.057188, 0.060167, 0.061954, 0.064337, + 0.066422, 0.067017, 0.067613, 0.067315, 0.067613, 0.067911, + 0.067315, 0.066124, 0.064634, 0.061656, 0.059273, 0.056592, + 0.055103, 0.052720, 0.051827, 0.051529, 0.052125, 0.052720, + 0.053912, 0.055103, 0.056890, 0.058677, 0.060464, 0.061954, + 0.062847, 0.064337, 0.064337, 0.062549, 0.060167, 0.057188, + 0.054210, 0.050933, 0.047061, 0.044082, 0.041402, 0.039317, + 0.037530, 0.035445, 0.033658, 0.032168, 0.031573, 0.031573, + 0.030679, 0.030977, 0.031275, 0.032764, 0.033658, 0.033955, + 0.033955, 0.033955, 0.033955, 0.033360, 0.031870, 0.030083, + 0.028892, 0.026807, 0.023531, 0.020254, 0.016680, 0.013106, + 0.010127, 0.006255, 0.003872, 0.001787, 0.000596, 0.000000, + -0.000298, -0.000596, -0.000596, 0.000000, 0.000000, 0.000298, + 0.000298, 0.000000, 0.000000, -0.001191, -0.003276, -0.005361, + -0.008042, -0.011021, -0.014297, -0.017573, -0.020552, -0.023233, + -0.026211, -0.028892, -0.031870, -0.034849, -0.037232, -0.039317, + -0.041104, -0.042593, -0.043487, -0.043785, -0.044082, -0.044380, + -0.044082, -0.044678, -0.045274, -0.046465, -0.047657, -0.049742, + -0.052422, -0.055103, -0.058082, -0.061656, -0.065230, -0.068804, + -0.072677, -0.076251, -0.079527, -0.082506, -0.084889, -0.086974, + -0.088463, -0.089654, -0.090548, -0.091144, -0.091739, -0.092335, + -0.093228, -0.094122, -0.095016, -0.096207, -0.097696, -0.099186, + -0.100973, -0.102760, -0.104845, -0.106930, -0.108717, -0.110802, + -0.113185, -0.115270, -0.117653, -0.120035, -0.122120, -0.123908, + -0.125397, -0.126588, -0.126290, -0.126588, -0.125695, -0.125099, + -0.124801, -0.124503, -0.124503, -0.124801, -0.125099, -0.125397, + -0.126290, -0.127780, -0.129269, -0.130758, -0.132545, -0.134928, + -0.137311, -0.139992, -0.142375, -0.144162, -0.145949, -0.147736, + -0.148927, -0.149821, -0.150119, -0.150417, -0.150417, -0.150417, + -0.149821, -0.150119, -0.150417, -0.151012, -0.151906, -0.153693, + -0.155480, -0.156374, -0.158161, -0.161139, -0.163224, -0.163820, + -0.164416, -0.167394, -0.170373, -0.172160, -0.173649, -0.176330, + -0.179011, -0.180798, -0.181393, -0.182287, -0.181691, -0.181691, + -0.181691, -0.181393, -0.181393, -0.181393, -0.183478, -0.186159, + -0.189138, -0.191520, -0.194201, -0.197478, -0.199563, -0.200158, + -0.201052, -0.202243, -0.203435, -0.204924, -0.206711, -0.209094, + -0.211477, -0.213562, -0.215945, -0.216838, -0.218030, -0.219221, + -0.220115, -0.219221, -0.219519, -0.220412, -0.222497, -0.223987, + -0.224284, -0.224582, -0.226369, -0.229348, -0.230539, -0.230242, + -0.229944, -0.231731, -0.234114, -0.235901, -0.237092, -0.238582, + -0.240667, -0.242751, -0.243347, -0.244836, -0.246028, -0.244836, + -0.243943, -0.243645, -0.246028, -0.246921, -0.246326, -0.249006, + -0.253474, -0.257942, -0.260623, -0.262112, -0.263601, -0.266580, + -0.271048, -0.275218, -0.275218, -0.275218, -0.280579, -0.287728, + -0.289813, -0.288323, -0.288919, -0.292195, -0.295174, -0.293982, + -0.292493, -0.293387, -0.296365, -0.299046, -0.300535, -0.301429, + -0.304407, -0.310364, -0.315428, -0.316619, -0.315726, -0.317215, + -0.319896, -0.316322, -0.303812, -0.290408, -0.279685, -0.269558, + -0.255559, -0.238582, -0.221306, -0.204626, -0.187648, -0.169181, + -0.153097, -0.142375, -0.136715, -0.131354, -0.126886, -0.125397, + -0.124205, -0.117950, -0.107228, -0.094718, -0.083101, -0.070592, + -0.058380, -0.047359, -0.037828, -0.028594, -0.017871, -0.007744, + 0.003276, 0.017871, 0.032764, 0.044380, 0.052720, 0.060167, + 0.067911, 0.074166, 0.078038, 0.081314, 0.084889, 0.088761, + 0.090548, 0.089654, 0.085782, 0.083101, 0.081910, 0.081612, + 0.081612, 0.083101, 0.087867, 0.096207, 0.103951, 0.110802, + 0.117355, 0.125099, 0.133737, 0.141183, 0.146842, 0.152204, + 0.157565, 0.161437, 0.162331, 0.162629, 0.164714, 0.168288, + 0.170373, 0.170969, 0.172756, 0.176926, 0.181691, 0.184670, + 0.187351, 0.190627, 0.195690, 0.200754, 0.205520, 0.210881, + 0.216838, 0.223987, 0.230837, 0.238284, 0.246624, 0.255857, + 0.264495, 0.271941, 0.278196, 0.283558, 0.286536, 0.288323, + 0.288323, 0.287430, 0.285345, 0.283558, 0.282366, 0.281175, + 0.280281, 0.279388, 0.279685, 0.281175, 0.282962, 0.285047, + 0.287132, 0.289217, 0.290706, 0.291898, 0.291600, 0.290408, + 0.289217, 0.288025, 0.285940, 0.282068, 0.278494, 0.276409, + 0.274026, 0.269856, 0.264495, 0.259729, 0.255857, 0.252581, + 0.247815, 0.242454, 0.237688, 0.234709, 0.232327, 0.228752, + 0.225178, 0.222795, 0.222200, 0.222200, 0.222200, 0.223093, + 0.224880, 0.227263, 0.228157, 0.227561, 0.225774, 0.224284, + 0.222795, 0.220412, 0.216838, 0.212370, 0.209690, 0.207605, + 0.204626, 0.201052, 0.198073, 0.197478, 0.197775, 0.198073, + 0.198669, 0.200456, 0.202243, 0.204328, 0.204626, 0.204328, + 0.204626, 0.204626, 0.204328, 0.203137, 0.201052, 0.199265, + 0.197478, 0.195393, 0.191223, 0.186755, 0.183181, 0.180500, + 0.176628, 0.173649, 0.173351, 0.175436, 0.174841, 0.170969, + 0.165011, 0.160841, 0.157863, 0.153991, 0.150714, 0.151608, + 0.155182, 0.158161, 0.158756, 0.156672, 0.153693, 0.149225, + 0.143268, 0.136715, 0.131354, 0.127184, 0.123610, 0.118844, + 0.113780, 0.109908, 0.106632, 0.102760, 0.098888, 0.096803, + 0.097398, 0.097696, 0.096803, 0.094718, 0.092037, 0.089059, + 0.086080, 0.083101, 0.081314, 0.080719, 0.080719, 0.079825, + 0.077442, 0.074762, 0.072081, 0.068804, 0.065826, 0.063741, + 0.063145, 0.062847, 0.061358, 0.059571, 0.057188, 0.054210, + 0.051529, 0.048550, 0.047955, 0.049444, 0.052125, 0.054210, + 0.056592, 0.058380, 0.059571, 0.059869, 0.059869, 0.059869, + 0.060762, 0.060167, 0.059571, 0.058380, 0.056592, 0.055103, + 0.053912, 0.053018, 0.053614, 0.055103, 0.056592, 0.057188, + 0.057188, 0.056890, 0.057188, 0.057188, 0.057188, 0.058082, + 0.059571, 0.060464, 0.060762, 0.060464, 0.060167, 0.059869, + 0.058975, 0.058380, 0.057784, 0.057188, 0.056890, 0.054805, + 0.052125, 0.049146, 0.046763, 0.044082, 0.041104, 0.039019, + 0.037530, 0.036338, 0.035147, 0.033360, 0.032466, 0.032168, + 0.032466, 0.032764, 0.033062, 0.033062, 0.032764, 0.031573, + 0.029190, 0.026509, 0.024126, 0.022041, 0.019658, 0.017573, + 0.016084, 0.015191, 0.014297, 0.012808, 0.011318, 0.009829, + 0.008936, 0.007446, 0.006255, 0.005361, 0.005064, 0.004766, + 0.004468, 0.004170, 0.003574, 0.003276, 0.003276, 0.002979, + 0.002085, 0.001489, 0.000596, -0.000298, -0.002085, -0.003872, + -0.006255, -0.008340, -0.010127, -0.011914, -0.013701, -0.015191, + -0.017276, -0.018169, -0.019658, -0.020552, -0.021148, -0.022041, + -0.022637, -0.023233, -0.023828, -0.024722, -0.026211, -0.027700, + -0.029488, -0.031275, -0.033658, -0.036338, -0.038423, -0.040806, + -0.042593, -0.044976, -0.047359, -0.049444, -0.051529, -0.053912, + -0.056295, -0.058380, -0.060167, -0.061954, -0.064039, -0.065826, + -0.067017, -0.067911, -0.068804, -0.069698, -0.070889, -0.072379, + -0.073272, -0.075059, -0.077144, -0.078634, -0.080719, -0.082506, + -0.085186, -0.087569, -0.089952, -0.092335, -0.094122, -0.095909, + -0.097696, -0.098590, -0.099186, -0.099781, -0.100079, -0.099781, + -0.100079, -0.099781, -0.099781, -0.100079, -0.100377, -0.100973, + -0.101271, -0.102760, -0.103951, -0.105441, -0.106334, -0.107228, + -0.108717, -0.109610, -0.111100, -0.111695, -0.113185, -0.114972, + -0.116759, -0.117950, -0.118844, -0.120035, -0.120929, -0.121823, + -0.122120, -0.122418, -0.123610, -0.124801, -0.125992, -0.126886, + -0.127184, -0.128375, -0.129865, -0.130460, -0.131354, -0.132247, + -0.133737, -0.135822, -0.137609, -0.139098, -0.140885, -0.142672, + -0.144162, -0.144757, -0.145949, -0.147140, -0.148629, -0.149523, + -0.149523, -0.149821, -0.150417, -0.150119, -0.149821, -0.149523, + -0.149821, -0.151012, -0.152799, -0.154587, -0.156076, -0.157267, + -0.158161, -0.159352, -0.160544, -0.161139, -0.161735, -0.163522, + -0.166203, -0.168288, -0.169479, -0.170075, -0.172160, -0.173054, + -0.172756, -0.173351, -0.174841, -0.176032, -0.177223, -0.177819, + -0.177819, -0.178415, -0.179606, -0.180202, -0.181393, -0.183478, + -0.186457, -0.190031, -0.192712, -0.195095, -0.196882, -0.198967, + -0.200754, -0.201945, -0.202541, -0.203733, -0.205520, -0.206711, + -0.206115, -0.204626, -0.204328, -0.206115, -0.207605, -0.207307, + -0.206413, -0.208498, -0.213264, -0.216242, -0.215051, -0.212370, + -0.212370, -0.216242, -0.219519, -0.219221, -0.218923, -0.223093, + -0.228157, -0.230242, -0.228752, -0.227859, -0.229050, -0.230242, + -0.230837, -0.229944, -0.228454, -0.229050, -0.229348, -0.230242, + -0.229646, -0.230837, -0.233518, -0.236497, -0.239773, -0.242454, + -0.245730, -0.249006, -0.253176, -0.254666, -0.253772, -0.252283, + -0.254070, -0.257644, -0.259431, -0.258836, -0.259729, -0.263899, + -0.268069, -0.268367, -0.266878, -0.269856, -0.275515, -0.278792, + -0.277005, -0.275218, -0.276111, -0.276111, -0.269856, -0.255857, + -0.238879, -0.225178, -0.215647, -0.205222, -0.193010, -0.182883, + -0.176926, -0.170075, -0.158756, -0.144459, -0.132545, -0.123312, + -0.115865, -0.108121, -0.101568, -0.099186, -0.100079, -0.096505, + -0.085782, -0.071485, -0.057486, -0.045870, -0.033062, -0.017573, + -0.003574, 0.002979, 0.006255, 0.012212, 0.024126, 0.036934, + 0.045572, 0.050635, 0.056295, 0.064039, 0.069400, 0.070294, + 0.068804, 0.068804, 0.072081, 0.073868, 0.074166, 0.075357, + 0.078634, 0.083101, 0.086676, 0.088761, 0.090548, 0.095909, + 0.103653, 0.110802, 0.115270, 0.118546, 0.124205, 0.130758, + 0.136120, 0.138205, 0.138502, 0.141481, 0.146247, 0.150119, + 0.151012, 0.151608, 0.154289, 0.159054, 0.161139, 0.160544, + 0.161139, 0.166203, 0.173649, 0.178713, 0.182287, 0.188244, + 0.196286, 0.203435, 0.207009, 0.209094, 0.213264, 0.219817, + 0.226667, 0.232327, 0.237986, 0.244836, 0.251389, 0.255559, + 0.256155, 0.254964, 0.255559, 0.257049, 0.257049, 0.256751, + 0.255857, 0.257942, 0.260325, 0.261516, 0.260921, 0.260325, + 0.262112, 0.265091, 0.267473, 0.268069, 0.268963, 0.270452, + 0.271643, 0.271346, 0.268665, 0.265388, 0.263006, 0.260325, + 0.256155, 0.251389, 0.247219, 0.244241, 0.241262, 0.237092, + 0.233220, 0.230539, 0.228752, 0.226965, 0.223391, 0.220710, + 0.219817, 0.219519, 0.218327, 0.216242, 0.213860, 0.212668, + 0.212072, 0.210881, 0.209690, 0.208498, 0.207903, 0.207307, + 0.206115, 0.203137, 0.200754, 0.197775, 0.194797, 0.191520, + 0.189138, 0.187946, 0.187946, 0.187946, 0.187648, 0.187648, + 0.187946, 0.188244, 0.188244, 0.188840, 0.189138, 0.190627, + 0.191223, 0.191520, 0.190925, 0.189138, 0.186457, 0.183776, + 0.180500, 0.177521, 0.175436, 0.172756, 0.170671, 0.169181, + 0.170373, 0.173054, 0.174543, 0.171862, 0.167096, 0.163522, + 0.160544, 0.156672, 0.151310, 0.149523, 0.150417, 0.152502, + 0.152799, 0.150119, 0.147736, 0.144459, 0.140587, 0.135524, + 0.131354, 0.128375, 0.125992, 0.122120, 0.118248, 0.114078, + 0.110802, 0.106036, 0.101568, 0.098888, 0.098888, 0.098590, + 0.097398, 0.094718, 0.092037, 0.089654, 0.086080, 0.082208, + 0.079825, 0.078634, 0.077740, 0.075059, 0.071485, 0.067911, + 0.064337, 0.060762, 0.057486, 0.055699, 0.055699, 0.056295, + 0.056295, 0.055401, 0.053912, 0.052125, 0.049742, 0.046763, + 0.044380, 0.043785, 0.044082, 0.044082, 0.043487, 0.042891, + 0.043785, 0.044082, 0.044380, 0.043487, 0.042593, 0.042295, + 0.041700, 0.039615, 0.037828, 0.036040, 0.036040, 0.036338, + 0.038125, 0.039317, 0.040210, 0.040806, 0.041104, 0.041104, + 0.041402, 0.041104, 0.041700, 0.042891, 0.044082, 0.044678, + 0.043785, 0.042295, 0.041104, 0.040210, 0.039317, 0.038125, + 0.037828, 0.038721, 0.039019, 0.039019, 0.037828, 0.036636, + 0.036636, 0.036338, 0.035743, 0.034551, 0.033955, 0.033360, + 0.032466, 0.030381, 0.028594, 0.027700, 0.027700, 0.027700, + 0.027105, 0.026509, 0.026509, 0.025913, 0.023531, 0.020254, + 0.017871, 0.016382, 0.015488, 0.013701, 0.012808, 0.012510, + 0.013106, 0.013106, 0.012510, 0.011914, 0.011616, 0.011021, + 0.010127, 0.008936, 0.008042, 0.007744, 0.007446, 0.006851, + 0.005659, 0.004468, 0.003276, 0.002085, 0.000894, -0.000298, + -0.001191, -0.002085, -0.003276, -0.003574, -0.004468, -0.004766, + -0.005957, -0.006553, -0.007744, -0.008936, -0.010127, -0.011914, + -0.013106, -0.013701, -0.014595, -0.015488, -0.016382, -0.016978, + -0.017871, -0.019063, -0.020254, -0.022339, -0.023828, -0.025913, + -0.027998, -0.030381, -0.032168, -0.033658, -0.034551, -0.035743, + -0.036934, -0.037828, -0.038721, -0.039615, -0.040508, -0.042295, + -0.043487, -0.045572, -0.047359, -0.048550, -0.050635, -0.051827, + -0.053614, -0.054805, -0.056592, -0.058380, -0.060464, -0.061954, + -0.064337, -0.066124, -0.067613, -0.069102, -0.070294, -0.071783, + -0.073272, -0.074762, -0.076251, -0.077740, -0.079229, -0.080421, + -0.081612, -0.082804, -0.083399, -0.084591, -0.085186, -0.085484, + -0.086676, -0.087271, -0.088463, -0.088761, -0.090250, -0.092037, + -0.094122, -0.095016, -0.095611, -0.096207, -0.096803, -0.097101, + -0.096505, -0.096207, -0.096207, -0.096803, -0.096803, -0.096505, + -0.096505, -0.096505, -0.097101, -0.097101, -0.098292, -0.099186, + -0.100079, -0.100377, -0.101271, -0.102164, -0.102462, -0.103356, + -0.103951, -0.105441, -0.107228, -0.108717, -0.109908, -0.111100, + -0.111695, -0.112589, -0.112887, -0.113483, -0.114078, -0.115270, + -0.116163, -0.117355, -0.117950, -0.117950, -0.118844, -0.119440, + -0.120929, -0.121823, -0.122716, -0.123908, -0.125397, -0.126886, + -0.127482, -0.127482, -0.128077, -0.129865, -0.130758, -0.130460, + -0.130460, -0.130758, -0.131354, -0.131056, -0.130758, -0.130758, + -0.131950, -0.133141, -0.134332, -0.134630, -0.135524, -0.136715, + -0.137609, -0.138502, -0.139396, -0.140885, -0.142077, -0.142375, + -0.142672, -0.143268, -0.144757, -0.145651, -0.147438, -0.149821, + -0.152204, -0.153693, -0.154884, -0.155778, -0.156374, -0.156076, + -0.155480, -0.156076, -0.158161, -0.159948, -0.160246, -0.159948, + -0.160544, -0.161437, -0.161437, -0.161735, -0.163820, -0.166799, + -0.168586, -0.169479, -0.170373, -0.171862, -0.173947, -0.173351, + -0.173947, -0.176628, -0.179308, -0.180202, -0.179308, -0.180500, + -0.181691, -0.180798, -0.177223, -0.175139, -0.177223, -0.180202, + -0.181691, -0.179308, -0.177819, -0.180202, -0.183181, -0.182883, + -0.180798, -0.181989, -0.187351, -0.191520, -0.191818, -0.190627, + -0.191223, -0.193010, -0.194797, -0.195988, -0.196882, -0.198073, + -0.200158, -0.202839, -0.204626, -0.204030, -0.202541, -0.202541, + -0.204030, -0.204924, -0.204626, -0.205520, -0.207903, -0.211179, + -0.213562, -0.213860, -0.214455, -0.216838, -0.220412, -0.223391, + -0.223689, -0.223689, -0.225178, -0.226965, -0.227859, -0.228157, + -0.229646, -0.232922, -0.235305, -0.236199, -0.235901, -0.232624, + -0.225476, -0.214455, -0.202541, -0.190031, -0.177819, -0.166799, + -0.156672, -0.148629, -0.141481, -0.132843, -0.121823, -0.110802, + -0.101866, -0.094122, -0.088463, -0.085782, -0.084591, -0.081910, + -0.077144, -0.071187, -0.063741, -0.053316, -0.040210, -0.026807, + -0.016084, -0.008042, 0.000894, 0.011318, 0.020552, 0.027105, + 0.034253, 0.043785, 0.053316, 0.060167, 0.064337, 0.066422, + 0.066124, 0.066422, 0.067315, 0.069400, 0.071485, 0.072379, + 0.072974, 0.073868, 0.076251, 0.077442, 0.078634, 0.079825, + 0.083101, 0.088165, 0.094718, 0.101866, 0.107823, 0.112291, + 0.117950, 0.122716, 0.126588, 0.128673, 0.130162, 0.131652, + 0.134630, 0.137609, 0.140290, 0.140587, 0.140885, 0.142672, + 0.145353, 0.147736, 0.149821, 0.152799, 0.157565, 0.164118, + 0.170671, 0.175436, 0.181393, 0.188542, 0.195095, 0.200158, + 0.204328, 0.209392, 0.215051, 0.220412, 0.225178, 0.228454, + 0.231433, 0.234114, 0.235901, 0.236199, 0.235901, 0.235603, + 0.236497, 0.237688, 0.239177, 0.239773, 0.240369, 0.241262, + 0.242751, 0.243645, 0.244241, 0.246624, 0.249304, 0.251985, + 0.253176, 0.253772, 0.253474, 0.252581, 0.250198, 0.246028, + 0.241560, 0.238284, 0.235305, 0.231135, 0.226965, 0.223093, + 0.219221, 0.215647, 0.211775, 0.208498, 0.205520, 0.204626, + 0.204030, 0.203435, 0.203137, 0.203435, 0.203137, 0.202243, + 0.200456, 0.198371, 0.195393, 0.193605, 0.191818, 0.190031, + 0.188542, 0.186755, 0.184968, 0.182883, 0.181096, 0.178713, + 0.176330, 0.174245, 0.172756, 0.171862, 0.171266, 0.170671, + 0.170373, 0.171266, 0.171862, 0.173054, 0.174245, 0.174841, + 0.175436, 0.176032, 0.176330, 0.175139, 0.173649, 0.171266, + 0.169479, 0.167394, 0.163820, 0.161139, 0.159054, 0.156672, + 0.154289, 0.152204, 0.152204, 0.154587, 0.157267, 0.157267, + 0.154884, 0.152502, 0.149821, 0.147140, 0.142970, 0.139098, + 0.137609, 0.137311, 0.135822, 0.132545, 0.128673, 0.125397, + 0.121525, 0.117355, 0.113483, 0.111398, 0.109313, 0.106930, + 0.103653, 0.100377, 0.097101, 0.093824, 0.090250, 0.087569, + 0.086676, 0.086378, 0.085782, 0.083995, 0.081612, 0.079229, + 0.076251, 0.072379, 0.069996, 0.068507, 0.067017, 0.064634, + 0.060762, 0.057188, 0.053912, 0.050337, 0.047359, 0.045572, + 0.044976, 0.045274, 0.046167, 0.045870, 0.045274, 0.044380, + 0.043189, 0.041700, 0.039615, 0.038423, 0.037530, 0.037232, + 0.035743, 0.034551, 0.033360, 0.032764, 0.032168, 0.031275, + 0.030977, 0.030679, 0.029785, 0.028296, 0.026509, 0.025615, + 0.024722, 0.024424, 0.024424, 0.024722, 0.026509, 0.027403, + 0.027700, 0.027403, 0.027700, 0.028892, 0.029488, 0.029785, + 0.030083, 0.030977, 0.031870, 0.030381, 0.028892, 0.027998, + 0.027998, 0.027105, 0.025615, 0.024126, 0.024126, 0.023828, + 0.023233, 0.022041, 0.021743, 0.022339, 0.022935, 0.022935, + 0.022637, 0.022637, 0.022339, 0.021743, 0.020850, 0.019361, + 0.018467, 0.017573, 0.016978, 0.016084, 0.015191, 0.014297, + 0.013106, 0.011318, 0.009829, 0.008042, 0.006553, 0.005361, + 0.004468, 0.003872, 0.003872, 0.003872, 0.003872, 0.004170, + 0.003872, 0.003872, 0.002979, 0.002383, 0.001787, 0.001191, + 0.001191, 0.000000, -0.000596, -0.001489, -0.002681, -0.003872, + -0.005659, -0.006851, -0.007744, -0.008340, -0.009233, -0.009531, + -0.009829, -0.009531, -0.009531, -0.009829, -0.009531, -0.009233, + -0.008936, -0.009233, -0.010127, -0.011021, -0.011318, -0.012212, + -0.013403, -0.013999, -0.014893, -0.015191, -0.016382, -0.017871, + -0.019063, -0.020552, -0.021743, -0.023233, -0.024722, -0.025615, + -0.026509, -0.026807, -0.027105, -0.027998, -0.028296, -0.028296, + -0.029190, -0.030083, -0.030679, -0.032466, -0.033955, -0.035743, + -0.037828, -0.039913, -0.041700, -0.043785, -0.045274, -0.047061, + -0.048550, -0.050040, -0.052125, -0.054210, -0.055997, -0.057188, + -0.058380, -0.058975, -0.060464, -0.061060, -0.062252, -0.062847, + -0.064039, -0.064932, -0.065826, -0.067017, -0.067911, -0.069102, + -0.069698, -0.070889, -0.071783, -0.073272, -0.074464, -0.075655, + -0.076549, -0.078038, -0.078634, -0.079825, -0.080421, -0.081016, + -0.081314, -0.081910, -0.081612, -0.081612, -0.081314, -0.081314, + -0.081612, -0.081314, -0.081910, -0.081910, -0.082506, -0.083101, + -0.083399, -0.083399, -0.083697, -0.084293, -0.084889, -0.085186, + -0.085484, -0.086676, -0.087867, -0.088463, -0.088761, -0.089654, + -0.090846, -0.091739, -0.092037, -0.091144, -0.091739, -0.092633, + -0.092931, -0.092633, -0.092633, -0.093228, -0.094718, -0.095611, + -0.096505, -0.097696, -0.099186, -0.100973, -0.102760, -0.104249, + -0.105441, -0.106334, -0.107526, -0.108419, -0.109313, -0.109610, + -0.109908, -0.109908, -0.110504, -0.111100, -0.111100, -0.111100, + -0.111695, -0.112887, -0.113780, -0.114376, -0.114674, -0.115568, + -0.116461, -0.117057, -0.117057, -0.117355, -0.118248, -0.119738, + -0.120631, -0.121227, -0.121823, -0.122418, -0.123908, -0.123610, + -0.123312, -0.123014, -0.123908, -0.124205, -0.123908, -0.123312, + -0.123610, -0.123908, -0.125397, -0.126290, -0.127184, -0.127482, + -0.128375, -0.129269, -0.129567, -0.129567, -0.129567, -0.130460, + -0.132247, -0.133439, -0.134035, -0.134630, -0.135822, -0.136120, + -0.135524, -0.134332, -0.133737, -0.133141, -0.134035, -0.134332, + -0.134332, -0.134630, -0.136417, -0.138502, -0.140885, -0.141779, + -0.142375, -0.143268, -0.144459, -0.145055, -0.144459, -0.144162, + -0.144459, -0.145055, -0.145353, -0.145353, -0.145353, -0.145353, + -0.146247, -0.147140, -0.147736, -0.147140, -0.147140, -0.147736, + -0.148629, -0.148034, -0.147140, -0.146842, -0.148927, -0.151608, + -0.151608, -0.150714, -0.151608, -0.153991, -0.154884, -0.152502, + -0.150119, -0.149821, -0.151608, -0.151906, -0.150119, -0.148034, + -0.147736, -0.148034, -0.146544, -0.143864, -0.142077, -0.142375, + -0.144459, -0.146247, -0.146842, -0.148034, -0.149523, -0.151012, + -0.151310, -0.150119, -0.150714, -0.151608, -0.151012, -0.149821, + -0.150119, -0.150417, -0.150119, -0.149821, -0.150714, -0.151310, + -0.152204, -0.153097, -0.153991, -0.154587, -0.155182, -0.155182, + -0.155480, -0.156374, -0.156076, -0.154587, -0.151310, -0.148332, + -0.144162, -0.137609, -0.128971, -0.120929, -0.114972, -0.110802, + -0.105441, -0.098292, -0.090250, -0.082506, -0.073570, -0.063443, + -0.055103, -0.050337, -0.048550, -0.047657, -0.046465, -0.044678, + -0.040508, -0.033658, -0.024126, -0.013106, -0.002681, 0.005064, + 0.011318, 0.015786, 0.019063, 0.021743, 0.025913, 0.032168, + 0.040210, 0.047955, 0.055103, 0.060762, 0.064932, 0.067613, + 0.068804, 0.069996, 0.071485, 0.072974, 0.075059, 0.076251, + 0.076846, 0.077442, 0.078634, 0.081612, 0.085186, 0.089654, + 0.094420, 0.099781, 0.104249, 0.108121, 0.111398, 0.113780, + 0.115270, 0.118546, 0.121823, 0.125695, 0.128971, 0.131950, + 0.134332, 0.136120, 0.135226, 0.134035, 0.133737, 0.135226, + 0.137311, 0.139396, 0.142970, 0.148332, 0.153991, 0.159352, + 0.162331, 0.165607, 0.169479, 0.173351, 0.176628, 0.179011, + 0.182287, 0.186755, 0.191520, 0.195690, 0.198371, 0.201350, + 0.203733, 0.204626, 0.204030, 0.203435, 0.202243, 0.202839, + 0.204030, 0.204924, 0.206413, 0.208498, 0.211179, 0.212966, + 0.213860, 0.214455, 0.214753, 0.216242, 0.216540, 0.216242, + 0.215349, 0.215051, 0.215051, 0.213860, 0.211775, 0.208796, + 0.206711, 0.204924, 0.202243, 0.198669, 0.194797, 0.191818, + 0.189138, 0.187053, 0.184670, 0.183181, 0.182883, 0.182585, + 0.182883, 0.181989, 0.180500, 0.179011, 0.177223, 0.175734, + 0.173351, 0.171564, 0.170373, 0.170373, 0.169479, 0.168586, + 0.166501, 0.164714, 0.162629, 0.159352, 0.156672, 0.153395, + 0.152204, 0.151310, 0.151012, 0.150714, 0.150417, 0.151012, + 0.151310, 0.150714, 0.149821, 0.148927, 0.148927, 0.148034, + 0.147438, 0.146247, 0.144757, 0.143864, 0.142077, 0.139992, + 0.137311, 0.135226, 0.132545, 0.129269, 0.126290, 0.123312, + 0.121525, 0.119142, 0.117355, 0.115568, 0.113185, 0.111695, + 0.110206, 0.108419, 0.106036, 0.103653, 0.101271, 0.098888, + 0.096207, 0.093228, 0.090250, 0.087569, 0.086378, 0.085782, + 0.086378, 0.086974, 0.085782, 0.083101, 0.079527, 0.075953, + 0.072081, 0.067613, 0.064634, 0.063145, 0.063145, 0.062252, + 0.061060, 0.058975, 0.057188, 0.054805, 0.052720, 0.050933, + 0.050337, 0.049742, 0.048848, 0.047359, 0.046465, 0.045274, + 0.042891, 0.039913, 0.037530, 0.036338, 0.035743, 0.034253, + 0.032168, 0.030083, 0.028296, 0.026211, 0.023531, 0.021743, + 0.021743, 0.021446, 0.020552, 0.018765, 0.017276, 0.016084, + 0.014595, 0.013106, 0.011914, 0.011914, 0.013106, 0.013999, + 0.013403, 0.012808, 0.012212, 0.011616, 0.009829, 0.007446, + 0.005957, 0.005064, 0.004468, 0.003574, 0.002979, 0.003276, + 0.005064, 0.005957, 0.006553, 0.006851, 0.007446, 0.008340, + 0.008042, 0.007744, 0.007744, 0.008340, 0.008936, 0.009531, + 0.010425, 0.010723, 0.011318, 0.010723, 0.010723, 0.010425, + 0.010723, 0.011021, 0.011914, 0.013403, 0.014297, 0.015488, + 0.014893, 0.014893, 0.014893, 0.015191, 0.014595, 0.014297, + 0.013999, 0.014893, 0.015786, 0.015488, 0.014893, 0.014893, + 0.015786, 0.015786, 0.015191, 0.013701, 0.013106, 0.011914, + 0.010723, 0.008936, 0.007149, 0.006255, 0.005957, 0.005659, + 0.005064, 0.005064, 0.005957, 0.005957, 0.005064, 0.003872, + 0.003276, 0.003276, 0.002979, 0.002383, 0.001787, 0.002085, + 0.002383, 0.001787, 0.000596, 0.000000, -0.000298, -0.000596, + -0.001191, -0.001489, -0.001787, -0.001191, -0.001191, -0.001489, + -0.001489, -0.001489, -0.001489, -0.002085, -0.002085, -0.002383, + -0.002383, -0.002681, -0.002085, -0.001787, -0.001489, -0.001787, + -0.002085, -0.002383, -0.002979, -0.003276, -0.005064, -0.006851, + -0.008042, -0.008936, -0.009829, -0.010723, -0.011616, -0.011914, + -0.011914, -0.012808, -0.013106, -0.013999, -0.014297, -0.014893, + -0.016084, -0.017573, -0.019063, -0.019956, -0.021446, -0.022935, + -0.024424, -0.025615, -0.026807, -0.027403, -0.029190, -0.030381, + -0.031573, -0.032466, -0.033658, -0.034849, -0.035743, -0.036636, + -0.037530, -0.038423, -0.039615, -0.040508, -0.041402, -0.042295, + -0.043189, -0.043785, -0.044380, -0.044976, -0.045572, -0.046465, + -0.047359, -0.048848, -0.049742, -0.050933, -0.051827, -0.053316, + -0.054507, -0.055401, -0.055997, -0.056592, -0.057188, -0.057486, + -0.057188, -0.057188, -0.057188, -0.057486, -0.058082, -0.058677, + -0.059273, -0.060167, -0.061358, -0.062252, -0.063145, -0.063741, + -0.064337, -0.065528, -0.066124, -0.067017, -0.067613, -0.068804, + -0.069400, -0.069996, -0.070294, -0.070592, -0.070889, -0.070889, + -0.071187, -0.071485, -0.072081, -0.072379, -0.072974, -0.073570, + -0.074464, -0.075357, -0.075953, -0.076846, -0.078038, -0.078931, + -0.079825, -0.080719, -0.081314, -0.082506, -0.083399, -0.084293, + -0.084889, -0.086080, -0.087569, -0.088165, -0.087867, -0.088165, + -0.088463, -0.089059, -0.089654, -0.089356, -0.090250, -0.091441, + -0.092931, -0.093824, -0.094420, -0.095313, -0.096207, -0.097696, + -0.098888, -0.100377, -0.101271, -0.102164, -0.102760, -0.103951, + -0.104249, -0.104249, -0.103951, -0.103951, -0.104845, -0.105738, + -0.105738, -0.105738, -0.106334, -0.107823, -0.108717, -0.108419, + -0.109015, -0.109908, -0.111100, -0.111100, -0.110802, -0.110504, + -0.111100, -0.111695, -0.112291, -0.113185, -0.114376, -0.114674, + -0.114674, -0.114674, -0.114972, -0.114972, -0.114674, -0.113780, + -0.113780, -0.114078, -0.114674, -0.115270, -0.116461, -0.116759, + -0.117355, -0.118844, -0.119738, -0.120333, -0.120631, -0.121525, + -0.122716, -0.123610, -0.124205, -0.123312, -0.122418, -0.121525, + -0.122120, -0.122418, -0.121823, -0.120333, -0.120929, -0.123312, + -0.124503, -0.123610, -0.121525, -0.121227, -0.122418, -0.123312, + -0.122120, -0.120929, -0.120929, -0.122120, -0.123014, -0.122120, + -0.120631, -0.120631, -0.122418, -0.123908, -0.124503, -0.123908, + -0.124503, -0.124205, -0.123908, -0.121823, -0.120035, -0.118546, + -0.117355, -0.116461, -0.115568, -0.115270, -0.115270, -0.115865, + -0.114674, -0.113780, -0.114376, -0.117057, -0.119142, -0.119440, + -0.119142, -0.120929, -0.122120, -0.121227, -0.118546, -0.117355, + -0.116759, -0.115568, -0.113780, -0.113185, -0.113185, -0.113185, + -0.111993, -0.111398, -0.111100, -0.111100, -0.110802, -0.109610, + -0.109908, -0.111398, -0.112589, -0.111695, -0.110206, -0.110802, + -0.112291, -0.111993, -0.109015, -0.105143, -0.103058, -0.101271, + -0.096505, -0.090548, -0.086676, -0.085186, -0.084591, -0.080719, + -0.076251, -0.072379, -0.068804, -0.063443, -0.056592, -0.048252, + -0.040210, -0.034253, -0.030381, -0.027403, -0.024722, -0.022637, + -0.022339, -0.021446, -0.018765, -0.013701, -0.006553, 0.001191, + 0.008340, 0.015191, 0.020850, 0.026509, 0.031573, 0.034849, + 0.036636, 0.038125, 0.041104, 0.045572, 0.051231, 0.055997, + 0.061060, 0.066124, 0.070294, 0.073570, 0.074762, 0.074762, + 0.074762, 0.074762, 0.075059, 0.075953, 0.078634, 0.082208, + 0.084591, 0.086378, 0.088463, 0.092037, 0.095313, 0.097101, + 0.098590, 0.102164, 0.107228, 0.112589, 0.116163, 0.118844, + 0.122120, 0.125099, 0.126588, 0.126886, 0.126290, 0.125992, + 0.126290, 0.126588, 0.126886, 0.128077, 0.131056, 0.135524, + 0.140587, 0.145949, 0.150714, 0.155778, 0.158756, 0.161437, + 0.162926, 0.164416, 0.165011, 0.166501, 0.169777, 0.172756, + 0.175734, 0.177223, 0.179011, 0.179904, 0.180202, 0.179011, + 0.178415, 0.177819, 0.178117, 0.178713, 0.179606, 0.180202, + 0.181393, 0.182287, 0.183478, 0.183776, 0.183478, 0.183776, + 0.184074, 0.184372, 0.184372, 0.184074, 0.184074, 0.183181, + 0.182287, 0.180500, 0.178415, 0.175734, 0.172458, 0.169181, + 0.165905, 0.163522, 0.160841, 0.159352, 0.157863, 0.157863, + 0.157863, 0.158756, 0.158161, 0.157863, 0.156969, 0.156374, + 0.154587, 0.152799, 0.151012, 0.149821, 0.148629, 0.147438, + 0.146247, 0.145055, 0.143864, 0.141779, 0.139992, 0.137907, + 0.135822, 0.133737, 0.131354, 0.129865, 0.128673, 0.128077, + 0.127482, 0.127482, 0.126886, 0.126588, 0.125992, 0.125099, + 0.124205, 0.123610, 0.122716, 0.123014, 0.121525, 0.120333, + 0.118546, 0.117057, 0.114674, 0.111993, 0.108981, 0.105376, + 0.102963, 0.099956, 0.098141, 0.096327, 0.095109, 0.093594, + 0.092971, 0.092349, 0.091430, 0.090511, 0.089000, 0.087787, + 0.085981, 0.084176, 0.081779, 0.079385, 0.076991, 0.074303, + 0.072209, 0.069820, 0.067432, 0.065046, 0.062957, 0.060574, + 0.057896, 0.054630, 0.052547, 0.050465, 0.049269, 0.047779, + 0.046585, 0.045981, 0.045377, 0.045069, 0.044171, 0.042391, + 0.041495, 0.040306, 0.039411, 0.037929, 0.036153, 0.034085, + 0.032606, 0.031127, 0.028769, 0.026412, 0.024057, 0.022290, + 0.020524, 0.019052, 0.017288, 0.016111, 0.015520, 0.015223, + 0.015218, 0.014920, 0.014916, 0.014911, 0.014907, 0.014025, + 0.012852, 0.011388, 0.010217, 0.009047, 0.007877, 0.006125, + 0.005248, 0.004080, 0.003496, 0.002039, 0.001165, 0.000000, + -0.000873, -0.001745, -0.002327, -0.003198, -0.003197, -0.003196, + -0.002324, -0.002033, -0.001742, -0.000580, 0.000000, 0.000000, + 0.000290, 0.000000, -0.000290, -0.000579, -0.000579, -0.000868, + -0.001447, -0.001446, -0.000868, -0.000289, -0.000289, -0.000578, + -0.000866, -0.000577, 0.000000, 0.000000, 0.000288, 0.000288, + 0.001730, 0.002882, 0.003169, 0.003168, 0.003455, 0.004317, + 0.004028, 0.004027, 0.003738, 0.003737, 0.003736, 0.003447, + 0.002297, 0.001722, 0.001148, 0.001148, 0.000860, 0.000000, + -0.000860, -0.001433, -0.001432, -0.002004, -0.002863, -0.003720, + -0.003433, -0.003146, -0.002859, -0.003430, -0.003429, -0.003427, + -0.003712, -0.003996, -0.004851, -0.005705, -0.005703, -0.006272, + -0.007124, -0.007692, -0.007974, -0.007972, -0.008254, -0.008536, + -0.008817, -0.008815, -0.008812, -0.008809, -0.008806, -0.008519, + -0.008233, -0.008230, -0.007376, -0.007374, -0.007371, -0.007086, + -0.007083, -0.007364, -0.007645, -0.008209, -0.008489, -0.008486, + -0.009049, -0.009329, -0.009609, -0.010171, -0.010450, -0.010729, + -0.011290, -0.012132, -0.012128, -0.012688, -0.012403, -0.012962, + -0.013521, -0.014080, -0.013794, -0.014071, -0.014910, -0.015749, + -0.016588, -0.017144, -0.018263, -0.019380, -0.020497, -0.021613, + -0.022448, -0.023843, -0.024676, -0.025790, -0.026622, -0.027454, + -0.028005, -0.028836, -0.029946, -0.030495, -0.031325, -0.031874, + -0.032702, -0.033250, -0.033798, -0.034345, -0.034892, -0.035439, + -0.036264, -0.036810, -0.037355, -0.038179, -0.038724, -0.039268, + -0.040090, -0.040077, -0.040621, -0.040885, -0.041706, -0.042248, + -0.042512, -0.043054, -0.043040, -0.043581, -0.043566, -0.043275, + -0.042983, -0.042969, -0.043232, -0.042941, -0.042926, -0.042635, + -0.043452, -0.043991, -0.044529, -0.044791, -0.045329, -0.045867, + -0.046128, -0.046665, -0.047201, -0.047186, -0.047998, -0.048258, + -0.049069, -0.049603, -0.049587, -0.050397, -0.050380, -0.050914, + -0.051172, -0.051705, -0.051688, -0.052495, -0.052753, -0.053010, + -0.053267, -0.053798, -0.054603, -0.055134, -0.055664, -0.056193, + -0.057271, -0.057799, -0.058328, -0.058856, -0.059657, -0.060185, + -0.060438, -0.060691, -0.061217, -0.062017, -0.061996, -0.061975, + -0.061954, -0.062206, -0.062186, -0.062438, -0.062689, -0.063213, + -0.063192, -0.063715, -0.064511, -0.064761, -0.065283, -0.065805, + -0.066055, -0.066305, -0.066554, -0.066803, -0.067052, -0.067572, + -0.067821, -0.068340, -0.068317, -0.068836, -0.069626, -0.070144, + -0.070391, -0.070909, -0.071155, -0.071402, -0.071378, -0.071894, + -0.071870, -0.072116, -0.072631, -0.072607, -0.072852, -0.072827, + -0.073342, -0.073587, -0.073831, -0.074076, -0.074589, -0.075102, + -0.075346, -0.075589, -0.075563, -0.075538, -0.075781, -0.075755, + -0.075998, -0.075704, -0.075946, -0.075920, -0.075895, -0.075869, + -0.075039, -0.074745, -0.074184, -0.073891, -0.073331, -0.072503, + -0.072211, -0.071919, -0.071627, -0.071336, -0.070510, -0.070486, + -0.070462, -0.070171, -0.070147, -0.070656, -0.070898, -0.071140, + -0.071382, -0.071624, -0.071866, -0.072107, -0.072083, -0.071526, + -0.070970, -0.070680, -0.070655, -0.070631, -0.070076, -0.069787, + -0.070028, -0.070269, -0.070510, -0.069955, -0.069666, -0.069378, + -0.069618, -0.069859, -0.069306, -0.069282, -0.068729, -0.068970, + -0.068946, -0.068394, -0.068106, -0.067819, -0.067796, -0.067245, + -0.066431, -0.065090, -0.064014, -0.063465, -0.062916, -0.061315, + -0.060768, -0.059958, -0.059411, -0.058340, -0.057531, -0.056986, + -0.056704, -0.055897, -0.054828, -0.054284, -0.053479, -0.052936, + -0.052132, -0.051590, -0.050787, -0.049984, -0.049182, -0.048380, + -0.047317, -0.045994, -0.044933, -0.043612, -0.042552, -0.041493, + -0.040175, -0.038596, -0.037800, -0.036484, -0.035169, -0.033854, + -0.032801, -0.032269, -0.032258, -0.031986, -0.032235, -0.031704, + -0.031693, -0.031422, -0.030892, -0.030621, -0.029832, -0.029044, + -0.027997, -0.026173, -0.024350, -0.022788, -0.021227, -0.019926, + -0.019142, -0.018101, -0.017578, -0.017055, -0.016791, -0.016268, + -0.014972, -0.013676, -0.012898, -0.011862, -0.010569, -0.009276, + -0.007985, -0.007725, -0.006178, -0.003345, -0.000514, 0.001543, + 0.002570, 0.004625, 0.006935, 0.008730, 0.009497, 0.010520, + 0.012312, 0.014358, 0.016404, 0.018448, 0.021002, 0.023555, + 0.025594, 0.027120, 0.028389, 0.029913, 0.031436, 0.032958, + 0.033712, 0.034977, 0.036751, 0.038778, 0.040550, 0.041810, + 0.043324, 0.045601, 0.047877, 0.050151, 0.052169, 0.054440, + 0.056200, 0.058468, 0.059972, 0.061220, 0.062468, 0.062953, + 0.063945, 0.065191, 0.066435, 0.067425, 0.068668, 0.070416, + 0.071150, 0.072390, 0.073376, 0.074867, 0.076104, 0.077593, + 0.078829, 0.080316, 0.081801, 0.083286, 0.084770, 0.085496, + 0.086977, 0.088458, 0.090189, 0.092171, 0.093900, 0.094621, + 0.096096, 0.097067, 0.098037, 0.098002, 0.098217, 0.098433, + 0.098648, 0.099365, 0.100081, 0.101048, 0.101763, 0.103480, + 0.104945, 0.106409, 0.107371, 0.108583, 0.109794, 0.111004, + 0.111463, 0.112172, 0.112880, 0.113587, 0.113546, 0.113255, + 0.113463, 0.113421, 0.113878, 0.113338, 0.113297, 0.113504, + 0.113960, 0.114664, 0.114374, 0.114332, 0.114787, 0.114993, + 0.115447, 0.114660, 0.114618, 0.114576, 0.114781, 0.114987, + 0.114944, 0.114654, 0.114860, 0.114817, 0.114775, 0.114238, + 0.113702, 0.113165, 0.112383, 0.111353, 0.110325, 0.108804, + 0.107777, 0.106751, 0.105972, 0.105440, 0.104416, 0.104623, + 0.104093, 0.104300, 0.104015, 0.103239, 0.102955, 0.102426, + 0.101651, 0.100631, 0.099858, 0.098594, 0.097577, 0.096560, + 0.095055, 0.093550, 0.092291, 0.091033, 0.089776, 0.088520, + 0.087753, 0.086987, 0.086222, 0.085702, 0.084693, 0.083686, + 0.082679, 0.081673, 0.080667, 0.079419, 0.078171, 0.077168, + 0.076409, 0.075651, 0.074164, 0.072921, 0.072164, 0.070923, + 0.069682, 0.068200, 0.066718, 0.065238, 0.063516, 0.062038, + 0.060319, 0.059086, 0.057853, 0.056864, 0.055875, 0.055128, + 0.054141, 0.053395, 0.052651, 0.051665, 0.050439, 0.049455, + 0.048230, 0.047007, 0.045543, 0.043840, 0.042378, 0.041159, + 0.039699, 0.038241, 0.036784, 0.035569, 0.034354, 0.033620, + 0.032407, 0.031195, 0.030224, 0.029014, 0.028044, 0.027075, + 0.025867, 0.024899, 0.023693, 0.022488, 0.021044, 0.019841, + 0.018639, 0.017676, 0.016476, 0.015515, 0.014316, 0.013595, + 0.012159, 0.011201, 0.009529, 0.008335, 0.006665, 0.005473, + 0.004519, 0.003091, 0.001901, 0.000950, 0.000000, -0.000712, + -0.001424, -0.002372, -0.003320, -0.004030, -0.004976, -0.005921, + -0.006866, -0.007574, -0.008754, -0.009696, -0.010402, -0.011343, + -0.012283, -0.012987, -0.013926, -0.014629, -0.015566, -0.016268, + -0.016968, -0.017669, -0.018368, -0.018832, -0.019530, -0.020229, + -0.020691, -0.021153, -0.022085, -0.022780, -0.023241, -0.023936, + -0.024161, -0.024855, -0.025315, -0.026008, -0.026466, -0.027158, + -0.027615, -0.028540, -0.028997, -0.029921, -0.030610, -0.031299, + -0.031987, -0.032908, -0.033595, -0.034048, -0.034501, -0.034721, + -0.035406, -0.035858, -0.036309, -0.036760, -0.036978, -0.037894, + -0.038344, -0.039025, -0.039474, -0.040155, -0.040835, -0.041515, + -0.041963, -0.042409, -0.042624, -0.043302, -0.043980, -0.044194, + -0.044639, -0.044852, -0.045066, -0.045741, -0.045723, -0.045936, + -0.046148, -0.046361, -0.046342, -0.046554, -0.046766, -0.046978, + -0.046959, -0.047171, -0.047382, -0.047363, -0.047574, -0.047556, + -0.047766, -0.047747, -0.048187, -0.048397, -0.048837, -0.049046, + -0.049256, -0.049236, -0.049446, -0.049426, -0.049406, -0.049158, + -0.048910, -0.048662, -0.048642, -0.048395, -0.048375, -0.048128, + -0.048336, -0.048317, -0.048298, -0.048278, -0.048259, -0.048467, + -0.048448, -0.048428, -0.048409, -0.048162, -0.048143, -0.048124, + -0.047877, -0.047858, -0.047612, -0.047593, -0.047574, -0.047328, + -0.047083, -0.046837, -0.046592, -0.046347, -0.046329, -0.046084, + -0.045614, -0.045370, -0.044900, -0.044431, -0.044187, -0.043719, + -0.043701, -0.043233, -0.042990, -0.042748, -0.042506, -0.042264, + -0.042022, -0.041555, -0.041314, -0.040848, -0.040607, -0.040142, + -0.039453, -0.038989, -0.038749, -0.038286, -0.038046, -0.037583, + -0.037344, -0.036882, -0.036420, -0.036182, -0.035944, -0.035483, + -0.035022, -0.035008, -0.034548, -0.034311, -0.034074, -0.033615, + -0.033601, -0.033142, -0.032906, -0.032671, -0.032657, -0.032422, + -0.032186, -0.031951, -0.031716, -0.031038, -0.030804, -0.030348, + -0.029893, -0.029659, -0.029204, -0.028750, -0.028517, -0.028063, + -0.027610, -0.027378, -0.027366, -0.027355, -0.026903, -0.027112, + -0.027101, -0.026869, -0.026638, -0.026407, -0.026176, -0.025945, + -0.025935, -0.025265, -0.025035, -0.024585, -0.024575, -0.024126, + -0.023678, -0.023449, -0.023439, -0.023429, -0.023638, -0.023628, + -0.023618, -0.023608, -0.023599, -0.023589, -0.023579, -0.023351, + -0.023559, -0.023113, -0.023104, -0.022876, -0.022649, -0.022421, + -0.021977, -0.021750, -0.021524, -0.021080, -0.020854, -0.020845, + -0.020836, -0.020611, -0.020602, -0.020376, -0.020368, -0.020359, + -0.020351, -0.020342, -0.020766, -0.020325, -0.020100, -0.019660, + -0.019219, -0.018995, -0.018556, -0.017901, -0.017893, -0.018101, + -0.018094, -0.017655, -0.015926, -0.014414, -0.014192, -0.015906, + -0.016759, -0.016537, -0.016315, -0.016093, -0.017374, -0.018438, + -0.017144, -0.015423, -0.014989, -0.015624, -0.016687, -0.015825, + -0.013894, -0.012606, -0.013028, -0.014090, -0.014511, -0.013438, + -0.012579, -0.013213, -0.013847, -0.014054, -0.013622, -0.013403, + -0.013610, -0.014242, -0.014449, -0.014655, -0.014436, -0.014006, + -0.013363, -0.012509, -0.012080, -0.012075, -0.011646, -0.010795, + -0.010367, -0.010151, -0.010146, -0.009719, -0.009082, -0.008655, + -0.008019, -0.007804, -0.007168, -0.006322, -0.005898, -0.005053, + -0.004841, -0.004628, -0.004626, -0.004835, -0.005043, -0.005040, + -0.004828, -0.004826, -0.004195, -0.003983, -0.002934, -0.001885, + -0.001047, 0.000000, 0.000418, 0.001464, 0.002299, 0.002925, + 0.002924, 0.003131, 0.003338, 0.003963, 0.004169, 0.004167, + 0.004166, 0.003956, 0.003746, 0.003536, 0.003119, 0.002702, + 0.002701, 0.002699, 0.002491, 0.002489, 0.002903, 0.003316, + 0.003729, 0.003728, 0.003933, 0.004552, 0.004964, 0.005168, + 0.005373, 0.005577, 0.005368, 0.005778, 0.005569, 0.005361, + 0.004946, 0.004944, 0.004736, 0.004734, 0.004526, 0.004730, + 0.004933, 0.004931, 0.005134, 0.005542, 0.006566, 0.007178, + 0.007790, 0.008606, 0.009216, 0.009826, 0.010231, 0.010636, + 0.011040, 0.011444, 0.011643, 0.012046, 0.012449, 0.013055, + 0.013661, 0.014063, 0.014464, 0.015068, 0.015265, 0.015665, + 0.016065, 0.016464, 0.016863, 0.017058, 0.017863, 0.018260, + 0.018860, 0.019257, 0.019451, 0.019848, 0.020244, 0.020437, + 0.020630, 0.020620, 0.020813, 0.021006, 0.021198, 0.020987, + 0.021179, 0.021169, 0.020958, 0.020949, 0.020939, 0.020729, + 0.020920, 0.020710, 0.020700, 0.021093, 0.021284, 0.021676, + 0.021666, 0.021856, 0.021646, 0.022237, 0.022227, 0.022417, + 0.022207, 0.022197, 0.021787, 0.021777, 0.022166, 0.022156, + 0.022146, 0.022335, 0.022724, 0.022713, 0.023101, 0.023091, + 0.023279, 0.023467, 0.023655, 0.024042, 0.024229, 0.024417, + 0.024405, 0.024791, 0.024779, 0.024768, 0.024757, 0.024745, + 0.024734, 0.024722, 0.024513, 0.024502, 0.024491, 0.024677, + 0.024863, 0.024851, 0.024840, 0.024828, 0.024620, 0.024411, + 0.024203, 0.024192, 0.023984, 0.023973, 0.023962, 0.023754, + 0.023940, 0.024125, 0.023917, 0.023906, 0.023699, 0.023492, + 0.023090, 0.022884, 0.022482, 0.022276, 0.021875, 0.021670, + 0.021464, 0.021454, 0.021249, 0.021239, 0.021229, 0.021025, + 0.021015, 0.020811, 0.020606, 0.020597, 0.020587, 0.020966, + 0.020956, 0.021334, 0.021324, 0.021701, 0.021497, 0.021487, + 0.021477, 0.021467, 0.021650, 0.021447, 0.021436, 0.021619, + 0.021609, 0.021599, 0.021589, 0.021386, 0.021568, 0.021943, + 0.021933, 0.021730, 0.021912, 0.021709, 0.021891, 0.021881, + 0.021870, 0.022051, 0.022041, 0.022414, 0.022020, 0.022009, + 0.021616, 0.021415, 0.021022, 0.020821, 0.020620, 0.020229, + 0.020219, 0.020019, 0.020009, 0.019809, 0.019800, 0.019981, + 0.019781, 0.019771, 0.019762, 0.019562, 0.019553, 0.019354, + 0.019155, 0.019146, 0.019136, 0.019127, 0.018929, 0.019109, + 0.018910, 0.018712, 0.018514, 0.018505, 0.018308, 0.018487, + 0.018290, 0.018281, 0.018272, 0.018452, 0.018255, 0.018246, + 0.018237, 0.018228, 0.017843, 0.017835, 0.017826, 0.017817, + 0.017809, 0.017613, 0.017230, 0.017034, 0.017026, 0.016643, + 0.016448, 0.016253, 0.016059, 0.015678, 0.015483, 0.015103, + 0.014723, 0.014529, 0.014150, 0.014143, 0.013764, 0.013385, + 0.013193, 0.012815, 0.012623, 0.012246, 0.012054, 0.011678, + 0.011301, 0.010925, 0.010550, 0.010360, 0.009985, 0.009610, + 0.009421, 0.009047, 0.008673, 0.008300, 0.008112, 0.007739, + 0.007735, 0.007547, 0.007176, 0.006988, 0.006801, 0.006614, + 0.006243, 0.006057, 0.005870, 0.005684, 0.005498, 0.005312, + 0.005126, 0.004941, 0.004755, 0.004570, 0.004568, 0.004200, + 0.004016, 0.003831, 0.003465, 0.003463, 0.003279, 0.003095, + 0.002912, 0.002546, 0.002363, 0.002180, 0.001816, 0.001634, + 0.001633, 0.001269, 0.001088, 0.000906, 0.000724, 0.000543, + 0.000543, 0.000181, 0.000000, -0.000181, -0.000361, -0.000541, + -0.000721, -0.000901, -0.001081, -0.001441, -0.001800, -0.001799, + -0.002157, -0.002336, -0.002694, -0.002693, -0.003050, -0.003049, + -0.003406, -0.003583, -0.003760, -0.003937, -0.004293, -0.004291, + -0.004289, -0.004644, -0.004820, -0.004996, -0.004993, -0.005169, + -0.005344, -0.005342, -0.005517, -0.005692, -0.005867, -0.005864, + -0.005861, -0.006035, -0.006032, -0.006029, -0.006026, -0.005846, + -0.006020, -0.006017, -0.006014, -0.006010, -0.006007, -0.005828, + -0.005825, -0.005998, -0.005995, -0.005992, -0.005989, -0.005810, + -0.005982, -0.005804, -0.005976, -0.005797, -0.005970, -0.005967, + -0.005964, -0.005961, -0.005958, -0.005779, -0.006126, -0.005773, + -0.006120, -0.005942, -0.005939, -0.005936, -0.005933, -0.005930, + -0.005927, -0.005749, -0.005746, -0.005743, -0.005566, -0.005737, + -0.005560, -0.005558, -0.005555, -0.005552, -0.005375, -0.005546, + -0.005716, -0.005713, -0.005710, -0.005534, -0.005358, -0.005183, + -0.005007, -0.005005, -0.005002, -0.004655, -0.004480, -0.004133, + -0.003959, -0.003957, -0.003783, -0.003437, -0.003607, -0.003090, + -0.003088, -0.002915, -0.002742, -0.002569, -0.002568, -0.002567, + -0.002223, -0.002222, -0.002050, -0.001878, -0.001536, -0.001706, + -0.001534, -0.001363, -0.001192, -0.001021, -0.000851, -0.000680, + -0.000340, -0.000340, -0.000170, -0.000339, -0.000170, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, -0.000169, 0.000000, 0.000000, 0.000000, 0.000000, + -0.000168, -0.000336, -0.000336, -0.000336, -0.000504, -0.000671, + -0.000671, -0.001006, -0.001005, -0.001340, -0.001339, -0.001338, + -0.001505, -0.001504, -0.001670, -0.001669, -0.002002, -0.002168, + -0.002000, -0.002165, -0.002330, -0.002329, -0.002328, -0.002327, + -0.002325, -0.002324, -0.002323, -0.002321, -0.002154, -0.002153, + -0.001987, -0.001985, -0.001984, -0.001818, -0.001817, -0.001816, + -0.001650, -0.001649, -0.001648, -0.001812, -0.001811, -0.001810, + -0.002138, -0.002301, -0.002300, -0.002627, -0.002625, -0.002952, + -0.003114, -0.003112, -0.003274, -0.003436, -0.003598, -0.003759, + -0.003921, -0.003918, -0.004079, -0.004240, -0.004075, -0.004235, + -0.004396, -0.004393, -0.004553, -0.004551, -0.004873, -0.004870, + -0.005030, -0.005352, -0.005511, -0.005993, -0.006152, -0.006472, + -0.006954, -0.006950, -0.007430, -0.007588, -0.007906, -0.008224, + -0.008542, -0.008859, -0.009176, -0.009332, -0.009326, -0.009482, + -0.009637, -0.009952, -0.010107, -0.010101, -0.010256, -0.010250, + -0.010244, -0.010398, -0.010552, -0.010387, -0.010381, -0.010534, + -0.010369, -0.010522, -0.010357, -0.010510, -0.010504, -0.010498, + -0.010492, -0.010486, -0.010480, -0.010474, -0.010468, -0.010303, + -0.010456, -0.010292, -0.010286, -0.010122, -0.009958, -0.009952, + -0.009788, -0.009625, -0.009619, -0.009456, -0.009293, -0.009130, + -0.009125, -0.009120, -0.008957, -0.008795, -0.008790, -0.008785, + -0.008780, -0.008931, -0.009083, -0.009077, -0.009228, -0.009223, + -0.009530, -0.009368, -0.009363, -0.009202, -0.009196, -0.009035, + -0.008874, -0.008558, -0.008397, -0.008392, -0.008077, -0.008072, + -0.007912, -0.007597, -0.007438, -0.007279, -0.007119, -0.006961, + -0.006647, -0.006334, -0.006331, -0.006173, -0.005860, -0.005857, + -0.005700, -0.005542, -0.005539, -0.005382, -0.005379, -0.005375, + -0.005526, -0.005522, -0.005519, -0.005669, -0.005666, -0.005662, + -0.005965, -0.006114, -0.006110, -0.006107, -0.006256, -0.006252, + -0.006401, -0.006397, -0.006545, -0.006389, -0.006689, -0.006837, + -0.006681, -0.006677, -0.006673, -0.006669, -0.006665, -0.006510, + -0.006657, -0.006502, -0.006649, -0.006494, -0.006490, -0.006335, + -0.006181, -0.006328, -0.006324, -0.006320, -0.006467, -0.006312, + -0.006309, -0.006455, -0.006301, -0.006297, -0.006293, -0.006289, + -0.006286, -0.006132, -0.005979, -0.005975, -0.005673, -0.005819, + -0.005517, -0.005514, -0.005212, -0.005060, -0.005057, -0.005054, + -0.004754, -0.004751, -0.004748, -0.004745, -0.004594, -0.004591, + -0.004292, -0.004438, -0.004287, -0.004137, -0.004134, -0.003836, + -0.003687, -0.003684, -0.003535, -0.003385, -0.003089, -0.003087, + -0.002791, -0.002790, -0.002641, -0.002640, -0.002491, -0.002490, + -0.002635, -0.002779, -0.002778, -0.002776, -0.003066, -0.002918, + -0.003062, -0.003060, -0.003058, -0.003057, -0.003055, -0.003053, + -0.002905, -0.002613, -0.002612, -0.002610, -0.002319, -0.002462, + -0.002460, -0.002314, -0.002313, -0.002167, -0.002165, -0.002164, + -0.002163, -0.002161, -0.002160, -0.002159, -0.002013, -0.001868, + -0.001724, -0.001722, -0.001578, -0.001434, -0.001289, -0.001289, + -0.001431, -0.001287, -0.001429, -0.001285, -0.001570, -0.001426, + -0.001425, -0.001424, -0.001566, -0.001565, -0.001706, -0.001847, + -0.001988, -0.001987, -0.002127, -0.001984, -0.001983, -0.001840, + -0.001839, -0.001555, -0.001554, -0.001412, -0.001411, -0.001269, + -0.001127, -0.000986, -0.000844, -0.000984, -0.000703, -0.000702, + -0.000702, -0.000701, -0.000841, -0.000700, -0.001120, -0.000979, + -0.000979, -0.000978, -0.000977, -0.000977, -0.000837, -0.000697, + -0.000557, -0.000557, -0.000556, -0.000417, -0.000278, -0.000416, + -0.000277, -0.000277, -0.000277, -0.000277, -0.000277, -0.000276, + -0.000276, -0.000276, -0.000276, -0.000276, -0.000276, -0.000138, + -0.000275, -0.000413, -0.000687, -0.000687, -0.000823, -0.001234, + -0.001508, -0.001644, -0.001916, -0.002325, -0.002324, -0.002595, + -0.002867, -0.003138, -0.003544, -0.003815, -0.004084, -0.004218, + -0.004487, -0.004620, -0.004888, -0.005020, -0.005424, -0.005691, + -0.005823, -0.006225, -0.006626, -0.006757, -0.007023, -0.007288, + -0.007418, -0.007413, -0.007542, -0.007537, -0.007532, -0.007392, + -0.007387, -0.007248, -0.007243, -0.007104, -0.006966, -0.006693, + -0.006287, -0.006016, -0.005611, -0.005473, -0.005203, -0.005066, + -0.005062, -0.004793, -0.004789, -0.005052, -0.005181, -0.005576, + -0.005705, -0.006099, -0.006227, -0.006355, -0.006615, -0.006875, + -0.007135, -0.007130, -0.007257, -0.007384, -0.007379, -0.007505, + -0.007500, -0.007495, -0.007621, -0.007747, -0.007873, -0.007867, + -0.007731, -0.007594, -0.007720, -0.007976, -0.008101, -0.008357, + -0.008612, -0.008736, -0.008860, -0.009115, -0.009368, -0.009362, + -0.009615, -0.009868, -0.009991, -0.010243, -0.010495, -0.010747, + -0.010998, -0.010861, -0.010982, -0.011104, -0.011354, -0.011475, + -0.011853, -0.012231, -0.012608, -0.013114, -0.013361, -0.013737, + -0.014112, -0.014358, -0.014604, -0.014722, -0.014967, -0.015084, + -0.015201, -0.015318, -0.015562, -0.015551, -0.015667, -0.015784, + -0.015772, -0.015634, -0.015750, -0.015484, -0.015346, -0.015209, + -0.015071, -0.014934, -0.015049, -0.014912, -0.014901, -0.015143, + -0.015258, -0.015373, -0.015488, -0.015854, -0.015968, -0.016082, + -0.016196, -0.016059, -0.016173, -0.016161, -0.016274, -0.016262, + -0.016376, -0.016114, -0.016102, -0.016090, -0.016078, -0.015942, + -0.016179, -0.016167, -0.016156, -0.016392, -0.016504, -0.016616, + -0.016728, -0.016715, -0.016703, -0.016691, -0.016555, -0.016543, + -0.016407, -0.016148, -0.016013, -0.015755, -0.015497, -0.015486, + -0.015352, -0.015340, -0.015206, -0.015195, -0.015306, -0.015294, + -0.015405, -0.015394, -0.015504, -0.015493, -0.015481, -0.015470, + -0.015458, -0.015446, -0.015313, -0.015545, -0.015654, -0.015521, + -0.015510, -0.015498, -0.015365, -0.015354, -0.015342, -0.015210, + -0.015198, -0.015187, -0.015296, -0.015284, -0.015513, -0.015381, + -0.015489, -0.015358, -0.015346, -0.015454, -0.015562, -0.015670, + -0.015777, -0.015765, -0.015753, -0.015741, -0.015610, -0.015717, + -0.015824, -0.015812, -0.015919, -0.016025, -0.016013, -0.016000, + -0.016225, -0.016212, -0.016318, -0.016305, -0.016411, -0.016398, + -0.016503, -0.016491, -0.016478, -0.016700, -0.016687, -0.016792, + -0.016779, -0.016766, -0.016635, -0.016623, -0.016493, -0.016480, + -0.016350, -0.016337, -0.016208, -0.015962, -0.015717, -0.015704, + -0.015576, -0.015448, -0.015551, -0.015423, -0.015411, -0.015399, + -0.015503, -0.015375, -0.015247, -0.015120, -0.015108, -0.014980, + -0.014853, -0.014611, -0.014485, -0.014473, -0.014232, -0.014106, + -0.013866, -0.013626, -0.013615, -0.013261, -0.013251, -0.012898, + -0.012773, -0.012421, -0.012183, -0.012060, -0.011709, -0.011473, + -0.011236, -0.011114, -0.010992, -0.010756, -0.010748, -0.010400, + -0.010504, -0.010157, -0.010036, -0.009803, -0.009682, -0.009450, + -0.009217, -0.009097, -0.008753, -0.008522, -0.008291, -0.007948, + -0.007830, -0.007488, -0.007259, -0.006918, -0.006801, -0.006573, + -0.006233, -0.006117, -0.005778, -0.005552, -0.005325, -0.005099, + -0.004763, -0.004537, -0.004312, -0.004088, -0.003974, -0.003640, + -0.003417, -0.003083, -0.002861, -0.002639, -0.002307, -0.002195, + -0.001974, -0.001644, -0.001533, -0.001203, -0.000984, -0.000874, + -0.000655, -0.000545, -0.000327, -0.000109, 0.000000, 0.000000, + 0.000217, 0.000217, 0.000325, 0.000433, 0.000541, 0.000541, + 0.000648, 0.000756, 0.000755, 0.000862, 0.000861, 0.001076, + 0.001075, 0.001074, 0.001287, 0.001286, 0.001285, 0.001391, + 0.001497, 0.001389, 0.001601, 0.001600, 0.001705, 0.001597, + 0.001915, 0.001807, 0.002018, 0.001910, 0.002120, 0.002118, + 0.002222, 0.002220, 0.002324, 0.002322, 0.002426, 0.002424, + 0.002527, 0.002630, 0.002733, 0.002730, 0.002938, 0.002935, + 0.003037, 0.003139, 0.003241, 0.003343, 0.003340, 0.003441, + 0.003542, 0.003643, 0.003640, 0.003845, 0.003841, 0.003838, + 0.003938, 0.003935, 0.004035, 0.004135, 0.004028, 0.004127, + 0.004227, 0.004223, 0.004219, 0.004215, 0.004314, 0.004413, + 0.004307, 0.004303, 0.004401, 0.004398, 0.004394, 0.004492, + 0.004386, 0.004586, 0.004480, 0.004476, 0.004472, 0.004468, + 0.004565, 0.004460, 0.004557, 0.004452, 0.004448, 0.004545, + 0.004540, 0.004637, 0.004532, 0.004629, 0.004524, 0.004620, + 0.004616, 0.004612, 0.004708, 0.004704, 0.004599, 0.004695, + 0.004791, 0.004686, 0.004682, 0.004678, 0.004773, 0.004769, + 0.004863, 0.004859, 0.004855, 0.004850, 0.004846, 0.004742, + 0.004738, 0.004734, 0.004729, 0.004823, 0.004622, 0.004716, + 0.004712, 0.004707, 0.004605, 0.004698, 0.004498, 0.004494, + 0.004490, 0.004388, 0.004482, 0.004380, 0.004473, 0.004469, + 0.004562, 0.004461, 0.004360, 0.004356, 0.004351, 0.004347, + 0.004343, 0.004339, 0.004335, 0.004331, 0.004231, 0.004227, + 0.004127, 0.004123, 0.004023, 0.004019, 0.003920, 0.003916, + 0.003817, 0.003718, 0.003714, 0.003520, 0.003517, 0.003419, + 0.003415, 0.003317, 0.003125, 0.003216, 0.003024, 0.003021, + 0.002924, 0.002921, 0.002918, 0.002727, 0.002631, 0.002628, + 0.002532, 0.002436, 0.002527, 0.002431, 0.002335, 0.002333, + 0.002237, 0.002235, 0.002140, 0.002138, 0.002043, 0.001948, + 0.001854, 0.001852, 0.001757, 0.001663, 0.001477, 0.001476, + 0.001382, 0.001197, 0.001103, 0.001102, 0.000918, 0.000825, + 0.000733, 0.000640, 0.000548, 0.000457, 0.000365, 0.000273, + 0.000273, 0.000182, 0.000091, 0.000091, 0.000000, 0.000091, + 0.000000, -0.000090, -0.000181, -0.000090, -0.000270, -0.000270, + -0.000270, -0.000359, -0.000359, -0.000448, -0.000448, -0.000447, + -0.000536, -0.000536, -0.000624, -0.000624, -0.000712, -0.000711, + -0.000711, -0.000888, -0.000887, -0.000974, -0.000973, -0.001061, + -0.001060, -0.001147, -0.001145, -0.001232, -0.001143, -0.001230, + -0.001228, -0.001227, -0.001226, -0.001312, -0.001311, -0.001309, + -0.001308, -0.001307, -0.001305, -0.001391, -0.001389, -0.001388, + -0.001386, -0.001385, -0.001470, -0.001382, -0.001381, -0.001293, + -0.001292, -0.001376, -0.001289, -0.001373, -0.001286, -0.001199, + -0.001283, -0.001282, -0.001281, -0.001279, -0.001193, -0.001277, + -0.001190, -0.001274, -0.001272, -0.001271, -0.001270, -0.001268, + -0.001182, -0.001266, -0.001264, -0.001347, -0.001346, -0.001344, + -0.001343, -0.001341, -0.001423, -0.001422, -0.001420, -0.001502, + -0.001501, -0.001582, -0.001580, -0.001579, -0.001660, -0.001741, + -0.001739, -0.001655, -0.001735, -0.001733, -0.001732, -0.001730, + -0.001728, -0.001808, -0.001806, -0.001722, -0.001720, -0.001636, + -0.001716, -0.001633, -0.001631, -0.001548, -0.001546, -0.001544, + -0.001461, -0.001460, -0.001377, -0.001456, -0.001293, -0.001372, + -0.001290, -0.001289, -0.001207, -0.001205, -0.001204, -0.001122, + -0.001121, -0.001120, -0.001039, -0.000958, -0.000957, -0.000955, + -0.000875, -0.000874, -0.000873, -0.000793, -0.000712, -0.000712, + -0.000711, -0.000631, -0.000552, -0.000472, -0.000393, -0.000393, + -0.000314, -0.000313, -0.000235, -0.000156, -0.000156, -0.000156, + -0.000078, -0.000078, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000077, 0.000077, 0.000154, 0.000154, 0.000308, 0.000231, + 0.000461, 0.000384, 0.000536, 0.000536, 0.000764, 0.000687, + 0.000839, 0.000838, 0.000913, 0.000988, 0.001062, 0.001137, + 0.001060, 0.001134, 0.001208, 0.001207, 0.001281, 0.001279, + 0.001353, 0.001351, 0.001424, 0.001423, 0.001496, 0.001494, + 0.001567, 0.001490, 0.001488, 0.001561, 0.001559, 0.001557, + 0.001555, 0.001627, 0.001699, 0.001697, 0.001695, 0.001766, + 0.001764, 0.001835, 0.001833, 0.001758, 0.001828, 0.001826, + 0.001897, 0.001895, 0.001892, 0.001962, 0.001960, 0.001958, + 0.002027, 0.002025, 0.002095, 0.002092, 0.002161, 0.002159, + 0.002156, 0.002153, 0.002222, 0.002219, 0.002216, 0.002285, + 0.002211, 0.002279, 0.002276, 0.002344, 0.002341, 0.002338, + 0.002335, 0.002403, 0.002400, 0.002467, 0.002464, 0.002461, + 0.002528, 0.002525, 0.002591, 0.002588, 0.002585, 0.002721, + 0.002717, 0.002783, 0.002779, 0.002776, 0.002841, 0.002907, + 0.002972, 0.002968, 0.003033, 0.003029, 0.003025, 0.003090, + 0.003154, 0.003150, 0.003214, 0.003210, 0.003138, 0.003133, + 0.003061, 0.003193, 0.003121, 0.003049, 0.003045, 0.003041, + 0.003037, 0.003032, 0.002961, 0.002890, 0.002886, 0.002882, + 0.002811, 0.002807, 0.002737, 0.002733, 0.002796, 0.002725, + 0.002655, 0.002652, 0.002648, 0.002578, 0.002575, 0.002571, + 0.002568, 0.002564, 0.002560, 0.002557, 0.002488, 0.002484, + 0.002546, 0.002477, 0.002539, 0.002536, 0.002532, 0.002528, + 0.002525, 0.002521, 0.002582, 0.002514, 0.002575, 0.002507, + 0.002503, 0.002500, 0.002496, 0.002493, 0.002489, 0.002422, + 0.002418, 0.002479, 0.002412, 0.002408, 0.002405, 0.002401, + 0.002398, 0.002394, 0.002391, 0.002262, 0.002196, 0.002130, + 0.002064, 0.001999, 0.001996, 0.001993, 0.001928, 0.001863, + 0.001860, 0.001795, 0.001793, 0.001852, 0.001849, 0.001785, + 0.001844, 0.001779, 0.001838, 0.001774, 0.001894, 0.002013, + 0.002314, 0.002615, 0.003097, 0.003456, 0.003511, 0.003204, + 0.002837, 0.002290, 0.001865, 0.001622, 0.001380, 0.000958, + 0.000598, 0.000358, 0.000596, 0.001250, 0.001902, 0.002552, + 0.002667, 0.002426, 0.001950, 0.001593, 0.001355, 0.001411, + 0.001527, 0.001700, 0.001814, 0.001928, 0.001925, 0.002155, + 0.002676, 0.003368, 0.003769, 0.003937, 0.003584, 0.003174, + 0.002766, 0.002704, 0.002872, 0.003154, 0.003378, 0.003487, + 0.003481, 0.003248, 0.002844, 0.002272, 0.001644, 0.001076, + 0.000678, 0.000621, 0.001014, 0.001519, 0.002078, 0.002579, + 0.002855, 0.003018, 0.003013, 0.003008, 0.002947, 0.002831, + 0.002716, 0.002601, 0.002375, 0.002261, 0.002368, 0.002803, + 0.003567, 0.004219, 0.004758, 0.004696, 0.004197, 0.003374, + 0.002716, 0.002115, 0.001787, 0.001676, 0.001727, 0.001939, + 0.002205, 0.002470, 0.002573, 0.002515, 0.002457, 0.002506, + 0.002555, 0.002657, 0.002546, 0.002436, 0.002273, 0.002428, + 0.002687, 0.003050, 0.003465, 0.003721, 0.003872, 0.003813, + 0.003545, 0.003071, 0.002650, 0.002438, 0.002433, 0.002687, + 0.003044, 0.003296, 0.003444, 0.003438, 0.003227, 0.002966, + 0.002654, 0.002242, 0.001933, 0.001675, 0.001520, 0.001518, + 0.001464, 0.001663, 0.001761, 0.002109, 0.002406, 0.002652, + 0.002647, 0.002443, 0.002090, 0.001788, 0.001537, 0.001336, + 0.001433, 0.001430, 0.001673, 0.001916, 0.002108, 0.002251, + 0.002198, 0.001999, 0.001849, 0.001652, 0.001552, 0.001403, + 0.001401, 0.001350, 0.001395, 0.001489, 0.001630, 0.001722, + 0.001671, 0.001668, 0.001475, 0.001377, 0.001185, 0.001088, + 0.000897, 0.000801, 0.000752, 0.000892, 0.001031, 0.001169, + 0.001166, 0.001071, 0.000930, 0.000789, 0.000694, 0.000508, + 0.000415, 0.000368, 0.000413, 0.000596, 0.000823, 0.000959, + 0.001094, 0.001182, 0.001225, 0.001223, 0.001130, 0.001037, + 0.000810, 0.000719, 0.000628, 0.000626, 0.000714, 0.000847, + 0.001023, 0.001198, 0.001329, 0.001326, 0.001103, 0.000792, + 0.000439, 0.000131, -0.000087, -0.000175, -0.000305, -0.000391, + -0.000390, -0.000216, 0.000000, 0.000388, 0.000688, 0.000815, + 0.000771, 0.000598, 0.000341, 0.000255, 0.000297, 0.000381, + 0.000550, 0.000591, 0.000547, 0.000420, 0.000419, 0.000502, + 0.000709, 0.000791, 0.000748, 0.000497, 0.000207, -0.000083, + -0.000165, -0.000123, 0.000000, 0.000082, 0.000163, 0.000122, + 0.000000, -0.000081, -0.000243, -0.000363, -0.000443, -0.000402, + -0.000361, -0.000280, -0.000120, 0.000000, 0.000159, 0.000238, + 0.000316, 0.000316, 0.000275, 0.000275, 0.000157, 0.000039, + -0.000117, -0.000233, -0.000349, -0.000271, -0.000154, 0.000000, + 0.000192, 0.000230, 0.000153, 0.000000, -0.000190, -0.000418, + -0.000531, -0.000567, -0.000528, -0.000451, -0.000413, -0.000299, + -0.000299, -0.000261, -0.000149, -0.000111, 0.000000, 0.000000, + -0.000037, -0.000147, -0.000256, -0.000402, -0.000364, -0.000291, + -0.000218, -0.000108, -0.000036, -0.000072, -0.000144, -0.000251, + -0.000393, -0.000499, -0.000497, -0.000461, -0.000424, -0.000317, + -0.000281, -0.000245, -0.000210, -0.000174, -0.000209, -0.000243, + -0.000311, -0.000345, -0.000482, -0.000515, -0.000582, -0.000615, + -0.000545, -0.000476, -0.000407, -0.000304, -0.000270, -0.000302, + -0.000369, -0.000468, -0.000567, -0.000665, -0.000630, -0.000661, + -0.000593, -0.000625, -0.000557, -0.000490, -0.000456, -0.000455, + -0.000421, -0.000420, -0.000483, -0.000514, -0.000577, -0.000607, + -0.000637, -0.000540, -0.000539, -0.000505, -0.000473, -0.000471, + -0.000438, -0.000500, -0.000560, -0.000559, -0.000619, -0.000648, + -0.000646, -0.000614, -0.000551, -0.000518, -0.000456, -0.000455, + -0.000393, -0.000331, -0.000300, -0.000270, -0.000299, -0.000298, + -0.000267, -0.000266, -0.000206, -0.000118, -0.000029, 0.000058, + 0.000117, 0.000174, 0.000174, 0.000173, 0.000115, 0.000029, + -0.000029, -0.000028, -0.000028, 0.000000, 0.000000, +}; + +#endif /* _MONEY_H_ */ From 50da20f22e632bd9c7e65be1e277d3e878e277fc Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 27 Feb 2008 17:53:39 +0000 Subject: [PATCH 87/87] rendering from commandline is now done without creating main-window and all the other UI-stuff git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@727 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 76 ++++++++++++++++++ include/export_project_dialog.h | 12 +-- src/core/automation_pattern.cpp | 5 +- src/core/engine.cpp | 42 +++++----- src/core/export_project_dialog.cpp | 48 ++++++----- src/core/main.cpp | 124 ++++++++++++++++------------- src/core/song.cpp | 81 ++++++++++++------- 7 files changed, 253 insertions(+), 135 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7636dba3b..0c77143eb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,81 @@ 2008-02-27 Tobias Doerffel + * plugins/ladspa_effect/caps/Compress.cc: + * plugins/ladspa_effect/caps/ToneStack.cc: + * plugins/ladspa_effect/caps/Compress.h: + * plugins/ladspa_effect/caps/ToneStack.h: + * plugins/ladspa_effect/caps/Roessler.h: + * plugins/ladspa_effect/caps/HRTF.cc: + * plugins/ladspa_effect/caps/HRTF.h: + * plugins/ladspa_effect/caps/basics.h: + * plugins/ladspa_effect/caps/Lorenz.cc: + * plugins/ladspa_effect/caps/Lorenz.h: + * plugins/ladspa_effect/caps/Amp.cc: + * plugins/ladspa_effect/caps/Amp.h: + * plugins/ladspa_effect/caps/Pan.h: + * plugins/ladspa_effect/caps/Phaser.cc: + * plugins/ladspa_effect/caps/White.h: + * plugins/ladspa_effect/caps/Preamp.cc: + * plugins/ladspa_effect/caps/Click.cc: + * plugins/ladspa_effect/caps/VCO.cc: + * plugins/ladspa_effect/caps/Clip.cc: + * plugins/ladspa_effect/caps/Click.h: + * plugins/ladspa_effect/caps/VCO.h: + * plugins/ladspa_effect/caps/ToneControls.cc: + * plugins/ladspa_effect/caps/Sin.cc: + * plugins/ladspa_effect/caps/Clip.h: + * plugins/ladspa_effect/caps/Sin.h: + * plugins/ladspa_effect/caps/Scape.cc: + * plugins/ladspa_effect/caps/Scape.h: + * plugins/ladspa_effect/caps/Roessler.cc: + * plugins/ladspa_effect/caps/interface.cc: + * plugins/ladspa_effect/caps/waves/click.h: + * plugins/ladspa_effect/caps/waves/money.h: + * plugins/ladspa_effect/caps/dsp/ToneStack.h: + * plugins/ladspa_effect/caps/dsp/LatFilt.h: + * plugins/ladspa_effect/caps/dsp/TDFII.h: + * plugins/ladspa_effect/caps/dsp/RMS.h: + * plugins/ladspa_effect/caps/dsp/OnePole.h: + * plugins/ladspa_effect/caps/dsp/tonestack/tables.h: + * plugins/ladspa_effect/caps/dsp/tonestack/vs_tab.h: + * plugins/ladspa_effect/caps/dsp/tonestack/ks_tab.h: + * plugins/ladspa_effect/caps/dsp/Eq.h: + * plugins/ladspa_effect/caps/dsp/BiQuad.h: + * plugins/ladspa_effect/caps/dsp/util.h: + * plugins/ladspa_effect/caps/dsp/FPTruncateMode.h: + * plugins/ladspa_effect/caps/dsp/TwelveAX7.h: + * plugins/ladspa_effect/caps/Chorus.cc: + * plugins/ladspa_effect/caps/Cabinet.cc: + * plugins/ladspa_effect/caps/Chorus.h: + * plugins/ladspa_effect/caps/Eq.cc: + * plugins/ladspa_effect/caps/Cabinet.h: + * plugins/ladspa_effect/caps/Eq.h: + * plugins/ladspa_effect/caps/README: + * plugins/ladspa_effect/caps/Pan.cc: + * plugins/ladspa_effect/caps/SweepVF.cc: + * plugins/ladspa_effect/caps/Descriptor.h: + * plugins/ladspa_effect/caps/White.cc: + * plugins/ladspa_effect/caps/SweepVF.h: + * plugins/ladspa_effect/caps/Phaser.h: + * plugins/ladspa_effect/caps/Reverb.cc: + * plugins/ladspa_effect/caps/Makefile.am: + * plugins/ladspa_effect/caps/Reverb.h: + integrated new version of CAPS and fixed miscompilation with GCC 4.3 + + * include/audio_port.h: + * src/audio/audio_port.cpp: + * src/core/mixer.cpp: + lock audioPort-buffers before writing them + + * include/export_project_dialog.h: + * src/core/song.cpp: + * src/core/main.cpp: + * src/core/export_project_dialog.cpp: + * src/core/engine.cpp: + * src/core/automation_pattern.cpp: + rendering from commandline is now done without creating main-window + and all the other UI-stuff + * include/mixer.h: * src/core/mixer.cpp: distribute whole job-queue instead of single jobs and re-assign diff --git a/include/export_project_dialog.h b/include/export_project_dialog.h index ffc0b30f7..cfef9c42a 100644 --- a/include/export_project_dialog.h +++ b/include/export_project_dialog.h @@ -31,14 +31,13 @@ #include "export.h" #include "automatable_model.h" +#include "combobox.h" class QLabel; class QPushButton; class QProgressBar; -class comboBox; -class comboBoxModel; class ledCheckBox; class pixmapButton; @@ -73,16 +72,17 @@ private: static Sint16 s_availableBitrates[]; + comboBoxModel m_typeModel; + comboBoxModel m_kbpsModel; + boolModel m_vbrEnabledModel; + boolModel m_hqmEnabledModel; + QLabel * m_typeLbl; comboBox * m_typeCombo; - comboBoxModel * m_typeModel; QLabel * m_kbpsLbl; comboBox * m_kbpsCombo; - comboBoxModel * m_kbpsModel; ledCheckBox * m_vbrCb; - boolModel * m_vbrEnabledModel; ledCheckBox * m_hqmCb; - boolModel * m_hqmEnabledModel; QLabel * m_hourglassLbl; QPushButton * m_exportBtn; QPushButton * m_cancelBtn; diff --git a/src/core/automation_pattern.cpp b/src/core/automation_pattern.cpp index ead23b6a7..37ffcd5c4 100644 --- a/src/core/automation_pattern.cpp +++ b/src/core/automation_pattern.cpp @@ -139,7 +139,7 @@ midiTime automationPattern::length( void ) const midiTime automationPattern::putValue( const midiTime & _time, const int _value, const bool _quant_pos ) { - midiTime new_time = _quant_pos ? + midiTime new_time = _quant_pos && engine::getAutomationEditor() ? note::quantized( _time, engine::getAutomationEditor()->quantization() ) : _time; @@ -185,7 +185,8 @@ void automationPattern::removeValue( const midiTime & _time ) void automationPattern::clear( void ) { m_time_map.clear(); - if( engine::getAutomationEditor()->currentPattern() == this ) + if( engine::getAutomationEditor() && + engine::getAutomationEditor()->currentPattern() == this ) { engine::getAutomationEditor()->update(); } diff --git a/src/core/engine.cpp b/src/core/engine.cpp index fbfd03d3c..62879a351 100644 --- a/src/core/engine.cpp +++ b/src/core/engine.cpp @@ -43,17 +43,17 @@ bool engine::s_hasGUI = TRUE; float engine::s_framesPerTact64th; -mixer * engine::s_mixer; -mainWindow * engine::s_mainWindow; -bbTrackContainer * engine::s_bbTrackContainer; -song * engine::s_song; -songEditor * engine::s_songEditor; -automationEditor * engine::s_automationEditor; -bbEditor * engine::s_bbEditor; -pianoRoll * engine::s_pianoRoll; -projectNotes * engine::s_projectNotes; -projectJournal * engine::s_projectJournal; -ladspa2LMMS * engine::s_ladspaManager; +mixer * engine::s_mixer = NULL; +mainWindow * engine::s_mainWindow = NULL; +bbTrackContainer * engine::s_bbTrackContainer = NULL; +song * engine::s_song = NULL; +songEditor * engine::s_songEditor = NULL; +automationEditor * engine::s_automationEditor = NULL; +bbEditor * engine::s_bbEditor = NULL; +pianoRoll * engine::s_pianoRoll = NULL; +projectNotes * engine::s_projectNotes = NULL; +projectJournal * engine::s_projectJournal = NULL; +ladspa2LMMS * engine::s_ladspaManager = NULL; QMap engine::s_sampleExtensions; @@ -70,19 +70,25 @@ void engine::init( const bool _has_gui ) s_song = new song; s_bbTrackContainer = new bbTrackContainer; - s_mainWindow = new mainWindow; - s_songEditor = new songEditor( s_song ); - s_projectNotes = new projectNotes; - s_bbEditor = new bbEditor( s_bbTrackContainer ); - s_pianoRoll = new pianoRoll; - s_automationEditor = new automationEditor; + if( s_hasGUI ) + { + s_mainWindow = new mainWindow; + s_songEditor = new songEditor( s_song ); + s_projectNotes = new projectNotes; + s_bbEditor = new bbEditor( s_bbTrackContainer ); + s_pianoRoll = new pianoRoll; + s_automationEditor = new automationEditor; + } s_ladspaManager = new ladspa2LMMS; s_projectJournal->setJournalling( TRUE ); s_mixer->initDevices(); - s_mainWindow->finalize(); + if( s_hasGUI ) + { + s_mainWindow->finalize(); + } presetPreviewPlayHandle::init(); diff --git a/src/core/export_project_dialog.cpp b/src/core/export_project_dialog.cpp index ffe518cae..0946b24d8 100644 --- a/src/core/export_project_dialog.cpp +++ b/src/core/export_project_dialog.cpp @@ -117,10 +117,10 @@ Sint16 exportProjectDialog::s_availableBitrates[] = exportProjectDialog::exportProjectDialog( const QString & _file_name, QWidget * _parent ) : QDialog( _parent ), - m_typeModel( new comboBoxModel( /* this */ ) ), - m_kbpsModel( new comboBoxModel( /* this */ ) ), - m_vbrEnabledModel( new boolModel( /* this */ ) ), - m_hqmEnabledModel( new boolModel( /* this */ ) ), + m_typeModel( NULL /* this */ ), + m_kbpsModel( NULL /* this */ ), + m_vbrEnabledModel( TRUE, NULL /* this */ ), + m_hqmEnabledModel( FALSE, NULL/* this */ ), m_fileName( _file_name ), m_deleteFile( FALSE ) { @@ -138,18 +138,18 @@ exportProjectDialog::exportProjectDialog( const QString & _file_name, Uint8 idx = 0; while( fileEncodeDevices[idx].m_fileType != NullFile ) { - m_typeModel->addItem( + m_typeModel.addItem( tr( fileEncodeDevices[idx].m_description ) ); ++idx; } - m_typeModel->setValue( m_typeModel->findText( tr( + m_typeModel.setValue( m_typeModel.findText( tr( fileEncodeDevices[m_fileType].m_description ) ) ); m_typeCombo = new comboBox( this ); m_typeCombo->setGeometry( LABEL_X + LABEL_WIDTH+LABEL_MARGIN, TYPE_STUFF_Y, TYPE_COMBO_WIDTH, TYPE_HEIGHT ); - m_typeCombo->setModel( m_typeModel ); + m_typeCombo->setModel( &m_typeModel ); /* connect( m_typeCombo, SIGNAL( activated( const QString & ) ), this, SLOT( changedType( const QString & ) ) );*/ @@ -162,33 +162,31 @@ exportProjectDialog::exportProjectDialog( const QString & _file_name, idx = 0; while( s_availableBitrates[idx] != -1 ) { - m_kbpsModel->addItem( QString::number( + m_kbpsModel.addItem( QString::number( s_availableBitrates[idx] ) ); ++idx; } - m_kbpsModel->setValue( m_kbpsModel->findText( + m_kbpsModel.setValue( m_kbpsModel.findText( QString::number( 128 ) ) ); m_kbpsCombo = new comboBox( this ); - m_kbpsCombo->setModel( m_kbpsModel ); + m_kbpsCombo->setModel( &m_kbpsModel ); m_kbpsCombo->setGeometry( LABEL_X + LABEL_WIDTH + LABEL_MARGIN, KBPS_STUFF_Y, KBPS_COMBO_WIDTH, KBPS_HEIGHT ); m_vbrCb = new ledCheckBox( tr( "variable bitrate" ), this ); - m_vbrCb->setModel( m_vbrEnabledModel ); + m_vbrCb->setModel( &m_vbrEnabledModel ); m_vbrCb->setGeometry( LABEL_X + LABEL_WIDTH + 3 * LABEL_MARGIN + KBPS_COMBO_WIDTH, KBPS_STUFF_Y + 3, 190, 20 ); - m_vbrCb->setChecked( TRUE ); m_hqmCb = new ledCheckBox( tr( "use high-quality-mode (recommened)" ), this ); - m_hqmCb->setModel( m_hqmEnabledModel ); + m_hqmCb->setModel( &m_hqmEnabledModel ); m_hqmCb->setGeometry( LABEL_X, HQ_MODE_CB_Y + 3, HQ_MODE_CB_WIDTH, HQ_MODE_CB_HEIGHT ); - m_hqmCb->setChecked( TRUE ); m_exportBtn = new QPushButton( embed::getIconPixmap( "apply" ), @@ -315,9 +313,9 @@ void exportProjectDialog::exportBtnClicked( void ) success_ful, m_fileName, m_vbrCb->model()->value(), - m_kbpsModel->currentText().toInt(), - m_kbpsModel->currentText().toInt() - 64, - m_kbpsModel->currentText().toInt() + 64, + m_kbpsModel.currentText().toInt(), + m_kbpsModel.currentText().toInt() - 64, + m_kbpsModel.currentText().toInt() + 64, engine::getMixer() ); if( success_ful == FALSE ) { @@ -375,11 +373,14 @@ void exportProjectDialog::exportBtnClicked( void ) int pval = pp * 100 / ( ( engine::getSong()->lengthInTacts() + 1 ) * 64 ); m_exportProgressBar->setValue( pval ); - // update lmms-main-win-caption - engine::getMainWindow()->setWindowTitle( tr( "Rendering:" ) + if( engine::getMainWindow() ) + { + // update lmms-main-win-caption + engine::getMainWindow()->setWindowTitle( tr( "Rendering:" ) + " " + QString::number( pval ) + "%" ); + } // process paint-events etc. - qApp->processEvents(); + QCoreApplication::processEvents(); } finishProjectExport(); @@ -422,8 +423,11 @@ void exportProjectDialog::finishProjectExport( void ) QFile( m_fileName ).remove(); } - // restore window-title - engine::getMainWindow()->resetWindowTitle(); + if( engine::getMainWindow() ) + { + // restore window-title + engine::getMainWindow()->resetWindowTitle(); + } engine::getSong()->stopExport(); diff --git a/src/core/main.cpp b/src/core/main.cpp index 449b8c665..bf5fadc2c 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -93,7 +94,7 @@ int main( int argc, char * * argv ) QString( argv[i] ) == "-v" ) { printf( "\nLinux MultiMedia Studio %s\n\n" - "Copyright (c) 2004-2007 Tobias Doerffel and others.\n\n" + "Copyright (c) 2004-2008 LMMS developers.\n\n" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public\n" "License as published by the Free Software Foundation; either\n" @@ -106,7 +107,7 @@ int main( int argc, char * * argv ) QString( argv[i] ) == "-h" ) ) { printf( "\nLinux MultiMedia Studio %s\n" - "Copyright (c) 2004-2007 Tobias Doerffel and others.\n\n" + "Copyright (c) 2004-2008 LMMS developers.\n\n" "usage: lmms [ -r [ -o ] [ -h ] " "[ ]\n" "-r, --render render given file.\n" @@ -149,9 +150,11 @@ int main( int argc, char * * argv ) } } + bool gui_startup = TRUE; if( file_to_render != "" ) { file_to_render += extension; + gui_startup = FALSE; } @@ -170,68 +173,75 @@ int main( int argc, char * * argv ) return( EXIT_FAILURE ); } - // set palette - QPalette pal = app.palette(); - pal.setColor( QPalette::Background, QColor( 128, 128, 128 ) ); - pal.setColor( QPalette::Foreground, QColor( 240, 240, 240 ) ); - pal.setColor( QPalette::Base, QColor( 128, 128, 128 ) ); - pal.setColor( QPalette::Text, QColor( 224, 224, 224 ) ); - pal.setColor( QPalette::Button, QColor( 160, 160, 160 ) ); - pal.setColor( QPalette::ButtonText, QColor( 255, 255, 255 ) ); - pal.setColor( QPalette::Highlight, QColor( 224, 224, 224 ) ); - pal.setColor( QPalette::HighlightedText, QColor( 0, 0, 0 ) ); - app.setPalette( pal ); - - - // init splash screen - QPixmap splash = embed::getIconPixmap( "splash" ); - mainWindow::s_splashScreen = new QSplashScreen( splash ); - mainWindow::s_splashScreen->show(); - - mainWindow::s_splashScreen->showMessage( mainWindow::tr( - "Setting up main-" - "window and " - "workspace..." ), - splash_alignment_flags, - Qt::white ); - - engine::init(); - - // we try to load given file - if( file_to_load != "" ) + if( gui_startup ) { + // set palette + QPalette pal = app.palette(); + pal.setColor( QPalette::Background, QColor( 128, 128, 128 ) ); + pal.setColor( QPalette::Foreground, QColor( 240, 240, 240 ) ); + pal.setColor( QPalette::Base, QColor( 128, 128, 128 ) ); + pal.setColor( QPalette::Text, QColor( 224, 224, 224 ) ); + pal.setColor( QPalette::Button, QColor( 160, 160, 160 ) ); + pal.setColor( QPalette::ButtonText, QColor( 255, 255, 255 ) ); + pal.setColor( QPalette::Highlight, QColor( 224, 224, 224 ) ); + pal.setColor( QPalette::HighlightedText, QColor( 0, 0, 0 ) ); + app.setPalette( pal ); + + + // init splash screen + QPixmap splash = embed::getIconPixmap( "splash" ); + mainWindow::s_splashScreen = new QSplashScreen( splash ); + mainWindow::s_splashScreen->show(); + + mainWindow::s_splashScreen->showMessage( mainWindow::tr( + "Setting up main-" + "window and " + "workspace..." ), + splash_alignment_flags, + Qt::white ); + + engine::init(); + + // we try to load given file + if( file_to_load != "" ) + { + engine::getSong()->loadProject( file_to_load ); + } + else + { + engine::getSong()->createNewProject(); + } + + // MDI-mode? + if( engine::getMainWindow()->workspace() != NULL ) + { + // then maximize + engine::getMainWindow()->showMaximized(); + } + else + { + // otherwise arrange at top-left edge of screen + engine::getMainWindow()->show(); + engine::getMainWindow()->move( 0, 0 ); + engine::getMainWindow()->resize( 200, 500 ); + } + + + delete mainWindow::s_splashScreen; + mainWindow::s_splashScreen = NULL; + } + else + { + engine::init( FALSE ); engine::getSong()->loadProject( file_to_load ); - } - else - { - engine::getSong()->createNewProject(); - } - - // MDI-mode? - if( engine::getMainWindow()->workspace() != NULL ) - { - // then maximize - engine::getMainWindow()->showMaximized(); - } - else - { - // otherwise arrange at top-left edge of screen - engine::getMainWindow()->show(); - engine::getMainWindow()->move( 0, 0 ); - engine::getMainWindow()->resize( 200, 500 ); - } - - - delete mainWindow::s_splashScreen; - mainWindow::s_splashScreen = NULL; - - if( file_to_render != "" ) - { exportProjectDialog * e = new exportProjectDialog( file_to_render, engine::getMainWindow() ); e->show(); + QTime t; + t.start(); e->exportBtnClicked(); + printf("export took %d ms\n",t.elapsed()); } return( app.exec() ); diff --git a/src/core/song.cpp b/src/core/song.cpp index 50ee94962..508d47de6 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -691,14 +691,20 @@ void song::clearProject( void ) engine::getBBTrackContainer()->clearAllTracks(); clearAllTracks(); - engine::getAutomationEditor()->setCurrentPattern( NULL ); + if( engine::getAutomationEditor() ) + { + engine::getAutomationEditor()->setCurrentPattern( NULL ); + } m_tempoModel.getAutomationPattern()->clear(); m_masterVolumeModel.getAutomationPattern()->clear(); m_masterPitchModel.getAutomationPattern()->clear(); engine::getMixer()->unlock(); - engine::getProjectNotes()->clear(); + if( engine::getProjectNotes() ) + { + engine::getProjectNotes()->clear(); + } engine::getProjectJournal()->clearInvalidJournallingObjects(); engine::getProjectJournal()->clearJournal(); @@ -737,7 +743,10 @@ void song::createNewProject( void ) m_fileName = m_oldFileName = ""; - engine::getMainWindow()->resetWindowTitle(); + if( engine::getMainWindow() ) + { + engine::getMainWindow()->resetWindowTitle(); + } track * t; t = track::create( track::InstrumentTrack, this ); @@ -795,15 +804,21 @@ void FASTCALL song::loadProject( const QString & _file_name ) return; } - engine::getMainWindow()->resetWindowTitle(); + if( engine::getMainWindow() ) + { + engine::getMainWindow()->resetWindowTitle(); + } // get the header information from the DOM m_tempoModel.loadSettings( mmp.head(), "bpm" ); m_masterVolumeModel.loadSettings( mmp.head(), "mastervol" ); m_masterPitchModel.loadSettings( mmp.head(), "masterpitch" ); - // reset loop-point-state - m_playPos[Mode_PlaySong].m_timeLine->toggleLoopPoints( 0 ); + if( m_playPos[Mode_PlaySong].m_timeLine ) + { + // reset loop-point-state + m_playPos[Mode_PlaySong].m_timeLine->toggleLoopPoints( 0 ); + } QDomNode node = mmp.content().firstChild(); while( !node.isNull() ) @@ -815,30 +830,33 @@ void FASTCALL song::loadProject( const QString & _file_name ) ( (journallingObject *)( this ) )-> restoreState( node.toElement() ); } - else if( node.nodeName() == - engine::getPianoRoll()->nodeName() ) + else if( engine::hasGUI() ) { - engine::getPianoRoll()->restoreState( - node.toElement() ); - } - else if( node.nodeName() == - engine::getAutomationEditor()->nodeName() ) - { - engine::getAutomationEditor()->restoreState( - node.toElement() ); - } - else if( node.nodeName() == - engine::getProjectNotes()->nodeName() ) - { - ( (journallingObject *)( engine:: - getProjectNotes() ) )-> - restoreState( node.toElement() ); - } - else if( node.nodeName() == - m_playPos[Mode_PlaySong].m_timeLine->nodeName() ) - { - m_playPos[Mode_PlaySong].m_timeLine->restoreState( - node.toElement() ); + if( node.nodeName() == + engine::getPianoRoll()->nodeName() ) + { + engine::getPianoRoll()->restoreState( + node.toElement() ); + } + else if( node.nodeName() == + engine::getAutomationEditor()->nodeName() ) + { + engine::getAutomationEditor()->restoreState( + node.toElement() ); + } + else if( node.nodeName() == + engine::getProjectNotes()->nodeName() ) + { + ( (journallingObject *)( engine:: + getProjectNotes() ) )-> + restoreState( node.toElement() ); + } + else if( node.nodeName() == + m_playPos[Mode_PlaySong].m_timeLine->nodeName() ) + { + m_playPos[Mode_PlaySong].m_timeLine->restoreState( + node.toElement() ); + } } } node = node.nextSibling(); @@ -1008,7 +1026,10 @@ void song::setModified( void ) if( !m_loadingProject ) { m_modified = TRUE; - engine::getMainWindow()->resetWindowTitle(); + if( engine::getMainWindow() ) + { + engine::getMainWindow()->resetWindowTitle(); + } } }

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 + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "engine.h" +#include "note_play_handle.h" + +#include "bandedwg_instrument.h" +#include "bandedwg_instrument_view.h" +#include "bandedwg_processor.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embedded_resources.h" + + +extern "C" +{ + +plugin::descriptor bandedwg_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "Banded Wave Guide", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Bowed or struck objects" ), + "Danny McRae ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + +} + + +bandedWGInstrument::bandedWGInstrument( instrumentTrack * _channel_track ): + stkInstrument( _channel_track, &bandedwg_plugin_descriptor ) +{ + model()->bowPressure()->setTrack( _channel_track ); + model()->bowPosition()->setTrack( _channel_track ); + model()->vibratoFrequency()->setTrack( _channel_track ); + model()->vibratoGain()->setTrack( _channel_track ); + model()->bowVelocity()->setTrack( _channel_track ); + model()->setStrike()->setTrack( _channel_track ); + model()->sound()->setTrack( _channel_track ); +} + + + + +bandedWGInstrument::~bandedWGInstrument() +{ +} + + + + +QString bandedWGInstrument::nodeName( void ) const +{ + return( bandedwg_plugin_descriptor.name ); +} + + + + +pluginView * bandedWGInstrument::instantiateView( QWidget * _parent ) +{ + return( new bandedWGInstrumentView( this, _parent ) ); +} + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * lmms_plugin_main( model * _model, void * _data ) +{ + return( new bandedWGInstrument( static_cast( _data ) ) ); +} + + +} + + diff --git a/plugins/stk/voices/bandedwg/bandedwg_instrument.h b/plugins/stk/voices/bandedwg/bandedwg_instrument.h new file mode 100644 index 000000000..4befeca2f --- /dev/null +++ b/plugins/stk/voices/bandedwg/bandedwg_instrument.h @@ -0,0 +1,46 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BANDEDWG_INSTRUMENT_H +#define _BANDEDWG_INSTRUMENT_H + +#include "stk_instrument.h" + +#include "bandedwg_processor.h" +#include "bandedwg_model.h" + + +class bandedWGInstrument : public stkInstrument +{ +public: + bandedWGInstrument( instrumentTrack * _channel_track ); + virtual ~bandedWGInstrument( void ); + + QString nodeName( void ) const; + + pluginView * instantiateView( QWidget * _parent ); +}; + +#endif diff --git a/plugins/stk/voices/bandedwg/bandedwg_instrument_view.cpp b/plugins/stk/voices/bandedwg/bandedwg_instrument_view.cpp new file mode 100644 index 000000000..fb231b404 --- /dev/null +++ b/plugins/stk/voices/bandedwg/bandedwg_instrument_view.cpp @@ -0,0 +1,121 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include +#include +#include + +#include "bandedwg_instrument_view.h" + +#include +#include + +#include "engine.h" +#include "gui_templates.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + + +bandedWGInstrumentView::bandedWGInstrumentView( bandedWGInstrument * _instrument, QWidget * _parent ) : + stkInstrumentView( _instrument, _parent ) +{ + QVBoxLayout * vl = new QVBoxLayout( m_topView ); + QHBoxLayout * h1 = new QHBoxLayout; + QHBoxLayout * h2 = new QHBoxLayout; + QHBoxLayout * h3 = new QHBoxLayout; + + m_bowPressure = new knob( knobSmall_17, m_topView, tr( "Pressure" ) ); + m_bowPressure->setLabel( tr( "Bow Pressure" ) ); + m_bowPressure->setHintText( tr( "Pressure:" ) + " ", "" ); + + m_bowPosition = new knob( knobSmall_17, m_topView, tr( "Position" ) ); + m_bowPosition->setLabel( tr( "Bow Position" ) ); + m_bowPosition->setHintText( tr( "Position:" ) + " ", "" ); + + m_vibratoFrequency = new knob( knobSmall_17, m_topView, tr( "Vib Freq" ) ); + m_vibratoFrequency->setLabel( tr( "Vibrato Frequency" ) ); + m_vibratoFrequency->setHintText( tr( "Vib Freq:" ) + " ", "" ); + + m_vibratoGain = new knob( knobSmall_17, m_topView, tr( "Vib Gain" ) ); + m_vibratoGain->setLabel( tr( "Vibrato Gain" ) ); + m_vibratoGain->setHintText( tr( "Vib Gain:" ) + " ", "" ); + + m_bowVelocity = new knob( knobSmall_17, m_topView, tr( "Bow Vel" ) ); + m_bowVelocity->setLabel( tr( "Bow Velocity" ) ); + m_bowVelocity->setHintText( tr( "Velocity" ) + " ", "" ); + + m_setStrike = new knob( knobSmall_17, m_topView, tr( "Strike" ) ); + m_setStrike->setLabel( tr( "Set Strike" ) ); + m_setStrike->setHintText( tr( "Strike" ) + " ", "" ); + + m_sound = new knob( knobSmall_17, m_topView, tr( "Instrument" ) ); + m_sound->setLabel( tr( "Instrument" ) ); + m_sound->setHintText( tr( "Instrument" ) + " ", "" ); + + h1->addWidget( m_bowPressure ); + h1->addWidget( m_bowPosition ); + + h2->addWidget( m_vibratoFrequency ); + h2->addWidget( m_vibratoGain ); + + h3->addWidget( m_bowVelocity ); + h3->addWidget( m_setStrike ); + h3->addWidget( m_sound ); + + vl->addLayout( h1 ); + vl->addLayout( h2 ); + vl->addLayout( h3 ); + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); +} + + + + +bandedWGInstrumentView::~bandedWGInstrumentView() +{ +} + + + + +void bandedWGInstrumentView::modelChanged( void ) +{ + stkInstrumentView::modelChanged(); + + bandedWGInstrument * inst = castModel(); + m_bowPressure->setModel( inst->model()->bowPressure() ); + m_bowPosition->setModel( inst->model()->bowPosition() ); + m_vibratoFrequency->setModel( inst->model()->vibratoFrequency() ); + m_vibratoGain->setModel( inst->model()->vibratoGain() ); + m_bowVelocity->setModel( inst->model()->bowVelocity() ); + m_setStrike->setModel( inst->model()->setStrike() ); + m_sound->setModel( inst->model()->sound() ); +} + + + diff --git a/plugins/stk/voices/bandedwg/bandedwg_instrument_view.h b/plugins/stk/voices/bandedwg/bandedwg_instrument_view.h new file mode 100644 index 000000000..f99b86c77 --- /dev/null +++ b/plugins/stk/voices/bandedwg/bandedwg_instrument_view.h @@ -0,0 +1,53 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BANDEDWG_INSTRUMENT_VIEW_H +#define _BANDEDWG_INSTRUMENT_VIEW_H + +#include "knob.h" + +#include "stk_instrument_view.h" +#include "bandedwg_instrument.h" + + +class bandedWGInstrumentView: public stkInstrumentView +{ +public: + bandedWGInstrumentView( bandedWGInstrument * _instrument, QWidget * _parent ); + virtual ~bandedWGInstrumentView( void ); + +private: + virtual void modelChanged( void ); + + knob * m_bowPressure; + knob * m_bowPosition; + knob * m_vibratoFrequency; + knob * m_vibratoGain; + knob * m_bowVelocity; + knob * m_setStrike; + knob * m_sound; +}; + +#endif diff --git a/plugins/stk/voices/bandedwg/bandedwg_model.cpp b/plugins/stk/voices/bandedwg/bandedwg_model.cpp new file mode 100644 index 000000000..1d8de189e --- /dev/null +++ b/plugins/stk/voices/bandedwg/bandedwg_model.cpp @@ -0,0 +1,98 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + + +#include "bandedwg_model.h" + + +bandedWGModel::bandedWGModel( bool _monophonic, + StkFloat _portamento, + StkFloat _bend, + StkFloat _bend_range, + bool _velocity_sensitive_lpf, + StkFloat _velocity_sensitive_q, + StkFloat _volume, + StkFloat _pan, + StkFloat _spread, + StkFloat _bow_pressure, + StkFloat _bow_position, + StkFloat _vibrato_frequency, + StkFloat _vibrato_gain, + StkFloat _bow_velocity, + StkFloat _set_strike, + StkFloat _sound ): + stkModel( _monophonic, _portamento, _bend, _bend_range, _velocity_sensitive_lpf, _velocity_sensitive_q, _volume, _pan, _spread ), + m_bowPressure( new floatModel( _bow_pressure, 0.0f, 128.0f, 0.1f, this ) ), + m_bowPosition( new floatModel( _bow_position, 0.0f, 128.0f, 0.1f, this ) ), + m_vibratoFrequency( new floatModel( _vibrato_frequency, 0.0f, 128.0f, 0.1f, this ) ), + m_vibratoGain( new floatModel( _vibrato_gain, 0.0f, 128.0f, 0.1f, this ) ), + m_bowVelocity( new floatModel( _bow_velocity, 0.0f, 128.0f, 0.1f, this ) ), + m_setStrike( new floatModel( _set_strike, 0.0f, 128.0f, 0.1f, this ) ), + m_sound( new floatModel( _sound, 0.0f, 3.0f, 1.0f, this ) ) +{ +} + + + + +bandedWGModel::~bandedWGModel() +{ + delete m_bowPressure; + delete m_bowPosition; + delete m_vibratoFrequency; + delete m_vibratoGain; + delete m_bowVelocity; + delete m_setStrike; + delete m_sound; +} + + + + +void FASTCALL bandedWGModel::saveSettings( QDomDocument & _doc, QDomElement & _parent ) +{ + stkModel::saveSettings( _doc, _parent ); + m_bowPressure->saveSettings( _doc, _parent, "bowpressure" ); + m_bowPosition->saveSettings( _doc, _parent, "bowgain" ); + m_vibratoFrequency->saveSettings( _doc, _parent, "vibratofrequency" ); + m_vibratoGain->saveSettings( _doc, _parent, "vibratogain" ); + m_bowVelocity->saveSettings( _doc, _parent, "bowvelocity" ); + m_setStrike->saveSettings( _doc, _parent, "setstrike" ); + m_sound->saveSettings( _doc, _parent, "sound" ); +} + + + + +void FASTCALL bandedWGModel::loadSettings( const QDomElement & _this ) +{ + stkModel::loadSettings( _this ); + m_bowPressure->loadSettings( _this, "bowpressure" ); + m_bowPosition->loadSettings( _this, "bowposition" ); + m_vibratoFrequency->loadSettings( _this, "vibratofrequency" ); + m_vibratoGain->loadSettings( _this, "vibratogain" ); + m_bowVelocity->loadSettings( _this, "bowvelocity" ); + m_setStrike->loadSettings( _this, "setstrike" ); + m_sound->loadSettings( _this, "sound" ); +} + diff --git a/plugins/stk/voices/bandedwg/bandedwg_model.h b/plugins/stk/voices/bandedwg/bandedwg_model.h new file mode 100644 index 000000000..fd65b7bcf --- /dev/null +++ b/plugins/stk/voices/bandedwg/bandedwg_model.h @@ -0,0 +1,100 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BANDEDWG_MODEL_H +#define _BANDEDWG_MODEL_H + +#include "stk_model.h" + + +class bandedWGModel: public stkModel +{ +public: + bandedWGModel( bool _monophonic = FALSE, + StkFloat _portamento = 0.0f, + StkFloat _bend = 0.0f, + StkFloat _bend_range = 2.0f, + bool _velocity_sensitive_lpf = TRUE, + StkFloat _velocity_sensitive_q = 0.5f, + StkFloat _volume = 1.0f, + StkFloat _pan = 0.0f, + StkFloat _spread = 0.0f, + StkFloat _bow_pressure = 64.0f, + StkFloat _bow_position = 64.0f, + StkFloat _vibrato_frequency = 64.0f, + StkFloat _vibrato_gain = 64.0f, + StkFloat _bow_velocity = 64.0f, + StkFloat _set_strike = 64.0f, + StkFloat _sound = 0.0f ); + ~bandedWGModel(); + + inline floatModel * bowPressure( void ) const + { + return( m_bowPressure ); + } + + inline floatModel * bowPosition( void ) const + { + return( m_bowPosition ); + } + + inline floatModel * vibratoFrequency( void ) const + { + return( m_vibratoFrequency ); + } + + inline floatModel * vibratoGain( void ) const + { + return( m_vibratoGain ); + } + + inline floatModel * bowVelocity( void ) const + { + return( m_bowVelocity ); + } + + inline floatModel * setStrike( void ) const + { + return( m_setStrike ); + } + + inline floatModel * sound( void ) const + { + return( m_sound ); + } + + void FASTCALL saveSettings( QDomDocument & _doc, QDomElement & _parent ); + + void FASTCALL loadSettings( const QDomElement & _this ); + +private: + floatModel * m_bowPressure; + floatModel * m_bowPosition; + floatModel * m_vibratoFrequency; + floatModel * m_vibratoGain; + floatModel * m_bowVelocity; + floatModel * m_setStrike; + floatModel * m_sound; +}; + +#endif diff --git a/plugins/stk/voices/bandedwg/bandedwg_processor.cpp b/plugins/stk/voices/bandedwg/bandedwg_processor.cpp new file mode 100644 index 000000000..fef8f88bb --- /dev/null +++ b/plugins/stk/voices/bandedwg/bandedwg_processor.cpp @@ -0,0 +1,53 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + */ + +#include "bandedwg_processor.h" +#include "config_mgr.h" + + +bandedWGProcessor::bandedWGProcessor( sample_rate_t _sample_rate ): + stkProcessor( _sample_rate ) +{ +} + + + + +bandedWGProcessor::~bandedWGProcessor() +{ +} + + + + +void bandedWGProcessor::setControls( bandedWGModel * _model ) +{ + voice()->controlChange( 2, _model->bowPressure()->value() ); + voice()->controlChange( 4, _model->bowPosition()->value() ); + voice()->controlChange( 11, _model->vibratoFrequency()->value() ); + voice()->controlChange( 1, _model->vibratoGain()->value() ); + voice()->controlChange( 128, _model->bowVelocity()->value() ); + voice()->controlChange( 64, _model->setStrike()->value() ); + voice()->controlChange( 16, _model->sound()->value() ); + m_delayRead = m_delayWrite - static_cast( _model->spread()->value() ); +} diff --git a/plugins/stk/voices/bandedwg/bandedwg_processor.h b/plugins/stk/voices/bandedwg/bandedwg_processor.h new file mode 100644 index 000000000..ed147b53d --- /dev/null +++ b/plugins/stk/voices/bandedwg/bandedwg_processor.h @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2008 Danny McRae + * + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 _BANDEDWG_PROCESSOR_H +#define _BANDEDWG_PROCESSOR_H + +#include "BandedWG.h" + +#include "stk_processor.h" + +#include "bandedwg_model.h" + +class bandedWGProcessor: public stkProcessor +{ +public: + bandedWGProcessor( sample_rate_t _sample_rate ); + ~bandedWGProcessor( void ); + + void setControls( bandedWGModel * _model ); +}; + +#endif diff --git a/plugins/stk/voices/bandedwg/logo.png b/plugins/stk/voices/bandedwg/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..20a6081015e8b76b4f4e96a40f8c624e5aaeb64c GIT binary patch literal 890 zcmV-=1BLvFP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO4z z76CcTyF*|A00R0+L_t(&-tCuNXpUhR$N&4;%#hD~)Mm=ph7?Eh5h2az5iw502@WWx zq!cx3lBBlQlF|+okrS-pz)qMrkPvp_YcU@+8_TfWuaoPor^oAkpNIFrbpPw=eeUc2 z-~a2rp8LM9>wcww5H&S5In~wGIqI*dtE=n3llSoO@bK{P@bK{HKltU|4U|aQENPLX z5=p})B_w^6)GDb(Qlq5X&bb6|L(;N8@cmiR2OX`#~DrpbRZIGk}NgE{f zN!lIk90Jq>eLy0@Gsecfi^vZ@H$#(KZ}w}cq6NkQcZ|~stdOK!>&%yQUDA9>PbAe! zYL@g;Qjesek|s);Eorf&DbBeMlH{Blm%`b2NpB^6a?Xv6xFYlHw+xuRuikEHr zU{c`x?Mo+e1X!EF(P-d-iS13p+i0B2F$>tk-}JAxtk?@I$+Tzh0o#D7K%Q-xQeY48 z#yF3Ff;1C4YP`cS3)rbNoT@;IElfq|ig^9Ko9V6;sG#d&7O<@u&egSK1_biLgz5H` z&)XO7uqEpTo&y(w3LrPagxbx~ $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES = libblowbottle.la + +libblowbottle_la_SOURCES = blow_bottle_model.cpp \ + blow_bottle_model.h \ + blow_bottle_processor.cpp \ + blow_bottle_processor.h \ + blow_bottle_instrument.cpp \ + blow_bottle_instrument.h \ + blow_bottle_instrument_view.cpp \ + blow_bottle_instrument_view.h \ + $(top_srcdir)/plugins/stk/voices/src/stk_model.cpp \ + stk_model.h + + + +libblowbottle_la_LDFLAGS = -L@stk_lib@ -lstk -Wl,-export-dynamic + +$(libblowbottle_la_SOURCES): ./embedded_resources.h diff --git a/plugins/stk/voices/blow_bottle/artwork.png b/plugins/stk/voices/blow_bottle/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..3e33f5ba7bf5eb0444004207168a405a42412eb5 GIT binary patch literal 71988 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