Some designing of PSALM Increment One
Slightly overdue (I mean overdue in going onto this blog), here's some of the more interesting design work done for the first increment of PSALM.
First, the component/module relationships. Please be aware that this is not in any kind of standard notation, but is actually just a tidied representation of what I have written be hand in my grand A4 pad of joy. The key should at the top-right should explain the crazy colour scheme. The arrows give a basic idea of relationships. So, for example, the GUI (which is circular in the diagram for no real reason other than most operations run through it) calls the DB (database) Bridge component. The little arrows under some of the components just highlight some of the more important functions or sub-components.
I have named these 'components' because they won't necessarily constitute modules. If anything, each block is more like a 'part' of the program. So the external XML database is included on the diagram, as is the Setlist object class. I will also point out at this stage that this design is just a starting point that is likely to need refinement. This first increment is about getting something built that will be functional to stimulate further thought and then work.
Next, we have a plan for the layout of the XML database:
<song title="..." writer="..." date="..." basekey="..." capokey="..." ...>
<verse no="..."> | <chorus> | <prechorus> | <bridge> | <tag>
Lyrics go here, [C] chords go in sqaure brackets [Em]
[D/F#] Sometimes chords mig[G]ht be in awkward places. [C] [G]
</verse> | </chorus> | </prechorus> | </bridge> | </tag>
...insert more songs here!
Hopefully that gives you an idea. Additional imformation can be stored in the song tag, such as theme, quick reference or songbook information. This is not so important for this increment of the program.
For a better example, take a look at this code snippet: songs-nocopyright.xml. You may find it simpler to view this file in a text editor by saving it first rather loading it directly in your browser.
Again, this is just an example, which won't necessarily be used exactly like this in the final implementation.