New Seismic Charge Animation and the Remap Function

Hello there. I am a programmer so I have been working on some blade styles and I find this to be great fun! I have been making a new version of Fett263’s Seismic charge idea that can be embedded into the great Slave 1 font that JuanSith made. I’ve been using OS 6.7 for this and rewritten the function a couple of times already. I’ve gotten it down to these few lines of code (the less the better) but I have a problem with the Remap function at the end of my animation. You see, the Remap function repeats itself over time, but I can’t control it’s phase. So I need this function to play at the end of the animation, but I want it to always start at the same point in time, the “phase” if you will:

  TransitionEffectL<
   TrConcat<
	TrFadeX<Mult<Int<6666>,Int<4000>>>,
    Layers<
     AlphaL<Black,Int<32768>>,
	 AlphaL<
	  Rgb<50,50,50>,
      Bump<Scale<Trigger<EFFECT_FORCE,Int<4000>,Int<2000>,Int<500>>,Int<0>,Int<32768>>,
	   Trigger<EFFECT_FORCE,Int<10000>,Int<2000>,Int<500>>
	  >
	 >,
	 AlphaL<
      RgbArg<BASE_COLOR_ARG,Rgb<255,97,0>>,
	  Sum<
	   Bump<Scale<Trigger<EFFECT_FORCE,Int<3800>,Int<2000>,Int<500>>,Int<0>,Int<32768>>,Int<80>>,
	   Bump<Scale<Trigger<EFFECT_FORCE,Int<4200>,Int<2000>,Int<500>>,Int<0>,Int<32768>>,Int<80>>
	  >
	 >
    >,
	TrDelayX<Mult<Int<6666>,Int<5768>>>,
     Mix<Bump<Int<16384>,Int<40>>,Black,BrownNoiseFlicker<Black,SpringGreen,25>>,
    TrCenterWipeX<Mult<Int<6666>,Int<3000>>>,
     /* Sin value of 22 for single bubble, 66 for 1.5 bubble */
     Mix<Bump<Int<16384>,Sin<Int<66>,Int<16000>,Int<0>>>,Black,BrownNoiseFlicker<Black,SpringGreen,25>>,
    TrDelayX<Mult<Int<6666>,Int<3000>>>,
     Mix<Bump<Int<16384>,Int<40>>,Black,BrownNoiseFlicker<Black,SpringGreen,25>>,
    TrCenterWipeSparkX<SpringGreen,Mult<Int<6666>,Int<2000>>>,
     Remap<
      CenterDistF<>,
      Stripes<
       10000,
       -60,
       Black,
       BrownNoiseFlicker<Black,Rgb<0,100,30>,50>
      >
     >,
    TrFadeX<Mult<Int<6666>,Int<10000>>>,
     AlphaL<Black,Int<32768>>,
    TrFadeX<Mult<Int<6666>,Int<5000>>>
   >,
  EFFECT_FORCE>

If you copy and paste this code into the Style Editor and press the “Force” effect button you’ll see how its going. At the end of the explosion, just after the TrCenterWipeSparkX, the Remap begins to play. Sometimes it is synchronized perfectly with the animation and others it is totally off. As to what its supposed to look like, the Remap is supposed to appear almost solid over the whole blade after the WipeSpark, then CenterWipe itself out to blackness at the end.

Please try this out yourself and let me know if you can think of how to better tame the Remap function! Maybe I should be using Thanks.

Remap isn’t a timed function, it is a modifier for the style contained within it. In this case it is just folding the Stripes<> to move out from the same point as the CenterWipe.
Stripes<> cannot start or stop at a specific point, it is running continuously even when not visible. If you want something timed to the transition you’ll need to use a TrWaveX or TrSparkX at that point.

So I tried a couple of things but none of them seem to work as well as the pure remap. The thing about transitions is that you can’t start one until you finish the last one. I need something more like a moving gradient.
Here are a few experiments:
TrWaveX can’t be used for this because it doesn’t blend what comes before and what comes after…

TrConcat<
TrWaveX<White,Mult<Int<6666>,Int<10000>>,Int<400>,Int<4000>>,
     BrownNoiseFlicker<Black,Red,25>,
TrWaveX<White,Mult<Int<6666>,Int<10000>>,Int<400>,Int<4000>>,
     BrownNoiseFlicker<Black,SpringGreen,25>,
TrWaveX<White,Mult<Int<6666>,Int<10000>>,Int<400>,Int<4000>>,
     BrownNoiseFlicker<Black,Red,25>,
TrWaveX<White,Mult<Int<6666>,Int<10000>>,Int<400>,Int<4000>>,
     BrownNoiseFlicker<Black,SpringGreen,25>,
TrWaveX<White,Mult<Int<6666>,Int<10000>>,Int<400>,Int<4000>>,
>

TrCenterWipeSparkX runs really slow, there’s a large delay after the wipe.

TrConcat<
TrCenterWipeSparkX<White,Mult<Int<6666>,Int<2000>>>,
     BrownNoiseFlicker<Black,Red,25>,
TrCenterWipeSparkX<White,Mult<Int<6666>,Int<2000>>>,
     BrownNoiseFlicker<Black,SpringGreen,25>,
TrCenterWipeSparkX<White,Mult<Int<6666>,Int<2000>>>,
     BrownNoiseFlicker<Black,Red,25>,
TrCenterWipeSparkX<White,Mult<Int<6666>,Int<2000>>>,
     BrownNoiseFlicker<Black,SpringGreen,25>,
TrCenterWipeSparkX<White,Mult<Int<6666>,Int<2000>>>
>

TrCenterWipeX seems to run more on time, but there are no sparks at all.

TrConcat<
TrCenterWipeX<Mult<Int<6666>,Int<2000>>>,
     BrownNoiseFlicker<Black,Red,25>,
TrCenterWipeX<Mult<Int<6666>,Int<2000>>>,
     BrownNoiseFlicker<Black,SpringGreen,25>,
TrCenterWipeX<Mult<Int<6666>,Int<2000>>>,
     BrownNoiseFlicker<Black,Red,25>,
TrCenterWipeX<Mult<Int<6666>,Int<2000>>>,
     BrownNoiseFlicker<Black,SpringGreen,25>,
TrCenterWipeX<Mult<Int<6666>,Int<2000>>>
>

Finally, what I ended up using for the real force effect is a bunch of brown noise and fade effects. It’s not as good as if I could just time the Remap I had originally. However, it does the trick:

  TransitionEffectL<
   TrConcat<
	TrFadeX<Mult<Int<6666>,Int<4000>>>,
    Layers<
     AlphaL<Black,Int<32768>>,
	 AlphaL<
	  Rgb<50,50,50>,
      Bump<Scale<Trigger<EFFECT_FORCE,Int<4000>,Int<2000>,Int<500>>,Int<0>,Int<32768>>,
	   Trigger<EFFECT_FORCE,Int<10000>,Int<2000>,Int<500>>
	  >
	 >,
	 AlphaL<
      RgbArg<BASE_COLOR_ARG,Rgb<255,97,0>>,
	  Sum<
	   Bump<Scale<Trigger<EFFECT_FORCE,Int<3800>,Int<2000>,Int<500>>,Int<0>,Int<32768>>,Int<80>>,
	   Bump<Scale<Trigger<EFFECT_FORCE,Int<4200>,Int<2000>,Int<500>>,Int<0>,Int<32768>>,Int<80>>
	  >
	 >
    >,
	TrDelayX<Mult<Int<6666>,Int<5768>>>,
     Mix<Bump<Int<16384>,Int<40>>,Black,BrownNoiseFlicker<Black,SpringGreen,25>>,
    TrCenterWipeX<Mult<Int<6666>,Int<3000>>>,
     /* Sin value of 22 for single bubble, 66 for 1.5 bubble */
     Mix<Bump<Int<16384>,Sin<Int<66>,Int<16000>,Int<0>>>,Black,BrownNoiseFlicker<Black,SpringGreen,25>>,
    TrDelayX<Mult<Int<6666>,Int<3000>>>,
     Mix<Bump<Int<16384>,Int<40>>,Black,BrownNoiseFlicker<Black,SpringGreen,25>>,
    TrCenterWipeSparkX<SpringGreen,Mult<Int<6666>,Int<2000>>>,

     Remap<
      CenterDistF<>,
      Stripes<10000,0,
       BrownNoiseFlicker<Black,Rgb<0,100,30>,50>,
       BrownNoiseFlicker<Black,Rgb<0,100,30>,50>
      >
     >,
    TrFadeX<Mult<Int<6666>,Int<2000>>>,
     Remap<
      CenterDistF<>,
      Stripes<10000,0,
       BrownNoiseFlicker<Black,Rgb<0,100,30>,50>,
       BrownNoiseFlicker<Black,Rgb<0,100,30>,1000>
      >
     >,
    TrFadeX<Mult<Int<6666>,Int<2000>>>,
     Remap<
      CenterDistF<>,
      Stripes<10000,0,
       BrownNoiseFlicker<Black,Rgb<0,100,30>,50>,
       BrownNoiseFlicker<Black,Rgb<0,50,15>,1000>
      >
     >,
    TrFadeX<Mult<Int<6666>,Int<2000>>>,
     Remap<
      CenterDistF<>,
      Stripes<10000,0,
       BrownNoiseFlicker<Black,Rgb<0,100,30>,1000>,
       BrownNoiseFlicker<Black,Rgb<0,0,0>,1000>
      >
     >,
    TrFadeX<Mult<Int<6666>,Int<2000>>>,
     Remap<
      Mult<CenterDistF<>,CenterDistF<>>,
      Stripes<10000,0,
       BrownNoiseFlicker<Black,Rgb<0,50,15>,1000>,
       BrownNoiseFlicker<Black,Rgb<0,0,0>,1000>
      >
     >,
    TrFadeX<Mult<Int<6666>,Int<2000>>>,
     Remap<
      Mult<CenterDistF<>,CenterDistF<>>,
      Stripes<10000,0,
       BrownNoiseFlicker<Black,Rgb<0,0,0>,1000>,
       BrownNoiseFlicker<Black,Rgb<0,0,0>,1000>
      >
     >,

    TrFadeX<Mult<Int<6666>,Int<5000>>>
   >,
  EFFECT_FORCE>

So to get this all to work, I actually have to take JuanSith’s original Seismic charge sounds (force type or blaster) and pad the first part of the sound with a blank region of nothing equal to the original size of the sound. This sort of simulates what happens in the movie and gives the first part of the animation the time it needs. This doubles the length of the sound clips, taking 3 second sounds to 6 and 4 second sounds to 8. In the code I have here above, I replace all instances of Int<6666> (for the bladestyle editor) with WavLen<EFFECT_FORCE> (for the actual saber). When all is said and done, I’m thinking of sending the full bladestyle back to Juan Sith to see if he likes it…

Only if it’s in the same TrConcat, and even then you can use TrJoin to have multiple TrConcats run.

Why not just have a separate TransitionEffectL layer for the transition you want to have start before the previous one is complete?

FYI While this placeholder idea did indeed work well in the past, Style Editor now totally supports WavLen. Although, you can’t edit the timing differently than the Editor’s 1 second or so, so for building a sound-matched effect, you may indeed need to do this.

Yes I see! Well I might try a solution with this then. Perhaps if I can use several center wipe out transitions layered and joined that will do the trick. Thanks for this suggestion.

You can put a Gradient in a Wave or Spark, I’d just recommend a Remap to keep the center aligned like so (just simple example)

https://fredrik.hubbe.net/lightsaber/style_editor_beta.html?S=Layers< ++Black%2C ++TransitionEffectL<TrWaveX<Remap<CenterDistF<>%2CGradient<Green%2CBlue%2CRed>>%2CInt<350>>%2CEFFECT_BLAST>>

1 Like

Yeah in my last code there I continued to use the remap to create the right gradient pattern with the CenterDistF<>. However the moment I turn on the stripe speed I’m back to my original problem with the untriggered timing of the waves. You can see this speed of 0 marked below:

     Remap<
      CenterDistF<>,
      Stripes<
       10000,
       0, /* Here is the deactivated stripe speed. */
       BrownNoiseFlicker<Black,Rgb<0,100,30>,1000>,
       BrownNoiseFlicker<Black,Rgb<0,0,0>,1000>
      >
     >,

The next thing I will attempt is to manipulate the First argument of the remap function rather than the second. I tried this out really quick but it doesn’t work:

Remap<Sum<CenterDistF<>,Trigger<EFFECT_FORCE,Int<500>,Int<1000>,Int<500>>>,Stripes<10000,0,BrownNoiseFlicker<Black,Rgb<0,100,30>,1000>,BrownNoiseFlicker<Black,Black,1000>>>

To try this, trigger the Force effect. I have a central distribution being summed with a constant that comes from the trigger hill, but I’m hitting values beyond 32768 and I need to clamp them. Do you know if there’s some sort of clamping function? Perhaps another function like Scale<> can be used to inherently clamp?

Not really sure what you’re trying to do. It might be easier if you explain what you’re trying to accomplish rather than what you’re putting together.

Stripes doesn’t take a speed of zero… or it used to not anyway, maybe that was addressed.
But, in times like these, I find it best to save what you have so far, step back, and then try a different approach.
Sometimes a simpler solution is right in front of you instead of forcing what you think you need to do currently.

Ok so I continued on my last train of thought, and got the EFFECT_FORCE triggered wave of my dreams:

     Remap<
      Sum<
       CenterDistF<>,
       Scale<
        Trigger<EFFECT_FORCE,Int<0>,Int<0>,Mult<Int<6666>,Int<15000>>>,
        Int<-16384>,
        Int<30000>
       >
      >,
      Stripes<
       1500,
       0,
       Rgb<0,1,0>,
       Rgb<0,2,2>,
       Rgb<0,5,4>,
       Rgb<0,8,8>,
       Rgb<0,13,12>,
       Rgb<0,18,17>,
       Rgb<0,25,23>,
       Rgb<0,32,30>,
       Rgb<0,41,38>,
       Rgb<0,50,47>,
       Rgb<0,61,57>,
       Rgb<0,72,68>,
       Rgb<0,85,80>,
       Rgb<0,98,92>,
       Rgb<0,113,106>,
       Rgb<0,128,120>,
       Aqua,
       Black
      >
     >,

It’s pretty long, but pretty stupid. I basically just rendered the exponential equation in a spreadsheet and copied it into the stripe values to create a perfect gradient. So you can try my “final” transition effect in the blade editor here:

StylePtr<
 Layers<
  Layers<
   Remap<
    CenterDistF<>,Stripes<10000,-600,Mix<Int<13707>,Black,RgbArg<BASE_COLOR_ARG,Rgb<255,97,0>>>,Pulsing<RgbArg<BASE_COLOR_ARG,Rgb<255,97,0>>,Mix<Int<24000>,Black,RgbArg<BASE_COLOR_ARG,Rgb<255,97,0>>>,1000>>>,TransitionEffectL<TrConcat<TrJoin<TrDelayX<IgnitionTime<>>,TrInstant>,White,TrFade<600>
   >,
   EFFECT_IGNITION>
  >,
  InOutTrL<TrJoinR<TrCenterWipeX<IgnitionTime<0>,Int<16384>>,TrSmoothFadeX<IgnitionTime<0>>>,TrJoin<TrCenterWipeInX<RetractionTime<0>,Int<16384>>,TrSmoothFadeX<RetractionTime<0>>>,Black>,
  
  TransitionEffectL<
   TrConcat<
	TrFadeX<Mult<Int<6666>,Int<4000>>>,
    Layers<
     AlphaL<Black,Int<32768>>,
	 AlphaL<
	  Rgb<50,50,50>,
      Bump<Scale<Trigger<EFFECT_FORCE,Int<4000>,Int<2000>,Int<500>>,Int<0>,Int<32768>>,
	   Trigger<EFFECT_FORCE,Int<10000>,Int<2000>,Int<500>>
	  >
	 >,
	 AlphaL<
      RgbArg<BASE_COLOR_ARG,Rgb<255,97,0>>,
	  Sum<
	   Bump<Scale<Trigger<EFFECT_FORCE,Int<3800>,Int<2000>,Int<500>>,Int<0>,Int<32768>>,Int<80>>,
	   Bump<Scale<Trigger<EFFECT_FORCE,Int<4200>,Int<2000>,Int<500>>,Int<0>,Int<32768>>,Int<80>>
	  >
	 >
    >,
	TrDelayX<Mult<Int<6666>,Int<5768>>>,
     Mix<Bump<Int<16384>,Int<40>>,Black,BrownNoiseFlicker<Black,Aqua,25>>,
    TrCenterWipeX<Mult<Int<6666>,Int<3000>>>,
     /* Sin value of 22 for single bubble, 66 for 1.5 bubble */
     Mix<Bump<Int<16384>,Sin<Int<66>,Int<16000>,Int<0>>>,Black,BrownNoiseFlicker<Black,Aqua,25>>,
    TrDelayX<Mult<Int<6666>,Int<3000>>>,
     Mix<Bump<Int<16384>,Int<40>>,Black,BrownNoiseFlicker<Black,Aqua,25>>,
    TrFadeX<Mult<Int<6666>,Int<50>>>,
     Mix<Bump<Int<16384>,Int<30000>>,Black,White>,
    TrDelayX<Mult<Int<6666>,Int<400>>>,
     Mix<Bump<Int<16384>,Int<30000>>,Black,White>,
    TrFadeX<Mult<Int<6666>,Int<50>>>,
     Mix<Bump<Int<16384>,Int<40>>,Black,Aqua>,
    TrCenterWipeX<Mult<Int<6666>,Int<5000>>>,
     Remap<
      Sum<
       CenterDistF<>,
       Scale<
        Trigger<EFFECT_FORCE,Int<0>,Mult<Int<6666>,Int<15000>>,Mult<Int<6666>,Int<15000>>>,
        Int<-16384>,
        Int<30000>
       >
      >,
      Stripes<
       1500,
       0,
       Rgb<0,1,0>,
       Rgb<0,2,2>,
       Rgb<0,5,4>,
       Rgb<0,8,8>,
       Rgb<0,13,12>,
       Rgb<0,18,17>,
       Rgb<0,25,23>,
       Rgb<0,32,30>,
       Rgb<0,41,38>,
       Rgb<0,50,47>,
       Rgb<0,61,57>,
       Rgb<0,72,68>,
       Rgb<0,85,80>,
       Rgb<0,98,92>,
       Rgb<0,113,106>,
       Rgb<0,128,120>,
       Aqua,
       Black
      >
     >,
    TrDelayX<Mult<Int<6666>,Int<6000>>>,
     AlphaL<Black,Int<32768>>,
    TrFadeX<Mult<Int<6666>,Int<5500>>>
   >,
  EFFECT_FORCE>
  
 >
>(),

As I mentioned earlier that is timed for testing on the blade editor and for the real effect I will change everything back to use WavLen<EFFECT_FORCE>. So in order to create this, I’ve just been watching the actual battle scene between Jango and ObiWan over and over. I’ve matched the colors, but I haven’t entirely matched the timing. That’s a bit tedious, so I don’t know if I’ll get there, but I’m sure if I do, it will even more bring back that feeling from the movie.

While this looks great in the blade editor, it doesn’t work on the actual saber. There’s no gradient and it just turned into a solid aqua. It may be that NoSloppy was right, Stripes may not be able to take a speed of zero.

You’re not going to match a movie effect on a blade, the resolution on your blade is nowhere near the same and the diffusion will blend each pixel together, which is necessary and intended. The same is true between the Editor and your blade. The resolution on your monitor is better than what your blade can produce and also not diffused. For animations or movement on the blade you want large variations in color/brightness that your eye will perceive easily. Its always best to test everything on a blade as you build, the Editor is just a guide but your end medium is quite different.
Color matching is also in the same boat. If you screencap a color and get its RGB, it will never look the same on your blade when you load it up for same reasons as above, plus factors like environmental light, diffusion method, blade type and different pixels from different manufacturers have different outputs for colors, etc. So I usually recommend using your eye to match on the blade with the color you’re perceing.

1 Like

I’ll just leave this here…
https://www.youtube.com/watch?v=EkrSmOXHwjs
Link to font and style:

Style:

// Slave 1 with seismic charge preon
   
 StylePtr<Layers<
  Mix<SmoothStep<Int<16384>,Int<4000>>,Stripes<10000,500,Rgb<0,30,80>,Rgb<0,60,180>>,Stripes<10000,-500,Rgb<0,30,80>,Rgb<0,60,180>>>,
// Dim Blade 50% "Power Save" button combo
  EffectSequence<EFFECT_POWERSAVE,
  AlphaL<Black,Int<16384>>,
  AlphaL<Black,Int<0>>>,
// Clash - 3 stage fading impact spot
    TransitionEffectL<TrConcat<TrInstant,GreenYellow,TrDelay<25>,AlphaL<TransitionEffect<BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,Moccasin,TrInstant,TrFade<300>,EFFECT_CLASH>,Bump<Scale<BladeAngle<>,Int<25000>,Int<8000>>,Int<18000>>>,TrFade<600>>,EFFECT_CLASH>,
// Stab 
    TransitionEffectL<TrConcat<TrInstant,GreenYellow,TrDelay<25>,AlphaL<Black,Int<0>>,TrWipeIn<300>,AlphaL<Stripes<5000,1000,DarkOrange,Rgb<80,60,0>,Orange,Rgb<60,30,0>,Black,DarkOrange,Orange>,SmoothStep<Int<20000>,Int<2000>>>,TrJoin<TrSmoothFade<900>,TrWipe<700>>>,EFFECT_STAB>,
// Blast
    MultiTransitionEffectL<TrConcat<TrDelay<700>,AlphaL<Black,Int<0>>,TrFade<800>,LocalizedClashL<HumpFlicker<DarkOrange,Red,50>,2000,50,EFFECT_BLAST>,TrFade<600>>,EFFECT_BLAST>,
    LocalizedClashL<Blinking<White,Black,130,800>,1560,50,EFFECT_BLAST>,
    LocalizedClashL<Blinking<Red,Black,130,500>,1560,15,EFFECT_BLAST>,
// Lockup
    LockupTrL<Layers<
       AlphaL<Blinking<Tomato,Strobe<Yellow,Black,15,30>,60,500>,Bump<Scale<BladeAngle<>,Scale<BladeAngle<0,16000>,Int<4000>,Int<26000>>,Int<6000>>,Scale<SlowNoise<Int<3000>>,Int<8000>,Int<18000>>>>,
       AlphaL<BrownNoiseFlicker<Yellow,Black,50>,Bump<Scale<BladeAngle<>,Scale<BladeAngle<0,16000>,Int<4000>,Int<26000>>,Int<6000>>,Int<10000>>>>,
     TrConcat<TrInstant,
       AlphaL<Blinking<White,Strobe<BrownNoiseFlicker<Yellow,Black,500>,Black,15,30>,60,500>,Bump<Scale<BladeAngle<>,Scale<BladeAngle<0,16000>,Int<4000>,Int<26000>>,Int<6000>>,Scale<SlowNoise<Int<3000>>,Int<25000>,Int<32000>>>>,TrFade<500>>,TrSmoothFade<900>,SaberBase::LOCKUP_NORMAL>,
    TransitionEffectL<TrConcat<TrInstant,AlphaL<Strobe<GreenYellow,Black,20,30>,Bump<Scale<BladeAngle<>,Scale<BladeAngle<0,16000>,Int<4000>,Int<26000>>,Int<6000>>,Int<15000>>>,TrFade<600>>,EFFECT_LOCKUP_BEGIN>,
    TransitionEffectL<TrConcat<TrInstant,HumpFlickerL<Strobe<AlphaL<White,Int<20000>>,Black,20,30>,30>,TrSmoothFade<250>>,EFFECT_LOCKUP_BEGIN>,
    TransitionEffectL<TrConcat<TrInstant,Strobe<GreenYellow,Black,20,30>,TrFade<100>>,EFFECT_LOCKUP_BEGIN>,
    TransitionEffectL<TrConcat<TrInstant,Strobe<GreenYellow,Black,20,30>,TrFade<200>,BrownNoiseFlickerL<AlphaL<White,Int<16000>>,Int<50>>,TrJoinR<TrWipe<200>,TrWipeIn<200>,TrFade<300>>>,EFFECT_LOCKUP_END>,
// Non-Responsive Drag
    LockupTrL<AlphaL<AudioFlicker<BrownNoiseFlicker<Strobe<Black,OrangeRed,20,25>,Yellow,200>,White>,SmoothStep<Int<30000>,Int<2000>>>,TrConcat<TrInstant,GreenYellow,TrDelay<25>,AlphaL<Black,Int<0>>,TrFade<150>>,TrColorCycle<1500,-2000,100>,SaberBase::LOCKUP_DRAG>,
// Lightning Block    
    ResponsiveLightningBlockL<RandomFlicker<Strobe<White,Rgb16<21301,0,65535>,50,10>,BrownNoiseFlicker<Rgb16<21301,0,65535>,Black,500>>,
    //Begin Lightning Transition
      TrConcat<TrInstant,GreenYellow,TrDelay<25>,BrownNoiseFlicker<Rgb16<21301,0,65535>,Black,500>,TrFade<100>>,
    //End Lightning Transition
      TrConcat<TrInstant,GreenYellow,TrDelay<25>,BrownNoiseFlicker<Rgb16<21301,0,65535>,Black,500>,TrFade<150>,BrownNoiseFlickerL<AlphaL<White,Int<16000>>,Int<50>>,TrJoinR<TrWipe<200>,TrWipeIn<200>,TrFade<400>> >>,  
// Melt
    LockupTrL<
    //Mely Colors
    AlphaL<Mix<TwistAngle<>,Yellow,RandomPerLEDFlicker<Orange,OrangeRed>,BrownNoiseFlicker<Rgb16<20095,128,128>,Rgb16<35103,8175,298>,150>,StyleFire<Rgb16<20393,93,93>,Red,0,4,FireConfig<0,2000,5>,FireConfig<3000,0,0>,FireConfig<0,4000,0>>>,
    // Melt Shape
    SmoothStep<Scale<TwistAngle<>,Int<24000>,Int<29000>>,Int<2000>>>,
    //Melt Begin and End transitions
    TrConcat<TrInstant,GreenYellow,TrDelay<25>,AlphaL<Black,Int<0>>,TrWipeIn<600>>,TrColorCycle<1500,-2000,100>,SaberBase::LOCKUP_MELT>,
// Ignition Powerup
    TransitionEffectL<TrConcat<TrInstant,BrownNoiseFlicker<DeepSkyBlue,White,100>,TrFade<800>>,EFFECT_IGNITION>,
// In/out using Trigger for instantaneous Center-out wipes
   InOutTrL<TrConcat<TrInstant,Layers<
    AlphaL<Black,SmoothStep<Scale<Trigger<EFFECT_IGNITION,Int<300>,Int<1000>,Int<500>>,Int<16385>,Int<0>>,Int<-1>>>,
    AlphaL<Black,SmoothStep<Scale<Trigger<EFFECT_IGNITION,Int<300>,Int<1000>,Int<500>>,Int<16384>,Int<32768>>,Int<0>>>>,TrDelay<1000>>,TrJoin<TrWipe<700>,TrWipeIn<700>>>,
   TransitionEffectL<TrConcat<TrInstant,Cyan,TrDelay<50>>,EFFECT_IGNITION>,
// Asteroid impacts after detonation - timed sequence
   TransitionEffectL<TrConcat<
    TrDelay<1500>,GreenYellow,TrDelay<25>,AlphaL<BrownNoiseFlicker<Red,White,100>,Bump<Scale<SlowNoise<Int<30000>>,Int<3000>,Int<6000>>,ChangeSlowly<SlowNoise<Int<30000>>,Int<20000>>>>,TrDelay<100>,AlphaL<Red,Int<0>>,
    TrDelay<400>,GreenYellow,TrDelay<25>,AlphaL<BrownNoiseFlicker<Orange,White,100>,Bump<Scale<SlowNoise<Int<30000>>,Int<6000>,Int<10000>>,ChangeSlowly<SlowNoise<Int<30000>>,Int<20000>>>>,TrDelay<100>,AlphaL<Red,Int<0>>,
    TrDelay<200>,GreenYellow,TrDelay<25>,AlphaL<BrownNoiseFlicker<Black,White,100>,Bump<ChangeSlowly<SlowNoise<Int<30000>>,Int<60000>>,ChangeSlowly<SlowNoise<Int<30000>>,Int<20000>>>>,TrDelay<300>,AlphaL<Red,Int<0>>,
    TrDelay<200>,GreenYellow,TrDelay<25>,AlphaL<BrownNoiseFlicker<Yellow,Red,100>,Bump<Scale<SlowNoise<Int<30000>>,Int<10000>,Int<28000>>,ChangeSlowly<SlowNoise<Int<30000>>,Int<20000>>>>,TrDelay<200>,AlphaL<Red,Int<0>>,
    TrDelay<500>,GreenYellow,TrDelay<25>,AlphaL<BrownNoiseFlicker<Orange,White,100>,Bump<ChangeSlowly<SlowNoise<Int<30000>>,Int<60000>>,ChangeSlowly<SlowNoise<Int<30000>>,Int<20000>>>>,TrDelay<200>,AlphaL<Red,Int<0>>,
    TrDelay<100>,GreenYellow,TrDelay<25>,AlphaL<BrownNoiseFlicker<Red,White,100>,Bump<Scale<SlowNoise<Int<30000>>,Int<5000>,Int<13000>>,ChangeSlowly<SlowNoise<Int<30000>>,Int<20000>>>>,TrDelay<100>,AlphaL<Red,Int<0>>,
    TrDelay<500>,GreenYellow,TrDelay<25>>,EFFECT_IGNITION>,
// Seismic Charge preon effect. use with linked preon sound
  TransitionEffectL<TrConcat<TrDelay<2125>,Cyan,TrFade<100>,Black,TrDelay<10>,Cyan,TrFade<150>  >,EFFECT_PREON>,
  TransitionEffectL<TrConcat<TrDelay<2125>,AlphaL<White,Bump<Int<16384>,Int<32768>>>,TrFade<100>, Black,TrDelay<10>,AlphaL<White,Bump<Int<16384>,Int<32768>>>,TrFade<150>  >,EFFECT_PREON>,
  TransitionEffectL<TrConcat<TrDelay<2100>,AlphaL<BrownNoiseFlicker<DeepSkyBlue,White,100>,Bump<Int<16384>,Int<3000>>>,TrDelay<100>,AlphaL<BrownNoiseFlicker<DeepSkyBlue,White,100>,Bump<Int<16384>,Int<4000>>>,
    TrSmoothFade<50>,AlphaL<BrownNoiseFlicker<DeepSkyBlue,White,100>,Bump<Int<16384>,Int<5000>>>,
    TrSmoothFade<50>,AlphaL<BrownNoiseFlicker<DeepSkyBlue,White,100>,Bump<Int<16384>,Int<10000>>>,
    TrSmoothFade<50>,AlphaL<BrownNoiseFlicker<DeepSkyBlue,White,100>,Bump<Int<16384>,Int<20000>>>,
    TrSmoothFade<175>,AlphaL<BrownNoiseFlicker<DeepSkyBlue,White,100>,Bump<Int<16384>,Int<30000>>>,
    TrSmoothFade<125>,AlphaL<BrownNoiseFlicker<DeepSkyBlue,White,100>,Bump<Int<16384>,Int<35000>>>,
    TrSmoothFade<150>,AlphaL<BrownNoiseFlicker<DeepSkyBlue,White,100>,Bump<Int<16384>,Int<30000>>>,
    TrSmoothFade<75>,AlphaL<BrownNoiseFlicker<DeepSkyBlue,White,100>,Bump<Int<16384>,Int<20000>>>,
    TrSmoothFade<50>,AlphaL<BrownNoiseFlicker<DeepSkyBlue,White,100>,Bump<Int<16384>,Int<8000>>>,
    TrSmoothFade<25>,AlphaL<BrownNoiseFlicker<DeepSkyBlue,White,100>,Bump<Int<16384>,Int<3000>>>,TrFade<50>,AlphaL<BrownNoiseFlicker<DeepSkyBlue,White,100>,Bump<Int<16384>,Int<20000>>>,TrDelay<25>>,EFFECT_PREON>,

  TransitionEffectL<TrConcat<TrInstant,AlphaL<BrownNoiseFlicker<DeepSkyBlue,White,100>,Bump<Scale<Trigger<EFFECT_PREON,Int<2000>,Int<1000>,Int<500>>,Int<-1000>,Int<16500>>,Int<1500>>>,TrDelay<2000>>,EFFECT_PREON>,
  TransitionEffectL<TrConcat<TrDelay<1100>,AlphaL<Red,Int<0>>,TrSmoothFade<700>,Black,TrDelay<100>,AlphaL<White,Bump<Int<16384>,Int<3000>>>,TrDelay<100>>,EFFECT_PREON>
  >>(),
1 Like

Could do a SmoothStep of smaller, simpler stripes instead of all that?
AlphaL<Stripes<30,1,Cyan,Black>,SmoothStep<Int<32768>,Int<70000>>>

Personally, I don’t understand this Mult part at all
TrFadeX<Mult<Int<6666>,Int<5500>>>

Why are we Multing 2 “colors”, but they’re functions…?
As opposed to a straight Int function (then replaced with WavLen)
TrFadeX<WavLen<>>

This is a pattern I took from existing fonts. I don’t fully understand how it works, but I understand the rule. So if you want to make an animation out of a transition Concat and you want it to last WavLen() seconds you create a pattern like this:

TrConcat<
TrDelayX<Mult<WavLen<EFFECT_FORCE>,Int<A>>>,
[COLOR],
TrDelayX<Mult<WavLen<EFFECT_FORCE>,Int<B>>>,
[COLOR],
TrDelayX<Mult<WavLen<EFFECT_FORCE>,Int<C>>>,
[COLOR],
TrDelayX<Mult<WavLen<EFFECT_FORCE>,Int<D>>>
>

I’m not really sure how its possible, but it A+B+C+D=32768 then the entire effect will last WavLen<EFFECT_FORCE> seconds.
Now, in the case of the samples I’ve been posting here, I’m not sending out my sound clips, which range in length from 6s to 8s. So I just replace all instances of WavLen<EFFECT_FORCE> with Int<6666>. If you copy and past my code from above into the BladeStyle editor it should last for 6.666 seconds. However before I program this into the blade I set everything back to WavLen<EFFECT_FORCE>.

Yup. I understand the 6666 is placeholder timing.
I use Percentage, which is a version of Mult, and I understand how that works. It’s logical. To set the transition time to take 1/4 of the time of the wav file, you can do for example:
TrFadeX<Percentage<WavLen<>,25>>

1 Like

So I changed my Stripes<> of speed 0 to a Gradient<>. It looked smoother and it finally got the job done. I have a really large gradient with about 32 steps, but this allows my to correctly capture the exponential fall off with sahrp spark as shown by the final shockwave in the movie.
Fett263 was very correct in describing the inconsistency between the coloring of the bladestyle editor and the actual blade. I have the KR pixel strip blade but my “Aquamarine” values in the editor look really blue on the actual blade. Low light levels also dither a great deal and look like a lot of static.
The final big finding I’ve had is that the Trigger<> that is late in a Transition Concat works differently on the Proffie board itself (6.7) than it does in the editor. Here is the effect code that I use on the blade:

  TransitionEffectL<
   TrConcat<
	TrFadeX<Mult<Int<6666>,Int<4000>>>,
    Layers<
     AlphaL<Black,Int<32768>>,
	 AlphaL<
	  Rgb<50,50,50>,
      Bump<Scale<Trigger<EFFECT_FORCE,Int<4000>,Int<2000>,Int<500>>,Int<0>,Int<32768>>,
	   Trigger<EFFECT_FORCE,Int<10000>,Int<2000>,Int<500>>
	  >
	 >,
	 AlphaL<
      RgbArg<BASE_COLOR_ARG,Rgb<255,97,0>>,
	  Sum<
	   Bump<Scale<Trigger<EFFECT_FORCE,Int<3800>,Int<2000>,Int<500>>,Int<0>,Int<32768>>,Int<80>>,
	   Bump<Scale<Trigger<EFFECT_FORCE,Int<4200>,Int<2000>,Int<500>>,Int<0>,Int<32768>>,Int<80>>
	  >
	 >
    >,
	TrDelayX<Mult<Int<6666>,Int<5768>>>,
     Mix<Bump<Int<16384>,Int<40>>,Black,BrownNoiseFlicker<Black,SpringGreen,25>>,
    TrCenterWipeX<Mult<Int<6666>,Int<3000>>>,
     /* Sin value of 22 for single bubble, 66 for 1.5 bubble */
     Mix<Bump<Int<16384>,Sin<Int<66>,Int<16000>,Int<0>>>,Black,BrownNoiseFlicker<Black,SpringGreen,25>>,
    TrDelayX<Mult<Int<6666>,Int<3000>>>,
     Mix<Bump<Int<16384>,Int<40>>,Black,BrownNoiseFlicker<Black,SpringGreen,25>>,
    TrFadeX<Mult<Int<6666>,Int<50>>>,
     Mix<Bump<Int<16384>,Int<30000>>,Black,White>,
    TrDelayX<Mult<Int<6666>,Int<400>>>,
     Mix<Bump<Int<16384>,Int<30000>>,Black,White>,
    TrFadeX<Mult<Int<6666>,Int<50>>>,
     Mix<Bump<Int<16384>,Int<40>>,Black,SpringGreen>,
    TrInstant,

     Remap<
      Sum<
       CenterDistF<>,
       Scale<
        Trigger<EFFECT_FORCE,Mult<Int<6666>,Int<0>>,Mult<Int<6666>,Int<0>>,Mult<Int<6666>,Int<20000>>>,
        Int<-16384>,
        Int<30000>
       >
      >,
      Gradient<
       Rgb16<0,0,0>,
       Rgb16<0,0,0>,
       Rgb16<0,0,0>,
       Rgb16<0,0,0>,
       Rgb16<0,0,0>,
       Rgb16<0,0,0>,
       Rgb16<0,0,0>,
       Rgb16<0,0,0>,
       Rgb16<0,32,15>,
       Rgb16<0,128,60>,
       Rgb16<0,288,136>,
       Rgb16<0,512,241>,
       Rgb16<0,800,376>,
       Rgb16<0,1152,542>,
       Rgb16<0,1568,738>,
       Rgb16<0,2048,964>,
       Rgb16<0,2592,1220>,
       Rgb16<0,3200,1506>,
       Rgb16<0,3872,1822>,
       Rgb16<0,4608,2168>,
       Rgb16<0,5408,2545>,
       Rgb16<0,6272,2952>,
       Rgb16<0,7200,3388>,
       Rgb16<0,8192,3855>,
       Rgb16<0,9248,4352>,
       Rgb16<0,10368,4879>,
       Rgb16<0,11552,5436>,
       Rgb16<0,12800,6024>,
       Rgb16<0,14112,6641>,
       Rgb16<0,15488,7288>,
       Rgb16<0,16928,7966>,
       Rgb16<0,18432,8674>,
       Rgb16<0,20000,9412>,
       Rgb16<0,21632,10180>,
       Rgb16<0,23328,10978>,
       Rgb16<0,25088,11806>,
       Rgb16<0,26912,12664>,
       Rgb16<0,28800,13553>,
       Rgb16<0,30752,14472>,
       Rgb16<0,65536,14472>,
       Rgb16<0,0,0>
      >
     >,
    TrDelayX<Mult<Int<6666>,Int<14000>>>,
     AlphaL<Black,Int<32768>>,
    TrFadeX<Mult<Int<6666>,Int<2500>>>
   >,
  EFFECT_FORCE>

While this is the code I have to use in the blade editor:

  TransitionEffectL<
   TrConcat<
	TrFadeX<Mult<Int<6666>,Int<4000>>>,
    Layers<
     AlphaL<Black,Int<32768>>,
	 AlphaL<
	  Rgb<50,50,50>,
      Bump<Scale<Trigger<EFFECT_FORCE,Int<4000>,Int<2000>,Int<500>>,Int<0>,Int<32768>>,
	   Trigger<EFFECT_FORCE,Int<10000>,Int<2000>,Int<500>>
	  >
	 >,
	 AlphaL<
      RgbArg<BASE_COLOR_ARG,Rgb<255,97,0>>,
	  Sum<
	   Bump<Scale<Trigger<EFFECT_FORCE,Int<3800>,Int<2000>,Int<500>>,Int<0>,Int<32768>>,Int<80>>,
	   Bump<Scale<Trigger<EFFECT_FORCE,Int<4200>,Int<2000>,Int<500>>,Int<0>,Int<32768>>,Int<80>>
	  >
	 >
    >,
	TrDelayX<Mult<Int<6666>,Int<5768>>>,
     Mix<Bump<Int<16384>,Int<40>>,Black,BrownNoiseFlicker<Black,SpringGreen,25>>,
    TrCenterWipeX<Mult<Int<6666>,Int<3000>>>,
     /* Sin value of 22 for single bubble, 66 for 1.5 bubble */
     Mix<Bump<Int<16384>,Sin<Int<66>,Int<16000>,Int<0>>>,Black,BrownNoiseFlicker<Black,SpringGreen,25>>,
    TrDelayX<Mult<Int<6666>,Int<3000>>>,
     Mix<Bump<Int<16384>,Int<40>>,Black,BrownNoiseFlicker<Black,SpringGreen,25>>,
    TrFadeX<Mult<Int<6666>,Int<50>>>,
     Mix<Bump<Int<16384>,Int<30000>>,Black,White>,
    TrDelayX<Mult<Int<6666>,Int<400>>>,
     Mix<Bump<Int<16384>,Int<30000>>,Black,White>,
    TrFadeX<Mult<Int<6666>,Int<50>>>,
     Mix<Bump<Int<16384>,Int<40>>,Black,SpringGreen>,
    TrInstant,

     Remap<
      Sum<
       CenterDistF<>,
       Scale<
        Trigger<EFFECT_FORCE,Mult<Int<6666>,Int<0>>,Mult<Int<6666>,Int<15555>>,Mult<Int<6666>,Int<20000>>>,
        Int<-16384>,
        Int<30000>
       >
      >,
      Gradient<
       Rgb16<0,0,0>,
       Rgb16<0,0,0>,
       Rgb16<0,0,0>,
       Rgb16<0,0,0>,
       Rgb16<0,0,0>,
       Rgb16<0,0,0>,
       Rgb16<0,0,0>,
       Rgb16<0,0,0>,
       Rgb16<0,32,15>,
       Rgb16<0,128,60>,
       Rgb16<0,288,136>,
       Rgb16<0,512,241>,
       Rgb16<0,800,376>,
       Rgb16<0,1152,542>,
       Rgb16<0,1568,738>,
       Rgb16<0,2048,964>,
       Rgb16<0,2592,1220>,
       Rgb16<0,3200,1506>,
       Rgb16<0,3872,1822>,
       Rgb16<0,4608,2168>,
       Rgb16<0,5408,2545>,
       Rgb16<0,6272,2952>,
       Rgb16<0,7200,3388>,
       Rgb16<0,8192,3855>,
       Rgb16<0,9248,4352>,
       Rgb16<0,10368,4879>,
       Rgb16<0,11552,5436>,
       Rgb16<0,12800,6024>,
       Rgb16<0,14112,6641>,
       Rgb16<0,15488,7288>,
       Rgb16<0,16928,7966>,
       Rgb16<0,18432,8674>,
       Rgb16<0,20000,9412>,
       Rgb16<0,21632,10180>,
       Rgb16<0,23328,10978>,
       Rgb16<0,25088,11806>,
       Rgb16<0,26912,12664>,
       Rgb16<0,28800,13553>,
       Rgb16<0,30752,14472>,
       Rgb16<0,65536,14472>,
       Rgb16<0,0,0>,
       Rgb16<0,0,0>,
       Rgb16<0,0,0>
      >
     >,
    TrDelayX<Mult<Int<6666>,Int<14000>>>,
     AlphaL<Black,Int<32768>>,
    TrFadeX<Mult<Int<6666>,Int<2500>>>
   >,
  EFFECT_FORCE>

There are 2 differences. The gradient is a bit different with a bit of black padding at the end and that is unexpected but not too bad. The bigger error is where I used the value “15555” to delay the Trigger<> on the editor. It seems that on the blade editor you have to create a delay that begins since the very beginning of the TRConcat, while on the actual Proffieboard you have to just give it a value of 0, or start it right away the moment the preceding transition hits. The way the Proffieboard does it is actually a LOT better than the editor, but I think I’ve found an actual bug in this inconsistency.
So I’ve tried to match up my effect timing closer to the movie like NoSloppy’s, but I think I might give this effect a rest a while. Although the wave and coloring I have more closely resemble the movie, his effect is just more naturally beautiful and takes more advantage of the colors that work well on the blade. I might end up putting both on my saber (plus Fett’s) because I still have a little bit of program storage space left!

I ended up using this to do the gradient with a lot less code. What I use for the editor is still different than in the actual blade:

/* Works in BladeStyle Editor
	  Layers<
       AlphaL<Black,Int<32768>>,
       AlphaL<Rgb16<0,12800,6024>,SmoothStep<Int<8000>,Int<32000>>>,
       AlphaL<Black,Bump<Int<32768>,Int<1536>>>,
       AlphaL<SpringGreen,Bump<Int<32000>,Int<500>>>
	  >
*/
/* Works in Actual Neopixel Blade */
	  Layers<
       AlphaL<Black,Int<32768>>,
       AlphaL<Rgb16<0,12800,6024>,SmoothStep<Int<8000>,Int<20000>>>,
       AlphaL<Black,Bump<Int<0>,Int<500>>>,
       AlphaL<Black,Bump<Int<0>,Int<500>>>,
       AlphaL<Black,Bump<Int<0>,Int<500>>>,
       AlphaL<Black,Bump<Int<32768>,Int<7536>>>,
       AlphaL<Black,Bump<Int<32768>,Int<7536>>>,
       AlphaL<Black,Bump<Int<32768>,Int<7536>>>,
       AlphaL<SpringGreen,Bump<Int<30000>,Int<500>>>
	  >

The fact that I need to reapply the alpha black several times in the actual pattern is a bit concerning but all right. NoSloppy suggested SmoothStep early on and was right! I am leveraging the linearity of smooth step and expecting it to look exponential on the actual blade. I’m finally very happy with this!