Congratulations to VPinWorkshop on the release of the virtual Total Nuclear Annihilation pinball machine! This game is a complete reproduction of TNA that can be played in VR, desktop, and virtual pinball machines. I provided VPinWorkshop the assets and they recreated authentic gameplay. Head over to link below to download. They put so much work into this game and I am excited for everyone to experience it!

https://vpuniverse.com/files/file/14359-total-nuclear-annihilation-spooky-2017-vpw/

Hi Everyone!

I am very excited to announce that I just posted up the Arcade Legend OST in my Discography. This was an awesome project, with an awesome team. If you have a VR headset and have not checked this game out yet, it is highly recommended.

More info about the album and game below:

The Arcade Legend Official Soundtrack was created for the amazing new VR game, “Arcade Legend”, available now on Meta Quest, coming in 2023 to Steam. This soundtrack features 6 all new songs and 6 remasters of previously released songs. For more information visit Arcade Legend’s official website or check out the game on the platforms below.

Arcade Legend on Meta Quest: https://www.oculus.com/experiences/quest/4290234067753903/

Arcade Legend on Steam: https://store.steampowered.com/app/1490600/Arcade_Legend/

This album download contain both Lossless (FLAC) and MP3 versions of each track.

Tracklist:

  1. Discovery (5:13)
  2. Outrunner (5:29)
  3. Arcade Legend (5:10)
  4. Sentient Beings (4.36)
  5. Silver Falls (4:29)
  6. Steam Generator (4:23)
  7. Bleeding Neon (5:10)
  8. Dead Can Still Dance (6:22)
  9. Total Nuclear Annihilation (4:33)
  10. Turning Point (5:31)
  11. Venerable (8:08)
  12. Phosphor Trails (8:16)

Scott Danesi – Arcade Legend OST

The Arcade Legend Official Soundtrack was created for the amazing new VR game, “Arcade Legend”, available now on Meta Quest, coming in 2023 to Steam. This soundtrack features 6 all […]

Hey Everyone,

I know this is not the most exciting post about new pinball stuff, but I just wanted to share this code with the world that I created to get around a huge limitation in Oracle NetSuite.

We recently upgraded our backend system to NetSuite Manufacturing and it has been really great so far. I am a huge data nerd as many of you know. The one major issue we have been having is trying to get a nice report of the Bill of Material (BOM) components within our Assemblies with the current and average costs. We use these reports to make sure that we are not under or overcharging for parts that we assemble in house. After looking around online and talking to support, it was clear there was no solution to show this properly. You can see what the last build price is, but that is not what we need. So I took it upon myself to write a direct SQL query into the database to show what we need. I feel that this is so valuable for the community that I wanted to post it up here as a starting point for others.

In order to run direct SQL in NetSuite, you will need to first install the free SuiteQL Query Tool from Tim Dietrich from the link below:

https://timdietrich.me/netsuite-suitescripts/suiteql-query-tool/

Once you install and configure this script within your NetSuite environment, you will need to copy the code below into the query window. Once you have that code ready to go, you will need to update 2 places in the code that reference the BOM Revision name. You must copy the BOM Revision name from your system exactly for this to work. Once the 2 spots are updated, you can hit run and enjoy the BOM analysis!

/********************************************************************************
Title:			Pinball Life NetSuite Assembly Cost Analysis SuiteQL Query

Created: 		2023-03-22 (Scott Danesi)

Description: 	Basic BOM Revision costing report used to show average cost 
				analysis on specific BOM Revisions in NetSuite.

Instructions:	Replace the 2 revision names in the code below to the
				exact revision name that you would like to run the report for.
				These revision names must be the full revision name.  If both
				revision locations are not replaced, the report will give
				incorrect results.
********************************************************************************/

SELECT
	t2.fullname as "assembly name",
	t2.displayName as "assembly description",
	bomRevision.name as "bom revision",
	item.itemId as "component Name",
	BomRevisionComponent.description as "description",
	BomRevisionComponent.bomQuantity as "quantity",
	to_char( item.cost, '$9,999.9999' ) as "cost",
	to_char( CASE WHEN item.averageCost = 0 THEN item.cost ELSE item.averageCost END, '$9,999.9999' ) as "average cost",
	to_char( BomRevisionComponent.bomQuantity * CASE WHEN item.averageCost = 0 THEN item.cost ELSE item.averageCost END, '$9,999.9999' ) as "avg cost total",
	to_char( CASE WHEN item.lastPurchasePrice = 0 THEN item.cost ELSE item.averageCost END, '$9,999.9999' ) as "last purchase price",
	to_char( BomRevisionComponent.bomQuantity * CASE WHEN item.lastPurchasePrice = 0 THEN item.cost ELSE item.averageCost END, '$9,999.9999' ) as "last purchase total",
	t1.altName  as "preferred vendor" 
FROM
	BomRevisionComponent
	LEFT JOIN item ON BomRevisionComponent.item = item.id
	LEFT JOIN bomRevision ON BomRevisionComponent.bomrevision = bomRevision.id
	LEFT JOIN
		(
			SELECT
				itemVendor.item,
				itemVendor.preferredVendor,
				itemVendor.vendor,
				Vendor.altname
			FROM
				itemVendor
				LEFT JOIN Vendor ON itemVendor.vendor = Vendor.id
			WHERE
				itemVendor.preferredVendor = 'T'
		) as t1
		ON t1.item = item.id
	LEFT JOIN 
		(
			SELECT
				item.fullName,
				item.displayName,
				item.id,
				bomRevision.name
			FROM
				item
				JOIN bomAssembly ON item.id = bomAssembly.assembly
				JOIN bom ON bomAssembly.billofmaterials = bom.id
				JOIN bomRevision ON bomRevision.billofmaterials = bom.id
		) as t2
		ON t2.name = bomRevision.name
WHERE bomRevision .name = '0199-0699_LEFT-BOM-REV-' 			/************ <--- Change this to the exact BOM Revision that you want to see. ******************/

UNION

SELECT
	NULL as "assembly name",
	NULL as "assembly description",
	NULL as "bom revision",
	NULL as "component name",
	'TOTAL COST' as "description",
	NULL  as "quantity",
	NULL  as "cost",
	NULL  as "average cost",
	to_char( SUM(BomRevisionComponent.bomQuantity * CASE WHEN item.averageCost = 0 THEN item.cost ELSE item.averageCost END), '$9,999.99' ) as "avg cost total",
	NULL as "last Purchase Price",
	to_char( SUM(BomRevisionComponent.bomQuantity * CASE WHEN item.lastPurchasePrice = 0 THEN item.cost ELSE item.averageCost END), '$9,999.99' ) as "last purchase total",
	NULL as "preferred vendor" 
FROM
	BomRevisionComponent
LEFT JOIN item ON BomRevisionComponent.item = item.id
LEFT JOIN bomRevision ON BomRevisionComponent.bomrevision = bomRevision.id
WHERE bomRevision .name = '0199-0699_LEFT-BOM-REV-'			/************ <--- Change this to the exact BOM Revision that you want to see. ******************/

Please keep in mind, this is the first revision of this code that I made, it is not the most efficient or the cleanest, but it is a good starting point if you need to see this data. I really hope this helps someone out there as much as it did for me. Please feel free to reach out to me if you have any suggestions, or see any errors in my code. Enjoy!

This is an interesting question that I get asked from time to time and I realized I have a much longer answer than just “for FOMO”. So here is a nice blog entry about it. 🙂

If you are unaware, many different types of companies that develop products with officially licensed themes keep said licenses a secret during the development cycle for a number of reasons. This is obviously not limited to Pinball and Video Game companies. I am going to list the main reasons that I know about and have been exposed to below, but there are probably many others as well.

Theme, Licensor, and Competitive Edge

The licensee and licensor usually want to keep product development under wraps to get ahead of competing licenses. This also keeps any ideas/designs secret from other companies until the full reveal. Also, there are unfortunate things that could happen behind the scenes if a competing company found out about a theme. Sabotage can happen and licenses can be swept out from under you if you are not careful. For unlicensed themes, this can hurt the company because others could potentially replicate the theme or design elements.

FOMO / Hype and Stagnation

Yes, it is true, a company will want to manage hype around a product, and this is actually important to help drive sales and keep a professional appearance. If a company announced a theme that excites the community at the beginning of the development cycle of said game, this will generate a bunch of hype only have it die down and people lose interest and move on to something else. Development cycles can be pretty long for Pinball Machines and Video Games. It is way more advantageous to keep this under wraps until the product is just about to be released or fully revealed to the world. This also could expose the company to criticism from the outside due to the long time from announcement to product release. This could, and most likely will, hurt the companies reputation.

Avoiding Leaks

Leaks can be damaging to these companies. If a license is revealed too early, it can result in spoilers, reduced sales, and a loss of excitement for the game. Keeping licenses secret helps to prevent these types of leaks, but it is not fool proof as we all know. These leaks could also hurt the original IP as well as it could be for something like an unreleased movie or any other unreleased content. This could really get a company in hot water and could potentially get the license pulled.

The Community “What-Ifs”

This is an interesting one… If a company announced a theme early before or during development, the game community could start throwing ideas out left and right. These ideas cannot all make it into a machine otherwise it will look like a Homer Simpson car and loose all connection to the designer’s vision of what it should be. This complicates things in other ways too. “Hey, I came up with that mech! Where are my royalties, my feelings are hurt, fuck you X company”

Again, there are probably more reasons that I did not cover here, but these are just the ones that pop out to me as the most important. But as you can see, there is more to keeping these themes secret than just trying to control FOMO and hype. Have a great day everyone!

I get this question pretty frequently, so I figured I would post a how to guide on getting the most out of the audio system on your Total Nuclear Annihilation pinball machine.

Do this at your own risk as this has the potential to damage your amp and/or speakers if set too high. But please do not do this unless your amp settings get totally out of whack.

Warning, this setup procedure is going to be loud, so warn the people around you.

Subwoofer Physical Adjustment (do this first):

You may notice some strange distortion coming from the subwoofer… These subwoofers are interference type speakers which means that upon loud use, the speaker cone extends beyond the mounting bracket plane. This will cause the cone to come in contact with the speaker grill and potentially the edge of the bottom of the cabinet. You can get a 10 inch speaker spacer online from various places that will make sure the speaker has enough space to move freely.

Sub Chamber Sealing:

A pinball machine makes a TERRIBLE subwoofer cabinet for a number of reasons, but here are a few. The main reason being that every subwoofer has a recommended cabinet volume specification. These pinball cabinets are MUCH MUCH larger than what the subwoofers call for. The next reason is that pinball cabinets are full of crap that can rattle around upon vibration from the subwoofer making terrible sounds. Another big reason is that pinball cabinets are basically the most leaky thing ever. Porting subwoofer cabinets is important, but having the sound leak out from ever little hole and crack is awful.

OK, so what do we do about this…. In TNA I created a Sub Chamber in the cabinet. This is basically a box that goes around the subwoofer that is pretty close to what the subwoofer wants for volume. This box idealistically will push all of the bass out the bottom of the cabinet. This is great, but unfortunately, it is not perfect in production. The production sub chambers leak a bit as they were not sealed with silicone sealant.

Easy fix though. While you are in there putting a spacer under your subwoofer, it is a great time to pick up some silicone sealant and seal up the inside of the box. I recommend pulling all the screws out from the bottom of the cabinet and removing the Sub Chamber completely. You can then squish this silicone sealant into every join on the inside of the chamber. Once you go to reassemble it, put a bead of silicone on the bottom side where the chamber attaches to the bottom of the cabinet. This will ensure a great seal and improve the sound of the subwoofer.

Adjusting the Amplifier:

Step 1: With the game on, take the backglass out and press the volume up or down button on the back of the LCD and bring the pre-amp volume down to 11. It will show on the screen. This is probably set high from the factory, but I found reducing this made the audio quality slightly better.
Step 2: Put the backglass back in.
Step 3: Turn every knob on your amp all the way down until it stops.
Step 4: Go to Music Test in the service menu and select reactor 3 by pressing the start button a few times.
Step 5: On the coin door, press the volume up button until it reaches 11.
Step 6: On the amp, turn the second knob from the left (sub crossover) up about 1/8 turn.
Step 7: On the amp, turn the treble just past half way up.
Step 8: On the amp turn the Bass knob up about 1/8 turn. Keep this low as this is controlling the bass output to the upper speakers and could damage them or the amp if set too high.

Here is where it is going to get loud…

Step 9: On the amp, turn up the sub volume very slowly until just before you hear a bit of distortion. This will be pretty loud.
Step 10: On the amp, turn up the Volume knob slowly until before you hear distortion or you feel that is the loudest you would ever have the machine. This is also the time where adjusting the treble up or down should be done.

Important note! If the amp cuts out during any of these last 2 steps, you went too high with the volume and/or Bass knob. Bring these back down so the amp does not cut out as this could damage it.

Step 11: On the coin door, turn down the volume back to a reasonable level and enjoy.

Again, please do this at your own risk. You can damage your amp and/or speakers messing with this stuff. I am not an expert audiophile or whatever it is called, I am just knowledgeable enough to be dangerous here. Don’t blame me or Spooky if you break something. 

Using an external subwoofer:

If you just cannot get your subwoofer sounding awesome, the easiest thing to do is install an external sub. These are pretty affordable and I recommend using the Polk Audio PSW10. All you do is disconnect the amp output wires on the internal subwoofer and run a new set of wires down to the PSW10s Speaker Level Inputs. You can then do that amp adjustment procedure again without the internal sub hooked up.

Conclusion:

I hope this helps you getting your TNA to sound awesome. If you have any questions or find any errors or better ways of doing this, please contact me and let me know. Enjoy!

Final note: I put a few Amazon links in this blog post that are linked to the Danesi Designs Affiliate Program. I did this to hopefully help generate a little bit of passive income. Thank you everyone very much!

It is here! v1.5.0 has finally arrived. This new version contains some exciting new stuff including a brand new Jukebox Mode, even more Scorbit integrations, and a Spinner Rip counter with dedicated high score table. This version and all future versions are fully compatible with all versions of the Total Nuclear Annihilation pinball machine.

Below is the full changlog for this release.

####################################################################################
v1.5.0 - 10/05/2022 - Scott Danesi

## Bugs Fixed ##
- Fixed issue with music resetting at the end of multiball when it was not necessary to restart the song
- Slight sound effect mix balancing
- Scorbit misc bug fixes
- Fixed bug where the game would not allow you to completely erase your name on the high score name entry screen

## Features Added / Modifications ##
- Added support for the upgraded core numeric display
- Lightshows updated to include new RGB LEDs in upgraded core display
- Jukebox mode added (hold both flippers for 5s in attract mode)
- Jukebox mode settings to enable/disable the mode (for operators, on by default)
- Jukebox mode settings to enable/disable beacon (off by default)
- Added new song for when reactor is started AND value is maxed out
- Spinner Rip Count added to LCD
- Spinner Rip Count high score category added with default of 30 (so please lube your spinners!!!)
- Scorbit handling completely restructured and now will attempt reconnects when the connection is lost
- Scorbit now reports bonus x and reactor temperature
####################################################################################

Click here to get the latest code!

And as always, please contact me if you find any issues with this release and I will address it as soon as I can. Thank you!

Finally upgraded all my main patch cables to something I am super happy with. These are @ctrlmod BT patch cables. They are thin, bend nicely, and have a low profile barrel. By far the ones I am most happy with. I ended up color coding by length in rainbow order, so I can quickly grab a longer or shorter cable without thinking. Also, it looks neat when they are hanging. 🙂 Just thought I would share as I know finding patch cables you are happy with is tough.

Hi Everyone! I know if has been a while, but I have finally polished and packed up my newest album! This album has been in the works for over 2 years now and is finally available right here and on Bandcamp.

I will be releasing this to all the streaming services in about a month and it will also be released as a limited edition cassette later this year. I am still trying to see if it is feasible to so a double vinyl release of this as well, but will keep you posted on that.

Special thanks goes out to Dan Kushner on this album for the use of his Vocals and Samples of his song “Bento Box” and also Matt Andrews for his amazing art package for this release.

Click here to check out the release!

As always, thank you so much,
Scott

Hey Pinball Homebrewers!

I have had a couple people ask me about using the Total Nuclear Annihilation Numeric Score Displays in their homebrew games. Now that Pinball Life has these display assemblies in stock, I figured I would do a little tutorial on how to use these.

https://www.pinballlife.com/mm5/merchant.mvc?Screen=PROD&Product_Code=PBL-600-0473-00

Powering up the display

The display assembly has a 3 pin 0.156″ header on the back. This is the main power input for the display. You will need to look at the silkscreen on this header and make a connector that supplies a solid ground and a solid +5vdc. Just make sure it is plugged in the correct orientation.

Arduino Nano

On the back of the display assembly, you will find a pre-programmed Arduino Nano ready for you to send it some instructions. This Arduino will not power up with the main power input and will need to be plugged into an active USB port to come alive. This is a Mini USB connection. Make sure when plugging this in, you use the included strain relief located by the main power input header.

Sending Data

Now into the more fun stuff. The display assembly needs to be sent some serial data from the USB to the Arduino in order to display stuff. I am going to provide some Python samples, but honestly all that is happening here is the PC is just sending the display a line of text. The Arduino will parse it, do all the heavy lifting, and display the numbers on the LED displays!

Text Format

The Arduino is looking for a text string in the following format.

"A:B:C\n"

A: A is the mode of the display. This can indicate whether you want the score to flash, not flash, clear the data, or flash a match (last 2 char flashing).
1 = Not Flashing, just display the score
2 = Flashing, used for current player up
3 = Clear the display
4 = Match display, will flash the last 2 characters of the score

B: B is the number of the display. This value will be between 1 and 4. This is so you can address the correct display when sending score data.

C: C is the actual score! This is a numeric value between 0 and 99999999. Do not put commas here, the Arduino will handle that.

\n: This is the terminating character so the Arduino knows it got a complete line of code.

Examples

Example 1:

"2:1:100000\n"

In this example, the first display will receive a flashing on 100,000.

Example 2:

"1:2:200000\n"

This example will display 200,000 solidly on display number 2.

Example 3:

"3:1:0\n"

This example will completely clear display number 1.

Python Code Examples

In order to send serial text strings over USB with python, I use PySerial. This will allow we to easily send this data to the display assembly.

Opening The Serial Port

    def openSerial(self):
        i = 0
        while (self.serialOpen == False and i <= 9):
            try:
                device_path = '/dev/ttyUSB' + str(i)
                self.game.log('Attempting to open serial port ' + device_path)
                self.ser = serial.Serial(device_path, 115200)  # attempt to open serial port
                self.serialOpen = self.ser.is_open
                self.game.log('Serial Info:')
                self.game.log(str(self.ser))
                self.serialOpen = True
            except:
                self.game.log('Attempt failed to open serial port ' + device_path)
                i = i + 1

This code will scan through the USB devices and try to connect to the Arduino. This code is probably not the best way to do it, but it has worked out well for the TNA project. 🙂

Closing The Serial Connection

    def closeSerial(self):
        try:
            self.ser.close()
            self.serialOpen = False
        except:
            self.game.log('Attempt failed to close serial port')
            self.serialOpen = False

Testing and Sending Data To The Display

    def testSerial(self,String="1234567"):
        self.ser.write("1:1:" + String + "\n")
        self.ser.write("1:2:" + String + "\n")
        self.ser.write("1:3:" + String + "\n")
        self.ser.write("1:4:" + String + "\n")

The above code will be how you should be able to send the data to the display assembly! This test method will send the score of 1,234,567 to all 4 displays.

I wanted to take a moment to thank Jim Askey (MyPinballs). This text string is based off of a serial data project that he did for integrating Bally displays into P-ROC games back in the day. I really liked the text format, so I kept within the same style for this, but added extra functions. Thank you Jim!

That should be all you need to get running. If you find any errors in any of this, please let me know here and I will correct it.

Thanks Everyone!

Hi Everyone,

When developing a pinball machine early on, there will be a need to actually flip the game and check geometry. Since the game is very early in the build and most people do not have a dedicated rig with a computer/driver system in it to test with and will need to wire up some flippers. Since I have gotten many questions about powering up flippers on their homebrew pinball machines, I figured I would take some time to walk through my opinion on the best way to do it.

Hard Wired System 11 Flipper System

This is my preferred way of testing out early geometry as it will emulate production flipper behavior 100%. The below instructions are assuming just 2 flippers for simplicity, but this can be applied to as many flippers as your game has. I am also assuming that the playfield is in a cabinet with flipper buttons installed. 🙂 These flipper assemblies are also very robust and reliable to use in the production or final version of your homebrew game.

Items needed:

Hookup Method

After your flipper assemblies and flipper switches are installed on your playfield and cabinet, you can begin the process of temporarily wiring these up. The wire routing starts at the positive (V+) side of your power supply. You then need to run a wire from this V+ connection to one side of your high voltage flipper switches. The side does not matter as a switch does not care. You will then run this line from your flipper switch to the power lug on your parallel wound coil. You then need to run a line from your negative (V-) side of your power supply to the hold winding lug of your coil. This is the lug that is on the opposite side of the power lug.

You should now be able to check that your normally closed EOS switch is being opened on a full stroke of the flipper. Once this is adjusted, power it up and flip away.

For those of you that are more visual learners like myself, I drew up a crude wiring diagram for you below.

Here are a few close up pics of the System 11 Flipper Assembly

Some notes

  • You can choose to put the high voltage flipper switch on the negative line if you want, it does not matter in this case. I choose to switch the positive, so there is less risk of shorting it to ground when tinkering under the playfield.
  • In this configuration, your flippers will be active whenever the power supply is on.
  • The System 11 Flipper Assemblies may have yellow spark arresting capacitors on the EOS switch. Leave those on there as this will help prolong the life of your EOS switch. 🙂
  • These System 11 Flipper Assemblies, in my opinion, are far superior to the WPC ones since the compression spring is less likely to break causing the game to be down. Almost everything else is the same.
  • DO NOT USE THIS METHOD WITH A TRANSFORMER. Use a switcher power supply only.

Now, this is only a temporary solution as the flippers will be active as soon as you power on the machine every time. When you decide to hook up your control system, you will need to remove the EOS switch, route the 2 winding lugs to 2 channels of your driver board, then route the power lug to the fused output of your driver circuit. The flipper switch will need to be swapped out for a low voltage variety and connected to your switch board. You can now configure your control system to use this flipper assembly!

That is basically it, if you notice any errors in this quick article, embarrassing spelling errors or have any questions about this, please hit me up here.

Disclaimer: If you blow up stuff, or burn down your game/house, I do not take any responsibility. Just double check everything before you power it up. If something is majorly wrong, a switching power supply will shut everything down before anything catches fire usually, so don’t stress, but double check!!!

Thank you and good luck everyone!