├── adgmaker
├── __init__.py
├── adgmaker.py
├── base_xml.tpl
└── instrument_xml.tpl
├── requirements.txt
├── .gitignore
├── MANIFEST.in
├── setup.py
└── README.md
/adgmaker/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | Jinja2==2.9
2 | MarkupSafe==0.23
3 | requests==2.18.3
4 | wheel==0.29.0
5 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.egg-info/
2 | .DS_Store
3 | env/
4 | *.zip
5 | *.gz
6 | *.pyc
7 | build/
8 | dist/
9 |
--------------------------------------------------------------------------------
/MANIFEST.in:
--------------------------------------------------------------------------------
1 | include README.md LICENSE requirements.txt
2 | recursive-include adgmaker *.py *.tpl
3 |
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | import os
2 | import sys
3 | from setuptools import setup
4 |
5 | # Set external files
6 | try:
7 | from pypandoc import convert
8 | README = convert('README.md', 'rst')
9 | except ImportError:
10 | README = open(os.path.join(os.path.dirname(__file__), 'README.md')).read()
11 |
12 | with open(os.path.join(os.path.dirname(__file__), 'requirements.txt')) as f:
13 | required = f.read().splitlines()
14 |
15 | setup(
16 | name='adgmaker',
17 | version='0.1.3',
18 | packages=['adgmaker'],
19 | install_requires=required,
20 | test_suite='nose.collector',
21 | include_package_data=True,
22 | license='MIT License',
23 | description='Create Free Ableton Live Instruments from Philharmonic Samples',
24 | long_description=README,
25 | url='https://github.com/Miserlou/ADGMaker',
26 | author='Rich Jones',
27 | author_email='rich@openwatch.net',
28 | entry_points={
29 | 'console_scripts': [
30 | 'adgmaker=adgmaker.adgmaker:handle',
31 | ]
32 | },
33 | classifiers=[
34 | 'Environment :: Console',
35 | 'License :: OSI Approved :: Apache Software License',
36 | 'Operating System :: OS Independent',
37 | 'Programming Language :: Python',
38 | 'Programming Language :: Python :: 2.7',
39 | 'Topic :: Internet :: WWW/HTTP',
40 | 'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
41 | ],
42 | )
43 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 | # ADGMaker
3 |
4 | Automatically create and install hundreds of awesome Free (as in Freedom!) Ableton Live Instuments from the super high-quality [Philharmonia Orchestra](http://www.philharmonia.co.uk/explore/make_music/) samples.
5 |
6 | Currently includes:
7 |
8 | * Banjo
9 | * Bass Clarinet
10 | * Bassoon
11 | * Cello
12 | * Clarinet
13 | * Contrabassoon
14 | * Cor Anglais
15 | * Double Bass
16 | * Flute
17 | * French Horn
18 | * Guitar
19 | * Mandolin
20 | * Oboe
21 | * Saxophone
22 | * Trombone
23 | * Trumpet
24 | * Tuba
25 | * Viola
26 | * Violin
27 | * Hella Percussions!
28 |
29 | ## Installation
30 |
31 | ADGMaker requires that you have Python, OSX, and Ableton Live installed already. Then, simply:
32 |
33 | $ pip install adgmaker
34 |
35 | ## Automatic Usage
36 |
37 | The simplest way to use ADGMaker is with the '--all' and '--install' arguments, which will fetch the instrument archives from the internet, create ADGs, and install them into your Ableton installation automatically:
38 |
39 | $ adgmaker --all --install
40 |
41 | Then go to File -> Manage Files -> Manage User Library and use your new instruments! You'll see them under the "Drums" tab. Tada!
42 |
43 | ## Manual Usage
44 |
45 | Download an instrument from [the Philharmonia Orchestra website](http://www.philharmonia.co.uk/explore/make_music/double_bass) and unzip it.
46 |
47 | Then, (from a virtualenv), run:
48 |
49 | python adgmaker.py double_bass/
50 |
51 | Then copy all of the .adg files to:
52 |
53 | ~/Music/Ableton/User\ Library/Presets/Instruments/Drum\ Rack/
54 |
55 | (or wherever your Ableton is installed).
56 |
57 | Then copy all of the mp3s to:
58 |
59 | ~/Music/Ableton/User\ Library/Samples/Imported
60 |
61 | Then go to File -> Manage Files -> Manage User Library and use your new instruments!
62 |
63 | ## Caveats
64 |
65 | Some of the ADGs only have a few items in them, but most instruments have at least a few ADG files that have a couple of complete scales. All of the percussion instruments have been combined into a single percussion ADG.
66 |
67 | Some of the samples have a slight delay, so you might have to manually set the sample start time to your liking. I also like to add a little bit of fade out, reverb, and put them all into the same choke group, depending on the sound I want.
68 |
69 | ## Related
70 | * [UltimateTemplate](https://github.com/Miserlou/UltimateTemplate) - Production-ready Ableton Live project templates.
71 |
72 | ## TODO
73 |
74 | * Support other sound archives?
75 | * Support making multi-instrument racks?
76 | * Tests / CI!
77 |
78 | Enjoy!
79 |
--------------------------------------------------------------------------------
/adgmaker/adgmaker.py:
--------------------------------------------------------------------------------
1 | # ADGMaker
2 |
3 | import argparse
4 | import fnmatch
5 | import glob
6 | import gzip
7 | import pkg_resources
8 | import platform
9 | import requests
10 | import shutil
11 | import os
12 | import zipfile
13 | from jinja2 import Environment, FileSystemLoader
14 |
15 | ####################################################################
16 | # Data
17 | ####################################################################
18 |
19 | all_zip_urls = [
20 | "http://www.philharmonia.co.uk/assets/audio/samples/banjo/banjo.zip",
21 | "http://www.philharmonia.co.uk/assets/audio/samples/bass%20clarinet/bass%20clarinet.zip",
22 | "http://www.philharmonia.co.uk/assets/audio/samples/bassoon/bassoon.zip",
23 | "http://www.philharmonia.co.uk/assets/audio/samples/cello/cello.zip",
24 | "http://www.philharmonia.co.uk/assets/audio/samples/clarinet/clarinet.zip",
25 | "http://www.philharmonia.co.uk/assets/audio/samples/contrabassoon/contrabassoon.zip",
26 | "http://www.philharmonia.co.uk/assets/audio/samples/cor%20anglais/cor%20anglais.zip",
27 | "http://www.philharmonia.co.uk/assets/audio/samples/double%20bass/double%20bass.zip",
28 | "http://www.philharmonia.co.uk/assets/audio/samples/flute/flute.zip",
29 | "http://www.philharmonia.co.uk/assets/audio/samples/french%20horn/french%20horn.zip",
30 | "http://www.philharmonia.co.uk/assets/audio/samples/guitar/guitar.zip",
31 | "http://www.philharmonia.co.uk/assets/audio/samples/mandolin/mandolin.zip",
32 | "http://www.philharmonia.co.uk/assets/audio/samples/oboe/oboe.zip",
33 | "http://www.philharmonia.co.uk/assets/audio/samples/saxophone/saxophone.zip",
34 | "http://www.philharmonia.co.uk/assets/audio/samples/trombone/trombone.zip",
35 | "http://www.philharmonia.co.uk/assets/audio/samples/trumpet/trumpet.zip",
36 | "http://www.philharmonia.co.uk/assets/audio/samples/tuba/tuba.zip",
37 | "http://www.philharmonia.co.uk/assets/audio/samples/viola/viola.zip",
38 | "http://www.philharmonia.co.uk/assets/audio/samples/violin/violin.zip",
39 | "http://www.philharmonia.co.uk/assets/audio/samples/percussion/percussion.zip"
40 | ]
41 |
42 | home_dir = os.path.expanduser("~")
43 | samples_dir = os.path.join(home_dir, 'Music', 'Ableton', 'User Library', 'Samples', 'Imported')
44 | adg_dir = os.path.join(home_dir, 'Music', 'Ableton', 'User Library', 'Presets', 'Instruments', 'Created')
45 |
46 | ####################################################################
47 | # Main
48 | ####################################################################
49 |
50 | class ADGMaker(object):
51 | """
52 | Read CLI input, create ADGs.
53 |
54 | """
55 |
56 | jenv = Environment(loader=FileSystemLoader(os.path.dirname(os.path.realpath(__file__))),
57 | trim_blocks=True)
58 |
59 | # Ex: {'cello_05_forte_arco-normal': [ xml, xml, .. ]
60 | adgs = {}
61 | vargs = None
62 | default_note = 104
63 |
64 | def handle(self, argv=None):
65 | """
66 | Main function.
67 |
68 | Parses command, load settings and dispatches accordingly.
69 |
70 | """
71 | help_message = "Please supply a path to a folder of MP3s or --all. See --help for more options."
72 | parser = argparse.ArgumentParser(description='ADGMaker - Create and install Ableton Live Instruments.\n')
73 | parser.add_argument('samples_path', metavar='U', type=str, nargs='*', help=help_message)
74 | parser.add_argument('-d', '--debug', action='store_true', help='Debug (no delete XML)', default=False)
75 | parser.add_argument('-i', '--install', action='store_true', help='Install into Ableton directory', default=False)
76 | parser.add_argument('-a', '--all', action='store_true', help='Fetch all available instruments from philharmonia website', default=False)
77 | parser.add_argument('-v', '--version', action='store_true', default=False,
78 | help='Display the current version of ADGMaker')
79 |
80 | args = parser.parse_args(argv)
81 | self.vargs = vars(args)
82 |
83 | if self.vargs['version']:
84 | version = pkg_resources.require("adgmaker")[0].version
85 | print(version)
86 | return
87 |
88 | # Samples are an important requirement.
89 | if not self.vargs['samples_path'] and not self.vargs['all']:
90 | print(help_message)
91 | return
92 |
93 | # Make sure we have the necessary dirs to install into.
94 | if self.vargs['install']:
95 | if not os.path.exists(samples_dir):
96 | os.makedirs(samples_dir)
97 |
98 | if not os.path.exists(adg_dir):
99 | os.makedirs(adg_dir)
100 |
101 | if self.vargs['samples_path']:
102 | self.create_adg_from_samples_path(self.vargs['samples_path'][0])
103 |
104 | if self.vargs['all']:
105 | for zip_url in all_zip_urls:
106 |
107 | # Download the zip
108 | zip_file_name = zip_url.rsplit('/',1)[1]
109 | print("\nDownloading " + zip_file_name + "..\n")
110 |
111 | with open(zip_file_name, 'wb') as handle:
112 | response = requests.get(zip_url, stream=True)
113 | for block in response.iter_content(1024):
114 | handle.write(block)
115 |
116 | # Unzip to a directory
117 | dir_name = zip_file_name.split('.zip')[0]
118 | zip_ref = zipfile.ZipFile(zip_file_name, 'r')
119 | zip_ref.extractall(dir_name)
120 | zip_ref.close()
121 |
122 | # Delete zip
123 | os.remove(zip_file_name)
124 |
125 | # Create ADG from samples
126 | self.create_adg_from_samples_path(dir_name)
127 |
128 | self.adgs = {}
129 |
130 | print("Done! Remember to update your User Library in Live to see these new instruments!")
131 |
132 | def create_adg_from_samples_path(self, samples_path):
133 | """
134 | Create an ADG from the samples path.
135 |
136 | """
137 |
138 | # Normalize the input
139 | if samples_path[-1] != os.sep:
140 | samples_path = samples_path + os.sep
141 |
142 | # Percussion is a folder of folders
143 | given_name = None
144 | if 'percussion' in samples_path:
145 | mp3_list = []
146 | for root, dirnames, filenames in os.walk(samples_path):
147 | for filename in fnmatch.filter(filenames, '*.mp3'):
148 | mp3_list.append(os.path.join(root, filename))
149 | given_name = 'percussion'
150 |
151 | else:
152 | samples_path = samples_path + '*.mp3'
153 | mp3_list = glob.glob(samples_path)
154 |
155 | for mp3 in mp3_list:
156 | file_path = os.path.abspath(mp3)
157 | self.add_mp3_to_instrument(file_path, given_name)
158 |
159 | for adg_name in self.adgs.keys():
160 | final_xml = self.create_base_xml(adg_name)
161 | adg_file = self.create_adg(adg_name, final_xml)
162 |
163 | if self.vargs['install']:
164 | print("Installing " + adg_file + "..")
165 | dest_path = os.path.join(adg_dir, adg_file)
166 | shutil.move(adg_file, dest_path)
167 |
168 | return adg_file
169 |
170 | def add_mp3_to_instrument(self, file_path, given_name=None):
171 | """
172 | Given a complete file path, add to the XML for this instrument.
173 |
174 | Samples are in the format:
175 | {{instrument_name}}_{{note}}_{{length}}_{{velocity}}_{{hit_type}}.mp3
176 | Ex:
177 | double-bass_Gs3_1_piano_arco-normal.mp3
178 |
179 | """
180 | instrument_xml = self.create_instrument_xml(file_path)
181 | file_name_no_mp3 = file_path.split('.mp3')[0].split(os.sep)[-1]
182 | instrument_name, note, length, velocity, hit_type = file_name_no_mp3.split('_')
183 |
184 | if given_name:
185 | adg_name = given_name
186 | else:
187 | adg_name = instrument_name + '_' + length + "_" + velocity + '_' + hit_type
188 |
189 | if self.adgs.has_key(adg_name):
190 | adg_contents = self.adgs[adg_name]
191 | else:
192 | adg_contents = []
193 |
194 | adg_contents.append(instrument_xml)
195 | self.adgs[adg_name] = adg_contents
196 |
197 | # Install the MP3?
198 | if self.vargs['install']:
199 | dest_path = os.path.join(samples_dir, file_name_no_mp3 + '.mp3')
200 | shutil.move(file_path, dest_path)
201 |
202 | return
203 |
204 | def create_base_xml(self, adg_name):
205 | """
206 | Create the standard cruft XML for the ADG.
207 | """
208 |
209 | items = self.adgs[adg_name]
210 | xml = self.jenv.get_template('base_xml.tpl').render(
211 | items=items,
212 | )
213 |
214 | return xml
215 |
216 | def create_instrument_xml(self, file_path):
217 | """
218 | name: cello_C2_05_forte_arco-normal
219 | mp3_name: cello_C2_05_forte_arco-normal.mp3
220 | note_value: 80
221 | ableton_path: userfolder:/Users/rjones/Downloads/cello/#cello_C2_05_forte_arco-normal.mp3
222 | """
223 |
224 | file_name_no_mp3 = file_path.split('.mp3')[0].split(os.sep)[-1]
225 | instrument_name, note, length, velocity, hit_type = file_name_no_mp3.split('_')
226 |
227 | name = file_name_no_mp3
228 | mp3_name = name + '.mp3'
229 | note_value = self.string_to_midi_note(note)
230 | ableton_path = "userfolder:" + file_path.rsplit(os.sep, 1)[0] + os.sep + '#' + mp3_name
231 |
232 | data = file_path.encode('utf-16').encode('hex').upper()
233 |
234 | xml = self.jenv.get_template('instrument_xml.tpl').render(
235 | name=name,
236 | mp3_name=mp3_name,
237 | note_value=note_value,
238 | ableton_path=ableton_path,
239 | data=data
240 | )
241 |
242 | return xml
243 |
244 | def create_adg(self, adg_name, xml):
245 | """
246 | Create the final ADG file.
247 | """
248 |
249 | xml_name = adg_name + '.xml'
250 | adg_file = adg_name + '.adg'
251 |
252 | f = open(xml_name,'w')
253 | f.write(xml)
254 | f.close()
255 |
256 | with open(xml_name) as f_in, gzip.open(adg_file, 'wb') as f_out:
257 | f_out.writelines(f_in)
258 |
259 | if not self.vargs.get('d', False):
260 | os.remove(xml_name)
261 |
262 | print("Created " + adg_file + "!")
263 |
264 | return adg_file
265 |
266 | ##
267 | # Utility
268 | ##
269 |
270 | def string_to_midi_note(self, midstr):
271 | """
272 | In Ableton, C3 = 60 supposedly,
273 |
274 | but,
275 |
276 | ZoneSetting:ReceivingNote:80 == C2
277 | ZoneSetting:ReceivingNote:79 == C#2
278 |
279 |
280 | """
281 |
282 | # I am a bad person.
283 | notes_ref = {
284 |
285 | 'C0': 104,
286 | 'Cs0': 103,
287 | 'D0': 102,
288 | 'Ds0': 101,
289 | 'E0': 100,
290 | 'F0': 99,
291 | 'Fs0': 98,
292 | 'G0': 97,
293 | 'Gs0': 96,
294 | 'A0': 95,
295 | 'As0': 94,
296 | 'B0': 93,
297 |
298 | 'C1': 92,
299 | 'Cs1': 91,
300 | 'D1': 90,
301 | 'Ds1': 89,
302 | 'E1': 88,
303 | 'F1': 87,
304 | 'Fs1': 86,
305 | 'G1': 85,
306 | 'Gs1': 84,
307 | 'A1': 83,
308 | 'As1': 82,
309 | 'B1': 81,
310 |
311 | 'C2': 80,
312 | 'Cs2': 79,
313 | 'D2': 78,
314 | 'Ds2': 77,
315 | 'E2': 76,
316 | 'F2': 75,
317 | 'Fs2': 74,
318 | 'G2': 73,
319 | 'Gs2': 72,
320 | 'A2': 71,
321 | 'As2': 70,
322 | 'B2': 69,
323 |
324 | 'C3': 68,
325 | 'Cs3': 67,
326 | 'D3': 66,
327 | 'Ds3': 65,
328 | 'E3': 64,
329 | 'F3': 63,
330 | 'Fs3': 62,
331 | 'G3': 61,
332 | 'Gs3': 60,
333 | 'A3': 59,
334 | 'As3': 58,
335 | 'B3': 57,
336 |
337 | 'C4': 56,
338 | 'Cs4': 55,
339 | 'D4': 54,
340 | 'Ds4': 53,
341 | 'E4': 52,
342 | 'F4': 51,
343 | 'Fs4': 50,
344 | 'G4': 49,
345 | 'Gs4': 48,
346 | 'A4': 47,
347 | 'As4': 46,
348 | 'B4': 45,
349 |
350 | 'C5': 44,
351 | 'Cs5': 43,
352 | 'D5': 42,
353 | 'Ds5': 41,
354 | 'E5': 40,
355 | 'F5': 39,
356 | 'Fs5': 38,
357 | 'G5': 37,
358 | 'Gs5': 36,
359 | 'A5': 35,
360 | 'As5': 34,
361 | 'B5': 33,
362 |
363 | 'C6': 32,
364 | 'Cs6': 31,
365 | 'D6': 30,
366 | 'Ds6': 29,
367 | 'E6': 28,
368 | 'F6': 27,
369 | 'Fs6': 26,
370 | 'G6': 25,
371 | 'Gs6': 24,
372 | 'A6': 23,
373 | 'As6': 22,
374 | 'B6': 21,
375 |
376 | 'C7': 20,
377 | 'Cs7': 19,
378 | 'D7': 18,
379 | 'Ds7': 17,
380 | 'E7': 16,
381 | 'F7': 15,
382 | 'Fs7': 14,
383 | 'G7': 13,
384 | 'Gs7': 12,
385 | 'A7': 11,
386 | 'As7': 10,
387 | 'B7': 9,
388 |
389 | 'C8': 8,
390 | 'Cs8': 7,
391 | 'D8': 6,
392 | 'Ds8': 5,
393 | 'E8': 4,
394 | 'F8': 3,
395 | 'Fs8': 2,
396 | 'G8': 1,
397 | 'Gs8': 0,
398 | 'A8': -1,
399 | 'As8': -2,
400 | 'B8': -3,
401 |
402 | }
403 |
404 | note = notes_ref.get(midstr, None)
405 | if note:
406 | return note
407 | else:
408 | note = self.default_note
409 | self.default_note = self.default_note - 1
410 |
411 | if self.default_note == 0:
412 | self.default_note = 104
413 |
414 | return note
415 |
416 | def handle(): # pragma: no cover
417 | """
418 | Main program execution handler.
419 | """
420 |
421 | if platform.system() != "Darwin":
422 | print("ADGMaker currently only works for OSX. Sorry.")
423 | return
424 |
425 | try:
426 | adg_maker = ADGMaker()
427 | adg_maker.handle()
428 | except (KeyboardInterrupt, SystemExit): # pragma: no cover
429 | return
430 | except Exception as e:
431 | print(e)
432 |
433 | if __name__ == '__main__': # pragma: no cover
434 | handle()
435 |
--------------------------------------------------------------------------------
/adgmaker/base_xml.tpl:
--------------------------------------------------------------------------------
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 | 00000000020A000200010C4D6163696E746F7368204844000000000000000000000000000000D14F
44 | 1DEF482B000002329CAE094472756D205261636B0000000000000000000000000000000000000000
45 | 0000000000000000000000000000000000000000000000000000000000000000000002329F03D334
46 | 5FF60000000000000000FFFFFFFF000009200000000000000000000000000000000B496E73747275
47 | 6D656E747300001000080000D14F562F0000001100080000D334983600000001001C02329CAE0232
48 | 904802328B2802328B1E02328B1C02328B1B0000008C0002007B4D6163696E746F73682048443A41
49 | 70706C69636174696F6E733A0041626C65746F6E204C69766520392053756974652E6170703A0043
50 | 6F6E74656E74733A004170702D5265736F75726365733A00436F7265204C6962726172793A004465
51 | 76696365733A00496E737472756D656E74733A004472756D205261636B00000E0014000900440072
52 | 0075006D0020005200610063006B000F001A000C004D006100630069006E0074006F007300680020
53 | 00480044001200674170706C69636174696F6E732F41626C65746F6E204C69766520392053756974
54 | 652E6170702F436F6E74656E74732F4170702D5265736F75726365732F436F7265204C6962726172
55 | 792F446576696365732F496E737472756D656E74732F4472756D205261636B00001300012F00FFFF
56 | 0000
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 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 | 00000000020A000200010C4D6163696E746F7368204844000000000000000000000000000000D14F
361 | 1DEF482B000002329CAE094472756D205261636B0000000000000000000000000000000000000000
362 | 0000000000000000000000000000000000000000000000000000000000000000000002329F03D334
363 | 5FF60000000000000000FFFFFFFF000009200000000000000000000000000000000B496E73747275
364 | 6D656E747300001000080000D14F562F0000001100080000D334983600000001001C02329CAE0232
365 | 904802328B2802328B1E02328B1C02328B1B0000008C0002007B4D6163696E746F73682048443A41
366 | 70706C69636174696F6E733A0041626C65746F6E204C69766520392053756974652E6170703A0043
367 | 6F6E74656E74733A004170702D5265736F75726365733A00436F7265204C6962726172793A004465
368 | 76696365733A00496E737472756D656E74733A004472756D205261636B00000E0014000900440072
369 | 0075006D0020005200610063006B000F001A000C004D006100630069006E0074006F007300680020
370 | 00480044001200674170706C69636174696F6E732F41626C65746F6E204C69766520392053756974
371 | 652E6170702F436F6E74656E74732F4170702D5265736F75726365732F436F7265204C6962726172
372 | 792F446576696365732F496E737472756D656E74732F4472756D205261636B00001300012F00FFFF
373 | 0000
374 |
375 |
376 |
377 |
378 |
379 |
380 |
381 |
382 |
383 |
384 |
385 |
386 |
387 |
388 |
389 |
390 | {% for item in items %}
391 | {{item}}
392 | {% endfor %}
393 |
394 |
395 |
396 |
397 |
--------------------------------------------------------------------------------
/adgmaker/instrument_xml.tpl:
--------------------------------------------------------------------------------
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 | {{data}}
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 | {{data}}
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
371 |
372 |
373 |
374 |
375 |
376 |
377 |
378 |
379 |
380 |
381 |
382 |
383 |
384 |
385 |
386 |
387 |
388 |
389 |
390 |
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431 |
432 |
433 |
434 |
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447 |
448 |
449 |
450 |
451 |
452 |
453 |
454 |
455 |
456 |
457 |
458 |
459 |
460 |
461 |
462 |
463 |
464 |
465 |
466 |
467 |
468 |
469 |
470 |
471 |
472 |
473 |
474 |
475 |
476 |
477 |
478 |
479 |
480 |
481 |
482 |
483 |
484 |
485 |
486 |
487 |
488 |
489 |
490 |
491 |
492 |
493 |
494 |
495 |
496 |
497 |
498 |
499 |
500 |
501 |
502 |
503 |
504 |
505 |
506 |
507 |
508 |
509 |
510 |
511 |
512 |
513 |
514 |
515 |
516 |
517 |
518 |
519 |
520 |
521 |
522 |
523 |
524 |
525 |
526 |
527 |
528 |
529 |
530 |
531 |
532 |
533 |
534 |
535 |
536 |
537 |
538 |
539 |
540 |
541 |
542 |
543 |
544 |
545 |
546 |
547 |
548 |
549 |
550 |
551 |
552 |
553 |
554 |
555 |
556 |
557 |
558 |
559 |
560 |
561 |
562 |
563 |
564 |
565 |
566 |
567 |
568 |
569 |
570 |
571 |
572 |
573 |
574 |
575 |
576 |
577 |
578 |
579 |
580 |
581 |
582 |
583 |
584 |
585 |
586 |
587 |
588 |
589 |
590 |
591 |
592 |
593 |
594 |
595 |
596 |
597 |
598 |
599 |
600 |
601 |
602 |
603 |
604 |
605 |
606 |
607 |
608 |
609 |
610 |
611 |
612 |
613 |
614 |
615 |
616 |
617 |
618 |
619 |
620 |
621 |
622 |
623 |
624 |
625 |
626 |
627 |
628 |
629 |
630 |
631 |
632 |
633 |
634 |
635 |
636 |
637 |
638 |
639 |
640 |
641 |
642 |
643 |
644 |
645 |
646 |
647 |
648 |
649 |
650 |
651 |
652 |
653 |
654 |
655 |
656 |
657 |
658 |
659 |
660 |
661 |
662 |
663 |
664 |
665 |
666 |
667 |
668 |
669 |
670 |
671 |
672 |
673 |
674 |
675 |
676 |
677 |
678 |
679 |
680 |
681 |
682 |
683 |
684 |
685 |
686 |
687 |
688 |
689 |
690 |
691 |
692 |
693 |
694 |
695 |
696 |
697 |
698 |
699 |
700 |
701 |
702 |
703 |
704 |
705 |
706 |
707 |
708 |
709 |
710 |
711 |
712 |
713 |
714 |
715 |
716 |
717 |
718 |
719 |
720 |
721 |
722 |
723 |
724 |
725 |
726 |
727 |
728 |
729 |
730 |
731 |
732 |
733 |
734 |
735 |
736 |
737 |
738 |
739 |
740 |
741 |
742 |
743 |
744 |
745 |
746 |
747 |
748 |
749 |
750 |
751 |
752 |
753 |
754 |
755 |
756 |
757 |
758 |
759 |
760 |
761 |
762 |
763 |
764 |
765 |
766 |
767 |
768 |
769 |
770 |
771 |
772 |
773 |
774 |
775 |
776 |
777 |
778 |
779 |
780 |
781 |
782 |
783 |
784 |
785 |
786 |
787 |
788 |
789 |
790 |
791 |
792 |
793 |
794 |
795 |
796 |
797 |
798 |
799 |
800 |
801 |
802 |
803 |
804 |
805 |
806 |
807 |
808 |
809 |
810 |
811 |
812 |
813 |
814 |
815 |
816 |
817 |
818 |
819 |
820 |
821 |
822 |
823 |
824 |
825 |
826 |
827 |
828 |
829 |
830 |
831 |
832 |
833 |
834 |
835 |
836 |
837 |
838 |
839 |
840 |
841 |
842 |
843 |
844 |
845 |
846 |
847 |
848 |
849 |
850 |
851 |
852 |
853 |
854 |
855 |
856 |
857 |
858 |
859 |
860 |
861 |
862 |
863 |
864 |
865 |
866 |
867 |
868 |
869 |
870 |
871 |
872 |
873 |
874 |
875 |
876 |
877 |
878 |
879 |
880 |
881 |
882 |
883 |
884 |
885 |
886 |
887 |
888 |
889 |
890 |
891 |
892 |
893 |
894 |
895 |
896 |
897 |
898 |
899 |
900 |
901 |
902 |
903 |
904 |
905 |
906 |
907 |
908 |
909 |
910 |
911 |
912 |
913 |
914 |
915 |
916 |
917 |
918 |
919 |
920 |
921 |
922 |
923 |
924 |
925 |
926 |
927 |
928 |
929 |
930 |
931 |
932 |
933 |
934 |
935 |
936 |
937 |
938 |
939 |
940 |
941 |
942 |
943 |
944 |
945 |
946 |
947 |
948 |
949 |
950 |
951 |
952 |
953 |
954 |
955 |
956 |
957 |
958 |
959 |
960 |
961 |
962 |
963 |
964 |
965 |
966 |
967 |
968 |
969 |
970 |
971 |
972 |
973 |
974 |
975 |
976 |
977 |
978 |
979 |
980 |
981 |
982 |
983 |
984 |
985 |
986 |
987 |
988 |
989 |
990 |
991 |
992 |
993 |
994 |
995 |
996 |
997 |
998 |
999 |
1000 |
1001 |
1002 |
1003 |
1004 |
1005 |
1006 |
1007 |
1008 |
1009 |
1010 |
1011 |
1012 |
1013 |
1014 |
1015 |
1016 |
1017 |
1018 |
1019 |
1020 |
1021 |
1022 |
1023 |
1024 |
1025 |
1026 |
1027 |
1028 |
1029 |
1030 |
1031 |
1032 |
1033 |
1034 |
1035 |
1036 |
1037 |
1038 |
1039 |
1040 |
1041 |
1042 |
1043 |
1044 |
1045 |
1046 |
1047 |
1048 |
1049 |
1050 |
1051 |
1052 |
1053 |
1054 |
1055 |
1056 |
1057 |
1058 |
1059 |
1060 |
1061 |
1062 |
1063 |
1064 |
1065 |
1066 |
1067 |
1068 |
1069 |
1070 |
1071 |
1072 |
1073 |
1074 |
1075 |
1076 |
1077 |
1078 |
1079 |
1080 |
1081 |
1082 |
1083 |
1084 |
1085 |
1086 |
1087 |
1088 |
1089 |
1090 |
1091 |
1092 |
1093 |
1094 |
1095 |
1096 |
1097 |
1098 |
1099 |
1100 |
1101 |
1102 |
1103 |
1104 |
1105 |
1106 |
1107 |
1108 |
1109 |
1110 |
1111 |
1112 |
1113 |
1114 |
1115 |
1116 |
1117 |
1118 |
1119 |
1120 |
1121 |
1122 |
1123 |
1124 |
1125 |
1126 |
1127 |
1128 |
1129 |
1130 |
1131 |
1132 |
1133 |
1134 |
1135 |
1136 |
1137 |
1138 |
1139 |
1140 |
1141 |
1142 |
1143 |
1144 |
1145 |
1146 |
1147 |
1148 |
1149 |
1150 |
1151 |
1152 |
1153 |
1154 |
1155 |
1156 |
1157 |
1158 |
1159 |
1160 |
1161 |
1162 |
1163 |
1164 |
1165 |
1166 |
1167 |
1168 |
1169 |
1170 |
1171 |
1172 |
1173 |
1174 |
1175 |
1176 |
1177 |
1178 |
1179 |
1180 |
1181 |
1182 |
1183 |
1184 |
1185 |
1186 |
1187 |
1188 |
1189 |
1190 |
1191 |
1192 |
1193 |
1194 |
1195 |
1196 |
1197 |
1198 |
1199 |
1200 |
1201 |
1202 |
1203 |
1204 |
1205 |
1206 |
1207 |
1208 |
1209 |
1210 |
1211 |
1212 |
1213 |
1214 |
1215 |
1216 |
1217 |
1218 |
1219 |
1220 |
1221 |
1222 |
1223 |
1224 |
1225 |
1226 |
1227 |
1228 |
1229 |
1230 |
1231 |
1232 |
1233 |
1234 |
1235 |
1236 |
1237 |
1238 |
1239 |
1240 |
1241 |
1242 |
1243 |
1244 |
1245 |
1246 |
1247 |
1248 |
1249 |
1250 |
1251 |
1252 |
1253 |
1254 |
1255 |
1256 |
1257 |
1258 |
1259 |
1260 |
1261 |
1262 |
1263 |
1264 |
1265 |
1266 |
1267 |
1268 |
1269 |
1270 |
1271 |
1272 |
1273 |
1274 |
1275 |
1276 |
1277 |
1278 |
1279 |
1280 |
1281 |
1282 |
1283 |
1284 |
1285 |
1286 |
1287 |
1288 |
1289 |
1290 |
1291 |
1292 |
1293 |
1294 |
1295 |
1296 |
1297 |
1298 |
1299 |
1300 |
1301 |
1302 |
1303 |
1304 |
1305 |
1306 |
1307 |
1308 |
1309 |
1310 |
1311 |
1312 |
1313 |
1314 |
1315 |
1316 |
1317 |
1318 |
1319 |
1320 |
1321 |
1322 |
1323 |
1324 |
1325 |
1326 |
1327 |
1328 |
1329 |
1330 |
1331 |
1332 |
1333 |
1334 |
1335 |
1336 |
1337 |
1338 |
1339 |
1340 |
1341 |
1342 |
1343 |
1344 |
1345 |
1346 |
1347 |
1348 |
1349 |
1350 |
1351 |
1352 |
1353 |
1354 |
1355 |
1356 |
1357 |
1358 |
1359 |
1360 |
1361 |
1362 |
1363 |
1364 |
1365 |
1366 |
1367 |
1368 |
1369 |
1370 |
1371 |
1372 |
1373 |
1374 |
1375 |
1376 |
1377 |
1378 |
1379 |
1380 |
1381 |
1382 |
1383 |
1384 |
1385 |
1386 |
1387 |
1388 |
1389 |
1390 |
1391 |
1392 |
1393 |
1394 |
1395 |
1396 |
1397 |
1398 |
1399 |
1400 |
1401 |
1402 |
1403 |
1404 |
1405 |
1406 |
1407 |
1408 |
1409 |
1410 |
1411 |
1412 |
1413 |
1414 |
1415 |
1416 |
1417 |
1418 |
1419 |
1420 |
1421 |
1422 |
1423 |
1424 |
1425 |
1426 |
1427 |
1428 |
1429 |
1430 |
1431 |
1432 |
1433 |
1434 |
1435 |
1436 |
1437 |
1438 |
1439 |
1440 |
1441 |
1442 |
1443 |
1444 |
1445 |
1446 |
1447 |
1448 |
1449 |
1450 |
1451 |
1452 |
1453 |
1454 |
1455 |
1456 |
1457 |
1458 |
1459 |
1460 |
1461 |
1462 |
1463 |
1464 |
1465 |
1466 |
1467 |
1468 |
1469 |
1470 |
1471 |
1472 |
1473 |
1474 |
1475 |
1476 |
1477 |
1478 |
1479 |
1480 |
1481 |
1482 |
1483 |
1484 |
1485 |
1486 |
1487 |
1488 |
1489 |
1490 |
1491 |
1492 |
1493 |
1494 |
1495 |
1496 |
1497 |
1498 |
1499 |
1500 |
1501 |
1502 |
1503 |
1504 |
1505 |
1506 |
1507 |
1508 |
1509 |
1510 |
1511 |
1512 |
1513 |
1514 |
1515 |
1516 |
1517 |
1518 |
1519 |
1520 |
1521 |
1522 |
1523 |
1524 |
1525 |
1526 |
1527 |
1528 |
1529 |
1530 |
1531 |
1532 |
1533 |
1534 |
1535 |
1536 |
1537 |
1538 |
1539 |
1540 |
1541 |
1542 |
1543 |
1544 |
1545 |
1546 |
1547 |
1548 |
1549 |
1550 |
1551 |
1552 |
1553 |
1554 |
1555 |
1556 |
1557 |
1558 |
1559 |
1560 |
1561 |
1562 |
1563 |
1564 |
1565 |
1566 |
1567 |
1568 |
1569 |
1570 |
1571 |
1572 |
1573 |
1574 |
1575 |
1576 |
1577 |
1578 |
1579 |
1580 |
1581 |
1582 |
1583 |
1584 |
1585 |
1586 |
1587 |
1588 |
1589 |
1590 |
1591 |
1592 |
1593 |
1594 |
1595 |
1596 |
1597 |
1598 |
1599 |
1600 |
1601 |
1602 |
1603 |
1604 |
1605 |
1606 |
1607 |
1608 |
1609 |
1610 |
1611 |
1612 | {{data}}
1613 |
1614 |
1615 |
1616 |
1617 |
1618 |
1619 |
1620 |
1621 |
1622 |
1623 |
1624 |
1625 |
1626 |
1627 |
1628 |
1629 |
1630 |
1631 |
1632 |
1633 |
1634 |
--------------------------------------------------------------------------------