diff --git a/musicw.cabal b/musicw.cabal
--- a/musicw.cabal
+++ b/musicw.cabal
@@ -1,7 +1,7 @@
 name:                musicw
-version:             0.3.5.2
+version:             0.3.6
 synopsis:            Sound synthesis library, to be used with GHCJS and Web Audio API
-description:         A library for sound synthesis, currently targeting GHCJS and the Web Audio API. Used in the Inner Ear and Estuary projects.
+description:         A library for sound synthesis, currently targeting GHCJS and the Web Audio API. Used by Inner Ear, Estuary, Punctual and possibly other projects.
 homepage:            https://github.com/dktr0/musicw/blob/master/README.md
 license:             BSD3
 license-file:        LICENSE
diff --git a/src/Sound/MusicW/Worklets.hs b/src/Sound/MusicW/Worklets.hs
--- a/src/Sound/MusicW/Worklets.hs
+++ b/src/Sound/MusicW/Worklets.hs
@@ -62,6 +62,9 @@
 floorWorklet :: AudioIO m => NodeRef -> SynthDef m NodeRef
 floorWorklet x = audioWorklet "floor-processor" [x]
 
+ceilWorklet :: AudioIO m => NodeRef -> SynthDef m NodeRef
+ceilWorklet x = audioWorklet "ceil-processor" [x]
+
 fractWorklet :: AudioIO m => NodeRef -> SynthDef m NodeRef
 fractWorklet x = audioWorklet "fract-processor" [x]
 
@@ -446,6 +449,24 @@
 \  }\
 \ }\
 \ registerProcessor('floor-processor',FloorProcessor);\
+\ \
+\ class CeilProcessor extends AudioWorkletProcessor {\
+\  constructor() { super(); this.notStarted = true; }\
+\  process(inputs,outputs,parameters) {\
+\    const input = inputs[0];\
+\    const output = outputs[0];\
+\    const blockSize = 128;\
+\    const hasInput = !(input[0] === undefined);\
+\    if(hasInput){\
+\      this.notStarted = false;\
+\      for(let n=0; n<blockSize;n++){\
+\        output[0][n] = Math.ceil(input[0][n]);\
+\      }\
+\    }\
+\    return (this.notStarted || hasInput);\
+\  }\
+\ }\
+\ registerProcessor('ceil-processor',CeilProcessor);\
 \ \
 \ class FractProcessor extends AudioWorkletProcessor {\
 \  constructor() { super(); this.notStarted = true; }\
