{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleContexts #-}

-- |
-- Module      : Harmonic.Interface.Tidal.Instruments
-- Description : MIDI channel routing and instrument shorthand for TidalCycles
--
-- Provides channel-assignment helpers (@p10@..@p16@, @ch@) and instrument
-- launchers (@wind@, @strg@, @brss@, @perc@, etc.) that combine MIDI
-- routing with form-driven kinetics for live performance.

module Harmonic.Interface.Tidal.Instruments (
    -- * Channel shorthand
    p10, p11, p12, p13, p14, p15, p16,
    ch,

    -- * Named synth wrappers
    moog, s101, juno,

    -- * Velocity
    vel,
) where

import Sound.Tidal.Context

-- | Route a pattern to a MIDI channel, by position. @p10@ is MIDI channel 10
-- (@midichan 9@, zero-indexed) through @p16@ on channel 16.
--
-- Postfix onto any pattern:
--
-- @d1 $ p14 $ n "0 3 5 7"@
--
-- Use 'ch' when the channel number is computed rather than literal.
p10, p11, p12, p13, p14, p15, p16 :: Pattern ValueMap -> Pattern ValueMap
p10 :: Pattern ValueMap -> Pattern ValueMap
p10 = (\Pattern ValueMap
pat -> Pattern ValueMap
pat Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern String -> Pattern ValueMap
s Pattern String
"thru" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
midichan Pattern Double
9)
p11 :: Pattern ValueMap -> Pattern ValueMap
p11 = (\Pattern ValueMap
pat -> Pattern ValueMap
pat Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern String -> Pattern ValueMap
s Pattern String
"thru" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
midichan Pattern Double
10)
p12 :: Pattern ValueMap -> Pattern ValueMap
p12 = (\Pattern ValueMap
pat -> Pattern ValueMap
pat Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern String -> Pattern ValueMap
s Pattern String
"thru" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
midichan Pattern Double
11)
p13 :: Pattern ValueMap -> Pattern ValueMap
p13 = (\Pattern ValueMap
pat -> Pattern ValueMap
pat Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern String -> Pattern ValueMap
s Pattern String
"thru" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
midichan Pattern Double
12)
p14 :: Pattern ValueMap -> Pattern ValueMap
p14 = (\Pattern ValueMap
pat -> Pattern ValueMap
pat Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern String -> Pattern ValueMap
s Pattern String
"thru" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
midichan Pattern Double
13)
p15 :: Pattern ValueMap -> Pattern ValueMap
p15 = (\Pattern ValueMap
pat -> Pattern ValueMap
pat Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern String -> Pattern ValueMap
s Pattern String
"thru" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
midichan Pattern Double
14)
p16 :: Pattern ValueMap -> Pattern ValueMap
p16 = (\Pattern ValueMap
pat -> Pattern ValueMap
pat Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern String -> Pattern ValueMap
s Pattern String
"thru" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
midichan Pattern Double
15)

-- | Moog Mother-32, channel 14.
moog :: Pattern ValueMap -> Pattern ValueMap
moog :: Pattern ValueMap -> Pattern ValueMap
moog = (\Pattern ValueMap
pat -> Pattern ValueMap
pat Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern String -> Pattern ValueMap
s Pattern String
"thru" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
midichan Pattern Double
13)

-- | Roland SH-101, channel 15.
s101 :: Pattern ValueMap -> Pattern ValueMap
s101 :: Pattern ValueMap -> Pattern ValueMap
s101 = (\Pattern ValueMap
pat -> Pattern ValueMap
pat Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern String -> Pattern ValueMap
s Pattern String
"thru" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
midichan Pattern Double
14)

-- | Roland Juno, channel 16.
juno :: Pattern ValueMap -> Pattern ValueMap
juno :: Pattern ValueMap -> Pattern ValueMap
juno = (\Pattern ValueMap
pat -> Pattern ValueMap
pat Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern String -> Pattern ValueMap
s Pattern String
"thru" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
midichan Pattern Double
15)

-- | Set the MIDI channel from a 1-indexed 'Int', so @ch 1@ is MIDI channel 1.
-- The general form of 'p10' .. 'p16'; used internally by every orchestral
-- instrument in "Harmonic.Interface.Tidal.Orchestra".
ch :: Int -> Pattern ValueMap
ch :: Int -> Pattern ValueMap
ch Int
n = Pattern String -> Pattern ValueMap
s Pattern String
"thru" Pattern ValueMap -> Pattern ValueMap -> Pattern ValueMap
forall b. Unionable b => Pattern b -> Pattern b -> Pattern b
# Pattern Double -> Pattern ValueMap
midichan (Int -> Pattern Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1))

-- | Velocity, as an alias for the @amp@ control. Multiply onto a pattern to
-- scale it:
--
-- @, violin1 T (0,1) k vl grid Soprano |* vel 0.7@
vel :: Pattern Double -> Pattern ValueMap
vel :: Pattern Double -> Pattern ValueMap
vel = String -> Pattern Double -> Pattern ValueMap
pF String
"amp"