[EMAIL PROTECTED] wrote: > Frederic Rentsch wrote: > >> [EMAIL PROTECTED] wrote: >> >>> These are csound files. Csound recently added python as a scripting >>> language and is allowing also allowing csound calls from outside of >>> csound. The nice thing about csound is that instead of worrying about >>> virus and large files it is an interpiter and all the files look >>> somewhat like html. 4,000 virus free instruments for $20 is available >>> at >>> http://www.csounds.com and the csound programming book is also >>> available. The downside is that csound is can be realy ugly looking >>> (that is what I am trying to change) and it lets you write ugly looking >>> song code that is almost unreadable at times (would look nice in a >>> grid) >>> > snip snip snip snip snip .........
> I was hoping to add and remove instruments.. although the other should > go into my example file because it will come in handy at some point. > It would also be cool to get a list of instruments along with any > comment line if there is one into a grid but that is two different > functions. > > http://www.dexrow.com > > Eric, Below the dotted line there are two functions. "csound_filter ()" extracts and formats instrument blocks from csound files and writes the output to another file. (If called without an output file name, the output displays on the screen). The second function, "make_instrument_dictionaries ()", takes the file generated by the first function and makes two dictionaries. One of them lists instrument ids keyed on instrument description, the other one does it the other way around, listing descriptions by instrument id. Instrument ids are file name plus instrument number. You cannot depend on this system to function reliably, because it extracts information from comments. I took my data from "ems.music.utexas.edu/program/mus329j/CSPrimer.pdf" the author of which happens to lead his instrument blocks with a header made up of comment lines, the first of which characterizes the block. That first line I use to make the dictionaries. If your data doesn't follow this practice, then you may not get meaningful dictionaries and are in for some hacking. In any case, this doesn't look like a job that can be fully automated. But if you can build your data base with a manageable amount of manual work you should be okay. The SE filter likewise works depending on formal consistency with my sample. If it fails, you may have to either tweak it or move up to a parser. I'll be glad to provide further assistance to the best of my knowledge. But you will have to make an effort to express yourself intelligibly. As a matter of fact the hardest part of proposing solutions to your problem is guessing what your problem is. I suggest you do this: before you post, show the message to a good friend and edit it until he understands it. Regards Frederic . ------------------------------------------------------------------------------------------------------------------------ def csound_filter (csound_file_name, name_of_formatted_instrument_blocks_file = sys.stdout): """ This function filters and formats instrument blocks out of a csound file. csound_formatter (csound_file_name, name_of_formatted_instrument_blocks_file) csound_formatter (csound_file_name) # Single argument: screen output """ import SE Instruments_Filter = SE.SE ('<EAT> "~;.*~==(10)" "~instr(.|\n)*?endin~==(10)(10)"') INDENT = 10 CODE_LENGTH = 50 def format (): for l in instruments_file: line = l.strip () if line == '': out_file.write ('\n') else: if line [0] == ';': # Comment line out_file.write ('%s\n' % line) else: code = comment = '' if line [-1] == ':': # Label out_file.write ('%s\n' % line) else: if ';' in line: code, comment = line.split (';') out_file.write ('%*s%-*s;%s\n' % (INDENT, '', CODE_LENGTH, code, comment)) else: out_file.write ('%*s%s\n' % (INDENT, '', line)) instruments_file_name = Instruments_Filter (csound_file_name) instruments_file = file (instruments_file_name, 'w+a') if name_of_formatted_instrument_blocks_file != sys.stdout: out_file = file (name_of_formatted_instrument_blocks_file, 'wa') owns_out_file = True else: out_file = name_of_formatted_instrument_blocks_file owns_out_file = False format () if owns_out_file: out_file.close () def make_instrument_dictionaries (name_of_formatted_instrument_blocks_file): """ This function takes a file made by the previous function and generates two dictionaries. One records instrument ids by description. The other one instrument descriptions by id. Instrument ids are made up of file name and instrument number. If these two dictionaries are pickled they can be used like data bases and added to incrementally. """ import re instrument_numbers_re = re.compile ('instr *([0-9,]+)') in_file = file (name_of_formatted_instrument_blocks_file, 'ra') instrument_descriptions_by_id = {} instrument_ids_by_description = {} inside = False for line in in_file: line = line.strip () if not inside: if line: instrument_description = line [1:].rstrip () inside = True else: if line == '': inside = False if inside: if line.startswith ('instr'): instrument_numbers = instrument_numbers_re.match (line).group (1).split (',') instrument_ids = ['%s: %s' % (name_of_formatted_instrument_blocks_file, i_n) for i_n in instrument_numbers] instrument_ids_by_description [instrument_description] = instrument_ids for instrument_id in instrument_ids: instrument_descriptions_by_id [instrument_id] = instrument_description in_file.close () return instrument_descriptions_by_id, instrument_ids_by_description --------------------------------------------------------------------------------------------- >>> for instrument_id in instrument_descriptions_by_id: print '%s - %s' % (instrument_id, instrument_descriptions_by_id [instrument_id]) T:\instruments: 5 - Simple Gating Instrument with Chorus T:\instruments: 4 - Portamento/Panning Instrument T:\instruments: 12 - Basic FM Instrument with Variable Vibrato T:\instruments: 11 - Basic FM Instrument with Variable Vibrato T:\instruments: 10 - Basic FM Instrument with Variable Vibrato --------------------------------------------------------------------------------------------- >>> for description in instrument_ids_by_description: print description for instrument in instrument_ids_by_description [description]: print ' ', instrument Basic FM Instrument with Variable Vibrato T:\instruments: 9 T:\instruments: 10 T:\instruments: 11 T:\instruments: 12 Simple Gating Instrument with Chorus T:\instruments: 5 T:\instruments: 6 T:\instruments: 7 T:\instruments: 8 Portamento/Panning Instrument T:\instruments: 1 T:\instruments: 2 T:\instruments: 3 T:\instruments: 4 --------------------------------------------------------------------------------------------- -- http://mail.python.org/mailman/listinfo/python-list