From 1dd5d0a66933958fceceb653b7b3b49df72349be Mon Sep 17 00:00:00 2001 From: Mike Solomon Date: Mon, 1 Nov 2021 12:14:58 +0200 Subject: [PATCH] Bumps version --- CHANGELOG.md | 10 ++++ examples.dhall | 1 - examples/atari-speaks/AtariSpeaks.purs | 3 +- examples/drum-machine/DrumMachine.purs | 16 ++---- examples/kitchen-sink/KitchenSink.purs | 6 +- examples/skip-machine/SkipMachine.purs | 4 +- examples/subgraph/Subgraph.purs | 4 +- examples/tumult/Tumult.purs | 4 +- packages.dhall | 24 +++++++- src/WAGS/Interpret.js | 80 ++++++++++++-------------- src/WAGS/Interpret.purs | 31 ++++++---- 11 files changed, 99 insertions(+), 84 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2266701f..f7b93c41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.5.8] - 2021-11-01 + +### Added + +- splits `decodeAudioBufferFromUri` into two separate functions and changes the signature from Promise to Aff. + +### Fixed + +- upgrades to `arraybuffer` 12.0.0 to avoid breaking polyfill. + ## [0.5.8] - 2021-10-29 ### Fixed diff --git a/examples.dhall b/examples.dhall index 64d95260..68771f20 100644 --- a/examples.dhall +++ b/examples.dhall @@ -17,7 +17,6 @@ in conf , "media-types" , "web-file" , "exceptions" - , "nullable" , "profunctor-lenses" ] } diff --git a/examples/atari-speaks/AtariSpeaks.purs b/examples/atari-speaks/AtariSpeaks.purs index 5ad6bbf0..6d3f1f2b 100644 --- a/examples/atari-speaks/AtariSpeaks.purs +++ b/examples/atari-speaks/AtariSpeaks.purs @@ -168,8 +168,7 @@ handleAction = case _ of H.liftAff $ toAffE $ contextResume audioCtx unitCache <- H.liftEffect makeUnitCache atar <- - H.liftAff $ toAffE - $ decodeAudioDataFromUri + H.liftAff $ decodeAudioDataFromUri audioCtx "https://freesound.org/data/previews/100/100981_1234256-lq.mp3" let diff --git a/examples/drum-machine/DrumMachine.purs b/examples/drum-machine/DrumMachine.purs index ce0ac275..ea7da495 100644 --- a/examples/drum-machine/DrumMachine.purs +++ b/examples/drum-machine/DrumMachine.purs @@ -3,13 +3,11 @@ module WAGS.Example.DrumMachine where import Prelude import Control.Comonad.Cofree (Cofree, deferCofree, head, mkCofree, tail) -import Control.Promise (toAffE) import Data.Foldable (for_) import Data.Identity (Identity(..)) import Data.Int (floor, toNumber) import Data.Maybe (Maybe(..)) import Data.Newtype (unwrap) -import Data.Nullable (null) import Data.Tuple.Nested ((/\), type (/\)) import Effect (Effect) import Effect.Aff (launchAff_) @@ -24,7 +22,6 @@ import Halogen.Aff (awaitBody, runHalogenAff) import Halogen.HTML as HH import Halogen.HTML.Events as HE import Halogen.VDom.Driver (runUI) -import Type.Proxy (Proxy(..)) import WAGS.Change (ichange) import WAGS.Control.Functions.Graph (iloop, (@!>)) import WAGS.Control.Types (Frame0, Scene) @@ -165,10 +162,9 @@ handleAction = case _ of audioCtx <- H.liftEffect context unitCache <- H.liftEffect makeUnitCache ibuf <- - H.liftAff $ toAffE - $ decodeAudioDataFromUri - audioCtx - (head drumCf) + H.liftAff $ decodeAudioDataFromUri + audioCtx + (head drumCf) rf <- H.liftEffect (Ref.new (unwrap (tail drumCf))) bf <- H.liftEffect (Ref.new ibuf) ivlsub <- @@ -177,11 +173,7 @@ handleAction = case _ of cf <- Ref.read rf Ref.write (unwrap (tail cf)) rf launchAff_ do - buf <- - toAffE - $ decodeAudioDataFromUri - audioCtx - (head cf) + buf <- decodeAudioDataFromUri audioCtx (head cf) H.liftEffect $ Ref.write buf bf let ffiAudio = diff --git a/examples/kitchen-sink/KitchenSink.purs b/examples/kitchen-sink/KitchenSink.purs index 28b94420..78fae342 100644 --- a/examples/kitchen-sink/KitchenSink.purs +++ b/examples/kitchen-sink/KitchenSink.purs @@ -4,7 +4,6 @@ import Prelude import Control.Comonad.Cofree (Cofree, mkCofree) import Control.Monad.Error.Class (class MonadThrow, throwError) -import Control.Promise (toAffE) import Data.Array ((..)) import Data.Foldable (for_) import Data.Int (toNumber) @@ -106,10 +105,7 @@ render state = do fetchBuffer :: ∀ (m ∷ Type -> Type). MonadAff m ⇒ AudioContext → String → m BrowserAudioBuffer fetchBuffer audioCtx addr = - H.liftAff $ toAffE - $ decodeAudioDataFromUri - audioCtx - addr + H.liftAff $ decodeAudioDataFromUri audioCtx addr handleAction :: forall output m. MonadThrow Error m => MonadEffect m => MonadAff m => Action -> H.HalogenM State Action () output m Unit handleAction = case _ of diff --git a/examples/skip-machine/SkipMachine.purs b/examples/skip-machine/SkipMachine.purs index af4facbe..164db7da 100644 --- a/examples/skip-machine/SkipMachine.purs +++ b/examples/skip-machine/SkipMachine.purs @@ -7,7 +7,6 @@ import Control.Comonad (extract) import Control.Comonad.Cofree (Cofree, mkCofree) import Control.Comonad.Cofree.Class (unwrapCofree) import Control.Plus (empty) -import Control.Promise (toAffE) import Data.Array as Array import Data.Foldable (foldl, for_) import Data.Int (toNumber) @@ -151,8 +150,7 @@ handleAction = case _ of audioCtx <- H.liftEffect context unitCache <- H.liftEffect makeUnitCache hamlet <- - H.liftAff $ toAffE - $ decodeAudioDataFromUri + H.liftAff $ decodeAudioDataFromUri audioCtx "https://freesound.org/data/previews/50/50843_489520-hq.mp3" let diff --git a/examples/subgraph/Subgraph.purs b/examples/subgraph/Subgraph.purs index 61c9fc31..29baa477 100644 --- a/examples/subgraph/Subgraph.purs +++ b/examples/subgraph/Subgraph.purs @@ -3,7 +3,6 @@ module WAGS.Example.Subgraph where import Prelude import Control.Comonad.Cofree (Cofree, mkCofree) -import Control.Promise (toAffE) import Data.Foldable (for_) import Data.Int (toNumber) import Data.Maybe (Maybe(..)) @@ -137,8 +136,7 @@ handleAction = case _ of audioCtx <- H.liftEffect context unitCache <- H.liftEffect makeUnitCache atar <- - H.liftAff $ toAffE - $ decodeAudioDataFromUri + H.liftAff $ decodeAudioDataFromUri audioCtx "https://freesound.org/data/previews/100/100981_1234256-lq.mp3" let diff --git a/examples/tumult/Tumult.purs b/examples/tumult/Tumult.purs index c7f718fd..4e714c85 100644 --- a/examples/tumult/Tumult.purs +++ b/examples/tumult/Tumult.purs @@ -3,7 +3,6 @@ module WAGS.Example.Tumult where import Prelude import Control.Comonad.Cofree (Cofree, mkCofree) -import Control.Promise (toAffE) import Data.Foldable (for_) import Data.Maybe (Maybe(..)) import Data.Typelevel.Num (D1) @@ -146,8 +145,7 @@ handleAction = case _ of audioCtx <- H.liftEffect context unitCache <- H.liftEffect makeUnitCache shruti <- - H.liftAff $ toAffE - $ decodeAudioDataFromUri + H.liftAff $ decodeAudioDataFromUri audioCtx "https://freesound.org/data/previews/513/513742_153257-hq.mp3" let diff --git a/packages.dhall b/packages.dhall index da749608..97824e78 100644 --- a/packages.dhall +++ b/packages.dhall @@ -105,9 +105,29 @@ in upstream ------------------------------- -} let upstream = - https://github.com/purescript/package-sets/releases/download/psc-0.14.4-20210919/packages.dhall sha256:03516fdd4f6d1bd6c9eb5e63cf3af3037bc079459117ab93eb85b6eb46e258a7 + https://github.com/purescript/package-sets/releases/download/psc-0.14.4-20211030/packages.dhall sha256:5cd7c5696feea3d3f84505d311348b9e90a76c4ce3684930a0ff29606d2d816c -let overrides = {=} +let overrides = + { arraybuffer = + { dependencies = + [ "arraybuffer-types" + , "arrays" + , "effect" + , "float32" + , "functions" + , "gen" + , "maybe" + , "nullable" + , "prelude" + , "tailrec" + , "uint" + , "unfoldable" + ] + , repo = + "https://github.com/purescript-contrib/purescript-arraybuffer.git" + , version = "v12.0.0" + } + } let additions = { typelevel-peano = diff --git a/src/WAGS/Interpret.js b/src/WAGS/Interpret.js index e477b14c..3da21665 100644 --- a/src/WAGS/Interpret.js +++ b/src/WAGS/Interpret.js @@ -1,13 +1,13 @@ exports.context = function () { return new (window.AudioContext || window.webkitAudioContext)(); }; -exports.contextState = function(audioCtx) { - return function() { +exports.contextState = function (audioCtx) { + return function () { return audioCtx.state; } } -exports.contextResume = function(audioCtx) { - return function() { +exports.contextResume = function (audioCtx) { + return function () { return audioCtx.resume(); } } @@ -38,15 +38,15 @@ var workletSetter = function (unit, paramName, timeToSet, param) { } else { unit.parameters .get(paramName) - [ - param.transition === "NoRamp" - ? "setValueAtTime" - : param.transition === "LinearRamp" + [ + param.transition === "NoRamp" + ? "setValueAtTime" + : param.transition === "LinearRamp" ? "linearRampToValueAtTime" : param.transition === "ExponentialRamp" - ? "exponentialRampToValueAtTime" - : "linearRampToValueAtTime" - ](param.param, timeToSet + param.timeOffset); + ? "exponentialRampToValueAtTime" + : "linearRampToValueAtTime" + ](param.param, timeToSet + param.timeOffset); } } }; @@ -65,10 +65,10 @@ var genericSetter = function (unit, name, timeToSet, param) { param.transition === "NoRamp" ? "setValueAtTime" : param.transition === "LinearRamp" - ? "linearRampToValueAtTime" - : param.transition === "ExponentialRamp" - ? "exponentialRampToValueAtTime" - : "linearRampToValueAtTime" + ? "linearRampToValueAtTime" + : param.transition === "ExponentialRamp" + ? "exponentialRampToValueAtTime" + : "linearRampToValueAtTime" ](param.param, timeToSet + param.timeOffset); } } @@ -1557,33 +1557,29 @@ exports.decodeAudioDataFromBase64EncodedString = function (ctx) { }; }; }; -exports.decodeAudioDataFromUri = function (ctx) { - return function (s) { - return function () { - { - return fetch(s) - .then( - function (b) { - return b.arrayBuffer(); - }, - function (e) { - console.error("Error fetching buffer", e); - return Promise.reject(e); - } - ) - .then( - function (b) { - return ctx.decodeAudioData(b); - }, - function (e) { - console.error("Error decoding buffer", e); - return Promise.reject(e); - } - ); - } - }; +exports.fetchArrayBuffer = function (s) { + return function () { + { + return fetch(s) + .then( + function (b) { + return b.arrayBuffer(); + }, + function (e) { + console.error("Error fetching buffer", e); + return Promise.reject(e); + } + ) + } }; }; +exports.decodeAudioDataFromArrayBuffer = function (ctx) { + return function (b) { + return function () { + return ctx.decodeAudioData(b); + } + } +}; exports.audioWorkletAddModule_ = function (ctx) { return function (s) { return function () { @@ -1804,12 +1800,12 @@ exports.bufferNumberOfChannels = function (buffer) { return buffer.numberOfChannels; }; exports.constant0Hack = function (context) { - return function() { + return function () { var constant = context.createConstantSource(); constant.offset.value = 0.0; constant.connect(context.destination); constant.start(); - return function() { + return function () { constant.stop(); constant.disconnect(context.destination); } diff --git a/src/WAGS/Interpret.purs b/src/WAGS/Interpret.purs index d85d6dc8..bf54da07 100644 --- a/src/WAGS/Interpret.purs +++ b/src/WAGS/Interpret.purs @@ -20,6 +20,8 @@ module WAGS.Interpret , contextResume , decodeAudioDataFromBase64EncodedString , decodeAudioDataFromUri + , fetchArrayBuffer + , decodeAudioDataFromArrayBuffer , defaultFFIAudio , destroyUnit , disconnectXFromY @@ -122,7 +124,7 @@ import Prelude import Control.Plus (empty) import Control.Promise (Promise, toAffE) import Data.Array as Array -import Data.ArrayBuffer.Types (Float32Array, Uint8Array) +import Data.ArrayBuffer.Types (Float32Array, Uint8Array, ArrayBuffer) import Data.Either (Either(..)) import Data.FunctorWithIndex (mapWithIndex) import Data.Lazy (defer) @@ -202,7 +204,13 @@ foreign import mediaRecorderToUrl :: String -> (String -> Effect Unit) -> WebAPI foreign import isTypeSupported :: String -> Effect Boolean -- | Given an audio context and a URI, decode the content of the URI to an audio buffer. -foreign import decodeAudioDataFromUri :: WebAPI.AudioContext -> String -> Effect (Promise WebAPI.BrowserAudioBuffer) +decodeAudioDataFromUri :: WebAPI.AudioContext -> String -> Aff WebAPI.BrowserAudioBuffer +decodeAudioDataFromUri ctx s = + toAffE (fetchArrayBuffer s) >>= (toAffE <<< decodeAudioDataFromArrayBuffer ctx) + +foreign import fetchArrayBuffer :: String -> Effect (Promise ArrayBuffer) + +foreign import decodeAudioDataFromArrayBuffer :: WebAPI.AudioContext -> ArrayBuffer -> Effect (Promise WebAPI.BrowserAudioBuffer) -- | Given an audio context and a base-64-encoded audio file, decode the content of the string to an audio buffer. foreign import decodeAudioDataFromBase64EncodedString :: WebAPI.AudioContext -> String -> Effect (Promise WebAPI.BrowserAudioBuffer) @@ -858,8 +866,8 @@ interpretInstruction = case _ of SetBuffer ptr a -> setBuffer ptr a SetConvolverBuffer ptr a -> setConvolverBuffer ptr a SetPeriodicOsc ptr a -> case a of - Left a' -> setPeriodicOsc ptr a' - Right a' -> setPeriodicOscV ptr a' + Left a' -> setPeriodicOsc ptr a' + Right a' -> setPeriodicOscV ptr a' SetOnOff ptr a -> setOnOff ptr a SetBufferOffset ptr a -> setBufferOffset ptr a SetLoopStart ptr a -> setLoopStart ptr a @@ -1007,13 +1015,14 @@ instance safeToFFI_Oversample :: SafeToFFI Oversample String where instance safeToFFI_FFIAudio :: SafeToFFI FFIAudioSnapshot FFIAudioSnapshot' where safeToFFI (FFIAudioSnapshot x) = x -type AudioWorkletNodeOptionsFFI_ = { name :: String - , numberOfInputs :: Int - , numberOfOutputs :: Int - , outputChannelCount :: Array Int - , parameterData :: Object FFINumericAudioParameter - , processorOptions :: Foreign - } +type AudioWorkletNodeOptionsFFI_ = + { name :: String + , numberOfInputs :: Int + , numberOfOutputs :: Int + , outputChannelCount :: Array Int + , parameterData :: Object FFINumericAudioParameter + , processorOptions :: Foreign + } instance safeToFFI_AudioWorkletNodeOptions_ :: SafeToFFI AudioWorkletNodeOptions_ AudioWorkletNodeOptionsFFI_ where