File: boxModulation.cpp

package info (click to toggle)
faust 2.81.10%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 431,496 kB
  • sloc: cpp: 283,941; ansic: 116,215; javascript: 18,529; sh: 14,356; vhdl: 14,052; java: 5,900; python: 5,091; objc: 3,852; makefile: 2,725; cs: 1,672; lisp: 1,146; ruby: 954; yacc: 586; xml: 471; lex: 247; awk: 111; tcl: 26
file content (111 lines) | stat: -rw-r--r-- 4,212 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/************************************************************************
 ************************************************************************
    FAUST compiler, boxModulation source code
    Copyright (C) 2023 INRIA
    ---------------------------------------------------------------------
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation; either version 2.1 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 ************************************************************************
 ************************************************************************/

#include "boxModulation.hh"
#include "boxIdentity.hh"
#include "labels.hh"

#include <stdlib.h>
#include <cstdlib>

#include "Text.hh"
#include "global.hh"
#include "ppbox.hh"
#include "signals.hh"

using namespace std;

//-------------------------BoxModulation--------------------------------
// Rewrite a circuit to modulate a slider designated by a path
//----------------------------------------------------------------------

Tree BoxModulation::modulateIfMatch(Tree widget, Tree wLabel)
{
    Tree wPath = superNormalizePath(cons(wLabel, gGlobal->nil));
    // std::cerr << "BoxModulation::modulateIfMatch"
    //           << " fPath = " << *fPath << " widget path = " << *wPath << std::endl;
    if (fPath == wPath) {
        return boxSeq(boxPar(widget, fSlot), boxPrim2(sigMul));
    } else {
        return widget;
    }
}

Tree BoxModulation::modulateIfSameGroup(int gcode, Tree glabel, Tree x)
{
    Tree gPath = superNormalizePath(cons(cons(tree(gcode), glabel), gGlobal->nil));
    // std::cerr << "BoxModulation::modulateIfSameGroup"
    //           << " gPath = " << *gPath << " fPath = " << *fPath << std::endl;
    // Transform group label into a path
    // check if fPath is in this group
    Tree rpath;
    if (matchGroup(gPath, fPath, rpath)) {
        // rewrite x accordingly
        BoxModulation bm(rpath, fSlot);
        return bm.self(x);
    } else {
        // we are flexible and accept any group
        return self(x);
    }
}

Tree BoxModulation::transformation(Tree box)
{
    Tree x, y, z, c, label;

    // MODULATION
    if (isBoxModulation(box, x, y)) {
        return boxModulation(self(x), self(y));
    }

    // UI WIDGETS
    else if (isBoxButton(box, label)) {
        return modulateIfMatch(box, label);
    } else if (isBoxCheckbox(box, label)) {
        return modulateIfMatch(box, label);
    } else if (isBoxVSlider(box, label, c, x, y, z)) {
        return modulateIfMatch(boxVSlider(label, self(c), self(x), self(y), self(z)), label);
    } else if (isBoxHSlider(box, label, c, x, y, z)) {
        return modulateIfMatch(boxHSlider(label, self(c), self(x), self(y), self(z)), label);
    } else if (isBoxNumEntry(box, label, c, x, y, z)) {
        return modulateIfMatch(boxNumEntry(label, self(c), self(x), self(y), self(z)), label);
    } else if (isBoxVBargraph(box, label, x, y)) {
        return modulateIfMatch(boxVBargraph(label, self(x), self(y)), label);
    } else if (isBoxHBargraph(box, label, x, y)) {
        return modulateIfMatch(boxHBargraph(label, self(x), self(y)), label);
    }

    // UI GROUPS
    else if (isBoxVGroup(box, label, x)) {
        return boxVGroup(label, modulateIfSameGroup(0, label, x));
    } else if (isBoxHGroup(box, label, x)) {
        return boxHGroup(label, modulateIfSameGroup(1, label, x));
    } else if (isBoxTGroup(box, label, x)) {
        return boxTGroup(label, modulateIfSameGroup(2, label, x));
    }

    // EVALUATED BOXES SHOULD BE COMPLETE

    else {
        return BoxIdentity::transformation(box);
    }
    return 0;
}