diff --git a/src/Makefile.am b/src/Makefile.am index 740b676..079dbb3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -36,7 +36,8 @@ seq42_SOURCES = \ track.cpp track.h \ trackedit.cpp trackedit.h \ trackmenu.cpp trackmenu.h \ - userfile.cpp userfile.h + userfile.cpp userfile.h \ + lfownd.cpp lfownd.h EXTRA_DIST = configwin32.h *.xpm diff --git a/src/Makefile.in b/src/Makefile.in index ba8feea..a77cde2 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1,9 +1,9 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -18,6 +18,23 @@ # Makefile.am for seq42 VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -57,7 +74,8 @@ am_seq42_OBJECTS = configfile.$(OBJEXT) event.$(OBJEXT) font.$(OBJEXT) \ seqdata.$(OBJEXT) seqedit.$(OBJEXT) seqevent.$(OBJEXT) \ seqkeys.$(OBJEXT) seqlist.$(OBJEXT) seqroll.$(OBJEXT) \ seqtime.$(OBJEXT) sequence.$(OBJEXT) track.$(OBJEXT) \ - trackedit.$(OBJEXT) trackmenu.$(OBJEXT) userfile.$(OBJEXT) + trackedit.$(OBJEXT) trackmenu.$(OBJEXT) userfile.$(OBJEXT) \ + lfownd.$(OBJEXT) seq42_OBJECTS = $(am_seq42_OBJECTS) am__DEPENDENCIES_1 = seq42_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ @@ -77,6 +95,11 @@ CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(seq42_SOURCES) DIST_SOURCES = $(seq42_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -215,7 +238,8 @@ seq42_SOURCES = \ track.cpp track.h \ trackedit.cpp trackedit.h \ trackmenu.cpp trackmenu.h \ - userfile.cpp userfile.h + userfile.cpp userfile.h \ + lfownd.cpp EXTRA_DIST = configwin32.h *.xpm MOSTLYCLEANFILES = *~ @@ -256,10 +280,8 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): config.h: stamp-h1 - @if test ! -f $@; then \ - rm -f stamp-h1; \ - $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ - else :; fi + @if test ! -f $@; then rm -f stamp-h1; else :; fi + @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 @@ -273,8 +295,11 @@ distclean-hdr: -rm -f config.h stamp-h1 install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ @@ -308,7 +333,7 @@ uninstall-binPROGRAMS: clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) -seq42$(EXEEXT): $(seq42_OBJECTS) $(seq42_DEPENDENCIES) +seq42$(EXEEXT): $(seq42_OBJECTS) $(seq42_DEPENDENCIES) $(EXTRA_seq42_DEPENDENCIES) @rm -f seq42$(EXEEXT) $(CXXLINK) $(seq42_OBJECTS) $(seq42_LDADD) $(LIBS) @@ -461,10 +486,15 @@ install-am: all-am installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi mostlyclean-generic: -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) diff --git a/src/lfownd.cpp b/src/lfownd.cpp new file mode 100644 index 0000000..f170f56 --- /dev/null +++ b/src/lfownd.cpp @@ -0,0 +1,99 @@ +/* + * lfownd.cpp + * + * Created on: 22 mar 2013 + * Author: mattias + */ + +#include "lfownd.h" +#include +#include +#include +#include "seqedit.h" +using std::string; +using sigc::mem_fun; + +#define PI (3.14159265359) + + +double lfownd::wave_func(double a_angle, int wave_type) { + double tmp; + switch (wave_type){ + case 1: + return sin(a_angle * PI * 2.); + case 2: + return (a_angle - (int)(a_angle)) * 2. - 1.; + case 3: + return (a_angle - (int)(a_angle)) * -2. + 1.; + case 4: + tmp = (a_angle * 2. - (int)(a_angle * 2.)); + if (((int)(a_angle * 2.)) % 2 == 1){ + tmp = -tmp + 1.; + } + tmp = tmp * 2. - 1.; + return tmp; + default: + return 0; + } +} + +lfownd::~lfownd() { + // TODO Auto-generated destructor stub +} + + +lfownd::lfownd(sequence *a_seq, seqdata *a_seqdata){ + m_seq = a_seq; + m_seqdata = a_seqdata; + /* main window */ + string title = "seq42 - lfoeditor - "; + title.append(m_seq->get_name()); + set_title(title); + set_size_request(150, 200); + + m_scale_value = manage(new VScale(0, 127, .1)); + m_scale_range = manage(new VScale(0, 127, .1)); + m_scale_speed = manage(new VScale(0, 16, .01)); + m_scale_phase = manage(new VScale(0,1,.01)); + m_scale_wave = manage(new VScale(1,5,1)); + + m_scale_value->set_tooltip_text("value"); + m_scale_range->set_tooltip_text("range"); + m_scale_speed->set_tooltip_text("speed"); + m_scale_phase->set_tooltip_text("phase"); + m_scale_wave->set_tooltip_text("wave"); + + m_scale_value->set_value(64); + m_scale_range->set_value(64); + m_scale_value->signal_value_changed().connect(mem_fun( *this, &lfownd::scale_lfo_change)); + m_scale_range->signal_value_changed().connect(mem_fun( *this, &lfownd::scale_lfo_change)); + m_scale_speed->signal_value_changed().connect(mem_fun( *this, &lfownd::scale_lfo_change)); + m_scale_phase->signal_value_changed().connect(mem_fun( *this, &lfownd::scale_lfo_change)); + m_scale_wave->signal_value_changed().connect(mem_fun( *this, &lfownd::scale_lfo_change)); + + m_hbox = manage(new HBox(false, 2)); + + add(*m_hbox); + m_hbox->pack_start(*m_scale_value); + m_hbox->pack_start(*m_scale_range); + m_hbox->pack_start(*m_scale_speed); + m_hbox->pack_start(*m_scale_phase); + m_hbox->pack_start(*m_scale_wave); +} + +void lfownd::toggle_visible(){ + show_all(); +} + +void lfownd::scale_lfo_change() { + m_value = m_scale_value->get_value(); + m_range = m_scale_range->get_value(); + m_speed = m_scale_speed->get_value(); + m_phase = m_scale_phase->get_value(); + m_wave = m_scale_wave->get_value(); + m_seq->change_event_data_lfo(m_value, m_range, m_speed, m_phase, m_wave, + m_seqdata->m_status, m_seqdata->m_cc); + m_seqdata->update_pixmap(); + m_seqdata->draw_pixmap_on_window(); +} + diff --git a/src/lfownd.h b/src/lfownd.h new file mode 100644 index 0000000..f4c3e96 --- /dev/null +++ b/src/lfownd.h @@ -0,0 +1,46 @@ +/* + * lfownd.h + * + * Created on: 22 mar 2013 + * Author: mattias + */ + +#ifndef LFOWND_H_ +#define LFOWND_H_ + +#include +#include +#include "globals.h" +#include "sequence.h" +#include "seqdata.h" + +using namespace Gtk; + +class lfownd: public Gtk::Window { +public: + VScale *m_scale_value; + VScale *m_scale_range; + VScale *m_scale_speed; + VScale *m_scale_phase; + VScale *m_scale_wave; + + double m_value; + double m_range; + double m_speed; + double m_phase; + int m_wave; + + HBox *m_hbox; + sequence *m_seq; + seqdata *m_seqdata; + + void scale_lfo_change(); + static double wave_func(double a_angle, int wave_type); + + public: + lfownd (sequence *a_seq, seqdata *a_seqdata); + void toggle_visible(); + virtual ~lfownd(); +}; + +#endif /* LFOWND_H_ */ diff --git a/src/seqdata.h b/src/seqdata.h index 061282f..840bf5e 100644 --- a/src/seqdata.h +++ b/src/seqdata.h @@ -124,6 +124,7 @@ class seqdata : public Gtk::DrawingArea friend class seqroll; friend class seqevent; + friend class lfownd; }; diff --git a/src/seqedit.cpp b/src/seqedit.cpp index 1d2256b..2b8d133 100644 --- a/src/seqedit.cpp +++ b/src/seqedit.cpp @@ -99,7 +99,7 @@ seqedit::menu_action_quantise( void ) seqedit::seqedit( sequence *a_seq, - perform *a_perf) + perform *a_perf) { set_icon(Gdk::Pixbuf::create_from_xpm_data(seq_editor_xpm)); @@ -142,6 +142,9 @@ seqedit::seqedit( sequence *a_seq, m_zoom, m_hadjust)); + m_lfo_wnd = manage( new lfownd( m_seq, + m_seqdata_wid)); + m_seqevent_wid = manage( new seqevent( m_seq, m_zoom, m_snap, @@ -233,6 +236,9 @@ seqedit::seqedit( sequence *a_seq, dhbox->pack_start(*m_button_play, false, false); dhbox->pack_start( *(manage(new VSeparator( ))), false, false, 4); + m_button_lfo = manage (new Button("lfo") ); + dhbox->pack_start(*m_button_lfo, false, false); + m_button_lfo->signal_clicked().connect ( mem_fun(m_lfo_wnd, &lfownd::toggle_visible)); /* data button */ @@ -1535,6 +1541,7 @@ seqedit::on_delete_event(GdkEventAny *a_event) m_mainperf->get_master_midi_bus()->set_sequence_input( false, NULL ); m_seq->set_editing( false ); + delete m_lfo_wnd; delete this; return false; @@ -1626,3 +1633,5 @@ seqedit::adj_callback_vel() { m_seq->get_track()->set_default_velocity( (int) m_adjust_vel->get_value() ); } + + diff --git a/src/seqedit.h b/src/seqedit.h index 1295785..7f11caa 100644 --- a/src/seqedit.h +++ b/src/seqedit.h @@ -37,6 +37,7 @@ #include #include "globals.h" +#include "lfownd.h" using namespace Gtk; @@ -147,6 +148,8 @@ class seqedit : public Gtk::Window Button *m_button_stop; Button *m_button_play; + Button *m_button_lfo; + lfownd *m_lfo_wnd; ToggleButton *m_toggle_play; ToggleButton *m_toggle_record; @@ -243,6 +246,7 @@ class seqedit : public Gtk::Window void mouse_action( mouse_action_e a_action ); void start_playing(); + void stop_playing(); void set_track_info( ); diff --git a/src/sequence.cpp b/src/sequence.cpp index fa0f7ac..23257d9 100644 --- a/src/sequence.cpp +++ b/src/sequence.cpp @@ -1442,6 +1442,94 @@ sequence::paste_selected( long a_tick, int a_note ) } +void sequence::change_event_data_lfo(double a_value, double a_range, + double a_speed, double a_phase, int a_wave, + unsigned char a_status, + unsigned char a_cc){ + lock(); + + unsigned char d0, d1; + list::iterator i; + + /* change only selected events, if any */ + bool have_selection = false; + if( get_num_selected_events(a_status, a_cc) ) + have_selection = true; + + for ( i = m_list_event.begin(); i != m_list_event.end(); i++ ){ + + /* initially false */ + bool set = false; + (*i).get_data( &d0, &d1 ); + + /* correct status and not CC */ + if ( a_status != EVENT_CONTROL_CHANGE && + (*i).get_status() == a_status ) + set = true; + + /* correct status and correct cc */ + if ( a_status == EVENT_CONTROL_CHANGE && + (*i).get_status() == a_status && + d0 == a_cc ) + set = true; + +// /* in range? */ +// if ( !((*i).get_timestamp() >= a_tick_s && +// (*i).get_timestamp() <= a_tick_f )) +// set = false; + + /* in selection? */ + if ( have_selection && (!(*i).is_selected()) ) + set = false; + + if ( set ){ + + //float weight; + + /* no divide by 0 */ +// if( a_tick_f == a_tick_s ) +// a_tick_f = a_tick_s + 1; + int tick = (*i).get_timestamp(); + + //printf("ticks: %d %d %d\n", a_tick_s, tick, a_tick_f); + //printf("datas: %d %d\n", a_data_s, a_data_f); + +// int newdata = ((tick-a_tick_s)*a_data_f + (a_tick_f-tick)*a_data_s) +// /(a_tick_f - a_tick_s); + + int newdata = a_value + lfownd::wave_func((a_speed * (double)tick / (double) m_length * (double) m_time_beat_width + a_phase), a_wave) * a_range; + + if ( newdata < 0 ) newdata = 0; + if ( newdata > 127 ) newdata = 127; + + if ( a_status == EVENT_NOTE_ON ) + d1 = newdata; + + if ( a_status == EVENT_NOTE_OFF ) + d1 = newdata; + + if ( a_status == EVENT_AFTERTOUCH ) + d1 = newdata; + + if ( a_status == EVENT_CONTROL_CHANGE ) + d1 = newdata; + + if ( a_status == EVENT_PROGRAM_CHANGE ) + d0 = newdata; /* d0 == new patch */ + + if ( a_status == EVENT_CHANNEL_PRESSURE ) + d0 = newdata; /* d0 == pressure */ + + if ( a_status == EVENT_PITCH_WHEEL ) + d1 = newdata; + + (*i).set_data( d0, d1 ); + } + } + + unlock(); +} + /* change */ void sequence::change_event_data_range( long a_tick_s, long a_tick_f, diff --git a/src/sequence.h b/src/sequence.h index ea667df..5fb3e68 100644 --- a/src/sequence.h +++ b/src/sequence.h @@ -43,6 +43,8 @@ enum draw_type DRAW_NOTE_OFF }; +using std::list; + class sequence { @@ -303,6 +305,11 @@ class sequence int a_d_s, int a_d_f); //unsigned char a_d_s, unsigned char a_d_f); + /* lfo tool */ + void change_event_data_lfo(double a_value, double a_range, + double a_speed, double a_phase, int a_wave, + unsigned char a_status, unsigned char a_cc); + /* moves note off event */ void increment_selected (unsigned char a_status, unsigned char a_control); void decrement_selected (unsigned char a_status, unsigned char a_control);