From 890a9101377c29646e46589d93cc13f481f75340 Mon Sep 17 00:00:00 2001 From: Mike Solomon Date: Mon, 20 Dec 2021 16:29:46 -0800 Subject: [PATCH] Adds Lt constraint --- src/WAGS/Change.purs | 10 ++++++---- src/WAGS/Create.purs | 3 ++- src/WAGS/Create/Optionals.purs | 4 ++-- src/WAGS/Interpret.purs | 6 +++--- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/WAGS/Change.purs b/src/WAGS/Change.purs index aa4199dd..ddc98b9c 100644 --- a/src/WAGS/Change.purs +++ b/src/WAGS/Change.purs @@ -5,7 +5,8 @@ import Prelude import Control.Comonad (extract) import Data.Symbol (class IsSymbol, reflectSymbol) import Data.Tuple.Nested ((/\), type (/\)) -import Data.Typelevel.Num (class Pos) +import Data.Typelevel.Num (class Lt, class Pos, D1) +import Data.Variant.Maybe (Maybe, just, maybe, nothing) import Data.Vec as V import Prim.Row as R import Prim.RowList (class RowToList, RowList) @@ -22,7 +23,6 @@ import WAGS.Graph.Graph (Graph) import WAGS.Graph.Node (NodeC) import WAGS.Graph.Oversample (class IsOversample, reflectOversample) import WAGS.Graph.Paramable (class Paramable, paramize, class OnOffable, onOffIze) -import Data.Variant.Maybe(Maybe, just, maybe, nothing) import WAGS.Graph.Parameter (class MM, AudioParameter, AudioParameter_, mm) import WAGS.Interpret (class AudioInterpret, AsSubgraph, setAnalyserNodeCb, setAttack, setAudioWorkletParameter, setBuffer, setBufferOffset, setConvolverBuffer, setDelay, setFrequency, setGain, setInput, setKnee, setLoopEnd, setLoopStart, setMediaRecorderCb, setOffset, setOnOff, setPan, setPeriodicOsc, setPeriodicOscV, setPlaybackRate, setQ, setRatio, setRelease, setSubgraph, setThreshold, setTumult, setWaveShaperCurve, unAsSubGraph) import WAGS.Rendered (Oversample, RealImg(..)) @@ -267,6 +267,7 @@ instance changeVec :: ( R.Cons ptr tau' ignore graph , Detup tau' tau , Monoid tau + , Lt D1 size , OneShotChange tau (V.Vec size Number /\ V.Vec size Number) au , Change' ptr au graph ) => @@ -717,6 +718,7 @@ instance canBeChangedWaveformV :: ( IsSymbol ptr , R.Cons ptr tau' ignore graph , Detup tau' tau + , Lt D1 size , Waveformable tau ) => CanBeChanged "waveform" (V.Vec size Number /\ V.Vec size Number) ptr graph where @@ -1528,13 +1530,13 @@ instance oneShotChangePeriodicOscOO :: OneShotChange CTOR.TPeriodicOsc APOnOff ( instance oneShotChangePeriodicOscProxy :: OneShotChange CTOR.TPeriodicOsc BrowserPeriodicWave (CTOR.PeriodicOsc (Maybe BrowserPeriodicWave) (Maybe APOnOff) (Maybe AudioParameter)) where oneShotChange _ osc = CTOR.PeriodicOsc (just osc) nothing nothing -instance oneShotChangePeriodicOscVec :: OneShotChange CTOR.TPeriodicOsc (V.Vec size Number /\ V.Vec size Number) (CTOR.PeriodicOsc (Maybe (V.Vec size Number /\ V.Vec size Number)) (Maybe APOnOff) (Maybe AudioParameter)) where +instance oneShotChangePeriodicOscVec :: Lt D1 size => OneShotChange CTOR.TPeriodicOsc (V.Vec size Number /\ V.Vec size Number) (CTOR.PeriodicOsc (Maybe (V.Vec size Number /\ V.Vec size Number)) (Maybe APOnOff) (Maybe AudioParameter)) where oneShotChange _ osc = CTOR.PeriodicOsc (just osc) nothing nothing class ChangePeriodicOsc a where setPosc :: forall audio engine. AudioInterpret audio engine => String -> a -> audio -> engine -instance changePeriodicOscV :: ChangePeriodicOsc (V.Vec size Number /\ V.Vec size Number) where +instance changePeriodicOscV :: Lt D1 size => ChangePeriodicOsc (V.Vec size Number /\ V.Vec size Number) where setPosc s a = setPeriodicOscV { id: s, realImg: a # \(real /\ img) -> RealImg { real: V.toArray real, img: V.toArray img } } instance changePeriodicOscS :: ChangePeriodicOsc BrowserPeriodicWave where diff --git a/src/WAGS/Create.purs b/src/WAGS/Create.purs index 1903e0d8..3f0f2ca3 100644 --- a/src/WAGS/Create.purs +++ b/src/WAGS/Create.purs @@ -7,7 +7,7 @@ import Data.Functor (voidRight) import Data.Symbol (class IsSymbol, reflectSymbol) import Data.Tuple (Tuple) import Data.Tuple.Nested ((/\), type (/\)) -import Data.Typelevel.Num (class Nat, class Pos, toInt') +import Data.Typelevel.Num (class Lt, class Nat, class Pos, D1, toInt') import Data.Vec as V import Foreign.Object (Object) import Foreign.Object as Object @@ -799,6 +799,7 @@ instance createPeriodicOsc :: instance createPeriodicOsc2 :: ( IsSymbol ptr , Paramable argA + , Lt D1 a , R.Lacks ptr graphi , OnOffable onOff , R.Cons ptr (NodeC CTOR.TPeriodicOsc {}) graphi grapho diff --git a/src/WAGS/Create/Optionals.purs b/src/WAGS/Create/Optionals.purs index 54498b0e..bbfdc262 100644 --- a/src/WAGS/Create/Optionals.purs +++ b/src/WAGS/Create/Optionals.purs @@ -7,7 +7,7 @@ import ConvertableOptions (class ConvertOption, class ConvertOptionsWithDefaults import Data.Symbol (class IsSymbol) import Data.Tuple (Tuple(..)) import Data.Tuple.Nested ((/\), type (/\)) -import Data.Typelevel.Num (class Nat, class Pos) +import Data.Typelevel.Num (class Lt, class Nat, class Pos, D1) import Data.Vec as V import Simple.JSON as JSON import Type.Row.Homogeneous (class Homogeneous) @@ -697,7 +697,7 @@ class CanBeCoercedToPeriodicOsc (canBeCoercedToPeriodicOsc :: Type) instance canBeCoercedToPeriodicOscProxy :: CanBeCoercedToPeriodicOsc BrowserPeriodicWave -instance canBeCoercedToPeriodicOscV :: CanBeCoercedToPeriodicOsc (V.Vec size Number /\ V.Vec size Number) +instance canBeCoercedToPeriodicOscV :: Lt D1 size => CanBeCoercedToPeriodicOsc (V.Vec size Number /\ V.Vec size Number) data PeriodicOsc = PeriodicOsc diff --git a/src/WAGS/Interpret.purs b/src/WAGS/Interpret.purs index c5168d60..0750e273 100644 --- a/src/WAGS/Interpret.purs +++ b/src/WAGS/Interpret.purs @@ -134,9 +134,10 @@ import Data.Set as Set import Data.Symbol (class IsSymbol, reflectSymbol) import Data.Tuple (fst, snd) import Data.Tuple.Nested (type (/\), (/\)) -import Data.Typelevel.Num (class Nat, class Pos) +import Data.Typelevel.Num (class Lt, class Nat, class Pos, D1) import Data.Typelevel.Undefined (undefined) import Data.Variant (match) +import Data.Variant.Maybe (fromMaybe, isJust, isNothing, maybe) import Data.Vec (Vec) import Data.Vec as V import Data.Vec as Vec @@ -151,7 +152,6 @@ import Unsafe.Coerce (unsafeCoerce) import WAGS.Control.Types (Frame0, SubScene(..), oneSubFrame) import WAGS.Graph.AudioUnit (APOnOff, OnOff) import WAGS.Graph.Parameter (AudioParameter, AudioParameter_(..)) -import Data.Variant.Maybe (fromMaybe, isJust, isNothing, maybe) import WAGS.Graph.Worklet (AudioWorkletNodeRequest, AudioWorkletNodeResponse) import WAGS.Rendered (AudioWorkletNodeOptions_(..), Instruction, Oversample, RealImg(..)) import WAGS.Rendered as R @@ -304,7 +304,7 @@ foreign import renderAudio :: Array (Effect Unit) -> Effect Unit -- | Given an audio context, a vector of real parts of complex numbers, and a vector of imaginary parts of complex numbers, build a periodic wave interpretable by the Web Audio API. makePeriodicWave :: forall len - . Pos len + . Lt D1 len => WebAPI.AudioContext -> Vec len Number -> Vec len Number