Old 09-11-2013, 05:11 PM   #1
Sasje
Human being with feelings
 
Sasje's Avatar
 
Join Date: Sep 2013
Posts: 137
Default ReaChorder a new extension

EDIT: This extension is under development. Newer versions maybe posted, check the thread for the latest version. Most often, the last uploaded version is the one that works best. From now on, only Python 3.3 and up is supported.

Required software:

Reaper 4.5.2+: http://reaper.fm/
Python 3.3: http://www.python.org/download/releases/3.3.0/
SWS extension v2.4.0 #1: http://www.standingwaterstudios.com/
How to install Python for Reaper: http://forum.cockos.com/showthread.php?t=127110
Mac OS tkinter issues? See: http://www.python.org/getit/mac/tcltk/
------------------------------------------------------------------------------------------------

I've created a new ReaScript plugin for Reaper, called ReaChorder. With ReaChorder one can create a "song" from scratch. A kind of song wizard that proposes chord/song structures based upon the circle of fifths. It proposes the best possible chords for a chosen mood, key and scale. It then draws the song structure into the MIDI editor. Cheating? perhaps! Of course, it isn't fool-proof, but that wasn't the intention. It's just for fun and inspiration.

For it work:

1. Move the contents of the .zip to your /Scripts/ folder in Reaper. For NT this can be: C:\Users\<username>\AppData\Roaming\REAPER\Scripts
2. Import the ReaChorder.py into the action window (new/load).

Then you can load it in the MIDI piano-roll editor, or add script action to the toolbar as a shortcut. (right click on the toolbar in the MIDI editor).
In any event, it must be called from the MIDI piano roll editor.

Would love to hear what you think about it. And if you have some improvements, I would love to hear them too.






Download: http://stash.reaper.fm/v/17939/Rea-Chorder.zip

-

Last edited by Sasje; 11-22-2013 at 03:06 AM.
Sasje is offline   Reply With Quote
Old 09-11-2013, 06:22 PM   #2
mwe
Human being with feelings
 
mwe's Avatar
 
Join Date: Mar 2012
Location: Kentucky, USA
Posts: 254
Default

Maybe just me but I get this error when I load the script.



If I click OK I get the error again. Click OK again and the script appears to run. I'm running Reaper v4.52x64/Win7x64.
mwe is offline   Reply With Quote
Old 09-11-2013, 06:56 PM   #3
Sasje
Human being with feelings
 
Sasje's Avatar
 
Join Date: Sep 2013
Posts: 137
Default

Hi mwe,

I also get that sporadically. Sometimes it starts fine, and sometimes it throws. Why it happens is a mystery to me... I'm not very well versed in Python, in fact, it's my 2nd Python script. Maybe we can suppress it, or maybe it's just a bug...

Microsoft says: "This is an unsupported way to load Visual C++ DLLs."

Probably something to do with tkinter?

...so if anyone has a suggestion/idea?

-

Last edited by Sasje; 09-11-2013 at 07:02 PM.
Sasje is offline   Reply With Quote
Old 09-11-2013, 07:36 PM   #4
mwe
Human being with feelings
 
mwe's Avatar
 
Join Date: Mar 2012
Location: Kentucky, USA
Posts: 254
Default

I'm not really a programmer at all so this is multiple orders of magnitude beyond me. FWIW, I'm running Python v3.2.5 and SWS 2.4.0.
mwe is offline   Reply With Quote
Old 09-13-2013, 07:11 AM   #5
nofish
Human being with feelings
 
nofish's Avatar
 
Join Date: Oct 2007
Location: home is where the heart is
Posts: 6,879
Default

Thanks for this.

I just tested it, no errors here so far, seems to work fine.

I like such "creativity aids" when the damn writer's block is round the corner.

Though I hope the Reaper devs can somehow make working with tkinter apps like this a little less quirky.

Currently:

- hides behind Reaper's window when clicking anywhere in Reaper

- no undo (as said, but probably hard to implement)

- steals Reaper's keyboard shortcuts when in focus
nofish is offline   Reply With Quote
Old 09-13-2013, 08:44 AM   #6
spk77
Human being with feelings
 
Join Date: Aug 2012
Location: Finland
Posts: 2,286
Default

Quote:
Originally Posted by Sasje View Post
Hi mwe,

I also get that sporadically. Sometimes it starts fine, and sometimes it throws. Why it happens is a mystery to me... I'm not very well versed in Python, in fact, it's my 2nd Python script. Maybe we can suppress it, or maybe it's just a bug...

Microsoft says: "This is an unsupported way to load Visual C++ DLLs."

Probably something to do with tkinter?

...so if anyone has a suggestion/idea?

-
Working fine here (Win XP 32bit), thank you.

Quote:
Originally Posted by nofish View Post
Thanks for this.

I just tested it, no errors here so far, seems to work fine.

I like such "creativity aids" when the damn writer's block is round the corner.

Though I hope the Reaper devs can somehow make working with tkinter apps like this a little less quirky.

Currently:

- hides behind Reaper's window when clicking anywhere in Reaper
It is possible to place the tkinter window on top of other windows with "wm_attributes("-topmost", 1)":

Code:
class Application:

    def __init__(self, root):
        self.root = root
        self.root.title('ReaChorder')
        self.root.wm_attributes("-topmost", 1)
        ttk.Frame(self.root, borderwidth=5, relief="sunken", width=740,height=300).pack()
        self.init_widgets()
Quote:
Originally Posted by nofish View Post
- no undo (as said, but probably hard to implement)
Undo should work if these (bolded) lines are added to ReaChord_Functions.py:

Code:
from sws_python import *
from contextlib import contextmanager
from random import randint

@contextmanager
def undoable(message):
    RPR_Undo_BeginBlock2(0)
    try:
        yield
    finally:
        RPR_Undo_EndBlock2(0, message, -1)

posi = 0
.
.
.
def drawMidi(a,b,c,d,e):
    with undoable("Undo point name here"):
        selAllNotesTselection()
        deleteSelectedNotes()
        MidiPos = 11520
        rand = randint(0, 2)
        #drawChords(a,b,c,d,0,'verse',rand)
        e = int(e)
        d = int(d)

        if e == 0 or e == 1: # Chords only
.
.
.
Here's another "undo" example (flip selected notes - post #38):
http://forum.cockos.com/showthread.php?t=91871
Quote:
Originally Posted by nofish View Post
- steals Reaper's keyboard shortcuts when in focus
This is the most annoying thing with tkinter - ReaScript doesn't support multithreading .

Last edited by spk77; 09-13-2013 at 09:09 AM.
spk77 is offline   Reply With Quote
Old 09-13-2013, 08:57 AM   #7
nofish
Human being with feelings
 
nofish's Avatar
 
Join Date: Oct 2007
Location: home is where the heart is
Posts: 6,879
Default

Thanks for the info, spk77.
nofish is offline   Reply With Quote
Old 09-13-2013, 10:29 AM   #8
BeardyWeirdy
Human being with feelings
 
Join Date: Feb 2012
Location: UK
Posts: 29
Default

Working here too. Useful. It's in 3/4 time. Can it be set to other time signatures?

Thanks for your efforts
BeardyWeirdy is offline   Reply With Quote
Old 09-14-2013, 05:01 AM   #9
Lazarus
Human being with feelings
 
Join Date: Aug 2013
Posts: 1,355
Default

You can change it to 4/4 by finding this in ReaChord_Functions....
in drawMidi
Code:
 selAllNotesTselection()
    deleteSelectedNotes()
    MidiPos = 11520   ### ~~~~ change this to 15360
    rand = randint(0, 2)
    #drawChords(a,b,c,d,0,'verse',rand)
    e = int(e)
    d = int(d)
in drawChords
Code:
   
    # create chords
    position = [0,length * 3,length * 6, length * 9, length * 12, length * 15, length * 18, length * 21, length * 24, length * 27, length * 30, length * 33] ### ---- delete this line
    position = 0   ### ++++ add this line
    for i, val in enumerate(progressions[int(a)-1]):
    
        if ChordMode == 'verse':
           x = int(chartselect[int(val)])
        if ChordMode == 'chorus':
           x = int(useCircle[int(val)])
        
        # for j, vm in enumerate(Chords[x]):
        ### ~~~~~ change the following lines to
        note = addNote(midiTake,channel,velocity,position + p,int(Chords[x][0])-12,length*4,0)
        note = addNote(midiTake,channel,velocity,position + p,int(Chords[x][1])-12,length*4,0)
        note = addNote(midiTake,channel,velocity,position + p,int(Chords[x][2])-12,length*4,0)
        position += length*4 ### ++++ add this line
... I've been doing quite a bit to the code actually, if it's okay with sasje I'll share it in the next day or so. It now (should) work(s) in Python 2 and 3 (wasn't in v2 now is) and does 3/4 and 4/4. I've also been changing the structure of the data and how it's read to make it easier to add new things to it.
Lazarus is offline   Reply With Quote
Old 09-14-2013, 10:29 AM   #10
BeardyWeirdy
Human being with feelings
 
Join Date: Feb 2012
Location: UK
Posts: 29
Default

Thanks. I look forward to seeing what you have done
BeardyWeirdy is offline   Reply With Quote
Old 09-18-2013, 05:12 PM   #11
Lazarus
Human being with feelings
 
Join Date: Aug 2013
Posts: 1,355
Default

I've changed the structure of the code a bit and it now has a Settings window. This probably needs testing in P3 because I don't know if there are any P2 vs P3 differences in there.

It now does a bass note on another channel, draws regions too (both optionally), allows you to choose channels for the different parts and stores/recalls those settings.

Thanks very much for this Sasje, you can see I've commented out some settings which I'm going to add later. I was going to code something like this from scratch so you've saved a heap of time.

Cheers.
Attached Files
File Type: zip ReaChorder.zip (46.8 KB, 90 views)
Lazarus is offline   Reply With Quote
Old 09-18-2013, 05:24 PM   #12
fwd0120
Human being with feelings
 
Join Date: Aug 2011
Posts: 285
Default

Is this basically like Band in a box or ChordPulse? If so, that would be so awesome!! Need to DL Python before I try it.
fwd0120 is offline   Reply With Quote
Old 09-19-2013, 02:43 AM   #13
Sasje
Human being with feelings
 
Sasje's Avatar
 
Join Date: Sep 2013
Posts: 137
Default

I'm sorry for the late reply, I am very sick at the moment and unable to use a computer for more than 30 minutes.

If anyone wants to join in on developing this extension: feel free to post your version. It's yours, it's the Reaper spirit. ...Then we can take it from there? collaboration? and work from newly posted versions? ...the new features sound great. Keep 'em coming. Thanks for the kind help and suggestions.

I have some additional ideas:

- more chord formula's. (pentatonic, dorian, aeolian...)
- random/reverse chord function based upon the chosen formula (since the verse is pretty much fixed right now)
- add strum patterns (for guitar?)
- drum pattern generator?
- more chords? (it only has min, maj and dim right now) and maybe a chord picker in a new tab? (to manually draw chords)

When I'm a bit better I'll check it out. Looking forward to it.

-

Last edited by Sasje; 09-19-2013 at 03:07 AM.
Sasje is offline   Reply With Quote
Old 09-19-2013, 06:46 AM   #14
BeardyWeirdy
Human being with feelings
 
Join Date: Feb 2012
Location: UK
Posts: 29
Default

Hi

I am getting a global name error "unicode is not defined" (line 12 of the module path os.path.dirname(unicod(_file_,encoding))

I am using P3, so it might be that?
BeardyWeirdy is offline   Reply With Quote
Old 09-19-2013, 09:29 AM   #15
nofish
Human being with feelings
 
nofish's Avatar
 
Join Date: Oct 2007
Location: home is where the heart is
Posts: 6,879
Default

Quote:
Originally Posted by BeardyWeirdy View Post
Hi

I am getting a global name error "unicode is not defined" (line 12 of the module path os.path.dirname(unicod(_file_,encoding))

I am using P3, so it might be that?
Same here.

[img]http://img809.**************/img809/8572/wxd.png[/img]

Also using Python 3.2, WinXP
nofish is offline   Reply With Quote
Old 09-19-2013, 10:08 AM   #16
Lazarus
Human being with feelings
 
Join Date: Aug 2013
Posts: 1,355
Default

EDIT: The attached version is still broken... do NOT download. Merci.

@Sasje: sorry to hear about your illness, you've put in a great shift so far getting this done. Re the drum and guitar patterns, at the moment it's just about ready to output MIDI to trigger different notes per section so using it in combination with other existing plugins would get better results more quickly than coding it from scratch in this. So before that the other ideas would be quicker to implement.

The code/data in general could do with more organizing as well to make it easier to add the extras in. I haven't touched the text output section for example, but this isn't linked to the actual MIDI output at the moment so there are things like that could do with getting sorted out first imo.

@BeardyWeirdy/nofish: sorry, it seems like I am the spanner in the works by using P2. I've attached a version that should fix that (unicode is now str in P3), but at least the imports up until that point have worked. There are tiny differences like in the ttk library Frame is now frame.

I should really get Python 3 installed and working with Reaper. The last time I tried I came across the same issues that people in the other thread have encountered but P2 was plug and play so I just used that. I'll give it another shot.
Attached Files
File Type: zip ReaChorder.zip (47.4 KB, 52 views)

Last edited by Lazarus; 09-19-2013 at 12:10 PM.
Lazarus is offline   Reply With Quote
Old 09-19-2013, 11:38 AM   #17
fwd0120
Human being with feelings
 
Join Date: Aug 2011
Posts: 285
Default

I'd love to try this but I am having a Python problem. I can't get rescript to work, I guess I'm setting the python directory wrong. Where should it be, what DLL do I set it for????
fwd0120 is offline   Reply With Quote
Old 09-19-2013, 12:02 PM   #18
Sasje
Human being with feelings
 
Sasje's Avatar
 
Join Date: Sep 2013
Posts: 137
Default

To get Python working: install any version you want. I prefer 3.1 Then manually copy the pythonXX.dll from C:/Windows/system32/ to: C:\pythonXX\ and C:\pythonXX\DLLs\ - if you have Windows... You can use any version this way. This is because Python doesn't copy the dll to it's location for Reaper to discover it.

I use Python 3.1 but I can also use Python 2.7 this way.
Sasje is offline   Reply With Quote
Old 09-19-2013, 12:09 PM   #19
Lazarus
Human being with feelings
 
Join Date: Aug 2013
Posts: 1,355
Default

I just installed Python 3 and in Preferences -> ReaScript, set the custom path to C:\Windows\System32 and put python33.dll in the "Force Python to use .dll" field.

So I am now on P3 and can see that Sasje#s wonderful script is still broken in P3. I'll fix it tonight.
Lazarus is offline   Reply With Quote
Old 09-19-2013, 02:23 PM   #20
Lazarus
Human being with feelings
 
Join Date: Aug 2013
Posts: 1,355
Default

That's it working (only) in P3 now after a couple of name changes. I've attached it here.
Attached Files
File Type: zip ReaChorder.zip (47.2 KB, 80 views)
Lazarus is offline   Reply With Quote
Old 09-19-2013, 04:55 PM   #21
fwd0120
Human being with feelings
 
Join Date: Aug 2011
Posts: 285
Default

Thanks guys!!! Got the Python to work... kinda... Made a new track and put a midi item in it. Then opened the ME and went to actions and tried to execute the reachord. (I installed the .py when I finally got python working.)

What am I doing wrong now?
Attached Images
File Type: jpg img.jpg (8.0 KB, 176 views)
fwd0120 is offline   Reply With Quote
Old 09-19-2013, 05:06 PM   #22
Lazarus
Human being with feelings
 
Join Date: Aug 2013
Posts: 1,355
Default

You just need to install the SWS/S&M extensions so that the script can use the MIDI stuff in it.
Lazarus is offline   Reply With Quote
Old 09-19-2013, 07:01 PM   #23
fwd0120
Human being with feelings
 
Join Date: Aug 2011
Posts: 285
Default

I did that, now I think I am close. But I am now getting this error. It did open up a reachorder window, but it is frozen and empty.
Attached Images
File Type: jpg img.jpg (14.4 KB, 160 views)
fwd0120 is offline   Reply With Quote
Old 09-20-2013, 12:12 AM   #24
Lazarus
Human being with feelings
 
Join Date: Aug 2013
Posts: 1,355
Default

Hmmm, it's working here in 3.3 and 3.2 but not 3.1 or 3.0. What version are you using?

edit: hmmm, didn't change any dimensions in the GUI between the v2 version and the v4 and the labels in the background image are out of alignment. Strange things are afoot at Camp Python.

Last edited by Lazarus; 09-20-2013 at 02:28 AM.
Lazarus is offline   Reply With Quote
Old 09-20-2013, 02:32 AM   #25
BeardyWeirdy
Human being with feelings
 
Join Date: Feb 2012
Location: UK
Posts: 29
Default

I get same error as FWD0120 here

I am on win 7, 32bit version, and Python is 33

We are getting closer! I hope I can help more soon, I am just starting to learn python, (Worked in pascal for years), I will see if I can bug hunt at all this end
BeardyWeirdy is offline   Reply With Quote
Old 09-20-2013, 05:12 AM   #26
Lazarus
Human being with feelings
 
Join Date: Aug 2013
Posts: 1,355
Default

It smells like the hack I used for including ReaChord_Functions from the resources directory is the issue. If you move that into the same directory as ReaChorder and in ReaChorder put...

Code:
from ReaChord_Functions import *
... it may well even possibly slightly work!
Lazarus is offline   Reply With Quote
Old 09-20-2013, 06:48 AM   #27
BeardyWeirdy
Human being with feelings
 
Join Date: Feb 2012
Location: UK
Posts: 29
Default

I tried it - but no luck, still the same error as before with the same message as fwd0120 posted (expt line number have moved on omen obviously.

it now looks like

from reaper_python import *
from ReaChord_Functions import *
import os
import sys
sys.argv=["Main"]

and I copied ReaChord_Functions up to the same folder as the main py script.

Still getting the stuck window behind reaper as well

Sorry!
BeardyWeirdy is offline   Reply With Quote
Old 09-20-2013, 07:22 AM   #28
Sasje
Human being with feelings
 
Sasje's Avatar
 
Join Date: Sep 2013
Posts: 137
Default

Can't get it to work. I tried: Python 2.7, 3.0, 3.1 and 3.3 each versions throws different errors...

I get this error in 3.3: It tries to find images/icons and fails. It tries to find it in /Documents and Settings/ But I have Windows 7 so that directory doesn't exist...?

That DIR isn't hardcoded anywhere, so it's really strange to what is happening...?

Sorry, I'm too sick to come up with a solution right now.
Sasje is offline   Reply With Quote
Old 09-20-2013, 05:03 PM   #29
Lazarus
Human being with feelings
 
Join Date: Aug 2013
Posts: 1,355
Default

Hmmm.... I'll take the graphics out and put everything in the same folder and upload again tomorrow.
Lazarus is offline   Reply With Quote
Old 09-21-2013, 06:26 PM   #30
Lazarus
Human being with feelings
 
Join Date: Aug 2013
Posts: 1,355
Default

Okay, here's a version with the images removed by default (unless you want to enable them by graphics = True at top of main file).

It works with the images used or not here... Python 3.3 32bit, standard install of Reaper 4.52 32bit, Windows 7 64bit.
Attached Files
File Type: zip ReaChorder.zip (39.4 KB, 55 views)
Lazarus is offline   Reply With Quote
Old 09-21-2013, 07:59 PM   #31
fwd0120
Human being with feelings
 
Join Date: Aug 2011
Posts: 285
Default

(BTW, I'm using the latest stable python, sws, and have Reaper 4.51 and windows XP 32bit)
Got this new error, tried loading up the latest reachord.
Sorry to be a pain in the rear, I honestly don't intend to! lol
Can't wait to get to get it working though. Been waiting to see a plug like this in reaper.
Attached Images
File Type: jpg img.jpg (42.0 KB, 185 views)
fwd0120 is offline   Reply With Quote
Old 09-22-2013, 12:47 AM   #32
spk77
Human being with feelings
 
Join Date: Aug 2012
Location: Finland
Posts: 2,286
Default

Quote:
Originally Posted by fwd0120 View Post
(BTW, I'm using the latest stable python, sws, and have Reaper 4.51 and windows XP 32bit)
Got this new error, tried loading up the latest reachord.
Sorry to be a pain in the rear, I honestly don't intend to! lol
Can't wait to get to get it working though. Been waiting to see a plug like this in reaper.
I got it working when I edited RetrieveSettings() function in ReaChord_Functions.py:

Code:
    def RetrieveSettings(self):
        self.msg("RetrieveSettings - enter")
        if not RPR_HasExtState(RC.REACHORD, "FirstTime"):
            RPR_SetExtState(RC.REACHORD, "FirstTime", "NotFirstTime", True)
        else:
            for key, val in RC.Settings.items():
                RC.Settings[key][0] = str(RPR_GetExtState(RC.REACHORD, str(key)))
                RC.Settings[key][1] = int(RPR_GetExtState(RC.REACHORD, str(key)+"1"))
                self.msg("Retrieved... "+key+".... "+str(RC.Settings[key][0])+".... "+str(RC.Settings[key][1]))

        self.msg("RetrieveSettings - exit")
spk77 is offline   Reply With Quote
Old 09-22-2013, 01:13 AM   #33
A_zimuth
Human being with feelings
 
Join Date: Feb 2011
Posts: 23
Default

I've got the script running without any errors but nothing is ever generated on the track. Any suggestions?
A_zimuth is offline   Reply With Quote
Old 09-22-2013, 02:10 AM   #34
Lazarus
Human being with feelings
 
Join Date: Aug 2013
Posts: 1,355
Default

You need to have the MIDI editor open and it writes into the active take in it.

@spk77: nice one, I didn't notice that check through the cloud of sawdust generated by my hacking.
Lazarus is offline   Reply With Quote
Old 09-22-2013, 02:19 AM   #35
Lazarus
Human being with feelings
 
Join Date: Aug 2013
Posts: 1,355
Default

Oops, here the version with spk77's fix....

ps. are the graphics still causing problems with graphics=True?
Attached Files
File Type: zip ReaChorder.zip (40.2 KB, 87 views)
Lazarus is offline   Reply With Quote
Old 09-22-2013, 02:55 AM   #36
A_zimuth
Human being with feelings
 
Join Date: Feb 2011
Posts: 23
Default

Quote:
Originally Posted by Lazarus View Post
You need to have the MIDI editor open and it writes into the active take in it.
I do have the editor open and it will draw the regions but no notes are created. I've made sure that the event filter is disabled also. I think it might be time for a fresh install.

EDIT: I figured it out. The checkboxes in the settings panel were checked but were all "greyed out" except for the Regions checkbox. Working now and thanks for the help.
A_zimuth is offline   Reply With Quote
Old 09-22-2013, 03:00 AM   #37
sinkmusic
Human being with feelings
 
sinkmusic's Avatar
 
Join Date: Feb 2006
Location: decepticon mothership in a hidden place inside a mountain
Posts: 3,217
Default

Thank you, it looks like a fun extension !
sinkmusic is offline   Reply With Quote
Old 09-22-2013, 09:52 AM   #38
Sasje
Human being with feelings
 
Sasje's Avatar
 
Join Date: Sep 2013
Posts: 137
Default

Works great so far.

I checked the images, when I set it to True this attached screenshot will show again. I don't have a /Documents and Settings/, I'm on Windows 7, so it should read /Appdata/Roaming/REAPER/...

Maybe it's due to the hardcoded sys.hexversion?

EDIT:

I played a bit with it, and this seems to fix it. Yes it's hardcoded for Win7/Vista

Code:
import os
Code:
#self.resource_path = _getdirectory_.module_path() + '/' #+"/resources/"

self.resource_path = os.environ.get("APPDATA") + '\\REAPER\\Scripts\\ReaChorder\\' #+"\resources\"
So I think we need a OS sniffer?

btw: I actually think it looks cleaner without the images/icons they seem to be a bit misaligned on my system.

-
Attached Images
File Type: png Untitled-2.png (33.2 KB, 148 views)

Last edited by Sasje; 09-22-2013 at 10:29 AM.
Sasje is offline   Reply With Quote
Old 09-22-2013, 10:18 AM   #39
fwd0120
Human being with feelings
 
Join Date: Aug 2011
Posts: 285
Default

Working!!!! At least It seems so. I'll follow up this post.
fwd0120 is offline   Reply With Quote
Old 09-22-2013, 10:33 AM   #40
fwd0120
Human being with feelings
 
Join Date: Aug 2011
Posts: 285
Default

Okay, after playing around with it for a few minutes:
I really like it! Great potential. It did crash (incl. Reaper) after 5 minutes, but I know that happens at such an early stage.
If I were to have any input, here are some features I would find useful.
It would be great to write-in your own progressions to tweak them. Also if it had a legend (more like a library of basic types) for chords and inversions. Chordpulse (there is a demo) does this very well. Anyway, that would be a huge thing for this.
Also, it would be great to have a little more control of the structure. Be able to set the length of the verse, chorus, etc..
Those would be the things I might look into after the stability gets worked out.
I can see this project has a bright future! Keep it up!!!
fwd0120 is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -7. The time now is 09:56 PM.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.