diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e5d18f8 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "link"] + path = AbletonLink-vvvv/link + url = git://github.com/Ableton/link.git diff --git a/AbletonLinkDLL/AbletonLinkDLL.cpp b/AbletonLinkDLL/AbletonLinkDLL.cpp index 57b585e..d00f284 100644 --- a/AbletonLinkDLL/AbletonLinkDLL.cpp +++ b/AbletonLinkDLL/AbletonLinkDLL.cpp @@ -61,6 +61,31 @@ extern "C" { link->enable(bEnable); } + + void startPlaying(void* ptr) + { + MyAbletonLink* link = static_cast(ptr); + link->startPlaying(); + } + + void stopPlaying(void* ptr) + { + MyAbletonLink* link = static_cast(ptr); + link->stopPlaying(); + } + + bool isPlaying(void* ptr) + { + MyAbletonLink* link = static_cast(ptr); + return link->isPlaying(); + } + + void enableStartStopSync(void* ptr, bool bEnable) + { + MyAbletonLink* link = static_cast(ptr); + link->enableStartStopSync(bEnable); + } + int numPeers(void* ptr) { MyAbletonLink* link = static_cast(ptr); diff --git a/AbletonLinkDLL/AbletonLinkDLL.h b/AbletonLinkDLL/AbletonLinkDLL.h index 77da458..ff6e71a 100644 --- a/AbletonLinkDLL/AbletonLinkDLL.h +++ b/AbletonLinkDLL/AbletonLinkDLL.h @@ -13,9 +13,6 @@ - - - extern "C" { @@ -34,6 +31,11 @@ extern "C" { bool ABLETONLINKDLL_API isEnabled(void* ptr); void ABLETONLINKDLL_API enable(void* ptr, bool bEnable); + void ABLETONLINKDLL_API startPlaying(void* ptr); + void ABLETONLINKDLL_API stopPlaying(void* ptr); + bool ABLETONLINKDLL_API isPlaying(void* ptr); + void ABLETONLINKDLL_API enableStartStopSync(void* ptr, bool bEnable); + int ABLETONLINKDLL_API numPeers(void* ptr); void ABLETONLINKDLL_API update(void* ptr, double* rbeat, double* rphase); diff --git a/AbletonLinkDLL/AbletonLinkDLL.vcxproj b/AbletonLinkDLL/AbletonLinkDLL.vcxproj index a585c57..dd9aef8 100644 --- a/AbletonLinkDLL/AbletonLinkDLL.vcxproj +++ b/AbletonLinkDLL/AbletonLinkDLL.vcxproj @@ -22,7 +22,7 @@ {7AE17C11-1B9A-4773-89B7-48637DB8D55F} Win32Proj AbletonLinkDLL - 8.1 + 10.0.15063.0 @@ -75,12 +75,14 @@ true + C:\Users\Lukas\Documents\vvvv\AbletonLink-vvvv\AbletonLinkDLL\link\modules\asio-standalone\asio\include;C:\Users\Lukas\Documents\vvvv\AbletonLink-vvvv\AbletonLinkDLL\link\include;$(IncludePath) false false + C:\Users\Lukas\Documents\vvvv\AbletonLink-vvvv\AbletonLinkDLL\link\modules\asio-standalone\asio\include;C:\Users\Lukas\Documents\vvvv\AbletonLink-vvvv\AbletonLinkDLL\link\include;$(IncludePath) diff --git a/AbletonLinkDLL/MyAbletonLink.cpp b/AbletonLinkDLL/MyAbletonLink.cpp index 551973d..9360015 100644 --- a/AbletonLinkDLL/MyAbletonLink.cpp +++ b/AbletonLinkDLL/MyAbletonLink.cpp @@ -51,10 +51,11 @@ void MyAbletonLink::setTempo(double bpm){ if (link == nullptr){ return; } - auto timeline = link->captureAppTimeline(); + auto state = link->captureAppSessionState(); + const auto time = link->clock().micros(); - timeline.setTempo(bpm, time); - link->commitAppTimeline(timeline); + state.setTempo(bpm, time); + link->commitAppSessionState(state); } @@ -62,7 +63,7 @@ double MyAbletonLink::tempo(){ if(link == nullptr){ return 0.0; } - return link->captureAppTimeline().tempo(); + return link->captureAppSessionState().tempo(); } void MyAbletonLink::setQuantum(double quantum){ @@ -85,8 +86,48 @@ void MyAbletonLink::enable(bool bEnable){ return; } link->enable(bEnable); + +} + + + +void MyAbletonLink::enableStartStopSync(bool bEnable) { + if (link == nullptr) { + return; + } + link->enableStartStopSync(bEnable); + +} + +void MyAbletonLink::startPlaying() { + if (link == nullptr) { + return; + } + auto state = link->captureAppSessionState(); + + state.setIsPlaying(true, link->clock().micros()); + link->commitAppSessionState(state); + +} + +void MyAbletonLink::stopPlaying() { + if (link == nullptr) { + return; + } + auto state = link->captureAppSessionState(); + + state.setIsPlaying(false, link->clock().micros()); + link->commitAppSessionState(state); + } +bool MyAbletonLink::isPlaying() +{ + return link->captureAppSessionState().isPlaying(); +} + + + std::size_t MyAbletonLink::numPeers(){ if(link == nullptr){ return 0; @@ -100,7 +141,7 @@ MyAbletonLink::Status MyAbletonLink::update(){ return status; } const auto time = link->clock().micros(); - auto timeline = link->captureAppTimeline(); + auto timeline = link->captureAppSessionState(); status.beat = timeline.beatAtTime(time, quantum_); status.phase = timeline.phaseAtTime(time, quantum_); return status; diff --git a/AbletonLinkDLL/MyAbletonLink.h b/AbletonLinkDLL/MyAbletonLink.h index 9d197ee..43f22a8 100644 --- a/AbletonLinkDLL/MyAbletonLink.h +++ b/AbletonLinkDLL/MyAbletonLink.h @@ -68,6 +68,10 @@ class MyAbletonLink { bool isEnabled() const; void enable(bool bEnable); + void startPlaying(); + void stopPlaying(); + bool isPlaying(); + void enableStartStopSync(bool bEnable); std::size_t numPeers(); diff --git a/AbletonLinkDLL/link b/AbletonLinkDLL/link index 7544606..15024b4 160000 --- a/AbletonLinkDLL/link +++ b/AbletonLinkDLL/link @@ -1 +1 @@ -Subproject commit 7544606821026740e017fe762e62d964cf3129e3 +Subproject commit 15024b45eb3858104c5e90d3a3172c84b803596b diff --git a/Sync,AbletonValueLink.csproj b/Sync,AbletonValueLink.csproj index 461bda9..c9e0c0b 100644 --- a/Sync,AbletonValueLink.csproj +++ b/Sync,AbletonValueLink.csproj @@ -58,7 +58,6 @@ false - packages\VVVV.System.ComponentModel.Composition.Codeplex.2.5.0\lib\net40\System.ComponentModel.Composition.CodePlex.dll @@ -67,12 +66,12 @@ - packages\VVVV.Core.35.8.0-develop-2695\lib\net46\VVVV.Core.dll + packages\VVVV.Core.35.8.0\lib\net46\VVVV.Core.dll False - packages\VVVV.Utils.35.8.0-develop-2695\lib\net46\VVVV.Utils.dll + packages\VVVV.Utils.35.8.0\lib\net46\VVVV.Utils.dll False @@ -82,7 +81,15 @@ - + + Designer + + + + + {7ae17c11-1b9a-4773-89b7-48637db8d55f} + AbletonLinkDLL + @@ -91,10 +98,10 @@ - - + + - - + + \ No newline at end of file diff --git a/SyncAbletonLinkValueNode.cs b/SyncAbletonLinkValueNode.cs index d43e8a5..0c0502d 100644 --- a/SyncAbletonLinkValueNode.cs +++ b/SyncAbletonLinkValueNode.cs @@ -26,6 +26,15 @@ public class SyncAbletonLinkValueNode : IPluginEvaluate, IDisposable [Input("Set Tempo", IsBang = true)] public IDiffSpread FSetTempoIn; + [Input("Start Playing", IsBang = true)] + public IDiffSpread FStartPlay; + + [Input("Stop Playing", IsBang = true)] + public IDiffSpread FStopPlay; + + [Input("StartStopSync")] + public IDiffSpread FEnableStartStopSync; + [Input("Reset", IsBang = true)] public IDiffSpread FResetIn; @@ -44,6 +53,9 @@ public class SyncAbletonLinkValueNode : IPluginEvaluate, IDisposable [Output("Peers")] public ISpread FPeersOut; + [Output("IsPlaying")] + public ISpread FIsPlayingOut; + [Import()] public ILogger FLogger; @@ -75,6 +87,19 @@ public void Evaluate(int SpreadMax) if (FSetTempoIn[0]) AbletonLink.Instance.setTempo(FbpmIn[0]); + if (FEnableStartStopSync.IsChanged) + { + AbletonLink.Instance.enableStartStopSync(FEnableStartStopSync[0]); + } + + if(FEnableStartStopSync[0]) + { + if (FStartPlay[0]) + AbletonLink.Instance.startPlaying(); + if (FStopPlay[0]) + AbletonLink.Instance.stopPlaying(); + } + double beat; double phase; AbletonLink.Instance.update(out beat, out phase); @@ -84,6 +109,7 @@ public void Evaluate(int SpreadMax) FPeersOut[0] = AbletonLink.Instance.numPeers(); FbpmOut[0] = AbletonLink.Instance.tempo(); + FIsPlayingOut[0] = AbletonLink.Instance.isPlaying(); } @@ -192,7 +218,35 @@ public void enable(bool bEnable) enable(nativeInstance, bEnable); } - [DllImport ("AbletonLinkDLL")] + [DllImport("AbletonLinkDLL")] + private static extern void enableStartStopSync(IntPtr ptr, bool bEnable); + public void enableStartStopSync(bool bEnable) + { + enableStartStopSync(nativeInstance, bEnable); + } + + [DllImport("AbletonLinkDLL")] + private static extern void startPlaying(IntPtr ptr); + public void startPlaying() + { + startPlaying(nativeInstance); + } + + [DllImport("AbletonLinkDLL")] + private static extern void stopPlaying(IntPtr ptr); + public void stopPlaying() + { + stopPlaying(nativeInstance); + } + + [DllImport("AbletonLinkDLL")] + private static extern bool isPlaying(IntPtr ptr); + public bool isPlaying() + { + return isPlaying(nativeInstance); + } + + [DllImport ("AbletonLinkDLL")] private static extern int numPeers(IntPtr ptr); public int numPeers() { diff --git a/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache index 49c4387..1e691e2 100644 Binary files a/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache and b/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/obj/Debug/Sync,AdobeValueLink.dll b/obj/Debug/Sync,AdobeValueLink.dll index 7d4884f..3920eec 100644 Binary files a/obj/Debug/Sync,AdobeValueLink.dll and b/obj/Debug/Sync,AdobeValueLink.dll differ diff --git a/obj/Debug/Sync,AdobeValueLink.pdb b/obj/Debug/Sync,AdobeValueLink.pdb index 80799b3..043ce0f 100644 Binary files a/obj/Debug/Sync,AdobeValueLink.pdb and b/obj/Debug/Sync,AdobeValueLink.pdb differ diff --git a/packages.config b/packages.config index 6d1ade9..7f90c7d 100644 --- a/packages.config +++ b/packages.config @@ -1,9 +1,9 @@  - - + + - - + + \ No newline at end of file