changeset 46:1e266647840d

beta 2. interpolation movement , smoothing (crap) and timbre only.
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Wed, 24 Apr 2013 17:58:08 +0100
parents c2fffc8ea84d
children 0d3a993405e4
files HelpViewController.xib IntroViewController.xib SliderViewController.mm TopButtonViewController.h TopButtonViewController.mm TopButtonViewController.xib grid.h grid.mm presetManager.h presetManager.mm testApp.h testApp.mm
diffstat 12 files changed, 273 insertions(+), 162 deletions(-) [+]
line wrap: on
line diff
--- a/HelpViewController.xib	Tue Apr 23 18:29:55 2013 +0100
+++ b/HelpViewController.xib	Wed Apr 24 17:58:08 2013 +0100
@@ -96,35 +96,29 @@
 ZXdpc2UgaWYgeW91IG1vdmUgYSBzbGlkZXIgeW91IHdpbGwgaG9wIHRvIGEgZGlmZmVyZW50IHBvaW50
 IG9uIHRoZSBzdXJmYWNlLiBZb3VyIHBhdGggdGhyb3VnaCB0aGUgc3BhY2Ugd2lsbCBzaG93IGFzIGEg
 d2hpdGUgbGluZSwgYW55IHBvaW50cyB5b3UgaGF2ZSBob3ZlcmVkIG92ZXIgd2lsbCBzaG93IGFzIGJs
-dWUgY2lyY2xlcy7igKgNU2F2ZSBhbnkgc291bmRzL3NlcXVlbmNlcyB0aGF0IHlvdSBsaWtlIHVzaW5n
-IHRoZSDigJxzYXZlIHByZXNldOKAnSBidXR0b24uIEEgbWFya2VyIHdpbGwgYXBwZWFyIG9uIHRoZSB6
-b29tIHN1cmZhY2UuIElmIHlvdSBtb3ZlIHRvIHRoZSB2aWNpbml0eSBvZiBhIHByZXNldCBtYXJrZXIs
-IHRoZSBjcm9zc2hhaXJzIHdpbGwgc25hcCB0byB0aGUgcHJlc2V0LCBpdHMgZGV0YWlscyB3aWxsIGFw
-cGVhciBhbmQgdGhhdCBzb3VuZCB3aWxsIHBsYXkuDeKAqFR3byBmaW5nZXIgcGluY2ggbW92ZW1lbnRz
-IHpvb20gdGhlIHN1cmZhY2UganVzdCBhcyBpbiBhIG1hcHMgYXBwLiBUaGUgZnVydGhlciB5b3Ugem9v
-bSBpbiwgdGhlIGxlc3MgdGhlIHNvdW5kIHdpbGwgY2hhbmdlIGFzIHlvdSBzY3JvbGwgYXJvdW5kLiBG
-b3IgZXhhbXBsZSB0aGUgeWVsbG93IGxpbmVzIHRoYXQgYXBwZWFyIGF0IHRoZSBsYXJnZXN0IHNjYWxl
-IGNvcnJlc3BvbmQgdG8gdGhlIHNsaWRlcnMganVtcGluZyA2NCB1bml0cy4gVGhlIHdoaXRlIGxpbmVz
-IGF0IHRoZSBzbWFsbGVzdCBzY2FsZSBjb3JyZXNwb25kIHRvIGp1bXBzIG9mIG9uZSB1bml0LiBUaGVy
-ZSBhcmUgNyBsZXZlbHM64oCo4oCoWWVsbG93ID0gNjQsIFRlYWwgPSAzMiwgUHVycGxlID0gMTYsIEdy
-ZWVuID0gOCwgRGFyayBCbHVlID0gNCwgUmVkID0gMiwgV2hpdGUgPSAx4oCo4oCoTE9DS+KAqOKAqOKA
-qElmIHlvdSBmaW5kIGEgc2VxdWVuY2UgeW91IGxpa2UgYnV0IHdhbnQgdG8gY2hhbmdlIHRoZSBzeW50
-aCBzb3VuZCB1c2UgdGhlICJMb2NrIFgiIGJ1dHRvbi4gVGhpcyB3aWxsIHByZXZlbnQgeW91IGFjY2lk
-ZW50YWxseSBtb3ZpbmcgaW4gZnJvbSBsZWZ0IHRvIHJpZ2h0IGFuZCBtZXNzaW5nIHVwIHlvdXIgbm90
-ZSBwYXR0ZXJuLiBTaW1pbGFybHkgaWYgeW91IGZpbmQgYSBzeW50aCBzb3VuZCB0aGF0IHlvdSBsaWtl
-LCBidXQgd2FudCB0byBjaGFuZ2UgdGhlIG5vdGUgc2VxdWVuY2UsIHVzZSB0aGUgIkxvY2sgWSIgYnV0
-dG9uLiDigKjigKjigKhFWFRSQSBGRUFUVVJFU+KAqOKAqEFmdGVyIHlvdSBjb21wbGV0ZSB0aGUgdGlt
-ZWQgc2Vzc2lvbnMgYW5kIHRoZSBxdWVzdGlvbm5haXJlLCB5b3UgY2FuIHR1cm4gdGhlIHNsaWRlcnMg
-YW5kIHRoZSB6b29tZXIgb24vb2ZmIHVzaW5nIHRoZSB0YWJzIGF0IHRoZSBib3R0b20gb2YgdGhlIHNj
-cmVlbi4gVGhlc2UgZnVydGhlciBmZWF0dXJlcyB3aWxsIGJlIGVuYWJsZWQ64oCo4oCoV2hlbiB5b3Ug
-aGF2ZSBmaW5pc2hlZCB0aGUgZXhwZXJpbWVudCwgYSAic21vb3RoIiBzd2l0Y2ggd2lsbCBhcHBlYXIu
-IFRoaXMgd2lsbCBpbnRlcnBvbGF0ZSB0aGUgZ3JpZCBzbyB0aGF0IHRoZSBzbGlkZXJzIGNoYW5nZSBt
-b3JlIHNtb290aGx5LiBOb3RlIHRoaXMgd2lsbCBicmVhayB0aGUgb25lIHRvIG9uZSBtYXBwaW5nIGJl
-dHdlZW4gc2xpZGVycyBhbmQgc3VyZmFjZTogcHJldmlvdXNseSBzYXZlZCBwcmVzZXRzIHdpbGwgbm90
-IGFwcGVhciwgYW5kIGFueSBzYXZlZCBpbiB0aGlzIG1vZGUgd2lsbCB0ZW5kIHRvIGFwcGVhciBpbiBh
-IHNsaWdodGx5IGRpZmZlcmVudCBwb3NpdGlvbiB3aGVuIHNtb290aCBpcyB0dXJuZWQgb2ZmLg3igKhN
-SURJIENDIHZhbHVlcyAobnVtYmVycyAwLTkpIHdpbGwgYmUgc2VudCBmcm9tIHRoZSBzbGlkZXJzLCBv
-biBjaGFubmVsIDcuIOKAqA0</bytes>
+dWUgY2lyY2xlcy7igKjigKgNU2F2ZSBhbnkgc291bmRzIHRoYXQgeW91IGxpa2UgdXNpbmcgdGhlIOKA
+nHNhdmUgcHJlc2V04oCdIGJ1dHRvbi4gQSBtYXJrZXIgd2lsbCBhcHBlYXIgb24gdGhlIHpvb20gc3Vy
+ZmFjZS4gSWYgeW91IG1vdmUgdG8gdGhlIHZpY2luaXR5IG9mIGEgcHJlc2V0IG1hcmtlciwgdGhlIGNy
+b3NzaGFpcnMgd2lsbCBzbmFwIHRvIHRoZSBwcmVzZXQsIGl0cyBkZXRhaWxzIHdpbGwgYXBwZWFyIGFu
+ZCB0aGF0IHNvdW5kIHdpbGwgcGxheS4gVGFwIGEgcHJlc2V0IHBvaW50IHR3aWNlIGFuZCB5b3Ugd2ls
+bCBzbW9vdGhseSBnbGlkZSB0byB0aGF0IHNvdW5kLg3igKhUd28gZmluZ2VyIHBpbmNoIG1vdmVtZW50
+cyB6b29tIHRoZSBzdXJmYWNlIGp1c3QgYXMgaW4gYSBtYXBzIGFwcC4gVGhlIGZ1cnRoZXIgeW91IHpv
+b20gaW4sIHRoZSBsZXNzIHRoZSBzb3VuZCB3aWxsIGNoYW5nZSBhcyB5b3Ugc2Nyb2xsIGFyb3VuZC4g
+Rm9yIGV4YW1wbGUgdGhlIHJlZCBsaW5lcyB0aGF0IGFwcGVhciBhdCB0aGUgbGFyZ2VzdCBzY2FsZSBj
+b3JyZXNwb25kIHRvIHRoZSBzbGlkZXJzIGp1bXBpbmcgNjQgdW5pdHMuIFRoZSB3aGl0ZSBsaW5lcyBh
+dCB0aGUgc21hbGxlc3Qgc2NhbGUgY29ycmVzcG9uZCB0byBqdW1wcyBvZiBvbmUgdW5pdC4gVGhlcmUg
+YXJlIDcgbGV2ZWxzOuKAqOKAqFJlZCA9IDY0LCBPcmFuZ2UgPSAzMiwgWWVsbG93ID0gMTYsIEdyZWVu
+ID0gOCwgQmx1ZSA9IDQsIFB1cnBsZSA9IDIsIFdoaXRlID0gMeKAqOKAqOKAqEVYVFJBIEZFQVRVUkVT
+4oCo4oCoQWZ0ZXIgeW91IGNvbXBsZXRlIHRoZSB0aW1lZCBzZXNzaW9ucyBhbmQgdGhlIHF1ZXN0aW9u
+bmFpcmUsIHlvdSBjYW4gdHVybiB0aGUgc2xpZGVycyBhbmQgdGhlIHpvb21lciBvbi9vZmYgdXNpbmcg
+dGhlIHRhYnMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLiBUaGVzZSBmdXJ0aGVyIGZlYXR1cmVz
+IHdpbGwgYmUgZW5hYmxlZDrigKjigKhXaGVuIHlvdSBoYXZlIGZpbmlzaGVkIHRoZSBleHBlcmltZW50
+LCBhICJzbW9vdGgiIHN3aXRjaCB3aWxsIGFwcGVhci4gVGhpcyB3aWxsIGludGVycG9sYXRlIHRoZSBn
+cmlkIHNvIHRoYXQgdGhlIHNsaWRlcnMgY2hhbmdlIG1vcmUgc21vb3RobHkuIE5vdGUgdGhpcyB3aWxs
+IGJyZWFrIHRoZSBvbmUgdG8gb25lIG1hcHBpbmcgYmV0d2VlbiBzbGlkZXJzIGFuZCBzdXJmYWNlOiBw
+cmV2aW91c2x5IHNhdmVkIHByZXNldHMgY2Fubm90IGFwcGVhci4N4oCoTUlESSBDQyB2YWx1ZXMgKG51
+bWJlcnMgMC05KSB3aWxsIGJlIHNlbnQgZnJvbSB0aGUgc2xpZGVycywgb24gY2hhbm5lbCA3LiDigKgN
+A</bytes>
 						</object>
 						<object class="NSColor" key="IBUITextColor">
 							<int key="NSColorSpace">1</int>
--- a/IntroViewController.xib	Tue Apr 23 18:29:55 2013 +0100
+++ b/IntroViewController.xib	Wed Apr 24 17:58:08 2013 +0100
@@ -42,6 +42,7 @@
 						<string key="NSFrame">{{326, 881}, {116, 44}}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
+						<reference key="NSNextKeyView"/>
 						<string key="NSReuseIdentifierKey">_NS:9</string>
 						<bool key="IBUIOpaque">NO</bool>
 						<string key="targetRuntimeIdentifier">IBIPadFramework</string>
@@ -88,45 +89,45 @@
 							<bytes key="NS.bytes">V2VsY29tZSB0byB0aGUgIlNvbmljIFpvb20iLiBUaGlzIGlzIGEgUXVlZW4gTWFyeSBVbml2ZXJzaXR5
 IFBoRCByZXNlYXJjaCBwcm9qZWN0IGFpbWVkIGF0IGZpbmRpbmcgb3V0IGhvdyBwZW9wbGUgZXhwbG9y
 ZSBzb3VuZCBzeW50aGVzaXMgcGFyYW1ldGVycy4gDQ1JbiB0aGlzIGFwcCB0aGVyZSBhcmUganVzdCAx
-MCBwYXJhbWV0ZXJzIOKAkyA1IGZvciB0aGUgbm90ZSBwYXR0ZXJuIGdlbmVyYXRvciBhbmQgNSBmb3Ig
-YSBzb21ld2hhdCBiYXNpYyBGTS9zdWJ0cmFjdGl2ZSBzeW50aGVzaXplci4gSG93ZXZlciwgZXZlbiB3
-aXRoIG9ubHkgMTAgcGFyYW1ldGVycyB0aGUgYW1vdW50IG9mIGRpZmZlcmVudCBzb3VuZHMgdG8gZXhw
-bG9yZSBpcyB2YXN0OiBpbiBmYWN0IHRoZXJlIGFyZSBqdXN0IG92ZXIgYSBiaWxsaW9uIHRyaWxsaW9u
-IGRpc3RpbmN0IHNldHRpbmdzISBXZSBhaW0gdG8gbG9vayBhdCB3aGF0IHBhdGhzIHBlb3BsZSB0YWtl
-IGluIHRoaXMgaHVnZSBzcGFjZSwgd2hhdCBwb2ludHMgdGhleSBsaWtlIGFuZCBkaXNsaWtlLCBhbmQg
-dXNlIHRoZSBkYXRhIHRvIGNyZWF0ZSBzeW50aHMgdGhhdCBhcmUgZWFzaWVyIHRvIG5hdmlnYXRlLCBh
-bmQgaG9wZWZ1bGx5IGVuY291cmFnZSBjcmVhdGl2aXR5Lg0NVGhlcmUgYXJlIHR3byBpbnRlcmZhY2Vz
-IHByZXNlbnRlZCBoZXJlLiBUaGUgZmlyc3QgaXMgb25lIHlvdSB3aWxsIHByb2JhYmx5IGJlIHVzZWQg
-dG8gaWYgeW91IGFyZSBhbiBlbGVjdHJvbmljIG11c2ljaWFuOiAxMCBzbGlkZXJzIGZvciBlYWNoIG9m
-IHRoZSBwYXJhbWV0ZXJzLiBUaGUgc2Vjb25kIGlzIHNvbWV3aGF0IG5ldzogZXZlcnkgb25lIG9mIHRo
-ZSBiaWxsaW9uIHRyaWxsaW9uIHBvaW50cyBoYXMgYmVlbiBtYXBwZWQgdG8gYSAyRCBzdXJmYWNlLiBC
-dXQgYmFzaWNhbGx5LCB0aGUgZnVydGhlciB5b3UgdHJhdmVsIGFsb25nIHRoaXMgMkQgc3VyZmFjZSwg
-dGhlIG1vcmUgZGlmZmVyZW50IHRoZSBzb3VuZCB3aWxsIGJlY29tZS4NDVVwIGRvd24gbW92ZW1lbnQg
-Y29udHJvbHMgdGhlIHN5bnRoIHRpbWJyZSwgbGVmdCByaWdodCBjb250cm9scyB0aGUgc2VxdWVuY2Vy
-LiBXaGVuIHlvdSBjbGljayDigJxzYXZlIHByZXNldOKAnSB5b3Ugd2lsbCBkcm9wIGEgcGluIG9udG8g
-dGhlIHN1cmZhY2UsIGFuZCB5b3UgY2FuIHJldmlzaXQgdGhpcyBwb2ludCBhdCBhbnl0aW1lIGJ5IHNj
-cm9sbGluZyB0byBpdC4gVGhpbmsgb2YgaXQgbGlrZSBhICJHb29nbGUgTWFwcyIgZm9yIHN5bnRoIHNv
-dW5kcy4uLg0NWW91IGNhbiB1c2UgYSBwaW5jaCBnZXN0dXJlIHRvIHpvb20gaW4gYW5kIG91dCBvZiB0
-aGUgc3VyZmFjZS4gSW4gdGhpcyB3YXksIHlvdSBjYW4gZXhwbG9yZSB0aGUgIm5laWdoYm91cmhvb2Qi
-IG9mIGEgcGFydGljdWxhciBzb3VuZC4gWm9vbWluZyBpbiB3aWxsIGVuYWJsZSB5b3UgdG8gZXhwbG9y
-ZSBzbWFsbGVyIGxvY2FsaXRpZXMgb2YgdGhlIHNvdW5kIHNwYWNlLiBab29taW5nIG91dCB3aWxsIGdp
-dmUgeW91IGEgYmlnZ2VyIHBlcnNwZWN0aXZlLCBidXQgb2YgY291cnNlIHRoZSB0cmFuc2l0aW9ucyB3
-aWxsIGJlY29tZSBtb3JlIHN1ZGRlbiBhbmQgcmFuZG9tIGFzIHlvdSBtb3ZlIGJpZ2dlciBkaXN0YW5j
-ZXMuDQ1XaGF0IHdlIGFyZSBhc2tpbmcgeW91LCB0aGUgcGFydGljaXBhbnQsIHRvIGRvIGlzIHVzZSB0
-aGUgem9vbWVyLCB0aGUgc2xpZGVycyBhbmQgYSBjb21iaW5hdGlvbiBvZiBib3RoIGZvciA1IG1pbnV0
-ZXMgZWFjaCwgYW5kIHNhdmUgYW55IHNvdW5kcyB0aGF0IHlvdSBsaWtlLiBUaGUgaW50ZXJmYWNlcyB3
-aWxsIHN3YXAgYXV0b21hdGljYWxseS4gQWxzbyBjaGVjayBvdXQgdGhlICJyYW5kb21pc2UiIGFuZCAi
-bG9jayIgYnV0dG9ucy4gQWZ0ZXIgdGhpcyBhIHNob3J0IHF1ZXN0aW9ubmFpcmUgd2lsbCBhcHBlYXIg
-dGhhdCB3aWxsIGhlbHAgdXMgYXNzZXNzIHRoZSBpbnRlcmZhY2UgZnVydGhlci4gQWZ0ZXIgdGhhdCwg
-cGxlYXNlIGZlZWwgZnJlZSB0byB1c2UgaXQgc29tZSBtb3JlOiB0aGUgbW9yZSBkYXRhIHdlIGdldCB0
-aGUgYmV0dGVyLiDigKjigKjigKhQTEVBU0UgTk9URTogWW91ciBhY3Rpb25zIHdpbGwgYmUgbG9nZ2Vk
-LCBhbmQgc2VudCB0byBhIHNlY3VyZSBzZXJ2ZXIgaGVyZSBhdCBRdWVlbiBNYXJ5IFVuaXZlcnNpdHku
-ICBIb3dldmVyIG5vIHBlcnNvbmFsIGRhdGEgKG5hbWUsIGVtYWlsIGV0Yy4pIHdpbGwgYmUgY29sbGVj
-dGVkLCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJRCBvciBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiBJdCBp
-cyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYXJlIGNvbm5lY3RlZCB0byBXaUZpIGludGVybmV0
-IHdoaWxzdCB1c2luZyB0aGlzIEFwcCwgb3RoZXJ3aXNlIHRoZSBsb2cgZGF0YSB3aWxsIHRha2UgdXAg
-c3BhY2Ugb24geW91ciBkZXZpY2UuDVRvIGNvbnNlbnQgdG8gdGhpcyBwbGVhc2UgcHJlc3MgIkFncmVl
-IiBiZWxvdy4gVG8gZGVjbGluZSBqdXN0IGV4aXQgdGhlIGFwcC4NA</bytes>
+MCBwYXJhbWV0ZXJzIGZvciBhIHNvbWV3aGF0IGJhc2ljIEZNL3N1YnRyYWN0aXZlIHN5bnRoZXNpemVy
+LiBIb3dldmVyLCBldmVuIHdpdGggb25seSAxMCBwYXJhbWV0ZXJzIHRoZSBhbW91bnQgb2YgZGlmZmVy
+ZW50IHNvdW5kcyB0byBleHBsb3JlIGlzIHZhc3Q6IGluIGZhY3QgdGhlcmUgYXJlIGp1c3Qgb3ZlciBh
+IGJpbGxpb24gdHJpbGxpb24gZGlzdGluY3Qgc2V0dGluZ3MhIFdlIGFpbSB0byBsb29rIGF0IHdoYXQg
+cGF0aHMgcGVvcGxlIHRha2UgaW4gdGhpcyBodWdlIHNwYWNlLCB3aGF0IHBvaW50cyB0aGV5IGxpa2Ug
+YW5kIGRpc2xpa2UsIGFuZCB1c2UgdGhlIGRhdGEgdG8gY3JlYXRlIHN5bnRocyB0aGF0IGFyZSBlYXNp
+ZXIgdG8gbmF2aWdhdGUsIGFuZCBob3BlZnVsbHkgZW5jb3VyYWdlIGNyZWF0aXZpdHkuDQ1UaGVyZSBh
+cmUgdHdvIGludGVyZmFjZXMgcHJlc2VudGVkIGhlcmUuIFRoZSBmaXJzdCBpcyBvbmUgeW91IHdpbGwg
+cHJvYmFibHkgYmUgdXNlZCB0byBpZiB5b3UgYXJlIGFuIGVsZWN0cm9uaWMgbXVzaWNpYW46IDEwIHNs
+aWRlcnMgZm9yIGVhY2ggb2YgdGhlIHBhcmFtZXRlcnMuIFRoZSBzZWNvbmQgaXMgc29tZXdoYXQgbmV3
+OiBldmVyeSBvbmUgb2YgdGhlIGJpbGxpb24gdHJpbGxpb24gcG9pbnRzIGhhcyBiZWVuIG1hcHBlZCB0
+byBhIDJEIHN1cmZhY2UuIEJ1dCBiYXNpY2FsbHksIHRoZSBmdXJ0aGVyIHlvdSB0cmF2ZWwgYWxvbmcg
+dGhpcyAyRCBzdXJmYWNlLCB0aGUgbW9yZSBkaWZmZXJlbnQgdGhlIHNvdW5kIHdpbGwgYmVjb21lLuKA
+qA0gV2hlbiB5b3UgY2xpY2sg4oCcc2F2ZSBwcmVzZXTigJ0geW91IHdpbGwgZHJvcCBhIHBpbiBvbnRv
+IHRoZSBzdXJmYWNlLCBhbmQgeW91IGNhbiByZXZpc2l0IHRoaXMgcG9pbnQgYXQgYW55dGltZSBieSBz
+Y3JvbGxpbmcgdG8gaXQuIFRoaW5rIG9mIGl0IGxpa2UgYSAiR29vZ2xlIE1hcHMiIGZvciBzeW50aCBz
+b3VuZHMuLi4NDVlvdSBjYW4gdXNlIGEgcGluY2ggZ2VzdHVyZSB0byB6b29tIGluIGFuZCBvdXQgb2Yg
+dGhlIHN1cmZhY2UuIEluIHRoaXMgd2F5LCB5b3UgY2FuIGV4cGxvcmUgdGhlICJuZWlnaGJvdXJob29k
+IiBvZiBhIHBhcnRpY3VsYXIgc291bmQuIFpvb21pbmcgaW4gd2lsbCBlbmFibGUgeW91IHRvIGV4cGxv
+cmUgc21hbGxlciBsb2NhbGl0aWVzIG9mIHRoZSBzb3VuZCBzcGFjZS4gWm9vbWluZyBvdXQgd2lsbCBn
+aXZlIHlvdSBhIGJpZ2dlciBwZXJzcGVjdGl2ZSwgYnV0IG9mIGNvdXJzZSB0aGUgdHJhbnNpdGlvbnMg
+d2lsbCBiZWNvbWUgbW9yZSBzdWRkZW4gYW5kIHJhbmRvbSBhcyB5b3UgbW92ZSBiaWdnZXIgZGlzdGFu
+Y2VzLg0NV2hhdCB3ZSBhcmUgYXNraW5nIHlvdSwgdGhlIHBhcnRpY2lwYW50LCB0byBkbyBpcyB1c2Ug
+dGhlIHpvb21lciwgdGhlIHNsaWRlcnMgYW5kIGEgY29tYmluYXRpb24gb2YgYm90aCBmb3IgNSBtaW51
+dGVzIGVhY2gsIGFuZCBzYXZlIGFueSBzb3VuZHMgdGhhdCB5b3UgbGlrZS4gVGhlIGludGVyZmFjZXMg
+d2lsbCBzd2FwIGF1dG9tYXRpY2FsbHkuIEFsc28gY2hlY2sgb3V0IHRoZSAicmFuZG9taXNlIiBhbmQg
+ImxvY2siIGJ1dHRvbnMuIEFmdGVyIHRoaXMgYSBzaG9ydCBxdWVzdGlvbm5haXJlIHdpbGwgYXBwZWFy
+IHRoYXQgd2lsbCBoZWxwIHVzIGFzc2VzcyB0aGUgaW50ZXJmYWNlIGZ1cnRoZXIuIEFmdGVyIHRoYXQs
+IHBsZWFzZSBmZWVsIGZyZWUgdG8gdXNlIGl0IHNvbWUgbW9yZTogdGhlIG1vcmUgZGF0YSB3ZSBnZXQg
+dGhlIGJldHRlci4gQXMgYSBib251cyBzb21lIGV4dHJhIGZlYXR1cmVzIHdpbGwgYmUgdW5sb2NrZWQg
+d2hlbiB5b3UgY29tcGxldGUgdGhlIHF1ZXN0aW9ubmFpcmU6IE1JREkgb3V0IGFuZCBzbW9vdGggaW50
+ZXJwb2xhdGlvbiBtb2RlLuKAqOKAqOKAqFBsZWFzZSBub3RlOiBZb3VyIGFjdGlvbnMgd2lsbCBiZSBs
+b2dnZWQsIGFuZCBzZW50IHRvIGEgc2VjdXJlIHNlcnZlciBoZXJlIGF0IFF1ZWVuIE1hcnkgVW5pdmVy
+c2l0eS4gIEhvd2V2ZXIgbm8gcGVyc29uYWwgZGF0YSAobmFtZSwgZW1haWwgZXRjLikgd2lsbCBiZSBj
+b2xsZWN0ZWQsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIElEIG9yIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2Uu
+IEl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBhcmUgY29ubmVjdGVkIHRvIFdpRmkgaW50
+ZXJuZXQgd2hpbHN0IHVzaW5nIHRoaXMgQXBwLCBvdGhlcndpc2UgdGhlIGxvZyBkYXRhIHdpbGwgdGFr
+ZSB1cCBzcGFjZSBvbiB5b3VyIGRldmljZS4NVG8gY29uc2VudCB0byB0aGlzIHBsZWFzZSBwcmVzcyAi
+QWdyZWUiIGJlbG93LiBUbyBkZWNsaW5lIGp1c3QgZXhpdCB0aGUgYXBwLg0</bytes>
 						</object>
 						<object class="NSColor" key="IBUITextColor">
 							<int key="NSColorSpace">1</int>
--- a/SliderViewController.mm	Tue Apr 23 18:29:55 2013 +0100
+++ b/SliderViewController.mm	Wed Apr 24 17:58:08 2013 +0100
@@ -112,8 +112,8 @@
                        nil];
     */
     self.paramNames = [NSArray arrayWithObjects:
-                       @"Amp Env",@"Waveform",@"FM amount",@"FM frequency",@"Reverb",
-                       @"Filter Type",@"Filter Cut off",@"Filter Resonance",@"Filter Env Shape",@"Filt Env Amount",
+                       @"Amp Env Shape",@"Waveform (Sin,Saw,Pulse)",@"FM amount",@"FM frequency",@"Reverb",
+                       @"Filter Type (LP,BP,HP)",@"Filter Cut off",@"Filter Resonance",@"Filter Env Shape",@"Filt Env Amount",
                        nil];
 }
 @end
--- a/TopButtonViewController.h	Tue Apr 23 18:29:55 2013 +0100
+++ b/TopButtonViewController.h	Wed Apr 24 17:58:08 2013 +0100
@@ -23,6 +23,7 @@
 @property (retain, strong,nonatomic) IBOutlet UIBarButtonItem *newUserButton;
 @property (retain, nonatomic) IBOutlet UIBarButtonItem *lockXButton;
 @property (retain, nonatomic) IBOutlet UIBarButtonItem *lockYButton;
+@property (retain, nonatomic) IBOutlet UILabel *seqNumText;
 
 
 - (IBAction)nextSequence:(id)sender;
--- a/TopButtonViewController.mm	Tue Apr 23 18:29:55 2013 +0100
+++ b/TopButtonViewController.mm	Wed Apr 24 17:58:08 2013 +0100
@@ -72,6 +72,7 @@
     ((testApp *)self.theOFAppRef)->seqStartStop(true);
     self.playButton.enabled = false;
     self.pauseButton.enabled = true;
+    self.seqNumText.text = [NSString stringWithFormat:@"%d", ((testApp *)self.theOFAppRef)->currentSequence];
 }
 
 - (IBAction)pausePressed:(id)sender {
@@ -131,6 +132,8 @@
 
 - (IBAction)randomise:(id)sender {
     ((testApp *)self.theOFAppRef)->randomise();
+    int seqNum = ((testApp *)self.theOFAppRef)->nextSequence();
+    self.seqNumText.text = [NSString stringWithFormat:@"%d", seqNum];
 }
 
 - (IBAction)helpPressed:(id)sender {
@@ -143,7 +146,8 @@
 }
 
 - (IBAction)nextSequence:(id)sender {
-    ((testApp *)self.theOFAppRef)->nextSequence();
+    int seqNum = ((testApp *)self.theOFAppRef)->nextSequence();
+    self.seqNumText.text = [NSString stringWithFormat:@"%d", seqNum];
 }
 
 - (IBAction)smoothSwitchChanged:(id)sender {
@@ -179,6 +183,7 @@
     [_savePresetButton release];
     [_lockXButton release];
     [_lockYButton release];
+    [_seqNumText release];
     [super dealloc];
 }
 - (void)viewDidUnload {
@@ -192,6 +197,7 @@
     [self setSavePresetButton:nil];
     [self setLockXButton:nil];
     [self setLockYButton:nil];
+    [self setSeqNumText:nil];
     [super viewDidUnload];
 }
 @end
--- a/TopButtonViewController.xib	Tue Apr 23 18:29:55 2013 +0100
+++ b/TopButtonViewController.xib	Wed Apr 24 17:58:08 2013 +0100
@@ -100,10 +100,11 @@
 								<reference key="IBUIToolbar" ref="358683122"/>
 								<int key="IBUISystemItemIdentifier">20</int>
 							</object>
-							<object class="IBUIBarButtonItem" id="528026433">
+							<object class="IBUIBarButtonItem" id="83739751">
 								<string key="targetRuntimeIdentifier">IBIPadFramework</string>
+								<float key="IBUIWidth">42</float>
 								<reference key="IBUIToolbar" ref="358683122"/>
-								<int key="IBUISystemItemIdentifier">5</int>
+								<int key="IBUISystemItemIdentifier">6</int>
 							</object>
 							<object class="IBUIBarButtonItem" id="180077124">
 								<string key="IBUITitle">Random</string>
@@ -155,6 +156,7 @@
 						<string key="NSFrame">{{59, 11}, {59, 21}}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
+						<reference key="NSNextKeyView" ref="884250103"/>
 						<string key="NSReuseIdentifierKey">_NS:9</string>
 						<bool key="IBUIOpaque">NO</bool>
 						<bool key="IBUIClipsSubviews">YES</bool>
@@ -162,24 +164,45 @@
 						<bool key="IBUIUserInteractionEnabled">NO</bool>
 						<string key="targetRuntimeIdentifier">IBIPadFramework</string>
 						<string key="IBUIText">Smooth</string>
-						<object class="NSColor" key="IBUITextColor">
+						<object class="NSColor" key="IBUITextColor" id="872514910">
 							<int key="NSColorSpace">1</int>
 							<bytes key="NSRGB">MCAwIDAAA</bytes>
 							<string key="IBUIColorCocoaTouchKeyPath">darkTextColor</string>
 						</object>
 						<nil key="IBUIHighlightedColor"/>
 						<int key="IBUIBaselineAdjustment">0</int>
-						<object class="IBUIFontDescription" key="IBUIFontDescription">
+						<object class="IBUIFontDescription" key="IBUIFontDescription" id="1069606170">
 							<int key="type">1</int>
 							<double key="pointSize">17</double>
 						</object>
-						<object class="NSFont" key="IBUIFont">
+						<object class="NSFont" key="IBUIFont" id="1061524627">
 							<string key="NSName">Helvetica</string>
 							<double key="NSSize">17</double>
 							<int key="NSfFlags">16</int>
 						</object>
 						<bool key="IBUIAdjustsFontSizeToFit">NO</bool>
 					</object>
+					<object class="IBUILabel" id="884250103">
+						<reference key="NSNextResponder" ref="766721923"/>
+						<int key="NSvFlags">292</int>
+						<string key="NSFrame">{{337, 11}, {42, 21}}</string>
+						<reference key="NSSuperview" ref="766721923"/>
+						<reference key="NSWindow"/>
+						<reference key="NSNextKeyView"/>
+						<string key="NSReuseIdentifierKey">_NS:9</string>
+						<bool key="IBUIOpaque">NO</bool>
+						<bool key="IBUIClipsSubviews">YES</bool>
+						<int key="IBUIContentMode">7</int>
+						<bool key="IBUIUserInteractionEnabled">NO</bool>
+						<string key="targetRuntimeIdentifier">IBIPadFramework</string>
+						<string key="IBUIText">Num.</string>
+						<reference key="IBUITextColor" ref="872514910"/>
+						<nil key="IBUIHighlightedColor"/>
+						<int key="IBUIBaselineAdjustment">0</int>
+						<reference key="IBUIFontDescription" ref="1069606170"/>
+						<reference key="IBUIFont" ref="1061524627"/>
+						<bool key="IBUIAdjustsFontSizeToFit">NO</bool>
+					</object>
 				</array>
 				<string key="NSFrameSize">{768, 44}</string>
 				<reference key="NSSuperview"/>
@@ -299,6 +322,14 @@
 					<int key="connectionID">57</int>
 				</object>
 				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">seqNumText</string>
+						<reference key="source" ref="841351856"/>
+						<reference key="destination" ref="884250103"/>
+					</object>
+					<int key="connectionID">60</int>
+				</object>
+				<object class="IBConnectionRecord">
 					<object class="IBCocoaTouchEventConnection" key="connection">
 						<string key="label">savePressed:</string>
 						<reference key="source" ref="996249183"/>
@@ -411,8 +442,9 @@
 						<int key="objectID">2</int>
 						<reference key="object" ref="766721923"/>
 						<array class="NSMutableArray" key="children">
+							<reference ref="459236656"/>
 							<reference ref="358683122"/>
-							<reference ref="459236656"/>
+							<reference ref="884250103"/>
 						</array>
 						<reference key="parent" ref="0"/>
 					</object>
@@ -421,7 +453,6 @@
 						<reference key="object" ref="358683122"/>
 						<array class="NSMutableArray" key="children">
 							<reference ref="680653375"/>
-							<reference ref="528026433"/>
 							<reference ref="924591997"/>
 							<reference ref="379344923"/>
 							<reference ref="898331149"/>
@@ -433,6 +464,7 @@
 							<reference ref="1056681435"/>
 							<reference ref="1052071507"/>
 							<reference ref="101764627"/>
+							<reference ref="83739751"/>
 						</array>
 						<reference key="parent" ref="766721923"/>
 					</object>
@@ -467,11 +499,6 @@
 						<reference key="parent" ref="358683122"/>
 					</object>
 					<object class="IBObjectRecord">
-						<int key="objectID">29</int>
-						<reference key="object" ref="528026433"/>
-						<reference key="parent" ref="358683122"/>
-					</object>
-					<object class="IBObjectRecord">
 						<int key="objectID">30</int>
 						<reference key="object" ref="180077124"/>
 						<reference key="parent" ref="358683122"/>
@@ -524,6 +551,16 @@
 						<reference key="object" ref="101764627"/>
 						<reference key="parent" ref="358683122"/>
 					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">58</int>
+						<reference key="object" ref="884250103"/>
+						<reference key="parent" ref="766721923"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">59</int>
+						<reference key="object" ref="83739751"/>
+						<reference key="parent" ref="358683122"/>
+					</object>
 				</array>
 			</object>
 			<dictionary class="NSMutableDictionary" key="flattenedProperties">
@@ -537,7 +574,6 @@
 				<string key="16.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="28.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
-				<string key="29.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="30.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="33.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="35.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
@@ -549,13 +585,15 @@
 				<string key="5.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="54.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="55.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="58.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="59.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="9.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 			</dictionary>
 			<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
 			<nil key="activeLocalization"/>
 			<dictionary class="NSMutableDictionary" key="localizations"/>
 			<nil key="sourceID"/>
-			<int key="maxID">57</int>
+			<int key="maxID">60</int>
 		</object>
 		<object class="IBClassDescriber" key="IBDocument.Classes">
 			<array class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -634,6 +672,7 @@
 						<string key="playButton">UIBarButtonItem</string>
 						<string key="qButton">UIBarButtonItem</string>
 						<string key="savePresetButton">UIBarButtonItem</string>
+						<string key="seqNumText">UILabel</string>
 						<string key="smoothSwitch">UIBarButtonItem</string>
 						<string key="smoothText">UILabel</string>
 						<string key="smoothToggle">UISwitch</string>
@@ -667,6 +706,10 @@
 							<string key="name">savePresetButton</string>
 							<string key="candidateClassName">UIBarButtonItem</string>
 						</object>
+						<object class="IBToOneOutletInfo" key="seqNumText">
+							<string key="name">seqNumText</string>
+							<string key="candidateClassName">UILabel</string>
+						</object>
 						<object class="IBToOneOutletInfo" key="smoothSwitch">
 							<string key="name">smoothSwitch</string>
 							<string key="candidateClassName">UIBarButtonItem</string>
--- a/grid.h	Tue Apr 23 18:29:55 2013 +0100
+++ b/grid.h	Wed Apr 24 17:58:08 2013 +0100
@@ -16,6 +16,7 @@
 #include "presetManager.h"
 #include "hilbert.h"
 
+#define PRESET_INTERP_TIME 90 // frames
 using namespace std;
 class Preset;
 
@@ -23,7 +24,7 @@
     
 public:
     bool snapped;
-    bool automatedMovement;
+    bool automatedMovementInProgress;
     bool presetWasTapped;
     Hilbert hilbert;
     
@@ -33,6 +34,8 @@
     void move(TwoVector moveP); // shift view by pixels
     void zoom(float factor);
 
+    void animateTo(TwoVector point);
+    
     void tap(TwoVector pixel); // user has tapped a point
     
     typedef enum{NO_INTERPOLATION, INTERPOLATE_GRID, INTERPOLATE_PRESET} interpolateModeType;
@@ -41,7 +44,7 @@
     void shiftCentreToSnapped();
     void draw();  
 
-    void update(); // change according to zoom
+    void update(); // only called if animating
     double interpLevel;
     int smallestGridSpacing; // number of pixels when small grid dissappears from view
     vector<int> getParams();
@@ -51,6 +54,10 @@
     void setMaxZoom();
     void setInterpolation(interpolateModeType mode);
     
+    void startInterpolatedAnimation(TwoVector endCoordinate);
+
+
+    
     Preset * getClosestPresetOf(vector<Preset *> closePresets);
     void interpolateTo(TwoVector coord);
     // HILBERT now does each coord for this
@@ -68,6 +75,12 @@
     // experimental
     void changeNumberOfParamsPerDim();
 private:
+    int framesRemaining;
+    
+    vector<int> startInterpParams;
+    vector<int> endInterpParams;
+    TwoVector endInterpCoord;
+    
     void drawGridLines();
     double scale;        // surface units per pixel GUI
 
@@ -108,7 +121,7 @@
     
     void setCoord(TwoVector coord);
     void drawCrossHairs();
-    
+    void continueInterpolatedAnimation();
     
     double calculateInterpolateLevel();
     vector<int> interpVector(vector<int> upper, vector<int> lower, float frac);
--- a/grid.mm	Tue Apr 23 18:29:55 2013 +0100
+++ b/grid.mm	Wed Apr 24 17:58:08 2013 +0100
@@ -428,7 +428,9 @@
 }
  //--------------------------------------------------------------
 void Grid::update(){  // ?
-
+    if(automatedMovementInProgress){
+        continueInterpolatedAnimation();
+    }
 
 }
 //--------------------------------------------------------------
@@ -449,9 +451,9 @@
             cout << "DOUBLE tapped preset: " << tappedPreset->name << "\n";
             
             //TODO interpolate to this! exciting!
-            setCoord(tappedPreset->coordinates); // should just go there and do all the calcs
-            ((testApp *)ofGetAppPtr())->setAllGUISliders(getParams());
-            eventLogger.logEvent(PRESET_DOUBLE_TAPPED, getCoord(), scale);
+
+            startInterpolatedAnimation(tappedPreset->coordinates);
+            eventLogger.logEvent(PRESET_DOUBLE_TAPPED, tappedPreset->coordinates, scale);
             
                                 
         }
@@ -461,7 +463,51 @@
         // nothing ?
     }
 }
+//-----------------
 
+void Grid::startInterpolatedAnimation(TwoVector endCoordinate){
+    automatedMovementInProgress = true;
+
+    framesRemaining = PRESET_INTERP_TIME;
+    
+    startInterpParams = calculateParamsFromCoord(centre);
+    endInterpParams = calculateParamsFromCoord(endCoordinate);
+    endInterpCoord = endCoordinate;
+}
+//-----------------
+void Grid::continueInterpolatedAnimation(){
+
+    framesRemaining--;
+    if(framesRemaining <= 0){
+        //finished
+        // set position to preset
+        centre = endInterpCoord;
+        
+        //will do snapping and checking
+        viewWasChanged();
+        // update all the sliders and shit
+
+        ((testApp *)ofGetAppPtr())->setAllGUISliders(getParams());
+        // set flag in testapp
+        automatedMovementInProgress = false;
+        return;
+    }
+    // calculate next step
+    TwoVector moveVector = (endInterpCoord - centre)*(1/(float)framesRemaining);
+    
+    centre = centre + moveVector;
+    topLeft.x = centre.x - size.x/2;
+    topLeft.y = centre.y - size.y/2;
+    
+    float frac = (float)framesRemaining/(float)PRESET_INTERP_TIME;
+    
+    vector<int> currentParams = interpVector( startInterpParams,endInterpParams, frac);
+    
+    ((testApp *)ofGetAppPtr())->setAllGUISliders(currentParams);
+    
+    eventLogger.logEvent(SCROLL,getCoord(),getScale());
+    
+}
 //--------------------------------------------------------------
 
 void Grid::move(TwoVector moveP){
@@ -479,6 +525,17 @@
     
 }
 //--------------------------------------------------------------
+// move the grid to a point (coordinate rather than pixel value) without triggering calculations
+void Grid::animateTo(TwoVector point){
+    
+    centre = point;
+    topLeft.x = centre.x - size.x/2;
+    topLeft.y = centre.y - size.y/2;
+    
+    eventLogger.logEvent(SCROLL, getCoord(), scale); // TODO not *really* a user scroll...
+    
+}
+//--------------------------------------------------------------
 void Grid::zoom(float factor){
     if(snapped)centre = (centre + snapCentre)*0.5; // clunky
     
@@ -515,7 +572,8 @@
     // TODO just in case we're freezing something
     // snapping actually change centre
     centre = snapCentre;
-    
+    topLeft.x = centre.x - size.x/2;
+    topLeft.y = centre.y - size.y/2;
 }
 //--------------------------------------------------------------
 Preset * Grid::getClosestPresetOf(vector<Preset *> somepresets){
--- a/presetManager.h	Tue Apr 23 18:29:55 2013 +0100
+++ b/presetManager.h	Wed Apr 24 17:58:08 2013 +0100
@@ -15,6 +15,7 @@
 
 #define PRESET_FILENAME "presets.json"
 #define PILOT_PRESET_FILENAME "pilot_presets.json"
+#define FACTORY_PRESET_FILENAME "factory_presets.json"
 
 #include <iostream>
 #include <string>
@@ -40,11 +41,11 @@
     vector<ofColor> pixVals; // hmmm
     TwoVector       coordinates;  // position on grid
     vector<int>     params;         // actual parameters???
-    int whichSequence;
-    // not so important - not uploaded
+    unsigned int whichSequence; // the sequence number that this preset was saved with. 
+
     
     // from save button press
-    Preset(TwoVector acoord, string aname,int aID, string un, unsigned int uid){
+    Preset(TwoVector acoord, string aname,int aID, string un, unsigned int uid, unsigned int sequence){
         coordinates = acoord;
         name = aname;
         creatorUserName = un;
@@ -54,7 +55,7 @@
 
         cout << "Create preset sys time: " << creationTime << "\n";
         pixVals = makePresetPicture(coordinates);
-        //whichSequence = seq;
+        whichSequence = sequence;
     
     };
     // from json value
@@ -66,16 +67,17 @@
         coordinates.x = jval["coordinates"].get("x", 0.0).asFloat();
         coordinates.y = jval["coordinates"].get("y", 0.0).asFloat();
         creationTime = jval["creationTime"].asLargestInt(); // dodgy?
+        whichSequence = jval["whichSequence"].asUInt();
         pixVals = makePresetPicture(coordinates);
 
-    }
+    };
     // from preset file load
-    Preset(TwoVector acoord, string aname,int aID, long long stime){
+    Preset(TwoVector acoord, string aname,int aID, long long stime, unsigned int seq){
         coordinates = acoord;
         name = aname;
         creationTime = stime;
         pixVals = makePresetPicture(coordinates);
-        
+        whichSequence = seq;
     };
     
     // from download request??
@@ -90,7 +92,7 @@
         NSString *dateText = [ocdate description];
         const char *date_str = [dateText cStringUsingEncoding:NSASCIIStringEncoding];
         stringstream ss;
-        ss << "Name: \t" << name << "\nCreation time: \t" << date_str << "\nCreator: \t" << creatorUserName << '\n';
+        ss << "Name: \t" << name << "\nCreation time: \t" << date_str << "\nCreator: \t" << creatorUserName << '\n' << "\nSequence: \t" << whichSequence << '\n';
         return ss.str();
         
     }
@@ -109,8 +111,7 @@
     vector<Preset> thePresets; 
     
     int addPreset(string name);
-    int loadPreset(const TwoVector coord, const string name, long long stime);
-    
+
     TwoVector recallPreset(int presetID); // by name ? id?
     TwoVector recallPreset(string name); // by name ? id?
     vector<Preset *>  getPresetsInRange(TwoVector min, TwoVector max);
@@ -127,43 +128,5 @@
     void saveSessionToFile(string userName);
 };
 
-
-//---------------------------------------------------------------------------
-// this is the function that 'saves' a single preset as formatted text
-// replaced with presetToJson
-inline ostream& operator<<(ostream & os, const Preset& p){
-    os.setf(ios_base::fixed,ios_base::floatfield);
-    os.precision(1);
-    
-    // change this to JSON
-    
-    os << p.creationTime << p.coordinates.x << ',' << p.coordinates.y << '\n';
-    
-    return os;
-}
-    
-//---------------------------------------------------------------------------
-// this is the function that 'reads' all presets as formatted text
-    // replaced with jsonFromPreset or somesuch
-    inline istream& operator>>(istream & is, PresetManager& p)
-    {
-        //um
-        string pname = "BLANK";
-        char delim;
-        double px, py;
-        long long stime;
-        
-        
-        is.setf(ios_base::fixed,ios_base::floatfield);
-        is.precision(1);
-        
-        is >> stime >> delim >> px >> delim >> py;
-        if(!is){
-            return(is);
-        }
-        TwoVector pcoord(px,py);
-        p.loadPreset(pcoord, pname, stime);
-        return(is);
-    }
     
 #endif /* defined(__oscSenderExample__presetManager__) */
--- a/presetManager.mm	Tue Apr 23 18:29:55 2013 +0100
+++ b/presetManager.mm	Wed Apr 24 17:58:08 2013 +0100
@@ -86,6 +86,7 @@
     presetVal["name"] =             name;
     presetVal["coordinates"]["x"] = coordinates.x;
     presetVal["coordinates"]["y"] = coordinates.y;
+    presetVal["whichSequence"] = whichSequence;
     
     
     return presetVal;
@@ -205,7 +206,7 @@
     TwoVector coord = theGridView.getCoordForPresetSave();
     
     
-    thePresets.push_back(Preset(coord, name,nextID, eventLogger.userName, eventLogger.deviceID));
+    thePresets.push_back(Preset(coord, name,nextID, eventLogger.userName, eventLogger.deviceID, ((testApp*)ofGetAppPtr())->currentSequence));
     eventLogger.logEvent(SAVE_PRESET, coord);
     // poke grid view to get it to show details
     theGridView.snapCheck();
@@ -214,14 +215,6 @@
 }
 
 //---------------------------------------------------------------------------
-
-int PresetManager::loadPreset(const TwoVector coord, const string name, long long stime){
-    thePresets.push_back(Preset(coord, name,nextID, stime));
-   
-     // if ok
-    return nextID++;
-}
-//---------------------------------------------------------------------------
 vector<Preset *> PresetManager::getPresetsInRange(const TwoVector min, const TwoVector max){
     //return all the coordinates. oh and names (displayed at certain scales?).
     
@@ -261,7 +254,7 @@
     string fname = ofxiPhoneGetDocumentsDirectory() + PRESET_FILENAME;
     readJsonToPresets(fname);
     
-    string fullpath = ofFilePath::getAbsolutePath(ofToDataPath(PILOT_PRESET_FILENAME));
+    string fullpath = ofFilePath::getAbsolutePath(ofToDataPath(FACTORY_PRESET_FILENAME));
 	string file = ofFilePath::getFileName(fullpath);
 	string folder = ofFilePath::getEnclosingDirectory(fullpath);
 
--- a/testApp.h	Tue Apr 23 18:29:55 2013 +0100
+++ b/testApp.h	Wed Apr 24 17:58:08 2013 +0100
@@ -44,8 +44,10 @@
     bool sendMIDIAndOSC;
     int midiChannel;
     int midiOffset;
-    
+    bool animatingGrid;
+    bool allowAnimation;
     interfaceType whichInterfaceShowing;
+    interfaceType previousInterface;
     BottomTabViewController *bottomTabViewController;
     UsernameAlertViewController *usernameAlertViewController;
     HelpViewController *helpViewController;
@@ -96,7 +98,6 @@
     void initialiseGUIs();
     void initialiseMIDI();
 
-    
     float getWidth();
     float getHeight();
     
@@ -139,7 +140,7 @@
     // shortcut function for testing
     void justStart();
     void loadSequences();
-    void nextSequence();
+    int nextSequence();
     
     void setupBottomGui();
     void bottomGuiEvent();
--- a/testApp.mm	Tue Apr 23 18:29:55 2013 +0100
+++ b/testApp.mm	Wed Apr 24 17:58:08 2013 +0100
@@ -12,6 +12,8 @@
 const string sliderParamNames[10] = {"Transpose", "1/4 note","1/6 note","1/7 note","1/8 note","Waveform", "Filter Type","Filter Freq", "Envelope","FM amt"};
 //const vector<const string> v(ra[0],ra[1]);
 
+// really GUI and all that stuff should be somewhere else
+
 //--------------------------------------------------------------
 void testApp::setup(){
     
@@ -24,6 +26,12 @@
     
 	int ticksPerBuffer = 8;	// 8 * 64 = buffer len of 512
 	core.setup(2, 1, 44100, ticksPerBuffer);
+    // send to PD
+    List toPD;
+    toPD.addSymbol("smoothing");
+    toPD.addFloat(70); // rounding here??
+    core.pd.sendList("fromOF", toPD);
+    //cout << ctrlName[i] << "sending" << ctrlout[i] << "\n";
     
 	// setup OF sound stream
 	ofSoundStreamSetup(2, 1, this, 44100, ofxPd::blockSize()*ticksPerBuffer, 3);
@@ -43,10 +51,11 @@
     
     // now do things that will affect the start up state of the app
     
-    if(true){
-    // if(eventLogger.questionnaireCompleted){ // then we go into do-what-you-like mode
+    //if(true){
+    if(eventLogger.questionnaireCompleted){ // then we go into do-what-you-like mode
         
         freeUseMode();
+        randomise();
     }else{
         // then we're in timed session mode
         showIntro();
@@ -62,9 +71,10 @@
 
 //DeviceID3523537000
 void testApp::initialiseVariables(){
+    animatingGrid = false;
     paused = true;
     sendMIDIAndOSC = false;
-    
+    allowAnimation = false;
     ofBackground( 0, 0, 0 );
     ofEnableAlphaBlending();
     currentSequence = 0;
@@ -328,6 +338,7 @@
     [topButtonViewController enableSmoothSwitch:(id)this];
     
     sendMIDIAndOSC = true;
+    allowAnimation = true;
 }
 //--------------------------------------------------------------
 void testApp::setInterp(int state){
@@ -365,7 +376,7 @@
         eventLogger.consentGiven = true;
         //
         // clear presets?
-        presetManager.clearAll();
+        //presetManager.clearAll();
         // show username prompt
         [usernameAlertViewController showUserNamePrompt];
         // reset top buttons
@@ -493,6 +504,9 @@
 void testApp::setAllGUISliders(vector<int> vals){
 
     // an update caused by zoomer view being moved
+    // can be called by theGridView or testApp
+    // casues PD and midi to be sent
+    
     for(int i = 0; i<NUM_PARAMS;i++){
         //sliders[i]->setValue(vals[i]);
         sliderVals[i] = vals[i];
@@ -528,24 +542,27 @@
 }
 //--------------------------------------------------------------
 void testApp::showHelp(){
+    previousInterface = whichInterfaceShowing;
     whichInterfaceShowing = HELP;
     seqStartStop(false);
     [topButtonViewController pausePressed:(id)this];
     helpViewController.view.hidden = NO;
     eventLogger.logEvent(HELP_PRESSED);
+    
 }
 void testApp::helpHidden(){
-    whichInterfaceShowing = BOTH;
+    whichInterfaceShowing = previousInterface;
     // start seq?
     
 }
 //--------------------------------------------------------------
-void testApp::nextSequence(){
+int testApp::nextSequence(){
     currentSequence++;
     if(currentSequence >= sequences.size()){
         currentSequence = 0;
     }
     sendParametersToPD();
+    return currentSequence;
 }
 //--------------------------------------------------------------
 //--------------------------------------------------------------
@@ -685,6 +702,11 @@
     
     if(paused) return;
     
+    if(theGridView.automatedMovementInProgress){
+        theGridView.update();
+        return;
+    }
+    
     if(ofxiPhoneExternalDisplay::isExternalScreenConnected()){
         if(!ofxiPhoneExternalDisplay::isMirroring()){
             ofxiPhoneExternalDisplay::mirrorOn();
@@ -692,6 +714,10 @@
         }
     }
     
+    if(animatingGrid){
+        // theGrid
+
+    }
     // continiue to move or zoom at velocity, unless snapped
     
     if (numActiveTouches == 0){ // no touches, use momentum
@@ -731,7 +757,6 @@
     }
     
 }
-
 //--------------------------------------------------------------
 
 void testApp::draw(){
@@ -760,7 +785,10 @@
 
 //--------------------------------------------------------------
 void testApp::touchDown(ofTouchEventArgs &touch){
-    
+    if(theGridView.automatedMovementInProgress) return;
+    if(whichInterfaceShowing == SLIDERS){
+        return;
+    }
     numActiveTouches++;
     preventingMovePostScroll = false;
     tapFlag = false; // unless touch 0
@@ -793,6 +821,11 @@
 
 //--------------------------------------------------------------
 void testApp::touchMoved(ofTouchEventArgs &touch){
+    if(theGridView.automatedMovementInProgress) return;
+    if(whichInterfaceShowing == SLIDERS){
+        return;
+    }
+    
     tapFlag = false;
     // which one? keep track of each touch point
     if(touch.id == 0){
@@ -817,6 +850,10 @@
 
 //--------------------------------------------------------------
 void testApp::touchUp(ofTouchEventArgs &touch){
+    if(theGridView.automatedMovementInProgress) return;
+    if(whichInterfaceShowing == SLIDERS){
+        return;
+    }
     if(numActiveTouches > 0) numActiveTouches--; // dirty
     preventingMovePostScroll = false;
     // TODO check if in gui area!!!
@@ -828,6 +865,7 @@
     if(tapFlag){
         cout << "TAP!!\n";
         // look for close preset
+    
         theGridView.tap(TwoVector(touch.x,touch.y));
     }
     tapFlag = false;