module CsoundExpr.Base.MultiOut(
MultiOut,
mo,
moA,
moK,
moI,
mo1,
mo2,
mo3,
mo4,
mo5,
mo6,
mo7,
mo8,
moA1,
moA2,
moA3,
moA4,
moA6,
moA8,
moK1,
moK2,
moK3,
moK4,
moK6,
moK8,
moI1,
moI2,
moI3,
moI4,
moI6,
moI8)
where
import CsoundExpr.Translator.Types
import CsoundExpr.Base.Types
import CsoundExpr.Translator.ExprTree.ExprTree
import CsoundExpr.Translator.Cs.CsTree
import CsoundExpr.Translator.Cs.IM
data MultiOut = MultiOut CsTree
instance IM CsTree MultiOut where
from = MultiOut
to (MultiOut a) = a
labelMO :: (IM CsTree a) => Int -> MultiOut -> a
labelMO id x = from $ outPort id $ (to x :: CsTree)
rateOf :: (X a) => a -> Rate
rateOf a = head $ exprType $ exprTreeTag t1
where t1 = to $ from t0 `asTypeOf` a :: CsTree
t0 = pure (opc "") [] :: CsTree
mo :: (X a) => Int -> MultiOut -> [a]
mo n x = map (flip labelMO x) [0 .. n 1]
moA :: Int -> MultiOut -> [Arate]
moA = mo
moK :: Int -> MultiOut -> [Krate]
moK = mo
moI :: Int -> MultiOut -> [Irate]
moI = mo
moA1 :: MultiOut -> (Arate)
moA1 = mo1
moA2 :: MultiOut -> (Arate, Arate)
moA2 = mo2
moA3 :: MultiOut -> (Arate, Arate, Arate)
moA3 = mo3
moA4 :: MultiOut -> (Arate, Arate, Arate, Arate)
moA4 = mo4
moA6 :: MultiOut -> (Arate, Arate, Arate, Arate, Arate, Arate)
moA6 = mo6
moA8 ::
MultiOut ->
(Arate, Arate, Arate, Arate, Arate, Arate, Arate, Arate)
moA8 = mo8
moK1 :: MultiOut -> (Krate)
moK1 = mo1
moK2 :: MultiOut -> (Krate, Krate)
moK2 = mo2
moK3 :: MultiOut -> (Krate, Krate, Krate)
moK3 = mo3
moK4 :: MultiOut -> (Krate, Krate, Krate, Krate)
moK4 = mo4
moK6 :: MultiOut -> (Krate, Krate, Krate, Krate, Krate, Krate)
moK6 = mo6
moK8 ::
MultiOut ->
(Krate, Krate, Krate, Krate, Krate, Krate, Krate, Krate)
moK8 = mo8
moI1 :: MultiOut -> (Irate)
moI1 = mo1
moI2 :: MultiOut -> (Irate, Irate)
moI2 = mo2
moI3 :: MultiOut -> (Irate, Irate, Irate)
moI3 = mo3
moI4 :: MultiOut -> (Irate, Irate, Irate, Irate)
moI4 = mo4
moI6 :: MultiOut -> (Irate, Irate, Irate, Irate, Irate, Irate)
moI6 = mo6
moI8 ::
MultiOut ->
(Irate, Irate, Irate, Irate, Irate, Irate, Irate, Irate)
moI8 = mo8
mo1 :: (X a0) => MultiOut -> (a0)
mo1 x = (y0)
where y0 = rateMO rs $ labelMO 0 x
rs = [rateOf y0]
mo2 :: (X a0, X a1) => MultiOut -> (a0, a1)
mo2 x = (y0, y1)
where y0 = rateMO rs $ labelMO 0 x
y1 = rateMO rs $ labelMO 1 x
rs = [rateOf y0, rateOf y1]
mo3 :: (X a0, X a1, X a2) => MultiOut -> (a0, a1, a2)
mo3 x = (y0, y1, y2)
where y0 = rateMO rs $ labelMO 0 x
y1 = rateMO rs $ labelMO 1 x
y2 = rateMO rs $ labelMO 2 x
rs = [rateOf y0, rateOf y1, rateOf y2]
mo4 :: (X a0, X a1, X a2, X a3) => MultiOut -> (a0, a1, a2, a3)
mo4 x = (y0, y1, y2, y3)
where y0 = rateMO rs $ labelMO 0 x
y1 = rateMO rs $ labelMO 1 x
y2 = rateMO rs $ labelMO 2 x
y3 = rateMO rs $ labelMO 3 x
rs = [rateOf y0, rateOf y1, rateOf y2, rateOf y3]
mo5 ::
(X a0, X a1, X a2, X a3, X a4) => MultiOut -> (a0, a1, a2, a3, a4)
mo5 x = (y0, y1, y2, y3, y4)
where y0 = rateMO rs $ labelMO 0 x
y1 = rateMO rs $ labelMO 1 x
y2 = rateMO rs $ labelMO 2 x
y3 = rateMO rs $ labelMO 3 x
y4 = rateMO rs $ labelMO 4 x
rs = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4]
mo6 ::
(X a0, X a1, X a2, X a3, X a4, X a5) =>
MultiOut -> (a0, a1, a2, a3, a4, a5)
mo6 x = (y0, y1, y2, y3, y4, y5)
where y0 = rateMO rs $ labelMO 0 x
y1 = rateMO rs $ labelMO 1 x
y2 = rateMO rs $ labelMO 2 x
y3 = rateMO rs $ labelMO 3 x
y4 = rateMO rs $ labelMO 4 x
y5 = rateMO rs $ labelMO 5 x
rs
= [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
rateOf y5]
mo7 ::
(X a0, X a1, X a2, X a3, X a4, X a5, X a6) =>
MultiOut -> (a0, a1, a2, a3, a4, a5, a6)
mo7 x = (y0, y1, y2, y3, y4, y5, y6)
where y0 = rateMO rs $ labelMO 0 x
y1 = rateMO rs $ labelMO 1 x
y2 = rateMO rs $ labelMO 2 x
y3 = rateMO rs $ labelMO 3 x
y4 = rateMO rs $ labelMO 4 x
y5 = rateMO rs $ labelMO 5 x
y6 = rateMO rs $ labelMO 6 x
rs
= [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
rateOf y5, rateOf y6]
mo8 ::
(X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7) =>
MultiOut -> (a0, a1, a2, a3, a4, a5, a6, a7)
mo8 x = (y0, y1, y2, y3, y4, y5, y6, y7)
where y0 = rateMO rs $ labelMO 0 x
y1 = rateMO rs $ labelMO 1 x
y2 = rateMO rs $ labelMO 2 x
y3 = rateMO rs $ labelMO 3 x
y4 = rateMO rs $ labelMO 4 x
y5 = rateMO rs $ labelMO 5 x
y6 = rateMO rs $ labelMO 6 x
y7 = rateMO rs $ labelMO 7 x
rs
= [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
rateOf y5, rateOf y6, rateOf y7]