Sonicviz

MooZk Feature Design

 

SonicViz

MooZk  Feature Design

ã Paul Cohen 2002

3/10 Hayward St • Paddington

Qld • 4064

Phone 07-38763426 • Email: paulcohen@ozemail.com.au

 


Text Box: STATEMENT OF CONFIDENTIALITY
This document has been prepared in good faith. Many factors outside my current knowledge or control affect the recipient’s needs and project plans. The responsibility lies with the recipient to evaluate the document for applicability. 
The document is proprietary and confidential and all information is provided in reliance upon the recipient’s covenant to keep such information confidential and for the exclusive use of its employees.
The recipient agrees to inform its present and future employees, who receive or have access to this document of its confidential nature, and to instruct each employee not to disclose any information in this document to others.
All rights reserved. This document is an unpublished work and may be duplicated or distributed only with written permission from me.
The following notice shall be reproduced on any copies permitted to be made.
Ó Paul Cohen 2002

 

 

 


 

Revision History

 

 

 

 

Document

Version

Date

Revised By

Revision

Description

Approved

By

1.0

18/08/02

Paul Cohen

Initial Version

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Table of Contents

Use-case Level 1.1. 6

Use-case Level 1.2. 7

Use-case Level 1.3. 8

Use-case Level 2.1. 9

Use-case Level 3.1. 10

Feature Heading. 11

Code Snippet 12


Use-case Level 1.1

Goal

Sound range exercise by working the sound spectrum

Level

1. Seascape. Music: ambient.

Scope

Primary solo task

Trigger

Player action by entry into bubble spout trigger radius

Primary Actors

Player

BubbleSpout

Secondary Actors

Camera

Pre Conditions

Player has entered the bubble spout trigger radius

Success End Conditions

  • Player has exercised bass, mid and treble regions of the sound range.
  • Spotlight illuminates Level1.2 terrain point or Fog rolls back

Failure End Conditions

Does not trigger Spotlight for illuminate Level1.2 terrain point.

Description

Name: Work spectrum 

Purpose: Allow the player to explore their vocal range

Users: Player

Dependencies:

  • WTVisualizer of 100 bins split into 5 ranges. Filter to select dominant frequency and map the various dynamics to spout parameters such as scale/loudness, speed, force, rate.
  • Need to just take the lower third (say 80hz-2000hz) for human vocal range

 

UseCase  Revision #

Action Taken, Notes

When?

By Whom?

0.1

 Bin cutoff ~1khz

Pc

18/09/02

 

 

 


Use-case Level 1.2

Goal

Sound range exercise2 by working the sound spectrum

Level

1. Seascape. Music: ambient.

Scope

Primary solo task

Trigger

Player action by entry into “gardening” terrain point trigger radius

Primary Actors

Player

Plant, Anemone, Lily, Geyser?

Secondary Actors

Camera

Pre Conditions

Player has entered the “gardening” terrain point trigger radius

Success End Conditions

  • Player has exercised major scale by painting the ground with various plants.
  • Spotlight illuminates Level1.3 terrain point. or Fog rolls back

Failure End Conditions

Does not trigger Spotlight for illuminate Level1.3 terrain point.

Description

Name: Work spectrum 

Purpose: Allow the player to explore their vocal range

Users: Player

Dependencies:

  • WTVisualizer of 100 bins split into 5 ranges. Filter to select dominant frequency and map the various dynamics to the entity growth parameters of scale/loudness and introduce colour/pitch (as single spout uses one bitmap – possible to map multiple spouts to ranges)
  • Create 255 bins from 255hz++ @ 1hz resolution. Set ranges for major scale.

 

UseCase  Revision #

Action Taken, Notes

When?

By Whom?

0.1

 Refine bin ranges

Pc

18/09/02

 


Use-case Level 1.3

Goal

Note recognition exercise

Level

1. Seascape. Music: ambient.

Scope

Primary solo task

Trigger

Player action by entry into “fish attraction point” trigger radius

Primary Actors

Player

Fish

Secondary Actors

Camera

Pre Conditions

Player has entered the “fish attraction point” trigger radius

Success End Conditions

  • Player has correctly attracted 6 different sized groups of fish via specific notes mapping by using the chromatic scale.
  • Spotlight illuminates Level2.1terrain point. or Fog rolls back

Failure End Conditions

Does not trigger Spotlight for illuminate Level2.1terrain point.

Description

Name: Hit notes 

Purpose: Train player in hitting specific notes

Users: Player

Dependencies:

  • WTVisualizer of 100 bins split into 5 ranges. Set a mid range to specific bin frequencies for note selection for mapping to fish groups. As per UC1.2
  • Flocking/Swarm algorithm – 3D path/Spline following.
  • Maybe only mid frequency attracts fish…high/low scares them away…discovery challenge subgoal.

 

UseCase  Revision #

Action Taken, Notes

When?

By Whom?

0.1

 Update

Pc

18/09/02

 


Use-case Level 2.1

Goal

Simple Melody recognition and repetition (Close Encounters “call and response”)

Level

1. Seascape. Music: Beat based dancable.

Scope

Primary task

Trigger

Completion of Level 1.3 introduces Koan controlled NPC

Primary Actors

Player

KoanNPC

Secondary Actors

Camera

Pre Conditions

Completion of Level 1.3

Success End Conditions

  • Player reproduces 3 melodies correctly
  • Portal for entry to surface appears or Fog rolls back

Failure End Conditions

Does not trigger UCLevel 3.1 actors Portal for entry to surface

Description

Name: Simple Melody recognition 

Purpose: Pattern recognition and repetition

Users: Player

Dependencies:

  • WTVisualizer of 100 bins split into 5 ranges. Set a mid range to specific bin frequencies for note selection for mapping to pattern detection algorithm.
  • Pattern detection algorithm. Ignore rhythm in this level (can use for later level) just need to store the correct sequence that is generated from Koan noteOn events for comparison.
  • End of user input detection. Either use specific note or set silence period to initate KoanNPC playback.
  • Animation triggering/speed based on melody recognition success/failure.

 

UseCase  Revision #

Action Taken, Notes

When?

By Whom?

0.1

 Update

Pc

18/09/02

 


Use-case Level 3.1

Goal

None – fade out. Performance twist by moving from underwater to Mexican mermaid Sonora Desert Oasis myth.

Level

3. Desert oasis. Music: Melodic, Happy.

Scope

Primary task

Trigger

Player action by entry into portal to swim up

Primary Actors

Player

 

Secondary Actors

Camera

Pre Conditions

Player has completed Level 2.1

Success End Conditions

none

Failure End Conditions

none

Description

Name: End sequence 

Purpose: Impart a twist to the audience by playing on the mermaid myths

Users: Player

Dependencies:

  • WTDrop to face out to black (or fade up?)
  • Need to import gorge model into a landscape so we can do the big zoom up, up, and away.

 

UseCase  Revision #

Action Taken, Notes

When?

By Whom?

0.1

 

 

 


Feature Heading

Describes and numerates the issue/feature in question. The numerical index, established in the TOC allows for easy finding and sorting once the project is underway.

1         Contact and "See Also" Information

Straightforward: Point of contact for who designed the feature and what other documents it relates to outside of this one.

2         Goals

A bullet list of associated goals including problems you may encounter implementing this feature and possible solutions to said problems.

3         Implementation

How you're going to affect the feature. This is where you'd include formula, diagrams, or flowcharts that layout the design feature in question that all relative parties may need to know/follow to get the feature up and rolling.

4         Impact

How this feature will impact the current status quo. You can't always crystal ball this, but in our case we're making changes to an existing engine/game, so some changes do affect the way we're currently implementing some features. An example of this would be having a new action for a wrestler to do, and needing a button-press to pull it off when we're already overloaded here. Another use for this heading is to help you identify extra resources you may need, and schedule relevant needs to bring the feature into line.

5         Tasks & Questions for:

5.1  Designers

5.2  Programmers

5.3  Artists

5.3.1       2D

5.3.2       Modelers

5.3.3       Motion

5.3.4       Sounds


Code Snippet

/*                             Freq Bin: 0 = 86.132645                          F->C->E

                                Freq Bin: 1 = 172.26529                          F->B

                                Freq Bin: 2 = 258.39792                          C->E

                                Freq Bin: 3 = 344.53058                          F->G#

                                Freq Bin: 4 = 430.6632                            A->B

                                Freq Bin: 5 = 516.79584                          C->D

                                Freq Bin: 6 = 602.9285                            D#,E

                                Freq Bin: 7 = 689.06116                          F,F#

                                Freq Bin: 8 = 775.1938                            G,G#

                                Freq Bin: 9 = 861.3264                            A,A#

                                Freq Bin: 10 = 947.4591                          B

                                Freq Bin: 11 = 1033.5917                        C,C#

                                Freq Bin: 12 = 1119.7244                        D

                                Freq Bin: 13 = 1205.857                          D#

                                Freq Bin: 14 = 1291.9896                        E

                                Freq Bin: 15 = 1378.1223                        F

                                Freq Bin: 16 = 1464.255                          F#

                                Freq Bin: 17 = 1550.3876                        G

                                Freq Bin: 18 = 1636.5203                        G#

                                Freq Bin: 19 = 1722.6528                        A

                                Freq Bin: 20 = 1808.7855                        A#

                                Freq Bin: 21 = 1894.9182                        B

                                Freq Bin: 22 = 1981.0508                       

                                Freq Bin: 23 = 2067.1833                        C

*/                            

                                String note = "X";

                                switch (maxIndex) {

                                case 2: //C

                                                noteLabel.setText("C-D"); // set the label for the pitch

                                                note = "C";

                                                a1.setPosition( a1pos.x , a1pos.y + (maxVal/16) , a1pos.z);                                                   

                                                m2.setPosition( m2pos.x, m2pos.y + (maxVal/16) , m2pos.z);                                                               

                                                a2.setPosition( a2pos.x , a2pos.y + (maxVal/16) , a2pos.z);                                                   

                                                break;

                                case 3:

                                                noteLabel.setText("D#-E");// set the label for the pitch

                                                note = "D#";

                                                m3.setPosition( m3pos.x , m3pos.y + (maxVal/16) , m3pos.z);                                                              

                                                a3.setPosition( a3pos.x , a3pos.y + (maxVal/16) , a3pos.z);                                                   

                                                break;

                                case 4:

                                                noteLabel.setText("F-G#"); // set the label for the pitch

                                                note = "F";

                                                a4.setPosition( a4pos.x , a4pos.y + (maxVal/16) , a4pos.z);                                                   

                                                m5.setPosition( m5pos.x , m5pos.y + (maxVal/16) , m5pos.z);                                                              

                                                a5.setPosition( a5pos.x , a5pos.y + (maxVal/16) , a5pos.z);                                                   

                                                p6.setPosition( p6pos.x , p6pos.y + (maxVal/16) , p6pos.z);                                                  

                                                break;

                                case 5:

                                                noteLabel.setText("A-B"); // set the label for the pitch

                                                note = "A";

                                                a6.setPosition( a6pos.x , a6pos.y + (maxVal/16) , a6pos.z);                                                   

                                                f7.setPosition( f7pos.x , f7pos.y + (maxVal/16) , f7pos.z);                                                     

                                                a7.setPosition( a7pos.x , a7pos.y + (maxVal/16) , a7pos.z);                                                   

                                                break;

                                case 6: //C

                                                noteLabel.setText("C-D"); // set the label for the pitch

                                                note = "C";

                                                a1.setPosition( a1pos.x , a1pos.y + (maxVal/16) , a1pos.z);                                                   

                                                m2.setPosition( m2pos.x, m2pos.y + (maxVal/16) , m2pos.z);                                                               

                                                a2.setPosition( a2pos.x , a2pos.y + (maxVal/16) , a2pos.z);                                                   

                                                break;

                                case 7:

                                                noteLabel.setText("D#-F"); // set the label for the pitch

                                                note = "D#";

                                                m3.setPosition( m3pos.x , m3pos.y + (maxVal/16) , m3pos.z);                                                              

                                                a3.setPosition( a3pos.x , a3pos.y + (maxVal/16) , a3pos.z);                                                   

                                                a4.setPosition( a4pos.x , a4pos.y + (maxVal/16) , a4pos.z);                                                   

                                                break;

                                case 8:

                                                noteLabel.setText("F#-G"); // set the label for the pitch

                                                note = "F#";

                                                m5.setPosition( m5pos.x , m5pos.y + (maxVal/16) , m5pos.z);                                                              

                                                a5.setPosition( a5pos.x , a5pos.y + (maxVal/16) , a5pos.z);                                                   

                                                break;

                                case 9:

                                                noteLabel.setText("G#-A"); // set the label for the pitch

                                                note = "G#";

                                                p6.setPosition( p6pos.x , p6pos.y + (maxVal/16) , p6pos.z);                                                  

                                                a6.setPosition( a6pos.x , a6pos.y + (maxVal/16) , a6pos.z);                                                   

                                                break;

                                case 10:

                                                noteLabel.setText("A#-B"); // set the label for the pitch

                                                note = "A#";

                                                f7.setPosition( f7pos.x , f7pos.y + (maxVal/16) , f7pos.z);                                                     

                                                a7.setPosition( a7pos.x , a7pos.y + (maxVal/16) , a7pos.z);                                                   

                                                break;

                                case 11: //C

                                                noteLabel.setText("C"); // set the label for the pitch

                                                note = "C";

                                                a1.setPosition( a1pos.x , a1pos.y + (maxVal/16) , a1pos.z);                                                   

                                                break;

                                case 12: // C#

                                                noteLabel.setText("C#"); // set the label for the pitch

                                                note = "C#";

                                                m2.setPosition( m2pos.x, m2pos.y + (maxVal/16) , m2pos.z);                                                               

                                                break;

                                case 13:

                                                noteLabel.setText("D-D#"); // set the label for the pitch

                                                note = "D";

                                                a2.setPosition( a2pos.x , a2pos.y + (maxVal/16) , a2pos.z);                                                   

                                                m3.setPosition( m3pos.x , m3pos.y + (maxVal/16) , m3pos.z);                                                              

                                                break;

                                case 14:

                                                noteLabel.setText("E"); // set the label for the pitch

                                                note = "E";

                                                a3.setPosition( a3pos.x , a3pos.y + (maxVal/16) , a3pos.z);                                                   

                                                break;

                                case 15:

                                                noteLabel.setText("F"); // set the label for the pitch

                                                note = "F";

                                                a4.setPosition( a4pos.x , a4pos.y + (maxVal/16) , a4pos.z);                                                   

                                                break;

                                case 16:

                                                noteLabel.setText("F#"); // set the label for the pitch

                                                note = "F#";

                                                m5.setPosition( m5pos.x , m5pos.y + (maxVal/16) , m5pos.z);                                                              

                                                break;

                                case 17:

                                                noteLabel.setText("G"); // set the label for the pitch

                                                note = "G";

                                                a5.setPosition( a5pos.x , a5pos.y + (maxVal/16) , a5pos.z);                                                   

                                                break;

                                case 18:

                                                noteLabel.setText("G#"); // set the label for the pitch

                                                note = "G#";

                                                p6.setPosition( p6pos.x , p6pos.y + (maxVal/16) , p6pos.z);                                                  

                                                break;

                                case 19:

                                                noteLabel.setText("A"); // set the label for the pitch

                                                note = "A";

                                                a6.setPosition( a6pos.x , a6pos.y + (maxVal/16) , a6pos.z);                                                   

                                                break;

                                case 21:

                                                noteLabel.setText("A#"); // set the label for the pitch

                                                note = "A#";

                                                f7.setPosition( f7pos.x , f7pos.y + (maxVal/16) , f7pos.z);                                                     

                                                break;

                                case 22:

                                                noteLabel.setText("B"); // set the label for the pitch

                                                note = "B";

                                                a7.setPosition( a7pos.x , a7pos.y + (maxVal/16) , a7pos.z);                                                   

                                                break;

                                case 23:

                                                noteLabel.setText("C"); // set the label for the pitch

                                                note = "C";

                                                a1.setPosition( a1pos.x , a1pos.y + (maxVal/16) , a1pos.z);                                                   

                                                break;

                                case 24: // C#

                                                noteLabel.setText("C/C#"); // set the label for the pitch

                                                note = "C#";

                                                m2.setPosition( m2pos.x, m2pos.y + (maxVal/16) , m2pos.z);                                                               

                                                break;

                                default:

                                                noteLabel.setText("X");                                         

                                                note = "X";

                                                a1.setPosition( a1pos.x , a1pos.y  , a1pos.z);                                                          

                                                m2.setPosition( m2pos.x , m2pos.y  , m2pos.z);                                                    

                                                a2.setPosition( a2pos.x , a2pos.y  , a2pos.z);                                                          

                                                m3.setPosition( m3pos.x , m3pos.y  , m3pos.z);                                                    

                                                a3.setPosition( a3pos.x , a3pos.y  , a3pos.z);                                                          

                                                a4.setPosition( a4pos.x , a4pos.y  , a4pos.z);                                                          

                                                m5.setPosition( m5pos.x , m5pos.y  , m5pos.z);                                                    

                                                a5.setPosition( a5pos.x , a5pos.y  , a5pos.z);                                                          

                                                p6.setPosition( p6pos.x , p6pos.y  , p6pos.z);                                                        

                                                a6.setPosition( a6pos.x , a6pos.y  , a6pos.z);                                                          

                                                f7.setPosition( f7pos.x , f7pos.y  , f7pos.z);                                                           

                                                a7.setPosition( a7pos.x , a7pos.y  , a7pos.z);                                                          

                                                break;

                                }