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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
#!/usr/bin/make
DEBUG?=0
OS := $(shell uname -s)
TCL_VERSION := $(shell echo 'puts $$tcl_version' | tclsh)
ifeq ($(DEBUG),0)
CFLAGS += -O2
else
CFLAGS += -O0 -g -ggdb -DDEBUG
endif
ifeq ($(OS),Linux)
PDSUF = .pd_linux
PDBUNDLEFLAGS = -shared -rdynamic
LDSOFLAGS = -lm
endif
ifeq ($(OS),Darwin)
PDSUF = .pd_darwin
INCLUDES = -I/Library/Frameworks/Tcl.framework/Headers
PDBUNDLEFLAGS = -bundle -flat_namespace -undefined dynamic_lookup
LDSOFLAGS = -lm
endif
ifeq (MINGW,$(findstring MINGW,$(UNAME)))
PDSUF = .dll
PDBUNDLEFLAGS = -shared
LDSOFLAGS = -lm
endif
LIBNAME = composer
INCLUDES = -I../../pd/src -I/usr/include #-I/usr/include/tcl$(TCL_VERSION)
CFLAGS += -funroll-loops -fno-operator-names -fno-omit-frame-pointer -falign-functions=16 -Wno-deprecated -fPIC
CFLAGS += -DPDSUF=\"$(PDSUF)\"
LDSHARED = $(CXX) $(PDBUNDLEFLAGS)
all: $(LIBNAME)$(PDSUF)
@echo '-----------------------------------------------------------------------------'
@echo ' $(LIBNAME)$(PDSUF) ('`test $(DEBUG) -eq 1 && echo debug || echo release`' build) '\
'[size: '`ls -gGh $(LIBNAME)$(PDSUF) | cut -d " " -f 3`']'
clean::
rm -f $(LIBNAME)$(PDSUF)
rm -f *.o *~
rm -f editor_tk.cpp methods_pd.hpp methods_ed.hpp classsetup.cpp callwrappers_pd.cpp callwrappers_ed.cpp
.SUFFIXES: .cpp .o
SRCS = Song.cpp Pattern.cpp Track.cpp Editor.o PdClasses.cpp
OBJS = ${SRCS:.cpp=.o}
Song.o: Song.cpp Song.hpp
Pattern.o: Pattern.cpp Pattern.hpp
Track.o: Track.cpp Track.hpp
Editor.o: Editor.cpp Editor.hpp editor_tk.cpp
PdClasses.o: PdClasses.cpp PdClasses.hpp methods_pd.hpp methods_ed.hpp classsetup.cpp callwrappers_pd.cpp callwrappers_ed.cpp
.cpp.o: Makefile
$(CXX) $(CFLAGS) $(INCLUDES) -xc++ -c $<
$(LIBNAME)$(PDSUF): Makefile $(OBJS)
$(LDSHARED) $(LDSOFLAGS) $(CFLAGS) -xnone $(OBJS) -o $(LIBNAME)$(PDSUF)
editor_tk.cpp: editor.tk
( echo 'static const char* editor_tk[] = {'; sed -e 's/\(["\\]\)/\\\1/g' -e 's/^/"/' -e 's/$$/",/' editor.tk; echo '"" };' ) > editor_tk.cpp
methods.hpp: PdClasses.hpp
awk ' \
/^\/\*#end methods\*\/$$/{M=0} \
{if(M==1) print $$0} \
/^\/\*#begin methods\*\/$$/{M=1}' \
PdClasses.hpp \
| sed \
-e 's/\> *\(\**\) *\w\+\(,\|)\)/\1\2/g' \
-e 's/(/( /' -e 's/)/ )/' \
| awk '{ \
for(x=1; x<NF; x++) { \
if(x<=2||x==NF) \
printf($$x" "); \
else \
printf($$x" arg"(x-3)", "); \
} \
printf("\n"); \
}' \
| sed \
-e 's/,\( arg[0-9]\+\)/\1/g' \
-e 's/, $$/);/' \
-e 's/( /(/' \
> methods.hpp
methods_pd.hpp: methods.hpp
sed -e 's/\<track_proxy_\w\+\>/\0P/' methods.hpp > methods_pd.hpp
methods_ed.hpp: methods.hpp
sed -e 's/\<track_proxy_\w\+\>/\0E/' methods.hpp > methods_ed.hpp
classsetup.cpp: methods.hpp
sed \
-e 's/\<track_proxy_\(\w\+\)\>/\0 \1/' \
-e 's/);$$/, /' \
-e 's/(t_track_proxy\* arg0,\?//' \
-e 's/ arg[0-9]\+, / /g' \
-e 's/\<t_symbol\* int t_atom\>\*/A_GIMME, /g' \
-e 's/\<t_symbol\>\*/A_SYMBOL, /g' \
-e 's/\<t_floatarg\>/A_FLOAT, /g' \
methods.hpp \
| awk '{ \
printf("class_addmethod(track_proxy_class, (t_method)%sP, gensym(\"%s\"), ", $$2, $$3); \
for(i=4; i<=NF; i++) printf("%s ", $$i); \
printf("A_NULL);\n"); \
\
printf("class_addmethod(track_proxy_class, (t_method)%sE, gensym(\"%sE\"), ", $$2, $$3); \
for(i=4; i<=NF; i++) printf("%s ", $$i); \
printf("A_NULL);\n"); \
}' \
> classsetup.cpp
callwrappers_pd.cpp: methods.hpp
sed \
-e 's/;$$//' \
-e 's/^\(.*\)\(\<track_proxy_\w\+\>\)\((.*)\)$$/\1\2P\3 {\n \2\3;\/\/real call\n track_proxy_send_result(arg0, 1, 0);\n}/' \
methods.hpp \
| sed \
-e '/\/\/real call/s/(t_track_proxy\* arg0/(arg0/' \
-e '/\/\/real call/s/\(arg[0-9]\+, \)[A-Za-z_*]\+ \(arg[0-9]\+\)/\1\2/g' \
-e '/\/\/real call/s/\(arg[0-9]\+, \)[A-Za-z_*]\+ \(arg[0-9]\+\)/\1\2/g' \
-e '/\/\/real call/s/\(arg[0-9]\+, \)[A-Za-z_*]\+ \(arg[0-9]\+\)/\1\2/g' \
-e '/\/\/real call/s/\(arg[0-9]\+, \)[A-Za-z_*]\+ \(arg[0-9]\+\)/\1\2/g' \
> callwrappers_pd.cpp
callwrappers_ed.cpp: methods.hpp
sed \
-e 's/;$$//' \
-e 's/^\(.*\)\(\<track_proxy_\w\+\>\)\((.*)\)$$/\1\2E\3 {\n \2\3;\/\/real call\n track_proxy_send_result(arg0, 0, 1);\n}/' \
methods.hpp \
| sed \
-e '/\/\/real call/s/(t_track_proxy\* arg0/(arg0/' \
-e '/\/\/real call/s/\(arg[0-9]\+, \)[A-Za-z_*]\+ \(arg[0-9]\+\)/\1\2/g' \
-e '/\/\/real call/s/\(arg[0-9]\+, \)[A-Za-z_*]\+ \(arg[0-9]\+\)/\1\2/g' \
-e '/\/\/real call/s/\(arg[0-9]\+, \)[A-Za-z_*]\+ \(arg[0-9]\+\)/\1\2/g' \
-e '/\/\/real call/s/\(arg[0-9]\+, \)[A-Za-z_*]\+ \(arg[0-9]\+\)/\1\2/g' \
> callwrappers_ed.cpp
|