Jump to content

JulioHerrlein

Members
  • Posts

    799
  • Joined

  • Last visited

Everything posted by JulioHerrlein

  1. WOW !!!!!!!!!!!!!!!!!!! Amazing !!!! This is great !!!!! MUCH LOVE !!! Thanks ! Next release ? All the best !! Julio LOOKING FORWARD !!!!!!!!!!!!!!!!!!!!!!!!!!!! THIS IS THE Coolest thing !!! hahahahahaha
  2. I'm very Happy to see your work, Janusz! Thank you for all your Hard work in Opusmodus! All the best! Julio added 7 minutes later André Meier came with something interesting in this post: Best, Julio
  3. After we figure out the pattern sequence, gen-sive or make-scale do the job. added 1 minute later PATT # 1 (make-scale 'c4 12 :alt '(1 5)) This is why I love Opusmodus ! Best !! Julio
  4. Dear All, I have a little suggestion for workflow. 1) A simple context menu button (or some way) to open the XML snippet in other software. Like right-clicking on the snippet and have an option (OS based option) like "open with" (musescore, finale, sibelius, etc) This could be useful for collecting material for a piece to be edited outside Opusmodus. I personally use Musescore with my students. It's free, open and runs windows and mac. I also use Finale for myself. This simple options could solve the problem of the audition of many different snippets. 2) Another (much more complex) idea would be when click over each snippet to have a play panel, similar to the live coding panel (with play/stop button, tempo, volume, maybe sound and channel assigment , according to the number of staves, etc... This could be handy. Best, Julio added 2 minutes later Like this (when clicking over the snipett inside Opusmodus:
  5. Some sieve values: PATT #53 (7 -1) PATT #59 (8 -1 -1) PATT #77 (13 -4 -2 -1) PATT #80 (-1 7) PATT #85 (-2 1 7) PATT #99 (-1 3 4) PATT #181 (1 3) PATT #186 (5 -1) PATT #295 (-1 6)
  6. Yes ! Each pattern could be conceived as a sieve. PATT #1 could be like this: (setf patt '(1 5)) (setf pitches (gen-sieve '(c4 e6) patt :type :pitch)) Best, Julio
  7. Dear Friends, Thank you all for replying ! What I had in mind was not a replication of the book itself, like a database but, instead, a kind of generative way for doing the same kind of symmetrical patterns. Of course, this way, we could not retrieve the exact number of the pattern as in the book edition. Actually, the patterns could be generated with a few informations: 1) The principal tones (the division of the octave). This could be specified as a keyword argument in the end of the Function, like :tritone :ditone :sesquitone :wt :st :quadritone :sesquiquadritone etc, etc... 2) The way the pattern is constructed, i.e., the combination of inter/ultra/infrapolation, as the figure bellow: 3) The ambitus of the pattern, i.e., how many octaves/times the pattern will rise up through the range. For example, Pattern #1 could spread all over a wide range as the figure below: or just in the C4-C5 ambitus, like this: 4) The restriction of the AMBITUS could make some patterns based on larger divisions of the octave, wrap around inside the ambitus determined, acting as a kind of Sieve, filtering the pitches. Just some ideas... All the best ! Julio
  8. Dear All, Is there a function where you can specify the creation parameters of the melodic patterns devised by Slonimsky on the Thesaurus ? Is there a function where you can specify: 1) The division of the octave (Tritone, Ditone, Sesquitone) ? 2) The pattern way (Infra, ultra, interpolation, and their combinations) ? Thanks for the help ! Best, Julio
  9. Dear Stephane, I'm getting some strange results... Don't know what I am missing... almost there ;;; Some cells (setf cells-reserv '( (s c4 d4 e4 g4) (s c4 d4 g4 e4) (s g4 e4 c4 d4) (s c4 d4 f4 g4) (s c4 d4 g4 f4) (s g4 f4 c4 d4) (s c4 d4 g4 f4) (s g4 gb4 f4 g4) (s g4 gb4 f4 a4) (s g4 gs4 a4 c5) (s d4 f4 g4 a4) (s a4 g4 f4 d4) (s d4 f4 g4 c5))) ;0 Trane 1235 (CELL 1) ;1 Trane 1253 ;2 trane 5312 ;3 1245 > C7M (passing 4) CELL 2 ;4 1254 ;5 5412 ;6 1254 ;7 CROM1 1 7 b7 1 ;8 1 7 b7 9 ;9 5 #5 6 1 ;10 1 b3 4 5 ;11 5 4 b3 1 ;12 2451 (setf vector-ctrl-1 '(7 7 7)) (setf trsp1 '(0 1 2 0)) (setf phrase1 (pitch-transpose trsp1 (vector-map cells-reserv vector-ctrl-1))) When evaluating this code: (setf vector-ctrl-1 '(7 7 7)) (setf trsp1 '(0 1 2 0)) (setf phrase1 (pitch-transpose trsp1 (vector-map cells-reserv vector-ctrl-1))) I get the cell #7 transposed correctily by semitones But when I mix some different cell, I get an unexpected result... (setf vector-ctrl-1 '(7 7 7 1)) (setf trsp1 '(0 1 2 0)) (setf phrase1 (pitch-transpose trsp1 (vector-map cells-reserv vector-ctrl-1))) With the code above, I expected to have the same chromatic cell#7 3 times and then the cell #1 in transposition 0, but I got cell #12 3 times INSTEAD of cell #7, and then the cell #1, as expected... I dont know what I missed... The VECTOR number correspond to the order of the cells in the cells-reserv, right ? Best, Julio
  10. Dear Stephane, Really cool solution. Now I got the idea of vector maps. Best, Julio
  11. Another idea would be to set manually each transposition in one setf expression. But it would be a lot of work. Maybe the setf Expressions could be related to chord symbols, so we could related to a tune structure
  12. Dear All I'm studying some 4-note cells for Coltrane like jazz patterns from a video lesson of saxophonist Chad Lefkowitz-Brown. The idea is to use a limited number of cells (no more than 10, some diatonic and some chromatic) to create longer lines, like the line below. 1) The idea is to connect the same fragments with different transpositions, adjusting the transpositions according to the construction of the line. I need a code where I can experiment the order and the transpositions of the fragments to create a longer line. Sometimes I can have two times the same pattern with different transposition. 2) The possibility to rotate fragments would be interesting also. 3) Lastly: a random assembling that automatically adjust the transpositions, in a way that each new fragment starts exactly a semitone up or down the preceeding fragment, making a cohesive line. Any help is welcome !! Looking forward to PLAY this patterns on the guitar and record some Videos (where I can mention Opusmodus, of course !) Best ! Julio I tried the form below, but I'm not very happy with that. (setf xa (pitch-fragment 1 4 '(g4 gb4 f4 g4) :transpose '(0)) xb (pitch-fragment 2 3 '(c4 cs4 fs4) :transpose '(0 1 2 1)) xc (pitch-fragment 2 3 '(c4 cs4 fs4) :transpose '(0 1 2 1)) xd (pitch-fragment 2 3 '(c4 cs4 fs4) :transpose '(0 1 2 1)) xe (pitch-fragment 1 3 '(g4 g4 g4) :transpose '(0 1 2 1)) xf (pitch-fragment 4 3 '(c4 c4 c4) :transpose '(0 0 7 2))) (setf seq '(f a e)) (assemble-section 'x seq) (setf jazzline (flatten (assemble-section 'x seq))) (setf rhyjazz (gen-repeat 50 '(s))) (make-omn :length rhyjazz :pitch jazzline) These are not the actual fragments, just some ideas do debug the code...
  13. Thank you, Torsten. I have a physical copy of Reina's book. Best, Julio
  14. Thank you, Torsten ! It worked ! I like the Carnatic Stuff. Best, Julio
  15. Dear Torsten, Thank you. Now I understand that this command is done inside Opusmodus. Unfortunately, I got some errors... ;Compiling "/Users/acme/common-lisp/string-tools/make-package.lisp"... ;Compiling "/Users/acme/common-lisp/string-tools/string-tools.lisp"... ;Compiling "/Users/acme/common-lisp/string-tools/export.lisp"... ;Compiling "/Users/acme/common-lisp/ta-utilities/make-package.lisp"... ;Compiling "/Users/acme/common-lisp/ta-utilities/my-utilities.lisp"... ;Compiling "/Users/acme/common-lisp/ta-utilities/export.lisp"... ;Compiling "/Users/acme/common-lisp/fenv/sources/make-package.lisp"... ;Compiling "/Users/acme/common-lisp/fenv/sources/macros.lisp"... ;Compiling "/Users/acme/common-lisp/fenv/sources/fenv.lisp"... ;Compiling "/Users/acme/common-lisp/fenv/sources/export.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/package.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/from-studio-flat.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/01.domain.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/02.engine.lisp"... ;Compiler warnings for "home:common-lisp;cluster-engine;sources;02.engine.lisp.newest" : ; In poly-engine: type declaration for unknown variable master-index ; In poly-engine: Undeclared free variable *debug-count-backtrack* ; In an anonymous lambda form at position 22432: Duplicate definitions of assign-pitches-for-motif, in this file ; In an anonymous lambda form at position 23073: Duplicate definitions of assign-pitches-for-nth-motif, in this file ; In fail: Undeclared free variable *debug-count-backtrack* (2 references) ; In an anonymous lambda form at position 36784: Duplicate definitions of backjump-engine, in this file ; Warning: Lisp compilation failed while compiling #<cl-source-file "cluster-engine" "sources/02.engine"> ; While executing: uiop/lisp-build:check-lisp-compile-warnings, in process Listener-1(7). ; Warning: Lisp compilation had style-warnings while compiling #<cl-source-file "cluster-engine" "sources/02.engine"> ; While executing: uiop/lisp-build:check-lisp-compile-warnings, in process Listener-1(7). ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/03.Fwd-rules.lisp"... ; In fwd-rule-indep: type declaration for unknown variable length-metric-engin ; In fwd-rule2: type declaration for unknown variable length-metric-engin ; In fwd-rule3: type declaration for unknown variable length-metric-engin ; In fwd-rule4: type declaration for unknown variable length-metric-engin ; In fwd-rule5: type declaration for unknown variable length-metric-engin ; In fwd-rule6: type declaration for unknown variable length-metric-engin ; In fwd-rule6b: type declaration for unknown variable length-metric-engin ; Warning: Lisp compilation failed while compiling #<cl-source-file "cluster-engine" "sources/03.Fwd-rules"> ; While executing: uiop/lisp-build:check-lisp-compile-warnings, in process Listener-1(7). ; Warning: Lisp compilation had style-warnings while compiling #<cl-source-file "cluster-engine" "sources/03.Fwd-rules"> ; While executing: uiop/lisp-build:check-lisp-compile-warnings, in process Listener-1(7). ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/04.Backtrack-rules.lisp"... ; In backtrack-rule2: type declaration for unknown variable highest-index ; Warning: Lisp compilation failed while compiling #<cl-source-file "cluster-engine" "sources/04.Backtrack-rules"> ; While executing: uiop/lisp-build:check-lisp-compile-warnings, in process Listener-1(7). ; Warning: Lisp compilation had style-warnings while compiling #<cl-source-file "cluster-engine" "sources/04.Backtrack-rules"> ; While executing: uiop/lisp-build:check-lisp-compile-warnings, in process Listener-1(7). ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/05.rules-interface.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/05a.rules-interface-1engine.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/05b.rules-interface-2engines.lisp"... ;Compiler warnings for "home:common-lisp;cluster-engine;sources;05b.rules-interface-2engines.lisp.newest" : ; In get-start-nth-pointer-durations: type declaration for unknown variable rhythmseq ; In get-end-nth-pointer-durations: type declaration for unknown variable rhythmseq ; Warning: Lisp compilation failed while compiling #<cl-source-file "cluster-engine" "sources/05b.rules-interface-2engines"> ; While executing: uiop/lisp-build:check-lisp-compile-warnings, in process Listener-1(7). ; Warning: Lisp compilation had style-warnings while compiling #<cl-source-file "cluster-engine" "sources/05b.rules-interface-2engines"> ; While executing: uiop/lisp-build:check-lisp-compile-warnings, in process Listener-1(7). ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/05c.rules-interface-2engines.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/05d.rules-interface-2engines.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/05e.rules-interface-2engines.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/05f.rules-interface-3engines.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/05g.rules-interface-any-n-engines.lisp"... ;Compiler warnings for "home:common-lisp;cluster-engine;sources;05g.rules-interface-any-n-engines.lisp.newest" : ; In get-pitches-for-slices-of-notecounts: type declaration for unknown variable notecount ; In get-pitches-for-slices-of-notecounts: type declaration for unknown variable voicenr ; In get-pitches-for-slices-of-notecounts: type declaration for unknown variable notecount-slice ; In replace-notecount-by-timepoint: type declaration for unknown variable timepoint ; In replace-notecount-by-timepoint: type declaration for unknown variable notecountgroups ; In get-durations-for-slices-of-notecounts: type declaration for unknown variable notecount ; In get-durations-for-slices-of-notecounts: type declaration for unknown variable voicenr ; In get-durations-for-slices-of-notecounts: type declaration for unknown variable notecount-slice ; In get-timepoints-for-slices-of-notecounts: type declaration for unknown variable notecount ; In get-timepoints-for-slices-of-notecounts: type declaration for unknown variable voicenr ; In get-timepoints-for-slices-of-notecounts: type declaration for unknown variable notecount-slice ; Warning: Lisp compilation failed while compiling #<cl-source-file "cluster-engine" "sources/05g.rules-interface-any-n-engines"> ; While executing: uiop/lisp-build:check-lisp-compile-warnings, in process Listener-1(7). ; Warning: Lisp compilation had style-warnings while compiling #<cl-source-file "cluster-engine" "sources/05g.rules-interface-any-n-engines"> ; While executing: uiop/lisp-build:check-lisp-compile-warnings, in process Listener-1(7). ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/05h.rules-higher-level.lisp"... ;Compiler warnings for "home:common-lisp;cluster-engine;sources;05h.rules-higher-level.lisp.newest" : ; In an anonymous lambda form at position 453: Duplicate definitions of melodic-statement-for-dur, in this file ; Warning: Lisp compilation failed while compiling #<cl-source-file "cluster-engine" "sources/05h.rules-higher-level"> ; While executing: uiop/lisp-build:check-lisp-compile-warnings, in process Listener-1(7). ; Warning: Lisp compilation had style-warnings while compiling #<cl-source-file "cluster-engine" "sources/05h.rules-higher-level"> ; While executing: uiop/lisp-build:check-lisp-compile-warnings, in process Listener-1(7). ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/05i.rules-stop-search.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/05n.rules-interface-nn-engines.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/06.heuristic-rules-interface.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/06a.heuristic-rules-interface-1engine.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/06b.heuristic-rules-interface-2engines.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/06c.heuristic-rules-interface-2engines.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/06d.heuristic-rules-interface-2engines.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/06e.heuristic-rules-interface-2engines.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/06f.heuristic-rules-interface-3engines.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/06g.heuristic-rules-interface-any-n-engines.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/07.backjumping.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/08.decode.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/09.utilities.lisp"... ;Compiler warnings for "home:common-lisp;cluster-engine;sources;09.utilities.lisp.newest" : ; In get-nr-for-engine-with-highest-index: type declaration for unknown variable engine ; In remove-list-before-startpoint: type declaration for unknown variable endpoint ; In get-durations-at-notecounts: type declaration for unknown variable notecount ; In get-durations-at-notecounts: type declaration for unknown variable voicenr ; In get-durations-at-notecounts: type declaration for unknown variable notecounts ; In get-timepoints-at-notecounts: type declaration for unknown variable notecount ; In get-timepoints-at-notecounts: type declaration for unknown variable voicenr ; In get-timepoints-at-notecounts: type declaration for unknown variable notecounts ; In get-timepoints-at-notecounts-one-voice: type declaration for unknown variable notecount ; In get-timepoints-at-notecounts-one-voice: type declaration for unknown variable notecounts-all-voice ; In get-timepoints-at-notecounts-one-voice: type declaration for unknown variable list-voicenrs ; In remove-rests-and-gracenotes-from-durationlist: type declaration for unknown variable timepoints ; In get-timepoints-from-any-timepoint-minus-nsteps-ignor-rests-and-gracenotes: type declaration for unknown variable vsolution ; In get-events-from-any-timepoint-minus-nsteps-ignor-rests-and-gracenotes: type declaration for unknown variable vsolution ; In get-notecounts-from-any-timepoint-minus-nsteps-ignor-rests-and-gracenotes: type declaration for unknown variable vsolution ; In get-timepoints-from-any-timepoint-minus-nsteps-ignor-rests: type declaration for unknown variable vsolution ; In get-events-from-any-timepoint-minus-nsteps-ignor-rests: type declaration for unknown variable vsolution ; In get-notecounts-from-any-timepoint-minus-nsteps-ignor-rests: type declaration for unknown variable vsolution ; In get-timepoints-from-any-timepoint-minus-nsteps-ignor-rests-simplify-gracenotes: type declaration for unknown variable vsolution ; In get-timepoints-from-any-timepoint-minus-nsteps: type declaration for unknown variable vsolution ; In get-notecounts-from-any-timepoint-minus-nsteps: type declaration for unknown variable all-events ; In get-timepoints-from-any-timepoint-minus-nsteps-ignor-gracenotes: type declaration for unknown variable vsolution ; In get-events-from-any-timepoint-minus-nsteps-ignor-gracenotes: type declaration for unknown variable vsolution ; In get-timepoints-from-before-any-timepoint-minus-nsteps-ignor-gracenotes: type declaration for unknown variable all-onsets-no-gracenote-no-rest ; In an anonymous lambda form at position 106661: Duplicate definitions of remove-rests-and-return-notecountlist, in this file ; In matrix-trans: type declaration for unknown variable row ; Warning: Lisp compilation failed while compiling #<cl-source-file "cluster-engine" "sources/09.utilities"> ; While executing: uiop/lisp-build:check-lisp-compile-warnings, in process Listener-1(7). ; Warning: Lisp compilation had style-warnings while compiling #<cl-source-file "cluster-engine" "sources/09.utilities"> ; While executing: uiop/lisp-build:check-lisp-compile-warnings, in process Listener-1(7). ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/09b.markov-tools.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/09c.cluster-energy-profile.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/12.debug-tools.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/13.convert-pmc-rules.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/_000.main-interface.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-engine/sources/export.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-rules/sources/package.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-rules/sources/utils.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-rules/sources/rhythm-rules.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-rules/sources/melody-rules.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-rules/sources/harmony-rules.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-rules/sources/counterpoint-rules.lisp"... ;Compiling "/Users/acme/common-lisp/cluster-rules/sources/export.lisp"... ;Compiling "/Users/acme/common-lisp/tot/sources/slippery-chicken.lisp"... ;Compiling "/Users/acme/common-lisp/tot/sources/utils.lisp"... ;Compiling "/Users/acme/common-lisp/tot/sources/OMN-utils.lisp"... ;Compiling "/Users/acme/common-lisp/tot/sources/score.lisp"... ;Compiling "/Users/acme/common-lisp/tot/sources/rhythm.lisp"... ;Compiler warnings for "home:common-lisp;tot;sources;rhythm.lisp.newest" : ; In an anonymous lambda form at position 65555: Duplicate definitions of total-duration, in this file and in "home:common-lisp;tot;sources;OMN-utils.lisp.newest" ; Warning: Lisp compilation failed while compiling #<cl-source-file "tot" "sources/rhythm"> ; While executing: uiop/lisp-build:check-lisp-compile-warnings, in process Listener-1(7). ; Warning: Lisp compilation had style-warnings while compiling #<cl-source-file "tot" "sources/rhythm"> ; While executing: uiop/lisp-build:check-lisp-compile-warnings, in process Listener-1(7). ;Compiling "/Users/acme/common-lisp/tot/sources/pitch.lisp"... ;Compiler warnings for "home:common-lisp;tot;sources;pitch.lisp.newest" : ; In stretch-pitches: Undeclared free variable chord ; Warning: Lisp compilation failed while compiling #<cl-source-file "tot" "sources/pitch"> ; While executing: uiop/lisp-build:check-lisp-compile-warnings, in process Listener-1(7). ; Warning: Lisp compilation had style-warnings while compiling #<cl-source-file "tot" "sources/pitch"> ; While executing: uiop/lisp-build:check-lisp-compile-warnings, in process Listener-1(7). ;Compiling "/Users/acme/common-lisp/tot/sources/velocity.lisp"... ;Compiling "/Users/acme/common-lisp/tot/sources/articulations.lisp"... ;Compiling "/Users/acme/common-lisp/tot/sources/PWGL.lisp"... ;Compiling "/Users/acme/common-lisp/tot/sources/constraints.lisp"... ;Compiling "/Users/acme/common-lisp/tot/sources/form.lisp"... ;Compiling "/Users/acme/common-lisp/tot/sources/orchestration.lisp"... :tot nil 89 > :tot nil 89 >
  16. Thanks, Torsten ! Very nice. I want to try it. I did the Git terminal stuff I don't know how to to this part... ASFD is something I have to install ? ??? Best, Julio USAGE part (???) This library is an ASDF system (ASDF is the de facto standard for building Common Lisp software), and you can load it into your Lisp compiler as follows. All dependency libraries are loaded automatically as well. (require :tot) For most convenient use within Opusmodus, you can drag and drop the whole folder of this library in the browser of an Opusmodus project. Then, visit the HTML documentation of this library from within Opusmodus: open the tot, and then its doc folder and click on an HTML file, say index.html. You can now browse the reference documentation of the library, which explains its individual definitions. Most importantly, you can directly run all example code in the documentation from within Opusmodus (thanks, Janusz Podrazik). added 1 minute later Second question : When I update to next Opusmodus release, do I have to reinstall it ? Best, Julio
  17. Dear Stephane, Thanks a lot for this insigthful answer ! There are so many beautiful hidden secrets in Opusmodus. I was searching for row, 12-tone, series, but never ocurred to me searching "air". There's a need for some historical music-oriented tutorials. All the best ! Julio
×
×
  • Create New...

Important Information

Terms of Use Privacy Policy