Jump to content



Photo
* * * * * 5 votes

Call for testing


  • Please log in to reply
1630 replies to this topic

#1421 DnaDisturber

DnaDisturber

    Pinball Fan

  • VIP
  • 777 posts
  • Location:Hiscore Hill

  • Flag: Netherlands

  • Favorite Pinball: Monster Bash

Posted 04 June 2021 - 12:49 AM

Just upgraded from a old version 1.0.0 Beta 21 to the current 1.1.0 Beta5 and it seems the high scores are not getting fuzzy matched through PINemHi for some what appears to be random tables, just wondering if anyone else is seeing this?  I did check the pinemhi.ini file and verified the rom names are still in there.
 
This is one that didn't work
 
NVRAM file search: determining NVRAM path for AC;DC (Pro Vault Edition)
+ Game is VP/VPX
+ No explicit NVRAM setting in game; using VPinMAME NVRAM path = D:\Visual Pinball\VPinMame\nvram
+ Still no match; trying a fuzzy match on the friendly ROM names
High score retrieval: looking for ad hoc scores file D:\Visual Pinball\Tables\ACDC (Stern 2012).pinballyHighScores
+ ad hoc scores file D:\Visual Pinball\Tables\ACDC (Stern 2012).pinballyHighScores doesn't exist
+ No high score source found for AC;DC (Pro Vault Edition)
 
This one worked
 

NVRAM file search: determining NVRAM path for World Poker Tour™
+ Game is VP/VPX
+ No explicit NVRAM setting in game; using VPinMAME NVRAM path = D:\Visual Pinball\VPinMame\nvram
+ Still no match; trying a fuzzy match on the friendly ROM names
++ Found a fuzzy match: wpt_140a.nv
++ Found exactly one match - using it (wpt_140a.nv)
+ NVRAM file wpt_140a.nv exists
Searching for Visual Pinball X in D:\PinballY\Media\System Underlays.*
Searching for Visual Pinball X in D:\PinballY\Assets\System Underlays.*
Searching for underlay in D:\PinballY\Media\Images.*

 
 
After some more testing is appears the tables that are not working only have [default] in the rom-name dropdown of the Game Details and the ones that work have [default - wpt_140a] for example.


What version of pinemhi are you on?
Maybe it has something to do with upgrading to the newest version of pinemhi

Author of PINemHi & PINemHi Leaderboard........
Website : www.pinemhi.com (to see all hiscores being made and the challenges)

 


#1422 gunsofbrages

gunsofbrages

    Neophyte

  • Members
  • Pip
  • 8 posts

  • Flag: Sweden

  • Favorite Pinball: World cup soccer 94

Posted 04 June 2021 - 07:42 AM

Thanks mjr for your help, It is much appreciated!

 

It makes sense that there are only three options for exiting the table. My inactivity timer is set to 300 seconds, and it exits way before that time has expired, and I keep my fingers away from the exit-button. No AHK or javascripts add-ins.

 

The only software I have installed recently, besides DOF, was a config-file for the flasher board - I bought the flasher board pre-built and it came with a config-file to be uploaded in the pinscape output settings. As I understand it, the board has a PWM controller chip, setup in pinscape as "TLC5940 (external PWM control chip)". There is a manual in French: https://www.smallcab...light-board.pdf

 

Based on what you wrote, it might be the culprit.

 

 

What I mean is that the table will not launch. I chose "Play" in the menu,  the table starts loading, and then, just when it is about to start, it immediately goes to "exiting game" and back to PBY. I don't know if it has anything at all to do with DOF, but the issue began after I installed DOF.

 

I can't think of any reason it would be related to DOF, but maybe there's some weird interaction that's not coming to mind.  I notice this in the log listing you posted earlier:

 

+ table launch: Close Game command received

 

So it looks like you're explicitly exiting the game on the PinballY side.  There are three ways a Close Game command can happen:

 

1. You pressed the Exit button.

2. The game inactivity timer expired

3. Javascript generated it

 

I'm assuming you didn't manually press the Exit button, so let's rule out #1, but you might want to think it over briefly to make sure you didn't do something ELSE when you were setting up DOF that might be generating the button press - AHK scripts or something like that, say?  Anything at all that could be synthesizing a key press of any kind?  You'd be surprised at how many times people say "this started happening when I installed DOF", and it turned out they actually installed seven other pieces of software and did a bunch of other system reconfiguration at the same time they installed DOF, so they end up chasing DOF red herrings for quite a while before figuring it out.

 

If you're using any Javascript add-ins, try disabling those and see if it still happens.

 

Assuming you've ruled out the Exit button and you've ruled out Javascript, that leaves the inactivity timer.  That's in the options dialog under Game Launch.  Check that to make sure you don't didn't accidentally set it to 10 seconds at some point or something like that.

 

 



#1423 mjr

mjr

    Pinball Wizard

  • Members
  • PipPipPipPipPip
  • 3,346 posts

  • Flag: United States of America

  • Favorite Pinball: Medieval Madness

Posted 04 June 2021 - 05:32 PM

The only software I have installed recently, besides DOF, was a config-file for the flasher board - I bought the flasher board pre-built and it came with a config-file to be uploaded in the pinscape output settings. As I understand it, the board has a PWM controller chip, setup in pinscape as "TLC5940 (external PWM control chip)". 

 

I don't have any guess why that would have this effect, but it's always possible.  Given that it's the only change, my next step would be to take it back out and see if the problem goes away.  If it does, restore it and see if the problem comes back.  If so, that would pretty clearly identify it as the source of the issue, so you can dig into it to see why.



#1424 gunsofbrages

gunsofbrages

    Neophyte

  • Members
  • Pip
  • 8 posts

  • Flag: Sweden

  • Favorite Pinball: World cup soccer 94

Posted 04 June 2021 - 06:15 PM

 

The only software I have installed recently, besides DOF, was a config-file for the flasher board - I bought the flasher board pre-built and it came with a config-file to be uploaded in the pinscape output settings. As I understand it, the board has a PWM controller chip, setup in pinscape as "TLC5940 (external PWM control chip)". 

 

I don't have any guess why that would have this effect, but it's always possible.  Given that it's the only change, my next step would be to take it back out and see if the problem goes away.  If it does, restore it and see if the problem comes back.  If so, that would pretty clearly identify it as the source of the issue, so you can dig into it to see why.

 

Thank you for your support. PinballY is an amazing frontend software!



#1425 BPICKINPAUGH

BPICKINPAUGH

    Hobbyist

  • Platinum Supporter
  • 21 posts

  • Flag: United States of America

  • Favorite Pinball: Many different types and era's

Posted 04 June 2021 - 10:22 PM

 

Just upgraded from a old version 1.0.0 Beta 21 to the current 1.1.0 Beta5 and it seems the high scores are not getting fuzzy matched through PINemHi for some what appears to be random tables, just wondering if anyone else is seeing this?  I did check the pinemhi.ini file and verified the rom names are still in there.
 
This is one that didn't work
 
NVRAM file search: determining NVRAM path for AC;DC (Pro Vault Edition)
+ Game is VP/VPX
+ No explicit NVRAM setting in game; using VPinMAME NVRAM path = D:\Visual Pinball\VPinMame\nvram
+ Still no match; trying a fuzzy match on the friendly ROM names
High score retrieval: looking for ad hoc scores file D:\Visual Pinball\Tables\ACDC (Stern 2012).pinballyHighScores
+ ad hoc scores file D:\Visual Pinball\Tables\ACDC (Stern 2012).pinballyHighScores doesn't exist
+ No high score source found for AC;DC (Pro Vault Edition)
 
This one worked
 

NVRAM file search: determining NVRAM path for World Poker Tour™
+ Game is VP/VPX
+ No explicit NVRAM setting in game; using VPinMAME NVRAM path = D:\Visual Pinball\VPinMame\nvram
+ Still no match; trying a fuzzy match on the friendly ROM names
++ Found a fuzzy match: wpt_140a.nv
++ Found exactly one match - using it (wpt_140a.nv)
+ NVRAM file wpt_140a.nv exists
Searching for Visual Pinball X in D:\PinballY\Media\System Underlays.*
Searching for Visual Pinball X in D:\PinballY\Assets\System Underlays.*
Searching for underlay in D:\PinballY\Media\Images.*

 
 
After some more testing is appears the tables that are not working only have [default] in the rom-name dropdown of the Game Details and the ones that work have [default - wpt_140a] for example.


What version of pinemhi are you on?
Maybe it has something to do with upgrading to the newest version of pinemhi

 

 

 

I am running version 1.3.1 of PINemHi, it works for most games except the ones that only have [default] in the Rom Name of the game setup in pinbally.  There is nothing else in the dropdown on the games that don't work and the ones that do have a whole list of roms to choose from.  I can also get the non working tables to work by editing the "Visual Pinball X.xml" in the PinballY/Databases/Visual Pinball X folder and changing the </rom> entry to have the table's current rom name.

 

Thanks

 

I am starting to get a new issue, restarts of pinbally seem to fix it.

 

 

PinEMHi completed successfully; results:
>>>
 
Unhandled Exception: System.IO.IOException: The process cannot access the file 'D:\PinballY\PINemHi\pinemhi.ini' because it is being used by another process.
   at Microsoft.VisualBasic.FileSystem.FileOpen(Int32 FileNumber, String FileName, OpenMode Mode, OpenAccess Access, OpenShare Share, Int32 RecordLength)
   at PINemHi.Module1.ReadIniValue(String& INIpath, String& KEY, String& Variable)
   at PINemHi.Module1.Main()
 
>>>
 
I am not sure if this is pinbally or pinemhi, I was looking for an older version of pinemhi to test it but could not find one.
 
Thanks

Edited by BPICKINPAUGH, 24 June 2021 - 12:58 PM.


#1426 jogrady7

jogrady7

    Enthusiast

  • Platinum Supporter
  • 79 posts

  • Flag: United States of America

  • Favorite Pinball: Medieval Madness

Posted 27 June 2021 - 06:12 PM

I finally got The Pinball Arcade (TPA) Arcooda Console to work in PinballY.  Yes I realize, not a high demand request.  But If some one else needs to get this to work, here's the hack.  Initially I was only able to get TPA Arcooda Console to work in the Steam client (Play Pinball Arcade in Cabinet mode DX11).  When I tried to run this from my local machine c:\Program Files (x86)\Steam\steamapps\common\PinballArcade\PinballArcadeCabinet.exe it would launch the regular TPA (PinballArcade.exe), not the cabinet version.  But if I made a copy of the PinballArcadeCabinet.exe and renamed it PinballArcade.exe (overwriting the existing one, make a copy first, called mine PinballArcadeOld.exe ), then I launched PinballArcadeCabinet.exe, I would get the TPA Arcooda Console version.  PinballY OOTB runs whatever is set to  PinballArcade.exe.  So now I have 2 Different Systems in PinballY, one for TPA standard and One for TPA Arcooda Console.  I use batch files to copy over either PinballArcadeCabinet.exe or the copy of PinballArcade.exe (PinballArcadeOld.exe in my case) and rotate the screen to Portrait using IRotate Utility.  For example in "run before" section

 

copy "C:\Program Files (x86)\Steam\steamapps\common\PinballArcade\PinballArcadeOld.exe" "C:\Program Files (x86)\Steam\steamapps\common\PinballArcade\PinballArcade.exe" /y 
"C:\Program Files (x86)\iRotate\irotate" /1:rotate=90
 
or
 
copy "C:\Program Files (x86)\Steam\steamapps\common\PinballArcade\PinballArcadeCabinet.exe" "C:\Program Files (x86)\Steam\steamapps\common\PinballArcade\PinballArcade.exe" /y 
"C:\Program Files (x86)\iRotate\irotate" /1:rotate=90
 
Then in "run after" section
"C:\Program Files (x86)\iRotate\irotate" /1:rotate=0
 
Yes this is goofy solution. I tried to find another way to do it, but no luck.  If anyone knows a better way, send it my way
 
Thanks

Edited by jogrady7, 27 June 2021 - 06:13 PM.


#1427 Onevox

Onevox

    VP Zealot

  • Members
  • PipPipPip
  • 269 posts
  • Location:Virginia, USA

  • Flag: United States of America

  • Favorite Pinball: The Getaway, High Speed II

Posted 03 July 2021 - 11:43 AM

Finally updated to Windows 10 (from 7)  and PinballY is giving me a prompt: "The  64 bit version of PinballY requires a DOF update ... Technical details: CoCreateInstance failed: No such interface supported)

 

I have installed and re-installed the April 16, 2021 R3++ DOF via Windows Setup, I've updated freezys to 1.8.2, both 32 and 64 bit via Windows Setup, and updated PinballY to 1.1.0 beta 5. 

 

Not sure if this is a beta issue, or something else. The message goes away after a bit, and PinballY seems to work fine.


_____________________

 

My build: The Joker Poker.

http://www.vpforums....showtopic=37574


#1428 mjr

mjr

    Pinball Wizard

  • Members
  • PipPipPipPipPip
  • 3,346 posts

  • Flag: United States of America

  • Favorite Pinball: Medieval Madness

Posted 03 July 2021 - 05:59 PM

> The message goes away after a bit, and PinballY seems to work fine.

 

I'm going to guess that DOF isn't working in PinballY for you, though, since that message means that PinballY can't access DOF. 

 

If you don't care about that, you can suppress the message by turning off DOF in the options.

 

If you do want DOF working, though, you might want to look into further to see if you can get to the bottom of it.  The underlying cause of the error message is that PBY couldn't access the COM object that connects it to DOF.  There are multiple reasons that can happen, but assuming you have DOF installed at all, the most common one is that it can't load the DOF COM type library (.tlb) file.  And the most common cause of that, in turn, is that you have an older DOF installed, pre 2018-09-04, since before that, DOF didn't ship with the .tlb file at all.  So if you do have a recent DOF installed and you're still getting the message, something else is going wrong with the COM object creation.  If DOF is working for you in other programs, I'm not sure what the problem could be.  Do you have any Admin Mode of any kind going on anywhere in your virtual pinball ecosystem?  That's always a good place to start with these cross-program issues.



#1429 Onevox

Onevox

    VP Zealot

  • Members
  • PipPipPip
  • 269 posts
  • Location:Virginia, USA

  • Flag: United States of America

  • Favorite Pinball: The Getaway, High Speed II

Posted 04 July 2021 - 11:45 AM

Thanks for the help and for the build Guide. Everything working again. Lots of legacy advice/thinking from years past that don't apply to W10. And some old man brain farts thrown in for good measure.


_____________________

 

My build: The Joker Poker.

http://www.vpforums....showtopic=37574


#1430 mjr

mjr

    Pinball Wizard

  • Members
  • PipPipPipPipPip
  • 3,346 posts

  • Flag: United States of America

  • Favorite Pinball: Medieval Madness

Posted 04 July 2021 - 06:44 PM

Great, glad you cleared that up!



#1431 PAnt

PAnt

    Hobbyist

  • Members
  • PipPip
  • 21 posts

  • Flag: Thailand

  • Favorite Pinball: White Water

Posted 08 July 2021 - 12:46 PM

Hi Mjr & All,

 

I'm having some issues setting up PinballY.

 

1.

 

Though I have it running ok, on my desktop the playfield media shown is from my cabinet - rotated left 90 degrees.

 

I have both cabinet (portrait) and desktop (landscape) media in the respective folders, I can't seem to find a setting to control which media should be used.

 

The text and icons are correctly orientated, so I can't just rotate the screen.

 

I've also tried removing the portrait media entirely, which then displays no media at all.

 

Have I missed a setting?

 

2.

 

If I disable videos in options, no images are shown at all. I also have both portrait and desktop images in the respective folders.

 

3.

 

I can't seem to close the Instruction Card window after opening it (it wasn't showing originally). I can f11 out of and into fullscreen, which does hide it, but it's not the solution.

 

Thanks in advance for your help on this. 



#1432 mjr

mjr

    Pinball Wizard

  • Members
  • PipPipPipPipPip
  • 3,346 posts

  • Flag: United States of America

  • Favorite Pinball: Medieval Madness

Posted 08 July 2021 - 06:49 PM

PAnt - for the instruction card window, try right-clicking in the window and selecting Hide.  There's a section in the help, "Usage Tips", that you might want to take a look at - it has some quick pointers on initial setup things like arranging the windows.

 

As for the screen rotation, I'm afraid PinballY doesn't have a "desktop" mode; it's really only meant for cab use.  There's another section in the help, "Files & Folders", that has details on where the media files are located, which might be helpful figuring out where PBY is looking for its files, for times when you're wondering things like "why doesn't it find my files in folder X"?  Solving those mysteries can also be easier if you turn on media file logging in the options, and then scan through the log file to see exactly what files the program is looking for.  Anyway, for the table videos and images, if you want more of a "desktop" layout, you'd have to manually rotate the cabinet-mode videos - see "How images and videos are displayed" in the Files & Folders section in the help for the expected orientation.  You can also just do a fresh capture of everything, since new captures will always match your current screen layout at time of capture.



#1433 PAnt

PAnt

    Hobbyist

  • Members
  • PipPip
  • 21 posts

  • Flag: Thailand

  • Favorite Pinball: White Water

Posted 09 July 2021 - 09:42 AM

Hi Mjr,

 

Thanks for your response.

 

Oh yeah, duh, totally didn't see that option at the bottom of the context menu when clicking on the instructions window - sorted now thanks.

 

I've been looking through the help files as suggested. The program is finding the media files ok, I just wasn't sure if there was a way to specify a desktop environment. No problems, I can work around it, but it might be a development option on the horizon?

 

I'm changing from PinballX and I really like the ease of setting up PinballY. I didn't realise how many small naming errors I'd made because of the fuzzy filename logic in PinballX, but I'm going through them one by one and cleaning them up.

 

Thanks for your help again and for your great program.

 

Ant.



#1434 mjr

mjr

    Pinball Wizard

  • Members
  • PipPipPipPipPip
  • 3,346 posts

  • Flag: United States of America

  • Favorite Pinball: Medieval Madness

Posted 09 July 2021 - 07:23 PM

The program is finding the media files ok, I just wasn't sure if there was a way to specify a desktop environment. No problems, I can work around it, but it might be a development option on the horizon?

 

I haven't really been planning on it - I don't think I've heard any other requests for it, and I'd prefer not to add further complications to the media search process given how complex it already is.

 

However, I think you could implement a desktop mode option using Javascript, so I might look into it as a worked example for the help at some point.  I probably won't be able to get to that any time soon, so if you want to give it a try, here's the basic outline I have in mind:

 

- First, create custom media types for Desktop Table Image and Desktop Table Video.  See Javascript scripting > Media Types in the help for details.

 

- Next, write a handler in the main window for the mediasyncload event.  That event is fired just before a new playfield image/video is loaded, and it has access to the filenames of the media items that the system proposes to load.  You'd get the GameInfo object from the event's game property, and call its  resolveMedia() method to look for desktop versions of the image and video files.  If found, you'd replace the video and image properties in the event object with the names of your alternate resolved files.  On return, the system will load those files instead of the ones it found (which will have come from the normal "cabinet" table image/video media folders).

 

I think that's pretty much all there is to it.  I haven't tested this, but here's a stab at the code, if you want to play around with it...

// create the desktop video/image media types
GameList.createMediaType({
  id: "desktop table image",
  configId: "desktopTableImage",
  name: "Desktop Table Image",
  menuOrder: 430,
  folder: "Table Images Desktop",
  perSystem: true,
  format: "Image",
  extensions: ".jpg .jpeg .png .apng .gif",
  hasDropButton: true,
  rotation: 0
});

GameList.createMediaType({
  id: "desktop table video",
  configId, "desktopTableVideo",
  name: "Desktop Table Video",
  menuOrder: 440,
  folder: "Table Videos Desktop",
  perSystem: true,
  format: "VideoWithAudio",
  extensions: ".f4v .mp4 .mov .mpg .mkv .wmv .m4v .avi",
  hasDropButton: true,
  rotation: 0
});

// on media load in main window, override table video/image with desktop version
mainWindow.on("mediasyncload", ev => {
  if (ev.game) {
    let video = ev.game.resolveMedia("desktop table video", true);
    let image = ev.game.resolveMedia("desktop table image", true);
    if (video)
      ev.video = video;
    if (image)
      ev.image = image;
  }
});

If you give that a try, let me know how it goes.  If you have to make any changes to get it working, I'd appreciate if you could send me back the working version - knowing that it's tested and working would save me that time and make it pretty quick to write it up as a worked example for the help.


One other little embellishment that you might want to make if you want to put this into real use would be to extend it to cover the defaultVideo and defaultImage properties of the event, to select the desktop versions of the defaults for tables without any media.  You might also want to play around with priorities: if the method finds an image but no video, you might want to explicitly set the video property to undefined so that the system won't load a Cabinet Video in preference to a Desktop Image.  But that sort of thing is up to you; I'm not exactly sure what the right policy is there.  (One more reason I'm reluctant to add this to the native media search - it seems like there might have to be some additional option settings that come with it, ratcheting up the complexity for everyone.)



#1435 PAnt

PAnt

    Hobbyist

  • Members
  • PipPip
  • 21 posts

  • Flag: Thailand

  • Favorite Pinball: White Water

Posted 10 July 2021 - 10:28 AM

Hi Mjr,

 

Thanks again for your detailed reply. I haven't done any programming for some years, some very basic and assembler on C64 and Amiga with A68k Assembler (if anyone remembers that), but your code is very self-explanatory.

 

Forgive my ignorance, but would it be possible to create a desktop value (and user input checkbox), with something along the lines of (in bad pseudo code obviously and using the standard PinballX folder names/tree):

 

GetValue Desktop

 

If desktop = true then

 Tableimagesfolder = "Table Images Desktop"

 Tablevideosfolder = "Table Videos Desktop"

Else

 Tableimagesfolder = "Table Images"

 Tablevideosfolder = "Table Videos"

 

Then the video load routine would simply search for/load the media from those folders, and changing (if one wanted to), would be a simple checkbox?

 

I'm probably oversimplifying it somewhat., but I might also have a look at it if I get time, which would mean learning Javascript Scripting...

 

Thanks again MJR.



#1436 mjr

mjr

    Pinball Wizard

  • Members
  • PipPipPipPipPip
  • 3,346 posts

  • Flag: United States of America

  • Favorite Pinball: Medieval Madness

Posted 10 July 2021 - 06:00 PM

t would it be possible to create a desktop value (and user input checkbox) [to switch between desktop and cabinet mode]

 

Yes, you could certainly do that as part of the Javascript approach if you wanted to.  Do you really need to, though?  I'd think that this would be a more or less immutable feature of the particular machine you're on, so you'd just drop in the Javascript code if you wanted it on that machine.  But if you do want to change it on the fly, that's pretty easy; there are numerous other examples in the Worked Examples section showing how to create menu items and how to remember option settings in the settings file.  The "Mode selections" section under Javascript scripting > Worked Examples > Custom Play Modes does pretty much exactly this.



#1437 PAnt

PAnt

    Hobbyist

  • Members
  • PipPip
  • 21 posts

  • Flag: Thailand

  • Favorite Pinball: White Water

Posted 11 July 2021 - 10:24 AM

Yes of course, it would not need to be switchable. Once set, it would be unlikely that it would need to be changed.

 

I'll take a look at the code and see if it's something I could have a go at..

 

Thanks Mjr.



#1438 Roadblock

Roadblock

    Enthusiast

  • Members
  • PipPipPip
  • 169 posts
  • Location:Moncton, NB

  • Flag: Canada

  • Favorite Pinball: Attack from Mars

Posted 02 October 2021 - 05:26 PM

Hi MJR and other java script wizards,

Has anyone figure out a script for PinballY to use launch videos for each table?

Thanks



#1439 shurley6201

shurley6201

    Neophyte

  • Members
  • Pip
  • 6 posts

  • Flag: United States of America

  • Favorite Pinball: elvira

Posted 12 October 2021 - 06:48 AM

Hi mjr, looking to see if PinballY will someday include loading videos as we. No scripting abilities here. Future release maybe?? Thanks

#1440 mjr

mjr

    Pinball Wizard

  • Members
  • PipPipPipPipPip
  • 3,346 posts

  • Flag: United States of America

  • Favorite Pinball: Medieval Madness

Posted 12 October 2021 - 06:45 PM

Hi mjr, looking to see if PinballY will someday include loading videos as we. No scripting abilities here. Future release maybe?? Thanks

 

If you just want to show a particular video when launching, that's already possible without any scripting - see the help under Customizing > Game Launch Backgrounds.  If you want to use a separate launch video that depends upon the game being launched, that does require a little scripting.  For the basic recipe for displaying custom media during launch, you can look at the help under Javascript scripting > Worked Examples > "Seamless" Game Launch, particularly the last part, "Playing an animated overlay".  As for a native feature like this, it would certainly be possible to add, but I have no immediate plans.  (I'm always happy to consider pull requests if anyone wants to build it out and submit it, though.)


Edited by mjr, 12 October 2021 - 06:46 PM.