DW_ICE_BEATz

Post Reply
User avatar
Hirazi Blue
Administrator
Posts: 5107
Joined: 04 Jun 2009, 12:15

DW_ICE_BEATz

Post by Hirazi Blue » 29 Mar 2010, 21:25

David Wigforss (dwigfor) presents
DW_ICE_BEATz
This is a compound that generates a Beat Pattern, rythmic scalar values based on user assigned parameters, based on Music Theory.

It works by setting up the parameters in the compound, and attaching Beat Generator to whichever parameter you wish to drive.

Song duration is currently disabled (it has no effect). Ultimately I'm hoping to use that to help keep the beat synced to the fps. I primarily tested this with a tempo of 120 and a Time Signature of 4/4. 120 is sort of the sweet tempo, resulting in 16th notes having a 3 note duration. I hope to be able to utilize different time signatures in the future; right now anything other than 4 beats per measure will probably not work correctly. And anything other than quarter notes designating the beat will definately not work, so no 6/8 time, yet)

This is my first compound I'm releasing to the community, so let me know if you have any problems with it. This was developed on xsi 7.01, but should work on any versions of Softiamge with ICE.
Usage:
I will try to create a small tutorial on how to use it, but if you want to get started right away...

Empty Point Cloud
Non Sim Ice Tree
Add Point
Attach 3d vector to Add Point Point Position
Attach Set data node to Add Point on Create
In Set Data, create a bunch of additional ports and enable self. color, size, scale, etc

Import DW_ICE_BEATz compound.
Attach Scalar to 3d Vector to self.scale. Set the vectors to 1,1,1.
Attach Beat Generator to the y value of scalar to 3d vector node.

Settings (Now for the music theory....):
Tempo = # of Beats Per Minute. Start with 120. As I mentioned, that's the sweet tempo. *Doesn't have to round the beat from say 10.5918 frames). That will generate a beat 12 frames in duration.

Time Signature: That stands for (# of Beats Per Measure) over (Which Note Designates 1 Beat). A 4 on the bottom means quarter note is 1 beat. That is the most common for most types of music. 4/4 is common for most music styles. 3/4 is common for waltzs (but probably doesn't function properly, since my patterns are all based on 4/4. But if you just loop it to infinity, I think it might be fine. It should count the measure durations correctly. 6/8 is more of a swing pattern. There's a ton of calculations that need to be changed in order to support Eigth Notes designating 1 beat.

The different patterns are 1 measure (based on 4/4 time) of beats. There's 1 Whole Note, 2 Half Notes, 4 Quarter Notes, 8 Eigth Notes, 16 Sixteenth Notes. So, if you set it to 2 Half Notes, for every measure, it will generate 2 Beats.

Beat Gen Min specifies the starting value of a rescale node.. You can set it to 0, or a different value to offset the mininum number that the beat gen produces

Beat Gen Max specifies the ending value of a rescale node. If you set it to 10, Beat generator will generate scalar values ranging from 10 on the start of the beat, down to 0 (the min) at the midway point, and back up to 10 for the next beat.

I have provided ways of customizing the curve that the beat generates. I have split it into 2 parts. The outgoing curve from the start of the beat, and the incoming curve to the next beat. There is a midpoint slider controlling the distance of the curves.

There are a few different curve profiles for the outgoing and incoming curves.
The First outgoing is
Fade Out (Cos 180..360) - That's an easy ease falloff, going from beat gen max down to min.
Constant On - That generates Beat Gen Max numbers for the duration of the outgoing wave
Constant Off - that generates beat gen min numbers for the duration of the outgoing wave

For Incoming wave, There's a few more choices, which I forget the order cause I don't have it opened here..
Fade In (Cos 0..180) - Easy Ease from Min to Max
Fade Out (useful if outgoing is constant on)
Full Beat (Useful if outgoing is constant on.
Constant On
Constant Off

For very fast beats (16th notes especially), it's useful to set to set midpoint to small distance (.25) and wave types to Constant On, and Constant Off.

For # of loops, set it to a high number so it continually generates patterns, like 200.

One thing that I had problems while designing this was Current Time. But I fixed the problems and it works currectly now (I think). Plug Current Frame node into Current Time slot. That will add a round node which is good. While developing this, I had created a seperate object that traveled 1 unit in y each frame. I then took a get data, and used that y kine pos to drive the Current Time input. But it should be fine to use Current Frame now.

That will hopefully get you started using it.
Get it here...
Stay safe, sane & healthy!

User avatar
dwigfor
Posts: 395
Joined: 17 Nov 2009, 17:46

Re: DW_ICE_BEATz

Post by dwigfor » 29 Mar 2010, 22:20

Hi everyone. Hope you all enjoy my first compound. There's currently some debugging info displayed that I need to figure out how to remove. I think it's buried deep deep deep inside my compound and duplicated many times, so tough to isolate them all....

I made a little icon to go with it last night.
Image

Let me know what you think!
-Dave

User avatar
dwigfor
Posts: 395
Joined: 17 Nov 2009, 17:46

Re: DW_ICE_BEATz

Post by dwigfor » 30 Mar 2010, 08:51

Hey guys. I think this is the quickest ICE tree to setup to demonstrate my compound.

Image

Not sure why just connecting current frame in doesn't work. If you create a null animating 1 unit each frame (linear and relative cycle), the compound functions correctly. If you then connect in current frame, it will work. If you leave it connected, but delete the get data: null posy node, it will no longer work.. Anybody got an idea why?

Anybody know an easy way to locate the show values buried deep inside compounds? In the meantime, you can disable them with (eyeball in viewport)/Display/Ice Attributes.

Also, I think you might need to start timeline at frame 0...

Cheers,
-Dave

User avatar
Mathaeus
Posts: 1778
Joined: 08 Jun 2009, 21:11
Location: Zagreb, Croatia
Contact:

Re: DW_ICE_BEATz

Post by Mathaeus » 31 Mar 2010, 00:07

dwigfor wrote: Not sure why just connecting current frame in doesn't work. If you create a null animating 1 unit each frame (linear and relative cycle), the compound functions correctly. If you then connect in current frame, it will work. If you leave it connected, but delete the get data: null posy node, it will no longer work.. Anybody got an idea why?
Hi

In some cases, you can get it to work by setting the current frame as a custom attribute, and reading the custom attribute later - if this still doesn't work, you can try to set custom attribute in separate ICE tree, before main ICE tree. Anyway, I think that using animated 'timer' is only 'safe' way. 'Timer' can be expression too, or just animated parameter in ICE tree.

Why it doesn't catch when using unsimulated ICE tree, my wild guess this is some of ICE aggressive optimizations...

Thanks for sharing!

Cheers

Post Reply

Who is online

Users browsing this forum: No registered users and 37 guests