Skip to content

Instantly share code, notes, and snippets.

runner "Octave Per Channel and Porta"
# surge-headless: 0.99.test-portamento-in-31.c3bc32b5 built: 2021-11-22 11:43:06
Created surge with "/usr/share/surge-xt/" & "/home/cale/Documents/Surge XT"
WT/Patch = 614 & 2280
Filters: Octave Per Channel and Porta
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
surge-testrunner is a Catch v2.13.7 host application.
Run with -? for options
@cgibbard
cgibbard / 31edo.lua
Last active May 14, 2021 01:29
Moony script for converting channel-per-octave to channel-per-note
local edo = 31 -- How many subdivisions of the octave? This is used to interpret MIDI note numbers on the input side.
local bendrange = 4 -- How many semitones is the full range of the pitch bender (e.g. 4 semitones if it goes from -2 to 2)
local diapason = 440 -- What frequency is middle A tuned to?
local inputA = 2*edo + 23 -- Which input midi note is A?
local log2 = math.log(2)
function round(x)
return math.ceil(x-0.5)
end
@cgibbard
cgibbard / MonadState.hs
Created September 2, 2019 05:04
How MonadState could potentially look, using DefaultSignatures and type equality constraints.
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
import Control.Monad.Trans.Class
import qualified Control.Monad.Trans.State as State
import Control.Monad.Trans.Identity (IdentityT)
import Control.Monad.Trans.Reader (ReaderT)
{-# LANGUAGE GADTs #-}
import Reflex
import Data.Dependent.Map (DMap)
import qualified Data.Dependent.Map as DMap
import Data.Dependent.Sum (DSum(..))
import Data.GADT.Compare
import Data.Functor.Compose
import Data.Functor.Identity
@cgibbard
cgibbard / IOException.hs
Last active May 23, 2019 09:12
example of refinements of IOException
module Control.Exception.IOException where
import Control.Exception
import System.IO.Error
newtype AlreadyExists = AlreadyExists IOException
deriving (Eq, Show)
instance Exception AlreadyExists where
toException (AlreadyExists e) = toException e
{-# LANGUAGE OverloadedStrings #-}
import Control.Concurrent
import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as BSC
import qualified Crypto.Hash.SHA1 as SHA1
import Data.Char
import Control.Monad
import Data.List.Split
import Control.Parallel.Strategies
import Control.Concurrent.Chan
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeFamilies #-}
data Nat = Z | S Nat
deriving (Eq, Ord, Show)
data SBool (b :: Bool) where
SFalse :: SBool False
import Data.Aeson
import Data.Aeson.Types
import Data.Aeson.Parser
import qualified Data.Vector as V
import Data.Vector (Vector, (!?))
import Control.Monad
newtype MovieIds = MovieIds [Integer]
deriving Show
@cgibbard
cgibbard / Tree.hs
Created March 4, 2019 21:23
Let's make an infinite tree
import Data.Array
data Tree a = Tip | Branch a (Tree a) (Tree a)
deriving (Eq, Ord, Show)
myTree :: Tree Integer
myTree =
let ts = listArray (0,5)
[ Branch 0 (ts ! 1) (ts ! 2)
, Branch 1 (ts ! 3) (ts ! 4)
@cgibbard
cgibbard / BlackLab.hs
Created March 3, 2019 01:39
computing probabilities with WriterT
import Control.Monad.Writer
import Data.Monoid
import Data.Map (Map)
import qualified Data.Map as Map
import Data.List
import qualified Data.MemoCombinators as M
import Numeric
-- Hacky monad of probability distributions because I can't be bothered finding a package
type Prob a = WriterT (Product Rational) [] a